OmniAICreator/Qiita-1.07M huggingface dataset:
Alpine Linuxでpandas 1.1.0以降のビルドに失敗する問題の対応方法

![Python-3.8.2](https://img.shields.io/badge/Python-3.8.2-brightgreen) ![pip-20.2.2](https://img.shields.io/badge/pip-20.2.2-brightgreen) ![pandas-1.1.0 or later](https://img.shields.io/badge/pandas-1.1.0 or later-brightgreen) ![Alpine-3.11.0](https://img.shields.io/badge/Alpine-3.11.0-brightgreen) ![Last Modified-2020/08/22](https://img.shields.io/badge/Last Modified-2020/08/26-brightgreen)

# はじめに
**Alpine Linux**で**pandas 1.1.0以降のビルドに失敗する問題**に遭遇したので、対応方法についてまとめました。

```terminal
Failed to build pandas
ERROR: Could not build wheels for pandas which use PEP 517 and cannot be installed directly
```

# 原因

**pandas 1.1.0**からの障害でした。
すでにGitHubのpandasリポジトリ上でIssueとPull requestが作成されており、masterブランチへのマージも完了していました。
**修正版はpandas 1.2でリリースされる予定**になっています。

* Issue  
[BUG: error: may be used uninitialized. In alpine #35622](https://github.com/pandas-dev/pandas/issues/35622)
* Pull request  
[MAINT: Initialize year to silence warning #35763](https://github.com/pandas-dev/pandas/pull/35763)

# 対応方法

pandasの**Milestone**を確認すると、**pandas 1.2**は**2020/11/29までにリリース予定**となっており、現時点（2020/08/26）では最長でまだ3ヶ月ほど待つ必要があります。

* [Milestone 1.2](https://github.com/pandas-dev/pandas/milestone/73)

Issueでの以下のやり取りを見る限りは**1.2まで対応しないという強い意志を感じる**ので、1.1系で繰り上げ修正されることはなさそうな気がしています。[^1]
このため、pandas 1.1.0以降の新機能を利用する予定がない場合は、**pandas 1.0.5**を利用して回避することをオススメします。

[^1]: 現時点（2020/08/26）で1.1系は1.1.2までMilestoneが作られていますが、今のところ今回の修正は含まれていません。

![スクリーンショット 2020-08-26 9.22.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/90f12e3d-a9af-36a7-5bd3-ea1b2dda9636.png)

## pandas 1.0.5を指定してインストール方法
私の場合は**pip**を利用して**pandas**をインストールしていたので、以下のようにバージョンを指定して**pip install**するように対応しました。

```diff
- pip install pandas --no-build-isolation
+ pip install pandas==1.0.5 --no-build-isolation
```

# あとがき

Alpine Linuxとの組み合わせだけで発生する問題だったので、こんなこともあるのかーと思いました。
いろいろむずかしい :thinking: 

# 参考情報

* [BUG: error: may be used uninitialized. In alpine #35622](https://github.com/pandas-dev/pandas/issues/35622)
* [MAINT: Initialize year to silence warning #35763](https://github.com/pandas-dev/pandas/pull/35763)
* [Milestone 1.2](https://github.com/pandas-dev/pandas/milestone/73)
[git] gitコマンド一覧


#add前の変更を削除

```
git restore <file名>
```

#add前の変更内容確認（特定のファイル）

```
git diff -- <file名>
```

#addの取り消し（特定のファイル）

```
git rm --cached -r <file名>
```

#add後に変更内容確認（特定のファイル）

```
git diff --cached <file名>
```

#add[全てのファイル]
```
git add .
```

#add[特定のファイル]
```
git add [ファイル名]
```



#ブランチの確認

```
git branch
```

#ブランチの切替

```
git checkout ブランチ名
```

#ブランチ作成

```
git checkout -b 作成するブランチ名
```
現在のブランチから作成される

#ブランチ削除 [マージ済みのみ]

```
git branch -d [ブランチ名]
```

#ブランチ削除 [マージ前も可]
```
git branch -D [ブランチ名]
```

#コミット[コメント付き]
```
git commit -m 'コメント'
```

#直前のコミット取り消し
```
git revert HEAD
```


#リモートへプッシュ
```
git push origin リモートブランチ名
```



#リモートから変更内容を取り込む
```
git pull origin ローカルブランチ名
```

随時更新していきます。
vscode StatelessWidgetからStatefulWidgetに自動変換するショートカットキー

#Widgetの状態（State）について
ご存知の通り、Flutterには**StatelessWidgetとStatefulWidget**の２種類Widgetがある。

アプリ開発をしていると、途中から**「あ、この部分は値を動的に変更させないとダメだわ」**とか言う感じで、色々とコードが変わってくる。

そんな時におすすめのvscodeショートカット！

#前提
[VSCodeでFlutterの開発環境を整える](https://qiita.com/ozaki25/items/41d5c2c0dcb4dd377dc6)
:point_up_2:上記より、VSCodeでFlutter(Dart)の拡張を２つ入れている

#Widgetを変換してみる
[こちらの記事](vscodeでフラッターウィジェットを囲むショートカット)で登場するとキー全く同じ。

![スクリーンショット 2020-08-25 22.13.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/3bd8da43-2771-2c64-f50c-a1410b240292.jpeg)


ウィジェットにカーソルを合わせて
`CMD + .`（MacOS）
`CTRL + .`（Windows）

これでStatelessWidgetからStatefulWidgetに変換できる！
[Powershell] ファイル名を一括変更

# やりたいこと
フォルダ内のファイル名をあるパターンで一括変更したい
いつも何だったけ？となるのでメモ

# 使うコマンドレット
| コマンドレット| 何をする | 
|:--------------|:------------:|
| Get-ChildItem |フォルダ内のオブジェクトを取得する| 
| Rename-Item   |オブジェクトの名前を変更する| 

# サンプル
あるフォルダの中にファイル名の一部が```20200630```になっているものがあるとする
これを一括で```202008```に変更したい場合

```powershell
Set-Location 'C:\Users\xxxxxxxx'
Get-ChildItem | Rename-Item -NewName {$_.Name -replace '20200630','202008'}
```

```Get-ChildItem```で取得したファイル名をパイプで```Rename-Item```に渡すと```{$_.Name -replace '置換前', '置換後'}```でぐるぐるループしてファイル名を変更してくれる
jsでのDOM要素の追加をjQueryで書き換える

jsで書いたあとにjQueryでの書き方を知ったら、非常に見やすくて感動したので。

```example.js
//親要素
var parentdiv;

//jsべた書き
var element = document.createElement("p");
var text = document.createTextNode("TEXT");
element.appendChild(text);
element.setAttribute("id", "identifier");
parentdiv.appendChild(element);

//jQuery
var $element = $('<p></p>', {
  id: 'identifier',
  text: 'TEXT'
});
parentdiv.appendChild($element[0]);
```

```result.html
<div>
  <p id="identifier">TEXT</p>
</div>
```
gormのPluckの「0 rows affected or returned」

開発業務でgorm(v1)を使用しています。

以下のように、ログ出力をONにしてPluckで検索するtest.goを実行すると、fruitsテーブルに格納されている結果が取得できているにも関わらず、`0 rows affected or returned`と表示されます。

```golang:test.go
// ...
f := fruit{}
db = db.Model(&f).Pluck("name", &name)
fmt.Println(name)
// ...
```

```log:output
[2020-08-20 01:20:03]  [3.66ms]  SELECT name FROM `fruits`    
[0 rows affected or returned ] 
[みかん りんご なし もも さくらんぼ]
```

gormのログを出力を確認しながら実装などしてるので、ログを見て一瞬「データが取れてないのか！？」とギョッとすることがあります。
こうなっているのには何か意味があるのだろうか…と思ったのでgormの中身を見てみました。

検索結果の行数がちゃんと表示される`Find()`などでは、内部でcallCallbacksを呼び出し、

```golang:github.com/jinzhu/gorm/main.go
// Find find records that match given conditions
func (s *DB) Find(out interface{}, where ...interface{}) *DB {
	return s.NewScope(out).inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db
}
```

最終的にcallback_query.goの中で[取得した行数を数えている](https://github.com/jinzhu/gorm/blob/master/callback_query.go#L77)ようです。

```golang:github.com/jinzhu/gorm/callback_query.go

...
for rows.Next() {
    scope.db.RowsAffected++
...
```

Pluckの場合はメソッドの中で、scope.goの`pluck`を呼び出しています。

```golang:github.com/jinzhu/gorm/main.go
func (s *DB) Pluck(column string, value interface{}) *DB {
	return s.NewScope(s.Value).pluck(column, value).db
}
```

scope.goの`pluck`の中身を見てみると、`Find`とは違い、[取得した行数を数えていない](https://github.com/jinzhu/gorm/blob/master/scope.go#L1004-L1008)ようです。

```golang:github.com/jinzhu/gorm/scope.go
...
rows, err := scope.rows()
if scope.Err(err) == nil {
	defer rows.Close()
	for rows.Next() {
		elem := reflect.New(dest.Type().Elem()).Interface()
		scope.Err(rows.Scan(elem))
		dest.Set(reflect.Append(dest, reflect.ValueOf(elem).Elem()))
	}

	if err := rows.Err(); err != nil {
		scope.Err(err)
	}
}
...
```

ではここで行数を数えるようにすれば検索できた行数をログに出せるようになるのか…と考えたところでv2の方のプルリクに修正が上がっているのに気づきました。

[rows affected or returned is zero when use Pluck()/Count()/Preload(many2many)](https://github.com/go-gorm/gorm/pull/2928)

scope.goの`pluck`に行数を数える処理が追加されてました。
ただのバグで、`Count`と`Preload`も同様に行数が数えられてなかったみたいです。

gormはちょこちょこバグっぽい挙動があるので、不思議に思ったらときどき中身を見ながらうまく付き合っていきたいですね。。
PHP try catch finally文で例外処理を記載する

# 目的

- 例外処理の確認方法を下記にまとめる

# 実施環境

- 下記サイトで動作を確認
    - [https://paiza.io/ja](https://paiza.io/ja)

# 例

- 下記に例外処理のtry catch finally文の書き方の例を記載する。

    ```php
    try {
        //例外が発生する可能性がある処理
    } catch (例外クラス名 例外クラスの戻り値を受け取る変数名) {
        //「例外が発生する可能性のある処理」が例外となった時に実行される処理
    } finally {
        //例外に関係なく実行される処理
    }
    ```

- 「例外が発生する可能性がある処理」で別のメソッドを呼び、その結果も判定してほしい場合、下記のように記載すること良いらしい（こちらは一緒にお仕事をしているエンジニアさんから教えていただきました！）

    ```php
    try {
        //例外が発生する可能性がある処理
        $bool = $this->hoge();
        if ( $bool === 'false' ) {
            throw new Exception('エラーメッセージ');
        }
    } catch (Exception $e) {
        //「例外が発生する可能性のある処理」が例外となった時に実行される処理
    } finally {
        //例外に関係なく実行される処理
    }
    ```    

# 参考文献

- [https://www.php.net/manual/ja/class.exception.php](https://www.php.net/manual/ja/class.exception.php)
- [https://www.php.net/manual/ja/class.throwable.php](https://www.php.net/manual/ja/class.throwable.php)
- [http://www.php-ref.com/basic/06_try_catch.html](http://www.php-ref.com/basic/06_try_catch.html)
- 独習PHP P380
Gmailの送信制限 100通/日 をド正攻法で突破する方法

## GAS経由でメールを送ろうとするとありがちな罠……
Google Formsは安易かつとても便利で、何かのアンケートや受付を簡単にとって集計して、入力してくれた方に何かしらの集計をし、お返事を書く場合etc. Google Sheets で受けて、GAS経由でメールを自動返信というのは、ほぼ王道パターンになっているかと思います。

ただ、ここで問題になるのは Gmail の送信上限。
実際の前述の方式で、ちょっと件数の多いものを受け付けて上手く動かなかった経験がある方も多いのではないでしょうか？

## 1日あたりの送信上限

### 1日あたりのメール数
https://support.google.com/a/answer/166852?hl=ja

- 無料版Googleアカウント → 100通
- G Suite（試用アカウント） → 500通
- G Suite → 2,000通

を超すとメールの送信ができなくなると書いてありますが、こちらは通常のメール送信の場合。


### GAS経由でメールを送信する場合
https://developers.google.com/apps-script/guides/services/quotas#current_limitations

- 無料版Googleアカウント → 100通
- G Suite（試用アカウント） → 100通
- G Suite Basic / Gov → 1,500通

という制限になり G Suite Basic に移行すれば、GAS経由で1日に1,500通までメールを送信できるということになります。


## 試用アカウントから1日1,500通送れる状態への移行
では、G Suite Basicに移行すれば良いじゃんというお話になると思うのですが、ここにも罠が潜んでいます。

### 試用アカウントの制限の解除
https://support.google.com/a/answer/166852?hl=ja

> 次の 2 つの要件が満たされると、これらの制限は解除されます。
>
> - アカウントの試用期間が終了しており、有効なサブスクリプションが開始している。
> - アカウントに対する請求額が累計で 30 米ドル（またはご利用通貨での同等額）に達している。

1つ目の条件に関しては、G Suite申込時に開始される14日間の無料試用サブスクリプション期間を終了し、有料サブスクリプション期間に入っていれば問題はありません。（無料試用サブスクリプション期間内に支払い情報の設定をし、14日間を経過していることが条件になります。）

2つ目の条件に関しては、個人でG Suite Basic を契約している場合、有料サブスクリプション期間に入っていても、累計請求額が$30を超すまでは数ヶ月待たなければなりません。

<br>

**14日間も待ったのに、加えてお金を払いながら数ヶ月も待つなんて耐えられません！**

<br>

これを解決するには、G Suiteの手動での早期払い機能を使って$30を超す状態にすればOKです！
https://support.google.com/a/answer/6140582

<br>

## 注意点

- メール送信数には確認用に BCC で自身のアドレスに送っているものでも1通としてカウントされます。
    - 100通/日 のはずなのに 50通/日 しか送れてない！というのは、おそらくこの手の問題です。
- これとは別に1日あたりの Script runtime と Custom function runtime の制限があります。
git grep 基本攻略

<h1>git grepとは？</h1>
git grepコマンドを使えば、　Git管理下のファイルのみを対象としてgrepができます。
シンプルなコマンドですが利便性が高く僕はとても使っています。
わざわざディレクトリを探したり無駄なコード書く手間がほとんど省けます♪

<h1>基本的な使い方</h1>
公式ドキュメントはこちら
https://git-scm.com/docs/git-grep
これ読んだら基本的に分かるけど英語めんどくさい。って方が多いと思うのでまとめていきます。（自分もその考えです。笑）

<h1>特定ワードを含む箇所を調べたい(大小小文字を区別する)</h1>
基本的にシンプルな例です。大小小文字の区別をするので、注意をしてください！
ワードの指定は正規表現(基本)です。正規表現(拡張)を使う場合は、
-eオプションを使います。

```
$git grep -e "検索ワード"
```

<h1>特定ワードを含む箇所を調べたい(大小小文字区別しない)</h1>
-iオプションを使います。

```
$git grep -i "検索ワード"
```

<h1>ファイル名のみ出力させたい</h1>
-lオプション
指定した単語を含むファイル名のみ出力できる

```
$git grep -l "検索ワード"
```

<h1>正規表現(拡張)で検索する</h1>
-Eオプションを使えば、正規表現(拡張)の表現で検索ができます。
例えば↓のように20や00を検索結果として表示してくれる

```
$ git grep -E "[20][00]"
.ebextensions/0020_:    mode: "000755"
.env.sample:DB_HOST=aa1cf1lo20067xm.ckinz9qsuqgc.us-west-2.rds.amazonaws.com
```


 <h1>単語で検索する</h1>
-wオプションを使います。
ただし、次を単語とみなしているようです。
行の先頭で始まる or 頭に単語以外の文字がある
行の終わりで終わるか or 単語以外の文字が続く

```
$git grep -w "検索ワード"
```

 <h1>複数の単語が絡んだ文字を検索したい</h1>
--andオプション

```
$git grep -e "検索ワード" --and -e "検索ワード2"
```

 <h1>まとめ</h1>
駆け出しエンジニアなので間違っている部分やわかりにくい点などあるかと思います。
その場合はコメントなど入れていただけるとこれからの成長につながりますのでよろしければお願いします。
【LGTM】を押していただけると飛び跳ねて喜びます。

Twitteの方でも呟いたりしておりますのでもしよろしければ遊びにきてください♪
UnityのDebugLog無効化について

#はじめに
UnityではDebug.Logというなんでも出力してくれる便利なクラスが存在します。ですが、リリース時には大量にLogを吐いているとボトルネックとなることがあるので手軽に停止できるようにします。


#実装方法１(MonoBehaviour版)
```C#:test.cs
using UnityEngine;

public class test : MonoBehaviour
{
    [SerializeField] private bool _debugLog = false;

    void Awake()
    {
        Debug.unityLogger.logEnabled = _debugLog;
    }
}
```
こちらの実装でも動作はするのですが、**問題があります**。
MonoBehaviourクラスを使用しているためUnityの[ScriptExecutionOrder](https://docs.unity3d.com/ja/current/Manual/class-MonoManager.html)に依存してしまい、設定を怠ると**他のAwakeのログ処理が出力されてしまう**場合があります。




#実装方法２(RuntimeInitializeOnLoadMethod版)
@shiena様よりご指摘いただいたソースと内容になります。

```C#:test.cs
using UnityEngine;

public static class test
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void Init()
    {
        Debug.unityLogger.logEnabled = Debug.isDebugBuild;
    }
}
```
RuntimeInitializeOnLoadMethodを使用し、開始時にメソッドを呼び出す事で**事前アタッチする必要がなくなり**、引数にRuntimeInitializeLoadType.BeforeSceneLoadを使用することで**Awake処理より前に呼び出す**ことが可能となります。


Debug.isDebugBuildについては[こちら](https://docs.unity3d.com/ja/2019.4/ScriptReference/Debug-isDebugBuild.html)にあるように**Editor上では常にtrueを返してくれる**メソッドです。**テストビルドする際はDevelopmentBuildをオンにするとtrueを返してくれる**仕組みになっています。



#まとめ
スクリプトで簡単に停止できる。
他にもPlayerSettingsで停止するという方法もあります。
ですが、そちらはスタックトレースを止めるだけのようなのでログ出力は目に見えないが、内部上は出力されているという感じでしょう。

実装方法１の方が簡単に見えますが、実行順序などの内部の問題を抱えてしまっているので扱いが難しいです。特に理由がなければ、実装方法２をお使いください。
Cloud Functions for FirebaseでNode.js 12を利用する方法

[公式ドキュメント](https://firebase.google.com/docs/functions/manage-functions?hl=ja)の「**ランタイム オプションを設定する**」の項目には Node.js のバージョン 12 が使えることが書かれていますが、その利用方法までは書かれていなかったのでこの記事で説明します。

---

一見、ドキュメントにあるように

```
  "engines": {"node": "10"}
```

の箇所を`12`とすれば動きそうですが、ここに書いても動作しません。

Node.js の 12 を利用するためには、[firebase-tools](https://github.com/firebase/firebase-tools)のバージョンを`8.6.0`以上に上げたうえで`firebase.json`に`"runtime": "nodejs12"`を指定しましょう。

```
{
  "functions": {
    "runtime": "nodejs12"
  }
}
```

参考：[firebase/firebase-tools/releases/tag/v8.6.0](https://github.com/firebase/firebase-tools/releases/tag/v8.6.0)

---

Firebase 関連のパッケージはここ最近バージョンアップが頻繁に行われている印象で、ドキュメントも追いついていないっぽいので現在の情報が知りたい方はパッケージのリリース情報にも目を通していったほうがいいかもしれません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あとドキュメントも古くてもうpackage.jsonのenginesは使わなくていいようになったから、firebase.jsonで設定できる firebase-toolsの変更けっこう速いからドキュメント全然追いついてない <a href="https://t.co/YAa1plusH5">pic.twitter.com/YAa1plusH5</a></p>&mdash; lacolaco / Suguru Inatomi (@laco2net) <a href="https://twitter.com/laco2net/status/1298056620899831811?ref_src=twsrc%5Etfw">August 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ChromeのWebDriver(Selenium)で「このウェブページの表示中に問題が発生しました」とエラー表示された場合の対応

# 発生している現象

Pythonで、ChromeのWebDriver(Selenium)を起動したところ下記のエラーが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/6a1e2f09-2718-19bc-04b0-95a01e12bba2.png)

調べてみたところ、ChromeのWebDriver(Selenium)がクラッシュしてしまっている様子。
今回、その対応方法について備忘のために作成します。

# 対応方法
本番環境?のChromeがクラッシュした場合の対応方法について、Qiitaに記事がありました。
https://qiita.com/kazuki_hamatake/items/b37602254d6fed295475

記事を参照したところ、Chromeのショートカットに``--disable-features=RendererCodeIntegrity``を
追記すれば解決するよとのこと。

これをWebDriver(Selenium)のoptionとして読み込めば解決しそうです。

# コード
コードは以下になります。
options.add_argumentで``--disable-features=RendererCodeIntegrity``の引数を作成し、
webdriverに渡しています。

```Python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary

# ブラウザーを起動
options = Options()
options.add_argument('--disable-features=RendererCodeIntegrity')
driver = webdriver.Chrome(options=options)

# Google検索画面にアクセス
driver.get('https://www.google.co.jp/')

# ブラウザーを終了
driver.quit()

```
LaravelのBladeについての備忘録

LaravelのテンプレートエンジンであるBladeについてのまとめを備忘録として残しておきます。
必要だと思ったことは随時追加していく予定です。

##継承について
Bladeでは共通の部分(`<head></head>`やヘッダー、フッター等)をテンプレート化して、そのテンプレートを継承することで共通部分を自由に使い回すことができます。

##`@yield`と`@section`について
```/resource/views/layouts/hoge.blade.php
<!-- 継承元 -->
<html>
    <head>
      <title>タイトル</title>
    </head>
    <body>
      <header>ヘッダー</header>
        <div class="container">
            @yield('content')
        </div>
      <footer>フッター</footer>
    </body>
</html>
```
上記のように共通部分を記述したテンプレートを作成し、このテンプレートの可変部分を継承先のファイルで記述していくといった形です。
`@yield('content')`の部分に継承先での拡張内容が挿入されます。

```/resource/views/hogehoge.blade.php
<!-- 継承先 -->
@extends('layouts.hoge')

@section('content')
  <p>可変部分です</p>
@endsection
```
テンプレートを継承するには`@extends`ディレクティブを使用します。
`@extends('layouts.hoge')`といった形でに継承元のテンプレートを指定します。
`@section`から`@endsection`の間のコードが継承元の`@yield('content')`に挿入されます。

###`@yield`
またタイトルを可変部分にすることもあるでしょう。

```/resource/views/layouts/hoge.blade.php
<!-- 継承元 -->
<html>
    <head>
      <title>@yield('titile')</title>
    </head>
    <body>
      <header>ヘッダー</header>
        <div class="container">
            @yield('content')
        </div>
      <footer>フッター</footer>
    </body>
</html>
```
`@yield('titile')`としてタイトルも継承先から挿入するようにします。

```/resource/views/hogehoge.blade.php
<!-- 継承先 -->
@extends('layouts.hoge')

@section('title', 'タイトルです')

@section('content')
  <p>可変部分です</p>
@endsection
```
こちらは`@section('content')`とは少し書き方が異なります。
このように挿入部分を第二引数として指定することもできるのです。
文字列のみ挿入する際はこちらの方が簡潔ですね。
`@yield('titile','default')`のように第二引数にデフォルト値も設定できるようです。

###`@section`
さらに継承元の`@section`を継承先で展開することもできます。

```/resource/views/layouts/hoge.blade.php
<!-- 継承元 -->
<html>
    <head>
      <title>@yield('titile')</title>
    </head>
    <body>
      <header>ヘッダー</header>
        <ul>
          @section('list')
            <li>list1</li>
          @show
        </ul>
        <div class="container">
            @yield('content')
        </div>
      <footer>フッター</footer>
    </body>
</html>
```
`@section`~`@show`とすることで継承先での展開が可能になります。

```/resource/views/hogehoge.blade.php
<!-- 継承先 -->
@extends('layouts.hoge')

@section('title', 'タイトルです')

@section('list')
  @parent
  <li>list2</li>
@endsection

@section('content')
  <p>可変部分です</p>
@endsection
```
継承元の同じ引数の`@section`ディレクティブの中で、`@parent`を使用することで継承元の`@section`~`@show`間が展開されます。

また、`@parent`を使用せず

```
@section('list')
  <li>list2</li>
@endsection
```
とすることで、継承元のコードをシンプルに上書きすることができます。
また`@section`~`@show`の間に記述したコードは継承元で`@section`を用いて呼び出さなくても、そのまま展開されます。

まだまだまとめきれていない内容もありますので、今後も継続してBladeについて学んでいく所存です。
【Git】.gitignore の変更が反映されない→キャッシュ削除する方法

##.gitignoreの変更が反映されない

過去にプッシュしたことがあるGitで
`.gitignore`ファイルを更新 → プッシュ → 反映されない！
特にエラーなどはなく、.gitignoreに追加したファイルもプッシュされてしまう状況です。

##Gitのキャッシュが残っているのが原因

調べたところ「Gitのキャッシュ」的なものが存在するらしく、それを消さないと設定を上書きできないようでした。
https://qiita.com/fuwamaki/items/3ed021163e50beab7154

##キャッシュを消す

###手順

1. .gitignore 編集
2. キャッシュを削除
3. コミット→プッシュ 

###1.gitignore 編集

`.gitignore`ファイルを適宜編集します。

###2.キャッシュを削除

ターミナルでGitコマンドを使う。
全体のキャッシュ削除のほうが確実かと思われます。
ただ、キャッシュが大量だとフリーズしかけるので、ファイルが限定されていれば指定したほうが良いかもです。

```tarminal:ターミナル
//ファイル全体のキャッシュ削除
$ git rm -r --cached .

//ファイルを指定してキャッシュ削除
$ git rm -r --cached [ファイル名]
```

###3.コミット → プッシュ 

あとは、通常通りプッシュすれば完了です。

##所感
そもそも、.gitignoreの扱いとして
スタートの段階で除外するファイルを一通り指定しておいて、イレギュラーがあったら追加するという流れが普通なのかな？とか思いました。
自分の場合は、余計な記述があるとよくないから必要に応じて追加しよう、と考えていました…！
ITIL 2011 editionのサービスライフサイクルー5つのプロセス群

応用情報技術者平成30年秋期 午前問55

図は，ITIL 2011 editionのサービスライフサイクルの各段階の説明と流れである。a～dの段階名の適切な組合せはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/878598a5-c1b9-b3d5-c223-3520938075c8.png)


ITIL 2011 editionのサービスライフサイクルは5つのプロセス群から構成されます。
・サービスストラテジ（サービス戦略）（Service Strategy）
　サービスをどのように設計、開発、実装、維持していくかという戦略を確立する。

・サービスデザイン（サービス設計）（Service Design）
　サービス戦略に基づき、顧客およびビジネス上の要件を満たすための具体的なサービスを設計する。

・サービストランジション（サービス移行）（Service Transition）
　新規サービス又はサービスの変更をテストし、本番環境にリリースする。

・サービスオペレーション（サービス運用）（Service Operation）
　SLAで合意したサービスレベルを維持し、環境の変化に対応しながらサービスを継続的に提供する。

・継続的サービス改善（Continual Service Improvement）
　サービスおよびサービスマネジメントプロセスの機能を継続的に改善する。


参照：
https://www.ap-siken.com/kakomon/30_aki/q55.html

ITIL V3でいうサービスストラテジとは何か
https://www.itmedia.co.jp/im/articles/0810/14/news126.html
CampaignのCampaignMemberRecordTypeIdの不思議な挙動

何故か、プロセスビルダーやフローからは参照できない。URL　Hackでも参照できないようです。

[Setting a Campaign Member RecordType automatically based on the Campaign RecordType](https://salesforce.stackexchange.com/questions/215114/setting-a-campaign-member-recordtype-automatically-based-on-the-campaign-recordt)

これを読むと
キャンペーンメンバーのレコードタイプは、キャンペーンの[CampaignMemberRecordTypeId]フィールドに基づいて設定される。

ワークフローとプロセスビルダーを試してみましたが、フィールドが利用できなかったため、トリガーのみが残りました。

と、トリガー以外ではうまく使えないようなことが言及されています。
結局、トリガーで実装したらうまく行ったという結果が書かれています。

以下にも、VFのカスタムボタンでもうまく行かないように書かれています。

[CampaignMemberRecordType](https://developer.salesforce.com/forums/?id=906F000000095qDIAQ)


Apexの中でSOQLで指定すると読めるので
やっぱりトリガーでセットするしかないのかもしれません。

と思っていたら、CampaignMemberRecordTypeIdを数式項目として別に作って、それを参照すれば可能みたいです。
こういう逃げ方がある。他にも応用できる可能性はありますね。
pydanticでUnion型を使うときはLiteralと組み合わせるといい

チャットボットを実装しており、「ユーザーの過去のリクエスト内容をRedisに保存しておいて、必要に応じて参照してbotの返信に利用する」という実装をしています。具体的には以下のような仕様とプログラムです。

1. ユーザーのリクエストのjsonを`Request`型にキャストして利用する
2. Redisでは、pydanticの型を`json`に変換して文字列として保存し、取り出すときに`Request`型にキャストする
3. 同時にそのjsonをログに出力する


```python
from __future__ import annotations
from typing import Union, Optional
from typing_extensions import Literal
from .event import EventData


class Request(BaseModel):
    user_id: str
    session_id: str
    command: Union[MessageCommand, ButtonCommand]


class MessageCommand(BaseModel):
    """自由文のメッセージが入力されたとき"""
    type: Literal["message"]
    message: Optional[str]
    is_first: bool = False


class ButtonCommand(BaseModel):
    """ボタンを入力されたとき"""
    type: Literal["button"]
    event: Optional[EventData]
    is_first: bool = False


Request.update_forward_refs()
```

当初、`type`のプロパティを用意しておらず、Redisから取り出す際に`ButtonCommand`であるべきjsonが、誤って空の`MessageCommand`としてキャストされてしまっていました。デフォルト値や`Optional`を利用しているときは、間違ったjsonでもキャストできてしまいます。

それを`type`プロパティに`Literal`で固定の文字列を指定することで、確実に変換先を指定することができます。

# 参考

* [pydanticのLiteralのドキュメント](https://pydantic-docs.helpmanual.io/usage/types/#literal-type)
「Build input file cannot be found」となったときの対処法

表題の通り、コンフリクトを修正後にビルドした際にに以下のようなエラーメッセージが出力されました。

```sh
error: Build input file cannot be found: '/{path}/xxx.swift' (in target '{target_name}' from project '{project_name}')
```

## 原因
`xxx.swift`の置いてある`path`が間違っていました。
私の場合、`R.generated.swift`が本来リソース管理用のディレクトリに置いてあるはずが、
プロジェクトのrootディレクトリにあるのが原因でした。


## 解決法
`buildPhase` => `Compile Source`で該当のファイルを探します。
期待している`path`とは異なっているので正しいパスに修正を行います。

<img width="380px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/6f7bcbd3-d629-09d8-2a3f-8cf7d2e7c4ee.png">


以上です。無事にビルドが成功しているのではないでしょうか。

少しでも参考になりましたら幸いです😌
ディスプレイなしでRaspberry Pi4にSSH接続する方法 for Windows

### ディスプレイなしでRaspberry Pi4にSSH接続する方法
#### 必要なもの

* Raspberry Pi4本体
* 有線LANケーブル
* Micro SDカード(使用したものは64GB)
* USB電源アダプター 

##### 1.OSのダウンロード
下記URLからzipファイルをダウンロード。今回は「Raspberry Pi OS with desktop」を使用しました。
ダウンロードしたzipファイルを解凍しておきます。
https://www.raspberrypi.org/downloads/raspbian/

##### 2.balena Etcherのインストール
下記URLからダウンロードできます。
https://www.balena.io/etcher/

##### 3.Micro SDカードへ書き込み
PCにMicro SDカード(以下SDカード)を差し込みます。balena Etcherを起動して先ほど解凍したOSの「imgファイル」、差し込んでいる「SDカード」を順に指定したら「Flash！」をクリックしてしばらく待ちます。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515074/1a9419d3-66fd-2da0-08cf-07060d547e12.png)

処理が完了したらSDカードを抜きだし、数秒後もう一度差し込みます。

##### 4.SSH有効化
2つ方法を紹介します。


* 直接ファイルを作成する方法(簡単)

SDカードのbootを開き、そこに「ssh.txt」というテキストドキュメントを作成後、F2で「ssh」という拡張子なしのファイルに変更してください。警告が出る場合は無視しましょう。
![iOS の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515074/8ad665f8-1169-83be-6fdc-655e4ca95b5b.png)

これで準備は完了です。SDカードを抜き、ラズパイに挿入してください。



* WSLを使用する方法

長くなるので、[こちら](https://www.atmarkit.co.jp/ait/articles/1806/08/news042.html)の「例1:リムーバブルドライブをマウントする」を参考にしてください。
具体的には、WSLからSDカードをマウントすることでSDカードのbootにアクセスする方法です。

アクセスできるようになったら、「touch」コマンドで「ssh」ファイルを作成しましょう。

##### 5.SSH接続
ラズパイとPCを有線LANで繋ぎ、ラズパイの電源を入れてください。

1~2分後、下記コマンドでSSH接続できるはずです。

```
> ssh pi@raspberrypi.local
```

パスワードは初期状態だと「raspberry」になります。

有線LANでSSH接続が可能になったのでWi-Fiを通じて接続できるように、SSID/PASSを設定します。下記コマンドを実行して、raspi-configを使用します。

```
> sudo raspi-config
```
SSIDがわからない場合は、下記コマンドを実行することで使用可能なWi-FiのSSIDが一覧表示されます。

```
> sudo iwlist wlan0 scan | grep ESSID
```
メニューが表示されるので「2 Network Options」を選択してEnter、「N2 Wi-Fi」を選択してEnterを押します。
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515074/ed8caae4-dcf5-5feb-9f4d-5427796f1c63.png)
SSID、PASSの順で設定画面が表示されるので順に入力し、完了したら「Finish」を選択してEnterを押しましょう。

最後に、ラズパイを再起動しましょう。

```
> sudo reboot
```

これですべての設定が完了したので、有線LANを外します。
Wi-Fi経由でのssh接続が可能になっているはずです。ラズパイが再起動して1~2分後に下記コマンドを試してみましょう。

```
>ssh pi@raspberrypi.local
```
Google Earth Engineでモーリシャス座礁

#概要

Google Earth Engineで、タンカーを探してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/19e9ab2d-1250-a5c8-853f-d9050e309ea1.png)


#サンプルコード

```
var mtSM = ee.Geometry.Point(57.73864974959498,-20.44143209824365);
var image = ee.ImageCollection('COPERNICUS/S2').filterBounds(mtSM.buffer(10000)).filterDate('2020-08-07', '2020-08-23').first();
Map.addLayer(image, {
  bands: ['B12', 'B8', 'B5'], 
  max: 4400
}, 'mtsm');
Map.centerObject(mtSM, 14);

```

以上。
フーリエ変換

#フーリエ変換とは？

Qなぜフーリエ変換を学ぶ？_
電気信号、光、音などの「波」の解析にはフーリエ変換が使われる。　電子工学（エロクトロニクス）、制御工学などで必須の知識。

一言でフーリエ変換の何が凄いかを言うと、<font color="OrangeRed">「ほとんどの関数を三角関数の和で表すことができる」</font>

![20120612162617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/96152fdf-5f6c-b476-f69a-05ff17125971.png)

数学的説明は割愛します。（※数式を追った方が圧倒的に理解できます）
数式理解したい方は、「高校数学で分かるフーリエ変換」がおすすめです。



##前提

必要前提知識　＝　"三角関数"　＋　"積分"　＋　　（　"複素数"　）


三角関数基礎

「サインの微分がコサイン」　ここでサインの微分（コサイン）は傾きを表す。

例）　　サインπ/2 の傾き（微分）は　”0”　　　その時のコサインの値も　”０”　他の場所でも全て当てはまる。

「コサインの微分がサイン」　※マイナスの符号が付く　　（サインのグラフは、コサインのグラフを π/2だけθ方向に動かしたもの故、生じる）



三角関数の直行性
（ベクトルが直行　→内積０　→成分の積の和も０）

関数も<font color="OrangeRed">成分の数が無限個あるベクトルとみなせる！！<font>　

下図もよく見れば、
線（関数）は点（ベクトル）の無限の集合と言うことになります。

![function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/a60e33c3-e2c6-dd10-1158-1198ed8feb07.png)

関数が直交→　内積０　→　積の積分０




積分基礎　　　
積分とは、「微分の反対」に相当する操作」　　＝　「微分したら F′(x) になるような F(x) を求めること」に相当する。

不定積分　　定積分　の公式が理解できて、読めればOKです。


## フーリエ変換
フーリエ変換の視覚的理解。　（公式、数学的説明は割愛）

ポイントは波形→方形波までの過程です。

![unnamed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/3ed632f0-3fd6-80a7-4ff8-80b1c3101b88.gif)


上図では、いくつもの波形がありますが、それが細かくなると次第にデジタル信号の方形波に近づいてることを示しています。
gitのリモートURLを一斉に書き換える

BitBucketで大量のGitリポジトリの所有者変更をした際に、手元にcloneしてあるリポジトリのURLも同時に書き換えるためのスクリプトです。`git remote set-url`を該当するリポジトリで順番に実行して回ります。（安全のため、そのまま実行してもコマンドを出力するだけなので、実際に実行する場合は書き換えてください。

```ruby

old_owner = "foo"
new_owner = "bar"

Dir.entries(".").sort.each do |d|
  next unless File.directory?(d+"/.git")
  Dir.chdir(d)
  puts Dir.pwd
  m = `git remote -v | grep fetch | grep #{old_owner}`
  if m.empty?
    Dir.chdir("..")
    next
  end
  new_path = m.split(/[\t ]+/)[1].sub(src,new_owner)
  cmd = "git remote set-url origin "+new_path
  puts cmd
  Dir.chdir("..")
end
```
【rails】単数形と複数形の違いにおいて

#railsにおける単数形と複数形の使い分け
railsはモデルでは単数形。
コントローラーでは複数形で使われる。

モデルはそのモデルから作られる1つ1つのインスタンスを表している
一方、コントローラーはモデルから作られたインスタンスを全てコントロールする。

そのため、単数形と複数形になるのだ。

prefixにおいてもこれは当てはまる。

```
 Prefix Verb   URI Pattern                                                                              Controller#Action
                 articles GET    /articles(.:format)                                                                      articles#index
                          POST   /articles(.:format)                                                                      articles#create
              new_article GET    /articles/new(.:format)                                                                  articles#new
             edit_article GET    /articles/:id/edit(.:format)                                                             articles#edit
                  article GET    /articles/:id(.:format)                                                                  articles#show
                          PATCH  /articles/:id(.:format)                                                                  articles#update
                          PUT    /articles/:id(.:format)                                                                  articles#update
                          DELETE /articles/:id(.:format)                                                                  articles#destroy
       rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)   
```
Rails　本番環境　ActiveRecord::StatementInvalid (Mysql2::Error: Table 'テーブル名' doesn't exist):

##この記事について
本番環境で出たエラーの対処方法を備忘録として投稿

[環境]
・Ruby 2.6.6, Rails 6.0.3.2
・Docker,Docker-compose（開発環境）

##問題のエラー


```ruby:qiita.rb
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'テーブル名' doesn't exist):
```

##エラーが出た原因
開発環境で新たにテーブルを作成したが、本番環境にはまだテーブルが存在しておらずdb:migrateがする必要があるから

##エラーを解決するために
```ruby:qiita.rb
$ bundle exec rails db:migrate RAILS_ENV=production

== 20200825055854 CreateNews: migrating =======================================
-- create_table(:テーブル名)
   -> 0.0916s
== 20200825055854 Createテーブル名: migrated (0.0918s) ==============================
```

これでエラーが出なくなった！！！！
vue.jsとaxiosのCDNのみでQiitaAPIを呼び出し自分の投稿を表示させる方法

自分が処理を記述するときに「CDNのみで」という明示的な記事がなかった為、作成してみます。
CDNだけで簡単にQiitaから記事を取得できます。
## CDNの読み込み
vue.jsとaxiosを使えるようにHTMLファイル内に下記２つのurlを貼り付けます。

```html
<script src="https://unpkg.com/vue@2.5.17"></script><!-- 2020.8月時点のversion -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
```

## 結果を受けとる場所を作成する
data:に取得したデータを格納する場所を記述します。

```js
data: function() {
    return {
    	infoAll: {}
    }
}
```

## axiosでqiitaAPIに接続する
methods:に処理を記述していきます。 

```js
methods: {
    getAPIs: function() {
      axios
      .get(`https://qiita.com/api/v2/users/[ユーザー名]/items`)
        //[ユーザー名]はQiitaマイページの@で始まる名前です
        //私の場合sukeo-sukeoと記述します
      .then(res => {
        //thenの中に取得に成功したときの処理を記述していきます
        this.infoAll = res.data
        //resにすべてのデータが入りますが、今回必要なデータはresの中のdataに格納されていますのでres.dataとします
        console.log(this.infoAll)
        // log >>> (5) [{…}, {…}, {…}, {…}, {…}, __ob__: Observer]
      })
	}
 }
```
これでさきほど作成したinfoAll内にタイトルや記事本文、更新日時、記事へのURLなどのデータが格納されますので、例えば**this.infoAll[0].title**としてやると一番最近に書いた記事のタイトルが取得できます。

また、Qiitaのアクセストークンがあると１時間に取得できる記事数が拡張されるっぽいです。

ただ、アクセストークンがなくても動きましたのでとりあえず試したい方はアクセストークン無しでもOKだと思います。

ちなみに、アクセストークンがある場合はどこに記述するかと言うと...

```js
axios
.get(`https://qiita.com/api/v2/users/[ユーザー名]/items`, {
	headers: {Authorization: `Bearer ${this.qiitatoken}`}
						//テンプレートリテラルを使用しています
      })
```
axios.get(url)の後ろにオブジェクト形式で記述を追加します。
これでアクセストークンが反映されます。
アクセストークンありの場合はdataに **qiitatoken: トークン番号** を記述して下さい。

## methodsを実行する
データの取得のみですのでcreated:で上記の処理を呼び出します。

```js
created: function() {
    this.getAPIs()
  }
```

## v-forで取得したデータを表示する
HTMLファイル側に記述をします。
updated_atに更新日、urlにその記事へのurl、titleにその記事のタイトルが入っていますので、それをv-forで記事数分表示させます。

```html
<ul>
    <li v-for="item in infoAll" :key="item.id">
        {{ item.updated_at }}<br>
        <a :href="item.url" target="_blank">
        {{ item.title }}
        </a>
    </li>
</ul>
```

## まとめ
コードの全体図です。
アクセストークンがある場合は記述を追加してください。

```js
data: function() {
    return {
        qittatoken: 'トークン番号' //アクセストークンがある場合は記述 
    	infoAll: {}
    }
},
methods: {
    getAPIs: function() {
      axios.get(`https://qiita.com/api/v2/users/[ユーザー名]/items`) 
      //アクセストークンがある場合はget()内に記述を追加してください
      .then(res => {
        this.infoAll = res.data
        console.log(this.infoAll)
      })
	}
 },
created: function() {
    this.getAPIs()
  }  
```
[Trello] 誤ってアーカイブしてしまったアイテムの復元手順の忘備録

# 概要

* リストを間違ってアーカイブした際、復元するまでの手順が初見で見つからなかったのでまとめておきます。

# 復元手順

## リスト
1. ボードの右上にある `･･･ボードメニューを表示`
2. `･･･もっと見る`
3. `アーカイブ済みのアイテム`
4. `リストに切り替える` タブ
5. `ボードに戻す`
Stretch apache2

sudo apt-get install -y ntp

まずはインストール
sudo apt-get install apache2

aliasの方法は次の通り

sudo vi /etc/apache2/mods-enabled/alias.conf
<pre>
        Alias /www/ "/mnt/root/www/"

        <Directory "/mnt/root/www">
         AllowOverride All
         Options +ExecCGI +Includes +Indexes
         Require all granted
        </Directory>
</pre>
sudo systemctl restart apache2

sudo vi /etc/apache2/conf-available/serve-cgi-bin.conf

このなかにあるcgiパスを変更する
<pre>
 <IfDefine ENABLE_USR_LIB_CGI_BIN>
         ScriptAlias /cgi-bin/ /mnt/root/www/cgi-bin/
         <Directory "/mnt/root/www/cgi-bin">
                 AllowOverride None
                 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch +Includes
                 Require all granted
         </Directory>
 </IfDefine>
</pre>
sudo a2enconf serve-cgi-bin.conf
sudo a2disconf serve-cgi-bin.conf
sudo a2enmod cgid

cgi, ssiが有効となる拡張子の指定

sudo vi /etc/apache2/mods-enabled/mime.conf

コメント解除し、CGIとして扱う拡張子を設定
AddHandler cgi-script .cgi .pl     ← この行のコメントアウトを外し有効化する

また、
sudo vi /etc/apache2/apache2.conf
にて 
   <Directory "/mnt/root/www">
            AllowOverride None
             Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
             Require all granted
  </Directory>
をアクセス許可が必要。

デフォルトで検索されるファイル名の設定
sudo vi /etc/apache2/mods-enabled/dir.conf

sudo a2enmod include cgid 
sudo a2dissite *
sudo a2ensite *
sudo systemctl restart apache2

sudo vi /etc/apache2/mods-available/mime.conf
sudo vi /etc/apache2/mods-available/dir.conf
sudo vi /etc/apache2/conf-available/serve-cgi-bin.conf

ipv６対応

sudo vi /etc/modprobe.d/ipv6.conf
<pre>
# Don't load ipv6 by default -> loading
#alias net-pf-10 off                  #コメントアウト
#alias ipv6 off
</pre>
あとは、DNSを更新すればOK

wget -O - 'http://[MasterID]:[Password]@www.mydns.jp/login.html'

<!-- IPv6-test.com button BEGIN -->
<a href='http://ipv6-test.com/validate.php?url=referer'><img src='http://ipv6-test.com/button-ipv6-big.png' alt='ipv6 ready' title='ipv6 ready' border='0' /></a>
<!-- IPv6-test.com button END -->
Stretch 使い方



sudo raspi-config にてSSHなどの有効化

そして、まずはDHCPの固定化

sudo vi /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.1.53
static routers=192.168.1.1
static domain_name_servers=192.168.1.1


sudo apt-get update

sudo apt-get install ntfs-3g 

sudo mkdir /mnt/root
sudo mount -t ntfs-3g /dev/sda1 /mnt/root

sudo vi /etc/fstabにて次の一行を追加
/dev/sda1    /mnt/root       ntfs-3g defaults,nofail       0    0

sudo apt-get install samba samba-common-bin

sambaの設定

$ sudo vi /etc/samba/smb.conf
とりあえず以下の設定をファイルの最後に書き込んで保存

[ROOT]
comment = root
read only = no
locking = no
path = /home/pi
guest ok = yes
force user = pi

path = /mnt/root

sambaのユーザとraspbian上のユーザは別なので、sambaのユーザ用のパスワードを設定する

$ sudo useradd username
にてuserを追加した方がいいらしい。

$ sudo smbpasswd -a username
パスワードを入力する

sambaの起動

$ sudo systemctl restart smbd

再設定は

$ sudo raspi-config
競プロで役に立ちそうなこと(備忘録)

##はじめに
競プロで使える知識が書いてあるwebサイトを備忘録として残そうと思ったので書いています。
追記していく予定です。

##目次
01bfs(20/08/26)
目安計算量(20/09/20)
next_permutation関数(20/11/20)

##01bfs
https://betrue12.hateblo.jp/entry/2018/12/08/000020
(20/08/26)

##目安計算量
大体10^7(早めのあるやつだと10^8もいけることがある)
https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0
(20/08/26)

##next_permutation関数

```cpp

  vector<int> ch = {1, 2, 3};
  do {
    for (int i : ch) {
      cout << i;
    }
    cout << endl;
  } while (next_permutation(ch.begin(), ch.end()));

```
こんな感じで使う

```
123
132
213
231
312
321
```
出力はこう
Vue.js $refsについて

以下のように:refで変数を使ってrefを作った際に、うまくメソッドが呼び出せなかったのでそれについて書きます。

```javascript
<div v-for="j of modalTextAreaNumber" :key="'id'+j">
   <modal-textarea :modal-id="j-1" :ref="'modal'+(j-1)"/>
</div>
```

```javascript
vm.$refs[ref].なんかしらmethod()
//つまりインスタンスの定義にて
this.$refs[ref].なんかしらmethod()
```
とかけばうまくいくと思っていましたが、うまくいきませんでした。
検証ツールでconsole.log(this.$refs[ref])してみると、

```javascript
this.$refs[ref][0].なんかしらmethod()
```
としないとうまくいかないことがわかりました。
[UE4] 他プロジェクトへのアセット移行方法 (Unityでいうunitypackage)

# UE4プロジェクト内のアセットデータの様子

UE4の**Contentフォルダ**以下のデータは基本的に .uassetというデータ形式に変換されている。
さらに大変なことは、エクスプローラ上でコピーして他のプロジェクトに移動させたとしても、正確に動くことは保証されない。

理由の一つは、UE4内のデータの参照の取り方がContent以下の**相対パス**であるからである。
ちなみにUnityは.metaファイルのGUIDによって参照を取っている。

これらをあまり考えずにデータを扱うためには、UE4のお作法に従うのが一番である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/f18a411a-2b50-6c2e-1249-fb1072423345.png)

# Unityならunitypackage

あるプロジェクトで使用したアセットやコードの一部をファイルとしてまとめ、他のプロジェクトに転用したいというとき、UnityならunitypackageにExportするという方法が思いつく。

これにより**metaファイルを気にせずデータ移行できるのだ。**

しかし、**UE4にはExportやImportできるような特殊なデータ形式が存在しない。**

実際には、Content以下の相対パスを維持しながらファイルをコピペすれば、移動できる。

でも、めんどくさいことを考えずに移行する方法がある。

それが次の2つである

- Migrate (移行) を使用する
- Pluginを使用する (Unityでいうunitypackage)

#  Migrate (移行) を使用する

## 目標

ProjectAのContent/ProjectA/Hoge 以下のアセットデータをProjectBに移動する。

## やり方
- ProjectAのコンテンツブラウザを開き、Hogeフォルダを右クリック
- Migrate (移行) をクリック
- ProjectBの**Contentフォルダ**を選択

## おすすめのコツ

プロジェクトのディレクトリ構成を

Content/ProjectCode/色々

のようにProjectCodeフォルダを作ることで、移行時に競合しにくくなる。

# Pluginを使用する (Unityでいうunitypackage)

## 手順 

- Pluginの作成とExport
    - 新しくPluginを作成
    - Plugin化したいアセットを移行する
    - PackageでExport
- PluginのImport
    - Pluginsフォルダを作りコピー&ペースト
    - Pluginウィンドウで確認

## 新しくPluginを作成

[編集]>[プラグイン]でプラグインウィンドウを開く。

プラグインウィンドウで[New Plugin]を選択

- Content Onlyを選択
- Plugin Nameを記入
    - Authorなど必要あれば記入 (Option)
- [Create Plugin]を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/56e31b19-f767-21b9-468e-b74dbc315e0d.png)

## Plugin化したいアセットを移行する

Plugin化したアセット群をフォルダに入れ、右クリックで「移行」を選択。そうすることで
参照関係のミスがなくなる。

移行先を`${自分のUEプロジェクトフォルダ}\Plugins\TestPlugin\Content`

以下に設定する。

すると移行する。

## PackageでExport

プラグインウィンドウからPackageを選択。

Export先を選択 (Desktopなどどこでも可能)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/4435a9c4-1a16-719e-83c0-becc54c5c552.png)

## Pluginsフォルダを作りコピー&ペースト

ProjectFolder > Plugins (Contentフォルダと並列) 以下にコピー。その後UEを再起動。

以下のようなプロジェクト階層になっていればOKです。

- ProjectFolder
    - Config
    - Content
    - Plugins
        - PluginName
            - Content
            - Resources
            - PluginName.uplugin
    - ProjectName.uproject
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/3a3c6904-b4a7-cd2e-ca2a-55535d92e11d.png)

これでPluginのImportもOK!

# PluginにC++を含めるときは...?

後日記事で共有します！
自分用メモ

自分用メモです。間違っていたら指摘下さい
VBAで.ps1を同期実行する方法

```
Sub RunBatWshShell()

    Dim obj As New IWshRuntimeLibrary.WshShell
    Dim ret As Long
    
'    ret = obj.Run("%windir%\System32\notepad.exe ""C:\web\testfile.txt""", 1, True)
'    変数＝クラス設定（"PowerShell指定"".ps1ファイル""",Windows構文指定,起動アプリケーションの終了確認"）
     ret = obj.Run("%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe ""C:\Users\ユーザー名\myfile\babys\20200827_messagebox_powershell\messagebox.ps1""", 1, True)
    
    MsgBox "111"

End Sub
```

参考：https://vbabeginner.net/vba%E3%81%A7%E4%BB%96%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%90%8C%E6%9C%9F%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%EF%BC%88wshshell%EF%BC%89/
コードスタイルをチェックするツール

###使うライブラリ
pycodestyle
>
Features
Plugin architecture: Adding new checks is easy.
Parseable output: Jump to error location in your editor.
Small: Just one Python file, requires only stdlib. You can use just the pycodestyle.py file for this purpose.
Comes with a comprehensive test suite.

flake8
>Flake8 is a wrapper around these tools:
PyFlakes
pycodestyle
Ned Batchelder’s McCabe script


pylint
>Pylint is a Python static code analysis tool which looks for programming errors, helps enforcing a coding standard, sniffs for code smells and offers simple refactoring 

##チェックするコード

```python:qiita.py
import pycodestyle
import flake8
import pylint


import os
x = {"adfasd"       , 'adsfasdfasd'}
y         =1
```

##pycodestyle

```
NEW1.py:6:20: E203 whitespace before ','
NEW1.py:7:2: E221 multiple spaces before operator
NEW1.py:7:12: E225 missing whitespace around operator
NEW1.py:8:1: W391 blank line at end of file

```

##flake8

```

NEW1.py:1:1: F401 'pycodestyle' imported but unused
NEW1.py:2:1: F401 'flake8' imported but unused
NEW1.py:3:1: F401 'pylint' imported but unused
NEW1.py:5:1: F401 'os' imported but unused
NEW1.py:6:20: E203 whitespace before ','
NEW1.py:7:2: E221 multiple spaces before operator
NEW1.py:7:12: E225 missing whitespace around operator
NEW1.py:8:1: W391 blank line at end of file

```
##pylint

```
************* Module newww.NEW1
NEW1.py:6:20: C0326: No space allowed before comma
x = {"adfasd"       , 'adsfasdfasd'}
                    ^ (bad-whitespace)
NEW1.py:7:10: C0326: Exactly one space required around assignment
y         =1
          ^ (bad-whitespace)
NEW1.py:8:0: C0305: Trailing newlines (trailing-newlines)
NEW1.py:1:0: C0103: Module name "NEW1" doesn't conform to snake_case naming style (invalid-name)
NEW1.py:1:0: C0114: Missing module docstring (missing-module-docstring)
NEW1.py:6:0: C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
NEW1.py:7:0: C0103: Constant name "y" doesn't conform to UPPER_CASE naming style (invalid-name)
NEW1.py:1:0: W0611: Unused import pycodestyle (unused-import)
NEW1.py:2:0: W0611: Unused import flake8 (unused-import)
NEW1.py:3:0: W0611: Unused import pylint (unused-import)
NEW1.py:5:0: W0611: Unused import os (unused-import)
NEW1.py:5:0: C0411: standard import "import os" should be placed before "import pycodestyle" (wrong-import-order)

-------------------------------------
Your code has been rated at -10.00/10


```

###まとめ
厳しさ
pylint > flake8 > pycodestyle
Safariのvideoタグ＋trackタグ

getUserMediaからstreamを取り出してvideoタグで表示していのだが、
どうも、SafariのVideoタグにtrackタグがあると動かなくなる。

```
<video src="some stream">
  <track kind="xxx" />
</video>
```

だと動かない。

```
<video src="some stream">
</video>
```
にしたら動いた。なかなか情報がなくて困った。
スプレッドシートのmid関数で抜き出された文字列は文字列である

#    戒め

>A1には「00000」が入ってる

```
=if(mid(A1,3,1)=0,true,false)
```

で返ってくるのは

> **false**　が返ってくる

？？？？？なんで？？？？？

リファレンスによると
mid関数で返ってくるのは
**文字列**
なので、


```
=if((mid(A1,3,1)-0)=0,true,false)
```

括弧で囲んでマイナス0で無理矢理数値へ！

無事にTrueが返ってきました。
わーい
【Heroku】にデプロイしたGitを利用してソースを変更を加える

###Githubに新しくリポジトリが作成されているけど、それを変更しても反映されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/296db360-68f1-e31a-cb80-40aad4ba6213.png)

HerokuにLaravelのアプリをデプロイするとGithubに新しくリポジトリが作成されていました。

Github上で確認したURLからクローンして変更を加えたら反映されると思いきや・・・

これを変更して、HerokuでOpen Appをしても変更が反映されていませんでした。

ではどうすれば変更されるのか。


###HerokuのGitのURLとGithubのURLが違う

```：ターミナル
git remote -v
heroku	https://git.heroku.com/obscure-falls-50711.git (push)
```

上記のようにリモート名とURLが表示される。

これをローカルにcloneして変更して、pushすると変更が反映されるようになる。


###HerokuのGitをクローンしよう

流れとしては
1. heroku listでアプリ名の一覧を表示して確認する
2. ターミナルでdesktopに移動しておく
3. heroku git:clone　--app アプリ名でデスクトップにアプリ名のついたディレクトリが作成されダウンロードされる


```:ターミナル
$ heroku list

//　アプリ名が表示される

$ cd desktop // desktopに移動
$heroku git:clone --app アプリ名
```

これで作成されたディレクトリをエディタで開いて編集して

```:ターミナル
$ git add . // ステージング
$ git commit -m "コメント" // ローカルリポジトリにコミット
$ git push // ローカルリポジトリの内容をリモートリポジトリに反映
```

これでテスト用に変更した文字列がちゃんと変更された文字列で表示されるようになりました。

実際はブランチを作成してから反映した方がいいと思いますが、本番環境がなければそのままpushしても良いのかと思います。

###Herokuでは画像アップロードが使えない
どうやらHerokuではstorageに画像を保存するようになアプリはダメらしい。

アップできても時間制限があったりするみたい。

ローカルで

```:ターミナル
php artisan storage:link // シンボリックリンクの作成
```
これをしても、Herokuにアップした段階で消えてなくなっていました。

また新たに作ることはできないのか調べましたが、それらしい情報が出てこなかった。。。

どうやら別のAWSなどの外部ストレージに画像は保存しないといけないらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/5190f49b-4729-4d81-5b0c-513af2ca3621.png)


ということは、せっかくデプロイしたやつ書き換えないといけないのでは？

ということで今まで避けていたGitの学習を大急ぎでやりました。

とても勉強になりましたね。ちゃんと理解はまだできていない段階ですが、かなりGitについて理解が深まりました。

これからもデプロイした内容をブラッシュアップしていかないといけないので、この機会にブランチも積極的に使用していこう！
[データ構造]キューとスタックとリングバッファー

##キュー構造
`キュー構造`とは窓口に人々が並んで待つようなデータ構造のことである。
列の１番後ろにデータを追加して、先頭のデータから順に利用していく。
つまり、キュー構造は、最初に入れたデータを最初に使う事になる。
先入れ先出し(first in, first out)なのでFIFOと呼ばれている。
キューにデータを入れることを`Enqueue`、取り出すことを`Dequeue`と呼ぶ。

##スタック構造
`スタック構造`は、最後に入れたデータを最初に使う。
また、後入れ先出し(last in, first out)なのでLIFOと呼ばれる。
スタックにデータを入れることを`Push`、取り出すことを`Pop`という。
そして、最後に入り最初に使う、スタックの最後尾のことをスタックトップという。

##リングバッファー
`リングバッファー`とは、リング状にデータが並べられたデータ構造のことである。
つまり、データの列の先頭(トップ)と末尾(ボトム)を繋いだ輪っかのようなデータ構造である。
古いデータを最新の内容で上書きして常に一定のデータを蓄えるような時に用いられる。
【忘備録】Java : 設定ファイルの仕組みを学びながら簡易プロジェクトを作成。

## 記事を通して分かること
・eclipseを使用した簡易プロジェクトの作り方
・サーバーの立て方
・web.xmlファイルの中身

## 前提
・eclipseがインストールされていること
・apache tomcat9 がインストールされていること
・Java : 1.8
・OS ： Mac

## サーバーの立て方
##### 1, eclipse起動
##### 2, サーバを立てる
2-1, 「`使用可能なサーバがありません...`」をクリック
2-2, 「`Tomcat v9.0 サーバー`」をクリック
2-3, 完了をクリック
##### 3, 動的プロジェクトの作成
3-1, `ファイル→新規→動的プロジェクト`の順にクリック
3-2, `プロジェクト名`を記入(今回は適当に「tomcat_test」)
<font color="red">(注意)「ターゲット・ランタイム」欄は立てたサーバのバージョンに合わせる。</font>
3-3, 完了をクリック
##### 4, 立てたサーバにプロジェクトを追加
4-1, 立てたサーバを右クリック
4-2, `追加および除去`をクリック
4-3, `使用可能欄に存在するプロジェクト`を選択
4-4, `追加`をクリック→完了
##### 5, 以上の設定を確認
5-1, サーバを立てると`パッケージ・エクスプローラ`に`Servers`ディレクトリが生成される
5-2, 配下の`server.xml`をソース表示で開いて最後尾部分に下記のような記述があればサーバがプロジェクトを認識していることになる。

```Servers/server.xml
<Context docBase="プロジェクト名" path="/プロジェクト名" reloadable="false" source="org.eclipse.jst.jee.server:プロジェクト名"/></Host>

```

##### 6, packageとclassファイルを作成
6-1, プロジェクトを右クリック→新規→クラスの順にクリック
6-2, パッケージ名がデフォルトで入っているので
削除して作成したいパッケージ名を記入。
6-3, 名前欄にクラス名を記入(今回は「`HelloWorld`」)→完了をクリック
6-4, 作成した`HelloWorld.java`ファイル内に下記コードを`とりあえず`記述

```HelloWorld.java
mport java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
   private static final long serialVersionUID = 1L;

   public void doGet(HttpServletRequest request,HttpServletResponse response)
      throws IOException, ServletException {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Hello World!</title>");
         out.println("</head>");
         out.println("<body>");
         out.println("<h1>Hello World!</h1>");
         out.println("</body>");
         out.println("</html>");
      }
}

```

###### 7, クラスファイルを実行するためのルーティング設定
7-1, WebContent配下の`WEB-INF`を右クリック→ 新規→ファイルの順にクリック
7-2, ファイル名に「`web.xml`」と記入し作成→完了
7-3, 下記コードを`とりあえず`記述

```WEBINF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>パッケージ名.HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>
hello
</servlet-name>
<url-pattern>
/servlet/helloWorld
</url-pattern>
</servlet-mapping>

</web-app>
```
#### 解説
下記コードで今回作成した`HelloWorld.java`をコンパイルしたクラスファイルを`hello`という名前でラッピングしている。

```web.xml(抜粋)
<servlet-name>hello</servlet-name>
<servlet-class>パッケージ名.HelloWorld</servlet-class>
</servlet>
```
下記コードでさらにラッピングしたクラスファイル(ここでは`hello`)は`/servlet/hello`にアクセスされた際に実行(doGet)されると定義

```web.xml(抜粋2)
<servlet-mapping>
<servlet-name>
hello
</servlet-name>
<url-pattern>
/servlet/helloWorld
</url-pattern>
</servlet-mapping>
```
##### 8, 起動して確認
8-1, `http://localhost:8080/tomcat_test/servlet/helloWorld`にアクセス
8-2, 下記画面が出てれば成功

![スクリーンショット 2020-08-26 1.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496032/1ee41c95-0566-de72-bb91-9149eca99410.png)
React ReduxでObjectの追加・変更・削除、そして再レンダリング

# はじめに
react redux でstateを管理しているときObejectのkeyに変数を使った場合の操作に苦戦したので、その備忘録として書きます。
同じように苦戦している方の助けになれば幸いです。

## サンプルコード
node v13.7.0
react 16.13.1

### 目的
こんなObjectを、、、

```react
sample{ 'sample_1' : 1, 'sample_3' : 4}
```

```react
sample{ 'sample_1' : 5, 'sample_3' : 1, 'sample_2' : 9 }
```
みたいに変更したい。


```javascript:action.js
export const ADD_STATE = 'ADD_STATE';
export const CHANGE_STATE = 'CHANGE_STATE';

//{sample_{i} : data}の連想配列を追加する
function add(i, data){
  var key = i;
  var data = data;
  dispatch(addState(key, data));   
}

//sample_{i}の値を data に変更する
function change(i, data){
  var key = i;
  var data = data;
  dispatch(chageState(key, data));
}

const addState = (key, data) => ({
  type: ADD_STATE,
  key,
  data
});

const chageState = (key, data) => ({
  type: CHANGE_STATE,
  key,
  data
});
```

```javascript:reducer.js
const initialState = {
  sample: {}
}

export default (state = initialState, action){
  switch(actio.type){
    case 'ADD_STATE':
      const addKey = `sample_${action.key}`;
      var data = {};
      data[addKey] = action.data;
      var newSample = state.sample;
      newSample = Object.assign({}, newSample, data);
      return Object.assign({}, state, {
        sample: newSample
      });

    case 'CHANGE_STATE':
      const changeKey = `sample_${action.key}`;
      var data = {};
      data[changeKey] = action.data;
      var newSample = state.sample;
      delete newSample[changeKe];
      newSample = Object.assign({}, newSample, data);
      return Object.assign({}, state, {
         sample: newSample
      });
   
    default:
      return state;
  }
};
```

### ここでのポイント

```javascript
var data = {}
data[key] = action.data; // data {key: data}
var newSample = state.sample; //newSample {sample_key: sample_data}

newSample = Object.assign({}, newSample, data) //newSample {sample_key:sample_data, key:data}
```
Ogjectの変更を Object.assign を使っているところが今回のポイントになりました。

上記の例を使わず連想配列を追加する方法はありますが、その方法では再レンダリングされなかったです。

```javascript
newSample[key] = action.data; //NG
```

変更時は、

```javascript
var data = {};
data[key] = action.data; // data {key:data}
var newSample = state.sample; // newSample {sample_key:sample_data, key:data}
delete newSample[key]; //newSample {sample_key:sample_data}

newSample = Object.assign({}, newSample, data); // newSample {sample_key:sample_data, key:data}
```
ここでは、一度 delete して変更する対象の連想配列を削除しています。

## さいごに
こうして、OBjectの変更して、再レンダリングできました！