OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング独学初心者には馴染みがないが意外と助かるPlantUML

どうも、てくぽこです。

今日は、プログラミング独学初心者な自分が
個人的に一番苦労している「目的の整理」について書きます。

ただし、文章量の関係で、詳細な技術解説については今後の記事に回します。
まずは導入として、事の経緯から。
要点は[こちら](#plantumlとは)からジャンプできますので、長文が嫌いな方は飛んでください。

（思いの外、長くなっちゃったなぁ…）

#プログラミング独学初心者がつまずきやすい"あるある"
ずばり、プログラミング（もといコーディング）は楽しいけれど、

***「あれ、おれ結局プログラミング学んで何したいんだっけ…？？？」***

ってなりませんか？

>プログラミングがどんどん出来るようになってきて、
>いつのまにかサービスも自分ですんなり作れるようになって、
>あるいはある程度スキルには自信がついてきたから
>フリーランスなり会社勤めなりで仕事にしていけるようになりました！

…っていう方は、だいぶ増えてきた時代環境にはなりましたが
挫折する方も依然多いような印象です。

~~***私、ボッチ独学者なので業界動向とかよう知らんけど。***~~

## 結局は「目的意識」と「行動計画」の整理
前述の「何したいんだっけ…？」をそのまま放置していると、
プログラミング勉強の優先度が無意識に低下してしまい、
気がつくとモチベーションが下がってしまいます。私は下がってました。

目的を明確にして行動計画を立てる、って
特に私は苦手意識が強いのですが、
目に見える形にアウトプットしたら
多少は自分の気持ちも整理しやすいのかな、と。

なにかそんなツールはないか、とすぐツールに走ってしまう私は、他力本願でしょうか…？

## UMLとは

そして本題。
UML(Unified Modeling Language)とは、簡単に言えばソフトウェアを作るにあたって作成する仕様書や設計ドキュメントを記述する、記述言語。

ソフトウェアを実装していく上で、「何のために」「何を」「どうやって」プログラムに落としていくかを明確化するための言語。
言語と言っても、具体的な定義は文法、というよりも**図の書き方の決め事**のようなものです。
パワポの作図フォーマットを規格化しましょう、みたいな。

とてもわかり易かった参考記事は[こちら](https://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc)です。

####- 初心者にとってのUML -
***でもこれって、ソフトウェア開発以外にも使えそうな気がしません？***

自分のプログラミング学習の要件定義としても使えるし、
（誰がどんなことをするアプリを作りたいのか）

いざそれを整理したあと、
具体的にどこから着手していいのか、
イメージできるところまで行動内容を細分化出来る。
（この機能はこんな操作手順で実装する、
　そのためにはどんなクラスが必要で、
　どんな手順で値を受け渡していけばよいか）etc...

ここまで整理できれば、
「じゃあ自分はこの部分の実装のこんなコード（HTML,CSS,javascript,...）から勉強すればいいんだ」と
着手点も明確化しやすくなるんじゃないかと思います。


プログラミングの勉強ってそれ自体もボリュームがあるので、
独学初心者はこういった肝心な部分が抜けがちになりますよね。
私は抜け落ちました。

##PlantUMLとは##
今日一番伝えたいこと。（最初に書け）

設計図の書き方の決まりであるUMLをテキスト化して、
プログラムみたいに書いてしまおう、というのがPlantUMLです。
（[公式サイトはこちら](http://plantuml.com/ja/)）


###メリット

- 設計書もプログラミング風に作れる
- 手書きの図よりもあとから編集しやすい
- 簡単な図から複雑で大きな図まで同じ書き方ができる

プログラミング初心者としては、習うより慣れろ、
とにかくプログラムらしきものをどんどん書いて
コーディングに自分の頭と体を慣れさせるのが手っ取り早い気がしました。
UMLまでプログラミング風にできれば計画から実践までずっとプログラミングなので、
目的が整理されて、プログラミングに慣れて、作るモノの仕様も整理されて、と一石三鳥です。

なにより手書きの図よりもあとから編集しやすいですし、
テキストファイルですので図のボリュームが変わっても記述は統一できます。
最初は簡単なソフトウェアをつくる計画を立てて、
あとから勉強しながら必要になったものを計画に追加して…。

要はあとからスケールアウトし易いのです。

***「残しやすい形」***かつ***「スケールアウトし易い」***仕様書って、
独学初心者にはうってつけだと思うのです。

## まずは触ってみる
PlantTextという無料のWebサービスがあります。
[PlantText UML Editor - https://www.planttext.com/](https://www.planttext.com/)
上記の参考サイトをもとに、まずはユースケース図から作成してみると
「誰のためのどんなサービスが作りたいのか」を整理しやすいかと思います。
文法は[こちらの記事](https://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d)を参考に。

のちのち、UMLとPlantUMLについては少しずつ解説記事（もとい備忘録）を
書いていきたいと思いますので、ここでは紹介だけにとどめます。

（2019/09/25追記：[PlantUML環境構築の解説記事](https://qiita.com/tekupoko3/items/2202815b057338888439)をはじめました。）


##最後に
今日は、プログラミング独学初心者にとってのPlantUMLの導入をしました。
わかってます、いきなりメチャクチャハードル高いですよね。

最初は使えなくても、慣れてくると便利さを実感しました。私は。

なるべく今後もPlantUMLを使っていこう、という自分への念押しの意味も含めて
今回記事にしました。

ちなみに、前回の投稿で気にしていたピリオド・カンマ記法は、
普段の使い方と合わなくて面倒なのでとりあえずやめてみます。
「気持ち悪い…」と思ったらひと声かけてください。


ではでは。
ubuntsuでpip installしたら「error: command 'x86_64-linux-gnu-gcc' failed with exit status 1」と出た

## 実行コマンド

```
pip3 install  -U psutil
```

## エラーメッセージ

```
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
```

## 対処方法

`python3-dev` が必要な模様。3系じゃなければ`python-dev`で

```
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
```
Vue.js使っててChromeを77にアップデートしたら

先に言っておくと、私のコードの書き方がおかしい部分が暴かれたというお話です。

下のような書き方をしてしまっている状態で、

``` HTML
<v-layout column fill-height> 
 <v-flex md9> 
  <v-layout column fill-height> 
   <SomeComponents/>
  </v-layout> 
 </v-flex> 
</v-layout> 
```

chromeをバージョン76から77にアップデートしたら見事にレイアウトが崩壊しました。


崩壊するまでコードの異常に気づいていませんでした。


以下に修正したら直りました。

``` HTML
<v-layout column fill-height> 
 <v-flex md9> 
  <SomeComponents/>
 </v-flex> 
</v-layout> 

<!-- 余分なv-layoutを削除 -->
```

テンプレート部分の記述で、コードの増減によって不要になった要素が出てきていないかをマメに見直すと吉です。

以上、自戒を込めて。
【C++Builder】64bitアプリケーションを作成する前の準備

簡単なことなのにいつもすぐ忘れるので、自分用にメモ。

## 64bit用開発環境のインストール
C++Builderで64bitアプリケーションを作成するには、まずインストール時に64bit用の開発環境をインストールしていないとできません。
「C++Builderをインストールする際に64bitにチェックを入れていなかったかも！？」という場合は、64bit用の開発環境をインストールするところから始めましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/a4c521f2-af50-5e6e-be00-6b533ca78cad.png)

あとついでに、「TeeChart使えないけど！」という場合は、TeeChartをインストールしていない可能性があるので、これもインストールしなおしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/3ce3ba95-22be-8b50-2346-5e52cf7fe2b9.png)

## プラットフォームの追加
64bit用開発環境をインストールして、いざ新規プロジェクトを作成しても、プルダウンからはまだ32bitしか選択できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/cb5ef278-38a8-7aeb-c27c-2da582f591d2.png)

**プロジェクトマネージャー** から、 **ターゲットプラットフォーム** を右クリックして **プラットフォームの追加** を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/78d1affa-031c-4b86-a1c9-7f772cde5691.png)

出てきたポップアップでプラットフォームを選択してOKボタンを押せば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/e8ad1325-3768-1cbb-afc2-c94f4f36e747.png)

このように64bitも選択できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/1238f57c-d592-5c4e-3a25-1f17c27aa1fc.png)

