OmniAICreator/Qiita-1.07M huggingface dataset:
STM32F767のArduinoでの新規Lチカコンパイル

X何らかの方法でArduinoをインストールしておく。

1.stm32ライブラリーのインストール

追加ボードマネージャー
[ファイル]->[環境設定]

下記を,で追加

```
https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/master/STM32/package_stm_index.json
```


2.ボードの設定

3.サンプルの読み込み

4.コンパイル

5.おわり

わからない所は、STM32F303K8　Arduinoを参考にしてしらべてね!!
https://www.denshi.club/pc/nucleo/nucleoarduino1blink.html

![stm32_oled_d_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/53913508-3bee-7589-8658-a4378a576251.jpeg)

![l_ax_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/de8cc11b-1d54-f939-3f4a-7a1b02d66216.jpeg)

![l_ax_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/76c3e25d-55e9-4e49-0c66-3723d6a212c5.jpeg)

![f767_a_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2703a443-4e24-6583-226d-d0f74aa62907.jpeg)

![l_ax_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/73328df4-d0a0-1763-e6c5-1e002567f746.jpeg)

![f767_a_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5705faa9-0e13-6fa6-c989-ed55f9fe8ae6.jpeg)


```

PB0  LD1[Green]
PB7  LD2[Blue]
PB14 LD3[Red]
PC13 USER_Btn


```
[memo]FontAwesome

##FontAwesomeの使い方

①Font AwesomeのCSSファイルを読み込む
　htmlの head要素の中に記述します。

>\<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">

```html:html
<head>
  <meta charset="utf-8">
  <title>MyPage</title>
  <link rel="stylesheet" href="stylesheet.css">
  <!-- ここへ記述 -->
  <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
</head>
```


②\<span>タグにfaクラスとfa-アイコン名クラスを指定する
（[Font Awesomeのサイト](https://fontawesome.com/)にアイコンごとのクラス名が載っています。）

```html:html
<a href="#" class="btn facebook"><span class="fa fa-facebook"></span>Facebookで登録</a>
<a href="#" class="btn twitter"><span class="fa fa-twitter"></span>Twitterで登録</a>

```
JavaのScanner 練習

package test;

import java.util.Scanner;

public class test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			System.out.print("受講定員を入力してください:");
			Scanner sc = new Scanner(System.in);
			String str = sc.nextLine();
			sc.close();

			System.out.println(checkStudentNumber(str) + "人ですね");
			System.out.println("正常に終了しました。");
		} catch (NumberFormatException e) {
			System.err.println("入力された値は数値ではありません。");
		} catch (InvalidStudentNumberException e) {
			System.err.println(e.getMessage());
		}
	}



	static int checkStudentNumber(String str) throws InvalidStudentNumberException {

		int num = Integer.parseInt(str);
		if (10 < num) {
			throw new InvalidStudentNumberException("受講定員を超えています。");
		} else {
			return num;
		}

	}

}




package test;

public class InvalidStudentNumberException extends Exception {

	InvalidStudentNumberException(String str) {
		super(str);
	}


}
ASP.NET Core Blazor WebAssembly - ブログ連載のまとめ記事【フロントエンド開発入門者向け】

こんにちは！

本記事では、<a href="https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-5.0" target="_blank">ASP.NET Core Blazor</a> (以下 Blazor) について各テーマについて解説してきた記事を紹介します。



## Blazor 連載記事

Blazor の連載記事を列挙しました。

上から順に読んでいただく事をおすすめします！


### レイアウトの構築

レイアウトの構築について解説した記事です。

レイアウトを定義するための LayoutComponentBase の利用方法を中心に解説しています。

