OmniAICreator/Qiita-1.07M huggingface dataset:
Vueコンポーネントをもっと「効率的にテストする」

# 初めに
vueのテストでコンポーネントを生成する際、
- 基本的にデフォルト値を使用
- 必要な値だけ変更
という感じで簡単に生成できるよう考えました。

Vuetifyの[「効率的にテストする」](https://vuetifyjs.com/ja/getting-started/unit-testing/#%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B)の以下のようにしても良いですが
「これだと結局propsData全部指定しなきゃいけないし増えたらケース毎に指定するの面倒じゃない？」
と思ったのが発端です。

# やってみる

## 元のソースコード

```js:「効率的にテストする」から引用

  const mountFunction = options => {
    return mount(CustomCard, {
      localVue,
      vuetify,
      ...options,
    })
  }

  it('should have a custom title and match snapshot', () => {
    const wrapper = mountFunction({
      propsData: {
        title: 'Fizzbuzz',
      },
    })

    expect(wrapper.html()).toMatchSnapshot()
  })

```

## いじったあとのソースコード

```js:デフォルト値を指定

  // デフォルトの値を指定
  const defaultOptions = {
    title: 'Fizzbuzz',
    text: 'hogehoge',
  }

  const mountFunction = (options=defaultOptions) => {
    return mount(CustomCard, {
      localVue,
      vuetify,
      propsData: Object.assign(defaultOptions, options),
    })
  }

  it('デフォルトの値をそのまま利用する場合', () => {
    const wrapper = mountFunction() // 値を気にしなくて良いテストはそのままデフォルト値を使用
    expect(wrapper.html()).toMatchSnapshot()
  })

  it('複数のpropsの中で一つだけ変更したい場合', () => {
    const wrapper = mountFunction({ title: 'BuzzFizz' }) // 必要な値だけ更新してテスト
    expect(wrapper.html()).toMatchSnapshot()
  })

```

# まとめ

ただの表示確認なら`mountFunction()`でいいですし
一つのプロパティに値を設定してその結果を見たいなら`mountFunction({ key: value })`で、そのプロパティ以外の無駄なコードを省けますし使えるかも！
とvue始めたての初心者が思いついた記事でした。
ありきたりかもしれませんが備忘録的な意味も込めて。

もっと良い方法なんかがあれば教えてください！

以上です。
[iOS] Firebase + fastlaneでdSYMアップロード

## 始めに

最近、dSYMのアップロードがFirebaseのコンソールからはできなくなっており、コマンドラインからしか受け付けなくなっていた。
なので、AppStoreからダウンロード・Firebaseにアップロードをfastlaneで自動化した。


## 目次

1. 前提
2. fastlaneをインストールと初期化
3. Appfileをセットアップ
4. Fastfileを編集
5. 実行してみる

## 前提

- 基本的なXcodeとiOSの知識がある
- Terminalの操作ができる
- FirebaseでCrashlyticsの設定まで完了している
    - https://firebase.google.com/docs/crashlytics/get-started?hl=ja
- BitcodeをOnにする
- [AppStoreConnect](https://appstoreconnect.apple.com)にアプリをアップロードしたことがある
    - アップロードできる権限がある


## fastlaneのインストールと初期化
[公式](https://docs.fastlane.tools/getting-started/ios/setup/)

Homebrewインストールがおすすめです。

```
$ brew install fastlane
```

その後、プロジェクトの場所まで移動し、以下のコマンドを実行する

```
$ fastlane init
```

fastlaneの初期化方法を選択する

```
1. 📸  Automate screenshots
2. 👩‍✈️  Automate beta distribution to TestFlight
3. 🚀  Automate App Store distribution
4. 🛠  Manual setup - manually setup your project to automate your tasks
```

自分の場合は、dSYMアップロードだけだったので、「４」を選択。
以下の２つのファイルが生成される。

```
fastlane/Appfile
fastlane/Fastfile
```

## Appfileをセットアップ

Appfileでプロジェクトやアカウントの設定を行う。

```txt:Appfile
app_identifier("[bundle identifier]") # アプリのバンドルID
apple_id("sample@example.com") # Apple ID
team_id("[team ID]")
itc_team_id("[appstoreconnect ID]")
```

#### team_id
[Developer Portal](https://developer.apple.com/account/#/membership)から取得

#### itc_team_id
AppStoreConnectにログイン後、以下のURLからJSONを確認する。
https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/user/detail
この中の`contentProviderId`の値。
取得方法は[こちら](https://github.com/fastlane/fastlane/issues/4301#issuecomment-253461017)を参照した。

#### Fastfileを編集

最小限の実装は以下のとおり

```
default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :dsym do
    download_dsyms(version: 'latest')
    upload_symbols_to_crashlytics(gsp_path: "[path to GoogleService-Info.plist]")
    clean_build_artifacts
  end
end
```

#### gsp_path
GoogleService-Info.plistへのパス

## 実行してみる

```
$ fastlane dsym
```

AppStoreConnectにログインするので、最初はパスワードを聞かれる。セッションが保存されるので、次回からはパスワードは聞かれない。

## 参考

https://qiita.com/giiiita/items/333af46cade134883c83
https://docs.fastlane.tools/getting-started/ios/setup/
https://docs.fastlane.tools/advanced/Appfile/
https://docs.fastlane.tools/actions/download_dsyms/
https://docs.fastlane.tools/actions/upload_symbols_to_crashlytics/
https://github.com/fastlane/fastlane/issues/4301#issuecomment-253461017
https://firebase.google.com/docs/crashlytics/get-started?hl=ja
自由なソフトとオープンソース(FLOSS)のライセンススライドを翻訳してみた

# はじめに
2017年の投稿だが、 [The Free-Libre / Open Source Software (FLOSS) License Slide](https://dwheeler.com/essays/floss-license-slide.html) を翻訳してみた[^license]。

ライセンスの包含関係図がいい。

# 自由な／オープンソースなソフトウェア (FLOSS)のライセンスのスライド

Free-Libre / Open Source Software(FLOSS)ライセンスは多数ありますが、広く使用されているものはごくわずかです。
広く使用されているライセンスは互換性がある傾向があります。つまり、ソフトウェアを組み合わせてより大きな作品を作成できます。
次の「ライセンススライド」の図は、一般的なライセンスを組み合わせることができる場合を簡単に示しています。

![floss-license-slide-image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/db2c0180-6d6e-28ab-5ff7-3e6bb9434269.png)

この図で、青色の箱は、さまざまなFLOSSライセンスの名前です。

箱Aから箱Bへの矢印は、ソフトウェアをこれらのライセンスと組み合わせることができることを意味します。
組み合わされた結果には、実質的にBのライセンスが含まれ、おそらくAからの追加が含まれます。

ソフトウェアを組み合わせられるかどうかを確認するには、それぞれのライセンスから始めて、矢印に沿ってたどり着ける共通の箱を見つけてください。

たとえば、Apache 2.0でライセンスされたソフトウェアとGPLv2+でライセンスされたソフトウェアは、どちらも「GPLv3またはGPLv3+」に到達できますので、GPLv3またはGPLv3+を使って組み合わせることができます。

この図は注意深く作成されているため、パスをたどることで、2つのライセンスに互換性があるかどうかを判断できます。
詳細については、ライセンステキストを調べる必要がありますが、これにより基本的な答えがすばやく得られます。

左側にあるのは「寛容(permissive)」なライセンスで、ソフトウェアがプロプライエタリになることを許可するものです。

左上の「パブリックドメイン」は厳密にはライセンスではありませんが、実際にはライセンスのように機能します。
著作権法の意味で、パブリックドメインは、作品に著作権がまったくないことを意味します。
パブリックドメインのソフトウェアであれば著作権の意味で何でもできますが、それは稀です。
ソフトウェアが明示的にパブリックドメインにリリースされたものでなければなりません。

次に、いわゆる「MIT」または「X11」ライセンスですが、これは非常に寛容です。
MITライセンスに基づくソフトウェアは、最新の3条項BSDライセンスと簡単に組み合わせることができます。
3条項BSDライセンスは、MITライセンスと比較すると、著者名を使用して許可なしに製品を宣伝または販売促進することを禁止する条項が追加されます。

最後に、Apacheバージョン2.0のライセンスがあります。

右側にあるのは、ソフトウェアがプロプライエタリになるのを防ぐ「強く保護される(strongly protective)」(「強力なコピーレフト」)ライセンスです。
これには、最も一般的なFLOSSライセンスであるGNU General Public License(GPL)が含まれます。

GPLにはGPLv2とGPLv3があり、後の「+」は「バージョンX以降」を意味します。
GPLv2のみのライセンスは、ネットワーク保護のAffero GPLv3と組み合わせることができませんが、GPLv2+はGPLv3を介して組み合わせることができます。

真ん中にあるのは、「弱く保護される(weakly protective)」(「弱いコピーレフト」)ライセンスで、寛容なライセンスと強く保護されるライセンスの妥協点です。
これらは、ソフトウェアコンポーネント(多くの場合、ソフトウェアライブラリ)がプロプライエタリになるのを防ぎますが、プロプライエタリなプログラムの一部になることを許可します。

GNU Lesser General Public License(LGPL)は一般的な弱く保護された保護ライセンスであり、LGPLv2.1とLGPLv3があります。
LGPLv2.1は、GPLv2以降のGPLのどのバージョンでもコードを再ライセンスする許可を与えていることに注意してください。

このようなライセンスのもう1つはMozilla Public License 1.1(MPL 1.1)ですが、MPLには、広く普及しているGPLと互換性がないという欠点があります。
MPLモジュールをGPLのプログラムで使用することはできません。

この情報は正しいと思われますが、法律上のアドバイスではありません。正式な法律上のアドバイスは弁護士にご相談ください。


# さいごに

日本のwikipediaは3箇所でこの図を使っているが、この投稿のように丁寧な説明がない。

この**ライセンスの包含関係図**はライセンスを学ぶ上で役立つと思って翻訳してみた。

この図に書かれていないが、CC BY-SA 4.0からGPLv3に向かう矢印があると考えられる。
それから、CC BY-SA 2.0から2.0以降のバージョンのCC BY-SAに向かう矢印があると考えられる。[^CreativeCommonsCompatibleLicenses]


[^license]: The Free-Libre / Open Source Software (FLOSS) License SlideはDavid A. Wheelerによる投稿でCC BY-SA 3.0かGFDLかGPL(v2 or later)の下で使用されている。「FLOSSのライセンスのスライド」の章はその日本語訳でCC BY-SA 4.0の下でライセンスする。「はじめに」と「さいごに」の章を追加。
[^CreativeCommonsCompatibleLicenses]: https://creativecommons.org/share-your-work/licensing-considerations/compatible-licenses や https://wiki.creativecommons.org/wiki/ShareAlike_compatibility
[C#] プロパティを文字列で指定して値をsetし、forループ中で使用する

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと

あるクラスで、同じようなデータを複数個、プロパティとして持っているものがあった。そいつが、

```cs
public List<double> DataCollection = List<double>();
```

と持てばいいのに、

```cs
public double Data1 = 0.0;
public double Data2 = 0.0;
・
・
・
public double Data20 = 0.0;
```

みたいな形で持っていたために、そこに値を入れるときにいちいち`Data1 = 10.0;`を20回書かないといけない、みたいなことになりものすごく冗長となった。

元のプロパティを色々な事情で直せない場合でも、せめてforでくるくる回して、値を全部のプロパティに代入できるようにしたい。

# 今回の解

`System.Reflection.PropertyInfo`クラスのメソッドを使用した。

```やりたいことができた.cs
class Program
{

    static void Main(string[] args)
    {
        var MyData = new MyData();

        for (int i = 0; i < 3; i++)
        {
            MyData.GetType().GetProperty("Data" + (i + 1)).SetValue(MyData, i);
        }

        Console.WriteLine($"OriginalProperty : {MyData.Data1}, {MyData.Data2}, {MyData.Data3}");
    }
}

public class MyData
{
    public double Data1 { get; set; } = 0.0;
    public double Data2 { get; set; } = 0.0;
    public double Data3 { get; set; } = 0.0;
}
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d6630df2-2b54-d128-693a-119380152a7b.png)


GetProperty
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/8a4146b3-ebd1-a0a5-8476-a4d9bc7a474d.png)

SetValue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/2e37c5d5-9a12-b823-8e69-51c3408a6139.png)

# 別解
コメントのほうで、インデクサを使ったやり方があるとアドバイス頂いたので試した。
コメント欄参照。↓↓

# 失敗例

C言語のポインタの配列のイメージで、下記のようにしたが、うまくいかなかった。
(暫くC言語書いてない＆想像で書いて実際にコンパイルしてないので正しく動くか不明)

```C言語のイメージ、こういうことがC#でしたい.c
double data1 = 0;
double data2 = 0;
double data3 = 0;

double* DataCollection[3] = { &data1, &data2, &data3 };

void main()
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        *DataCollection[i] = 10;
    }
}

```

```そのイメージで書いた.cs
class Program
{

    static void Main(string[] args)
    {
        var MyData = new MyData();
        double[] DataCollection = { MyData.Data1, MyData.Data2, MyData.Data3 };
        for (int i = 0; i < 3; i++)
        {
            DataCollection[i] = i;
        }
        Console.WriteLine($"Array            : {DataCollection[0]}, {DataCollection[1]}, {DataCollection[2]}");
        Console.WriteLine($"OriginalProperty : {MyData.Data1}, {MyData.Data2}, {MyData.Data3}");
    }
}

class MyData
{
    public double Data1 = 0.0;
    public double Data2 = 0.0;
    public double Data3 = 0.0;
}
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/abde3c70-31ca-d469-6905-f3d772df595b.png)
元のプロパティの値を一気にforで変えたいのに、変わってない。

# しらべたいこと
今回は、`Data1`、`Data2`みたいに末尾に連続した数字がついていたので今回のやり方でループで処理できたが、そうでない場合でもループさせたいときは、やっぱりC言語の時みたいに書きたい。
なんかやり方ないか？？

# 参考

https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.propertyinfo?view=netframework-4.8

[C#] 文字列でプロパティ名を指定してアクセス(参照・更新)する方法
https://webbibouroku.com/Blog/Article/access-property

【C#】プロパティ名でプロパティにアクセスする
https://qiita.com/tokishirazu/items/66a25331d4c78980366e

インデクサ
https://ufcpp.net/study/csharp/oo_indexer.html

switch式
https://ufcpp.net/study/csharp/oo_indexer.html
基本情報処理技術者試験の勉強について

就職活動でSier に内定をもらって、配属アンケートでの希望通りにSEになった。

親会社の意向で基本情報処理技術者試験を受験することが義務となった。

「合格」ではなく「受験」が義務らしい。でももともと取る気だったからちょうどいい。

勉強の方針や日記、現状などについて書いていきたいと思う。



[目標]
・基本情報処理技術者試験の令和２年秋試験に合格する
　→「午前問題」：６０点以上
　→「午後問題」：６０点以上　

[現状]
・「基本情報技術者試験ドットコム」(https://www.fe-siken.com/) の過去問道場
　→「午前問題」の得点率
　　→ランダムに８０問解いたとき：７５〜８０％程度
　　→別ページの模擬試験や過去問を解いたとき：６５％程度

　→「午後問題」の得点率
　　→問１　：情報セキュリティ　　　　　：６０％（必須問題）
　　
　　→問２　：ソフトウェア　　　　　　　：３０％
　　→問３　：データベース　　　　　　　：ー
　　→問４　：ネットワーク　　　　　　　：５０％
　　→問５　：ソフトウェア設計　　　　　：４０％
　　→問６　：プロジェクトマネジメント　：ー
　　→問７　：経営戦略・企業と法務　　　：５０％
　　
　　→問８　：データ構造及びアルゴリズム：５０％（必須問題）
　　
　　→問９　：C言語　 　　　　　　　　　：ー
　　→問１０：COBOL　　　　　　　　　　：ー
　　→問１１：java　　　　　　　　　　 ：４０％
　　→問１２：アセンブラ　　　　　　　　：ー
　　→問１３：表計算　　　　　　　　　　：ー




[やるべきこと]
・データベースの問題を解いてみる
・プロジェクトマネジメントの問題を解いてみる
・問９〜１３はjava を解く
・経営戦略・企業と法務と解く
・ソフトウェアを解く

言語は令和２年春からpython が登場したらしいが、コロナウイルスの影響で中止になった。過去問が少なすぎるのでpython はやめておこう。以前、独学を進めたjava で行こうと思う。

データベースの問題はSQL のコツを掴んでしまえば得点が上がりそう。

プロジェクトマネジメントもデータベース同様、解いたことがないのでやってみよう。得意になるかもしれない。

経営戦略・企業と法務は、用語とその計算式さえ覚えてしまえば解いていけると思う。

ソフトウェアは、スレッドを用いた並列処理の問題なので、実際にプログラムで書いて勉強してみればつかみやすいと思う。


当面のやることは、このへんかなあ。でも申込み(７月中旬)もまだまだ先なんだよなあ。
Snnipet

### $$PREBID_GLOBAL$$

- アダプターはPREBID_GLOBAL変数を使用できない。代わりに、必要な関数をロードして直接呼び出す必要があります。
<img width="928" alt="スクリーンショット 2020-04-21 21.23.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35255/a0eb713b-a0d5-2f49-2fc5-505e3cbf2645.png">
<img width="556" alt="スクリーンショット 2020-04-21 21.28.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35255/e54563a7-8ed4-326c-545d-8a031abeeb89.png">

### Safe Frameとは
SafeFrame は API に対応した iframe で、広告主とサイト運営者のコンテンツ間で通信を行うための統合された枠組みです。アド マネージャーの SafeFrame 技術により、ページ コンテンツと広告の間で透過的でリッチな通信が可能になる一方で、外部からの機密データへのアクセスを防止できます。また、GPT で SafeFrame コンテナを使って、表示するクリエイティブを細かく制御できます。
https://support.google.com/admanager/answer/6023110?hl=ja


## 動画広告種類
- **インストリーム**: “イン”ストリーム広告が動画の“中”で配信する動画広告
- **アウトストリーム**: “アウト”ストリーム広告は動画の“外”で配信する動画広告
    1. **インバナー広告**: サイトのメインコンテンツの外側に設置された広告枠で配信する動画広告
    1. **インリード広告**: 「コンテンツとコンテンツの間」や「コンテンツの下」など、メインコンテンツの中で配信
    1. **インタースティシャル広告**: 画面いっぱいに表示され、「スキップする」などをクリックすると目的のページに切り替わります。

<参考>
https://richka.co/times/4058/
IAB: https://www.iab.com/insights/digital-video-advertising-glossary/#chapter-18


## インタースティシャル広告
インタースティシャル広告とは、アプリとWebサイトのインタフェースにポップアップとして表示される広告のこと。 画面とページの切り替え・遷移時に自然なタイミングで表示される。 インタースティシャル広告が表示されたとき、ユーザーは広告をタップあるいはクリックしてリンク先に飛ぶか、広告をクローズして元画面に戻るかを選べる。
MeCabをインストールする時につまずいた事


素人の言語処理100本ノック:40より、CaboChaをインストールする時につまづいた事。


この記事の通りにubuntu上でCaboChaを入れる。
そして、中段以降の
「CaboChaのPythonバインディングのインストール」
を終えて、いざ、python3からCaboChaを動かそうとした時に、


```
>>> import CaboCha
Traceback (most recent call last):
  File "/home/〇〇/cabocha-0.69/python/CaboCha.py", line 18, in swig_import_helper
    fp, pathname, description = imp.find_module('_CaboCha', [dirname(__file__)])
  File "/usr/lib/python3.6/imp.py", line 297, in find_module
    raise ImportError(_ERR_MSG.format(name), name=name)
ImportError: No module named '_CaboCha'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/〇〇/cabocha-0.69/python/CaboCha.py", line 28, in <module>
    _CaboCha = swig_import_helper()
  File "/home/〇〇/cabocha-0.69/python/CaboCha.py", line 20, in swig_import_helper
    import _CaboCha
ModuleNotFoundError: No module named '_CaboCha'
```
となってubuntu上でCaboChaは動くが、ubuntu上のpython3でCaboChaはインポートできなかった。
そこでセットアップをインストールするところから再スタート。

```ruby:
〇〇@〇〇:~/cabocha-0.69/python$ python3 setup.py install
running install
running build
running build_py
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/CaboCha.py -> /usr/local/lib/python3.6/dist-packages
error: could not create '/usr/local/lib/python3.6/dist-packages/CaboCha.py': Permission denied
```
はい。権限チェックします。

```ruby:
〇〇@〇〇:~/cabocha-0.69/python$ ls -l
合計 272
-rw-r--r-- 1 CaboCha.py

〇〇@〇〇:~/cabocha-0.69/python$ chmod 777 CaboCha.py
〇〇@〇〇:~/cabocha-0.69/python$ ls -l
合計 
-rwxrwxrwx 1  CaboCha.py

```
これで、権限変更。
気を取り直してpython3でインポートするも、同様のエラー

なので、sudoつける

```ruby:qiita.rb
〇〇@〇〇:~/cabocha-0.69/python$ sudo python3 setup.py install
[sudo] 〇〇 のパスワード:
running install
running build
running build_py
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/CaboCha.py -> /usr/local/lib/python3.6/dist-packages
copying build/lib.linux-x86_64-3.6/_CaboCha.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages
byte-compiling /usr/local/lib/python3.6/dist-packages/CaboCha.py to CaboCha.cpython-36.pyc
running install_egg_info
Writing /usr/local/lib/python3.6/dist-packages/cabocha_python-0.69.egg-info
〇〇@〇〇:~/cabocha-0.69/python$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import CaboCha
>>>
```
これでエラーが出ない。おｋ。
Windows PCでMagic Keyboardを使う

この度、Apple Magic Keyboard(テンキー付き)を購入しました。これをWindows PCで使えるように設定したので備忘録として書かせていただきます。

<b>【必要なもの】</b>
・Bluetooth対応のWindows PC
・Boot Camp対応のMac PC
・dpinst.exe
・インターネット接続環境(Windowsサポートソフトウェアのダウンロードに必要です)
・USBメモリ(Windowsサポートソフトウェアの保存に使用します。クラウドストレージ等を使用する場合は不要です)

※WindowsとMac、共に64bitバージョンである必要があると思います。これについては未確認につき、不確定です。

<b>【手順】</b>
<b>MacでWindowsサポートソフトウェアをダウンロード</b>
「Boot Campアシスタント」を使用して「Windowsサポートソフトウェア」をダウンロードします。
「Boot Campアシスタント」はアプリケーションフォルダの「ユーティリティ」フォルダの中に含まれております。
「Boot Campアシスタント」を起動したら、画面上部の「アクション」メニューから「Windowsサポートソフトウェアをダウンロード」をクリックします。
保存場所(ディレクトリ)の指定を求められるので、USBメモリを指定して「保存」をクリックしてください。
ダウンロードが終われば、Windowsサポートソフトウェアの用意は完了です。

<b>Windows PCにMagic Keyboardのドライバをインストールする</b>
「Windowsサポートソフトウェア」を保存したUSBメモリをWindows PCに接続してください。
「Windowsサポートソフトウェア」のフォルダ内でBootCamp\Drivers\Appleとディレクトリをたどると「AppleKeyboardMagic2」フォルダが含まれております。この中にMagic Keyboardのドライバが含まれております。この中に「dpinst.exe」を配置して実行してください。
インストーラの画面が表示されますので、ガイドに従って進むとドライバのインストールが完了します。

<b>Windows PCとMagic Keyboardを接続する</b>
・WindowsのBluetooth機器接続機能機能を使用する事で簡単に接続可能です。

<b>IMEで 英数キー および かなキーに機能を割り当てる</b>
IMEのキー設定機能を使用して各キーに機能を割り当てます。
「英数キー」に「IMEを無効化」、「かなキー」に「IMEを有効化」を割り当てる事で、macOSライクの操作が可能となります。

以上で設定は終了です。

なお、「Windowsサポートソフトウェア」には、Magic Trackpad 2やMagic Mouse 2のドライバも含まれておりますので、「dpinst.exe」の実行ディレクトリを変更する事で、それらが使用可能になります。
「管理者として実行」をコマンドで

# いちいち「アイコンを右クリック」->「管理者として実行」なんてしたくない。
UACが有効になっているWindows環境でコマンドプロンプトを使っていると、
管理者でログインしてるのに何かと「アクセスが拒否されました」と言われますね。
いちいち、コマンドプロンプトを「右クリック」->「管理者として実行」もめんどい。

そんな時の回避方法

```cmd:prompt
REM ### 今起動しているコマンドプロンプトにて、powershellを起動。
powershell
```

プロンプトが変わったら以下のコマンドで、管理者モードのコマンドプロンプトが起動出来ます。

```powershell:prompt
Start-Process cmd -verb runas 
```

ついでに、起動したコマンドプロンプトから管理者モードのエクスプローラを起動する時はこちら。

```command:prompt
REM エクスプローラを起動したいフォルダに移動
cd c:¥temp¥i¥want¥to¥have¥privilege

REM エクスプローラを起動
start .

```
fastlane matchでAWS CodeCommitのリポジトリを使用する

# 前提
以下のURLを参考にgit-remote-codecommitのセットアップを行い、remote-codecommit形式でgit cloneできる状態にします。 
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-git-remote-codecommit.html

# fastlane matchで使う
`git_url` に remote-codecommit形式のURLを指定します。
app_certificatesというCodeCommitのリポジトリを使うとすると以下のようになります。

```
export CERT_REPO=codecommit::ap-northeast-1://app_certificates
bundle exec fastlane match development -a $MAIN_BUNDLE_ID --verbose --git_url=$CERT_REPO
```

ちなみにSwitchRoleなどを使っておりプロファイル名を指定する必要がある場合は以下のようにリポジトリを指定します。

```
export CERT_REPO=codecommit::ap-northeast-1://{プロファイル名}@app_certificates
```
Flutterで調べた内容をメモ的に残していきます。

以前の職場のリードエンジニアの紹介で3月からの現場でFlutterを使ってます。
3月は完全に勉強タイムで何が何だかわからないままでしたが、約2ヶ月経ちやっと理解してきました。
調べてもすぐに出てこなかった内容をメモ的にまとめようと思います。

今から30分後
`afterHalfHour = currentDate.subtract(new Duration(minutes: -30));`

画像の丸抜きをして、URLから画像を引っ張った上でGoogleみたいに頭文字だけ画像の中心に表示する

        NetworkImage img = NetworkImage(photoUrl);
        var avatar = CircleAvatar(
          backgroundImage: img,
          backgroundColor: Colors.blueGrey,
          child: Text(name.substring(0, 1)),
        );


知ってる人にしてみれば何を当たり前のことをと思うかもしれませんが、なかなか出てこなかったので記録として残していきます。
Drupalパスワードリセット方法

# ①Drupalディレクトリへ移動、以下のコード実行
```
php core/scripts/passsword-hash.sh "新しいパスワード"
```

ハッシュ値が画面に表示し、コピーする

# ②mysqlログインし、以下のテーブル修正行う
```
update users_field_data set pass='ハッシュ値' where name='変更したいユーザーID';
delete from flood;
delete from cache_entity;
commit;
```
エンティティって何？

# よく目にする「エンティティ」
ソフトウェア設計を行っていて対面することが多い「エンティティ」という言葉。設計書の図によく出てきますが、単語の意味が掴みどころがない感じだったので、ちょっと調べてみました。

## Wikipediaでは...
[エンティティ](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3)

> コンピュータ用語で、参照や関連付けを受ける**データ**や意味のまとまり。「実体」。 ⇒ 実体関連モデル

どの説明でも出てくる「実体」。プログラムをやっていると真っ先に出てくる用語「インスタンス」も「実体」ですよね？

Wikipediaの文中で「データ」という表現が自分の中で腑に落ちる気がします。インスタンスはデータって感じじゃないです。インスタンスはクラスが生成するオブジェクトのことです。

また[実体関連モデル](https://ja.wikipedia.org/wiki/%E5%AE%9F%E4%BD%93%E9%96%A2%E9%80%A3%E3%83%A2%E3%83%87%E3%83%AB) = **ER**図の**ER**は**E**ntity **R**elationshipの略で、データベースの設計で利用されてますね。


## IT用語辞典では...
[エンティティ](http://e-words.jp/w/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3.html)

> エンティティとは、実体、存在、実在（物）、本質、本体などの意味を持つ英単語。ITの分野では、何らかの標識や識別名、所在情報によって指し示される、**独立した一意の対象物**をエンティティということが多い。

独立した一意の対象物であることが多いんですね、生まれてくる赤ちゃんに名前をつけるようなものですね。


## エンティティの語源は...
最後に語源でなんとかイメージを掴んでみる。
[entity意味と語源 (語源英和辞典)](https://gogen-ejd.info/entity/)
> ㋶entitas（存在物）→㋶ens（存在している）＋-tas（抽象名詞）→㋶sum（存在する）の現在分詞形 →㋑hes-（存在する）が語源。「存在している（ens）こと（-ity）」がこの単語のコアの意味。㋓essential（必須の）と同じ語源をもつ。

essentialと同じ語源なんですね。何かの本質的な要素である感じなんですね。赤ちゃんという表現は良い線かも、、？

## まとめ 〜自分的解釈〜
以上から、自分のイメージでしっくりくる表現でまとめると、、
エンティティはデータ世界で生を受ける対象物のこと。エンティティという表現が使われたら、背景としてデータ世界（データベース）と、エンティティを生成しIDを与える別プログラムが存在する。
[JQuery]ページ内リンク（スクロール）の実装

# ページ内リンクへのスクロールの実装
ページ内リンクへのスクロール機能を作ってみたので復習として記録しておきます。
HPの作成などで縦に長くなって来るとスクロールでページ内の移動が出来るととても便利です。
<img src ="https://gyazo.com/ca87aec6d047a69492fac3e4ebccca49/raw" width=50%>
↑こんなやつです。
こちらはヘッダーの各項目がaタグになっていてhref属性にidを指定することにより対応するidのコンテンツに移動することができるようになっています。

# 実装方法
では早速実装方法について見ていきます。
先ずはヘッダー部分ですが、上で述べているようにaタグのhref属性に各項目のidを指定しています。

```index.html
<nav>
 <ul>
  <li ><a href="#home_btn">トップページ</a></li>
  <li ><a href="#about_btn">会社概要</a></li>
  <li ><a href="#works_btn">事業内容</a></li>
  ※省略
  <li ><a href="#contact_btn">お問い合わせ</a></li>
 </ul>
</nav>
```
こんな感じです。
それに対して、例えばお問い合わせの部分には

```index.html
<footer class="footer" id = "contact_btn">
 <div class="content-wrapper">
  <div class="address">
   <h2>お問い合わせ</h2>
  以下省略

```
という具合にフッター部分のidをcontact_btnに設定してヘッダーのお問い合わせと対応させています。
## scrollTopメソッド
ヘッダーの項目をクリックして下のコンテンツに移動させる為にここではscrollTopメソッドを使用します。
scrollTopメソッドとは、


```js

$('html, body').scrollTop(値);
```
というように記述することにより、ページの**Topから値分(px)**だけ移動するというメソッドです。
例えば$('html, body').scrollTop(500); ならばトップから下へ500pxだけ移動するというものです。
## animateメソッドとの合わせ技
さらに今回はscrollTopメソッドとanimateメソッドを組み合わせてスクロールにアニメーションをつけていきます。
上の記述を少しだけいじくって、

```js
$('html, body').animate({'scrollTop': 値}, 時間); 
```
ここまでをJSファイルで実装すると

```scroll.js
$(function() {
  var contact = $('#contact_btn'); //変数contactを定義
  contact.click(function() { //contactをクリックしたら
   $('html, body').animate({'scrollTop': 1000}, 500); //Topから1000px分だけ0.5秒かけて移動する
 }
);
```
という感じでしょうか？
取り敢えずこれで実装は完了です。

# 更に一歩踏み込んで
さて、一応完成したスクロールの実装ですが、このままですとナビゲーションの項目が増えていくと
変数var〇〇を項目の数だけ追加し・・・
それぞれの変数に対してclickイベントを設定し・・・
それぞれのコンテンツの移動距離を調べて・・・
やることが段々増えてきました😂

なんとかシンプルにならんもんか？
## offsetメソッドの登場
１つ１つ地道に実装するとして、一番面倒なのが移動距離を調べることかなと思われます。
この移動距離めんどくさい問題についてはoffsetメソッドが解決してくれます！！
offsetメソッドは

```js
$('セレクタ').offset();　//上端から〇〇px,左端から〇〇pxの位置
```
とすることでセレクタの位置情報を取得することが出来ます。
## attrメソッドで移動先を取得する。
次に、attrメソッドを使用して移動先を取得します。
attrメソッドとはHTML要素の属性を取得したり設定することができるメソッドになります。
例えば


```html

<h1 id= "test">テスト</h1>
```
に対して


```js

$('h1').attr('id');
```
とすると、attrメソッドによって　test が取得されます。
今回はまず、attrによってaタグのherf属性から移動先を取得し、取得した移動先への距離をoffsetで取得するというわけです。

```scroll.js
$(function() { 
  $('header a').click(function(){  //ヘッダーのaタグをクリック
    var id = $(this).attr('href'); //クリックしたaタグのherfの値（移動先）を取得し変数idに代入
    var position = $(id).offset().top; //上の変数idの上端からの位置情報を取得して変数positionに代入
    $('html,body').animate({'scrollTop': position},500); //0.5秒かけて変数positionで取得した距離を移動
   });
 });
```

これで完成！！
だいぶスッキリしました。

# まとめ
今回の実装では
①各コンテンツにidを設定する。
②ヘッダーの各リンクの飛び先をページ内リンクに設定する
③scrollTop()とanimate()メソッドを使いスクロールを実装。
④attr()でリンク先を、offset()でリンク先への距離を取得し変数にする。
という感じでページ内スクロールの実装を行ってきました。

JSを本格的に勉強し出して１ヶ月弱ですが、このような動きのあるページを作れるようになり楽しくなってきたところです。
コードの書き方など至らぬ点も多々あるかも知れませんが、お気付きの点ご指摘いただけますと幸いです。

最後までお読みいただきましてありがとうございました！！
数値実験用Mathematicaメモ

`RandomReal[]`と`RandomComplex[]`の乱数発生レンジはデフォルト．
使用した_Mathematica_のバージョンは 12.0.0.0.

# ランダムなユニタリ行列の生成

QR分解を利用する方法[^1]．

```mathematica
dim=3; (* dimension *)
unitary=(QRDecomposition@RandomComplex[{}, {dim, dim}])[[1]]; (* unitary matrix *)
```

# ランダムなエルミート行列の生成

```mathematica
dim=3; (* dimension *)
hermite=RandomComplex[{},{dim,dim}];
hermite=hermite+Transpose@Conjugate@hermite; (* Hermite matrix *)
```


# ランダムな実対角行列の生成

```mathematica
dim=3; (* dimension *)
diagonalr=DiagonalMatrix@Table[RandomReal[],dim]; (* diagonal matrix with real entries *)
```

# ランダムな複素対角行列の生成

```mathematica
dim=3; (* dimension *)
diagonalc=DiagonalMatrix@Table[RandomComplex[],dim]; (* diagonal matrix with complex entries *)
```


[^1]: [Maris Ozols, “How to generate a random unitary matrix”](http://home.lu.lv/~sd20008/papers/essays.html)
Agar.ioのAntiBOTがエグすぎるまとめ

Agar.ioは超有名なゲームなので知っている方もいると思います。

![agario](https://lh3.googleusercontent.com/bp3s6Q09VuD2mKvbAv_vM42ZyKYntjztN5-qEJV_Fr5sSRRqfDYaQDCEPFEM7Cchg_eB)

今回のお話はアプリ版ではなくブラウザ版のアガリオが対象です
https://agar.io/

現在は残念ながら過疎化が進んでしまいましたが、全盛期は本当に大人気でした（海外では）

人気なゲームゆえに、やはりチート（ボット）を作る人たちがいました。

2015年から始まったゲームですが、つい昨年までずっと「`ボットを作る→運営がBOT対策→Bot対策を突破できる新しいBotを作る`」が繰り返されてきました。


**なので現在のAgar.ioのAntiBotはかなりエグイものになっていますｗ**

私もAgar.ioを解析して独自のクライアントを作ったり、Botも作ったことがあるので、Agar.ioのBot対策がどんなものかをご紹介したいと思います。

#はじめに

Agar.ioのAntiBotを紹介する前に。

まず、Agar.ioは自分より小さい敵（細胞）を食べて大きくなっていくゲームです。
たくさん食べれば食べるほど大きくなれます

つまり、Botを大量にスポーンさせて自分に向かってくるようにすれば急速に大きくなれるわけです。

Botはゲームのプロトコルを真似れば（正規のクライアントを全く同じやりとりをすれば）作ることができます。

これをするためには
通信内容を解析したり、JavaScriptで書かれたゲームのコアを解析する必要があります。
補足：Agar.ioはWebSocketを用いたリアルタイムのオンラインゲーム

これを簡単に解析されては困るので運営はBotが作られるたびに解析が困難になるように対策するのです。

#Agar.ioのAntiBotまとめ
伝わりづらい部分も多々あると思いますが・・・。
順番に書いていきます

###Emscriptenで出力されたコア
JavaScriptが難読化されていても根気よく読めばいける！と思いたいですが、そうでもないんですよね
Agar.ioのゲーム本体のコードはEmscriptenで出力されたJavaScriptなので非常に解読が困難です。
(EmscriptenはC/C++で書かれたコードをJSに変換できるツール)

JavaScript Obfuscatorとかで難読化されたコードなら私でも読めますが、Emscriptenで出力されたら無理です

これのせいで未だに全てのプロトコルの解析ができた人はいません（ほぼできているけど）

###クライアントからサーバーに送信するメッセージがすべて暗号化されている
コードを解析できないなら、通信内容を解析すればいいんじゃね？と思いますが、これも対策が施されています

**クライアントから送信されるメッセージがすべてXORで暗号化されています。**

XORは以下のような性質があります

```
a ^ b = c
c ^ b = a
```
２回同じ値でxorすると元の値に戻ります
bが暗号化キーというわけです

クライアントでxor暗号化 -> 送信 -> サーバーでxor計算して複合化

という流れです

**「あれ？じゃあ暗号化キー判明すれば、通信内容とのxor計算するだけで複合化されたデータを見れるんじゃね？」**
と思うかもしれませんが、
**実はキーは一つのパケットを送信するごとに変化するようになっています。**

つまり、最初のキーがわかっても複合化できるのは一番最初に送信されるパケットだけになります。
次のパケットを解析したい場合は鍵を同じアルゴリズムで変化させなければならないのです

このアルゴリズムを解析するにはEmscriptenで出力されたコードを解析する必要があります。

###サーバーから送られてくるデータも暗号化されており、圧縮されているものもある

`サーバー -> クライアント`でも同じようにxorで暗号化されたデータが送られてきます。
一番最初に複合化するためのキーが送られてきます

また、一部のデータ（フィールド上のプレイヤーデータなど）は圧縮された状態で送られてきます。

ちなみに、先ほど`クライアント -> サーバー`のパケットは暗号化されていると書きましたが、
暗号化に使われるキーは、サーバーから送られてくるデータを使って生成されるます。

なので、生成されたものをコアから抜き取るか、サーバーから送られてくるデータを複合化するしかありません。

###データにずらしが入っている
botを作っても自分の方向に向かってくるようにしないと意味がありません

これを困難にするために、座標情報がずらされています。
説明が難しいですが、ずらしを考慮して座標パケットを送信しないとbotがスクランブルしてプレイヤーのもとに向かってきません。

###reCAPTCHA
有名なbot対策であるGoogle reCAPTCHAが導入されています。

いつごろからかわかりませんが、
reCAPTCHAが導入され、プレイヤーが何度もすぐに死んだり怪しいプロキシを経由して接続すると
reCAPTCHAによる認証が要求されてしまうようになりました

これを回避する方法が発見され、一時期盛り上がりましたが
今度はreCAPTCHA V2に続きV3が導入され、
プレイヤーがスポーンするたびにV3による認証が必要になりました。

これを突破したのが私なのですが、数か月後に対策されて今はもう使えませんTT

#さいごに
Agar.ioのantibotを紹介しました。（もしかしたら他にもあったかもしれない）

チートすることの何がおもしろいの？と言う人がいるかもしれませんが、
確かにただのプレイヤーだったら、すぐに飽きる原因になりますし、面白くないかもしれません

しかし、作る側からすればめちゃくちゃ面白いです
antibotを突破できたときの達成感はデカイですし、他の開発者と繋がったりゲームのオーナーと話ができたりして刺激的です。

もちろん褒められたことではありませんが、めちゃくちゃ成長できました。
おわりです
Xcodeで実機を使う！！エラー解決方法！！！

Xcodeで実機で動作確認をしようとしたのですが、
うまくできない場合があったので解決策を記述しました。

Xcodeでアプリを作成し、
PCとiphoneを繋ぎます。

![スクリーンショット 2020-04-21 20.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/bfecf726-8979-7cad-aa55-db2871595f73.png)






# Could not locate device support files.

![スクリーンショット 2020-04-21 20.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/62e49b2a-11b3-db0f-314d-042e4d2a91d5.png)

iPhoneのiOSのバージョンがXcodeのバージョンに対応していない場合に発生するようです。

iPhoneのiOSをアップデートしたことで、
起こってしまいました。

大抵の場合
#### Xcodeのバージョンを更新すれば治るよう
ですが、、、

Xcodeはかなり重いので、ダウンロードするだけでもだいぶ時間がかかります。。。。



### そんな方へ、もっと簡単な解決方法です。
#### 1.ここに行きます
https://github.com/filsv/iPhoneOSDeviceSupport

#### 2.上の画像の場合iOS13.4.1なので、iOS13.4のDownloadをクリックします。
<img width="1053" alt="スクリーンショット 2020-04-21 20.44.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/b410408b-275e-b8b1-2091-65f1f1cefc93.png">

ダウンロードしたzipファイルを開き、
フォルダごと次の場所に移動します

```
/アプリケーション/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
```

この方法でも
エラーは解決するようです。


# Could not launch “App Name”  iPhone has denied the launch request.

![スクリーンショット 2020-04-21 21.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/497298ca-d648-0dc9-d67f-d5b239ceeb1c.png)

これはProvision（プロビジョン）ファイルの設定がおかしいのが原因のようです。


### 解決方法

#### 1.下の画像のように"APP NAME"をクリックして下さい。
![スクリーンショット 2020-04-21 21.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/4c9838a5-4c86-6e40-7534-8dbd72549595.png)

#### 2."Edit Scheme"をクリックして下さい。
![スクリーンショット 2020-04-21 21.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/47c669e4-6eab-509c-26dd-88c2c74535a1.png)

#### 3."Executable"をクリックし"Ask On Launch"を選択して下さい。

![スクリーンショット 2020-04-21 21.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/83fdaf7f-6795-ed67-900a-df40ff2d5af7.png)
![スクリーンショット 2020-04-21 21.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/ef3592cf-838a-30b8-f488-df003478f32f.png)
![スクリーンショット 2020-04-21 21.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/fcfa171a-29ed-d059-35ed-9525d3c412dd.png)


closeをクリックし、
再度実機でテストで、治るようです！！

# (iphone側)信頼されていないデベロッパ
<img width="674" alt="スクリーンショット 2020-04-21 21.51.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/c712cddd-a579-c163-777a-14a73700f5a8.png">

### 解決方法
#### 「設定」-「一般」-「デバイス管理」で進みます

「一般」
<img width="361" alt="スクリーンショット 2020-04-21 22.08.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/527a97a3-d300-320d-192e-248cf7288b1e.png">
「デバイス管理」
<img width="357" alt="スクリーンショット 2020-04-21 22.07.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/8c821b7b-6858-d0c7-2846-66a4a7701164.png">

#### 「Apple Development:」
にて、APP Nameが表示されるので、
[Apple Development:-]
をタップ
<img width="354" alt="スクリーンショット 2020-04-21 22.07.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/8643fa6a-f891-62cf-2179-464d10f2a554.png">

#### [信頼]をタップします


### これで実機でテストができるようになります！！！！！！！！！
Google認証で ApiException:10 が発生

Google認証をやっていたら、下記の例外が発生

> com.google.android.gms.common.api.ApiException: 10:

下記で解決できるらしい。

**■参考サイト**
https://medium.com/@riscait/apiexception-10-error-in-sign-in-with-google-using-firebase-auth-in-flutter-1be6a44a2086
https://stackoverflow.com/questions/47437678/why-do-i-get-com-google-android-gms-common-api-apiexception-10
yarnのcacheでハマった


めったに起こらないエラーだと思うがyarnのキャッシュでハマった。同じ地雷を踏む人がいないとも限らないので書いておく。

ローカルで開発していたjavascriptのライブラリを

`yarn add javascriptのライブラリのパス`

でreactに追加して開発をしていたらyarn addの際に以下のエラーが出るようになった。

```
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error An unexpected error occurred: "ENOSPC: no space left on device, write".
info If you think this is a bug, please open a bug report with the information provided in "ライブラリのパス/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```
`no space left on device`のエラーメッセージを検索するとメモリの問題だったりinodeの問題のケースもあるみたいだが、今回はディスク容量の問題で、いつの間にか何かが400GB以上、ディスク容量圧迫していて他の作業もまともに進まなくなった。

`このmacについて→ストレージ`を開いて確認するも「その他」の領域のファイルが圧迫していることしかわからない（具体的なパスが出ない）

# 原因と解決
findとduコマンドで地道に調べていったところ以下のパスにyarnのcacheがたまっていた
`$HOME/Library/Caches/Yarn/`

開発していたライブラリのパスで
`yarn cache clean`
を実行して解決。
macやubuntuからgitにpushするときにつまずいた事

初かきこ...

###~ubuntuとmacでgithubの同じリポジトリを共有した時につまずいたことを記録~

#(1)mac側のvscodeでローカルリポジトリをいじくりまわしてプッシュしようとしたら失敗した。

今思うとpullとpushの押し間違いなのではないかと信じたい。
いろいろ試したが、これといった決定打はない。
最終的にはpushはできた。


#(2)mac側とWSLのubuntu側に同時にリモートリポジトリからローカルリポジトリを作成し、mac側で色々gitにpushする。次にubuntu側でいろいろ作業してpushすると失敗。


ubuntu側からpushできない。

```ubuntu:
$git push
error: Your local changes to the follwing files would be overwritten by merge:
       a.py
Please commit your changes or stash them before you merge.
Aborting
```
まずはa.pyをステージング、コミット、プッシュ(失敗)、プル

```ubuntu:
$git add a.py
$git status
ブランチ master
Your branch and 'origin/master' have diverged,
and have 〇〇 and 〇〇 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

コミット予定の変更点:
  (use "git restore --staged <file>..." to unstage)
        modified:   a.py

$ git commit -m "a.pyの変更。など適当に記入しておく"
[master 〇〇] a　ubuntu
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 〇〇 => 〇〇　a.py

$ git push
Username for 'https://github.com': 自分の登録名
Password for 'https://〇〇@github.com':　登録してるパスワード
To https://github.com/〇〇.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/〇〇.git'
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.

$ git pull
Username for 'https://github.com': 自分の登録名
Password for 'https://〇〇@github.com':　登録してるパスワード
```

これでなんとかリモート側とローカル側のリポジトリの同期が完了し、なんとかなった。
ASP.NET Core アプリの Cookie に secure フラグを立てる

# ASP.NET Core アプリの Cookie に secure フラグを立てる

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201), ASP.NET Core 3.1 (3.1.3) となります.

セキュリティ監査とかで secure フラグを立てないといけない人向け.

Startup.cs を開き、先頭に `using Microsoft.AspNetCore.Http;` を追加. 次に `ConfigureServices` メソッドに

```csharp
services.Configure<CookiePolicyOptions>(options =>
{
    options.Secure = CookieSecurePolicy.Always;
});
```

を追加する. 最後に `Configure` メソッドに

```csharp
app.UseCookiePolicy();
```

を追加する. どの行に設定するのがベストなのかはわからないが、`app.UseStaticFiles();` の次の行において動作することだけは確認した.
.mdbファイルが開けない！

##はじめに
- .mdbファイルを貰ったがAccessが入っていない！
- Accessはあるが2013以降のバージョンで開くことができない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/5df5f767-c0f7-fd71-aead-d849c6cb702b.png)

そんなこと、ありませんか？

そんな時は大体入っているでしょうExcelで.mdbファイルを開きましょう。
Excelがない？...ごめんなさい。

※今回紹介するのはMicrosoft Excel 2019での方法になります。

##どうやるの？
#####1.まずはExcelを起動し、確認したい.mdbファイルを開きます
この時、一覧に.mdbファイルが出てこない場合は対象を[**すべてのファイル**]に変更しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/31fd2ccc-ecef-ebef-b5d7-e6dad1a07cd7.png)

#####2.セキュリティの警告が出てくるので[**有効にする(E)**]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/51522302-89a7-a05f-3eb6-17420d0093bc.png)

#####3.データリンクプロパティが出たら、上部タブ[**プロバイダー**]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/50111ea0-ddaa-1862-1149-9f184ea88acd.png)

#####4.OLE DB プロバイダーを[**Microsoft Jet 4.0 OLE DB Provider**]にして[**次へ(N)>>**]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/64a1a8f7-bdc6-1d4e-b955-60568311209e.png)

#####5.すると、データベース名が空になっているので再度.mdbファイルを選択し、[**接続のテスト(T)**]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/27b635cc-2131-ad4d-d8c6-13547f8c2ae9.png)

#####6.接続が成功していれば以下の画像が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/6c9a6341-c065-9fc9-9e40-b3c7070ae6b9.png)

#####7.成功していれば[OK]を押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/ede40b63-fa54-a5fc-8cd4-db54ff8b119a.png)

#####8.見たいテーブルを選択して[OK]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/b31c6ef9-cb6a-b8ff-a7cb-7ef08788be8c.png)

#####9データの開き方も選ぶと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/167978d9-632d-c405-6134-4473c16410a3.png)

#####10..mdbに入っているデータが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/21c0e4e2-348d-7b30-2967-00a7a2c4ae07.png)

簡単でしょう？倉庫に眠っている.mdbファイルでお試しあれ。

###まとめ
~~.mdbファイルが開けなくなる前に移行するなど対策を講じておきましょう~~
アメリカ国防総省のクラウドベストプラクティスを参考にお勉強

いつも忘れないように、コンセプトから。

###コンセプト
・お金かけてまでやりたくないのでほぼ無料でAWSを勉強する
　→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
　→アカウントを不正に使われるととんでもない額を請求されるので防ぐ

今回はセキュリティの話ではないですが、昨日の続きというか、流れで調べていたのでその備忘というかメモです。昨日は[アメリカ国防総省のAWSセキュリティを参考にお勉強](https://qiita.com/auf/items/606c5585399ce6ea684e)について書いてました。

今日は、アメリカ国防総省のクラウドベストプラクティス
[（Best Practices Guide for Department of Defense
Cloud Mission Owners）](https://dl.dod.cyber.mil/wp-content/uploads/cloud/pdf/unclass-best_practices_guide_for_dod_cloud_mission_owners_FINAL.pdf)を読んでみました。一番面白かったのは、可用性を高めるための方法です。P.18にAchieving High Availabilityという項目があります。

###アメリカ国防総省の可用性に対する考え方

中段くらいから、「クラウド上で発生しうるシステムやアプリケーションの５つのシステムトラブルを考えてみよう」と書かれています。
1. アプリケーション障害
2. サーバー障害
3. データセンター障害
4. クラウド全体の障害
5. ネットワーク障害
これらが５つの分類になるんですが、個人的に興味深かったのは３のデータセンター障害と、４のクラウド全体の障害についてです。

まず、データセンターの障害についてですが、１つのソリューションとして異なったゾーンに分割するようにと書かれています。AWSの場合はAZ（Availability Zones）で、Azureの場合はリージョンで分けると書かれています。よく勘違いしている人がいますが、AWSのリージョンと、Azureのリージョンは違います。AWSのAZ＝Azureのリージョンが正しいです。また、他のクラウドサービスでは違う名前かもしれないけど、コンセプトはみんな同じだと記載されています。要はどういうレベルで冗長化されているかを確認すべき、ということなんです。

続いて面白いのがクラウド全体の障害についてです。この場合は別のクラウドにデータのバックアップをするようにと書かれています。当たり前すぎじゃん、って思うのですが、こうやって明示的に書いてくれるのは助かる部分が多いと思います。いちいちいろいろ聞かれると回答が面倒なこともありますが、アメリカ国防総省の名前を出すと、良く知らない人をけむに巻くことが可能です（笑）。水戸黄門の印籠みたいなもんで、便利に使っていきましょう。

ちなみに、ポイントはデータのバックアップなので、必ずしもシステムをマルチクラウドで冗長に組むようにとは書いていないところです。まあ、AWSでマルチAZで組んでいて全ダウンしたからといって、他のクラウドで同じように動かすのは事実上困難でしょうね。そもそもS3もなければLambdaなどの連携方法も違うので、別物になってしまいます。非常に発生率の低い障害に対して二重投資するのは賢明な判断とは言えないでしょう。

まあ、ここまで読んで、当たり前のことしか書いてないじゃんと思うかもしれませんが、経験上その当たり前を当たり前として説明するのに苦労したことが何度もあります。そういう時にはこういう文章やホワイトペーパーを出すと、すんなり話が進むこともあるので、困った時に使ってみるといいかもしれません。
【わかりやすく解説‼】Javaのインスタンスの使い方

## 1.事前知識
- [【最新】UbuntuでJavaの環境を構築する方法](https://qiita.com/ryome/items/37c53e9638a9c6ea146a)

または

- [【初心者でもできる‼】Windows10にJava環境を作る方法（JDK14.0.1）](https://qiita.com/ryome/items/30135570954e36196821)

事前知識として、上記リンクの内容が必要です。


## 2.インスタンスとは
- クラスをもとに生成された実体（オブジェクト）を `インスタンス` という。
- クラスをもとにオブジェクトを生成することを `インスタンス化` という。
- `インスタンス` は、他クラスの変数やメソッドを呼び出す（使用する）際にクラスから `new演算子` を使用することで生成できる。
- インスタンスの生成時は `コンストラクタ` が呼び出される。

## 3.コンストラクタとは
- `コンストラクタ` とは、クラスのインスタンス生成時に実行されるメソッドで、主にそのクラスのメンバ変数を初期化するときに使用される。
- コンストラクタの記述がない場合は `デフォルトコンストラクタ` が呼び出される。
- デフォルトコンストラクタとは、 `引数なしで中身が空（処理がない）` のコンストラクタである。

## 4.基本的な書き方

```PHP:基本的な書き方
public class メインクラス名{
    public static void main(String[] args) {
        // インスタンスの生成
        クラス名 変数名 = new クラス名();    
    }
}
 
class クラス名{
    // コンストラクタ（インスタンス生成時に実行される）
    クラス名(){
        初期化処理など
    }
}
```

- 基本的なインスタンスの生成は上記のように記述します。


## 5.記述例

```java:Test.java
// インスタンスとコンストラクタのテストクラス
public class Test {
	// mainメソッド
	public static void main(String[] args) {
	    // インスタンス(オブジェクト)を生成(コンストラクタ呼び出し)
		Hello hello = new Hello();
	}
}

// インスタンスのテストクラス
class Hello {
  // コンストラクタ
  Hello() {
	  //Helloの表示
	  System.out.print("Hello");
  }
}
```
- 上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test.java` で保存し、コマンドプロンプトで実行するとこうなります。↓↓　　　　　　　　　　　　　　　　　　　　　　　　　　
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ff3a0f18-18b9-92c1-0f03-56d7135dc593.png)


## 6.特殊な記述例

```java:Test1.java
// コンストラクタ内でのインスタンス生成
public class Test1 {
	// mainメソッド
	public static void main(String[] args) {
	    // インスタンス(オブジェクト)を生成(コンストラクタ呼び出し)
		new Hello1();
	}
}

// コンストラクタのテストクラス
class Hello1 {
  // コンストラクタ
  Hello1() {
      // インスタンス(オブジェクト)を生成
      InstanceHello ih = new InstanceHello();
      // インスタンスのメソッドの呼出し
      ih.showHello();
  }
}

// インスタンスのテストクラス
class InstanceHello {
  // Hello表示メソッド
  void showHello(){
      System.out.print("Hello");
  }
}

```

```java:Test2.java
// 変数に格納しないインスタンス
public class Test2 {
    // mainメソッド
    public static void main(String[] args) {
        // インスタンス(オブジェクト)を生成 & メソッド呼び出し
    	new Hello2().showHello();
    }
}

// インスタンスのテストクラス
class Hello2 {
  // Hello表示メソッド
  void showHello(){
      // Helloの表示
      System.out.print("Hello");
  }
}
```
- 上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test1.java` , `Test2.java` で保存し、コマンドプロンプトで実行するとこうなります。↓↓
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/66a65714-a7d7-4d71-b82b-3472d9db46fc.png)

## 7.GitHub
GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/【わかりやすく解説‼】Javaのインスタンスの使い方/



## 8.関連
- [【最新】UbuntuでJavaの環境を構築する方法](https://qiita.com/ryome/items/37c53e9638a9c6ea146a)
- [【初心者でもできる‼】Windows10にJava環境を作る方法（JDK14.0.1）](https://qiita.com/ryome/items/30135570954e36196821)
- [【初心者でもできる‼】Windows10にEclipseをインストールする方法（Java環境構築）](https://qiita.com/ryome/items/b47c5acdaa52cffbec58)
シェルスクリプトでxargsを使って関数に引数を渡したい

シェルスクリプトで複数並列で実行したいときに、`xargs`の`-P`オプションを使えることを知りました。
`xargs`から`-P`でプロセス数を指定すれば複雑な処理も並列でできるじゃん！と思いましたが、なかなかできずに詰まりました。

シェルで並列実行したいはずが、気づけば`xargs`で関数に引数を渡したい人になっておりました笑
結論から言うと、以下で実現できました。

```bash
export -f function
${ARRAY} | xargs -n 1 -I{} bash -c "function {}"
```

具体的なシェルスクリプトだと、以下のようです。

```bash
#!/bin/bash

function randomWait() {
  TARGET=$1
  sec=`expr $RANDOM % 10`
  sleep $sec
  echo ${TARGET}
}

export -f randomWait
cat hogehoge.txt | xargs -n 1 -I{} -P 10 bash -c "randomWait {}"
```

例えば、hogehoge.txtに1-20までの数字をいれておくと、ランダムな順番で出力されます。

`xargs`のオプション
`-n`で一度に渡す引数の数を指定します。今回の関数は引数をひとつとるので、1を指定しています。
`-I`で置換文字列を指定しています。`{}`を指定して、`randomWait`に引数を渡すようにしています。
`-P`で並行実行プロセス数を指定しています。

`export`のオプション
`-f`でシェル変数としてexportしています。これでコマンドとして認識されます。

`bash`のオプション
`-c`で後に指定する文字列をコマンドを引数つきで実行してくれます。

## 参考
https://qiita.com/D-3/items/8bdb834ff53256cef481
http://171rr.blog.fc2.com/blog-entry-14.html
AWS 認定ソリューションアーキテクト – プロフェッショナル 合格への道#6

#はじめに
AWSの特典を使用して模擬試験受ける際のテクニック。

**ダメな例**
ピアソンまたはPSIのページから受けたい試験を選んでバウチャー番号を入力する。

**正しい方法**
認定の特典ページから閲覧を押下して受けたい試験を選ぶ。そこでバウチャーを入力すると受けれました。

##出題範囲
* 組織の複雑さを考慮した設計 hb
    * ハイブリッド設計
* 新しいソリューションの設計 s
    * クラウドファースト設計
* 移行方法の理解 m 
* コスト管理 c
* 既存のソリューションの継続的な改善 i　
    * 改善案の提案


#学習
##1　i
ある動画モバイルアプリケーションはS3に10GBを超えるファイルをアップロードします。
しかし、S3リージョンから遠い場所でアプリケーションをアップロードすると時間がかかり、完了しないケースがある。

アプリのアップロードパフォーマンスを改善するソリューションはどれですか？二つ選びなさい。

* 各リージョンでS3バケットを構成してアップロードを受信し、クロスリージョンレプリケーションを使ってファイルを配信用バケットにコピーする
    * クリティカルではない

* アップロード前にファイルにランダムなプレフィックスをつけるようにアプリケーションを変更する。
    * プレフィクスをファイルに付与してもアップロードパフォーマンスは向上しない

* レイテンシベースルーティンングで53をセットアップし、アップロードを一番近いS3バケットリージョンに対して行う。

* S3バケットでs3 taransfer acceleration を有効にして、アップロードにtransfer acceleration エンドポイントを使用するようにアプリケーションを構成する。

* アプリケーションで動画ファイルを小さい単位に分割してマルチパートアップロードを使用してファイルをS3に転送するように構成する。

### クロスリージョンレプリケーション
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication.html

> レプリケーションでは、異なる Amazon S3 バケット間でオブジェクトを自動的に非同期コピーできます。オブジェクトのレプリケーション用に設定されたバケットは、同じ AWS アカウントが所有することも、異なるアカウントが所有することもできます。オブジェクトを異なる AWS リージョン間でコピーすることも、同じリージョン内でコピーすることもできます。

### S3
https://aws.amazon.com/jp/blogs/news/webinar-bb-s3-usecase-2018/

**各ストレージの特徴**

* オブジェクトストレージ
    * 大量のデータを、速く、安く、安全に保管するためのストレージ製品です。大容量化するデータ保存のニーズに対応できなくなった従来のファイルシステムの代替として、現場幅広いシーンで注目
    * ディレクトリ構造で管理するファイルストレージとは異なり、データを「オブジェクト」という単位 で扱います。データサイズやデータ数の保存制限がないため、大容量データの保存に適している
        * 従来のファイルシステムのような階層構造が無く、全てのデータを一つのストレージプールで保存することが可能
    * データごとにIDとメタデータ(属性情報)を付与しながら管理するので、こうした問題にも難なく対応
* ブロックストレージ(SCSI)
    * ファイルストレージのように単一のデータパスに頼らないため、データ取得が迅速になります。各ブロックは独立して存在し、パーティション化することで、異なるオペレーティングシステムでアクセスできます。このため、ユーザーはデータを自由に構成できるようになります。効果的で信頼性の高いデータ保存方法で、使用と管理が容易
    * 大規模なトランザクションを実行する企業や、大規模なデータベースをデプロイする企業に適しています。保存する必要があるデータが多いほど、ブロックストレージの利点が引き出される
* ファイルストレージ(SMB/NFS)
    * NASで使われている古代のストレージ
    * ファイルベースのストレージ・システムは、容量を追加してスケールアップするのではなく、システムを増設してスケールアウトする必要があります。


**S3のユースケースは以下の３パターン**

* Webサーバのコンテンツオフロード
* データ保護移行
* データレイク・DB

明日で試験直し終わらせます。
『python django超入門』のNoReverseMatchエラーについての解説

# 前置き
テキスト『[python django超入門](https://www.shuwasystem.co.jp/book/9784798054483.html)』(秀和システム)をやっているところで、テキスト通りに入力してエラーが発生しました。出版社提供の正誤表に記載がなかったので勉強を兼ね投稿させていただきました。
テキストではhelloアプリケーションを作成しています。

# 実行環境
django:3.0.2
python:3.7.4
OS:macOS Mojave 10.14.6

# エラー内容
それは、2-2のP.82(複数ページの移動)をやっていた時に起こりました。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ msg }}</p>
    <p><a href="{% url goto %}">{{ goto }}</a></p>
</body>
</html>
```

```python:views.py
# 修正前
# index()のみ抜粋
def index(request):
    params = {
        'title': 'Hello/index',
        'msg': 'これは、サンプルで作ったページです。',
        'goto': 'next',
    }
    return render(request, 'hello/index.html', params)
```

この状態でindex.htmlにアクセスすると下記エラーが発生しました。

```
NoReverseMatch at /hello/
Reverse for 'next' not found. 'next' is not a valid view function or pattern name.
```
「next」って？？と怒られています。。。
＃おかしいな、何度見直してもテキスト通りなんだけど。。。

# 原因、解決方法
結論から書くと、views.py内の'goto'の書き方が原因でした。
下記の通りに修正したら正常になりました。

```python:views.py
# 5行目
# 変更前：
'goto': 'next',

# 変更後：
'goto': 'hello:next',
```
実行結果画面：
![実行結果画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575325/b7590969-0d07-f9f6-5895-c1e3dd32ba5d.png)

リンク部分の表示がテキストと違っていますが、そこは本質ではないのでここでは触れません。
（テキストでは「next」だけが表示されることになっている）
原因は、index.html内のテンプレート{% url goto %}部分に正しい書式で送信されていないためでした。
goto部分の書式は'アプリ名:name'となるはずが、nameしか来ていないので不整合が起きていました。

# あとがき
上記は[出版社サポートページ](https://www.shuwasystem.co.jp/support/7980html/5448.html)の正誤表に記載がなく、同じ部分でつまづく人がいるかもと思い、自身の勉強を兼ねて投稿させていただきました。
私自身djangoはまだ勉強中ですので、ツッコミなどありましたらお願いしますm(_ _)m
Xcodeのシミュレーターでダークモードに切り替えるキーボードショートカット

#初めに
Xcodeのシミュレーターでダークモードを使える機能が実装されていましたが、
意外にもショートカットを使った記事が無かったので備忘録がわりに掲載します。

#環境
Xcode11.4
(注:Xcode11.3では実行できなかった)
<br>
参考記事
iOS シミュレーターでダークモードを切り替える2つの方法（画像付き）
https://qiita.com/zono_Bianchi/items/e79ddc6b6bc52d854fcf

#操作方法
###Command(⌘) + Shift(⇧) + A

#これだけで簡単にシミュレーターでダークモードへの変換が可能です。
シミュレーター上でiPhone8,iPhone11,iPadPro(9.7inch)を試しましたが、うまく行きました。
他の機種も実行出来ると思います。

![QiitaLightDarkModeChange 3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/68cf1d8e-225b-daa9-6190-17704a8533a9.gif)

では、素敵なダークモードライフを！
laravelメモ


## view周り
ユーザー認証周りのコード

php artisan make:auth
laravel6,7系だと上記のコードは使用できない

```
$ composer require laravel/ui
$ php artisan ui vue --auth
```
代わりに上記のコードを使用する

JavaScriptのパッケージをインストールしてコンパイルするために以下のコードを実行する

```
$ npm install && npm run dev
```

## テーブルの作成

```
$ php artisan make:migration create_tablename_table
```
テーブルの作成してup関数に追加したいカラムなどを記載
down関数に削除したいカラムなどを記載する
作成した後はmodelと関連づけないといけない

## モデルの作成
```
$ php artisan make:model モデル名 -m
$ php artisan migrate
```
モデルには命名規約がありテーブル名は複数形で命名しないといけなくモデル名にはテーブル名の単数形でないといけない


```
1対多　hasMany('App/Post');
逆　belongsTo('App/User');
１対１　hasOne
それぞれApp/モデル名っぽい
```

### 呼び出された時の処理

```laravel:app/Http/Middleware/Authenticate.php
use Illuminate\Support\Facades\Auth;
class Authenticate
{
    public function handle($request, Closure $next)
    {
        if (!Auth::check()) { // 非ログインはログインページに飛ばす
            return redirect('/login');
        }
        return $next($request);
    }
}

```

を作成したapp/Http/Middleware/Authenticate.phpに記述することでログインしていなかったらログイン画面に遷移する

## ルートの設定

```laravel:/routes/web.php
Route::resource('表示したいURL', 'コントローラー名');
php artisan route:listで表示できるコントローラーの一覧が出てくる
```

## コントローラーの作成

```
$ php artisan make:controller コントローラー名
もしrouteをresourceで書いているなら
$ php artisan make:controller --resource コントローラー名
```

```laravel:/app/Http/Controllers/作成したControllerファイル
viewを表示したい時
return view('viewのフォルダ名.bladeより上のファイル名')
```

## view
親となるviewファイルを１つ作成する
私はviews/layouts/index.blade.phpにしました。
子となるフォルダを作成します。これはコントローラーに指定されているviewファイル、子となるファイルにはこのように記述することで、親のファイルの記述をそのまま子にも反映されるようになります

```html:layouts/index.blade.php
<!doctype html>
<html lang="ja">
<head>
 <meta charset="UTF-8">
 <title>Example</title>
</head>
<body>
 <div class="container">
  <h1>親のページです</h1>

  @yield('content')

 </div>

@yield('footer')
</body>
```

```html:users/index.blade.php(呼び出し側)
@extends('layouts.index')←layoutsフォルダの中にあるindexフォルダ呼び出し

@section('content')←indexフォルダのなかのcontentをのところに記述されるようになる
<h1>子のページです</h1>
@endsection←終了
```

上記の実行結果
![スクリーンショット 2020-04-17 15.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/47cd17a5-25f2-3d72-4c9b-ed67df950df4.png)

コードをスッキリさせることが可能となる


## viewにデータベースの内容を表示したい
### controller側の処理

```php:UsersController
// 使用するテーブルの記載
use App\User;

public function index()
{
// $usersにUserテーブルにある全レコードを格納
 $users = User::all();
 return view('users.index', compact('users'))
}
//compactは変数名と名前が一致すると自動的に変数として扱ってくれる
```

### view側の処理

```php:index.blade.php
@if($users)
 @foreach($users as $user)
  <p>{{ $user->id }}</p>
  <p>{{ $user->name }}</p>
  <p>{{ $user->email }}</p>
 @endforeach
```
アップデートによりシェルスクリプトがbashからzshに変わった時の対処方法

#まえがき
2020/3末、macをアップデートしてからrails sでサーバを立ち上げると、

```
Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5
```
となるので、`bundle install`で、一旦はサーバーが立ち上がるようになるのですが、翌日などに立ち上げると、表示が出て立ち上がらなくなった。

#環境
* Ruby 2.6.5
* Rails 6.0.2.1 

#状況確認
###①Rubyのバージョンの確認

`ruby -v`すると、

```
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]
```
2.6.5はインストールしているのですが、2.6.3はインストールした記憶がない…（したのかな？）


###②rbenvの確認

`which ruby`すると、

```
ユーザー名@mba desktop % which ruby
/usr/bin/ruby
```

このように表示された場合、rbenvが反映されていません。システムのRubyを参照したままになっています。


###③シェルスクリプトの確認

```
echo $SHELL
# 結果がbin/bashの場合
cat ~/.bash_profile
# 結果がbin/zshの場合
cat ~/.zshrc
```

すると、結果が、`bin/zsh`でした。

そして、`cat~/.zshrc`したところ、

```
cat: /Users/ユーザー名/.zshrc: No such file or directory
```

となりました。次に、

```
echo 'eval "$(rbenv init -)"' >>  ~/.zshrc
```
を実行。

そして再度、`cat ~/.zshrc`を実行。その結果は、

```
eval "$(rbenv init -)"
```



##原因

**アップデートした際、シェルスクリプトがbashからzshに変わった事で異常が起きている。**



##対処法

###①`open ~/.zshrc`でファイルを開き、以下に置き換える。

```
# Homebrew
export PATH=/usr/local/bin:$PATH
# Homebrew rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

その上で、次を実行。

```
source ~/.zshrc
rbenv global 2.6.5
```


###②**ターミナルを再起動**して、`ruby -v`を実行。

結果は、

```
ruby 2.6.5p114 (2019-10-01 revision 67812)
```
と表示されました。次に、


###③`which ruby `を実行。

```
/Users/ユーザー名/.rbenv/shims/ruby
```
と表示されました。これでとりあえず大丈夫です。


#あとがき

神里よしとさんの主宰するプログラミングのオンラインサロン「人生逆転サロン」のメンターのたけさんに質問して教えて頂いた流れを忘れないように、ここに書き留めておきます。