ちなみに、「ちゃんとインストールしたのにデバッグ実行ができないよ！」という方は[こちら](https://stackoverflow.com/questions/29117605/cant-run-new-project-in-win64-mode-but-win32-mode-works-fine)もチェックしてみてください。


以上！
#Rails + shoryuken gem + #AWS SQS でリトライ処理の動作確認をする

# ランダムに失敗するジョブを作っておく

```rb
class ShoryukenRandomFailureJob < ApplicationJob
  queue_as :example1
  queue_as :example2

  def perform(message)
    if rand(1..3) <= 1
      puts '-' * 100
      puts 'JOB WOKED'
      puts '-' * 100
      puts "message: #{message}"
      puts '-' * 100
    else
      raise 'Job Failed'
    end
  end
end
```

# ジョブを実行する

```
bundle exec rails runner 'ShoryukenRandomFailureJob.perform_later("ABC")'
```

# Workerで例外が確認できる

![image](https://user-images.githubusercontent.com/13635059/65002437-c0ed2200-d92e-11e9-8ae3-5737b7657929.png)

# AWS SQS のコンソールで処理中のメッセージが増える

![image](https://user-images.githubusercontent.com/13635059/65002436-bf235e80-d92e-11e9-9c5a-a5c602c4a6a4.png)


# いずれジョブが成功する

![image](https://user-images.githubusercontent.com/13635059/65002476-f560de00-d92e-11e9-8fae-2864f842bd26.png)

# Workerがメッセージ = ジョブを自動削除して、処理中のメッセージ数が0になる


![image](https://user-images.githubusercontent.com/13635059/65002496-0dd0f880-d92f-11e9-976c-82c10cbe24cd.png)

ただし shoryuken worker の設定で自動削除を有効化している場合に限る

```rb
class ShoryukenWorker
  include Shoryuken::Worker

  shoryuken_options queue: 'example1', auto_delete: true
  shoryuken_options queue: 'example2', auto_delete: true
  shoryuken_options queue: 'example3', auto_delete: true
end
```

# NOTE

- shoryuken的にリトライをしているか、SQS的にリトライをしているかはまだ不明

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Googleアナリティクスを新規に登録してみる

Googleアナリティクスのアカウントを新規に作成してから、WordPressへ設定するまでをまとめました。因みに私はCocoonというテーマを使っているため、WordPressの設定はCocoonの設定でおこなっています。

また、以下についてはここでは触れませんので他でご確認ください。(いつか記事を書きたいな)

 - Googleアナリティクスって何なの？
 - Googleアナリティクスってどう使うの？

# 手順

## Googleアナリティクスを登録する

 - [Googleのトップ画面](https://www.google.co.jp/)の右上のメニューボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/696890f4-2e9e-8a23-7e98-f64879142a08.png" width="75%" />

---

 - 画面をスクロールしてサービス一覧のビジネス向けの中から「アナリティクス」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/ba456dfc-8c1e-6388-2569-5c90c07c7f90.png" width="75%" />

---

 - 「無料で利用する」をクリックするとGoogleアカウントへのログインを求められるのでログインします。すでにログイン済みの場合は、そのまま次の画面へ進みます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/ed261563-3a4b-2edd-26c7-2a6ea3d5d0e0.png" width="75%" />

---

 - 「登録」ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/dd3a1ac2-e8d6-349d-178a-c1f57de2d84a.png" width="75%" />

---

 - アカウント名を入力します。これはアナリティクスのアカウント名で、Googleアカウントとは別になります。
 - アカウントのデータ共有設定を選びます。私はそのままにしました。
 - 設定が終わったら「次へ」ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/0f6a7f19-bb27-1bca-4873-858e04d28b8b.png" width="75%" />

---

 - 測定の対象を設定します。私はウェブサイトを測定したかったのでそのままにしました。
 - 「次へ」ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/e15a1bc6-cf03-c9b0-b0d8-4cb28a33f96d.png" width="75%" />

---

 - プロパティの詳細を入力します。
   - ウェブサイトの名前：わかりやすい名前をつけます。
   - ウェブサイトのURL：測定したいサイトのURLを入力します。
   - 業種：測定したいサイトに近い業種を選択します。
   - レポートのタイムゾーン：日本を選択しました。
 - 「作成」ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442878/a9349d68-f66d-8111-fb75-12d0e01e0d17.png" width="75%" />

---

 - アナリティクスの登録完了画面が表示されるので、トラッキングID(UA-で始まるID)をメモしておきます。

## WordPressへ設定する

 - WordPressへログインします。
 - 左メニューから「Cocoon設定」をクリックします。
 - 「アクセス解析・認証」タブをクリックします。
 - 「Google Analytics設定」の「Google AnalyticsトラッキングID」へトラッキングIDを入力します。
 - 「変更をまとめて保存」ボタンをクリックします。

以上です。
atom script package で bundle exec 付きで rspec 実行

メモ用に。
なんか直接 script package のソースコードいじってるの気持ち悪いけどまぁ気にしない。

1. `⌘,` で設定一覧開く
2. `Open Config Folder` で `.atom` を開く
3. `.atom/packages/script/lib/grammers/ruby.coffee` を開く
4. 以下のように書き換え (以下の例では File Based のもののみ `bundle exec` つけてる)

### before

```coffeescript
module.exports =

  RSpec:
    'Selection Based':
      command: 'ruby'
      args: (context) -> ['-e', context.getCode()]

    'File Based':
      command: 'rspec'
      args: ({filepath}) -> ['--tty', '--color', filepath]

    'Line Number Based':
      command: 'rspec'
      args: (context) -> ['--tty', '--color', context.fileColonLine()]

  Ruby:
    'Selection Based':
      command: 'ruby'
      args: (context) -> ['-e', context.getCode()]

    'File Based':
      command: 'ruby'
      args: ({filepath}) -> [filepath]

  'Ruby on Rails':

    'Selection Based':
      command: 'rails'
      args: (context) -> ['runner', context.getCode()]

    'File Based':
      command: 'rails'
      args: ({filepath}) -> ['runner', filepath]
```

### after

```coffeescript
module.exports =

  RSpec:
    'Selection Based':
      command: 'ruby'
      args: (context) -> ['-e', context.getCode()]

    'File Based':
      command: 'bundle'
      args: ({filepath}) -> ['exec', 'rspec', '--tty', '--color', filepath]

    'Line Number Based':
      command: 'rspec'
      args: (context) -> ['--tty', '--color', context.fileColonLine()]

  Ruby:
    'Selection Based':
      command: 'ruby'
      args: (context) -> ['-e', context.getCode()]

    'File Based':
      command: 'ruby'
      args: ({filepath}) -> [filepath]

  'Ruby on Rails':

    'Selection Based':
      command: 'rails'
      args: (context) -> ['runner', context.getCode()]

    'File Based':
      command: 'rails'
      args: ({filepath}) -> ['runner', filepath]
```
昔作ったperl_2

昔作ったperlの2個目

ピポットでマックスと伝票番号枠のmaxとminを取得するのに作成。

ハッシュにいれつつif分でデータ修正することが目的　だった気がする。。。

<pre>
#!/usr/bin/perl
############################################################################
#----------------------------------------------------------------------------------------#
use     Data::Dumper;
use     English;
use     File::Basename;
#----------------------------------------------------------------------------------------#
# 検索
#----------------------------------------------------------------------------------------#
my	$hash	=	{};
{
#104,705,912,20180427,036600,036600
	while   (my $rec =  <>)  {
		chomp $rec;
		
		my ( $kok, $dm_no, $syukkahyo, $hasso_yymmdd, $uriage, $hatu ) = split( /,/, $rec );
		
		s/\s*$//	for ( $uriage, $hatu );
			
		my $key	=	sprintf( "%s,%s", $kok, $syukkahyo );
		
		unless	( exists( $hash->{$key} ) ) {
			$hash->{$key}	= {
				MAX	=>	$dm_no,
				MIN	=>	$dm_no,
				CNT	=>	1,
			};
			next;
		}
		
		
		$hash->{$key}->{MAX}	=	$dm_no
			if	$hash->{$key}->{MAX} lt $dm_no;
		
		$hash->{$key}->{MIN}	=	$dm_no
			if	$dm_no lt $hash->{$key}->{MIN};
		
		$hash->{$key}->{CNT}++;
		
	}
}

{
	for my $key ( keys %$hash) {
		printf( "%s,%s,%s,%10d\n", $key, $hash->{$key}->{MIN}, $hash->{$key}->{MAX}, $hash->{$key}->{CNT} );
	}
}


#-----------------------------------------------------------#
exit
</pre>


久しぶりに作ったらうまくできなかったのでちょっと追記。。。

<pre>
#!/usr/bin/perl
############################################################################
#----------------------------------------------------------------------------------------#
use     Data::Dumper;
use     English;
use     File::Basename;
#----------------------------------------------------------------------------------------#
# 検索
#----------------------------------------------------------------------------------------#
my  $hash   =   {};
my  $TECD   =   {};

# 引数の処理
my  $rec      =   @ARGV[0];
my  $file      =   @ARGV[1];

open(IN, "$file");
{
	while (my $file = <> ){
		chomp $file;
		my ( hoge ) = split( ",", $file );  
		$TECD{$hoge} = "$hoge";
	}
}

open(IN, "$rec");
{
	while (my $rec =  <IN>){
		chomp $rec;
		my ( hogehoge ) = split( /,/, $rec );
		my $key = sprintf("%s", $StoreCode);
		if (exists $TECD{$key} ) {
			print "hogehoge\n";
		}
	}
}

#-----------------------------------------------------------#
exit
</pre>
昔作ったperl

#昔作ったperl

以前固定長のデータを編集する際に作成したperl
ただのピポットですね。。。

<pre>
use	strict;
use	Data::Dumper;
use	English;
use	File::Basename;

#074685067192,99073090001 ,20161201,073090
my	@OYA_BANS	=	( '20161201' .. '20161231' );

my	$input		=	@ARGV[0];
my	@LIST		=	readpipe "cat $input";
my	$TBL		=	do{
	my	%tbl	=	();
	foreach	my	$LIST_DATA (@LIST){
		chomp	$LIST_DATA;
		my		@DATA	=	split(",",$LIST_DATA);
	# 縦と横を決める
		my $tate	=	"@DATA[1],@DATA[3]";
		my $yoko	=	"@DATA[2]";
		$tbl{ "$tate" }->{$yoko}->{KOSU}++;
	}
	\%tbl
};

# ヘッダー出力
{
	printf( "%s,%s,%s,%s\n",'顧客', '事業所',join( ",", @OYA_BANS ), '総計' );
}

for	my	$key ( sort keys %{$TBL} ){
	my	$tate		=	$key;
	my	$oya_tbl	=	$TBL->{$key};
	my	@tbl_kosu	=	map{ exists( $oya_tbl->{$_} ) ? $oya_tbl->{$_}->{KOSU}  : 0 }   @OYA_BANS;
# 出力レコード作成
	my	$midasi		=	sprintf( "%s",$tate );
# 合計を取得
	my	$total_kosu	=	&total( \@tbl_kosu );
# 個数の行を出力
	printf( "%s,%s,%d\n",$midasi, join( ",", @tbl_kosu ), $total_kosu );
}

#----------------------------------------------------------------
#-      ___関数
#----------------------------------------------------------------
sub	total() {
	my		$arr	=	shift;
	my		$tmp	=	0;
	$tmp	+=		$_	for	@$arr;
	return	$tmp;
}

</pre>
Apple関連のシステムStatusの確認サイト

先日のAppleの新製品・新iPhone11の発表会は盛り上がりましたね。

そんな時にappleのPlatformにアプリ展開している方の開発者あるあるとしては、

- wwdcや大規模な発表会の前は申請の審査が遅れる
- sandbox課金テストがなんかおかしくなる時がある

などありませんでしょうか？

そんな際にひとまず確認するといいのがdeveloper用のappleシステム関連のstatus一覧表です。
https://developer.apple.com/system-status/

<img width="1014" alt="スクリーンショット 2019-09-17 10.55.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/309f0165-7631-68de-3c52-56d7f3dc398f.png">

アプリ審査の遅れなどはここでは確認することはできませんが、
sandbox課金などのシステム障害などは確認できるのでなにかあった際にはファーストステップの原因切り分けとして
見てみるといいと思います。
#VsCode で Command+Shift+N などで新しいウィンドウを開いたときのサイズを設定変更する ( Settings > newWindowDimensions )

![image](https://user-images.githubusercontent.com/13635059/65000749-b1b6a600-d927-11e9-89cf-ce7d8b58c33c.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
関数をコールするときに記述した変数のスコープは？

関数をコールするときにゴリゴリ変数を使ってを記述しているのを見て、ふとこの変数のスコープはなんだろうと思ったので確かめてみました。

```php
<?php

function test($args1, $args2) {
    echo '第1引数の値は：' . $args1;
    echo '第2引数の値は：' . $args2;
}

test($max = 255, '最大文字数は' . $max . 'です。');

echo '関数の後の$maxは：' . $max;
```

```php:実行結果
第1引数の値は：255
第2引数の値は：最大文字数は255です。
関数の後の$maxは：255
```

実行結果：[3v4l](https://3v4l.org/hKa5L)

実行結果を見るとわかりますが、関数コール後も `$max` の値が存在します。
今回は名前空間を指定していないので、`$max` はグローバルスコープです。
スコープの扱いは下記と同じですね。

```php
<?php

function test($args1, $args2) {
    echo '第1引数の値は：' . $args1;
    echo '第2引数の値は：' . $args2;
}

$max = 255;
$str = '最大文字数は' . $max . 'です。';

test($max, $str);

echo '関数の後の$maxは：' . $max;
```

確かめてみて、「よく考えたらそうだよね」という感想です。
Ionic+Firebase Analytics インストール時のエラー解消

# はじめに
Ionic4でFirebase Analyticsプラグインをインストールしようとした時に、エラーが出て入れることができませんでした。その時の解消方法のメモです。

# インストールとエラー
Firebase Analyticsプラグインの[インストール方法](https://ionicframework.com/jp/docs/native/firebase-analytics)に従って、以下のコマンドを投入した時にエラーが出た。

```
$ ionic cordova plugin add cordova-plugin-firebase-analytics

エラーの内容(途中省略)

Installing "cordova-plugin-firebase-analytics" for ios
Running command: pod install --verbose
Failed to install 'cordova-plugin-firebase-analytics': Error: pod: Command failed with exit code 31
    at ChildProcess.whenDone (/private/tmp/myApp/node_modules/cordova-common/src/superspawn.js:135:23)
    at ChildProcess.emit (events.js:197:13)
    at maybeClose (internal/child_process.js:984:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:265:5)
pod: Command failed with exit code 31
[ERROR] An error occurred while running subprocess cordova.
```

# エラーの解消方法
CocoaPods関係のエラーが出た時には、以下のコマンドでCocoaPods関係を更新。
この後、インストールするとエラーがなくインストールできた。
このコマンドは、GitHubのFirebase Analyticsプラグインの[インストールの項目](https://github.com/chemerisuk/cordova-plugin-firebase-analytics#installation)に記載してあった。

```
$ pod repo update
$ ionic cordova plugin rm cordova-plugin-firebase-analytics
$ ionic cordova plugin add cordova-plugin-firebase-analytics
```

# 環境
```
$ ionic info
Ionic:
   Ionic CLI                     : 5.2.8
   Ionic Framework               : @ionic/angular 4.9.1
Cordova:
   Cordova CLI       : 9.0.0 (cordova-lib@9.0.1)
   Cordova Platforms : android 8.0.0, ios 5.0.1
```

# 参考文献
- [Firebase Analyticsプラグイン(Ionicページ)](https://ionicframework.com/jp/docs/native/firebase-analytics)
- [Firebase Analyticsプラグイン(GitHubページ)](https://github.com/chemerisuk/cordova-plugin-firebase-analytics)
プログラミング初心者です

プログラミングをpythonで勉強し始めた者です。
（anaconda3、python3.7、jupyter notebook）

練習として、「任意の数字に対して、1以外で割り切れる数字があるか調べる」プログラムを作成したのですが、思ったように動かず困っています。

下記のプログラムなのですが、任意の数字に何を選んでも「整数を入れてください。」と出ます。
修正すべき箇所をお教えいただけないでしょうか。

    def yakusu():
        x = input("数字を入力してください。:")
    
        if not isinstance(x, int):
            print("整数を入れてください。")
        else:
            y = x

            for i in range(y-2):
                z = x%(i+2)
                if z == 0:
                    print(i+2)
                    break
    
            if z != 0:
                print("1以外に割り切れる数字はありません")
[小ネタ]minicom設定関係 2019年版

小ネタです。

こちらの続きというか、2019年版です。
https://qiita.com/chromabox/items/b3ceaab6efa6edde2bda

minicomで各種設定して、その設定を別で保存したいことがよくあります。
が、しかし、デフォルトでは「○○に保存」を選択しても保存してなかったり、root権限要求されるしで、ものすごく使いにくいので改善しようというやつです。


## 使用するユーザをdialoutグループに入れる
例えば、USB-SerialケーブルなどをLinuxマシンに刺すと、/dev/以下にこのように追加されます。

```shell:
crw-rw---- 1 root dialout 188, 0  4月  7 15:21 /dev/ttyUSB0
```

rootの他にもdialoutでも使用出来るので、mincom を使用するユーザをdialoutに入れます。

```shell:
$ sudo gpasswd -a ユーザ名 dialout
```

この他にも、udevの設定書き換える等方法はありますが、こちらのほうが圧倒的に楽なのでそうしています。

## minicomが設定を保存する先の権限を変更
minicomはデフォルトで/etc/minicomに設定を保存しようとします。
これを変えるのはキツイので、権限を変えます

```shell:
$ sudo chown root:dialout /etc/minicom
$ sudo chmod 775 /etc/minicom
```

先程追加したdialoutグループを追加して、そのグループに対してのみ書き込み許可させれば良いという話ですね。
ということで、これをしたら一旦ログアウトします。

## minicomに設定ファイルを保存させる
再ログイン後、次のようにしてminicomを起動します。

```shell:
$ minicom -s [設定名]
```

設定画面だけのモードになるので、レートやポートなどを設定してから、[設定名]に保存を選択します。
設定名が無い場合は、「dflに保存」となります。

なお、この設定ファイルは、/etc/minicomにminicom.設定名で保存されています。

こうやっておくと…

```shell:
$ minicom  [設定名]
```

で設定が復元されますし、tab補完も効きます。
また、設定を複製したい場合は、単純にcpコマンドで設定を複製出来たりと何かと便利になります。よかったですね。
Android Jetpack(AndroidXライブラリ)の最近の更新

https://developer.android.com/jetpack/androidx/versions

AndroidXライブラリの更新情報を眺めていろいろ機能を触ったのでまとめたいと思います。

**最近**の定義は恣意的なのでご了承ください。


## Navigation

### deeplink

`<deeplink>`タグによってUriを元にNavigationを開けるようになります。

### dialog

`<dialog>`タグにDialogFragmentを登録すれば、Navigationからダイアログを表示できます。

## Room(SQLite)

### コルーチン対応

`room-ktx`がsuspendメソッドに対応しました。

```
@Query("SELECT * FROM Status where count = :count")
suspend fun find(count: Int): Status? 
```

## Lifecycle

### ViewModelの初期化

以前はViewModelの取得では

```kotlin
private val viewModel by lazy { ViewModelProviders.of(this).get<MainViewModel>() }
```

と記述していましたが、ViewModelProvidersはDeprecatedになりました。

`activity-ktx`や`fragment-ktx`に追加された`activityViewModels`や`viewModels`で

```kotlin
private val activityViewModel: ActivityViewModel by activityViewModels()
private val fragmentViewModel: FragmentViewModel by viewModels()
```

と記述するようにします。

JavaからはViewModelProviderを直接使用して

```java
MainViewModel viewModel = new ViewModelProvider(getViewModelStore(), getDefaultViewModelProviderFactory()).get(MainViewModel.class);
```

という感じです。

ViewModelに引数を渡したい場合は`ViewModelProvider.NewInstanceFactory`を継承して

```kotlin:定義側
class YearMonthViewModel(val yearMonth: YearMonth) : ViewModel() {
    class Factory(private val yearMonth: YearMonth) : ViewModelProvider.NewInstanceFactory() {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass != YearMonthViewModel::class.java)
                return super.create(modelClass)
            @Suppress("UNCHECKED_CAST")
            return YearMonthViewModel(yearMonth) as T
        }
    }
}
```

```kotlin:呼び出し側
private val viewModel: YearMonthViewModel by viewModels {
    
YearMonthViewModel.Factory(YearMonthFragmentArgs.fromBundle(requireArguments()).yearMonth)
}
```

というようにFactoryクラスを使って初期化します。

### ViewModel.viewModelScope

[viewmodel-ktx 2.1.0で導入されるviewModelScopeを使えばCoroutineScopeを実装しなくてよくなる
](https://qiita.com/kafumi/items/8a8764679df8646b764a)

上記の記事のとおりです。

ViewModelでコルーチンが使いやすくなります。

2.2.0では`lifecycleScope`も追加されてFragmentなどからも使えます。

### LiveData-ktx

```kotlin
val time: MutableLiveData<LocalTime> = MutableLiveData()
val timeText = Transformations.map(time) { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }
val timeText2 = time.map { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }
```

timeText2のようにTransformationsを使わず、LiveDataに直接`map`を行うようなラッパーがlivedata-ktxに追加されました。地味に可読性が向上します。
DynamoDB の GUI ツールが公式から出たよ！

# はじめに

みなさんAWS使ってますか？ DynamoDB 使ってますか？
DynamoDB のコンソールってすごく使いづらくないですか？
頑張っても100件しか表示されないし、その100件の中でしか昇順降順の並び替えできないし…見た目もなんかあれだし………
でも今回紹介するツールを使えばそんな悩みも解消されるかもしれません！

今回紹介するのは **NoSQL Workbench for Amazon DynamoDB** です！

## NoSQL Workbench for Amazon DynamoDB

AWSが公式でリリースしたデスクトップアプリです。(2019/09/17時点ではプレビュー版)
https://aws.amazon.com/jp/about-aws/whats-new/2019/09/introducing-nosql-workbench-for-amazon-dynamodb-now-in-preview/
見た目もなかなかいい感じになっています。

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-27-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/40ac35ab-9836-5bb9-91ab-e370126a69e8.png)

## 使い方

使うにはローカルマシンAWS-CLIがインストールされている必要があるようです。
サイドメニューのDBっぽいアイコンをクリックするとこのような画面が開きます。

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-31-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/ede85ad0-6c86-d010-3f35-d3629be53614.png)

ここにはAWS-CLIで設定している profile が並んでいます。
ここから profile を選択すればその profile に付与されている権限の範囲内でテーブルを閲覧することが可能です。

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-33-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/6c3dcd27-27dd-fb9b-77de-e09334b611bd.png)

Build operations からテーブルに対して UpdateItem だったり Query などの操作を行うことができます

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-35-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/ea6951d3-517b-1138-14e1-d0943fdef9b5.png)

## 使ってみよう

Query を実行してみましょう
先程の Build operation から Query を選択します

PartitionKey や SortKey の範囲指定などの各 Key に対する条件指定や、 IndexForword や Limit などの条件指定ができます。
Execute をクリックすると実際に Query が実行されます。

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-42-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/2efae4c4-b176-5e42-f9b4-bd2465bc2aff.png)

また Generate code をクリックすると Python / Node.js / Java のソースコードが生成されます。

![NoSQL Workbench for Amazon DynamoDB (Preview) 2019-09-17 10-46-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95875/a66549ee-6ae7-d63b-1824-bab5116142d2.png)

これでLambdaなどを書くときの手間がかなり減りそうです！

## さいごに

いかがでしたでしょうか？
実際に軽く使ってみただけでもかなり便利でした！
アカウントの切り替えが profile を選択するだけで済むので、AWSアカウントにログインし直すという手間がなくなります。
みなさんも一度使ってみてはいかがでしょうか？
ではまた！
ポモドーロテクニックと2点見積り法を組み合わせて作業管理した所 作業効率が上がった話

現在の職責の役割上コードレビューがとても重要になっているのですが
他人のレビューにかかる工数と作業割り込みにより
自分担当分の開発における作業効率向上に四苦八苦していました。

そんな折、技術書典6で購入した[ワンストップ見積り本](https://note.mu/oyakata2438/n/n52a56035317c)を読み返した時に
2点見積り法にフックがかかったので
最近覚えたポモドーロテクニックと合わせてやってみる事にしました。

## 2点見積り法とは
- 一切のバッファが無い場合に最短でいつ終わるか終わらないかギリギリの挑戦的な時間（最小工数 確度20%）
- あらゆるバッファを加味した上でこれ以上時間がかかると恥ずかしいレベルの時間（最大工数 確度100％）

の二つの工数を見積ります。

プロジェクト全体で見積りを合算する場合は
バッファの計算式 `(最大工数 - 最小工数)/2` `(最大工数 - 50%の確度の工数)` や
不安量 `(最大工数 - 50%の確度の工数)^2` などを利用しますが
今回はとりあえず自分の工数見積りの確度を上げる為に
最小工数と最大工数の中央値に実作業時間が取れる様にする事だけ心がけてみました。

## ポモドーロテクニックとは
- タイマーを使って25分間作業をして5分を休むというセットを1ポモドーロとします。
- だいたい4ポモドーロ毎に長めの休憩を入れます。
- 25分のタイマーが動いて居る間はとにかく集中しようと言う気になるので作業が捗ります。
- また25分経っても嵌まっている時は気持ちを切り替えアプローチを変えるなど効率も上がった気がします。

## 実際にどう組み合わせたか
1ポモドーロを1Pとして2点見積りをざっくり行います。
1時間で終わると思えば2Pになります。

1Pには25分の作業時間と5分の休憩時間を含めます。
ただし、レビュー作業をその5分の休憩時間の間にできるだけやる事にしました。
5分の休憩はとりあえず立ち上がって階段を昇り降りしたりトイレに行くくらいにして
意識を切り替えるという目的で使う事にしました。

5分の休憩時間内に終わらないレビューもあるので
その場合は5分経ったらレビューを打ち切るわけではなく
別途計測してレビューを一旦完遂させる様にしています。

レビューのキューがなくなったら次のポモドーロを開始します。

## 一月ほどやってみて

ポモドーロテクニックによる集中効果は何度かやっているうちに体に染みついたので
自分の作業工数を見積るイメージの向上に役に立ちました。

特に最小工数においては完全に集中してやればこれくらいだろう
という目標が具体的に捉える事ができ集中力向上にも役に立ちました。

また、ポモドーロは30分単位で実績を計測するのに良い物差しでした。
実際にどれくらいかかったかをアプリを併用する事で
具体的に把握できる様になり、タスクの振り返りがしやすくなりました。

最大工数を超えた事も無いわけではないですが、
最大工数を超えそうになった作業はタスクの細分化が不十分だったとみなして
大枠で動く所まで作ったら
子タスクを作成して改めて追加の見積りを出して作業を仕切り直す様にしました。

最小と最大をアバウトに見積もる事で
見積りが気軽にできる様になり
また見積りの失敗が最大工数で可視化できるので
仕切り直す決断も早めにできた事は2点見積り法のメリットだったと思います。

## デメリット

非常に疲れます。
夕方18時すぎくらいにピークがくるので
意識がもうろうとしてきたり集中が続かなかったりで
ポモドーロが上手くまわらなくなるので
長めの休憩をついつい取ってしまう事があります。

これはポモドーロテクニックに慣れればもう少し改善されるかもしれません。
gimpを使って紙のイラストからLINEスタンプ作るまでにやったこと

# この記事について

イラスト、デザインのセンスがないのでスタンプなどと関わる機会もなかったが、

一度は作ってみたかったので試した

ソフトの操作も不明な状態から始まっているので変な手順になっている可能性があるのでその場合指摘してください

# 素材入手

素材を入手しスキャンしておく。

今回は偶然活きの良い小学生の落書きを入手したのでそちらを使用する。

![test.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/71198e45-ecb1-f348-33e5-357063669b45.jpeg)


# 加工前に仕様を知る

公式ガイドラインに書いてある

https://creator.line.me/ja/guideline/sticker/

|  | 必要数 | サイズ(pixel) |
|:--|:--|:--|
| メイン画像 | 1個 | よこ240px × たて240px |
| スタンプ画像(選択式) | 8個/16個/24個/32個/40個 | よこ370px × たて320px（最大） |
| トークルームタブ画像 | 1個 | よこ96px × たて74px |

最短で試したい場合は８個スタンプを作成し、２個大きさ違いの画像を作成すればリリースできそう


# gimp インストロール

適当にぐぐってインスコしてください

怪しいフリーソフト系のサイトとかで入れると変なソフト入ってしまうことがあるのでちゅういしよう

# ここから加工にはいるが、、

完全に素人なのでちゃんとした手順じゃないので鵜呑みにしないようちゅういしよう

# インポート

まずはインポート後、右下の画像が出ているとこで右クリックして「アルファチャンネルの追加」をクリック

これで背景が透過されるようになる

<img width="854" alt="スクリーンショット 2019-09-09 9.42.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/39efd2e4-ef0f-a600-8370-3bb669103c2f.png">


# レイヤの複製

その語同じように右クリックしてレイヤの複製を作りたい枚数分クリっ子

<img width="352" alt="スクリーンショット 2019-09-09 9.44.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/c43fe390-35ad-1f25-e0a5-32e9196ac248.png">

したあと目玉マークを一枚以外はずす

この目玉マークが見えているレイヤだ

<img width="343" alt="スクリーンショット 2019-09-09 9.45.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/073e0e6c-0e52-b55b-625d-60a598d2ae1e.png">

# 一枚ずつくり抜く

今回はパンチパンダペンさんをくり抜くことにした

左上のパネルから輪投げツールを選択し適当にクリックして選択範囲を決めてエンターすると選択範囲が決定される

<img width="578" alt="スクリーンショット 2019-09-09 9.48.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/45fdf959-b139-ebf8-2c87-f772e81d4c91.png">

選択メニュから選択範囲の反転を押す

<img width="463" alt="スクリーンショット 2019-09-09 9.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/b35117c5-7bcf-b253-52d8-ec18ea1719ec.png">

そして切り取る

<img width="374" alt="スクリーンショット 2019-09-09 9.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/cd427953-f451-0887-d790-3bd36166e890.png">

このままでも多分大丈夫だがひと手間加えるためにフチを作成する

もう一度選択範囲を反転する

選択メニュから「縁取り選択」をクリッジュ

<img width="420" alt="スクリーンショット 2019-09-09 9.55.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/7011cad5-d358-0e68-0d17-0505cd2b4be9.png">

縁が選択されるので「描画色で塗りつぶす」を選ぶ

この前に描画色に好きな色を設定しておいてね（手順漏れ事件）

<img width="469" alt="スクリーンショット 2019-09-09 9.56.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/8aa5232b-293b-cf72-d3f8-14ea1ee7ac1c.png">

いい感じにフチが選択できた

<img width="466" alt="スクリーンショット 2019-09-09 9.57.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/3c7c5d75-b5c1-b673-ffd2-b2a8f69c6289.png">

あとはこれをレイヤごとに繰り返したあと、指定サイズで出力していけば完成だ

# 登録

ラインクリエイターズなんたらかんたらというとこに登録が必要だ

https://creator.line.me/ja/

自分のアカウントで入ってあとはいい感じにスタンプ説明文とか画像を登録していけばスタンプが作成できる。

ここになって急に雑になったなとか思ったかもしれないがわかりやすいページなので大丈夫だと思うよ

# 審査

あとはいい感じにいけば審査NGかOKが出る

NGが出たら指摘部分を修正してもっかい審査に出せばよい

審査OKが出れば販売開始てきなボタンを押せば販売開始される。

# かかった時間

デザイナの育成：９年ほど

スタンプ作成：２，３時間

審査：１，２日

# 実際のスタンプ

https://store.line.me/stickershop/product/9061342
Rails + heroku + order("rand()")が効かない話

## 経緯
就職活動に向けポートフォリオづくりに勤しんでいました。
１つ目のポートフォリオが完成したためherokuにデプロイしていました。

## herokuにデプロイ
普段はAWSにデプロイしていたため、herokuのお手軽デプロイにびっくりしました。<br>
herokuのgitレポジトリにpushするだけとは…！これがPaaSなんですね！
DBはmySQLを利用していたため、そこだけをPostgreSQLに変更して早速デプロイしました。

## サイトにアクセスできない…！
[![Image from Gyazo](https://i.gyazo.com/a05b9ea6db2c244d9fc3961b630b1128.png)](https://gyazo.com/a05b9ea6db2c244d9fc3961b630b1128)

1. 色々なリンクにアクセスしてみました<br>
  →なぜかindexだけアクセスできない…<br>
2. DBが空だと発生するエラーかな？<br>
  →local環境ではDB空でもエラーは発生しない<br>
3. indexにのみ表示されているランキング周りのエラーかな？<br>
  →なんだかそれっぽい！

<a href="https://gyazo.com/7c8282e71dabf0d936024b7813bf4c1d"><img src="https://i.gyazo.com/7c8282e71dabf0d936024b7813bf4c1d.png" alt="Image from Gyazo" width="369"/></a>（この機能）

## herokuのエラーログの確認方法は…？
> 【Rails】ローカルにないエラーがherokuで表示された時の対処法
> https://qiita.com/YukiWebTech/items/68b2efa252cea7148173
>
> ```cmd
> heroku logs -t #-tでも-tailでもOK
> ```

上記を参考にしてlogを確認しました。

``` cmd
ActionView::Template::Error (PG::UndefinedFunction: ERROR:  function rand() does not exist
LINE 1: SELECT  "weblogs".* FROM "weblogs" ORDER BY rand() LIMIT $1
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
```
やはりランキング周りのエラーだったようです。どうやら

```ruby
@random_rank = Weblog.order("rand()").limit(3)
```
このorder("rand()")がherokuではうまく動作していないらしい？

> Rails + Heroku + Postgres で日本語の order がうまくいかない対処法
> https://qiita.com/star__hoshi/items/e53cc5b770905fd49da6

ちなみにorderを削除して

```ruby
@random_rank = Weblog.limit(3)
```
と書き直したらerrorは解決されました。やはりrand()がだめらしい。

## いろいろ調べてみた
> Rails Postgresql sort by random
> https://stackoverflow.com/questions/13641007/rails-postgresql-sort-by-random
> 1st approach
> Hashtag.order("RANDOM()").limit(4)
> 2nd approach:
> Hashtag.all.sample(4)
> SQL: 1.8ms
> Sample Method: 4.2ms

どうやらrand()はmySQLのみでしか使えず、PostgresqlではRANDOM()を使う必要があるそうです。
他にはActiveRecodeのsampleメソッドでも必要な数を取得できるようです。
ただしSQL文を用いたほうが処理が早いとのこと。

## 結論
処理は早いほうが良いので、本番環境か否かで場合分けを行うことにしました。

```ruby
rand = Rails.env.production? ? "RANDOM()" : "rand()"
@random_rank = Weblog.order(rand).limit(3)
```

## 感想
初のherokuデプロイとPostgreSQLの利用で少しだけ戸惑いました。<br>
しかしお手軽な上に無料で利用することができるherokuをもっと利用したいと考えています！<br>
次はSSL認証が使える月7ドルプランも試してみようかなと思っています。
【Bash】繰り返し文字列を作成する

シェルスクリプトを書いていて、
文字列をN回繰り返して返す関数が欲しくなったのでメモ。

`printf` で文字数Nの空白文字列を作成し、
`sed` で各空白を対象の文字列に置換しています。

```sh
str_repeat() {
    str=$1
    count=$2
    
    echo "`printf %${count}s | sed "s/ /${str}/g"`"
}

echo $( str_repeat "abc" 3 )
# => abcabcabc
```
Amazon Linuxでphp5.3以上をインストールするための忘備録

AWSの勉強中、
WebサーバーにWordPressとPHPを入れた後、動作確認すると
バージョンWordPressのバージョンに対して、PHPのバージョンが古すぎると（恐らく）WordPressにお叱りを受けたので、
対処したときにてこずったので忘備録。

# 状況
AWSでEC2上にAMAZON LINUX2を使用。
PHPをインストール。（yumコマンドを使用）
WordPressをインストール。
Appacheを起動。

ブラウザでページを確認すると・・・
**wordpress（5.2.2）はPHP5.6.20以上が必要とのこと**

# 対処方法
まず、PHPのバージョンを確認

```
$ yum list installed | grep php #インストールしたPHPのバージョンを確認
```
次は、phpのアンインストールから

```
$ sudo yum remove php*
```
remiリポジトリの追加。
epelリポジトリはAmazon Linux（Amazon Linux 2 AMI 2.0.20190618）にはすでにインストール済み。

```
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```
再度PHPのインストールを実施。

```
$ sudo yum -y install  --disablerepo=amzn-main --enablerepo=remi-php72 php php-mysql php-mbstring

$ yum list installed | grep php #インストールしたPHPのバージョンを確認
```
これで、PHP7.2がインストールされた。

# まとめ
AMAZON LINUXにPHP7.2のインストールができた。
**動作確認するときはAppacheの再起動を忘れずに行うこと。**
Amazon Linuxでは、何もしないと、PHPは5.3がインストールされる。
原因は、Amazon Linuxのデフォルトの状態では、amzn-main.repoとamzn-updates.repoのリポジトリ以外は無効化いる。
amzn-main.repoには、PHPが5.3までしか対応していない。
そのためにオプションでamzn-mainを無効にして、インストールしたremiリポジトリを有効にしてあげる必要がある。

# 参考ページ
[PHP 最低必須バージョンの変更](https://homepage-reborn.com/2019/01/22/2019%E5%B9%B44%E6%9C%88%E3%81%8B%E3%82%89wordpress%E3%81%AEphp%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AF5-6%E4%BB%A5%E4%B8%8A%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%82%88/)
[Amazon LinuxでYUMを使う時に気をつけるポイント](https://dev.classmethod.jp/server-side/os/amazonlinux-yum-priority/)
[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)
#GoogleChrome の Developer Tool で Cookie を表示するには Applicationsタブ > Cookies ( Name / Value / Path / Expires / Secure属性 / HttpOnly )

![image](https://user-images.githubusercontent.com/13635059/64997908-102a5700-d91d-11e9-8ce1-55b4de1ce98a.png)

Resourcesタブにあると開設されているサイトもあるが、タブが変更になっていそう？

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravel 5.8  MySQL 8.0 でログイン機能を実装するまで


## 環境
- macOS Mojave 10.14.6
- laravel 5.8.35
- MySQL 8.0.17

composerのインストールが既に終わっていることを前提に解説していきます。
MySQL 8.0以降ではユーザー関連のコマンドの仕様により色々とエラーにハマってしまったので、今後開発する人のためや、自分用のメモとしてまとめて見ました。


## アプリの新規作成

```
composer create-project laravel/laravel app_name --prefer-dist
```

### MySQLでデータベースを作成する。

```
MySQL> create database db_name;
```

## MySQLユーザーを作成する（既に作成している場合は不要）

```
MySQL> create user 'dbuser'@'localhost' identified by 'password';
```

MySQL 8.0以降はパスワードLOWでも条件が厳しくなっているので、今まで通っていたパスワードでも怒られることがあります。
```
// LOWにする場合
MySQL> SET GLOBAL validate_password.policy = LOW;
```
https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html

## MySQLユーザーに権限を与える

```
MySQL> grant all on db_name.* to 'dbuser'@'localhost';
```
MySQLの操作は以上で終了　\q でMySQLを終了させておく。

MySQL８以降はgrantコマンドでユーザー作成ができないのでこの手順で作成する

## パスワード認証方式を変更する

MySQL 8.0以降ではデフォルトで `caching_sha2_password` となっている。このままだと接続がうまくいかないので `mysql_native_password` へ変更する必要がある。

### まずは確認してみる
```
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| dbuser           | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

```

###  dbuserの認証方式を変更する

```
mysql> ALTER USER 'dbuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.10 sec)
```

## laravelとMySQLを接続する

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app_name
DB_USERNAME=dbuser
DB_PASSWORD=password
```
.envファイルにデータベース名、ユーザー名、パスワードを記述。

## usersテーブルを作成する

```
php artisan migrate
```

laravelでは既にusersテーブルを作成する為のマイグレーションファイルが用意されているので今回はそのまま使用します。

## ログイン機能を実装する

```
php artisan make:auth
```

laravelではこのコマンドを実行するだけでログイン機能を実装できます。
Array.flatはPromise.allと組み合わせると便利だった

# Array.flat
ES2019で配列に追加された新しい関数に`flat`があります。

これは、ネストした階層をほぐして平らにする関数です。

``` javascript
const nested = [[1,2],3,4];
const flattend = nested.flat();// [1,2,3,4]
```

基本は上記の使い方ですが、引数で何階層まで平らにするも指定できます。
詳しい使い方は[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)に詳しいのでそちらで。
ただ、複数階層flatはちょっと使いどころが思いつきません。

# 使いどころ
始めに見たときはflatMapはともかく、これはあまり使いどころないんじゃ？
と思ったのですが、Promise.allをごりごり使うような処理を書く時は意外と便利でした。

## Promise.allで取ってきた配列を結合したい場合
非同期処理で同じ型の配列を同時に複数取りたい時がたまにあります。
(複数のIDに紐づく子要素のリストを取りたい場合とか)
そういう場合、

``` javascript
Promise.all(ids.map(mapToPromiseFunction)).then(results => {
　　
});
```
という感じにありますが、resultsは欲しい要素の配列の配列になってしまいます。
各IDについて別個に扱いたい場合はそれでOKですが、まとめて扱いたい場合はresultsに入っている各配列を結合してやる必要があります。

そんな時、今までは

``` javascript
const concatenated = results.reduce((prev,current) => prev.concat(current));
```
と書く必要がありましたが、flatを使えば

``` javascript
const flattend = results.flat();
```
と書けます。
コード量が少なくて済みますし、より宣言的で何をやっているのか一目瞭然です。
こいつはいい。

# 注意点
ただ、このflat、Typescriptの対応がまだまだ甘い部分があります。
基本的に、中身の階層がずれていたり、適切な階層数を指定していないとすぐにany []型になります。

``` typescript
[[1,2],[3,4]].flat();//number []
[1,2,[3,4]].flat();// any []
[[[1,2]],[[3,4]]].flat(2);//number []
[[[1,2]],[[3,4]]].flat(3);//any []
[1,2,[3,4].flat()].flat();//any []
```
入れ子もダメなので、Typescriptを使う場合は一階層に留めておいた方がよさそう。

# まとめ
* flatでいい感じに配列が結合できる
* Promise.all辺りと組み合わせると便利
* 複数階層の平坦化なども出来るが、Typscript対応が甘いので注意
dockerの起動失敗に対する対処【docker for windows】

## abst
個人的な備忘録

## もう何回見たか分からないエラー
```
Unable to create - ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。Hyper-V で、"DockerNAT" という名前の仮想スイッチが見つかりませんでした。
```

## 状況確認
+ docker Dsktopのupdateをインストールした直後によく発生する
+ Windows管理ツール > Hyper-Vマネージャーで確認すると  
    + 仮想マシン： DockerDesktopVMがない
    + 仮想スイッチマネージャー：DockerNATがない

## 対処1
再起動が2回必要だが、ほぼこれで解決する
プログラムと機能 > Windowsの機能の有効化または無効化
で表示されるディレクトリツリーの
Hyper-V > Hyper-V プラットフォーム > **Hyper-Vサービス**
のチェックを外して再起動、チェックをつけなおして再再起動

復活！

## 対処2
DockerNATを作成する。ないなら作ればいいじゃない。
### GUIから作成(失敗した)
Windows管理ツール > Hyper-Vマネージャー > 仮想スイッチマネージャーから
新しい仮想スイッチ → 内部 を選んで作成
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293810/cf49c085-5ecb-b973-7c0d-c5c91675f241.png)

えぇ...
これじゃエラーが起きたことしかわからないのでコマンドから試す。

### powershellコマンドで作る
Dockerのインストールフォルダ以下
Docker > Docker > resources > MobyLinux.ps1
内部に仮想マシンと仮想スイッチを作っている記述がある。

~~ps読めないが、多分~~
VMSwitchとVMAdapterがちゃんとあれば既存のものを使い、無ければ作っている
何で失敗しているんだろう？

```{powershell:MobyLinux.ps1}
Hyper-V\New-VMSwitch $Name -SwitchType Internal -ea SilentlyContinue | Out-Null
```

このあたりで作っていそうな雰囲気。
`-ea`はErrorActionらしいので省いて実行

```{powershell}
PS C:\Windows\system32> New-VMSwitch DockerNAT -SwitchType Internal
New-VMSwitch : 仮想イーサネット スイッチの作成中にエラーが発生しました。
発生場所 行:1 文字:1
+ New-VMSwitch DockerNAT -SwitchType Internal
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [New-VMSwitch], VirtualizationException
    + FullyQualifiedErrorId : ObjectNotFound,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch

```
`New-VMSwitch`コマンドがない、らしい

...PC再起動して、コマンドを再度実行すると作れた。謎。
その後docker for windows を起動すると、成功した雰囲気

```
$ docker -v
Docker version 19.03.2, build 6a30dfc
```

復活！！
GASで通知Botを作る上で役に立った記事

# はじめに
こんにちは、マロです。

最近モンスターハンターアイスボーンばっかりやってて全く勉強ができていません。

９月も半ばに入ったことですし、しっかりと勉強モードに入っていこうと思います。

この記事を書いたのは友人がGAS勉強したいと言ってて「マロの勉強した過程教えてくれ！」とのことだったので書きました。

やることの難易度？的に分類もしてみました。

初心者の分類なので当てにならないかもしれませんがまぁ参考がてらに。

GASを勉強する誰かの役にたれてば・・・

※ChatはG suiteのHangoutを想定してます！

## 概要掴む的なやつ

- https://tonari-it.com/google-apps-script-manual/
  - 多いから全部読まなくていいとおもう・・・、なんかやりたいことあれば探す的な辞書的な

## 初級編

- **Webhook を用いて Chat に通知を送る**
  - http://20november.hatenablog.com/entry/2018/06/14/235352
- **Google calender を読み出して Chat に通知する**
  - この記事はトリガーの設定もありかなり重要
  - https://qiita.com/mi0/items/d55324db83c4e98ae3fa#%E6%88%90%E6%9E%9C%E7%89%A9
- Google Form の回答内容を Chat に通知する
  - https://qiita.com/pchan52/items/574e930a3cc42cf7f8b9
- Calender → Spreadsheet → Chat での通知の手法
  - https://note.mu/sonicjam/n/n10b1cb2acf1c
  - まぁ知っとくと便利

## 中級編

- Webhook ではなく GoogleAPI を用いて chatbot を作成する手法
  - https://webird-programming.tech/archives/624
- Backlog の通知を GAS でまとめて通知する
  - https://qiita.com/daivr7774/items/1874c05d0d375b49be2b
- GAS でのデータスクレイピング
  - https://qiita.com/standard-software/items/16214dc4e64d28952c2d
- カレンダーからの LINE 通知
  - https://blog.piyo.tech/posts/2018-04-17-line-notify/
- カレンダーに当番表の自動生成からの chat の通知
  - https://ja.ngs.io/2014/12/23/touban-calendar/
- Google Task の GAS での操作
  - https://www.virment.com/use-google-tasks-from-script/
- GAS がローカル作業ができるようになる Clasp の導入方法
  - https://gas.excelspeedup.com/
- Typesript を用いた GAS の開発
  - https://budougumi0617.github.io/2019/01/16/develop-google-apps-script-by-typescript/

## GAS じゃないけどついでに・・・

- AutoHotkey のキーリスト
  - キーボードのキーの設定変えるやつ(win ボタンを ctrl に変更した)
  - https://sites.google.com/site/autohotkeyjp/reference/KeyList
  - 職場のPCがwindowsで使いづらかったので欠かせないアプリになっている。
- Backlog の通知を Chrome 拡張機能で実装している記事
  - https://qiita.com/Akoarum_K/items/be944c73c31cfafeec5e
  - これもBacklogの通知わかりづらすぎたので導入
DockerコンテナからDockerコンテナを起動する時にマウントする方法

# 概要

　ホストのDocker daemonを共有するDockerコンテナ(コンテナ1)からDockerコンテナ(コンテナ2)を起動する時にコンテナ1のディレクトリをコンテナ2にマウントする方法について紹介します
　そもそもそんな用途あるのか？という話ですが、例えばコンテナベースのCI環境でテスト用コンテナにソース管理用コンテナのリソースをマウントしてテスト実行する時とか

![docker_mount_from_docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/be3eda3e-95ae-90f0-a213-811ddc59d84d.png)

# 結論

ホストのDocker daemonをマウントしたコンテナ1のディレクトリをコンテナ2にマウントする時に指定するファイルパスは**ホストから見たファイルパスにしなければならない**


# 検証コード

この検証ではコンテナから新たなコンテナを起動したりしますので、
[インセプション](https://movies.yahoo.co.jp/movie/334832/)状態になり、どの世界にいるのかがわからなくなります
なので、下記のコマンドで実行環境を示すために`[コンテナ1]`などと表記しています

1. コンテナ1を作成し、コンテナ1でdockerをインストールします

    ```shell

    # [ホスト] コンテナ1を作成
    > docker run --rm -it --name container1 -v /var/run/docker.sock:/var/run/docker.sock:ro ubuntu:14.04 /bin/bash

    # [コンテナ1] dockerをインストール
    > apt-get update && apt-get install -y docker.io

    # [コンテナ1] 確認用のファイルを作成し、作成されたファイルを確認
    > mkdir /tmp/mount_test && touch /tmp/mount_test/test1.txt && touch /tmp/mount_test/test2.txt && touch /tmp/mount_test/test3.txt && ls -la /tmp/mount_test

    ```
2. コンテナ1でコンテナ1の`/tmp/mount_test`をマウントするコンテナ2を作成します（**失敗例**）
   
    ```shell
    # [コンテナ1] コンテナ2を作成
    > docker run --rm -it --name container2 -v /tmp/mount_test:/tmp/mount_test ubuntu:14.04 /bin/bash
    ```

3. コンテナ2でマウントされた`/tmp/mount_test`を確認します
   **ファイルがない**ことが確認できます
   なぜないのか！？ホストのDocker daemonをマウントしているため、マウント時はホストのファイルパスが参照されます
   よって、ホストには`/tmp/mount_test`がないため、マウント先は空になります

    ```shell
    # [コンテナ2] /tmp/mount_testを確認
    > ls -la /tmp/mount_test

      drwxr-xr-x 2 root root   40 Sep 15 06:15 .
      drwxrwxrwt 1 root root 4096 Sep 15 06:15 ..
    ```

4. 気を取り直して、今度はホストから見たコンテナ1のファイルパスでマウントしましょう
   ファイルパスは`docker inspect`コマンドで取得します
   ポイントとしては**コンテナ化した時に作成された差分はdiff配下に生成されます**
   前述のコードで`/tmp/mount_test`を作成したことで、コンテナイメージから差分としてdiffに保存されます

    ```shell
    # [コンテナ2] コンテナ2から抜けます
    > exit

    # [コンテナ1] ホストから見たコンテナ1のファイルパスを取得する
    > docker inspect --format='{{.GraphDriver.Data.UpperDir}}' container1

    # [コンテナ1] テナント2を作成
    # 上記のコマンドで得られたファイルパスを以下の<xxx>に置き換えてください
    > docker run --rm -it --name container2 -v <xxx>/tmp/mount_test:/tmp/mount_test ubuntu:14.04 /bin/bash
    ```

5. コンテナ2でマウントされた`/tmp/mount_test`を確認します
   コンテナ1のファイルがマウントされていることが確認できます

    ```shell
    # [コンテナ2] /tmp/mount_testを確認
    > ls -la /tmp/mount_test

      drwxr-xr-x 2 root root 4096 Sep 15 06:00 .
      drwxrwxrwt 1 root root 4096 Sep 15 08:48 ..
      -rw-r--r-- 1 root root    0 Sep 15 06:00 test1.txt
      -rw-r--r-- 1 root root    0 Sep 15 06:00 test2.txt
      -rw-r--r-- 1 root root    0 Sep 15 06:00 test3.txt
    ```
開発中に Realm で属性追加でエラー発生したら（ dnssd_clientstub ConnectToServer: connect()-> No of tries: 1 ）


# 環境
* macOS Mojave：10.14.6
* Xcode：10.3
* Realm：3.17.3
* RealmSwift：3.17.3

# 概要
Realm で開発中にデータ構造を変更すると以下のエラーが発生することがあります。

```
dnssd_clientstub ConnectToServer: connect()-> No of tries: 1
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:
```

基本的にはデータ構造を変更する際には、マイグレーション処理を行う必要がありますが、開発中だと頻繁？にデータ構造を変えたくなるのでデータを消してしまうのが簡単です。

Mac アプリは以下のディレクトリにインストールされています。
` ~/Library/Containers/${Bundle Identifier}`
アプリによって、Bundle Identifier を設定してください。

自分のサンプルアプリだと↓の感じです。

```sh
$ ls -la ~/Library/Containers/com.ynozue.mac.NSTableViewSample/
total 8
drwx------    4 ynozue  staff   128  9 13 09:20 .
drwx------  209 ynozue  staff  6688  8 21 09:38 ..
-rw-------    1 ynozue  staff   247  9 13 09:20 Container.plist
drwx------   10 ynozue  staff   320  9 13 09:20 Data

$ rm -rf ~/Library/Containers/com.ynozue.mac.NSTableViewSample/Data

$ ls -la ~/Library/Containers/com.ynozue.mac.NSTableViewSample/
total 8
drwx------    3 ynozue  staff    96  9 17 09:22 .
drwx------  209 ynozue  staff  6688  8 21 09:38 ..
-rw-------    1 ynozue  staff   247  9 17 09:20 Container.plist
```
GCP Compute Engineをマシンタイプまとめてみた

#はじめに
GCP Compute Engineのマシンタイプについて、まとめてみました。 学習用のため、公式ドキュメントに記載されていることをまとめています。
https://cloud.google.com/compute/docs/machine-types?hl=ja

#マシンタイプについて
マシンタイプは、汎用、コンピューティング最適化、メモリ最適化、共有コアの４つがあります。それでは、それぞれのマシンタイプについて、みていきましょう。

## 汎用マシンタイプ
読んで字のごとく、幅広い用途に使えるマシンタイプ。ワークロードに最適なマシンタイプがわからない場合には、こちらを選択することを推奨されている。
###N1 マシンタイプの特徴
選択できるvcpuとメモリは以下のようになっている。

| vcpuあたりのメモリ | vcpu | カスタムマシンタイプか |　継続利用割引 |
|-----------|------------|------------|------------|
| 0.95~6.5GB | 1~96 | ○ |　○ |

### N1標準マシン
1vCPUあたり3.75GBが割り当てられる。
例えば、n1-standard-1は 1vcpu, 3.75GB、n1-standard-2は2vcpu,7.50GBとなる。
マシン名の最後の数字がvcpuの数となっており、n1-standard-1から*2で増えていき、n1-standard-96まである。

### N1ハイメモリマシン
1vCPUあたり6.50GBのメモリが割り当てられる。ハイメモリマシンでは、2vcpuから提供されている。
例えば、n1-highmem-2は 2vcpu,13GB、n1-highmem-2は4vcpu,26GBとなる。
標準マシンと同様に、n1-highmem-96まである。

### N1ハイCPUマシン
1vcpuごとに、0.90GBのメモリが割り当てられる。ハイメモリマシンと同様に2vcpuから提供されている。
例えば、n1-highcou-2は 2vcpu,1.8GB、n1-highcpu-2は4vcpu,3.6GBとなる。

###カスタムマシン
自分でvcpu、メモリの設定をすることができる。ただし、他のマシンタイプよりコストが若干高くなる。

## メモリ最適化マシンタイプ
メモリを集中的に使用する場合に採用すると良い。N1ハイメモリタイプとの違いは、メモリ対vcpu比が高いため、よりメモリを使いたい場合のタスクに特化している。（例えば、インメモリデータベースや、ゲノミクス解析など）

###メモリ最適化マシンタイプの特徴
選択できるvcpuとメモリは以下のようになっている。

| vcpuあたりのメモリ | vcpu | カスタムマシンタイプか |　継続利用割引 |
|-----------|------------|------------|------------|
| 14GB | 40~96 | × |　○ |

1vcpuごとに、14GBのメモリが割り当てられる。
例えば、n1-ultramem-40は 40vcpu,961GBとなっている。n1-megamemというマシンタイプもあり、n1-megamem-96のみ提供となっている。

メモリ最適化マシンタイプには、特定のゾーンでのみ利用可能のため、リージョン永続ディスクを使用できないなどの制限があります。
利用できる場所は以下のようになっている。
https://cloud.google.com/compute/docs/regions-zones/?hl=ja

## コンピューティング最適化マシンタイプ
演算中心のワークロードで最適なマシン。

###コンピューティング最適化マシンタイプの特徴
選択できるvcpuとメモリは以下のようになっている。

| vcpuあたりのメモリ | vcpu | カスタムマシンタイプか |　継続利用割引 |
|-----------|------------|------------|------------|
| 4GB | 4~60 | × |　○ |

コンピューティング最適化マシンタイプはc2という名前になっており、1vcpuごとに、4GBのメモリが割り当てられる。
例えば、c2-standard-4は 4vcpu,16GBとなっている。

コンピューティング最適化マシンタイプには、特定のゾーンでのみ利用可能のため、リージョン永続ディスクを使用できないなどの制限があります。利用できる場所は以下のようになっている。
・us-central1-b
・us-central1-c
・europe-west4-b
・europe-west4-c

また、vcpuごとの永続ディスクのパフォーマンス上限が他のマシンタイプとは異な流ので注意すること。
https://cloud.google.com/compute/docs/disks/performance?hl=ja#c2-disk-limits

##共有コアマシンタイプ
小規模かつリソース消費量が少ない用途の場合に最適なマシン。

###共有コアマシンタイプの特徴
選択できるvcpuとメモリは以下のようになっている。

| vcpuあたりのメモリ | vcpu | カスタムマシンタイプか |　継続利用割引 |
|-----------|------------|------------|------------|
| 0.6GB | 0.2~0.5 | × |　× |

共有コアマシンタイプには、f1-microとg1-microの2タイプのマシンタイプがあり、そえれぞれでcpuバースト機能が提供されている。バーストとは、ベースライン性能を超えて性能を出すことができることでインスタンスが元の割り当て数よりも多くの物理 CPU を必要とした場合に、自動的に発生する。バースト自体は永続的ではなく、周期的にのみ可能である点に注意する。



その他、価格表については以下を参考にする。
https://cloud.google.com/compute/vm-instance-pricing?hl=ja