OmniAICreator/Qiita-1.07M huggingface dataset:
Update内で処理を待つ


N秒おきにＣＵＢＥの表示をONOFFする。

# task/async/await
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;

public class Delay2 : MonoBehaviour {

	void Start () {
	}
	async Task Update () {

		await Vanish();//1secまって消す

		if( gameObject.active == false) {
			//1secまってつける
			await Task.Delay (1000*1);
			gameObject.SetActive (true);

		}
	}
    async Task Vanish () {
        await Task.Delay (1000*1);
        gameObject.SetActive (false);
    }
}

```

# メモ：
久しぶりに使ったらハマったのでメモ

```

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;
public class Delay : MonoBehaviour {
	void Start () {
		Func3(); //これは遅延する
	}
	async Task Update () {
		//Func3(); //ここから読んだら遅延しない。
	}
	async void Func3() {
		int cnt = 0;
		await Task.Delay(1000);
		Debug.Log(cnt.ToString());
		cnt++;
		await Task.Delay(1000);
		Debug.Log(cnt.ToString());

		cnt++;
		await Task.Delay(1000);
		Debug.Log(cnt.ToString());
	}
}

```
WordPressでMasonryを使う注意点（horizontalOrderは特に）

# WordPressでMasonryを使う注意点
Masonry、便利ですよね。
タイルレイアウトとか、Masonryレイアウト（まんま）とか色々呼び方はありますが、
右から左の余白詰めのレイアウトを作るときに本当に重宝します。

つい先日、ある案件でWordPressでMasonryを使う必要があり、
いつものようにjQueryプラグインを導入していたんですが……
（ローカルにMasonryをダウンロードしてきて、functions.phpに以下のように追記する）

```php
if (!function_exists('dev_enqueue_scripts')) {
    function dev_enqueue_scripts()
    {
        wp_enqueue_style('theme-style', get_stylesheet_uri(), array(), '0.0.1');
        wp_enqueue_script('jquery');
        wp_enqueue_script(
            'masonry',
            get_template_directory_uri() . '/js/masonry.pkgd.min.js',
            array('jquery'),
            false,
            true
        );
.
.
.
```

そしてプラグインは以下のように実装する。

```js
    function masonry_execute() {
      var $grid = $j('.dev__cardlist' ); //適用したいクラスを指定
      $grid.on('layoutComplete', onLayoutComplete);
        $grid.masonry({
          itemSelector: '.m-card', 
          fitWidth: true, // <-これ！！
          resize: true, // <-これ！！
          gutter: 12, 
          columnWidth: 291,
          horizontalOrder: true // <-これ！！
        });
      }
```

おかしい。
動くが設定が反映されているように思えない。

念のためバージョンを確認すると、Masonryのv3では文言が異なるらしい。
一応v3用の書き方にしてみると、動く。

```js
    function masonry_execute() {
      var $grid = $j('.dev__cardlist' ); //適用したいクラスを指定
      $grid.on('layoutComplete', onLayoutComplete);
        $grid.masonry({
          itemSelector: '.m-card',
          isFitWidth: true, // <-動く…
          isResizeBound: true, // <-動く…
          gutter: 12,
          columnWidth: 291,
          horizontalOrder: true // <-動かない！！
        });
      }
```
しかし一番使いたい機能であるhorizontalOrderが機能してくれない。

冷静に、現在入っているMasonryのバージョンは最新なのにv4のoptionが効かなかったり、
horizontalOrderが動かなかったりと、非常に意味不明な現象に苛まれてしまった。

そこで開発ツールでソースを確認してみたところ、

<img width="255" alt="スクリーンショット 2020-05-18 16.21.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/cdc0b4d4-4dda-d0a8-1365-f5d571848bf5.png">
### **ver=3.3.2** !?!?!?

おかしいだろ！俺はちゃんと公式サイトからv4.2.2をダウンロードしたはず……！

そう。実はWordPress、
### 標準で**Masonry**が入っているんですね。

いや〜びっくり。つまり元あるMasonryとダウンロードしてきたv4のMasonryが競合した挙句、
デフォルトの古いMasonryを読み込んでしまっていたというわけですね。

原因がわかればこっちのもんじゃいと、functions.phpを書き換えます。

```php
if (!function_exists('dev_enqueue_scripts')) {
    function dev_enqueue_scripts()
    {
        wp_enqueue_style('theme-style', get_stylesheet_uri(), array(), '0.0.1');
        wp_enqueue_script('jquery');
        wp_enqueue_script(
            //'masonry', <- ここが競合してしまっている
            'dev_masonry', //<- 名前をユニークにしてしまえば良い
            get_template_directory_uri() . '/js/masonry.pkgd.min.js',
            array('jquery'),
            false,
            true
        );
.
.
.
```

これにて解決です。
デフォルトのMasonryは無事読み込まれなくなり、最新バージョンのものに置き換わりました。
これでhorizontalOrderもちゃんと使えるようになりましたとさ。

こんなところでめちゃくちゃスタックしてしまったことへの自戒と、
あとなんか検索したとき同じ症状の人けっこういたみたいなんで解決策を書いておこうかなと。

以上です。ありがとうございました。
【git】error: failed to push some refs to "URL"のエラー対処法

Rails で個人でアプリケーションを開発中です。
表題のエラーが出た際に、改めてgitの理解が深まりましたので備忘録として残します。

### 状況
開発中のタイミングで普段通り、「git pusu origin　ブランチ名」で、
ローカルの変更をリモートにpushしようとすると。。。

```console:terminal

git push origin develop
To https:///githubのURL !
[rejected]develop -> develop (non-fast-forward)error: failed to push some refs to 'https://githubのURL'

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

```
上記のエラーが出ました。

### 原因

このcommitを行う前に、私がリモートでgithubのREADMEの変更を行っていたことが
今回のエラーの原因でした。

「リモートのファイルがローカルのファイルも最新版だから、そのファイルにpushできないですよ」ということみたいです。

### 対処法

いくつか対処法があるみたいです。

#### ①git pull origin develop
git pull origin developでリモートの環境をローカルファイルにpullした後、
再度pushを行う。

#### ②git fetchした後、git mergeする

①とやっていることはほとんど変わらず、pull＝fetch + mergeという意味合いなのかと思います。

#### ③git push ––forceで矯正的にpushする

こちらは、個人開発なら自分一人しかリポジトリを操作しないので大きな影響はなさそうですが、
チーム開発の場合だと自分以外にcommitやpushする人がいる無闇に使用すべきでは無い、という記事をいくつか確認しました。

①か②で対処するのが無難かもしれません・・・（私は①で対処しました）

### 備考
「origin」や「master」の理解については、こちらの記事が大変参考になりました！

[Git - originとmasterとは何か(初心者向け)](https://qiita.com/seri1234/items/e651b3e108a695a92809)

### 2021/05/28追記

この記事を読んでくださってありがとうございます！
エンジニアとして駆け出しきれてもいない初学者時代に書いたので内容に不足・誤記などもあるかもしれません....

個人的には、初学者の方は一度こちらの書籍を読むことをオススメします！
わかりやすく、githubについて手を動かしながら体型的に学ぶことができます！

https://www.amazon.co.jp/GitHub%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-Pull-Request%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E3%81%AE%E5%A4%89%E9%9D%A9-PRESS-plus/dp/477416366X

### 2022/04/21追記

エンジニアになってから読んだ書籍をまとめました！
もしよければこちらも参照ください☺️(随時アップデートしていきます)

https://qiita.com/chiaki-kjwr/items/8a1eab87b09d0a1b4997
R 4.0.0 にさっさと移行しようと思ったたった一つの理由：新しいraw string記法【 r"" 】

###久しぶりにrocker/tidyverseベースのコンテナをリビルドしたら

```
R version 4.0.0 (2020-04-24) -- "Arbor Day"
Copyright (C) 2020 The R Foundation for Statistical Computing
```

ひぇっ？！
バージョン上がっとる！！

# まぁ慌てるもんでも無いか
一部のコードで非互換の部分が見つかったので、(細かい使用変更数カ所)
さっさと直してしまいました。
定期実行してる分の以降はもうちょい先でも良いかと思ったのですが...

# Regexとか書くのにチョー便利そうな「raw string」なるものが
使い方は 【""】 の代わりに 【r"()"】で文字列をはさみます：

```
> "(閉じカッコ以外の全ての文字😁  \¥/ バルタン星人)"
Error: '\�' is an unrecognized escape in character string starting ""(閉じカッコ以外の全ての文字😁  \�"

> r"(閉じカッコ以外の全ての文字😁  \¥/ バルタン星人)"
[1] "閉じカッコ以外の全ての文字😁  \\¥/ バルタン星人"
```

おええええ便利！！！

「")" 以外の全ての文字」がそのままエスケープせずに記入出来ます。
...メチャ楽やんけ！


いやバルタンは良いんですが、
過去何度、stringrの早見表を見ながらイライラしつつ
regexをR用に書き直したか...
<img width="522" alt="Screenshot 2020-05-18 at 16.13.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255842/9ba99673-97f3-6ca4-a984-56a0117db5c3.png">

```
えっと \\ で　\ だから...
あ、\\? で\?だから、
元々が \\?!// だったら、 \\\\\\?\!\/...........
```

とかから永遠に開放されました！！！
いやったぜR4!!!




元記事はこちらを拝見しました：
https://blog.revolutionanalytics.com/2020/04/r-400-is-released.html
python bit全探索

### 方法1
```python
>>> from itertools import product
>>> n = 3
>>> [[i for i, j in zip(range(n), mask) if j] for mask in product((0, 1), repeat=n)]
[[], [2], [1], [1, 2], [0], [0, 2], [0, 1], [0, 1, 2]]

>>> n = 5
>>> [[i for i, j in zip(range(n), mask) if j] for mask in product((0, 1), repeat=n)]
[[], [4], [3], [3, 4], [2], [2, 4], [2, 3], [2, 3, 4], [1], [1, 4], [1, 3], [1, 3, 4], [1, 2], [1, 2, 4], [1, 2, 3], [1, 2, 3, 4], [0], [0, 4], [0, 3], [0, 3, 4], [0, 2], [0, 2, 4], [0, 2, 3], [0, 2, 3, 4], [0, 1], [0, 1, 4], [0, 1, 3], [0, 1, 3, 4], [0, 1, 2], [0, 1, 2, 4], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
```
### 方法2
```python
>>> n = 3
>>> [[i for i in range(n) if bit & (1<<i)] for bit in range(1<<n)]
[[], [0], [1], [0, 1], [2], [0, 2], [1, 2], [0, 1, 2]]

>>> n = 5
>>> [[i for i in range(n) if bit & (1<<i)] for bit in range(1<<n)]
[[], [0], [1], [0, 1], [2], [0, 2], [1, 2], [0, 1, 2], [3], [0, 3], [1, 3], [0, 1, 3], [2, 3], [0, 2, 3], [1, 2, 3], [0, 1, 2, 3], [4], [0, 4], [1, 4], [0, 1, 4], [2, 4], [0, 2, 4], [1, 2, 4], [0, 1, 2, 4], [3, 4], [0, 3, 4], [1, 3, 4], [0, 1, 3, 4], [2, 3, 4], [0, 2, 3, 4], [1, 2, 3, 4], [0, 1, 2, 3, 4]]
```

## case: cpp
```cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  int N = 3;

  map<int, vector<int>> mp;
  rep(bit, (1 << N)) rep(i, N) if (bit & (1 << i)) mp[bit].push_back(i);

  for (auto x : mp) {
    cout << x.first << " : ";
    for (int n : x.second) cout << n << ' ';
    cout << endl;
  }
}
```
```:output

1 : 0 
2 : 1 
3 : 0 1 
4 : 2 
5 : 0 2 
6 : 1 2 
7 : 0 1 2 
```
Cypress：セッションを保持した状態でテストする

# はじめに
新天地で、社内システムの自動テスト化について取り組ませていただくことになりました。
テストは、独自ランナーが使いやすい、Cypressです。
英語がまったく読めないので、苦戦・・・
Chromeの翻訳機能に助けられながら、やったことをメモしておきます。
OSはMacです。

## 自動テストの概念
自動テストについて調べた結果、概念はこんな感じです。

- できるだけ簡単なコードで作成する
- 機能別・テスト名・コード単位で検索しやすい
- 簡単に更新できる
- ひとつのものをみんなで共有出来る
- 誰かに依存しない



## セッションを保持したまま、複数のテストを実施する
まずは、**ログインIDとパスワードを入れ、セッションを保持したまま別のテストを行う。**
という入り口的な部分。
試行錯誤をしましたが、以下の２点を活用しました。


### １．Cookieをファイル経由で保存する
参照サイト：[Cypressで送る快適E2Eライフ](https://qiita.com/aomoriringo/items/187af32eeac869182648)

上記サイト様を参考にして、Cookie情報を別のファイルに出力し、それを読み込むという手法。
ログイン処理をカスタムコマンドにし、ログイン〜Cookieの出力まで行います。

カスタムコマンドについてはこちら ▶ [公式ドキュメント](https://docs.cypress.io/api/cypress-api/custom-commands.html#Usage)


```cypress/support/commands.js

Cypress.Commands.add('login, () => {
  
  cy.url().then(url => {
    if(url === 'http://...'){

        console.log('relogin')
       
        cy.clearCookie('session_id')
 
        const login_id = Cypress.env('login_id') 
        const password = Cypress.env('password')

        cy.get('[name=login_id]').type(login_id).should('have.value', login_id)
        cy.get('[name=password]'). type(password,{ log:false }).should(el$ => {
          if(el$.val() !== password){
            throw new Error('Different value of typed password')
          }
        })
        cy.get('.submit').click()

        //セッションを保持
        cy.getCookie('session_id').should('exist').then((cookie) => {
        cy.writeFile("cache/cookie/session_id.json", {
          value: cookie.value
        })

      })
    }
  })

});


```

`cypress/support/commands.js`
内容としては、もし、アクセスしたURLがログインフォームと同じだったらば、clearCookieして再ログインしてね。
セッションがあればスルーされる部分です。

また、ログインIDとパスワードは、`cypress.json`ファイルに、環境変数としてセット。
真ん中の色々書いてある部分は、ログイン情報はセキュリティ上表示させないようにしてね、という処理。
ですので、ランナーのコマンドログにパスワードは表示されません。

　



```cypress/integration/login_spec.js


describe('Login Action',() => {
	/**
	 * セッション設定
	 */
	before('Session Setting', () => {
    	cy.readFile("cache/cookie/session_id.json").then(cs => {
      		cy.setCookie("session_id", cs.value)
    	});

        Cypress.Cookies.preserveOnce('session_id')
        cy.visit('URL')
  	});

	/**
	 * ログインチェック
	 */
	beforeEach ('Login Check',() => {
	      cy.login()
         
	})

	/**
	 * テスト処理
	 */
	it ('Test Case1', () => {
        // something assertion
        })
})

```

`cypress/integration/login_spec.js`
内容としては、セッションがあればテストを開始、
セッションが無ければ、再ログイン（カスタムコマンド）をしてからテスト開始。
`before`に、ファイルに出力されたCookie情報をreadさせて、beforeEachで再ログインの有無をチェック。
因みにbeforeEachはすべてのテスト（it)に当たるので、毎回再ログインチェックしている。
別に要らないんですけどね。。。:joy:
余計な処理も、Cypress速いからまあ良いでしょう。ということ。
　


### 2.Cypress.Cookies.preserveOnce('session_id')　を使う

[公式ドキュメント](https://docs.cypress.io/api/cypress-api/cookies.html#Syntax)

`cypress/integration/login_spec.js`
ファイルに出力されたCookie情報を、保持しておくことが出来るコマンドです。
跨いで保持することは出来ないようです。

```
Cypress.Cookies.preserveOnce('session_id')
```



##### おわりに
他にも、セッションについては永続的に保持しておけるlocalStorageの利用もひとつの手段かと思いましたが、なかなか実装が出来ず。
Cypressは便利な分、不安定な要素や、実装できない要素等まだまだあるようです。
npmモジュールを入れると、ランナーが起動しなくなるし、正しく実行できるテストも、5回に１回はなんとかエラーが出ます。（ホットリロードすると正常）

まだまだ勉強することはたくさんありますが、セッションの保持が一個クリア出来たので、記録します。
シンプルな方法ですが、初心者なのでこれからこれから。
他に良い方法や、おすすめの方法があれば教えていただきたいです。:bow_tone1:
Ubuntu 20.04 nvidia driverあり環境でログインループ解決

# 追記
[chromeリモートデスクトップでUbuntuがloopした時の対処](https://qiita.com/161abcd/items/bba7220cf2e9511a0f33)が上位互換の記事

# 現象
ubuntu 19.10から20.04に移行したnvidiaグラボ搭載PCで，ログインパスワードを打った後またログイン画面に戻る

# 解決法
先に結論

```bash
$ sudo apt purge chrome-remote-desktop
```



# 環境
nvidia環境インストール時のコマンド

```bash
$ sudo ubuntu-drivers install
$ sudo apt install nvidia-cuda-toolkit
```


調査に使用したコマンド

```bash
$ lsb_release -a
$ uname -a
$ cat /proc/cpuinfo
$ lspci
```

得られた結果のまとめ

```bash
Ubuntu 20.04 LTS
Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz
GeForce GTX 1060 6GB
```
macでパスワード付きZIPファイルを作成する方法

finder　からZIP化して、パスワードをかけると、永遠にパスワードを求められるようになったため、
ターミナルからZIP化、パスワードをかけることを推奨

ファイルの置き場に事前に移動
（余計なパス等もzip化されるため）

```
$ zip Sample.zip Sample.docx  
```

```
$ zipcloak Sample.zip
```

二回パスワードが求められるため、同じパスワード入力する


あとは念の為、解凍してみて、問題ないかを確認する。
WSL2(Windows Subsystem for Linux 2)環境でgitをhttps経由で利用するときに認証情報を保持する

# 背景
WSL2を利用することでWindwosでもLinux環境での開発を実現することができるようになった。しかし、WSL2でHTTPSプロトコルを使用してgitのリポジトリにプッシュしようとすると毎回、ユーザー名とパスワードの入力を求められる。この問題を回避するためにWSL2とGit for Windowsに付属しているgit-credential-managerを連携させる。WSL2とgit-credential-managerを連携することでgitリポジトリにpushをしても毎回ユーザー名とパスワードの入力を求められなくなる。

# Git for Windowsのインストール(Windows上）
もし、まだGit for Windowsをインストールしていなければ以下のサイトからダウンロードしてインストールを行う
https://git-scm.com/download/win

# WSL2上のgit-credientialとGit for Windowsのgit-credential-managerを連携(Linux上）
エディタでgit-credential-managerを開く

```
sudo vi /usr/bin/git-credential-manager
```
git-credential-managerに以下の内容を追記して保存する
(2024/2/6 追記) 
Git for Windowsの実行ファイル名がgit-credential-manager.exeからgit-credential-wincred.exeにファイル名が変更されたため、実行ファイル名を次のように記載する。(※１)
```
#!/bin/sh
exec /mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-wincred.exe $@
```

git-credential-managerの実行権限を付与する

```
sudo chmod +x /usr/bin/git-credential-manager
```

~/.gitconfigを開き、認証に関する設定（認証時に利用する認証マネージャーの設定）を追記する

```
[credential]
helper = manager
```

以上の設定で連携が完了する。これで初回のプッシュ時に認証情報を入力すると、以降同じリポジトリにプッシュしても認証情報は求められない。

# 参考ページ
https://blog.anaisbetts.org/using-github-credentials-in-wsl2/
https://stackoverflow.com/questions/72472443/git-credential-manager-not-found-on-wsl2

(※1)
git-credential-wincred.exeのパスを実行してうまく動作しない場合は、おそらく古いバージョンのGit for Windowsを使用していると思われるのでgit-credential-managerを指定する。もしくは新規にGit for Windowsを再インストールして、git-credential-wincredをパスに指定する。
```
#!/bin/sh
exec /mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe $@
```
セルで指定されたファイルパスを読み取り印刷する方法

## TL;DR（３行）
- セルで指定されたExcelファイルのパスを読み取り印刷できるようにする
- 例では，3つのファイルパスを読み取って印刷ダイアログを表示させます
- 印刷ダイアログを出さず連続で印刷する方法も紹介

## 前提条件
- デスクトップにTestフォルダーがある
- Testフォルダーの中に**BookA.xlsx, Book1.xlsx, Book2.xlsx, Book3.xlsx**が存在する
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/4101735d-192c-4bec-2d6b-2975c2b1b9aa.png)

- Book1.xlsx～Book3.xlsxは何が書かれててもとりあえず良い
- BookA.xlsxは，以下のようにBook1.xlsx～Book3.xlsxのファイルパスが記載されている
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/aafe5003-6489-fbf0-5965-a218b841f5e7.png)


## コード
BookAでVBEを開いて以下のコードを貼り付けて実行
A1～A3に書かれたパスのExcelファイルを印刷することができる

```vb

' メインプロシージャ
Sub Main()
  ' 変数の定義
  Dim filePath As String

  ' A1からA3のセルを参照
  For Each cell In Range("A1:A3")
    ' ファイルパスの取得
    filePath = cell.Value
    ' 印刷プロシージャの読み出し
    Call PrintBook(filePath)
  Next
End Sub


' 印刷用プロシージャ
Sub PrintBook(ByVal filePath As String, Optional ByVal sheetName As String = "")
  ' ブックを操作するために用意
  Dim wb As Workbook
  ' filePathで指定されたブックを開く
  Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)

  ' シート名が指定されていない場合，読み込んだブックから取得
  If sheetName <> "" Then
    wb.Sheets(sheetName).Select
  End If

  ' 印刷ダイアログを開く
  ' SendKeys "{ENTER}" '一気に印刷までしたい時はコメントを外す
  Application.Dialogs(xlDialogPrint).Show

  ' ファイルを閉じる
  wb.Close False
  ' wbの初期化
  Set wb = Nothing
End Sub

```

### 一気に印刷する場合
上記コードの当該コメントを外します

```vb
' 印刷ダイアログを開く
SendKeys "{ENTER}" '一気に印刷までしたい時はコメントを外す
Application.Dialogs(xlDialogPrint).Show
```

SendKeysでEnterを指定することで，
表示された印刷ダイアログにEnterキーが押された状態になり，すぐさま印刷が開始されます．

## 参考サイト
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10156517345
ゴールドバッハの予想を特定条件下で成り立つか確認してみた

# ゴールドバッハの予想を紐解いてみる
完全数の判定方法をプログラミングしているうちに色々と発展していったところ、最終的に初歩的かつ特定条件下ではあるが、ゴールドバッハの予想が成り立つか判定できるプログラミングができたので、備忘録として残しておきます。
筆者は投稿日現在、Python始めて1週間なので、ソースコードは汚いと思いますし、もっと良いアルゴリズムがあると思いますが、大目に見て頂けると幸いです。
※プログラミング未経験でしたが、数学修士を出ております。

**ゴールドバッハの予想とは**
全ての３よりも大きな偶数は２つの素数の和として表すことができる

### ①特定数値における完全数の判定法
ポイントはループ文のrangeの設定方法であり、単にrange(num)と記載すると、0で割る処理が発生する。

```python:judge1.py
# 入力値を数値に変換してリストへ格納する処理
num = int(input().rstrip())

#約数の合計値を入れる変数
sum = 0

#約数の合計値を求める処理
for i in range(1,num):
    if num % i == 0:
        sum += i

#約数の合計値を出力
if sum == num:
    print("完全数")
```

### ②完全数の探し方
2から999までの数値の中で、完全数となるものは何があるかを探すプログラム

```python:judge2.py
#約数の合計値を入れる変数
sum = 0

#約数の合計値を求める処理
for num in range(2,1000):
    for i in range(1,num):
        if num % i == 0:
            sum += i

    if sum == num:
        print(str(num) + "は完全数である。")
    sum = 0
```

### ③素数を見つけ出すプログラム)
今までのものを応用すると、素数を簡単にみつけることができる。
ここでは1000未満の素数に限定する。

```python:judge3.py
#約数の合計値を入れる変数
sum = 0

#約数の合計値を求める処理
for num in range(2,1000):
    for i in range(1,num+1):
        if num % i == 0:
            sum += i

    if (sum - num) == 1:
        print(str(num) + "は素数である。")
    sum = 0
```

### ④(ようやく)ゴールドバッハの予想の一端を見る
今までのものを応用すると、ゴールドバッハの予想が正しい(かもしれない)というのが分かるプログラムを作ることができる。
ただし、利用する素数は2以上100未満のものだけであるので、汎用性はあまりない。
将来的には、何も参照せずに、より汎用性あるものを作ってみたい。
ここでは、入力値をinput()で取得して判定をするプログラムである。

```python:judge4.py
#約数の合計値を入れる変数
sum = 0
list = []

#約数の合計値を求める処理
for num in range(2,100):
    for i in range(1,num+1):
        if num % i == 0:
            sum += i

    if (sum - num) == 1:
        list.append(num)
    sum = 0

gold_num = int(input().rstrip())

for p in range(len(list)):
    for q in range(len(list)):
        if (gold_num == list[p] + list[q]) and (q >= p):
            print(str(gold_num) + "は" + str(list[p]) + "と" + str(list[q]) + "の和である")
```

##　あとがき
Pythonを勉強し始めたばかりではあるが、こういう知っている数学の問題をPythonの基本的な関数を用いて解き明かすのは、頭を使うし本当に面白いと思う。
まだまだソースがきれいじゃないが、30代中盤からPython勉強しても、こういうふうになれることを証明したい。
【Laravel】現在のURLからメニューをActiveにする

#やりたいこと

Bootstrapでメニューに現在のURLから`active`クラスを付与したい

適当にルーティング用意

```php:web.php
Route::get('/hoge','HogeController@index')->name('hoge');
Route::get('/fufa/{fuga_id}','FugaController@index')->name('fuga');
Route::get('/piyo/piyo','PiyoController@index')->name('piyo');
```

メニューのサンプル

```html
<li>
    <a href="{{ route('hoge') }}">
        hoge
    </a>
</li>
<li class="active">
    <a href="{{ route('fuga',['fuga_id' => 1]) }}">
        fuga
    </a>
</li>
<li>
    <a href="{{ route('piyo') }}">
        piyo
    </a>
</li>
```

#やり方

##1
```php
{{ request()->route()->named('hoge*') ? 'active' : '' }}
{{ request()->route()->named('fuga*') ? 'active' : '' }}
{{ request()->route()->named('piyo*') ? 'active' : '' }}
```
現在のリクエストが指定した名前付きルートのものであるかを判定したい場合は、Routeインスタンスのnamedメソッドを使います。
これが一番良い方法
必須パラメータ除いても判定できる
*で、仮にhoge.indexとかhoge.showとかも対応になる

##2
```php
{{ reqeust()->is('hoge') ? 'active' : '' }}
{{ reqeust()->is('fuga/*') ? 'active' : '' }}
{{ reqeust()->is('piyo/piyo') ? 'active' : '' }}
```
isメソッドにより、リクエストのURIが指定されたパターンに合致するかを確認できます。このメソッドでは*をワイルドカードとして使用できます。
変更に弱い。URL変えるたびにこちらも変える必要がある

#参考
https://quickadminpanel.com/blog/laravel-how-to-make-menu-item-active-by-urlroute/
s3 sync コマンドを使ってS3バケット間を同期する

AWS CLI にはS3 のファイルコマンドが用意されています。ありがたい！
s3 sync コマンドを使ってS3バケット間を同期するコマンドをご紹介します。
# やりたいこと
- テスト用バケットのオブジェクトを本番用バケットにすべて同期したい
- テスト用バケットに存在せず、本番用バケットに存在するオブジェクトは削除したい

![aws-s3copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/2d1061bc-1994-2feb-8832-fae2476033a5.png)

# AWS CLI ってなに
AWS CLI = AWS Command Line Interface
コマンドを使ってAWSサービスと対話できるオープンソースツールです。

もっとくわしく知りたい方には、AWS CLI の[BlackBelt](https://youtu.be/1FexvzegG3o) がおすすめです。
## 利用可能なOS
- Windows
- Mac
- Linux
- Amazon Linux ※

※ EC2インスタンス作成時に Amazon Linux のAMI を選択すれば、
　あらかじめプレインストールされています

CLI は[こちら](https://aws.amazon.com/jp/cli/)からインストールできます。
#AWS CLI を使うと何がうれしいのか
AWSコンソールから画面をポチポチやる作業をコマンド一発で自動化できたら楽ですよね。そういうことや！

#sync コマンド
```
aws s3 sync s3://[同期元のバケット名] s3://[同期先のバケット名]
```
※ 指定するのはバケット名です。
　私は最初誤ってARN(リソース名)を指定してしまい、ちょっと時間をロスしました。。

**▼ 今回使ったコマンド**

```
aws s3 sync s3://[同期元のバケット名] s3://[同期先のバケット名] --exact-timestamps --delete
```

今回使ったオプションの詳細については以下の通りです。

| オプション       |       詳細 |
|:-----------------|:-----------------|
| --exact-timestamps       |  S3からローカルに同期するとき、同じサイズのアイテムは、タイムスタンプが正確に一致したときだけ無視されます。デフォルトの動作は、ローカルのバージョンがS3のバージョンよりも新しいものでない限り、同じサイズのアイテムを無視します。 |
| --delete       |  コピー先には存在するが、コピー元には存在しないファイルは同期中に削除されます。 |

## sync をdryrun したいとき
```
aws s3 sync s3://[同期元のバケット名] s3://[同期先のバケット名] --dryrun
```

| オプション       |       詳細 |
|:-----------------|:-----------------|
| --dryrun         |  指定したコマンドを実際に実行せずに、指定したコマンドを使って実行されるであろう操作を表示します。 |

オプションの詳細は[リファレンス](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)をDeepLで翻訳して載せました。
他にもさまざまなオプションがあるので、一読してみるといいかもです！
#参考
[AWS コマンドラインインターフェイス（CLI: AWSサービスを管理する統合ツール）| AWS](https://aws.amazon.com/jp/cli/)
[S3 sync で s3からファイルを同期させる時の注意点 | Developers.IO](https://dev.classmethod.jp/articles/s3-sync-exact-timestamps/)
[sync — AWS CLI 1.18.61 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)
AWS認定 データ分析 - 専門知識に合格したので、実践した勉強方法を共有します

#はじめに
[AWS認定 データ分析 - 専門知識](https://aws.amazon.com/jp/certification/certified-data-analytics-specialty/)にスコア776点で合格しました。勉強期間は約3週間でした。

[<img width = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/04217053-10fc-89ea-fd94-536cc1788a96.png">](https://www.youracclaim.com/badges/ee0be356-8caa-4b7f-8d90-5f51086c500c/public_url)

私が実践した勉強方法を共有しますので、これから受験する方の参考になれば幸いです。

#私とAWSとデータ分析
AWS歴は約4年です。**業務でデータ分析を扱ったことはありません。**
元々のデータ分析に関する知識も**ほぼ皆無**でした。絞り出すとしたら、以下くらいです。

- Redshift,Glue,EMRという名のサービスがデータ分析で使われているらしい
- DWHは列指向のデータベースらしい

こんな感じの人が以下の勉強方法で約3週間勉強したら合格できたと思ってください。

#実践した勉強方法
私が実践した勉強方法を共有します。基本的に上から順番に実施していきました。

##先駆者の方々のまとめ記事を見る
既に受験された方々のまとめ記事を見て、出題範囲のAWSサービスや問われる知識分野を把握しました。
私は以下の記事を参考にさせて頂きました。

- [AWS Certified Data Analytics vs Big Data - What's the difference?](https://dev.to/scrummastert/aws-certified-data-analytics-vs-big-data-what-s-the-difference-5aol)
    - 出題されるAWSサービスの範囲や問題の傾向がまとまっていて、大変参考になりました。

## BlackBeltを読む
出題範囲のAWSサービスが分かったら、対象サービスの[BlackBelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)を読んで、サービス概要をざっくり理解しました。

## AWSトレーニングルーム(eラーニング)を受講する
[Exam Readiness: AWS Certified Data Analytics - Specialty](https://www.aws.training/Details/eLearning?id=46612)を受講しました。
講義内でサンプル問題を解くことができるので、満点を取るまで繰り返し解きました。
英語表記のトレーニングなので、Google翻訳を活用しました。

## サンプル問題を解く
[サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-analytics-specialty/AWS-Certified-Data-Analytics-Specialty_Sample-Questions_v.1.1_FINAL.pdf)を解きました。満点取るまで繰り返し解きました。

## 公式の模擬試験を受験する
公式の模擬試験を受験しました。正答率は75%(20問中15問正解)でした。
終わった後も繰り返し解けるように、問題文と選択肢の画面を試験時間中にスクショしておきました。
公式の模擬試験は各問の回答が分かりません。なので、公式ドキュメント等の記事を調べて、自分で答えを見つける必要があります。
本当に合っている答えかは分かりませんが、満点が取れるまで繰り返し解きました。

## 非公式の問題集を解く
### Udemy
以下2つの講座をセール期間中を狙って、どちらも¥1500くらいで購入しました。ただし、どちらも内容が微妙だったのでキャンセルしています。

- [AWS Certified Data Analytics Specialty 2020 (ex Big Data)](https://www.udemy.com/course/aws-big-data/)
    - ビデオ講義,ハンズオン,演習問題が付いている講座です。 講義についてはAWSトレーニングルームで十分の内容を学習できていたので、演習問題目当てで購入しました。しかし、問題内容が簡単すぎて参考にならないと判断し、キャンセルしました。
- [AWS Certified Data Analytics Specialty Practice Tests](https://www.udemy.com/course/aws-certified-data-analytics-specialty-practice-tests/)
    - 演習問題オンリーの講座です。解答は付いていますが、解説はありません。解答が明らかに間違っていたり、問題文に出題されるサービスが古かったりと参考にならないと判断し、キャンセルしました。

### examtopics
参考になりそうな問題を探して、ネットをさまよっていたら、examtopicsというサイトに流れ着きました。
ビッグデータ専門知識に関する問題集で内容が少し古いですが、無料で85問提供されています。こちらを繰り返し解きました。
解答が間違っているものもあるのですが、コメント欄でみんなが正解不正解を議論しているので、勉強する上で大変参考になります。

- [Amazon AWS Certified Big Data - Specialty Exam](https://www.examtopics.com/exams/amazon/aws-certified-big-data-specialty/)

#感想
データ分析に関する知識がほぼゼロの状態だったので、勉強には苦労しました。AWSトレーニングルームの講義が非常に分かりやすくまとまっているため、大変参考になりました。今回の試験勉強を通して、今まで触ったことのないサービスの概要や特徴を多く知ることができました。学んだことが今後役立つ日がくれば良いなと思います。
mol2psをMacOS Catalinaで使えるようにする

## mol2ps実行時の「bad CPU type in executable」への対応 

### 背景

mol形式のファイルを、pngに変換する時に、mol2psを使用していた。
以前は、下記のページからダウンロードして、実行件をchmodで付与すれば使用できた。
https://homepage.univie.ac.at/norbert.haider/cheminf/mol2ps.html
（ここで「Mac OS X (x86) executable: [mol2ps-latest-macosx-x86.gz](https://homepage.univie.ac.at/norbert.haider/download/chemistry/mol2ps/bin/mol2ps-latest-macosx-x86.gz) 」をダウンロード）

MacOSをCatalinaに変更した後、同様の手順を行うと下記のエラーが表示された。

````console
~ $ mol2ps 
zsh: bad CPU type in executable: mol2ps
````

「Apple dropped support for 32bit executables with Catalina 10.15.」が原因？
「Mac OS X (x86) executable」をダウンロードしたのだから、こう言われれるのですね......
もう32ビットにはサポートしてくれないんだ　ぐすん...

### 対応策

ソースから

１. Free Pascalをインストールする

```console
~ $ brew install fpc
==> Pouring fpc-3.0.4_1.catalina.bottle.tar.gz
/usr/local/Cellar/fpc/3.0.4_1: 3,309 files, 190.1MB
```

   
２.　ソースをダウンロードして、コンパイルする
   mol2psのページにはソースコードもあるのでまずこれをダウンロード　source code: [mol2ps.pas](https://homepage.univie.ac.at/norbert.haider/download/chemistry/mol2ps/mol2ps.pas)
   コンパイルは1.で用意したFree pascalを使用する

```console
$ fpc mol2ps.pas -S2
Free Pascal Compiler version 3.0.4 [2019/10/11] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Darwin for x86_64
Compiling mol2ps.pas
Assembling (pipe) mol2ps.s
Linking mol2ps
ld: warning: building for macOS 10.5 is deprecated
8870 lines compiled, 13.1 sec
$ ls -lth |head -n2
total 36240
-rwxr-xr-x   1 hoge  staff   1.4M  5 18 15:41 mol2ps
```
　pascalは初心者以下のレベル、初めて使った.....
　fpc -hコマンドでオプションを調べて、「-S2    Same as -Mobjfpc」だけ付けてみた。
　※　詳しい方がいらしたら教えてください（モヤモヤしています、追記したいです）

３. コンパイルされたmol2psを使ってmol→psの変換を実行

```console
$ ./mol2ps  --bgcolor=white --scaling=1.0 sample.mol > sample.ps 
```
Vue.jsプロジェクト　ルーターの設定

#ルートの定義
```router/index.js
import Home from '/views/Home.vue' //コンポーネント名 from ファイルのパス
import Page from '/views/Page.vue'

 const routes = [
  {
    path: '/',            //urlの末尾を設定
    name: 'Home',         //routeの名前。省略可能。詳しくはrouter-linkのところ
    component: Home       //上でimportした対応させるコンポーネント 大文字に注意！
  },
  {	path:'/page',
	name:'firstpage',
	component:Page
  }
]
```
最初に読み込んでいるファイルはviewsのファイル。src/componentsのほうじゃない！:raised_hands_tone2:

#$router.push
```vuejs

<script>
this.$router.push({name:'SerchResult'})   //path:'〇〇'でも可
</script>
```

router の機能の一つ。
違うurlに遷移する。書き方はいろいろある。

#router-link
```Home.vue
<template>
//下の２つはどちらも同じ！
 <router-link to='/page'>firstpageへのリンク</router-link>

 <router-link :to="{name:'firstpage'}">firstpageへのリンク</router-link>
</template>
```

下のコードのほうが、パスよりわかりやすい（気がする）:v_tone2:
若干：があったりして凡ミスしてた。よく見ると違うね。
ルーターリンクも実は、ルータープッシュの機能を内部的に呼んでいるとのこと。
つまり、ルーターリンクを踏むことで、ルータープッシュしている。(公式より)

##ルータープッシュとルーターリンク
どちらも、ページを切り替える。
###router-link
HTMLのaタグみたいなもの。aタグと違って、ページを遷移しないので、早いように見える。らしい。
HTMLに書いてユーザーがポチッと押す。
templateの中に書く。

###router.push
例えば、問い合わせフォームとかから、送信した後に、「送信が完了しました！」のページにうつるときに使う。
もしも。ルーターリンクを使ったら、ユーザーがポチッと押したら、仮に送信できていないくても完了しましたページには移ってしまう。
メソッドの中に書く。
.github/CODEOWNERSをつくるだけでレビュワー設定に疲弊しなくなるのでオススメ

## 内容

```:.~/github/CODEOWNERS
* @Ancient-Scapes @reviewman1 @reviewman2
```

と書くとデフォルトレビュワーが設定される。
PRを出す時点のレビュワーには表示されていないがOpenされるとちゃんと出てくるので問題ない。


## 注意
この差分のプルリクを出す分には、本番にまだ変更が反映されていないので人類最後の手動レビュワー設定が必要。


## 参考

詳しく色々やりたい人は下記を参考に。プロジェクト全体の共通レビュワーを設定する分には上記だけで問題ない。

[CODEOWNERS で特定の人間をレビュー必須にすれば世界は平和になるはず - Qiita](https://qiita.com/FumiyaShibusawa/items/c7a3ff4d0793ca2d281f)
Macと過ごして７年目 わたしの精鋭アプリたち

# はじめに

Macがおもい。。とてつもなく重い。。Chromeすら動かなくなってしまった

そこで初期化してから同じ使用感に戻せるためにも大事なアプリをここにまとめておこう置きます。参考になれば幸いです。


# 1.Alfred
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/06fd70b5-03da-1e29-824d-a1a4b5fc9ae0.png)

https://www.alfredapp.com/
めっちゃシンプルだけどすごい強力なアプリ。あと帽子と虫眼鏡のデザインかわいい。

アプリを起動したいときとか、検索したいことがあるときにショートカットですぐ呼び出せたり。離席するときにスリープに切り替えるのもいつもお世話になってます。もうこれないとMacさわれない。


# 2. BetterSnapTool
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/bacddbf6-68cb-f77c-cd48-576b3b706b5f.png)

https://apps.apple.com/jp/app/bettersnaptool/id417375580?mt=12


ウィンドウを移動させるツール。windowsだと端っこに持っていっても画面が最大化されるのだがmacではそれが出来ないためこれで代用する。２分割するのも楽勝で有料だけどその価値あり。もうこれないとMacさわれない。


# 3. MagicPrefs
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/af8575f5-7beb-8097-d27d-e9d3dff8ce2a.png)

[](http://magicprefs.com/)
http://magicprefs.com/
Magic Mouse のショートカットを増やすためのアプリ。Launchpadを既存の状態ではmouseだけの操作だけでは実行表示できないぶぶん助けてくれるからありがたい。アプリの色合いがすごい好み


# 4. Caffeine
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/3a3064a2-1292-6c76-5b94-e6da6b2359a8.png)

http://lightheadsw.com/caffeine/
今回紹介した中で一番シンプル設計。メニューバーのコーヒーのボタンを押すだけでスリープモードにならないようにおいておける。これと同じ機能がiPhoneにもほしいな。スリープさせないって意味でcaffeineの名前が好きすぎる。


# 5. APPCLEANER
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/68da5092-1bc1-b611-9566-f5a7fd37536e.png)
https://freemacsoft.net/appcleaner/
アプリをアンインストールしようと持っても、普通にファイルから削除したら関連ファイルが残ったままになります。しかしこのアプリを使うと関連ファイルも全部消してくれるので何も考えずに使えるとこがいいですね。

# 6.  Chrome
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/9322e3c4-eec5-1831-dee9-3c27bd298ed6.png)

とても有名なwebブラウザ、メモリめっちゃ食べるけど拡張機能とか全部覚えててくれるからマジ神。
複数OSつかってる自分からしたらないと作業できないレベル。

# あとがき

以上がわたしがMac使用歴七年目でいまだ現役で使ってるアプリでした。もし気になるのがあればぜひインストールしてみてくださいね。
MySQLを始めてパスワード設定まで　for Mac

#はじめに
いままでphpmyadminとmysqlのgemに頼り切っていた私は最近、phpmyadminの脆弱性に気づきました。どうせならコマンドから操作したいと思ったのでMySQLを導入しようと思ったのですが、パスワード設定が思ったより難航したので参考にどうぞ。

環境：　mysql 8.0.19 　MacOS

#まずインストール
Macにパッケージをインストールしていくにあたって、バージョン管理をしてくれるhomebrewというものが主流のようなのでまずhomebrewをインストールします。
ターミナルを開き、入力していきます。(ターミナルはMacにデフォルトで入っているもので構いません)

```
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
([homebrew公式ページ](https://brew.sh/index_ja)より)


###mysqlをインストール

```
% brew install mysql
```
ビールの絵文字が出てくればインストール成功。
brew listと打ってmysqlという文字が確認できればOK

#初期設定
インストールした時点でサーバーは立ち上がっているのでルートユーザーでログインします。

```
% mysql -uroot
/////省略/////
mysql>
```
このようにmysql>と出て、sqlのコマンドを受け付けてくれるようになりました。

###パスワードの設定
このままではセキュリティー上、パスワードがなくてもmysqlにアクセスできてしまうので、パスワードを設定します。
そしてflush privileges;で反映させます。

```
mysql> set password for root@localhost='ここにパスワード';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
```

パスワードがちゃんと使えるのか確認
一回mysqlを抜けて再度ログインします
EnterPasswordで先ほど設定したパスワードを求められるので入力してmysql>で入力待ちの状態になればパスワードは設定されています。

```
mysql> quit
Bye
% mysql -uroot -p
Enter Password:
```

＊注意　先ほどはmysql -urootでログインしましたがパスワードを設定後にこのコマンドでアクセスしようとすると

```
% mysql -uroot 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```
このようにパスワードなしではログインできません！とエラーが出ます。パスワード設定後は-urootの後に-pをつけることで正常にアクセスが可能です。


###ついでに
このように始めはうまくパスワード設定ができてもログインができないことがあります。私の場合サーバーが立っていないということがよくあったのでそういうときはこうやって↓コマンド打ってサーバーを立ち上げましょう！

```
% mysql.server start
Starting MySQL
.. SUCCESS! 
```


##私情ですが。。
プログラミング学習のことで話せる初心者の学生さん！もしよければ
[twitterアカウント](https://twitter.com/chocola35175554)までお願いします
VSCode Remote DevelopmentでCentOS 7系の中で開発するときのメモ

## Git古すぎ
VSCode Remote DevelopmentでCentOS 7系の中で開発する場合「君のGitのバージョン古すぎるっす」という意味の警告が出ます
「Git for Windowsの新しいバージョンをチェックしな」というサジェストがありますが、実はこれWindows版のことを言ってるのではなく、CentOS側のことを言ってます
CentOS 7の場合、通常のリポジトリからyumで入るgitが1.8.xぐらいでVSCode側が要求しているのが2.x系なのでこのメッセージが出るようです
[Inline with Upstream Stable(IUS)リポジトリ](https://ius.io/) に最新版のGit2系のパッケージがありますので、Gitをこちらのものにリプレースしましょう

### IUSリポジトリ追加
```
sudo yum install -y https://repo.ius.io/ius-release-el7.rpm
```

### 既存の古いGitと関連パッケージを削除
```
sudo yum remove -y git*
```
### IUS版のGitをインストール
```
sudo yum install -y git2u
```

### 確認
```
git --versioin
git version 2.16.6
```

## Visual Studio Code is unable to watch for file changes in this large workspace

ファイルの変更を監視できる最大数を増やしてね的なものです
[公式にもある通り](https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc) /etc/sysctl.conf をいじってsysctl -pで反映させればOK
LaravelのIlluminate\Http\Requestについてメモ

#hasメソッド
```php
if ($request->has('name')) {
    //
}

if ($request->has(['name', 'email'])) {
    //
}

if ($request->filled('name')) {
    //
}
```
Illuminate\Http\Requestクラスのhasメソッドは、リクエストに値が存在する場合に、trueを返します。

配列を指定した場合、hasメソッドは指定値がすべて存在するかを判定します。

値がリクエストに存在しており、かつ空でないことを判定したい場合は、filledメソッドを使います。


```php
@if(Request::has('confirm'))

@endif
```
bladeの中で使うならこんな感じ

#flashメソッド
```php
$request->flash();

$request->flashOnly(['username', 'email']);

$request->flashExcept('password');
```

入力をフラッシュデータとして保存します。

Illuminate\Http\Requestクラスのflashメソッドは、現在の入力をセッションへ、アプリケーションに要求される次のユーザーリクエストの処理中だけ利用できるフラッシュデータとして保存します。

セッションへ入力の一部をフラッシュデータとして保存するには、flashOnlyとflashExceptが使用できます。両メソッドは、パスワードなどの機密情報をセッションに含めないために便利です。

#oldメソッド
```php
$username = $request->old('username');
```

```php
<input type="text" name="username" value="{{ old('username') }}">
```

直前のリクエストのフラッシュデータを取得するには、Requestインスタンスに対しoldメソッドを使用してください。oldメソッドはセッションにフラッシュデータとして保存されている入力を取り出すために役に立ちます。

Laravelではoldグローバルヘルパ関数も用意しています。特にBladeテンプレートで直前の入力値を表示したい場合に、oldヘルパは便利です。指定した文字列の入力が存在していないときは、nullを返します。
#参考
[HTTPリクエスト 5.5 Laravel](https://readouble.com/laravel/5.5/ja/requests.html)
[AndroidStudio][iOS] Flutterデバッグ中にHDの容量が食われてMacが落ちる問題について

## 発生した問題
Android StudioでFlutterアプリを実装中、iOSを実機に繋いでデバッグしていたらなんかのタイミングでMacのHDをめちゃくちゃ食うようになってしまいにはMacが落ちるという問題が発生した。
Macを再起動後、ゴミ箱にRecoverd filesが作成され大量の(A Document Being Saved By xcdevice)が。。。

<img width="636" alt="スクリーンショット 2020-05-18 15.12.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143861/564c0d0b-67b8-4e96-4625-079b26b9300e.png">


## 発生したバージョン
* Mac: macOS Catalina 10.15.4
* XCode: 11.4(11E146)
* AndroidStudio: 3.6.3
* Flutter: 1.17.0
* Dart: 2.8.1

## 解決策
以下のURLにたどり着いた。
[https://apple.stackexchange.com/questions/387634/temporary-dyld-shared-cache-taking-a-lot-of-space](https://apple.stackexchange.com/questions/387634/temporary-dyld-shared-cache-taking-a-lot-of-space)

XCodeを起動し、メニューの「Window」→「Devices and Simulators」をクリック。
接続しているiPhoneを選択し「Copying cache files from device」が表示されてるのでそのプロセスが完了すれば発生しなくなる。

試してないが、XCodeをアップデートしたら治るのかも。。
Windows10 Python 3.8.3でOpenCVを使うためのメモ。

#Windows10 Python 3.8.3でOpenCVを使うためのメモ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/94d20ced-ffc8-c24e-cd59-13d834d8225f.png)

pip install opencv-python　を打つ。

Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.18.4 opencv-python-4.2.0.34

入ったみたいです。

あらかじめ書いておいたPCカメラから撮影するスクリプト(省略)を起動して確認します。
> python C:\python\cvtest.py

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/c6e1301b-3a77-dfb7-dd42-777322d1c9e1.png)


はい、テレワークで子供たちのおもちゃになったデッサン人形君が撮影できました。
大丈夫みたいです。

以上。
グーグル検索の結果100件分をCSVファイルに保存する

## やりたいこと
グーグル検索の結果100件分をCSVファイルに保存したい
## 実装方法
Seleniumを利用してWebスクレイピングを実施する
## 環境
Windows10
jupyter notebook

## chromedriverのダウンロード先
[ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/downloads)
## 実装
```
# Selenium用
from selenium import webdriver
import time
# スクレイピングを実施してcsvに書き出し用
from bs4 import BeautifulSoup
import requests
import lxml
import csv

# Chromedriverを立ち上げる（DLしてローカル環境に指定する）
driver = webdriver.Chrome('C:/Users/user/jupyternb/chromedriver_win32/chromedriver.exe')

# google検索 100件表示分（?num=100）を指定する
driver.get('https://www.google.co.jp/search?num=100');

# 待機
time.sleep(3)

# キーワードの指定
keywords = str('python スクレイピング')

# 検索する
search_box = driver.find_element_by_name('q')
search_box.send_keys(keywords)
search_box.submit()

# 待機
time.sleep(6)

# 検索した結果のURLを取得する
url = driver.current_url

# Chromedriverを止める
driver.quit()

print(url)

# ヘッダーの指定
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
}

# 検索結果のURLを指定する
get_url = requests.get(url, headers=headers)
get_url.raise_for_status()

# 取得したURLのソースをスクレイピングする
soup = BeautifulSoup(get_url.text, 'lxml')

# 検索結果のタイトルとリンクを取得する
link_title = soup.select('.r > a')

# 検索結果の説明部分を取得する
link_disc = soup.select('.s > div > .st')

# 検索結果を数える
if(len(link_disc) <= len(link_title)):
    leng = len(link_disc)
else:
    leng = len(link_title)
    
# csvファイルを書き込み用にオープンして整形して書き出す
with open('output/' + '['+ keywords + ']_g_output_2.csv', 'w', newline='', encoding='utf-8') as f:
    csvwriter = csv.writer(f)
    csvwriter.writerow(['タイトル', '説明', 'URL'])
    for num in range(leng):
        # リンクのみを取得し、余分な部分を削除する
        url_text = link_title[num].get('href').replace('/url?q=','')
        
        # タイトルのテキスト部分のみを取得する
        title_text = link_title[num].get_text()
        
        # 説明のテキスト部分のみを取得／余分な改行コードを削除する
        text_1 = link_disc[num].get_text()
        text_2 = text_1.replace('\n', '')
        disc_text = text_2.replace('\r', '')
        csvwriter.writerow([title_text, disc_text, url_text])

```
## 結果（先頭から5件分）
![google_100_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311926/75930fca-64af-4436-d7a5-74d59dc35f95.png)
## 参考URL
[Google検索結果から、タイトルとURLと説明文だけを抜き取る／PythonでWebスクレイピング](https://arakan-pgm-ai.hatenablog.com/entry/2018/01/17/080000)
[【Python】Seleniumで検索結果をスクレイピングしてCSV出力する](https://mintaku-blog.net/python-selenium/)
[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)
【JavaScript】 yyyy-mm-dd 表記を yyyy年mm月dd日に変更する（文字列 to 文字列）

## 正規表現を使って変更
下記のように書くことで `2020-01-01` を `2020年1月1日` に変更することが可能です。
(もちろん、`2020-12-25` は `2020年12月25日` になります)

```javascript:date.js
let beforeDate = '2020-01-01';
let afterDate  = beforeDate.replace(/(\d{4})-0?(\d{1,2})-0?(\d{1,2})/, '$1年$2月$3日');

console.log(afterDate);
// 出力：2020年1月1日
```


https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions
Laravel リレーションの覚え方


混乱する人向け。

## 手っ取り早い考え方
- Q1 どっちが`belongsTo()`?
  - A. 外部キー(FK)がある方が`belongsTo()`
 
- Q2. `hasMany()`,`hasOne()`どっちを使えばいい？
  - A. `belongsTo()`側のTBLに、対象FKのレコードが複数回登場するなら`hasMany()`。uniqueなら`hasOne()`

## Sample Database Table

アカウント情報

|users TBL|型|
|---|---|
|id|autoincrement PK|
|email|string|
|password|string|
|name|string|

アカウントユーザの住所

|address TBL|型|
|---|---|
|id|autoincrement PK|
|user_id|**FK users.id**|
|prefecture_code|string|
|address|string|

掲示板投稿

|posts TBL column|型|
|---|---|
|id|autoincrement PK|
|user_id|**FK users.id**|
|title|string|

掲示板投稿に対するコメント

|comment TBL column|型|
|---|---|
|id|autoincrement PK|
|post_id|**FK posts.id**|
|user_id|**FK users.id**|
|message|string|

## User Model
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'users';   
    
        public function address()
    {
		return $this->hasOne('App\Models\Address', 'user_id');
    }
    
    public function posts()
	{
    	return $this->hasMany('App\Models\Post', 'user_id');
	}

    public function comments()
	{
    	return $this->hasMany('App\Models\Comment', 'user_id');
	}
    
}
```

## Address Model
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Address extends Model
{
    protected $table = 'address';   
    
    public function user()
	{
    	return $this->belongsTo('App\Models\User', 'user_id');
	}
}
```

## Post Model
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table = 'posts';   
    
    public function user()
	{
    	return $this->belongsTo('App\Models\User', 'user_id');
	}

    public function comments()
	{
    	return $this->hasMany('App\Models\Comment', 'post_id');
	}
}
```


## Comment Model
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $table = 'comments';   
    
    public function user()
	{
    	return $this->belongsTo('App\Models\User', 'user_id');
	}

    public function post()
	{
    	return $this->belongsTo('App\Models\Post', 'post_id');
	}
}
```
Deno: Redis のデータを削除 (Delete)

次のプログラムで作成したデータを削除します。
[Deno: Redis のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/2265a7deeeb6dd378e7e)

## プログラム

```ts:redis_delete.ts
// ---------------------------------------------------------------
//	redis_delete.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { connect } from "https://deno.land/x/redis/mod.ts"
// ---------------------------------------------------------------

console.error ("*** 開始 ***")
const key_in:string=Deno.args[0]

console.log (key_in)

const client = await connect({ hostname: "127.0.0.1", port: 6379 })

client.del(key_in)

console.error ("*** 終了 ***")

// ---------------------------------------------------------------
```

## 実行コマンドの例

```bash
deno run --allow-net redis_delete.ts t1858
```

## 確認したバージョン

```text
$ deno --version
deno 1.40.5 (release, x86_64-unknown-linux-gnu)
v8 12.1.285.27
typescript 5.3.3
```
Deno: Redis のデータを更新 (Update)

次のプログラムで作成したデータを更新します。
[Deno: Redis のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/2265a7deeeb6dd378e7e)

## プログラム

```ts:redis_update.ts
// ---------------------------------------------------------------
//	redis_update.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { connect } from "https://deno.land/x/redis/mod.ts"

// ---------------------------------------------------------------
console.log ("*** 開始 ***")
var key_in:string=Deno.args[0]
var population_in:number = parseInt(Deno.args[1])

console.log (key_in + "\t" + population_in)

const client = await connect({ hostname: "127.0.0.1", port: 6379 })

const reply = await client.get(key_in)
if (reply != null)
	{
	const json_out:string = json_update_proc (reply,population_in)
	console.log(json_out)
	const ok = await client.set(key_in, json_out)
	}

console.log ("*** 終了 ***")

// ---------------------------------------------------------------
function json_update_proc (json_str:string,population_in:number)
{
	var unit_aa = JSON.parse (json_str)

	unit_aa.population = population_in
	unit_aa.date_mod =  get_current_date_proc ()
	var json_out = JSON.stringify (unit_aa)

	return	json_out
}

// ---------------------------------------------------------------
export function get_current_date_proc ()
{
	var today = new Date ()
	var ddx = (1900 + today.getFullYear ()) + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate ()

	return ddx
}

// ---------------------------------------------------------------
```

## 実行コマンドの例

```bash
deno run --allow-net redis_update.ts t1855 39817400
```

## 確認したバージョン

```text
$ deno --version
deno 1.40.5 (release, x86_64-unknown-linux-gnu)
v8 12.1.285.27
typescript 5.3.3
```
Deno: Redis のデータを読む (Read)

次のプログラムで作成したデータを読みます。
[Deno: Redis のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/2265a7deeeb6dd378e7e)

## プログラム

```ts:redis_read.ts
// ---------------------------------------------------------------
//	redis_read.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { connect } from "https://deno.land/x/redis/mod.ts"
// ---------------------------------------------------------------
function display_line_proc (key:string,json_str:string)
{
	const data = JSON.parse (json_str)

	var out_str: string = key + "\t"
	out_str  += data.name + "\t"
	out_str += data.population + "\t"
	out_str += data.date_mod
	console.log (out_str)
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const client = await connect({ hostname: "127.0.0.1", port: 6379 })

const reply = await client.sendCommand("keys", "*")

const keys:string[] = reply.value()

for (var it in keys)
	{
	const key:string = keys[it].toString()
	const reply = await client.get(key)
	if (reply != null)
		{
		display_line_proc (key,reply)
		}
	}

console.error ("*** 終了 ***")

// ---------------------------------------------------------------
```

## 実行コマンド

```bash
deno run --allow-net redis_read.ts
```

## 確認したバージョン

```text
$ deno --version
deno 1.40.5 (release, x86_64-unknown-linux-gnu)
v8 12.1.285.27
typescript 5.3.3
```
Javaの配列での複数を求める場合

【例】

```Main.java
class Main {
  public static void main(String[] args) {
    int[] numbers = {1, 6, 11, 16, 21, 26};
    
    int oddNumber = 0;
    int evenNumber = 0;
    
    for (int number : numbers) {
      if (number % 2 == 0) {
        evenNumber += number;
      } else {
        oddNumber += number;
      }
    }

    System.out.println("奇数の合計は" + oddNumber + "です");
    System.out.println("偶数の合計は" + evenNumber + "です");
  }
}
```
上記の結果は奇数の合計は33です
偶数の合計は48です
となります。
配列numbersの要素を１つずつ取得し、その要素の値が
奇数であれば変数oddNumberで
偶数であれば変数evenNumberとしています。
偶数であるか奇数であるかの判定は、if文で「%」を用いています。
「% 2 == 0」とすることでk「evenNumber += number;」で偶数であるか
違えばelseの「oddNumber += number;」が実行されます。
Deno: Redis のデータを作成 (Create)

## プログラム

```ts:redis_create.ts
// ---------------------------------------------------------------
//	redis_create.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { connect } from "https://deno.land/x/redis/mod.ts"
// ---------------------------------------------------------------
function dict_append_proc (dict_aa: {[key: string]: any},id_in:string,name_in:string,population_in:number,date_mod_in:string)
{
	var unit_aa:{[key: string]: any} = new Object()
	unit_aa['name'] = name_in
	unit_aa['population'] = population_in
	unit_aa['date_mod'] = date_mod_in

	dict_aa[id_in] = unit_aa

	return	dict_aa
}

// ---------------------------------------------------------------
function data_prepare_proc ()
{
	var dict_aa : {[key: string]: any} = new Object()

	dict_aa = dict_append_proc (dict_aa,'t1851','福井',32814,'2014-5-12')
	dict_aa = dict_append_proc (dict_aa,'t1852','敦賀',68257,'2014-4-15')
	dict_aa = dict_append_proc (dict_aa,'t1853','小浜',26841,'2014-12-2')
	dict_aa = dict_append_proc (dict_aa,'t1854','大野',31864,'2014-3-22')
	dict_aa = dict_append_proc (dict_aa,'t1855','勝山',46358,'2014-2-14')
	dict_aa = dict_append_proc (dict_aa,'t1856','鯖江',63792,'2014-7-12')
	dict_aa = dict_append_proc (dict_aa,'t1857','あわら',38251,'2014-3-21')
	dict_aa = dict_append_proc (dict_aa,'t1858','越前',52486,'2014-7-26')
	dict_aa = dict_append_proc (dict_aa,'t1859','坂井',16859,'2014-11-8')
	
	return	dict_aa
}
// ---------------------------------------------------------------
console.log ("*** 開始 ***")
//
const dict_aa = data_prepare_proc ()

const client = await connect({ hostname: "127.0.0.1", port: 6379 })


for (var key in dict_aa)
	{
	var str_json = JSON.stringify (dict_aa[key])

	const ok = await client.set(key, str_json)
	}

console.log ("*** 終了 ***")

// ---------------------------------------------------------------
```

## 実行コマンド

```bash
deno run --allow-net redis_create.ts
```

## 確認したバージョン

```text
$ deno --version
deno 1.40.5 (release, x86_64-unknown-linux-gnu)
v8 12.1.285.27
typescript 5.3.3
```