OmniAICreator/Qiita-1.07M huggingface dataset:
Go 言語スプレッドシートライブラリ：Excelize 2.3.0 がリリースされました


<p align="center"><img src="https://xuri.me/excelize/images/excelize.svg" width="440" alt="github.com/xuri/excelize" /></p>

[Excelize](https://github.com/xuri/excelize) は、ECMA-376 Office OpenXML 標準に基づいて Office Excel ドキュメントを操作するための Go 言語で書かれたクラスライブラリです。 XLSX ファイルの読み書きに使用できます。Excelize は、他のオープンソースライブラリと比較して、イメージ（テーブル）付きのドキュメントの作成、Excel へのイメージの挿入、および保存後のチャートスタイルの保存をサポートしており、さまざまなレポートシステムに適用できます。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント（テンプレート）に基づく新しい Excel ドキュメントの生成、Excel ドキュメントへのイメージの挿入、チャートなどの Excel ドキュメントをプログラムで操作する必要があります。 テーブルなどの要素。プラットフォーム間でこれらの操作を実装する必要がある場合があります。Excelize はこれらのニーズを容易に満たすことができます。

#### オープンソース

**GitHub:** [github.com/xuri/excelize](https://github.com/xuri/excelize)

**Doc:** [xuri.me/excelize/ja](https://xuri.me/excelize/ja/)

2020-8-10、バージョン 2.3.0 がリリースされました。 注目すべきは、機能のいくつかの新しい領域と多数のバグ修正です。

変更の概要は、[リリースノート](https://github.com/xuri/excelize/releases/tag/v2.3.0) にあります。

リリースノート
-----------
このリリースで最も注目すべき変更は次のとおりです。

#### 注目すべき機能

* セル値を同時に設定するためのサポート、関連する問題 #670
* 新しいAPI：[`SetSheetFormatPr`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.SetSheetFormatPr) および [`GetSheetFormatPr`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.GetSheetFormatPr)、ワークシートのフォーマット* プロパティの設定と取得をサポート、問題 #635に関連
* 新しいAPI：[`GetCols`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.GetCols) および [`Cols`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#Cols)、列イテレーターをサポート
* [`AddChart`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.AddChart) はY軸の指定された対数スケールをサポートし、問題 #661を関連付けます
* [`AddPicture`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.AddPicture) サポート画像の自動調整セルの挿入
* 列、行、ファイル名の長さの合計に制限を追加
* 数式計算エンジンのサポート定義名、関連問題 #665
* API [`CalcCellValue`](https://pkg.go.dev/github.com/xuri/excelize/v2@v2.3.0#File.CalcCellValue) の更新、数式計算エンジンが進行中：`COUNTA`、`ISBLANK`、`ISERR`、`ISERROR`、`ISEVEN`、`ISNA`、`ISNONTEXT`、`ISODD`、`ISNUMBER`、`MEDIAN`、`NA`、`SUMIF` の 12 の新しい関数が追加されました

#### 互換性を向上させる

* 大文字と小文字を区別するドキュメントパーツパスに対応
* ストレージ文字列を SST（共有文字列テーブル）に関連付け、問題 #622を関連付けます
* ワークシートでr属性のない行要素をサポートする
* XML マルチ名前空間のサポート、Kingsoft WPS&trade;Office との互換性、問題 #651の関連
* 自動フィルターと Office 2007-2010 との互換性を改善し、#637を解決

#### バグの修正

* ブック定義名でのフィルターデータベースの重複を回避
* 重複するスタイルの作成を避け、#643を解決
* ワークシートの `r` 属性なしで `row` 要素をサポートします
* 問題を修正し、Excelize で作成されたスプレッドシートを再度開いた後にコメントの形状が変更され、解決 #672
* コンパイラのインラインフラグを有効にするときのパニックを修正し、#677 と #679を解決
* パーセントセルのセル値を取得する際の精度の問題を修正

#### 雑多

* エラー処理の改善と無効なスプレッドシートファイルを開いたときのクラッシュの修正
* 単体テストで欠落していたチェックエラーを追加する
* 多言語対応のドキュメント Web サイト：英語、フランス語、ロシア語、中国語、日本語、韓国語。更新されました。
* [Slack](https://join.slack.com/t/xuri/shared_invite/zt-eriqdkeo-wV04zcCdBiiZveFgY86Wzw) チャンネルに参加して、コミュニティの他のメンバーに会いにようこそ
MySQL Tips

ここらへんはGUIでもいいのではと思うところ

# ユーザ管理関連

## ユーザ一覧を表示する
```
> select user, host from mysql.user;
```

## ユーザの作成
```
> CREATE USER '<username>'@'<hostname>';
```

## 権限の確認
```
> show grants for '<username>'@'<hostname>';
```


## 権限の付与
ローカル環境ではallでok

```
> grant all on <db>.* to '<username>'@'<hostname>';
```


# 汎用
rowとcolumnをpivotする

```
> SQL~~~~~~ \G
```
【R】作業フォルダの移動と確認

# はじめに

Rを利用する際には、実施する作業ごとに作業フォルダ（ワークスペース）を作るので、作業フォルダを移動させることがあります。
私の場合はRを頻繁に利用するわけではないので、作業フォルダの確認と移動方法について備忘録としてまとめてみました。

# 作業フォルダの確認

* 現在の作業フォルダ（＝カレントディレクトリ）を確認する方法です。
* Linuxに慣れていると`pwd`と入力したくなりますが、`getwd()`という関数を使います。

```r:Rのコンソール
# 作業フォルダの確認
getwd()
[1] "C:/Users/NKOJIMA/Documents"
```

# 作業フォルダの移動

* 現在の作業フォルダ（＝カレントディレクトリ）を移動する方法です。
* やはりLinuxに慣れていると`cd`と入力したくなりますが、`setwd()`という関数を使います。

```r:Rのコンソール
# 作業フォルダの移動
# 作業フォルダを「D:\workspace」に移動する。
setwd("D:\\workspace")

# 作業フォルダを移動出来たことを確認する。
getwd()
[1] "D:/workspace"
```

# 注意点

* Rでは`setwd()`に限りませんが、Windowsの場合はエクスプローラ上に表示されているパスをそのまま使うとエラーになります。
* 指定するパスの「￥」をエスケープさせて「"D:\\\workspace"」とするか、あるいはスラッシュに置き換えて「"D:/workspace"」とする必要があります。

```r:Rのコンソール
# Windowsの場合に起こりうるエラー
setwd("D:\workspace")
 エラー:  ""D:\w" で始まる文字列の中で '\w' は文字列で認識されないエスケープです 
```

# 参考URL

* [06. 作業ディレクトリの変更](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/06.html)
【よくわかる】Rubyにおけるハッシュと配列の違い

###はじめに

rubyを学んでいてよく目にするハッシュと配列、ふわっとしか理解できてなかったのですが、最近やっとこさわかってきたので、まとめてみた！
これを見ればハッシュと配列の違いがわかるはず！（多分）

####まずは配列
配列とはこういうもの

```rb
name = ["鈴木","田中","大西"]
```

- 複数の要素が並んでいる
- `[]`に囲まれている
- 要素が`,`で区切られている
- 添字が前から順番に整数で指定されまていす(上記だと`name(1) => "田中"`)


####ハッシュとは
ハッシュはこういうもの

```rb
name = { a: "鈴木",b: "田中",c: "大西" }
```

- ハッシュは本質的には配列と同じ
- `{}`に囲まれている
- **キー（添字）を整数以外のものを指定できる！**これに尽きるかも（上記だと`name[:a] => "鈴木"`）

####本質的に同じなのになぜ`{}`を使うのか

もしハッシュが`[]`に囲まれていると、どこが属性でどこがキーかわからなくなりやすい、だから`{}`に囲まれているのはハッシュだ！とわかりやすくするために使われているそうです！

これがわかっていると、勉強したりコードを読む時に判別しやすくなるのではないでしょうか！

以上です〜
[iOS] [Xcode] ライブラリやビルドに関する基礎知識を得られるリンク集

iOSアプリを開発する上でライブラリの利用は欠かせませんが、ライブラリの利用にはトラブルがつきものです。

私はこれまで、そのような場面では場当たり的なトラブルシューティングでお茶を濁してきました。

しかしそれでは「非効率」であったり「危なっかしい」と感じ、やはり、iOSアプリのビルドの仕組みや、ライブラリのリンクの仕組みをちゃんと理解すべきと考えています。

以下、私が参考にさせていただいている記事を共有します。
今後良い記事を見つけたら随時更新して行きます。

# ライブラリの基礎

- ライブラリの種類（静的／動的、ライブラリ／フレームワーク）

[Xcode の力を借りない Swift の Dynamic Library の作成とビルドを試す-ライブラリとは？](https://qiita.com/tasuwo/items/be8188c3645801a00252#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%E3%81%AF)

[Embedded Frameworkについて](https://qiita.com/mono0926/items/e29cd17789fd1d1548aa)

# ライブラリ・リンク

- XcodeのBuild Phasesセクションの解説
- インポートとリンクの仕組み（本質的な知識）

[R.Swiftのアップデートによるエラーを解決するついでにRun ScriptやBuild phasesについて整理してみた](https://dev.classmethod.jp/smartphone/build-system-of-xcode/)

[Swiftにおけるインポートとリンクの仕組みを探る](https://speakerdeck.com/kishikawakatsumi/swiftniokeruinpototorinkufalseshi-zu-miwotan-ru)

[Xcode Help - What are build phases?](https://help.apple.com/xcode/mac/10.2/#/dev50bab713d)

[Xcode Build Settings Reference](https://pewpewthespells.com/blog/buildsettings.html)

# CPUアーキテクチャーとApp Thinning

- アプリをCPUアーキテクチャーに応じて自動で最適化して配信してくれる仕組み
- App Slicing、Bitcodeなど

[ARMアーキテクチャーとは](https://sittoku.net/arm_architecture.html)

[iOSアーキテクチャとApp Thinningについてまとめてみた](https://qiita.com/taki4227/items/db9b503e56ab25a8a375)
ancestryを使って商品カテゴリー機能を実装する①（準備編）

# はじめに
・某プログラミングスクールのチーム開発でフリマアプリを作りました。
・商品カテゴリー機能を実装するのが非常に難しかったので備忘録として書きます。
・やることが多いので複数回に分けて書きます。
・僕自信、かなり詰まりました。なので、同じような状況の初学者の方の参考になれば幸いだと思い、記事にします。
・間違いなどあればご指摘いただけると幸いです。

# 完成形はこれです
・親カテゴリーを選択すると子カテゴリーが表示され、子カテゴリーを選択すると孫カテゴリーが表示され、サイズが関係するものについては孫カテゴリーを選択するとサイズが表示される
https://gyazo.com/97e3bdfac114bcced73aa3840f02801c

# ところでancestryって何
公式ドキュメント
https://github.com/stefankroes/ancestry
【翻訳】Gem Ancestry公式ドキュメント
https://qiita.com/Rubyist_SOTA/items/49383aa7f60c42141871
>AncestryはRuby on RailsのActiveRecordモデルのレコードをツリー構造（階層）として編成することを可能にするGemです。

多階層カテゴリを実装するために今回はancestryを使います。

# 完成の定義
・孫カテゴリーまで選択できる
・サイズが選択できる
・商品の出品ができる←これ大事

# 今回はミニアプリを作ります
まずはターミナルで`rails new`します。
以降コードブロックにファイル名の表示がない場合はターミナルでの操作です

```
$ rails _6.0.0_ new ancestry_app -d mysql
$ cd ancestry_app/
```
gemをいくつかインストールします。一番下に記述。

```ruby:Gemfile
gem 'haml-rails'
gem 'jquery-rails'
gem 'ancestry'
```
`gem 'haml-rails'`はhaml記法を使うために、
`gem 'jquery-rails'`はjQueryでAjaxを実装するために、
`gem 'ancestry'はカテゴリー機能を実装するために`、
それぞれ必要です。

データの保存形式を変更します。

```ruby:config/database.yml
# encoding: utf8mb4
encoding: utf8
```

次にターミナルで以下のコマンドを順に入力。

```
$ bundle install
$ rails db:create
$ rails haml:erb2haml
```
gemを有効化して、
データベースを作成して、
erbで記述されているファイルをhaml記法に変換して（途中コマンド入力を求められたらyを入力してENTER）、
という流れです。

### itemsテーブルを作ります（商品が出品できるように）
```
$ rails g model item
```
modelsディレクトリに`item.rb`というモデルファイルが、
db/migrateディレクトリに`20200815022617_create_items.rb`というマイグレーションファイルが、
それぞれ作成されました。　（マイグレーションファイルのファイル名の数字は生成日時です）

マイグレーションファイルを修正します。

```ruby:20200815022617_create_items.rb
class CreateItems < ActiveRecord::Migration[6.0]
  def change
    create_table :items do |t|
      # 今回はstring型のnameカラムを作成するので以下のように記述。
      t.string :name, null: false

      t.timestamps
    end
  end
end
```
`null: false`をつけるとnameカラムの入力をしないと商品データが登録できません（not null制約）。
単に`t.string :name`とする場合はnameカラムが空っぽでも商品データが登録できます。
ではitemsテーブルを作ります。

```
$ rails db:migrate
```
これでitemsテーブルができました。sequelproでテーブルの中身を見ると
・idカラム
・nameカラム
・created_atカラム
・updated_atカラム
があるはずです。

### itemsコントローラーを作ります（ビューも作ります）
今回は商品出品画面にカテゴリー機能を実装します。
なので、`localhost:3000/items/new`の画面が必要ですね。
コントローラー作成ついでにnewアクションのビューも作ってしまいます。

```
$ rails g controller items new
```
`app/controllers/items_controller.rb`というコントローラーと、
`app/views/new.html.haml`というビューファイルが、
それぞれ作成されました。

```ruby:routes.rb
Rails.application.routes.draw do
  # get 'items/new'
  resources :items
end
```
今回、ミニアプリなのでとりあえずルーティングは仮にこのようにします。
本来はonlyオプションを使ってください。

これでサーバーを立ち上げたら`localhost:3000/items/new`にアクセスできるはずです。
ひとまず商品出品画面に到達することができました。

①はここまでです。
次回は`categoriesテーブル`を作るところからスタートです。

# まとめ
最後にここまでのまとめを。

・`rails new`でアプリケーションを作成
・gemをインストールしたり、データベースを作成したりする
・商品出品画面を作る

以上です。
次回に続きます。
随時、修正・加筆します。

# 参考
公式ドキュメント
https://github.com/stefankroes/ancestry
【翻訳】Gem Ancestry公式ドキュメント
https://qiita.com/Rubyist_SOTA/items/49383aa7f60c42141871
【Rails】 gem ancestry カテゴリー機能実装について
https://qiita.com/k_suke_ja/items/aee192b5174402b6e8ca
複数行ある標準入力（STDIN）の取得方法を整理したい

オンラインでのプログラミングの問題やスキルチェックに挑戦していたら、標準入力というのに出会い、与えられる値が複数行に跨っている場合、取り出すことが出来なかったので、初心者感丸出しで対策方法をまとめてみます。（理解違いなどありましたら、ご指摘いただけますと幸いです。）

さて、例えば、下記のようなテキストファイルを読み込むプログラムを作るとします。
![スクリーンショット 2020-08-16 17.14.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/75889792-ea31-f2d0-4deb-2e6da7220495.png)

このように複数行に配置された値を取得するには、**while();**（処理を繰り返す）と**fgets();**（ファイルから１行取得する）の組み合わせが有効のようです。

```php:index.php
<?php
// まずファイルを開きます。fopen関数の２つめのパラメータのrは、読み取り専用で開くの意。
$file = fopen('stdin.txt', 'r');

// ファイルの内容を一行ずつ取得するにはwhile()
if ($file) {
    while ($input_line = fgets($file)) {
        echo $input_line;
    }
}
?>
```
初心者にはif内の処理がやや複雑なので細かく整理します。

* `if($file) {}`→もし$fileに値が入ってたら`{}`の処理をしてね。
* `while ($input_line = fgets($file)) {}`→`$file`の1行めから、順番に1行ずつ値を取得して`fgets()`、`$input_line`に代入できる間`while`は、`{}`の処理をしてね。要約すると、`$file`に値がある行の数だけ`{}`の処理をしてね。
* `echo $input_file`→`$input_line`を表示してね`echo`。つまり**whileの中の条件文は、ただの条件だけでなく実際に処理が行われている**んですね。これは押さえておきたいポイントかと思います。


一旦これで出力結果見てみると、下のようになり、２行め以降の値も取得できました。

![スクリーンショット 2020-08-16 16.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/ef339c2f-bf12-5929-698d-b83f1758439b.png)

これを配列として取得、保管するにはこうします。

```php:index.php
if ($file) {
    while ($input_line = fgets($file)) {
        $x[] = $input_line; //各行の値を変数xに代入、保管
    }
}
```
この$xを`var_dump();`で見てみると下記のようになり、よ〜く見ると各値の後に半角スペースが入り込んでいます。最終行の89の後には入っていないので、どうやらこの半角スペースは「改行」のようです（上記データで最終行の後に改行はない）。

>array(6) { [0]=> string(2) "4 " [1]=> string(3) "15 " [2]=> string(2) "3 " [3]=> string(2) "5 " [4]=> string(2) "7 " [5]=> string(2) "89" } 

取得したかった値の後に、半角スペースが入ってしまっています。**ただし！**試しにこれをechoで単に表示したり、計算に使ってみると普通にできちゃいます。できちゃうんですね、意外。

```php:index.php
echo $x[0]; //結果→4（この後に半角スペースなし）

echo $x[0] + $x[1]; //結果→19
```
しかし、半角スペースが入るのもあまりよろしくないかと思いますので、下記のように$xに代入する際にtrim()関数を添えてあげてホワイトスペースを取り除くのがいいと思われます。

```php:index.php
if ($file) {
    while ($line = fgets($file)) {
        $x[] = trim($input_line);
    }
}
```
こうすると半角スペースはなくなって綺麗になります。

>array(6) { [0]=> string(1) "4" [1]=> string(2) "15" [2]=> string(1) "3" [3]=> string(1) "5" [4]=> string(1) "7" [5]=> string(2) "89" }

最後にまとめとして、複数行ある標準入力の取得方法のコードをまとめておきます。

```php:index.php
<?php

// ファイルパスの指定
$file = fopen('stdin.txt', 'r');

// ファイルの内容を一行ずつ配列に代入します
if ($file) {
    while ($input_line = fgets($file)) {
        $x[] = trim($input_line);
    }
}
// 配列で取得できたのであとは普段通りやればOK
echo $x[0]; //4
echo $x[1]; //15
echo $x[2]; //3
echo $x[3]; //5
echo $x[4]; //7
echo $x[5]; //89
?>
```
これで配列として取得できたので、あとは足すなり、かけるなり、焼くなり、煮るなり。

もしご指摘などございましたらありがたいです。
GASからAWS API Gateway(Lambda)へリクエストするときのパラメーターの送受信方法

#要点
・GASでpostする時は `'contentType': 'application/json'` を指定してpayloadのjsonをstringifyしておく
・AWS側でparse

#コード
GoogleAppsScript

```uploadToAws.gas
function uploadToAws() {
  const aws_url = "APIのURL"
  const params = {
    'method' : 'post', //get or post
    'contentType': 'application/json',
    'payload' : JSON.stringify({"data1": "hogehoge" })
  };
  const req = UrlFetchApp.fetch(aws_url, params);
  Logger.log(req.getContentText());
}

```

Lambda(Node.js)

```lambdaSample.js
const aws = require('aws-sdk');

exports.handler = async (event) => {
    const data = (event.requestContext.http.method === "GET") ? event.queryStringParameters 
    : (event.requestContext.http.method === "POST") ? JSON.parse(event.body)
    : null;
    const response = {
        statusCode: (data) ? 200 : 503,
        body: JSON.stringify((data) ? data.data1 : "no_data"),
    };
    return response;
};
```
【学習メモ】Procfileとgem foremanを活用したVue.js自動コンパイル

#やりたいこと:Vue.jsの自動コンパイル
Vue.js（というよりWebpack）関連のファイルは変更したらコンパイルする必要があり、そのコンパイルには、``bin/webpack``というコマンドを使用する必要があるが、**毎回コンパイルするのは面倒なので、変更を検出して自動コンパイルさせる**

[Ruby on Rails + Vue.js + vuetifyの環境構築。5日でマスター – 1日目
](https://usconsort.com/programming-rubyonrails-vue1/)と、[【動画付き】Rails 5.1で作るVue.jsアプリケーション ～Herokuデプロイからシステムテストまで～
](https://qiita.com/jnchito/items/30ab14ebf29b945559f6)を参考に、実装を進める。

###必要なタスク
- Procfile.devファイルを作成
- bin/serverファイルを作成
- bin/serverファイルの実行権限を与える
- Gemfileに「gem ‘foreman’」を追加
- 変更が完了したら「bin/server」を実行し、http://localhost:5000
にアクセスする


#それぞれについて実行
###Procfile.devファイルを作成

アプリケーションのルートディレクトリに移動して、``touch Procfile.dev``コマンドで作成し下記の通りに記載する

```Procfile.
web: bundle exec rails s
# watcher: ./bin/webpack-watcher
hot: ./bin/webpack-dev-server
```

###bin/serverファイルを作成
binディレクトリに移動し、``touch server``コマンドで「server」という名前のファイルを作成。

```bin/server.
#!/bin/bash -i
bundle install
bundle exec foreman start -f Procfile.dev
```

###bin/serverファイルの実行権限を与える

serverは実行可能なファイルにしておきます。

```rootdirectory.
$ chmod 777 bin/server
```

また、serverではforemanを使うので、Gemfileに追加してbundle installします。

###Gemfileに「gem ‘foreman’」を追加

```Gemfile.
group :development do
  gem 'web-console', '>= 3.3.0'
[...]
  gem 'foreman'
end
```

###変更が完了したら「bin/server」を実行し、http://localhost:5000にアクセスする


#完成！

![スクリーンショット 2020-08-16 18.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/ebaf184c-1c73-17a8-0b71-a340ee0a08a0.png)


#参考
[Ruby on Rails + Vue.js + vuetifyの環境構築。5日でマスター – 1日目
](https://usconsort.com/programming-rubyonrails-vue1/)

[【動画付き】Rails 5.1で作るVue.jsアプリケーション ～Herokuデプロイからシステムテストまで～
](https://qiita.com/jnchito/items/30ab14ebf29b945559f6)

[bash スクリプトの先頭によく書く記述のおさらい
2種類の shebang
](https://moneyforward.com/engineers_blog/2015/05/21/bash-script-tips/)

[Vue.jsとRailsでTODOアプリのチュートリアルみたいなものを作ってみた
](https://qiita.com/naoki85/items/51a8b0f2cbf949d08b11)

[Herokuに必要なProcfileの書き方についてまとめておく
](https://creepfablic.site/2019/06/15/heroku-procfile-matome/#index_id0)

[foreman で アプリケーションを動かす。
](https://qiita.com/7kaji/items/6a59977d2ad85604e7fd)
ケーススタディ回答例【Mountkirk Games】【GCP Professional Cloud Architect認定試験】

# ケーススタディ回答例【Mountkirk Games】
GCP Professional Cloud Architect認定試験で出題されるケーススタディの回答例を作ってみました。

- [Mountkirk Games](https://cloud.google.com/certification/guides/cloud-architect/casestudy-mountkirkgames-rev2?hl=ja)

本記事は公式模擬試験とMahesh様の解説を元に作成しました。Mahesh様の動画はYouTubeで複数Partにわたり非常に的確な解説がされているため、非常に参考になりました:clap::clap::clap:

- [Learn GCP with Mahesh](https://www.youtube.com/watch?v=65g7AbjC4EA)

## はじめに
- この記事はあくまでも回答例です。実際に試験を受ける時点では機能追加・変更があったり、試験問題中で要件が追加・変更され、最適解が変わる可能性があります。
- 各種サービスの最新情報は[GCP公式ドキュメント](https://cloud.google.com/docs?hl=ja)から手に入れましょう:grinning:

## 回答例【Mountkirk Games】
> これは Professional Cloud Architect 認定試験で使用される可能性のあるケーススタディの例です。試験問題を補足するコンテキストを提供するためのもので、架空の会社やソリューションのコンセプトについて説明しています。

> Mountkirk Games は、モバイル プラットフォーム向けにセッション ベースのオンライン マルチプレーヤー型ゲームを開発しています。Mountkirk Games は、すべてのゲームの開発にサーバーサイドの統合開発環境を利用しています。これまでは、クラウド プロバイダから物理サーバーをリースしてきました。
いくつかのゲームは予想を上回る人気を博したため、世界中のオーディエンス、アプリケーション サーバー、MySQL データベース、分析ツールのスケーリングに関する問題が生じました。
Mountkirk Games の現行のモデルでは、ファイルに書き込まれたゲームの統計情報が ETL ツールによって送信され、中央の MySQL データベースにレポート用に読み込まれます。

- 収集したデータはGCSに書き込み。
- ETLはDataflowを使う。
- MySQLはOLTPシステムなので、レポート用途に使うのはイマイチ。
- レポート用途のDBサーバはMySQLからBQに移行する。

## 1. ソリューションのコンセプト
> Mountkirk Games が開発中の新しいゲームは、大人気になることが予想されています。そこで、ゲームのバックエンドを Compute Engine にデプロイしようと計画しています。これにより、ストリーミング指標の取得や集中的な分析が可能になります。さらに、Google の自動スケーリング可能なサーバー環境を活用でき、マネージド NoSQL データベースと統合することもできます。

- コンセプト通り、バックエンドはGCEをまず検討していく。
- ストリーミング指標はPub/Subによって収集し、ETLツール(Dataflow)を介してBQに挿入、BQで分析する。
- GCEは自動スケーリングのためにManaged Instance Group(MIG)にする。マネージドNoSQLはBigTableとDatastoreが候補となる。デフォルトでグローバルに展開可能, かつ複数行Transactionに対応しているDatastoreの方が有力。

## 2. ビジネス要件
> - グローバル規模にまで拡張する
- 稼働率を向上させる（ダウンタイムが発生すると、プレーヤーを失うことになるため）
- 使用するクラウド リソースの効率を向上させる
- すべてのユーザーのレイテンシを低減する

## 3. 技術的要件
> ゲーム バックエンド プラットフォームの要件
1. ゲーム アクティビティに基づいて動的にスケールアップまたはスケールダウンする
2. トランザクション データベース サービスに接続して、ユーザー プロフィールとゲーム状態を管理する
3. 将来の分析のために、時系列データベース サービスでゲーム アクティビティを保存する
4. システムがスケールしたときに、バックログの処理によってデータが失われないようにする
5. 強化された Linux ディストリビューションを実行する

1. GCE MIG
2. Datastore
3. BQ or BigTable → 分析用途なのでBQ
4. Dataflow
5. Shilded VM

> ゲーム分析プラットフォームの要件
1. ゲーム アクティビティに基づいて動的にスケールアップまたはス  ケールダウンする
2. 着信データをゲームサーバーから迅速に直接処理する
3. 低速なモバイル ネットワークが原因で遅延したデータを処理する
4. 10 TB 以上の履歴データに対してクエリを実行できるようにする
5. ユーザーのモバイル デバイスから定期的にアップロードされるファイルを処理する

1. BQ
2. Pub/Sub+Dataflow
3. Dataflow
4. BQ
5. GCS+Pub/Sub+Dataflow

## 4.エグゼクティブの声明
> 前回成功したゲームでは、当時利用していたクラウド プロバイダでスケーリングがスムーズに行えなかったため、ユーザーの利用数が伸びずゲームの評価にも悪影響を及ぼしました。当社の投資家が必要としているのは、ゲームの速度と安定性を評価するための重要業績評価指標（KPI）です。また、対象ユーザーに合わせてゲームを改良できるように、ユーザーの使用パターンに関する詳細な分析情報を提供する指標も求められています。さらに、当社の現在のテクノロジー スタックでは必要なスケーラビリティを実現できません。そのため、現在の MySQL から自動スケーリングと低レイテンシの負荷分散が可能な環境へと移行し、物理サーバーの管理作業を不要にしたいと考えています。

# ケーススタディ回答例
- [Dress4Win回答例](https://qiita.com/yota-p/items/c6188fba1c47c5e07484)
- [TerramEarth回答例](https://qiita.com/yota-p/items/f384fe21f0702135a202)
LaTeXでFigureに付くインデックスがおかしいとき


# はじめに

LaTeXで論文を書いていると

```tex
\begin{figure}[tb]
     \centering
     \includegraphics[width=1.0\linewidth]{images/sample.eps}
     \label{fig:sample}
     \caption{sample}
\end{figure}
```

などとして`\ref{fig:sample}`とすると，本来は図4であるはずが，図5となったり
図4.3など，異なる表記になる場合があります．

# 解決策

大抵は\labelの位置が間違っています．
\labelの位置を変えると，修正されることが多いです．
このあたりは，LaTeX本などを参考にすると良さそうです．

```tex
\begin{figure}[tb]
     \centering
     \includegraphics[width=1.0\linewidth]{images/sample.eps}
     \caption{sample}
     \label{fig:sample}
\end{figure}
```
[Python]エクセルファイルの写し作業における自動化を実装

##pythonによる自動化
今回は、インターンにおいて既存エクセルファイルを今回使いたい形に変更する際にpythonのライブラリを用いた自動化を行ったのでココに記しておく。

##やりたいこと
複数のスプレッドシートに個人情報が記載されているものがすでにあるのだが、そ子から毎回一つ一つ引っ張ってくるのは面倒だから、一つのスプレッドシートにまとめてその情報を一括でクライアントに渡した方が楽。となると、指定の箇所を一つ一つ新しいスプレッドシートに写してく必要があるのだが、手作業はかなり面倒。そこでpythonで自動化したい。

##使用するライブラリ
####openpyxl
(https://note.nkmk.me/python-openpyxl-usage/)

##アルゴリズム
- シートごとに指定の値を抜き出して一つの配列を作成
- その配列を新たな配列に入れて2次元配列を作っていく
- 二次元配列を元に書き込んでいく

```sample.py
def write_list_2d(sheet, l_2d, start_row, start_col):
    for y, row in enumerate(l_2d):
        for x, cell in enumerate(row):
            sheet.cell(row=start_row + y,
                       column=start_col + x,
                       value=l_2d[y][x])

l_2d = [['four', 41, 42, 43], ['five', 51, 52, 53]]

write_list_2d(sheet, l_2d, 5, 1)
```
####注意
最後にsaveを忘れずに。これしないと反映されません。

```sample.py
wb_to.save('hoge.xlsx')
```

##正規表現の利用
抜き出した文字をさらに分割したい場合には正規表現を使う。
今回やりたかったのは以下
「hogehogehoge(fugafuga)」
をカッコ内とそれ以外の二つに分けたかった。
結論は以下の通り。

```sample.py
list = re.match(r"(?P<comment>.*?)(?:[\(（](?P<name>.*?)[）\)])?$", sentence)
            temp.append(list['comment'])
            temp.append(list['name'])
```
import文

#import文
ディレクトリーから他のファイルを読み込む


一行目を他の書き方で書く事もできる

```python:qiita.py
import lesson_package.utiles
#フルパスで取得
print(lesson_package.utiles.say_twice("hello"))
#呼び出し方


from lesson_package import utiles
#モジュール内の関数として取得
print(utiles.say_twice("hello"))

from lesson_package.utiles import say_twice
#関数のみ取得、
#この場合コンフリクトする可能性があるので好まれない
print(say_twice("hello"))
```

![スクリーンショット 2020-08-16 10.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/aab1fb33-4706-5fa7-638a-483b70cb036d.png)

##importする際の記述法
順序は以下の通り

```python:qiita.py
import collections
import sys
#標準ライブラリとサードパーティは一行あける
import termcolor
#自分のパッケージも分ける
import lesson_package
```
【Vue.js】横文字苦手だけど、ライフサイクルフックについて比較してみた

#ライフサイクルとは

難しい言葉に聞こえてますよね。私も横文字が苦手なので、学生の頃は世界史が苦手でした。
そんな私的な解釈でいうと、ライフサイクルとは**Vueアプリケーションが作成されるまでの過程のこと**だと解釈しています。

例えば人間でも傷をした時、治るまでには血液がこれ以上流れないように固まっていき、やがてかさぶたになり、最終的に元の皮膚と変わらないくらいまでに治るという、**人間の素晴らしい機能の連鎖**によって新しい皮膚が作られます。

Vueもいろんな機能の連鎖によって、新しくアプリケーションが作られるのですが、その**過程ごとにできることが異なり**ます。
そして、その過程の中のフェーズやそのタイミングによってできることを、**ライフサイクルフック**といいます。

今回は、それらの違いをみていく記事になります。


#Vue.jsのライフサイクルフック一覧

|フック名|フックが呼ばれるタイミング|アクセス可能|アクセス不可能|
|:---|:---|:---|:---|
|beforeCreate|インスタンスが生成され、データが初期化される前|
|created|インスタンスが生成され、データが初期化された後| メソッド、プロパティ|エレメント|
|beforeMount|インスタンスが、DOM要素にマウントされる前|
|mounted|インスタンスが、DOM要素にマウントされた後|メソッド、プロパティ、エレメント|
|beforeUpdate|データが変更され、DOMに適用される前
|updated|データが変更され、DOMに適用された後
|beforeDestroy|Vueインスタンスが破棄される前
|destroyed|Vueインスタンスが破棄された後

※随時、アクセス可能なことなど追記していきます


#メソッドの値やエレメントの存在による、フックタイミングの比較

###ページロード完了時
```html
<body>
  <div id="app">
    <h1>Hello, world</h1>
    <button v-on:click="showEl">show!!</button>
  </div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Hello world'
  },
  methods: {
    showEl: function () {
      this.message = 'Good night'
      console.log(this.message)
      console.log(this.$el)
    }
  }
})
</script>
</body>
```

```console
// this.messageの中身
Good night

// this.$elの中身
<div id="app">
  <h1>Hello, world</h1>
  <button>show!!</button>
</div>
```


###beforeCreate時

```html

<body>
  <div id="app">
    <h1>Hello, world</h1>
    <button v-on:click="showEl">show!!</button>
  </div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Hello world'
  },
  beforeCreate: {
    showEl: function () {
      this.message = 'Good night'
      console.log(this.message)
      console.log(this.$el)
    }
  }
})
</script>
</body>
```

```console

// this.messageの中身
Hello world

// this.$elの中身
undefined
```

###created時

```html

<body>
  <div id="app">
    <h1>Hello, world</h1>
    <button v-on:click="showEl">show!!</button>
  </div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Hello world'
  },
  created: {
    showEl: function () {
      this.message = 'Good night'
      console.log(this.message)
      console.log(this.$el)
    }
  }
})
</script>
</body>
```

```console
// this.messageの中身
Good night

// this.$elの中身
undefined
```


###mounted時

```html

<body>
  <div id="app">
    <h1>Hello, world</h1>
    <button v-on:click="showEl">show!!</button>
  </div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Hello world'
  },
  mounted: {
    showEl: function () {
      this.message = 'Good night'
      console.log(this.message)
      console.log(this.$el)
    }
  }
})
</script>
</body>
```

```console
// this.messageの中身
Good night

// this.$elの中身
<div id="app">
  <h1>Hello, world</h1>
  <button>show!!</button>
</div>
```


#番外編：Nuxt.jsのフック

|フック名|フックが呼ばれるタイミング|記述内容|Vueインスタンスのdata|
|:---|:---|:----|:---|
|asyncData|ページがロードされる前|APIの呼び出しなどの非同期通信|dataとマージする
|fetch|ページがロードされる前|APIの呼び出しなどの非同期通信|dataとマージしない
CloudFormationをゼロから勉強する。（その１：前準備）

# はじめに
AWSについて勉強がてら`CloudFormation`を学んでいこうという自分の勉強のための連載記事です。

私自身は以前`Terraform`を少しいじっていた程度で、`CloudFormation`自体は使ったことが無いため`CloudFormation`の使い方やお作法はまったく知りません。

`CloudFormation`について興味がある、一緒に`CloudFormation`を勉強したいという方を対象としています。

- 【次】[CloudFormationをゼロから勉強する。（その２：デザイナーからのテンプレート作成）](https://qiita.com/sakai00kou/items/5bbb9cfac79fc4a3f857)

# CloudFormationとは
設計書となるファイルに書かれた内容に従ってAWSのサービスを一気に構築できるサービスになります。

以前は`JSON`しか対応していないとか、`Terraform`よりコードが難解という話を聞いたことがあった気がしますが、ざっと調べた限り、今は`yaml`に対応していたり、画面上でオブジェクトをドラッグ＆ドロップしてコードを生成できたりするようなので、パッと見はとっつきやすいのかなと感じました。

# CloudFormationを使う前の準備
やってみる前にまずは準備から。

## 概要の理解
いきなりマニュアルを読んでも頭に入ってこなかったので、「[AWS Black Belt Online Seminar](https://www.youtube.com/playlist?list=PLzWGOASvSx6FIwIC2X1nObr1KcMCBBlqY)」の「[AWS CloudFormation](https://www.youtube.com/watch?v=HU47ZAM3mtw&list=PLzWGOASvSx6FIwIC2X1nObr1KcMCBBlqY&index=95&t=0s)」の回を視聴。

- [AWS CloudFormation ドキュメント](https://docs.aws.amazon.com/cloudformation/index.html)
- [Black Belt Online Seminar AWS CLoudFormation](https://www.youtube.com/watch?v=HU47ZAM3mtw&list=PLzWGOASvSx6FIwIC2X1nObr1KcMCBBlqY&index=95&t=0s)

## ツールの準備
普段`VSCode`を使用しているため、上記のセミナーで紹介されていた以下`拡張機能`をインストール。
まずは形からということで。

- CloudFormation support for VSCode
- CloudFormation Linter

## テンプレート格納領域の作成
`CloudFormation`で作成する際の設計書となる`テンプレート`は、ローカルで作成してアップロードすることもできるようですが、ローカルからファイル選択してアップロードするのも面倒なのでS3に**テンプレート格納用のバケット**を作っておきます。

```shell:S3バケット作成と確認
aws s3 mb s3://[バケット名]
aws s3 ls
```

***
【**2020/8/24追記**】
自分で作成したS3領域に格納したテンプレートを読み込んだとしても、デザイナー画面で編集した場合、スタック実行時に自動で作成される`CloudFormation`ディレクトリに格納されてしまうので、わざわざ自分用S3領域を作成しなくてもよいです。

## 作業環境の準備
私は普段Windowsを使用していますが、Windowsだとコマンド操作がやりづらいので、以下のようにAWS上に作業用EC2インスタンスを立ち上げて、`VSCode`の`Remote Development`でEC2に接続して開発していこうと思います。

![development.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/ebe8c57e-07ca-eb5b-2c7d-f0d5a0fcd2ab.png)

# おわりに
今回はBlack Beltのセミナー見て準備しただけでしたが、デザイナー画面からドラッグ＆ドロップで構成を作れたりして面白そうですね！

次回は実際に`CloudFormation`を使ってリソースを作ってみようと思います。
Raspberry Pi 3でLED点灯（お父さんの電子工作記録#001）

#電子工作の背景
- 部屋の温湿度管理のモニター

2020年の夏は非常に熱い！！クーラーなしでは生活が出来ない。
部屋の中はどんなに蒸し暑いのだろう？と思い、これを見える化したい！

- 来るべきこどもへのプログラム学習の事前勉強

今後、プログラムの必修化が言われているので、ちょっとは出来ないと
父親のメンツが保てないと思い、勉強を開始。

まずは**LEDの点灯**から始めました。

#RaspberryPi でLED点灯
以下の手順で作製。

#使ったモノ
- Raspberry Pi 3 Model B+ (セットアップ済みのもの、OSはRaspbian)
- LED(黄色)
- 330ohm
- ブレッドボード
- ブレッドボード・ジャンパーワイヤ

#配線
+ ブレッドボード
抵抗: 電源用ライン（－） - c4
LED: D4 - D5
D5にプラス(端子の長い方)接続

+ ブレッドボードとRaspberry Pi
ジャンパーワイヤ:電源用ライン（－） - ピン番号6(GND)
ジャンパーワイヤ:A5 - ピン番号16(GPIO 23)

![testLED_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577862/63e14cb7-86ea-d923-10de-c2166403b73b.jpeg)

![IMG_0271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577862/17561838-5853-0963-59ba-92d147e8d4da.jpeg)

#Python Code
```Python:blink_led.py
import wiringpi as pi
import time

LED_PIN = 23

pi.wiringPiSetupGpio()
pi.pinMode(LED_PIN, pi.OUTPUT)

while True:
    pi.digitalWrite(LED_PIN, pi.LOW)
    time.sleep(1)

    pi.digitalWrite(LED_PIN, pi.HIGH)
    time.sleep(1)
```
#実行
Raspbery piの左上にあるアイコンから　プログラミング / Python3 (Idle)を選ぶ。
するとPython 3.4.2 Shellが開くので
(Python 3.4.2 Shell) File / Open　で作った「blink_led.py」を選ぶ。
するとコードが表示される。
ウィンドウ「blink_led.py」でRun / Run Moduleを選ぶ。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577862/36837827-f2b3-fce7-75be-acfdf3ff60d5.jpeg)

すると
![IMG_0310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577862/509d9834-a67e-4f79-c758-36f82f64e97c.jpeg)

**無事にLEDが光りました！！**

参考本: [電子部品ごとの制御を学べる!Raspberry Pi 電子工作実践講座](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B%EF%BC%81Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C-%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0-ebook/dp/B078GL1V26 "参考本")
MySQL③


|分類|データ型  | 意味・用途 | 使用例 | 5 |
|:-:|:-:|:-:|:-:|:-:|
|number:   |   |数値   |   |   |
|   |int   |整数   |   |   |
|   |float   |浮動小数   |   |   |
|   |double   |float より精度の高いもの   |   |   |
|   |unsigned   |+ の値しか扱わないので扱える領域を広くする   |int unsigned  |   |
|   |   |   |   |   |
|string:   |   |文字列   |char(4)   |   |
|   |char   |固定長   |   |   |
|   |varchar   |可変長、最大値指定   |varchar(255)   |   |
|   |text   |可変長   |   |   |
|   |   |   |   |   |
|date/time:   |   |日付、時間   |   |   |
|   |date   |日付   |   |   |
|   |time   |時間   |   |   |
|   |datetime   |日時   |datetime '2017-07-22 17:22:33'   |   |
|   |   |   |   |   |
|true/false:   |   |真偽値   |   |   |
|   |boolean    |真偽値   |   |   |
|   |   |   |true -> 1   |   |
|   |   |   |false -> 0   |   |




mysql に myapp_user で パスワード付きで myapp にログインする
$ mysql -u myapp_user -p myapp

テーブルを作る　create table テーブル名 (カラム名 データ型, カラム名２ データ型２);
mysql> create table users (id int unsigned, name varchar(20), score float);

テーブルの構造を確認する　desc テーブル名
mysql> desc users;

テーブルを削除する　drop table テーブル名
mysql> drop table users;


レコードを挿入する　insert into テーブル名 (カラム,カラム２) values (値,値２);
mysql> insert into users (id, name, score) values (1, 'taguchi', 5.8);
mysql> insert into users (id, name, score) values (2, 'yamada', null);

まとめてレコードを挿入する　insert into テーブル名 (カラム,カラム２) values(1つ目のレコードの値,1つ目のレコードの値値２),(2つ目のレコードの値値,2つ目のレコードの値値２);
insert into users (id, name, score) values (1, 'taguchi', 5.8), (2, 'fkoji', 8.2), (3, 'dotinstall', 6.1);


select * from users;






#テーブル作成時にオプションを付ける　create table テーブル名 (カラム名 データ型,オプション, カラム名２ データ型２,オプション2);

mysql> create table users (id int unsigned primary key auto_increment, name varchar(20) unique, score float default 0.0);

mysql> insert into users (name, score) values ('taguchi', 5.8);
mysql> insert into users (name, score) values ('fkoji', 8.2);
mysql> insert into users (name, score) values ('dotinstall', 6.1);


主キーを付ける primary key 
自動的に連番を振る　auto_increment
id int unsigned primary key auto_increment,

主キーがどこに付いているかは desc users; で確認
desc users;

一意制約
name varchar(20) unique

not null制約
score float not null

初期値を付ける
score float default 0.0


テーブルの一覧を確認する　
mysql> show tables;
pythonにてpandas.DataFrameをExcelにシート別に保存する

# pd.to_excelで困った...
現在株価の分析を行っているのですが、その際dataframeを使用しています。しかし、様々な条件で分析を行った後、他人に説明などを行う場合Excelファイルとして保存しておくのが良いと思いました。しかし、pandasの[to_excel](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html, "to_excel")を用いようとすると、新たにデータを書き込みたい場合上書きされてしまいます。これは困った...

そこでいろいろ調べていくと[openpyxl](https://openpyxl.readthedocs.io/en/stable/tutorial.html, "openpyxl")と組み合わせるとなんとか上書きされずに保存できることがわかりました。そこで備忘録としてそのコードを残しておきたいと思います。

使用したパッケージなどのバージョンは以下の通りです。
> Python 3.7
> Pandas 0.25.1
> openpyxl 3.0.0

# excelへの保存
## 新規のワークブック、ワークシートに保存する

この場合はpandasのto_excelを使いましょう。

```python:to_excel.py
import pandas as pd

with pd.ExcelWriter(file_path) as writer:
    df.to_excel(writer, sheet_name=sheet_name)
```

##既存のワークブック、ワークシートに上書きする

この場合はopenpyxlを使って、上書きしましょう。

```python:to_excel.py
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows


wb = openpyxl.load_workbook(file_path)

ws = wb[sheet_name]

for i, row in enumerate(dataframe_to_rows(df, header=False)):
    if i == 0:
        continue
    ws.append(row)
wb.save(file_path)
```

##既存のワークブックに新規のシートとして保存する

この部分がこの記事での肝の部分で、調べまくったところです...

```python:to_excel.py
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows


wb = openpyxl.load_workbook(file_path)

ws = wb.create_sheet(title=sheet_name)
ws.append(['Date', 'Open', 'Close', 'High', 'Low'])

for i, row in enumerate(dataframe_to_rows(df, header=False)):
    if i == 0:
        continue
    ws.append(row)
wb.save(file_path)
```

後半は既存のワークブック、ワークシートに保存する場合と同じです。

#まとめ
以上がそれぞれの書き方です。
僕自身は２番目と３番目はtry-exceptで書きましたが、たぶんif文でのわかりやすい分け方もあるのかな〜と...

また新しいやり方が見つかったら追記なり、新しい記事で書き込みたいと思います！
では！
WebでH2データベースを確認

# WebでH2データベースを確認
プライベートプロジェクトを行うときによくH2データベースを利用しますが、
Web上でH2データベースを確認する方法を書いておきます。

application.properties内にコードを書きます。

```
spring.h2.console.enabled=true
```

そしてサーバーを起動し、以下のURLに接続するとH2データベースの設定画面が表示されます。
http://localhost:8080/h2-console/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684074/189054c6-f27f-8a97-d5ba-dd0f196bf01e.png)

Connectボタンを押すと以下のように正常に表示されることが確認されますね。
Selectの正常に動くことを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684074/a1345db0-924c-2503-e3f0-ed64f76cc557.png)
Rails render redirect_to

#はじめに
今回はRailsでよく使われるrenderとredirect_toの違いについて。

#render
renderはコントローラー内でviewファイルを決定しレンダリングされる。

```ruby

render :edit
```

この場合だとviewファイルのeditに対応するhtmlファイルが呼び出される。

###別のコントローラーからの呼び出し
別のコントローラーからの呼び出しも可能でその場合、app/viewsを起点とするフルパスを渡すことができるので、出力したいテンプレートをフルパスで指定する。

```ruby

render "users/show"
```
`app/views/users`からviewテンプレートを呼び出すことができる。

###任意のファイルの指定
現在のディレクトリの外部にあっても指定することが可能。

```ruby

render "/xxx/apps/user_directory/current/app/views/users/show"
```

###様々な記述方法

> render :edit
render action: :edit
render "edit"
render "edit.html.erb"
render action: "edit"
render action: "edit.html.erb"
render "books/edit"
render "books/edit.html.erb"
render template: "books/edit"
render template: "books/edit.html.erb"
render "/path/to/rails/app/views/books/edit"
render "/path/to/rails/app/views/books/edit.html.erb"
render file: "/path/to/rails/app/views/books/edit"
render file: "/path/to/rails/app/views/books/edit.html.erb"

https://railsguides.jp/layouts_and_rendering.html

# redirect_to
別のURLに対して改めてリクエストを再送信するよう、ブラウザに指令を出すためのもの。
引数にリダイレクトさせたいurlを渡す。

```ruby

redirect_to users_url
redirect_to "http://www.~"
```

###コントローラーを指定
```ruby

redirect_to  controller: :users, action: :edit
```

###前ページにリダイレクト
現在のページから前ページにリダイレクトさせる。

```
redirect_to :back
```

###リダイレクトのステータスコードの変更

redirect_toはデフォでHTTPステータスコード302がブラウザに返され、リダイレクトを行う。
変更を行いたい場合

```ruby
redirect_to users_path, status: 301
```

###リダイレクした際にメッセージ追加

```ruby
redirect_to users_path, notice: '追加しました
```

#renderとredirect_toの違いについて
renderがviewファイルを指定し、表示させるだけの処理に対して
redirect_toは別のURLに対してリクエストを再送信しブラウザを動作させる。

viewファイルの表示かhttpリクエストを投げるかの違い。

renderは前画面に戻ってデータを取得して表示をさせる使い方ができる。
redirect_toはデータの更新や削除などが挙げられる。
LaTeXでstyファイルをインストールする

備忘録です。siunitx.styをインストールする例です。


# styファイルが置かれているディレクトリを見つける
地味に大変でした  
※環境によって違います

```path:Windows
c:/texlive/{TeXの西暦}/texmf-dist/tex/latex
```
```path:Linux(Ubuntu)
/usr/share/texlive/texmf-dist/tex/latex
```

# それっぽいディレクトリを見つける / 更にディレクトリを作成する
Latexディレクトリ内にいくつもディレクトリがあるので、その中から適切なディレクトリを選んでください。
なければ作成します。
Linuxの場合、

```bash
$ cd /usr/share/texlive/texmf-dist/tex/latex
$ cd siunitx
```

```bash:もしsiunitxディレクトリがなければ
$ mkdir siunitx
$ cd siunitx
```

# そこでstyファイルをダウンロードする

```bash
$ wget https://www.sys.kth.se/docs/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
```

# インストール

```:Windows
mktexlsr
```

```bash:Linux
sudo mktexlsr
```
Vue CLI の導入

# Vue.js勉強のために Vue CLI をインストールする。
#### Vue CLIは、Vue.js のアプリケーションの開発を支援してくれるツールで、ページ間の遷移を定義したりするために必要となってくる。<br> Vue CLI のインストールには npm というコマンドを使用するが、これは JavaScript のパッケージ管理ツールとなっている。<br>Javascript の実行環境である Node.js をインストールすると npm も勝手にインストールされるため、まずは Node.js のインストールからしていく。<br><br>参考にした記事
#### [Vue.jsの環境構築 (mac)](https://qiita.com/reflet/items/16f90cbb0db68fd6a498)<br>
#### [MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
## <br>Node.js をインストール<br>
> 前提としてHomebrewをインストールしている。

```ruby:ターミナル
# nodebrewはNode.jsのバージョン管理ツール
$ brew install nodebrew  

# install時エラーが出ることがあるためディレクトリの作成をしておくといいらしい
$ mkdir -p ~/.nodebrew/src 

$ nodebrew install-binary v8.9.4 #8.9.0以上のバージョンじゃないと動かない。
```
> インストールができたら確認。

```ruby:ターミナル
$ nodebrew ls

# インストール直後はバージョンが有効化されてないため current: none と表示されるはず

v8.9.4

current: none
```
> 以下のコマンドでバージョン有効化

```ruby:ターミナル
$ nodebrew use v8.9.4 

# 再度
$ nodebrew ls 

# 結果
v8.9.4

current:v8.9.4
```
> パスを通す

```terminal:ターミナル
$ nodebrew setup

$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile

$ source ~/.zshrc
```
> パスの確認

```terminal:ターミナル
$ node -v
v8.9.4


$ npm -v
5.6.0
```
> 上記の表示が出れば Node.js のインストールは完了。
シェルは zsh 前提でやっているため、 bash の場合は参考記事のリンクがあるためそちらで。<br>

## Vue CLI のインストール
```terminal:ターミナル
$ npm install -g @vue/cli


$ vue --version
@vue/cli 4.5.3
```
> Vue CLI のインストールが完了。
<br>`$ vue create プロジェクト名` プロジェクト作成。<br>
`$ npm run serve` ローカルホスト起動。<br>
`$ vue ui` プロジェクト管理ツール起動。


##### 試しにプロジェクトを作成してみる。
```terminal:ターミナル
npm ERR! code EUNSUPPORTEDPROTOCOL
npm ERR! Unsupported URL Type "npm:": npm:vue-loader@^16.0.0-beta.3

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/nakayamakeiichi/.npm/_logs/2020-08-16T07_32_59_551Z-debug.log
 ERROR  command failed: npm install --loglevel error
```
> エラーが出る。<br>キャッシュを消すといけたという記事を見つけたため。

```:ターミナル
$ npm cache clean --force         # キャッシュを消すコマンド
```
> 再度プロジェクト作成。

```
ERROR  command failed: npm install --loglevel error
```
> npm のバージョンが古いのか？と思いnpmバージョンアップ

```:ターミナル
$ npm install -g npm  

$ npm -v
6.14.7  #5.6.0からバージョンアップ
```
> もう一度プロジェクトを作成する。

```:ターミナル
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project test-cli.
👉  Get started with the following commands:

```
> 上手く作成できた。<br><br><br>＊原因の推測＊<br>1: npmのバージョンの問題だった可能性。<br>2: キャッシュを消した後、途中まで作成されていたプロジェクトを削除しなかった。<br>3: もしくは、どちらも原因。<br><br>ちょっともやもやするので、また調べてみることにする。<br><br>最後に作成したプロジェクトをローカルホストで立ち上げる。

```terminal:ターミナル
$ cd test-cli

$ npm run serve

> test-cli@0.1.0 serve /Users/nakayamakeiichi/projects/test-cli
> vue-cli-service serve

 INFO  Starting development server...
98% after emitting CopyPlugin

 DONE  Compiled successfully in 1787ms                                  17:12:38


  App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://192.168.0.6:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build.

```
> http://localhost:8080/
上記へアクセス。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691857/85a43395-3cb7-47ad-069e-96af4408cbf9.png" width=50%>
> 無事ローカルホストにアクセスできた。

### <br><br><br>途中上手くいかないことがあったが、なんとか環境構築ができた。
全体タップイベント制御 swift Objective-C

# はじめに

久しぶりの記事な気がしています。
検索した時思いの外しっくりしたものを見つけられなかったので記事にしてみました。

【全体タップイベント制御】って書きましたが以下紹介コードは押させないのみ記述しています。

変更するのにフラグの変更だけなのでそうしました！:shamrock:

では早速:sunflower:

# code

【**swift**】

```swift

var keywindow:UIWindow? = nil;
for (count, item) in UIApplication.shared.windows.enumerated() {
    if(item.isKeyWindow){
        keywindow = UIApplication.shared.windows[count];
        break;
    }
}
if(keywindow == nil){
    keywindow = UIApplication.shared.windows[0];
}
keywindow?.isUserInteractionEnabled = false
```


【**objective-c**】
ちなみ『userInteractionEnabled』の確認の際はgetterあるみたいなのでそっち使うべきかと。

```objective_c

UIWindow *keywindow = nil;
for (int j = 0; j < UIApplication.sharedApplication.windows.count; j++) {
    if(UIApplication.sharedApplication.windows[j].isKeyWindow){
        keywindow = UIApplication.sharedApplication.windows[j];
        break;
    }
}
if(keywindow == nil){
    keywindow = UIApplication.sharedApplication.windows[0];
}
keywindow.userInteractionEnabled = false;
```


【コード説明】:nerd:

```objective_c
keywindow == nil
```
で入らなければ入れている理由ですが、最初だけ取得ができないからです。


[UIApplication.sharedApplication.windows](https://developer.apple.com/documentation/uikit/uiapplication/1623104-windows?language=objc)…開いているUIwindowの配列取得
その、
[isKeyWindow](https://developer.apple.com/documentation/uikit/uiwindow/1621612-keywindow?language=objc)…keywindowになっているか確認して後は
[userInteractionEnabled](https://developer.apple.com/documentation/uikit/uiview/1622577-userinteractionenabled?language=objc)…ユーザーイベントのフラグを変更！です。

ちなみに、、、、
keywindowとは、キーボードやタッチ関連イベントを受け取るwindowかということ。

ちなみにkeywindowは1つのwindowしかなれないので複数のUIWindowがkeywindowになることはありません。

後なぜfirstでなくfor文にしたかですがfirstだけの判断で本当に全て制御できるのかということがドキュメント探してみましたが見つからなかったからです、、

後最近だとシーンからの取得の方がいいのでは？とありそうですが、keywindowの取得のみならこっちの方が記述的にすっきりするかと思いこのような書き方にさせていただいています。

# 最後に

これはもっとこうすべき方がいいなどあれば教えて頂きたいです！
よろしくお願いします。
自分用メモ - 主要なOSSのライセンスの概要（日本語）がIPAにあるよ

# 経緯

私用で、とあるオープンソースプロジェクトのソースをダウンロードしようとしたときに、ライセンスの原文を読む気力が起きなかったので、日本語で概要を解説しているとこがないかと探してみた。結果、IPAによさげな資料があったので、備忘を兼ねて残しておく。

# 参考資料

独立行政法人であるIPA（情報処理推進機構）の発行物
[OSS ライセンスの⽐較および利⽤動向ならびに係争に関する調査 2010年5月 - 調査報告書](https://www.ipa.go.jp/files/000028335.pdf)
に、下記のライセンスの概要が日本語で掲載されている。

- AGPLv3
- EUPL

- MPL
- LGPLv3
- CDDL
- CPL
- EPL
- YPL

- BSD License
- Apache License 2.0
- MIT License
- Sendmail License
- OpenSSL License/SSLeay License
- CPOL
- ISC License
- Artistic License


※IPAなので信頼できるソースだと思うが、あくまで原文が正なので、ご利用は自己責任で。

以下、念のため、上記文書を読むにあたっての補足

ライセンサ(LicenserまたはLicensor)・・・許可（使用許諾など）を与えるほう

ライセンシ(Licensee)・・・許可（使用許諾など）を受けるほう
Gridsome入門 SPAを作ってみよう 【9日目 デプロイ編】

# スケジュール
- [1日目 要件定義編](https://qiita.com/Dev-kenta/items/b5c8ea6b432fe3594282)
- [2日目 環境構築編](https://qiita.com/Dev-kenta/items/6ae251a648e04b9cf026)
- [3日目 ドーナッツグラフ編](https://qiita.com/Dev-kenta/items/9e141767c42deee743c8)
- [4日目 棒グラフ編](https://qiita.com/Dev-kenta/items/780c3cb4a4d0cf813824)
- [5日目 GraphQL編](https://qiita.com/Dev-kenta/items/1d08ef27aa877cfb6771)
- [6日目 GraphQL編2](https://qiita.com/Dev-kenta/items/e4281380da38f57495b6)
- [7日目 GraphQL編3](https://qiita.com/Dev-kenta/items/1bf6dc021ec08932233c)
- [8日目 GraphQL編4](https://qiita.com/Dev-kenta/items/fcc65b0106ba29626db7)
- [9日目 デプロイ編](https://qiita.com/Dev-kenta/items/14ae9fdc6eec76f63ba1)←今ここ

# 前提条件
- node.js v8.3以上
- yarn or npmが入っている(Document見るとyarnの方が推奨とのこと)
- Gridsomeのプロジェクトを作成している

# Gridsomeプロジェクトをデプロイする方法
https://gridsome.org/docs/deployment/
Netlifyなどを利用して静的サイトをホスティングする方法やAWS S3を利用する方法などが紹介されています。
今回は一番簡単そうなNetlifyを利用してやってみました。

## まずはGithubへリポジトリを追加

```
git init
git add .
git commit -m 'first commit.'
git remote add origin https://github.com/Dev-kenta/asset-management-app.git
git push -u origin master
```

## NetlifyとGithubを紐付け
こちらの記事が大変参考になりました。
https://qiita.com/sugo/items/2ee64887d682b0dae635
まずは[Netlify](https://www.netlify.com/)にアクセスして、```Get started for free``` を押します。
![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402204/b1ac9ad8-1fd4-b03c-166d-863157019c31.png)
こんな画面になるので```New site from Git```を押します。
![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402204/d7e7d59c-6f74-54fb-344e-32dd234718e5.png)
Githubとの認証を済まして、Continuous Deploymentの箇所で```Github```を選択します。
![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402204/8ea3da42-782d-945f-fff4-173e76ab1790.png)
ホスティングするリポジトリに先ほど作ったものを指定。
![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402204/8d0f4fe1-b011-77f6-7db8-e58fb3e1dd1c.png)
Build command: ```gridsome build```
Publish directory: ```dist```
を指定して```Deploy site```を押すと、ホスティングが開始されます。
少し待つとサイトがホスティングされて見れるようになります。
ドメインを設定するまでは自動でNetlifyが振り分けたドメインで見ることが可能です。しかもちゃんとhttpsで見れます。
https://priceless-kowalevski-8debd2.netlify.app/
あとは更新したらGithubにpushすると自動的にコンテンツが更新される仕組みですね。便利。

# あとがき
ついにデプロイまできました。Netlifyでデプロイする方法が予想以上に簡単で驚きました。
ドメインを設定するのも簡単であればやってみようかな。
そしてついにお休みも終わり。明日からは日常が始まる。ひええ。
画像解析についてざっくり調べてみた

# 画像解析について調べてみた

## そもそも画像解析とは
画像解析とは画像を解析し、そこに写っているものの意味を理解することである。意味を理解するときの観点によって、さらに細かく分類される。
その代表例に、「分類（Classification）」（または「認識（Recognition）」）と「検出（Detection）」の2種類がある


## 画像解析の種類
### 分類・認識(Classification, Recognition)
- 物体分類：何が写っているかを分類する
- シーン認識：全体として何の画像であるかを認識する。

### 検出(Detection)
- 物体検出：どこに何が写っているかを検出する。
- 領域の検出：領域(セグメンテーション）を検出する。


## 簡単に活用事例を紹介
1. AI検出工程における不良品判定、生産設備の故障予兆
2. 医療における病理検査委
3. 製品カテゴライズ
4. 防犯カメラでの不審者検知
5. SNSにおける画像解析

## 画像解析を使用してやってみたいこと
- スポーツカーが好きなので、車の画像からスポーツカーか否かを判定するプログラムを作成してみたい。
- 魚の画像を読み込ませた際に、サイズや魚の種類判別する
Visual Studio CodeでEC2インスタンス内を編集する手順

これまでEC2インスタンス内のファイルを編集する際には、SSH接続してVimで編集していました。
Vimを使うのが嫌というわけではないけど、VisualStudioCodeでも編集、デバッグができるみたいなので手順をまとめます。

手順としては
1.VisualStudioCodeにプラグイン追加
2.~/.ssh/configの編集
3.接続、編集

##前提条件
・macOS
・VisualStudioCodeがインストール済み
・EC2インスタンスが作成済み
・EC2インスタンスにはApacheがインストール済み
・ローカルPCからEC2インスタンスにSSH接続できる環境構築済み

##1.VisualStudioCodeにプラグイン追加
VisualStudioCodeを開き、プラグインであるRemote Developmentをインストールしましょう。
有効にした後、一度VisualStudioCodeを閉じて開き直してください。
![スクリーンショット 2020-08-16 16.34.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/d5c87ff3-1921-2564-1732-9478c3f20abb.png)
開き直した後、サイドバーのアイコンをクリックします。
![スクリーンショット 2020-08-16 16.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/64f26f9b-ace3-1808-c38b-339201d731b0.png)
するとSSH接続可能なリモート環境が表示されます。
こちらにEC2インスタンスを追加しましょう。
![スクリーンショット 2020-08-16 16.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/24fcbb9a-ad0b-e565-c32c-6eae43dba93d.png)

##2.~/.ssh/configの編集
接続可能一覧に表示させるには、~/.ssh/configにEC2インスタンスの情報を追加する必要があります。
ターミナルで以下のコマンドを実行してください。

```
% cd ~/.ssh
% vi config
```
~/.ssh/configに以下のEC2インスタンスの情報を追加します。

```
.
.
.
Host 任意の接続名(例：ec2-user)
 User ユーザー名(例：ec2-user)
 HostName ホスト名(例：XX.XXX.XX.XXX)
 IdentityFile .pemファイルのパス(例：~/.ssh/XXX.pem)
```
上書き保存後、VisualStudioCodeを一度閉じて開き直してください。
追加した接続先が表示されているはずです。
![スクリーンショット 2020-08-16 16.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/fc47fb4f-8e9f-21c4-911d-e6ef633c8ccd.png)
##3.接続、編集
それでは早速、接続してみます。
表示されている接続先名の右側のアイコンをクリックしましょう。
自動的に新しいウインドウが開かれ、SSH接続をしてくれます。
早速コードを書いていきましょう。
Apacheのデフォルトのドキュメントルートは/var/www/htmlになっているかと思いますのでそちらの直下にファイルを作成します。
左側の青いボタン「フォルダーを開く」をクリックして/var/www/htmlを指定してください。
![スクリーンショット 2020-08-16 17.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/b8742f83-ec10-145f-aa2e-7dcbd137e5ee.png)
/var/www/htmlを開くことができたらindex.htmlを作成し適当なコードを記述します。
アクセスして確認してみましょう。
![スクリーンショット 2020-08-16 17.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/003077d9-d5c6-af55-527f-395ced16c26e.png)
無事反映されました！
これでリモートデバッグなどもVisualStudioCodeで行えます。

ちなみに元々インスタンス内に置かれているファイルに関しては書き込み権限がない場合もあります。
適宜権限変更などして対応してください。
Active Storageでキー名を指定するには

環境: Rails 5.2 / 6.0

RailsのActive Storageを使ってAWS S3にファイルを保存すると、自動的に `whZ3Y8VP3XV8WGqjyK2dyZ5j` のようなキー名になります。これを `images/developmenet/whZ3Y8VP3XV8WGqjyK2dyZ5j` のようにフォルダ分けする方法です。Rails Guildesには載っていませんが、Active Storageのソースコードを見てて気付きました。

次のモデルがあるとします。

```ruby
class User < ApplicationRecord
  has_one_attached :image
end
```

ふつうの使い方では、`user.image.attach` に `ActionDispatch::Http::UploadedFile` を渡します。

```ruby
user.image.attach(file)
```

`user.image.attach` には `ActionDispatch::Http::UploadedFile` だけでなく、`ActiveStorage::Blob` オブジェクトも渡せます。`ActiveStorage::Blob` を直接使ってアップロードし、その後にUserモデルにくっ付ける、ということができます。

次の例では、`ActiveStorage::Blob` にキーを指定して `new` したあと、`upload` メソッドに`IO` オブジェクトを指定してアップロードし、それから `attach` メソッドに渡しています。`key` に指定した文字列がS3のキー名なります。

```ruby
def save_image(user, file)
  if Rails.configuration.active_storage.service == :amazon
    key = "images/#{Rails.env}/#{SecureRandom.hex}"
    blob = ActiveStorage::Blob.new(key: key,
      filename: file.original_filename, content_type: file.content_type)
    blob.upload file.to_io

    user.image.attach(blob)
  else
    user.image.attach(file)
  end
end
```

`ActiveStorage::Blob` のソースでは、キーは次のように作られています。

```ruby:activestorage-6.0.3.2/app/models/active_storage/blob.rb
class ActiveStorage::Blob < ActiveRecord::Base
# 略
  has_secure_token :key
# 略
  def key
    # We can't wait until the record is first saved to have a key for it
    self[:key] ||= self.class.generate_unique_secure_token
  end
```

`generate_unique_secure_token` メソッドは `ActiveRecord::SecureToken` のソース中にあります。

```ruby:activerecord-6.0.3.2/lib/active_record/secure_token.rb
      def generate_unique_secure_token
        SecureRandom.base58(24)
      end
```

上記のサンプルは次のようにも書けます。`ActiveStorage::Blob` にキーを作らせておいてから、プレフィックスを付ける方法です。

```ruby
blob = ActiveStorage::Blob.new(filename: file.original_filename,
  content_type: file.content_type)
blob.key = "images/#{Rails.env}/#{blob.key}"
blob.upload file.to_io
```

## Active Storage関連のテーブル

以下、ご参考までにメモ。

Active Storage関連のテーブルには、`active_storage_blobs` と `active_storage_attachments` があり、それぞれモデルクラス `ActiveStorage::Blob` と `ActiveStorage::Attachment` が対応しています。どちらも `ActiveRecord::Base` のサブクラスなので、ふつうのモデルのように使えます。

- `ActiveStorage::Blob` : アップロードしたファイルを表すモデル
- `ActiveStorage::Attachment` : モデルへのファイルの添付を表すモデル

![activestorage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308595/c099c7f2-9748-df2a-a465-53154b8c75e7.png)
rbenvでRubyをインストールしたがバージョンが変わらない時の対処法

## 環境
MacOS Catalina
Rails 6.0.3.2
Ruby 2.7.1(2.6.3)

## 現象
前日までは特に問題なかったが、翌日PCを起動し「Rails s」すると、
「Your Ruby version is 2.6.3, but your Gemfile specified 2.７.１」のエラーが発生。

Rubyのバージョンを確かめると
Ruby -v → 2.6.3
rbenv --version → 2.7.1

「rbenv global 2.7.1」としたが切り替わらない・・・。

## 対処法
# Rubyの参照先の確認
```
$ which ruby
/usr/local/bin
```

rbenvでインストールした場所と違う場所を参照しているので、場所を変更する。

# 参照先の変更
```
$ vi ~/.bash_profile
```

ファイルの状態は下記の通り。

```
export PATH=/usr/local/bin:$PATH
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
eval "$(rbenv init -)"
eval "$(rbenv init -)"
```

１行目が効いてそうなのと、同じ記述があるので下記のように修正。

```
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
```
使用したviコマンドは「dd」で一行削除、「:wq」で保存して終了。

# Rubyのバージョンを再確認する
```
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
```

Rubyのバージョンが無事切り替わりました！
【初心者向け】プログラミングを勉強したい！と思った時、HTMLとCSSから始めるのは適切なのか。

# どうも7noteです。フロントエンジニアの見解からプログラミングをこれから始めようと思っている方向けの記事

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/discussion/start_html/