[ASP.NET Core Blazor WebAssembly - レイアウトの構築【フロントエンド開発入門者向け】](https://qiita.com/furugen/items/17f12f12b462f21fe0b5)


### データバインディング

データバインディングについて解説した記事です。

ビューとビジネスロジックのデータを同期させる為に重要な機能です。

データバインディングの実装方法や、反映タイミングについて説明しています。

[ASP.NET Core Blazor WebAssembly - データバインディングの基礎【フロントエンド開発入門者向け】](https://qiita.com/furugen/items/339258dcec51029d640d)


### バリデーション

バリデーションについて解説した記事です。

必須や電話番号、メールアドレスなどの標準のバリデーションの実装方法から、カスタムバリデーションまで解説しています。

[ASP.NET Core Blazor WebAssembly - バリデーション【フロントエンド開発入門者向け】](https://qiita.com/furugen/items/6b01b1bd6538825ef0f3)



### 依存関係の挿入 (DI)

依存関係の挿入 (DI) について解説した記事です。

DI を採用するメリットや、利用方法について説明しています。

[ASP.NET Core Blazor WebAssembly - 依存関係の挿入 (DI)【フロントエンド開発入門者向け】](https://qiita.com/furugen/items/0c8e55465f78345c4aed)


### イベント

イベントについて解説した記事です。

入力時、クリック時、フォーカス取得時などよくあるイベント処理を Blazor で実装するための方法を解説しています。

[ASP.NET Core Blazor WebAssembly - イベント【フロントエンド開発入門者向け】](https://qiita.com/furugen/items/1e75272d98f45f9b80be)


## 開発全般に関するご相談はお任せください！

インフラジスティックス・ジャパンでは、各プラットフォームの特別技術トレーニングの提供や、開発全般のご支援を行っています。


「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」

といったご相談を承っています。

お問い合せは<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank">こちら</a>からお気軽にご相談ください。
【Rails】Rspecの書き方(初心者)

Rspecの書き方をよく分からなくなってしまうので、備忘録として。

# 「～であること」を期待する場合は to を使う。
例①

```ruby  
it "hoge" do
    expect("hoge").to eq("hoge")
end
```
この場合は、「"hoge"が"hoge"と等しいことを期待する。」と言う意味になり、このテストはパスします。

例②

```ruby  
it "hoge" do
    expect("hoge").to eq("fuga")
end
```
この場合は、「"hoge"が"fuga"と等しいことを期待する。」と言う意味になり、このテストはパスしません。

# 「～でないこと」を期待する場合は to_notもしくはnot_to を使う。
例③

```ruby  
it "hoge" do
    expect("hoge").to_not eq("hoge")
end
```
この場合は、「"hoge"が"hoge"と等しくないことを期待する。」と言う意味になり、このテストはパスしません。

例④

```ruby  
it "hoge" do
    expect("hoge").to_not eq("fuga")
end
```
この場合は、「"hoge"が"fuga"と等しくないことを期待する。」と言う意味になり、このテストはパスします。


# 単語帳
valid = 妥当
expect = 期待する
reactで画面表示on/offを切り替える

## やり方
- react hooksでやってる
- stateを宣言しておく
- stateにtrue or falseを入れる
- それによってreturnを変更する

```react
function Debug() {
  console.log("debug");
  const history = useHistory()
  const [debugopen, setdebugOpen] = React.useState(false);
  useEffect(() => {
  <-- なんかの処理 -->
  setdebugOpen(true)
  })()
  }, []);

  if (debugopen) {
    return <div>ログインしています。</div>;
  } else {
    return <div>ログインしていません。</div>;
  }
}
```
Windowsローカル開発環境のコンテナとVMの共存運用に向けて

# 前提
- PCはWindows10
- 現在はVMWarePlayerを利用中

# 現状
現在はVMWarePlayerを利用した開発環境の運用を行っている。
案件を複数担当していると仮想マシンが複数必要となり、ローカルPCのディスクを逼迫する。
また、同時に起動する場合などホストのCPU・メモリ等のリソースに負担をかける。動作も遅くなり開発ストレスが高まってきた。
この問題を解決すべく、仮想コンテナによる開発環境の運用を目指すこととした。

# 目的
- ローカル開発環境のコンテナ化、脱VM
- VSCodeのRemoteContainerによる開発の実現
- コンテナ化が困難な開発環境の場合は、VMWarePlayerを継続して利用したい

VMWareと共存しながらコンテナ利用する

# 方針
Dockerの利用にはHyper-Vが必要となるが、WSL2の登場によりHyper-Vの機能の有効化が不要となった。
WSL2によりコンテナ運用を実現し、VMWarePlayerとの両立を図る。

# 対応
## WSL2の導入
下記を参考に実施
https://qiita.com/tomokei5634/items/27504849bb4353d8fef8

※上記の手順でwslコマンドが使用できない場合はWSLを有効化してOS再起動
```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

### WSL有効化の前のVMware Workstation Playerの注意点
- WSL2を有効にする前にVMware Workstation PlayerのゲストOSの電源を切っておくこと
- Intel VT-x/EPTまたはAMD-V/RVIを仮想化のチェックを外しておくこと

（参考）
http://kzlog.picoaccel.com/post-1114/

## Docker for Windowsのインストール
### ダウンロード
下記よりダウンロード
https://www.docker.com/products/docker-desktop

### インストール
「Install reauired Windows compornents for WSL 2」を有効化

# 最後に
無事Dockerのコンテナ利用とVMWarePlayerによる仮想マシン起動ができました。
これから徐々にVMの環境をコンテナへ移行していこうと思います。
LaravelでMVCモデルの記述

#概要
`Laravel`の学習に伴って最低限の知識を整理した個人的な備忘録です。
以前の記事の続きになります。

[Laravelのコントローラー - Qiita](https://qiita.com/strrr/items/0cc21f9d03214cd6d62d)

今回はMVCの流れに沿って、データベースの情報をビューファイルで表示してみます。

#ルーティング
`routes`フォルダの`web.php`に以下を追記。

```php:web.php
Route::get('sample', 'TestController@index');
```

#コントローラー
ルーティングの際に`index`アクションを記述したので、`TestController.php`にて`index`アクションの定義。

```php:TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Test;

class TestController extends Controller
{
    public function index() {

        $values = Test::all();

        dd($values);

        return view('sample', compact('values'));
    }
}

```
###dd関数
`dd関数`は処理を止めて変数の中身を表示してくれる。

![functon-dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701834/f8dae015-9b8c-f3e1-e764-6153eb111a6c.png)
前回挿入したレコードを確認。

#ビューファイル

```php:sample.blade.php
@foreach($values as $value)

{{$value->id}}<br>
{{$value->text}}<br>

@endforeach
```
`Blade`の`{{}}`記法は、XSS攻撃を防ぐ為に自動的に`htmlspecialchars関数`をかけてくれているということで、めちゃ便利。
サーバー起動後、データがブラウザ上にしっかり表示されているのを確認しました。
正規表現バリデーション　REGIX命名について

##はじめに

バリデーションを設定する上でREGEXの命名規則があるのかについて確認した備忘録です。

##例

【例】Railsのモデル

```
1 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
2 validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください' 
```

この場合は、パスワードのバリデーションを設定しています。

気になったところは”PASSWORD_REGEX”の部分です。
パスワードのバリデーションのためPASSWORD_REGEXとかいていますが、名字や名前の時はどう書くのか確認してみました。

##結果
マイグレーションファイルにて、名字はfirstname,名前はlastnameと設定していたとします。

名字も名前もつけるバリデーションは同じです。

その際の命名は、第三者が見てわかりやすい名前を基準にしてつけてあげるので”NAME_REGIX"とつけてあげればわかりやすいでしょう。

変数名のため自由に名前は決められますが、仮にここをFIRSTNAME_REGIXとしてしまうと、lastnameの時に使用した際わかりづらくなってしまします。

汎用的に使える名前でつけてあげましょう。

##まとめ
【命名】
（名字・名前）firstname,lastmame→→NAME_REGIX

（名字カナ・名前カナ）firstnamekana,lastnamekana→→NAMEKANA_REZIX

このようにつけてあげるとわかりやすいです。

以上。
Railsの環境構築(グローバル環境を汚さずに)

## はじめに
`rails new`するにはグローバルにrailsをインストール必要があり、`gem install rails`を実行すると、railsとそれに依存するgemが大量にグローバルにインストールされます。別に(私の経験では)大した害はないですが、やっぱりグローバルはクリーンに保ちたいので、グローバル環境をクリーンに保ちつつRailsプロジェクトの環境を構築する手順をメモしておきます。

## 実行環境
macOS Catalina バージョン10.15.7
gem 3.2.7
ruby 3.0.0

## 手順
#### bundlerをインストール
```terminal
# bundlerはグローバルにインストールします
gem install bundler

# インストールされたか確認
bundler --version
=> Bundler version 2.2.7   # 私の場合、2.2.7でした
```

#### プロジェクトフォルダを作成
```terminal
mkdir my_app
cd my_app
```
通常、`rails new my_app`でフォルダを作ると思いますが、そうしないのがポイントですね。
まあこの段階ではグローバルにrailsを入れてないので、できないんですが、、、

#### Gemfileを作成
```terminal
bundle init
```

#### Gemfileを編集
```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails" # この部分をアンコメント
```

#### railsをインストール
```terminal
bundle install --path vendor/bundle
```

pathを指定することでグローバルではなくプロジェクト直下の`vendor/bundle/`にrailsや依存するライブラリがインストールされます。
ちなみに、一度`bundle install --path vendor/bundle`を実行すると、
`.bundle/config`が作成されます。中を見てみると、

```:config
---
BUNDLE_PATH: "vendor/bundle"

```
環境変数のようなものが設定されており、
これがあれば、次回から`bundle install`だけで`vendor/bundle/`配下にgemがインストールされることになります。


#### railsプロジェクト生成
```terminal
bundle exec rails new .
```
`bundle exec`はグローバルではなく`~/vendor/bundle/`のgemを実行してくれます。
他の方の記事では`--skip-bundle`を渡しているものもありますが、ここでは、`bundle/config`がすでに作られているので、`bundle install`が実行されてもグローバルが汚染されることはないです。
Gemfileがコンフリクト起こしますが、上書きして大丈夫です。

#### サーバー起動
```terminal
bundle exec rails s
```
これでサーバーが立ち上がれば成功です。


## 参考記事
[ローカル環境を汚さずにRuby on Railsの環境構築をする - Qiita](https://qiita.com/tsukakei/items/d697ddbf12fe4fb151dd)
[新規Railsプロジェクト作成時のコマンド - Qiita](https://qiita.com/k_senbei/items/02c4bacd5bb862535d9d)
文字列を検索、置換を行う

特定のパターンで文字列の検索、もしくは置換をする方法です。
下記の例から電話番号の箇所を探すとします。

その際に使用するのが preg_match('検索したいパターン', '検索したい文字列', '検索した結果を格納する変数'); を使用します。

```php:main.php
<?php

$input = 'Call at 03-1234-5678 or 03-8765-4321';
$pattern = '/\d{2}-\d{4}-\d{4}/';

preg_match($pattern, $input, $matches);
print_r($matches);
```
```:ターミナル
~ $ php main.php
Array
(
    [0] => 03-1234-5678
)
```
結果として最初に見つかった結果だけを matches に格納してくれます。全て見つけたい場合は $preg_match_all() を使います。

```php:main.php
<?php

$input = 'Call at 03-1234-5678 or 03-8765-4321';
$pattern = '/\d{2}-\d{4}-\d{4}/';

preg_match_all($pattern, $input, $matches);
print_r($matches);
```
```:ターミナル
Array
(
    [0] => Array
        (
            [0] => 03-1234-5678
            [1] => 03-8765-4321
        )

)
```

次に電話番号を伏字に置換します。

```php:main.php
<?php

$input = 'Call at 03-1234-5678 or 03-8765-4321';
$pattern = '/\d{2}-\d{4}-\d{4}/';

$input = preg_replace($pattern, '**-****-****',$input);
echo $input . PHP_EOL;
```
```:ターミナル
$ php main.php
Call us at **-****-**** or **-****-****
```

##参考文献

* [ドットインストール](https://dotinstall.com/)
* [String 関数 - Manual - PHP](https://www.php.net/manual/ja/ref.strings.php)
rails optional: true

## optionalオプションの使い方

例

```ruby
belongs_to :hoge, optional: true
```

trueにすることで、関連付けされたオブジェクトの存在生のバリデーションが実行されない。
デフォルトでは```false```になっており、もしこのmodelでのバリデーションが行われた後に、```hoge```モデルが登場かつ関連付いている場合でも、バリデーションチェックで弾かれずに済ますことができる。


## 参考
[Railsガイド](https://railsguides.jp/association_basics.html#optional)
[【Rails】バリデーションチェックを回避する「optional: true」について簡単にまとめてみた](https://techtechmedia.com/optional-true-rails/)
DockerのMySQL接続で「SQLSTATE[HY000] [1045] Access denied for user」が出たときの対処法

今日は勉強中のDockerについて書いていこうかなと思います。

Dockerの開発環境については、以下の記事で書いているので開発環境を整えるときにぜひ使ってください。

[Docker初心者がWindowsでgitSSH接続からdockerコマンドを打てるまでの流れ](https://qiita.com/akki-memo/items/2a544a07ef1010367758)

まずDockerのコンテナ内で``php artisan migrate``を打つと、以下のエラーが。。。

>SQLSTATE[HY000] [1045] Access denied for user ‘root’@’196.172.0.2’ ～

MySQLのエラーは本当に厄介。

とりあえずこれはアクセス権がないとのことで、MySQLのコマンドにてDocker専用のアクセスできるユーザーを作成する。

アクセス権限があるユーザー、データベースの作成もとっくにやってるよという方は、こちらの[番外編]()

#データベース、アクセス権を持つユーザーの準備#

###ユーザー作成###

```
mysql > create user create user 'docker'@'%' identified by '好きなパスワード（以下passwordと置く）';
```

###データベース作成###

```
mysql > create database test
```

#ユーザーにアクセス権付与#

今作成したユーザー（docker）にデータベースへのアクセス権を付与します。

###データベース選択###

使いたいデータベースを選択します。

```
mysql > use test
```

###アクセス権付与###

```
mysql > GRANT ALL PRIVILEGES ON データベース名（test）.* TO ユーザー名@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql > FLUSH PRIVILEGES;
```

###アクセス権確認###

```
SELECT user, host, db FROM mysql.db;

+---------------+-----------+--------------------+
| user          | host      | db                 |
+---------------+-----------+--------------------+
| docker        | %         | test               |
| mysql.session | localhost | performance_schema |
| mysql.sys     | localhost | sys                |
+---------------+-----------+--------------------+
```

このような結果が出たらOKです。

ちゃんとtest（データベース）にdocker（ユーザー）のアクセス権が付いていますね。

#.env docker-composeファイルの編集#

```laravel/.env
DB_CONNECTION=mysql
DB_HOST=db（自身の開発環境に合わせてdbかmysql）
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=docker
DB_PASSWORD=password
```

```docker-compose.yml
FROM mysql:8.0

ENV MYSQL_DATABASE=test \
  MYSQL_USER=docker \
  MYSQL_PASSWORD=password \
  MYSQL_ROOT_PASSWORD=password \
  TZ=Asia/Tokyo

COPY ./my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
```

#アプリの起動#

###アプリのダウン###

```
docker-compose down --volumes
```

###アプリのビルド###

```
docker-compose up -d
```

```
docker-compose exec app bash
root@eef5ce366e9e:/work# cd larabel（プロジェクト名）
root@eef5ce366e9e:/work#/laravel php artisan migrate
```

このようにしてマイグレーションを実行することができました！

MySQLのエラーって実は公式のドキュメントの方が分かりやすい場合もあるので、まずは公式ドキュメントを参照することをおススメします。

#番外編#

マイグレーションを実行できないのにはキャッシュが原因で行えない可能性もあるのでぜひキャッシュを消去して見て下さい。

```
docker-compose down --volumes
```

僕はこのコマンドを打つことでマイグレーションできました。

また、Laravelのプロジェクトに移動して``artisan``でキャッシュ消去も試してみてください。


```
docker-compose exec app bash
root@eef5ce366e9e:/work# cd larabel（プロジェクト名）
root@eef5ce366e9e:/work#/laravel php artisan chace:clear
root@eef5ce366e9e:/work#/laravel php artisan config:cache
```

以上、「DockerのMySQL接続で「SQLSTATE[HY000] [1045] Access denied for user」が出たときの対処法」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~ビットコインの最新取引価格を取得してみる~

##前提として
:white_check_mark:  Googleアカウント取得済である
https://www.google.com/intl/ja/account/about/

:white_check_mark:  Google Apps Scriptを利用したことがある
https://script.google.com/home

## ~序章~ ビットコインの最新取引価格を取得してみる 
パブリップAPIを利用してオープンな情報を取得してみます。

パブリックAPI公式ドキュメント(日本語)
https://github.com/bitbankinc/bitbank-api-docs/blob/master/public-api_JP.md

このドキュメント中の
**[Public API] ティッカー情報を取得**の項目を利用します。
ティッカーとは銘柄(仮想通貨の種類)みたいなものですね。ビットコイン(円換算)だと```btc_jpy```がティッカーです。

```
  const PUBLIC_URL = "https://public.bitbank.cc",
  ticker = "btc_jpy";

  const response = JSON.parse( UrlFetchApp.fetch(PUBLIC_URL + '/' + ticker + '/ticker') );
  console.log(response);
```

結果例

```
{
  success: 1,
  data: {
    sell: "3962451",
    buy: "3962450",
    high: "4006999",
    low: "3700011",
    last: "3962451",
    vol: "1626.2699",
    timestamp: 1612408333540
  }
}
```
なので、最新の価格はこの中のlastの値を取り出します

```
const last_price = response.data.last;
console.log(last_price);

// 結果例
// 3962451
```

これらをまとめて完成したプログラムはこちらです。

```getPrice.gas
function getPrice(){
  const PUBLIC_URL = "https://public.bitbank.cc",
  ticker = "btc_jpy";

  // ティッカー情報取得
  const response = JSON.parse( UrlFetchApp.fetch(PUBLIC_URL + '/' + ticker + '/ticker') );

  // 最新取引価格取得
  const last_price = response.data.last;
}
```


## まずはここから
特に難しいことはなかったかと思います。
他の銘柄でもティッカー情報を取得してみてください。

[次回](https://qiita.com/kaketechjapan/items/da6696146adcdb631ab9 "【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~自分の資産情報を取得してみる~")は、プライベートAPIを利用して、個人の資産状況を取得してみたいと思います。
Planner の グループID と プランID を確認する方法

Planner 使ってますか？

Power Automate や Power Apps で「ある条件でタスクを追加するプランを動的に切り替えたい」ってコトありまして。その際に必要になるパラメータである Planner の”グループID”（プランが紐づいている Microsoft 365グループを識別する値）とプランID（Planner のプランを識別する値）を確認する方法です。

えぇ、そうです。備忘録です。

# 確認方法
グループIDも、プランIDも該当の Planner をブラウザーで開いてスグに確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/6edbb350-1886-7ff9-361c-6a4f104c9c0d.png)
URLをテキストエディター等にコピー＆ペーストしてください。

```
https://tasks.office.com/[テナントID].onmicrosoft.com/ja/Home/Planner/#/plantaskboard?groupId=[グループID]&planId=[プランID]
```

URLの末尾がソレです。切り取って活用ください。

- groupId=[グループID]
- planId=[プランID]

# Power Automate で利用する
例えば、Planner コネクターの「タスクの生成」アクションではグループIDとプランIDを指定できます。特定のプランを狙い撃ちする場合は選択肢から表示名を確認して選択すれば問題ありません。何かの条件を判別してタスクの登録先をわけたい場合はカスタム値から指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/1540addd-bcd6-ee21-2ae7-7771e3f1bfe2.png)
上記例は固定値を入力していますが、実際は Dataverse 等のデータソースにキーと一緒に格納しておいて、このアクションの前に変数などへ該当のIDを設定するとよいと思います。

コネクターの情報はこちら → [Planner](https://docs.microsoft.com/en-us/connectors/planner/?WT.mc_id=BA-MVP-5004053)

# おまけ
プランを「お気に入り」に登録した後で、そのプランが紐づいている Microsoft 365グループを削除すると、プラン自体もともづれて削除されます。ただ、Planner の画面上は”お気に入り”で残っていることがあり、そこをクリックするとチョッと面白い画面を見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/56d43d05-2221-3380-1497-6a39d4706877.png)

ででーん！

¯＼_(ツ)_/¯

これ、日本語環境以外で表示できないと思うんですけど、海外はどうなんでしょうね？🤣🤣🤣



ってことで。当方の備忘録色満載の投稿でした。
それでは、皆さま。素晴らしい Power Platform Life を！
【pytest】motoで作ったS3のデータをAzureBlobStorageに投げられなかった【TDD】

S3にあるCSVを持ってきて、Blobに上げるという動作をする関数のテスト作成中、謎のエラーが出てきた。

```
azure.common.AzureException: cannot unpack non-iterable CallbackRespoon\storageclient.py:302: AzureException
```

テストしたい関数が以下

```python:upload.py
import os
import boto3
import pandas as pd
from azure.storage.blob import BlockBlobService

def s3_to_blog():
    objkey = f"file/data.csv"
    s3 = boto3.client('s3')
    obj = s3.get_object(Bucket=KCAI_STORAGE, Key=objkey)
    df = pd.read_csv(io.BytesIO(obj['Body'].read()))

    service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)
    output = df.to_csv(index=False, encoding = "utf-8")
    service.create_blob_from_text("container", f"updata.csv", output)
```

テストが以下

```python:upload.py
import s3_to_blog
from moto import mock_dynamodb2, mock_s3
import boto3

@mock_s3
@mock_dynamodb2
def test_s3_to_blog():
    bucket_name = "storage"
    s3 = boto3.resource('s3', region_name='us-east-1')
    buket = create_bucket(s3, bucket_name)
    upload_file(buket, f"./test_data.csv", "file/data.csv")

    upload.s3_to_blog()

def upload_file(bucket: object, path: str, obj_key: str):
    with open(path, mode="rb") as f:
        result = bucket.put_object(Key=obj_key, Body=f)
    return result

def create_bucket(s3: object, bucket_name: str) -> object:
    bucket = s3.Bucket(bucket_name)
    bucket.create()
    return bucket
```

# たぶんmotoのせい
これ、motoを外して、S3に全く同じデータを用意してテストしたところ通った。
なのでmotoをつかって作ったS3から取得したデータをblobに上げることができないと考える。(なんでかはわかってない)

# じゃあどうするん
仕方がないので、s3のデータをblobにアップロードする箇所のテスト(それが含まれるテスト)はmotoを使わない、とするしかないんじゃないかな。motoの動作とかをもっと理解したら回避方法があるのかも。
時間ができたら確認して、いい解決方法がないか考えたいものです。
Android Studio Git tokenでのログイン方法


## 前書き
Android StudioをGitと連携させようとしてログイン画面で必要な情報を入力したにもかかわらず、なぜかエラーになりログインできないといったことがありました。
色々調べた結果tokenを使ったログイン方法ですと、なぜかログインできるみたいです
(よくわかってなくてすいません...)
ですが、このtokenではselect scopeという権限を設定する必要があり、そこで選択を間違えるとリポジトリの作成ができないといったこともあるので注意してください（後述します）
> あと、この方法は根本的な解決法ではありません。開発を進めていく中で不備が見つかってくるかもしれません。私の場合エラーなどは出てきてませんが、仮にエラーなどが出てしまった場合各自で対処をお願いいたします。

## tokenでのログイン
### 1. Git token作成方法

1. Githubにログイン
2. Settings
3. Developer settings
4. Personal access tokens
5. Generate new token
  (Note: わかりやすい名前、　Select scope: 下記画像参照)
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080547/d27496db-4d9f-c4b9-9280-c5d44cfe39d3.png)
> 例えばadmin:repo_hookの項目にチェックを入れないと、Android Studioからリポジトリが作成できなくなってしまう

6. Generate token
7. 作成されたtokenのキーをコピー

### 2. Android StudioでGithubにログイン

1. Android Studioの上メニューバーにあるVCS
1. Import into Version Control
2. Share Project on GitHub
3. githubログイン画面の右上にある「token」的なものをクリック（うろ覚え）
4. 先ほどコピーしたキーを入力してログイン
(あともしかしたら「github.com」を「http\://github.com」に変更する必要があるかも)

## 万が一、設定に不足があるtokenでログインしてしまった時の対処法
自分がtokenでログインしようといろいろと模索しながらやっていた時、作成したtokenでログインしてしまった後に「このselect scopeの設定も必要です」とかいう記事を見つけてしまったことがありました。
そのとき、Android StudioでのGithubログアウトの方法がわからずかなり切羽詰まった経験があるため、そういった同士のために対処法を書かせていただきます。

### Android StudioでのGithubログアウト

1. Android Studioの上メニューバーにあるVCS
2. checkout from version control
3. 自分のアカウントを選択
4. 検索の右側にある自身のアイコンを選択
5. 自身のアイコンを選び、Log outを選択

ログアウトができたら修正したtokenで再度ログインしてください。 

---
Qiitaに投稿することがほとんどないので、もしわかりにくい点がありましたらコメント等でご指摘お願いします。
Androidアプリを開発した話

##概要
去年の夏頃、このようなAndroidアプリを開発しました。
>○ MessengerApp　TELL
>[アプリケーション紹介HP](https://lit-oasis-15875.herokuapp.com/)
>[Github](https://github.com/matsuokanao/MessengerApp)

ちなみにアプリケーション紹介HPも自分で作成してみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/dc754bb8-5160-1729-539c-1d220b746885.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/0d738e70-2ad8-72a8-8ce5-16a5e9ebb486.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/256d590a-fa7d-604c-01b8-a1e4f98dfa5e.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/b408f606-d281-c9f2-8569-bd4dd8ead741.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/f8cb9364-42bb-a0ed-ccee-4cab038cfe76.png" width=30.5%>

##きっかけ
時間や場所を選ばずスポーツの指導が出来ないかと思い開発しました。

学校や部活動があるため、他の先生からの指導を受けられなかった選手や、仕事の関係で指導ができなかった先生方の救いの場を作りたいと思った事がきっかけです。 

##言語　Kotlin
言語はKotlinを使用しました。本屋さんに行き[書籍を購入](https://www.amazon.co.jp/dp/B07SC5WVPY?tag=keiji009-22&linkCode=ogi&th=1&psc=1)。

2020/7当時はAndroidやKotlinに関しての書籍が少なかったので、この本には沢山助けられました。Androidアプリを開発してみたいと思っている方は是非読んでみて下さい。

##Firebase
バックエンドの処理はFirebaseを利用しました。 [Firebase公式ページ]
(https://firebase.google.com/?hl=ja)

Firebaseを利用する事でアプリ開発が簡単になるので、ちょっとしたアプリを開発する際は利用していきたいと思っています。

初めての開発にチャレンジするという方が居れば、Firebaseを活用してみて欲しいです。私は今後Firebaseを利用しないアプリ開発にもチャレンジしようと思っています。


##完成までの道のり
制作期間は約3週間ほどでした。コーディングに夢中で気がつくと真夜中だったと、いうことも多々ありましたが、非常に充実した毎日を過ごしていました。

アプリの機能を決めコーディングしていましたが、途中で矛盾に気がつきコードを修正することもありました。設計書を見直す事と、事前に計画を立てる事の大切さを学びました。

Kotlinの言語を習得する事にも苦労しました。iOSアプリを開発した事があり、Swiftを知っていたので大丈夫だろうと甘く見ていたところ、痛い目にあいました。

SwiftとKotlin、どちらもアプリを開発するための言語ですが思想の違いが大きいです。Swiftで開発した事があるからAndroid開発も簡単にできるということは無いと思いました。

##今後
無事アプリを完成させる事ができました。

まだまだ粗が多いのでデザインやシステムを改善していきたいと思っています。

アプリのリリースに関してですが、「自分の作成したアプリは最後まで責任を持たなければいけない」というお話聞きその通りだと納得をした事がありました。

リリースして不具合が起きた時対応できるのか、金銭が関わる部分でトラブルが起きた場合自分で責任が持てるのか、色々と考えてリリースするかどうかは今後考えていこうと思います。自信を持ってリリースできるくらいの技術を身に付けたいです。

##最後に
自分の実現したい事をプログラミングを利用して表現することは非常に面白かったです。

KotlinやAndroidアプリに関しての日本語の参考書が少なく、最終的に海外の動画やサイトを参考にしながらの開発となりました。（今年に入り本屋に行ったところ、新書がたくさん出ていました！）

不具合はたくさん起こりましたが、何とか１つのアプリケーションを作りきる事ができ自信に繋がりました。

プログラマとしてはまだまだ未熟ですが、多くの人の役に立つアプリケーションを作成したいです。
localhost3000から抜け出せなくなった話

##今回起こったこと

・deviceの導入をしてユーザーログイン機能を実装。

・一度ログインをしてMySQLにも情報が登録されている状態。

・localhost:3000/users/sign_upで新規会員登録ページに行きたいのにlocalhost:3000にリダイレクトされる

##仮説
・Googleさんで調べてみるとルーティングが書けてないよ、という記事を多数発見。
→device導入時点でルーティング はできている。
![スクリーンショット 2021-02-04 11.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782402/fdfc1504-3e0f-f8c4-b287-bd666eb04469.png)



あぁ子供達こんにちは。。。

##結果
・一度試しにログインしたときの情報がそのまま残っている。現状はログインした後のページを作っていなかったがために、localhost:3000が返ってきていた。

・ページ上の情報が残ったままのため何度試しても同じページが表示される結果となった。

・ログイン後のページを作成していない状態で再度新規登録してMySQLへの登録が上手くいっているか調べたい場合は、履歴の残らないシークレットウィンドウでlocalhost:3000/users/sign_upへアクセスしてみよう！

なんとも絶妙な問題でした。。。

以上。
【Vue.js】axiosを使ってFirebaseとREST API通信

# はじめに
__目標__
Vue.js環境でJavaScriptライブラリであるaxiosを使ってFirebaseのCloud Firestore(データベース以下DB)とデータのやり取りをする。
なお、__最低限での実装__を目指しているため、urlの統一化やpost,getm以外のメソッドは扱わない。

##axiosのインストール
インストール

```vue
npm install axios
```

インポート

```js:main.js
import axios from 'axios';
```

##Firebaseの登録
~~画像はめんどくさいので~~文字列で、__手順を全て公開__。

1. [Firebase](https://firebase.google.com/?hl=ja)で使ってみるを選択
2. プロジェクトを追加（作成）
3. 名前を決める(vuejs-http等)
4. アナリティクスの設定
5. メニューからCloud Firestoreを選択しDBを作成
6. ロックモードとテストモードを選択（非公開or公開）
7. ロケーションの設定（サーバーの場所）適当でok

手順に沿っていけばプロジェクトが作れる。

##axiosの使用
__目標__
DBに送信と受信

###初期設定
__使用ファイルでのインポート__

```vuejs:app.vue
<script>
import axios from 'axios';
</script>

```

__URLの取得__
[Cloud Firestore REST API を使用する_REST 呼び出しの実行](https://firebase.google.com/docs/firestore/use-rest-api?hl=ja#making_rest_calls)

コピー→https://firestore.googleapis.com/v1/projects/YOUR_PROJECT_ID/databases/(default)/documents/cities/LA




###送信(post)

```vuejs:app.vue
<script>
axios.post(
        'https://firestore.googleapis.com/v1/projects/YOUR_PROJECT_ID/databases/(default)/documents/cities/LA',
        {
          fields: {
            sex: {
              stringValue: this.sex
            },
            name: {
              stringValue: this.name
            },
            comment: {
              stringValue: this.comment
            },
          }
        }
      )
</script>
```

第一引数: __URL__
firestore.googleapis.com/v1/projects/__YOUR_PROJECT_ID__/databases/(default)/documents/__cities/LA__

第二引数: __データ__
* __fieldsは必須__
* sex, name, commentが__送りたいデータ__
* __stringValueは型__ 



__YOUR_PROJECT_ID__
---
__自分のプロジェクトIDに変更__
1. Firebaseメニュー
2. ギアマーク（設定）
3. プロジェクトの設定
4. プロジェクトIDコピー
5. YOUR_PROJECT_IDを消して貼り付け

__cities/LA__
---
基本的になんでもいいが、project名を設定
例: comments

```vuejs
<script>
axios.post(
  'https://firestore.googleapis.com/v1/projects/プロジェクトID/databases/(default)/documents/comments',
)
</script>
```

###受信(get)

```vuejs:app.vue
<script>
axios.get(
      // url
      'https://firestore.googleapis.com/v1/projects/プロジェクトID/databases/(default)/documents/comments',
    )
    .then(response => {
      this.posts = response.data.documents;
})
</script>

```

thenで返ってきた__promiseオブジェクト__にアクセス、配列に格納。

__表示__したいときは

```vuejs:app.vue
<template>
<ul v-for="post in posts" :key="post.name">
    <li>
      <p>性別: {{post.fields.sex.stringValue}}</p>
      <p>名前: {{post.fields.name.stringValue}}</p>
      <p>コメント: {{post.fields.comment.stringValue}}</p>
    </li>
</ul>
</template>
```

#最後に
バックエンドを自分で構築せずともFirebaseを使えば機能が使えるため、フロントエンドの勉強をしている方にはおすすめ。
laravel nameメソッドのrouteとurlの違い

#はじめに
今回、ルーティングのweb.phpで使用されるnameメソッドとurlが少しややこしくなってきたので備忘録として纏めたいと思います。

#投稿者の環境
MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
macOS Big Sur バージョン11.0.1
PHP 7.3.23
Laravel Framework 6.20.7

###nameメソッドのパターン
nameメソッド付きのrouteはweb.phpで下記のように記述する

  ```web.php
Route::get('test','TestsController@index')->name('test.index');
```
上記のように`->name('test.index');`第二引数として渡すことにより使用できるのが特徴。また、分かりやすい名前も付けることができる。このように定義することにより下記のように使用できる。

```sample.blade.php
<a href="{{ route('test.index') }}">
```

#urlのパターン
laravelの公式では`urlヘルパは、アプリケーションに対する任意のURLを生成するために使用されます`
という風に記載されている。つまり、`相対パスを一言一句間違えずに指定しないと遷移できない`というルールが設定されている。

```view.blade.php
<a href="{{ url('/story/index') }}">ストーリーに遷移する</a>
```
間違えると、そんなルートはありませんという風にエラーが発生するようになる。

#最後に
如何でしょうか?
個人的にはnameメソッドで統一するほうが他人から見ても分かりやすく尚且つコーディングしやすいというメリットがあるのでやってみたいと思いました。もし間違いがあればツッコんで欲しいと思います。
Flutter パッケージの導入方法

今回の記事はFlutterでのパッケージ導入方法のまとめになります。

# パッケージの選択

自分の使いたいをパッケージを[pub.dev](https://pub.dev/)から探します。

# パッケージ選択後

installingという欄があるのでクリックすると、下の画像のように導入までの手順が表示されます。
<br>

表示されている通り順に上から進めていきましょう。<br>![スクリーンショット 2021-02-04 9.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/0d206b94-7047-e068-9282-10577aeaa265.png)

# パッケージの追加
dependencies:の下に一文追加します。
![スクリーンショット 2021-02-04 10.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/dcae1323-4234-08c4-ad08-3290b6750a7a.png)

今回は、[shared_preferences](https://pub.dev/packages/shared_preferences)を例として追加しています。
文頭は揃えるように記述してください。
<br>
その後上部に表示されているFlutter commandsのPackage getをクリックでインストールが開始されます。[^*]![スクリーンショット 2021-02-04 10.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/39e5bd42-0d06-1c6e-1f37-19817f8f3512.png)

もしくは任意のディレクトリへ移動し、下記のコマンドを入力します。
`flutter pub get`

# パッケージの使用
使用するファイルにimport文を追加します。

```dart
import 'package:shared_preferences/shared_preferences.dart';
```
追加することでインストールしたパッケージが使用可能になります。
お疲れ様でした。
ここまでご覧戴き、ありがとうございました。

<br>
<br>
<br>
![スクリーンショット 2021-02-04 11.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/be1bc7f8-4716-459a-2c08-ec31cf0b9efa.png)
余談ですが、このようにバージョンはどんどん更新されていくのでパッケージは公式をこまめに確認したほうが良さそうですね。


[^*]: エラーが表示される場合、プロジェクト名がパッケージ名と被っている、パッケージの記述が誤っている等の可能性があるので確認してみてください。
WSH/JScriptでOutlookの予定表を取得する

Excel VBAでOutlookの予定表を取得する記事は多数あったが、JScriptでの実装方法を記した記事はほとんど見つからなかったので備忘録としてまとめる。
[公式リファレンス](https://docs.microsoft.com/ja-jp/office/vba/api/overview/outlook)を見ながら手探りで作ったのでおかしな点があるかもしれない。（そもそも公式のサンプルもVBやC#ばかりでJScriptでのサンプルは見当たらない）
あと、JScript触れたのは今回が初。

```javascript

var START = "2021/2/1";
var END = "2021/2/4";

// フォルダーの種類を指定
var olFolderCalendar = 9;   // 9が予定表を指す

// outlookオブジェクトと名前空間生成
var olObj = new ActiveXObject("Outlook.Application");
var olNameSpace = olObj.GetNamespace("MAPI")

// フィルタを設定して予定表を取得
var appointments = olNameSpace.GetDefaultFolder(olFolderCalendar).Items;
appointments.Sort("[Start]");           // 開始日でソート
appointments.IncludeRecurrences = true; // 定期的な予定も検索に含める。通常、定期的な予定は特定の日付と関連していないため取得されない。
appoObj = appointments.Find("[Start] >= '" + START + "' And [Start] <= '" + END + "'");

// 取得したAppointmentItemsから予定取得
while(appoObj){
    // ここでは題名、開始時刻、終了時刻、会議出席者を取得している
    WScript.StdOut.WriteLine(appoObj.Subject + "," + appoObj.Start + "," + appoObj.End + "," + appoObj.RequiredAttendees);
    // 次の予定へ
    appoObj = appointments.FindNext;
}
```

# リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/overview/outlook
Win10起動時に仮想デスクトップ番号を指定してアプリを立ち上げる

# はじめに

皆さんはPCを使う時に必ず起動するアプリーケーションはありますか？
調べ物で使う方はウェブブラウザ、仕事で使う方はチャットツールなど、何かしら一つは絶対に起動しておきたいアプリがあると思います。

僕は仕事用のPCでは、必ず5つのアプリケーションを起動しています。
そして今までは毎回これらを手動で起動していました。正直、「PC起動→アプリ①起動→仮想デスクトップ移動→アプリ②起動→アプリ③起動→...」なんて面倒くさいですよね？

Windown標準搭載のスタートアップなんていう便利なものもありますが、これでは仮想デスクトップ番号を指定することはできません。（※ただし、こちらも使います）

ここではタイトルの通り、**Win10起動時に仮想デスクトップ番号を指定してアプリを立ち上げる**方法をご紹介します。


# 手順と準備

おおまかな手順としては「バッチファイル作成→スタートアップに登録」だけです。

バッチファイルを作成するうえで、便利なコマンド[VDesk](https://github.com/eksime/VDesk)があるのでインストールしてください。
※パスを通してvdeskコマンドが使えるようになったら次に進んでください。


# 実際に作成

## 1. 開発ディレクトリの作成

僕は`C:\Users\[user]\Documents\`に`myStartup\`を作成しました。
任意のフォルダ(場所も名前も)で構いません。

## 2. 起動させたいアプリケーションを追加

起動させたいアプリのショートカットを先ほど作成したフォルダに入れます。

これはスクリプトで起動しやすくするためなので、アプリの起動ファイルが分かっていればここに入れる必要はありません。未検証ですが、コマンドラインで起動できるアプリもショートカットを作成する必要はなさそうです。

## 3. 起動スクリプトの作成

### コード

同フォルダに`myStartup.bat`を作成し、コードを書いていきます。

```batchfile:myStartup.bat
@echo off

call :Open 1 true "C:\Program Files\foobar\foobar.exe"
call :Open 2 false "C:\Users\[user]\Documents\myStartup\app1.lnk"
call :Open 2 true "C:\Users\[user]\Documents\myStartup\app2.lnk"
call :Open 3 false "C:\Users\[user]\Documents\myStartup\app3.lnk"
call :Open 3 true "C:\Users\[user]\Documents\myStartup\app4.lnk"


:Open
  if exist %3 (
    vdesk on:%1 noswitch:%2 run:%3
  ) else (
    timeout 1
    goto :Open
  )
exit /b
```

### 説明

核となるのは`:Open`内の2行目`vdesk`コマンドです。
詳しくは[VDeskのREADME.md](https://github.com/eksime/VDesk)をご覧ください。

このコマンドが行っているのは、

- 仮想デスクトップ1番でfoobarアプリを起動
- 仮想デスクトップ2番でapp1アプリを起動
- 仮想デスクトップ2番でapp2アプリを起動
- 仮想デスクトップ3番でapp3アプリを起動
- 仮想デスクトップ3番でapp4アプリを起動

です。

## 3.5 補足

最終的にフォルダの内容はこんな感じです。

```
C:\Users\[user]\Documents\myStartup\
├─ app1.lnk
├─ app2.lnk
├─ app3.lnk
├─ app4.lnk
└─ myStartup.bat
```

## 4. スタートアップに登録

先ほどのバッチファイルのショートカットを作成し、エクスプローラのアドレスバーに`shell:startup`と入力してください。このフォルダにショートカットを入れれば作業終了です。

PCを再起動して確認してみましょう。
コーヒーを淹れてお待ちください☕
mysqlでjsonデータからクォーテーションを付けずに情報を抜く方法

下記だと、ダブルクォーテーションが入る

```
SELECT JSON_EXTRACT('json', '$.like');
-- "にんじん"
```

これですっきり

```
SELECT json ->> '$.like';
-- にんじん
```


https://dev.mysql.com/worklog/task/?id=9124
ローカル開発環境の構築 macos

#Virtualbox インストール
https://www.virtualbox.org/

#Vagrantインストール
https://www.vagrantup.com/

```
/////BOXの取得とインストール/////
BOXの取得(http://www.vagrantbox.es/)

vagrantを作成したいフォルダに移動
cd ~/MyVagrant/MyCentOS

vagrant box add [boxの名前] [コピーしたURL]
$ vagrant box add MyCentOS https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

・インストールされたか確認
$ vagrant box list

・仮想マシンの初期化
vagrant init [boxの名前]
$ vagrant init MyCentOS

・仮想マシンの起動
$ vagrant up

・仮想マシンの状態を確認
$ vagrant status
runningになっていればOK

・仮想マシンにログイン
$ vagrant ssh

・OSを最新状態にアップデート
$ sudo yum -y update

・スクリプトを入手するためのgitをインストール
$ sudo yum -y install git

/////httpdをインストール/////
$ sudo yum -y install httpd
$ sudo systemctl start httpd.service
$ sudo systemctl enable httpd.service
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

/////phpをインストール/////
$ sudo yum -y install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt

httpdを再起動
$ sudo systemctl restart httpd.service

PHPのバージョンを確認
$ php -v

参考(https://qiita.com/AkihikoIkeda/items/6e886f74a934e0ddfcab)

/////MySQLをインストール/////

MySQL互換のデータベースサーバー念のため削除
$ yum remove mariadb-libs
$ rm -rf /var/lib/mysql/

リポジトリの追加
$ yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

インストール
$  yum -y install mysql-community-server

バージョンの確認
$ mysqld --version

MySQLの起動
sudo service mysqld start

root権限をもつ
$ sudo su 

MySQL初期パスワードの取得
$ less /var/log/mysqld.log
下記の場所
[Note] A temporary password is generated for root@localhost: {パスワード}

初期パスワードを使ってログイン
$ mysql -p

初期パスワードの変更
$ set password for root@localhost=password'(新しいパスワード)';
```

#CybeyduckでVagrantに接続
参考：http://americandog1993.hatenablog.jp/entry/2017/07/24/215101

###・Vagrantfileの下記の部分のコメントを外す

```
 #config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "private_network", ip: "192.168.33.10"
```

###・Vagrant再起動

```
$ vagrant reload
```

###・ファイル書き込み権限変更

```
$ sudo chmod -R 777 /var/www/html
```

###・Cyberduckに接続してファイルの書き込み等を行えるか確認

#phpMyAdminに接続

###・ダウンロード
https://www.phpmyadmin.net/

###・ダウンロードしたファイルを解凍して/var/www/html/に置く

###・ブラウザで確認
http://192.168.33.10/phpMyAdmin-5.0.4-all-languages/index.php

#####エラーが出た場合はphp-mysqlをインストールする
mysqli 拡張がありません。PHP の設定をチェックしてみてください。 詳しくはドキュメンテーションを参照してください。

```
$ yum install --enablerepo=remi,remi-php71 php-mysql
```

###Apacheを再起動

```
$ service httpd restart
```

###ブラウザで再度確認
http://192.168.33.10/phpMyAdmin-5.0.4-all-languages/index.php

###phpMyAdmin接続後のエラー対応
https://gray-code.com/php/management-database-by-phpmyadmin/
R studio の設定

# はじめに
R の統合開発環境である、R studio を使うときの設定についてまとめた記事になります。自分の備忘録として、残しておきたいと思います。

R studio のバージョンは 1.4.1103 です。

# 表示のズームアウト
最初の設定ですと、表示が大きく操作性が悪いと感じました。
![view_actual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/cd6d2255-d6a9-c2ab-5604-a22b68c473cb.png)

ので、表示サイズを変更します。「View」→「Zoom Out」を三回ほどクリックしました。
![view_zoom_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/bf0bbe90-21b9-3748-e637-e1a46bf1604a.png)

少しすっきりしたかとは思います。


# 作業ディレクトリの指定
「Tools」→「Global Options...」をクリックして、設定のパネルを開きます「General」→「Basic」を選択すると以下の画面が出ます。
![directory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/42ecebfb-86e0-23c0-04f8-f478ccb998f4.png)

赤線で囲った部分で作業ディレクトリを指定します。ディレクトリ指定後に下部の「OK」をクリックすれば設定完了です。

# おわりに
エディタやカラーなどのこだわりはないので、とりあえずデフォルトのまま使ってみたいと思います。もし変更した場合は随時この記事を更新していく形で、残したいと思っています。
🔰重複しない要素のみを取り出した計算式

# 今日の問題はこちらでした
---
任意の3つの数値の合計を出力するメソッドを作りましょう。
ただし、同じ数が含まれている場合は
合計にカウントされません。

出力例：
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0

---
正直問題の意味がわかりませんでしたが例を見ると同じ数字は全てカウントされなくなると言うものでした。
確率の計算とかにもいいかもしれませんね。

答えがこちらです。

```ruby
def lone_sum(ary)
  # ①配列から、重複しない要素のみ取り出す
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # ②uniq_nums配列内の合計
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end

  puts sum

end
```
①の処理で重複していない値のみを取り出し②の処理で合計を求める処理を行っています。
例文でもあったlone_sum([3, 2, 3])の場合を見てみましょう。
この場合ary.each do |num|の処理で３になります。
その後i=3,2,３となり重複するとcountが増えるようになります。
num=3の時はcount=2となるのでuniq_numsの配列に値は追加されずこれを後に二回繰り返すと、配列には２
だけが追加されます。
そして②でuniq_numsの合計を求めます。この場合は
sum = sum + 2、つまりsum = 0 + 2となります。として合計は２となります。

---
正直この問題は全くわかりませんでした。
そして比較演算式の知識もまだまだなと実感させられた問題でした。
【CSS】スマホを横にしたときに文字が大きくならないようにする　-webkit-text-size-adjust : 100%

iPhone や Android のブラウザは、縦向き (Portrate mode) や横向き (Landscape mode) にすると文字サイズを自動調整する機能があります

ただ、それがかえって読みづらい場合は、文字の大きさが変わらないように制御してあげる必要があります

CSS の -webkit-text-size-adjust　で制御可能です

```
-webkit-text-size-adjust
```

## 使い方

デフォルトはautoで文字の大きさが自動調整されるようになっています
これを100%で指定します

```css
body {
  -webkit-text-size-adjust: 100%;
}
```

これで文字の大きさは縦横変わらなくなります

ちなみにnoneを指定するとスマホはいいのですが、PCで拡大表示にしたときに文字の大きさだけが拡大されず、表示に支障が出ます

```css
-webkit-text-size-adjust: none
```

文字の大きさはサイトの見やすさに大きく影響します
読みやすいストレスのないサイトにするために-webkit-text-size-adjustを設定しましょう
Angularの省略表記についてのメモ


##きっかけ
初めてconstructorの引数を見たときに、処理の内容がわからず混乱した。


##理解した方法
- 省略されているコードを分解して理解した。備忘録として残す。

```typescript

class Dog { 
  //コンストラクター
  constructor(private categry: string, private weight: number){}
  
  // toStringメソッド
  public toString {
    return this.category + ':' + this.weight + 'kg'
  }
} 

let name = new Dog('豆柴', 8);
console.log(name.toString()); //結果：豆柴：8kg

```

```typescript
//以下のコードと同じ

class Dog{
  //privateプロパティ
  private category: string;
  private weight: number;
  
  public constructor(category: string, weight: number) {
    this.category = category;
    this.weight = weight;
  }

  // toStringメソッド
  public toString {
    return this.category + ':' + this.weight + 'kg'
  }
} 

let name = new Dog('豆柴', 8);
console.log(name.toString()); //結果：豆柴：8kg
```
正規表現チートシート

正規表現について自分なりにまとめました。

#1. 量指定子

任意の文字の後ろに記述し、その直前の文字の回数を指定する。
　例) `ab*c` = a と c の間に 0 個以上の任意の数の b がある (ac, abc, abbc, abb...bc)

|量指定子|意味|
|:---:|---|
|*|0 回以上の繰り返し|
|+|1 回以上の繰り返し|
|?|0 または 1 回<br>"ab?c" の場合、"ac" または "abc" にマッチ|
|{n}|n 回の繰り返し|
|{n,}|n 回以上の繰り返し|
|{n,m}|n 回以上 m 回以下の繰り返し|

#2. メタ文字

文字クラス ("\" + 文字) については、文字が大文字の場合は小文字の場合の反対の意味になる。
　例) `\d` = 半角数字 (0~9) → `\D` = 非半角数字 (0~9 以外)
Java など、プログラム中で使用する場合は大抵 "\" をエスケープする必要があるので注意 (`\\d` とするなど)。

|メタ文字|意味|
|:---:|---|
|^|行頭|
|$|行末|
|.|改行以外の任意の 1 文字|
|\w|英単語を構成する文字 (a~z, A~Z, _, 1~9)|
|\d|半角数字 (0~9)|
|\a|英字 (a~z, A~Z)|
|\l|小文字英字 (a~z)|
|\u|大文字英字 (A~Z)|
|\s|空白文字 (半角スペース, \t, \n, \r, \f)|
|\b|単語の境界<br>`you\b` で "you" にマッチするが "your" にはマッチしない|
|[abc]|[ ] 内の文字に一致<br>この場合 a, b, c のいずれか|
|[a-z]|[ ] で文字を指定する際に文字コードの範囲で指定<br>この場合、a~z のいずれか|
|[^a-z]|[^ と ] で囲った内の文字以外となる<br>この場合 a~z 以外の文字
|( )|グルーピング<br>`I have( not)? a pen.` で "I have a pen." または "I have not a pen."|
|pattern1&#124;pattern2|文字列 pattern1 または pattern2|
|(?!pattern)|文字列 pattern 以外 (否定先読み)<br>`(?!.*pattern).*` で pattern を含まない文字列にマッチする|

#3. キャプション

キャプションと呼ばれる機能により、( ) で括った内容は先頭から順に \1, \2, ... という名前の変数に格納される。
これにより一度出現した文字列を再利用することができる。
例えば、ある 3 文字で始まり、その 3 文字の逆順で終わる (123xxxxx321 など) 文字列にマッチするには下記のように記述する。

```
(.)(.)(.).*\3\2\1
```

キャプチャしたくない場合は `(?:pattern)` のように pattern の前に `?:` を記述する。
世界一簡単かもしれない剣の作り方(Blender2.83LTS) qiita版

![アイキャッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/be01b930-4d82-78e2-2908-d5b177747571.png)

# この記事でできること
- ダンボール工作のように、Blender2.83LTSで、「かんたんな剣」を作ることができます。

## 注釈
- 下図③の「辺」を「削除」ですが、「辺」を選択した状態で、右クリックのメニューからメニュー最下部の**「辺を削除」**を選択します。
- 英語表記の場合は、**「Delete Edges」**を選択することになります。

![a01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/27a148e1-6d80-0498-3e96-592689ff4c75.png)

- もし、他にもっと簡単な作り方がありましたら、ぜひご指摘くださいmm
- ④〜⑥の工程が一発でパーっとできそうな気もする・・・

noteの方にも同様の記事を転記しております。([リンク](https://note.com/notes/new))
CentOS Linux 8のサポート終了についてのGMOさんの見解

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---

GMOさんが、CentOS Linux 8のEOL問題と今後の対策について、見解を提示してくれています。URLのみを貼っておきます。

[CentOS Linux 8のEOL問題と今後の対策について](https://academy.gmocloud.com/qa/20210129/11154)

「CentOS Linux 8のEOL(サポート終了)が発表されました。CentOS Linux 8のEOLが2029/05/31から2021/12/31に変更され、CentOS Linux 9のリリースもないということもあり、現在CentOSを利用されている方は、今後どうしたら良いのか、悩んでいる方も多いのではないかと思います。今CentOSに何が起きているのか？これからどうしていくのが望ましいのか、わかりやすく記事化いたしましたので、ぜひご活用ください。」とのことです。

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
Djangoのモデルオブジェクトをコピー

## 環境
- django 3.0.3

## まるまるコピー
インスタンスの`id`を空にして保存したら、新規で登録できます。

```
product = Product.objects.get(pk=id)
product.id = None
product.save()
```

## テキストを変更してコピー
商品タイトルを変更したい場合は、商品タイトルを上書きして保存。

```
product = Product.objects.get(pk=id)
product.id = None
product.title = "商品名2"
product.save()
```

## 色々加工してオブジェクトのコピー
ここでは以下のことをしています。

- 元のオブジェクトからデータを引き継いで一部加工
- リレーションは改めて登録
- sku（商品固有、関数実行）の値を変更

```
from django.forms import model_to_dict

copy = Product.objects.get(pk=id)
# リレーションと変更したいカラムは除外しておく
kwargs = model_to_dict(copy, exclude=['id', 'shop', 'title', 'sku'])
product = Product.objects.create(
            title=copy.title + ' のコピー', # 元のオブジェクトからデータを引き継いで一部加工
            shop_id=copy.shop_id,
            sku=uuid.uuid4(), # 関数実行した結果の値
            **kwargs
         )
```
doxygen（C言語）の書き方

基本的にはこちらのサイトを参照。
[Doxygen 書き方メモ (C, C++)](https://qiita.com/inabe49/items/23e615649e8539d857a8)

## マクロに対するコメントが生成されない場合

`@def`なしでコメントを書くと生成されます。

```c
/**
 * 詳細コメントを書く
 */
#define HOGE 10

//! 簡単なコメントを書く
#define HOGE 10
```

## 構造体に対するコメント

```c
//! コメントを書く
typedef struct {
  int hoge;
} Hoge;

```
git initからリモートへpushの手順（VSCode）

# はじめに
もうさまざまな場所で書かれた内容かと思いますが、自分がよく忘れるので備忘録として。
間違っている点もあると思うのでご指摘ただければ幸いです。

# 手順
1. リモート：まずgithub等でpush先となるリポジトリ作成
2. ローカル：gitで管理したいディレクトリで`git init`
3. ローカル：リモートリポジトリを登録

    `git remote add origin [git@github.com](mailto:git@github.com):user/repo.git`

    VSCodeでは以下でも可能

    Remoteからadd Remoteを選択

    GitHubからレポジトリを選択

    remote nameを登録 (多分なんでもいいけど `origin`が無難、以下は`origin`で進める)

4. `git push origin main` 

    ブランチ全体をpushするなら以下

    `git push -u origin --all`

    VSCodeならpushから
RのsummaryをPythonへ 

# 初めに
今現在、R の基礎を勉強しております。自己学習のため、R コマンドを Python で実装してみたらどうなるか、を書きながら R, Python どちらもある程度使えるようにしたいというのが目的です。

# R の`summay`コマンド
何人かの身長に関する統計情報を表示したい場合、以下のようなコマンドを打つことになります。

```R:コード
height <- c(173, 178, 180, 183, 182, 174, 179, 179, 174, 192)
summary(height)
```
```:出力
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  173.0   175.0   179.0   179.4   181.5   192.0 
```
最小値、第一四分位数、中央値、平均値、第三四分位数、最大値を表示してくれます。

# Python へ
それぞれの統計量を別々に求めてもいいのですが、pandas の DataFrame の `describe` が使えそうですね。

```python:コード
import numpy as np
import pandas as pd

height = np.array([173, 178, 180, 183, 182, 174, 179, 179, 174, 192])
df = pd.DataFrame(height)
print(df.describe())
```

```:出力
                0
count   10.000000
mean   179.400000
std      5.581716
min    173.000000
25%    175.000000
50%    179.000000
75%    181.500000
max    192.000000
```

要素数、平均、標準偏差、最小値、第一四分位、中央値、第三四分位、最大値を表示してくれます。

#おわりに
Pythonも全てを`print`文の中に放り込んでしまえば１行で書けますが、何してるか分かりやすくするため、dfという変数を定義しています。こんな感じで簡単ではありますが、R, Python ともに理解を深めていきたいと思います。
【Swift】UITextFieldに入力中の場合に処理をアレコレする

# どういうことか

任意のtextFieldに**入力中**の文字を取得してみるとか、入力中の文字で `if` してみたりとかする。

## editingChangedを使うといいみたい

```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        
        freeTextField.addTarget(self, action: #selector(self.yobidashi(_:)), for: UIControl.Event.editingChanged)
    }
    
    @objc func yobidashi(_ textField: UITextField) {
        // 入力があるたびに呼び出される
        print(textField.text!)

        if textField.text == "どうですか" {
            print("できました")
        }
    }
```
format関数にキーワード引数を段階的に指定する小技

## format関数にキーワード引数を段階的に指定する小技

検索で見つからなかったので、投稿しておきます。

+ format関数にキーワード引数を指定

```
filename = 'epoch_{epoch}_id_{id}.png'

epoch=100
id=1000

filename2 = filename.format(epoch=epoch, id=id)
print('filename2 : ' + filename2)
```

```
filename2 : epoch_100_id_1000.png
```

+ キーワード引数を一部しか指定しないと...

```
filename2 = filename.format(epoch=epoch)
```

```
KeyError                                  Traceback (most recent call last)
<ipython-input-3-62421f7ed55c> in <module>()
----> 1 filename2 = filename.format(epoch=epoch)

KeyError: 'id'
```

+ キーワード引数を段階的に指定するには...

指定しない段階では、key1='{key1}'と指定する。

```
filename2 = filename.format(epoch=epoch, id='{id}')
print('filename2 : ' + filename2)

filename3 = filename2.format(id=id)
print('filename3 : ' + filename3)
```

```
filename2 : epoch_100_id_{id}.png
filename3 : epoch_100_id_1000.png
```
Matlabのprint()をPythonで

Pythonでプロットといえばmatplotlibというモジュールが有名。
Matlab的なプロットをだいたいやってくれるモジュール。

Matlabではプロットをファイルに保存するときは```print()```を使うが
matplotlibでは基本的には ```matplotlib.pyplot.savefig()```を使う

また、複数のプロットを複数ページのPDFにまとめる、というのはMatlabでは（たぶん）できないのだが（たしかｐｓではできた気がする）
matplotlibには```matplotlib.backends.backend_pdf.PdfPages()```というのがあり、これで簡単にできる。

他にも、Matlabではpagesizeを設定しないとfigureの画面とPDFで余白とかに差ができるのだが
matplotlibではfigsizeで指定した大きさでPDFが出てくるので直感的だと思う（個人的な意見だけど）

#例: in Matlab
```matlab
fig = figure()
x = normrnd(0, 1, 100);
y = normrnd(0, 1, 100);
plot(x, y, '.')
print(fig, '~/Desktop/example.png', '-dpng', '-r300')
print(fig, '~/Desktop/example.pdf', '-dpdf')
```
Matlabの場合、保存形式は'-dpng'とか'-dpdf'とかのオプションで指定。

#例: in Python
```python
import os

import matplotlib.pyplot as plt
import numpy as np

x = np.random.normal(size=100)
y = np.random.normal(size=100)

fig, ax = plt.subplots()
ax.scatter(x, y)

plt.savefig(os.path.expanduser('~/Desktop/example.png'), dpi=300)
plt.savefig(os.path.expanduser('~/Desktop/example.pdf'))
```

複数ページのPDFを作りたい場合

```python
import os

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for n in range(3):
    x = np.random.normal(size=100)
    y = np.random.normal(size=100)

    fig, ax = plt.subplots()
    ax.scatter(x, y)
    pdf.savefig()

pdf.close()
```
と、言う感じでPdfPagesオブジェクトのsavefigメソッドを呼ぶとactive figureが末尾に追加されていく。

```PdfPages.savefig(figure)``` と引数を指定すると、どのfigureを保存するかも選べる
これを使うとプロットするときにfigをリストにでも入れておいて、まとめて保存するとか

```python
figs = []
for n in range(3):
    x = np.random.normal(size=100)
    y = np.random.normal(size=100)

    fig, ax = plt.subplots()
    ax.scatter(x, y)
    figs.append(fig)

pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for fig in figs:
    pdf.savefig(fig)
pdf.close()
```

プロットしたあとで、```pyplot.get_fignums()```で開いているfigureを全部取ってきて保存するとか

```python
for n in range(3):
    x = np.random.normal(size=100)
    y = np.random.normal(size=100)

    fig, ax = plt.subplots()
    ax.scatter(x, y)

pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for fig in plt.get_fignums():
    pdf.savefig(fig)
pdf.close()
```
といったこともできる。

冒頭で触れたpapersizeの話とかも含めて、PDFに書き出すという点ではmatplotlibの方がMatlabより便利。
[Swift]iOSアプリをAppStoreに申請したので備忘録


基本的にはこちらの記事を見れば全てOKです。

>https://qiita.com/Labi/items/3b71b8f5ef065904c1de

自分はスクショを貼るところでものすごい苦戦したので、やりやすい方法を

まずiPhoneやiPadに応じたピクセルを知る場所はここ

>https://qiita.com/tomohisaota/items/f8857d01f328e34fb551

Xcodeのシミュレーターを起動し、command + shift + 5を押して範囲を選択し、スクショを撮った後
その画像を開き、上のツール→サイズを調整→![スクリーンショット 2021-02-04 9.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586415/321cd7b3-34aa-fa99-a46a-b98f5bb121c8.png)

このようにします。🔓マークは解錠状態にし、数値をいじれるようにしましょう。


あとプライバシーポリシーですが、Qiitaの限定記事共有にプライバシーポリシーを記載し、申請の際にはそのURLを使わせていただきました。

プライバシーポリシーって何？どう書けばいいの？って方は
こちらの記事が参考になります。

>https://qiita.com/Hiroki_Kawakami/items/94f012d20afdb692df20

上記記事で紹介されていますが、英語のサイトで必要箇所を埋めるとプライバシーポリシーを自動生成してくれるサービスがあります。自分はそれを利用しました。

自分は申請してから10時間くらいで審査を通り、その30分後には配信が開始されました。
レコードが存在しない時のfindとfind_byの違い

#はじめに
ポートフォリオ作成中の初心者です。
備忘録として残しています。誤りがあればご指摘いただけると幸いです。

#findとfind_byの違い

https://qiita.com/em_maeda/items/c333bb9c1d30a7c40d30

学習当初からActiveRecordのfindやfind_byの挙動で引っかかることが多い。

#findメソッドはnilを返さない
findメソッドはレコードが存在しない時はnilを返さない。
例外が返ってくる。

---
ユーザーの詳細表示ページを他のユーザーから見られないようなメソッドを作っていた

```ruby
 def correct_user
    @user = User.find(params[:id])
    if @user == nil || @user != current_user
      redirect_to(root_url)
    end
  end
```

これだとCould`t find User with 'id' =...と例外が返ってくる。

正しくは

```ruby
 def correct_user
    @user = User.find_by(id: params[:id])
    if @user == nil || @user != current_user
      redirect_to(root_url)
    end
  end
```

正しく動作しました。