OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript × React などなど　今後のスタンダードについて

#Vue.js  × TypeScript
Vue.jsはTypeScriptとの親和性がReactほど強くはないので、そこはそもそも型を用意したりはせず、とりあえず見た目を綺麗にするところから始めよう、という話が多い気がします。

#React × TypeScript
一方でReactはTypeScriptで型を綺麗に整えたり、Storybookを書いたりする部分をしっかり進めようと考えて採用しているイメージです。大人数で開発しても影響が出ないようにするためですね。

#Angular  × TypeScript
Angular自体は良くも悪くもライブラリというよりは完全にフレームワークなのが大きい。
途中から導入しようという場ではまず候補に挙がりません。
TypeScriptも必須ですし、書き方の問題もあります

#TypeScriptが今後スタンダードに
技術顧問の方がおっしゃっていましたが、
JavaScriptはアセンブラ言語みたいな感じになっています。

また、今、JavaScriptユーザーの40％ほどはTypeScriptを書いているという調査結果があります。
TypeScriptに勢いがあるということなのですが、
恐らく数年後にはさらにスタンダードになっていると思います。

>やはり型が欲しいと感じるエンジニアが多く、
実際、コードヒントが出てきたり、間違った代入をしたら違うと言ってくれるのは
生産性を上げるうえでは必要に感じます。

一つのプロダクトに対してフロントエンドが何名か必要となれば、型やドキュメントをしっかり書かなければならないんです。
さらに最近の開発だと先に型定義作ることもあります。

普通はサーバーサイドがAPIを作るんですが、フロント側がAPIを定義します。
フロント側からこういう型が欲しいと先に言っておくんですね。
デザインが先にあって、それを作るためのデータ構造を考えてからサーバーサイドに依頼をするという感じですよね。

>結局型が必要かという問題は、ソフトウェアに関わらずドキュメントや仕様書などの共通のコンテキストを作ってみんなで理解しようね、ということなんですよね。

>型情報はソースコードに対するメタ情報の一つであって、エンジニア同士の理解のためにはそれが必要だということです。

少し補足すると、そもそも<b>多人数で開発しなければならないのは画面が複雑になってきているから</b>です。
例えばSUUMOの検索ボックス一つにしても、チェックボックスやサジェスト、検索件数の話が出てきますから、全てを一人でやろうとするのは無理な話なんです。

複雑になってきたこそ型が必要になってきた。

ReactでもVue.jsでもAngularでも何でもいいんですが、これらのツールで何かを作ることは普通のことで、できないとすればフロントエンドエンジニアとして致命的なんです。


#まとめ
長期にわたってメンテナンスしたいプロジェクトで作業するのなら、TypeScriptで書くべき。

TypeScriptではコードを書いている間に何が間違っているのかを教えてくれるから。

TypeScriptはコードベース全体の自己ドキュメント化を支援し、コードリーディングの体験を改善。TypeScriptは開発者がお互いのコードを理解しやすくするのに役立つ
Laravel6のメール送信でMailable.phpにエラーが出る

Laravel6のメール送信でMailable.phpにエラーが出る件について記載。

1.以下のような記述で、ContactCustomerにもミスはない前提の場合で、実行する


```

Mail::to('sample@gmail.com')
            ->send(new ContactCustomer($request));
```

2.すると以下のようなエラーが発生する。

Trying to get property 'email' of non-object

in Mailable.php line 594
at HandleExceptions->handleError(8, 'Trying to get property \'email\' of non-object', '/var/www/public_html/picklespace.com/vendor/laravel/framework/src/Illuminate/Mail/Mailable.php', 594, array('address' => null, 'name' => null, 'property' => 'from', 'recipient' => null))in Mailable.php line 594



3.コード上に問題が見られないので、configのキャッシュをクリアしてみる。

```
php artisan config:clear 
```


4.無事解決した。
composer installしたあとなどにキャッシュクリアをしないとダメなのかもしれない。
（要調査）

```
./composer.phar install
./composer.phar dump-autoload --optimize
```
【転職】ベンチャーのここがイイ、ここが悪い

#■ベンチャーのここがいい
##裁量が大きい：
自分がこのサービスで世の中を変えるんだってくらいの熱量がなければできない。
（それくらいの熱意と覚悟がないと逆にベンチャーへの転職はおすすめできないです。）
任されているものが大きいだけにやりがいはでかい
一人一人がサービスを支えてる自覚があるため、社員全員のモチベーションも高い

#■ベンチャーのここがつらい
>・自分が倒れたときの代わりの担当者がいない
・土日障害とか問題起きても対応しないといけない
・開発＆運用を同時に回さないといけないので稼働時間がやばい

コードがまともにかけて設計力もあるという方なら大丈夫かもしれません。Web系企業でも、前職がSIだったという方は結構居て、比較的かたくしっかりした開発ができる点が重宝される場合があります。

まずはWeb系の技術を個人で触ったり、その界隈のイベントに出るなどして情報と知人友人を増やしたり、自己研鑽と自己の相対化をして冷静になることをおすすめします。

転職にあたりカルチャーマッチも必要だが、コードが書けないのは完全に話にならないので、プログラマが下流の仕事という概念を持っていたら
その考え方を今すぐコンクリに詰めて東京湾に沈めてコードが書ける上での技術力をつけること。

#■重視すること
オフィスカジュアル -> 何着ても履いても自由
出社して働く -> どこでも働く
DartのExtensionsを使ってみる

DartのExtensionについて[こちらの記事](https://resocoder.com/2019/10/31/dart-extension-methods-tutorial-incl-generic-extensions-properties-operators/)が面白かったので紹介します。
Dart 2.7以上で拡張メソッド（Extension）が使えます。

ほぼ元記事のままなのですが、私はジョジョが好きなので、ジョジョっぽい拡張メソッドを作ってみました。

```dart
// Stringの拡張メソッド
extension StringExtensions on String {
  // Emailの簡易validation
  bool get isValidEmail {
    final emailRegExp = RegExp(r"^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+");
    return emailRegExp.hasMatch(this);
  }

  // スペース区切りの結合
  String concatWithSpace(String other) {
    return '$this $other';
  }

  // スペース区切りの結合、その2
  // operator extension
  String operator &(String other) => '$this $other';
}

// numを継承したclassの拡張メソッド
// 10を加算する
extension NumGenericExtensions<T extends num> on T {
  T addTen() => this + 10;
}

// こんな風に自分の好きな拡張メソッドを作れます！
extension JojoExtensions on String {
  String mikeO() => this + '世界だ';
  String joseph() => 'おまえは「$this」という';
}

main() {
  // 使用例と結果
  print('example@example.com'.isValidEmail); // true
  print('exampleexample.com'.isValidEmail);  // false
  print('one'.concatWithSpace('two'));       // 'one two'
  print('one' & 'two');                      // 'one two'
  print(10.addTen());                        // 20
  print(10.0.addTen());                      // 20
}
  print('わたしの顔にドロをぬった'.mikeO()); // わたしの顔にドロをぬった世界だ
  print('やめてそれだけは'.joseph());     // おまえは「やめてそれだけは」という
```

便利というだけでなく楽しいですね。
ArchUnit 実践：あなたの common パッケージは 本当に common ?



```
// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* JUnit 5.7.0
* ArchUnit 0.14.1
```

## アーキテクチャテストのモチベーション

特定の業務知識をもたない汎用的な値オブジェクトクラスやユーティリティクラスを common パッケージに置いていたら[^1]、いつのまにか common パッケージ以外に依存してしまっていたなんてことはないでしょうか？これらの汎用クラスは外部から依存されることはあっても、外部に依存してはいけないはずです。

## アーキテクチャテストの実装

```java
package com.example;

import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void commonパッケージは特定の業務ドメインに依存しない() {
        noClasses().that().resideInAPackage("com.example.domain.common..")
            .should()
            .dependOnClassesThat(new DescribedPredicate<>("common でないパッケージに属する") {
                /**
                 * @param clazz 依存先のクラス
                 * @return 依存先のクラスが common でないパッケージに属するクラスである場合、true
                 */
                @Override
                public boolean apply(final JavaClass clazz) {
                    if (! clazz.getPackageName().startsWith("com.example")) {
                        // サードパーティーライブラリなどへの依存はOK
                        return true;
                    }

                    return ! clazz.getPackageName().startsWith("com.example.domain.common");
                }
            })
            .check(CLASSES);
    }
}
```

[^1]: そもそも common というくくりでパッケージングすることの是非も...
Photon×WebGL（2）備忘録

やりたいこと
・WebGLへのプラットフォームの変更
（以前利用したバージョン2019.2.21f1ではエラーになったとこのTest）

--

以前利用したバージョン
Unity 2019.2.21f1
今利用しているバージョン
Unity 2020.1.9f1

--


<dl>
<dt>結果：異常なし</dt>
<dd>・error CS0246　タイプまたは名前空間名「WebSocketSharp」が見つかりませんでしたって出てた。</dd>
<dd>・その時はWebSocketSharp.dllのインスペクターでSelect platforms for pluginで「WebGL」にチェック入れるとビルドされた</dd>
<dd>・既にチェック入っている</dd>
</dl>

![スクリーンショット 2020-12-07 202720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/16c9b3e8-6a94-588a-0729-15648d727a21.jpeg)
moment.jsは使わず、日付の変換にDateオブジェクトを使う

みんなが使ってるmoment.js
便利ですが、ちょっと日付を変換したいだけなのに
いちいち`npm install`したり、`require()`したりで少々めんどくさくもあります。

今日はもしかしたら皆さんは日常的に使われているかもしれませんが、Javascriptの標準組み込みオブジェクトである、
Dateオブジェクトを使っていきたいと思います。

#日付の変換方法
```js
const date = new Date("2020-11-18T13:05:08.357Z") //Dateオブジェクトのインスタンスを作成　詳しくはDateコンストラクタにて
const date_formatted = date.toLocaleDateString("ja-JP") //日本で使われるフォーマットを指定
console.log(date_formatted);//=>2020/11/18
```

```:出力結果
2020/11/18
```
このように簡単に日付の変換を行えます。

#Dateコンストラクタ
以下の形でDateインスタンスを作成できるようです。
>1.引数なし
2.時刻値またはタイムスタンプ値
3.タイムスタンプ文字列
4.独立した日付と時刻の成分の値

詳細は以下で=>https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date

#日付の変換
Dateインスタンスのメソッドの一つである`toLocaleDateString`を使います。

```js:構文
dateObj.toLocaleDateString([locales[, options]])
```

localesには地域名、言語名などを指定できます。
なので、ここを`"ar-EG"`なんかにすると、

```js
~
const date_formatted = date.toLocaleDateString("ar-EG") 
console.log(date_formatted);
```

```:出力結果
الأربعاء، ١٨ نوفمبر ٢٠٢٠ 
```
このようにアラビア語にしたりもできます。

次にoptionsには出力時のオプションなどを指定できます。

```js
const format_options = {
        weekday: "long",
        year: "numeric",
        month: "long",
        day: "numeric",
      };
const date = new Date("2020-11-18T13:05:08.357Z",format_options) 
const date_formatted = date.toLocaleDateString("ja-JP") 
console.log(date_formatted);
```
```:出力結果
2020年11月18日水曜日
```
オプション等の詳細はここを参照=>https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

#おわりに
所詮中学生の浅知恵の可能性もあるので、鵜呑みにはしないでください。
今日は個人的な発見を書いてだけの記事を読んでくださりありがとうございました。
gcloud auth login したときに localhost:8085に接続できない!といってエラーになる場合BROWSER環境変数があるとうまくいった。原因は知らない。

タイトルで全てが説明されているので後は蛇足です。

## 環境

M1 MacBook Air + macOS Big Sur 11.0.1 + Terminal.app + zsh + デフォルトブラウザはSafari の場合です。いろんなところに罠があるので賞味期限の短い話題ですね。なぜ Terminal.app と Safari かといえば、新しいMacを買うとしばらくはなるべく純正品で生活しようというライフサイクルになっているからです。

gcloud コマンドのバージョンはこんな感じ。

```
gcloud --version
Google Cloud SDK 319.0.0
bq 2.0.62
core 2020.11.13
gsutil 4.55
```

## 起きていたこと

タイトル通りです。`gcloud auth login` とかしたとき、ブラウザで認証を行うとき、最後にタイムアウトしてしまいます。`localhost:8085` に接続できないといって怒られるのですが、`localhost:8085`はポートは空いてるしリダイレクトも動作していると思われる。なぜ。

## 回避策


Google Chromeを使う
 `BROWSER` 環境変数を設定したらうまくうごく様になった。なぜ。

```
% BROWSER=open
% gcloud auth login 
```

どうしてもダメな場合はサーバで環境設定するときのように `gcloud auth login --no-launch-browser` してブラウザから手動で認証コードを取得するとよさそう。BROWSER環境変数設定するとうまくいく理由はわかってない。面白いですね。たぶんBROWSER環境変数がない場合に gcloud がブラウザを直接開いたりして、その場合にプロセス間通信や別プロセス起動した時の戻り値の取得とか何かそういうアレがあるのだろう、と想像はしています。
有益記事メモ（Gitミス・コミュ力・TypeScript・設計）

#Gitミスした時は…
https://qiita.com/drytt/items/133d3b34325ca0223d7f

##Gitコミット
僕が考える最強のコミットメッセージの書き方
https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e



#【超大事】事故のない開発
https://qiita.com/teradonburi/items/cff01c6d4c70c8e960f7



コーディングの命名規則一覧(覚える必要はなし)
https://murashun.jp/blog/20181109-01.html






#コミュ力
■「言われた通りにやったのに...」とならないためのコミュニケーションの心得
https://qiita.com/ipeblb/items/7d6f97b62026a052f703

■プログラミング初心者歓迎！「エラーが出ました。どうすればいいですか？」から卒業するための基本と極意
https://qiita.com/jnchito/items/056325421b7e36f02335


#ツール
■【2020年版】フロントエンドのおすすめMac無料ツール
https://qiita.com/amita/items/a103210bdab8bfb6a889




#React
https://qiita.com/drytt/items/8122e043c16ddeef924a

#TypeScript
TypeScript型
https://qiita.com/TaHiroki/items/e957d48397871eb775e8

まとめておきたい応用型
https://qiita.com/ryo2132/items/12981f61db21112cb61c

コード
https://qiita.com/tatsumin0206/items/c787fef24f8e952dcd9a

拡張関数
https://qiita.com/ovama-koffee/items/7ec91e566171ccf2c74b

TypeScriptのコード小技テク
https://qiita.com/sanoyo/items/d2e6122537057099e2da

両面実装（バック、フロント）
https://qiita.com/SoraKumo/items/fe2d47fbbc102503c314


TypeScriptメリット
https://tech.playground.style/javascript/typescript-merits/
↓簡潔
https://book.yyts.org/welcome-to-typescript/good-about-typescript

次世代JavaScript
https://products.sint.co.jp/topsic/blog/typescript

JavaScriptデメリット
https://vectpress.net/?p=382


中二病CSS
https://qiita.com/teradonburi/items/1e23ff5c2941e8801b84


レビューの指南書
https://qiita.com/teradonburi/items/2fa475c860d0fb16c0eb

プロトタイプを早く作る方法
https://qiita.com/teradonburi/items/1d629a751ed42e923d7d


Jsよく使う文房
https://qiita.com/teradonburi/items/ba1a5d60c679d5656322


【保存版】Webフロントエンド基礎力（初心者向け）
https://qiita.com/teradonburi/items/43c52d7cffc318e9b1e9


#デザインの参考
ワードプレス見やすい記事構成、統一されたデザイン
https://sirutasu.com/sirutasuguide/

※スタートアップのサイト
https://sirutasu.com/




#デザイン設計
##ドメイン駆動
https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88
##ソフトウェアデザイン
https://www.techscore.com/tech/DesignPattern/index.html/
##ソフトウェアテスト
https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88
https://qiita.com/taumax/items/b70e29ef525b2e561568
rails Docker対処法


```
＃間違い
docker-compose build 
# 正解
docker-compose up --build  
    
＃間違い
docker rmi sample-rails-docker_app
＃正解
docker rmi 91b0abfeb981
Dockerイメージを削除するときはリポジトリではなく、イメージIDで削除する。
```

```
katoatsushi@MacBook-Pro sample-rails-docker % docker images                                                              
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
sample-rails-docker_app   latest              1cb13ce83e34        4 minutes ago       969MB
<none>                    <none>              424f83731ce0        2 hours ago         969MB
<none>                    <none>              91dde8024805        2 hours ago         969MB
room_app_app              latest              4dcc6beedcfd        5 days ago          989MB
<none>                    <none>              9b3dc2b6e276        5 days ago          989MB
<none>                    <none>              e1de5c89d92e        5 days ago          897MB
<none>                    <none>              f94f1829487e        5 days ago          897MB
myapp_web                 latest              ec1173f0bb40        5 days ago          969MB
docker_sample_web         latest              db6e88beef89        5 days ago          989MB
mysql                     5.7                 ae0658fdbad5        2 weeks ago         449MB
mysql                     8.0                 dd7265748b5d        2 weeks ago         545MB
ruby                      2.6                 39853018958e        2 weeks ago         840MB
ruby                      2.6.5               ad10dfbc638b        8 months ago        840MB
ruby                      2.6.1               99ef552a6db8        21 months ago       876MB
```
【剰余演算子】%ってなんだっけ？編

**読んでなるほど！と思うのに、しばらくするとなんだっけ？ってなるシリーズその２**

本日読んでいて忘れていた部分を抜粋。
剰余演算子は馴染み深い「　**+-*/**　」以外に「　**%**　」というのがいることを忘れていました。



```number.js
const num = 60

if (num % 15 == 0) {
  console.log(`${num}は3と5の倍数です`)
} else if (num % 3 == 0) {
  console.log(`${num}は3の倍数です`)
} else if (num % 5 == 0) {
  console.log(`${num}は5の倍数です`)
} else {
  console.log(`${num}は3の倍数でも、5の倍数でもありません`)
}
```

**const num = 60**
だから
60 % 15 == 0
ということ

ただの割り算は「　**/**　」なので考え方が違う
「　**%**　」は割り算した答えの数字じゃなくて、その答えの**余り**のこと
60 / 15 = 4
4で割り切れてるから余りは0
<h4>つまり60 % 15 == 0は、
0 == 0だよね？ということで→true</h4>

<h4>　⬇️出力結果⬇️<br>
60は3と5の倍数です</h4>
無料で高精度の日本語翻訳ができる「DeepL」が便利すぎる

# 無料で高精度の機械翻訳ができる「DeepL」
本日は、機械翻訳のアプリ／WEBサービスの「DeepL」の無料サービスを一通り使用してみた感触を書いていきたいと思います。
*有料サービスの方に関してはノータッチなのであしからず*
[DeepL公式ホームページ](https://www.deepl.com/home "DeepL公式トップ")
![DeepLトップページスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698926/3aff960f-428f-459c-d810-039b1cb1339b.png)
~~どうでもいいけどシャレオツなトップページですね~~


## DeepLとは
とりあえず、DeepLとは何よ？というところからWikipedia先生から抜粋した説明で入ります。

[Wikipedia：DeepL翻訳](https://ja.wikipedia.org/wiki/DeepL%E7%BF%BB%E8%A8%B3 "Deep+")
> DeepL翻訳（ディープエルほんやく、英: DeepL Translator）は、2017年8月に開始された機械翻訳サービスである[2]。
> Google 翻訳よりも「精度が高い」と主張する肯定的な報道があるが[3]、自身のblind studiesにて裏付けているものであり[4]、科学的に2つのサービスを比較したものはない[5]。
> DeepL翻訳は、 英語や日本語をはじめ、複数の言語[注 1]間で翻訳することが出来る。

要約すると、Google翻訳より精度が高いと評判の機械翻訳サービスだよって事です。
WEBブラウザ上での翻訳と、Windows／MacOSの両方でネイティブアプリ上からの翻訳が使用できます。
*ちなみにネイティブアプリ上では、アプリ起動中にCtrl+C（Command+C）を２回連打するとコピーした文章を自動で翻訳してくれる便利機能があります*


## 使い方
WEBブラウザ上からでの翻訳なら無料かつ会員登録不要なので、
とりあえずちゃちゃっとお試ししてみましょう。
[こちらのページで無料翻訳を試すことが出来ます。](https://www.deepl.com/translator　"DeepL翻訳")

試しに、以下のスクショのように英文をコピペして翻訳してみました。
![DeepL翻訳](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698926/ad0dcc72-fe59-7238-6e18-e9bd6af08b03.png)

ちなみにコピペした英文は、GitHub上で削除したブランチに後からPull Requestを出したときに表示されたエラー文です。
何をGitHub上から指摘されているのか、違和感のない日本語で翻訳出来ていますね。
~~要約：Pull Request出されたけど何も変わってねえみたいだぞｺﾞﾗｧ!~~

せっかくなので、Google翻訳と比較してみましょう。
全く同じ英文を[Google翻訳](https://translate.google.co.jp/?hl=ja&tab=TT "Google翻訳")にコピペしてみました。下記のスクショになります
![Google翻訳](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698926/3ec37c5c-89e3-763d-e94c-5c0c2d940fe3.png)

思っていたよりも大きな差が出ましたね。
こちらは何が言いたいのかは大体分かるけど、読む側に頭を使わせる日本語になっています。
~~（でもDeepLの.NETはどこからきたんだろう）~~
英語以外の言語や訳す内容によってもまた違いはあるでしょうし、
機械翻訳も日々精度を上げています（２０２０年１２月現在）から将来的どうなるかはまた別の話となりますが、
３日間ひととおり使った限りだと、私感ですがDeepLの翻訳の方が精度が高いと感じています。


## 有料プラン
さて気になる有料プランですが、無料版との違いは下記のスクショをご参照ください。
![DeepL有料プラン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698926/c3f7db9a-079b-e890-79f5-f2b7a9a694dd.png)

無料版との大きな違いは、やはり翻訳に制限がかかったり、DeepLの一部便利機能が使用できないところでしょうか。
とはいえ文書ファイルをまるごと翻訳したり、毎日多量の英文を訳す人以外の、
英文サイトの一文をちょこちょこ訳すぐらいの使用でしたら無料版で十分だと思います。
ハードに使い倒したい方は素直にお金を払いましょう。


## 所感
それにしても、機械翻訳も来るところまで来た、という感想です。
１０年ぐらい前の機械翻訳はほんとう、辞書開いてひとつひとつ解読していった方がマシと思うぐらいトンチキな翻訳結果しか出せなかったのですが、
ディープラーニングの技術が普及してからは眼を見張るような進歩具合です。
OCRやARなどの技術と組み合わさることで、そのうちスクールで外国語学ぶ必要さえ無くなってしまうのではないでしょうか。


この記事を書いていてふと思いましたが、機械翻訳のテクノロジーが極まり行き着く先は、
ショートショートの大御所、星新一先生が書いた**[「肩の上の秘書」](https://youtu.be/W5ycJaaLZkU "YOUTUBE朗読")**みたいになるんじゃないかと（私見）。

あの話では、同じ言語を使う者同士（訪問セールスと主婦）の会話をコミュニケーション支援の鳥型ロボットが代理し、
鳥型ロボットは本音と建前を見事に訳してくれる（こんな商品要らねえよ→せっかくの素晴らしいご提案を頂き恐縮ですが〜）、
というものでしたが、母国語同士のやり取りでも個人間で言語能力の差って結構あるんですよね。
角をとったまろやかな言葉遣いにしたり、一つの言葉に複数の意味を込めたり、思い描いたイメージがとっさに言葉に出なかったり・・・

ここまでの表現の使い分けは,
２０２０年現在の機械翻訳ではまだまだ全然到達していませんが、
もしここまでの言語能力を機械が獲得したのなら、面接だとかプレゼンだとかの苦労からだいぶ開放されそうです。
~~ていうか人間はもう喋らなくていいんじゃないかな~~
[Python]多角形の座標で内側か外側か判定

# 地図上の緯度経度で特定の設定領域内か、外か判定

メモ。
結果的には便利なライブラリを使ったほうが早かった
四角形、五角形などで地図上に座標でプロットしてその内側なら特定の処理をしたいという状況になったのでメモ。

車輪の再発明はしない。地理空間データ分析ライブラリを使う。

```
$ pip install turfpy
```

pointに現在点。
polygonは多角形という意味。点を指定。

領域内なら、boolean_point_in_polygonで、名前の通り、TureかFalseを返してくれる。便利。

```.python
from turfpy.measurement import boolean_point_in_polygon
from geojson import Point, Polygon, Feature

point = Feature(geometry=Point((0.5, 1.1)))
polygon = Polygon(
    [
        [
            (0.0, 0.0),
            (1.0, 2.0),
            (3.0, 2.0),
            (2.0, 0.0)
        ]
    ]
)

if boolean_point_in_polygon(point, polygon):
    print('領域内')
else:
    print('領域外')
```

```
領域外
```

あとは、緯度経度で指定すればOK
Laravel6をさくらレンタルサーバーにデプロイ　備忘録

#手順
## sshでサーバにログイン
```
ssh user@xxx.com
```

## Laravel プロジェクトをgit経由でダウンロードする

```:/home/user/
mkdir laravel
cd laravel
git clone ~~
```

## composerインストールをする

```:/home/user/laravel/project_name/
curl -sS https://getcomposer.org/installer | php
```

## インストールできたか確認してみる

```:/home/user/laravel/project_name/
php composer.phar
```

## Venderのインストール

```:/home/user/laravel/project_name/
php composer.phar install
```

## .envファイルの設定をする

```:/home/user/laravel/project_name/.env
APP_ENV=production
APP_DEBUG=false

DB_CONNECTION=mysql
DB_HOST=mysql000.db.sakura.ne.jp
DB_PORT=3306
DB_DATABASE=さくらインターネットのレンタルサーバで作成したデータベース名
DB_USERNAME=アカウント名
DB_PASSWORD=データベースパスワード
```

## php artisan ○○をする

```:/home/user/laravel/project_name/
php artisan key:generate
php artisan migrate
php artisan storage:link
```

## .htaccessを編集する
```:/home/user/laravel/project_name/public/.htaccess
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301] 

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```

## index.phpを編集する
```php:/home/user/laravel/project_name/public/index.php
require '/home/user/laravel/project_name/vendor/autoload.php';

$app = require_once '/home/user/laravel/project_name/bootstrap/app.php';
```

## wwwフォルダー下にシンボリックリンクを作成する
```
ln -s /home/user/laravel/project_name/public/ /home/user/www/project_name
```

## ブラウザからアクセスして確認してみる
```
https://xxx.com/project_name/
```

以上。
自分が実際にデプロイした際の手順をまとめておきました。
いろいろなサイトを飛び回って探して苦労したので忘れない為に。
【アンケート分析】天井効果、床効果をpythonで判定する

アンケートの分析時に出てくる、天井効果、床効果を判定する関数を作成する。

##【天井効果、床効果とは？】
アンケートの分析項目において、ある項目の回答があまりにも偏っている場合はその質問項目は妥当ではないと判断される。

高いほうに偏っている場合（1~5までの5件法なら、5ばっかりな状態）ならば、「天井効果がある」という。

反対に、低いほうに偏っている状態の場合は「床効果がある」という。

##【天井効果、床効果の判定】
天井効果と床効果は、その項目の平均値、標準偏差を使って判定する。

天井効果：平均値 + 標準偏差　＞　最大値（5件法であれば5）ならば天井効果あり
http://www.ipc.hokusei.ac.jp/~z00105/wiki_res/wiki.cgi?%c5%b7%b0%e6%b8%fa%b2%cc

床効果　：平均値 - 標準偏差　＞　最小値（基本的には1）ならば床効果あり
http://www.ipc.hokusei.ac.jp/~z00105/wiki_res/wiki.cgi?%be%b2%b8%fa%b2%cc

##【天井効果、床効果を判定する関数】

```ruby:qiita.rb
def tenjo_yuka(df):
    for col in df.columns:
        tenjo = df[col].mean() + df[col].std()
        yuka = df[col].mean() - df[col].std()
        print('-'*50)
        print(str(col))
        
        if tenjo > df[col].max():
            print('天井効果　あり')
        else:
            print('天井効果　なし')
            
        if yuka < df[col].min():
            print('床効果　あり')
        else:
            print('床効果　なし')
```

この関数にアンケート項目を突っ込めば天井効果、床効果の有無を判定できる
Perlワンライナー小技集

Perl Advent Calenderなんと2020年になってもやってます。めでたいですね。
昨日は@narita_cppによる[Paws::S3 で ECS タスクロールを用いてS3へファイルをアップロードする](https://qiita.com/narita_cpp/items/9735223097a6ee80e762)でした。

さて、今回はPerlワンライナー小技集ということで、先日[Perl Hackers Hubに寄稿した記事](https://techblog.karupas.org/entry/2020/10/23/141422)の~~没ネタ~~落ち穂拾いです。
historyから引っ張ってきた小技をいくつか紹介します。

## 電卓

地味に面倒なのですがperlだと楽ちんです。
たとえば、$1.12/hourのSaaSを1ヶ月(30日)利用した際の日本円換算を雑にやるにはこう。

```console
$ perl -E 'say 1.12 * 24 * 30 * 104.22'
```

`-E` は引数をperlコードとして評価するやつで、featureプラグマの一部が有効になります。
よくわかんない方はこちらをどうぞ: [コマンドラインツールとしてのperl](https://qiita.com/karupanerura/items/e90bba7166878ece9f06)


## 秒間リクエスト数をリアルタイムに計測する

アクセスログと `tail -F` との組み合わせでお手軽にできます。

```console
$ tail -F /var/log/nginx/access.log | perl -nE 'if($t!=time){say$c;$c=0;$t=time}$c++'
```

で、なにやっているんでしょうこれ。分解してみましょう。

`-nE` は `-n` と `-E` をまとめて書いています。
`-n` はループするやつです。`-E` はさっきも出たので割愛します。
詳しいことはperldocを見てください。

つまり`-MO=Deparse`で展開するとこうなります。

```perl
LINE: BEGIN { # これは -E オプションのやつ
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
while (defined($_ = <ARGV>)) { # これは -n オプションのやつ
    if ($t != time) {
        say $c;
        $c = 0;
        $t = time;
    }
    ++$c;
}

```

見たままですが`$c`という変数をカウンタにしつつ`$t`という変数に時刻(epoch)を入れて、それが変わったタイミングで1秒経ったと判断して`$c`を出力して`$c`と`$t`をリセットするというループです。
秒間に見た行数を毎秒出してくれるので簡易的な秒間リクエスト数のリアルタイム表示に利用できます。

## 設定用JSONから特定の設定をまるっとキレイに消す術

```console
$ perl -i -ne 'print unless m!^ {8}"hoge":\s*\{\s*$! .. m!^ {8}\},\s*$!' data/fuga/**/*.json
```

正しく2スペースインデントされているJSONの、4インデント目の`"hoge"`という名前のエントリを削除します。
JSON decodeして消してJSON encodeして保存とかできたら楽なんですが、設定ファイルのものともなると厳しい場合があります。JSONCやJSON5などコメントが書ける場合などもつらいです。
そこで、文字列処理としてワンライナーでやっつけるという苦肉の策をやってみたら案外うまくいきました。よかったですね。

`-i` はinplaceつまり上書きのオプションですね。sedと同じです。
`-ne` は `-n` と `-e` をまとめて書いています。
`-n` はさっきもでてきたループするやつです。`-e`は`-E`のfeatureを設定しない版です。特に`-e`にする理由もないですが`-E`にする理由もないので書きやすいほうで書きました。

```perl
BEGIN { $^I = ""; } # これは -i オプションのやつ
LINE: while (defined($_ = <ARGV>)) { # これは -n オプションのループ
    print $_ unless m[^ {8}"hoge":\s*\{\s*$] .. /^ {8}\},\s*$/;
}
```

`m!^ {8}"hoge":\s*\{\s*$! .. m!^ {8}\},\s*$!` が謎ですね。
これはPerlの大変マイナーな演算子である範囲演算子（フリップフロップ演算子）と呼ばれるものです。

### フリップフロップ演算子

範囲演算子`..`は一般的には`1 .. 10`のように数値の範囲を示して整数としての`1`から`10`までの連番のリストを表現するために使われる演算子です。
しかし、スカラコンテキストではsedのコンマ演算子(`1,3`など)のように振る舞うために真偽値を返します。数値の場合は読込中のファイルの行数`$.`に対して処理しますが、正規表現の場合は読み込んだファイルの行`$_`に対して処理します。この特徴的な挙動を指して範囲演算子のスカラコンテキストでの用法はフリップフロップ演算子とも呼ばれます。

つまり、`m!^ {8}"hoge":\s*\{\s*$! .. m!^ {8}\},\s*$!`は`m!^ {8}"hoge":\s*\{\s*$!` にマッチする行から `m!^ {8}\},\s*$!'`にマッチする行まで真になります。
対象の行を取り除くには`print unless`で逆の条件にして`print`すればよいというわけです。

詳細はperldocを読みましょう: http://perldoc.jp/docs/perl/5.26.1/perlop.pod#Range32Operators

もう少し紹介しようと思ったど長くなってきたのでこのへんで。明日は@xtetsujiさんです。お楽しみに！
ローカルホストに接続できない時の対処法

オリジナルアプリやポートフォリオ作成中に、ローカルホストに接続できないという経験はないでしょうか？

私は、あります（笑）

そんな時の対処法を備忘録を兼ねて、ご紹介します。

##解決方法

####その1　ターミナルの再起動

ターミナルを強制終了する
※私はダメでした（笑）


####その2　server.pidファイルを削除

サーバーを起動する際、/ユーザー名/アプリケーション名/tmp/pids/server.pid.というファイルが生成されるそうです。
サーバーを閉じるとファイルは削除される、といったようにサーバーの起動と終了を行う際は、裏でこういったことが起きているみたいです。
※このファイルを削除するとうまくいくことがあるみたいです。


####その3　Address already in use - bind(2) for "〜〜〜" port 3000 (Errno::EADDRINUSE)

私の場合は、ターミナル上にこの一文が太くなっていました。
その際は、以下のコマンドを実行してみたください。

```ruby:qiita.rb
lsof -i :3000
```

そうすると、以下のようなものが、ターミナル上に表示され表示されると思います。

![スクリーンショット 2020-12-07 19.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761506/e1680e78-d864-c487-bd6a-e72d73cc036b.png)

あとは、以下のコマンドを実行するだけです。

```ruby:qiita.rb
kill -QUIT "PIDの数字"
```

お試しあれ！
【Java】文字列を置換する方法

#プログラミング勉強日記
2020年12月7日
文字列を置換するときにはreplaceメソッド、replaceAllメソッド、replaceFirstメソッドを使うが、それぞれの使い方をまとめる。

#replaceメソッド
　replaceメソッドは対象の文字列から第1引数で指定した文字列を検索して、一致した文字列を第2引数で指定した文字列で置換する。置換後の文字列を戻り値として返す。

```java:replaceメソッドの書き方
対象の文字列.replace(置換される文字列, 置換する文字列)
```

##replaceメソッドのサンプルコード

```:サンプルコード
String str1 = "abc123abc123";
String str2 = str1.replace("abc", "0");
System.out.println(str2); 
```

```:実行結果
01230123
```

#replaceAllメソッド
　正規表現を使う場合にreplaceAllメソッドを使う。replaceAllメソッドは対象の文字列から第1引数で指定した正規表現のパターンで文字列を検索して、一致した文字列を第2引数で指定した文字列で置換する。置換後の文字列を戻り値として返す。
　正規表現については[こちらの記事](https://qiita.com/mzmz__02/items/33440a0bb8523f249416#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A8%E3%81%AF)で詳しく扱っている。

```java:replaceAllメソッドの書き方
対象の文字列.replaceAll(正規表現, 置換する文字列)
```

##replaceAllメソッドのサンプルコード

```java:サンプルコード
String str3 = "abc123abc123";
// "[a-z]+" : 小文字のアルファベット
String str4 = str3.replaceAll("[a-z]+", "0");
System.out.println(str4); 
```

```:実行結果
01230123
```

#replaceFirstメソッド
　replaceFirstメソッドは対象の文字列の中から最初に一致した文字列だけを置換する。対象の文字列から第1引数で指定した正規表現のアターンで文字列を検索して、最初に一致した文字列のみを第2引数で指定した文字列で置換する。置換後の文字列を戻り値として返す。

```java:replaceFirstメソッドの書き方
対象の文字列.replaceFirst(正規表現, 置換する文字列)
```

##replaceFirstメソッドのサンプルコード

```java:サンプルコード
String str5 = "abc123abc123";
// "[a-z]+" : 小文字のアルファベット
String str6 = str5.replaceFirst("[a-z]+", "0");
System.out.println(str6); 
```

```:実行結果
0123abc123
```

#まとめ
　Javaで文字列を置換する方法を紹介した。

- replaceメソッドは正規表現を使わない
- replaceAllメソッドとreplaceFirstメソッドは正規表現を使う
- すべて置換する場合はreplaceAllメソッドを使う
- 最初の1つだけ置換する場合はreplaceFirstメソッドを使う

#参考文献
[2分で理解！Javaで文字列を置換するreplaceFirst,replaceAll【Stringクラス】](https://eng-entrance.com/java-string-replacefirst-replaceall)
[Javaで文字列を置換する：replace(), replaceAll(), replaceFirst()](https://uxmilk.jp/47873)
react nativeでのIDFA対応(AdjustSDK利用)

<font color="Red">~~※まだリリースまでこじつけてないので、問題はあるかも・・・~~</font>
# 背景
年明けにAppleさんが広告ID利用の許諾確認必須にするらしいので、その対応を実施したので、そのときAdjustSDKのバージョンアップ対応時のメモ(微妙にgithubの説明がわかりづらかったので

# 前提
react native: 0.61.4
yarn : 1.21.1
react-native-adjustを既に導入済みでアップグレード対応

# 対応概要
1. package.jsonの更新とライブラリのnpmのパッケージの更新
1. podsの該当ライブラリの更新
1. Xcodeプロジェクトに必要ライブラリの追加
1. 許諾ポップアップを表示するコードの追加
1. Info.plistに許諾用文言の追加

# 1.package.jsonの更新とライブラリのnpmのパッケージの更新
プロジェクトのpackage.jsonの該当ライブラリのバージョンをIDFAの対応が入っている4.23.0以上にする

```json:package.json
“react-native-adjust”: “^4.23.1",
```

package.json更新後以下コマンドを実行

```
yarn upgrade react-native-adjust
```

# 2.podsの該当ライブラリの更新
iOSプロジェクトのディレクトリで以下コマンドを実行

```
pod update react-native-adjust
```

# 3.Xcodeプロジェクトに必要ライブラリの追加
1. Xcodeで該当プロジェクトを開く
1. サイドメニューの`show the Project navigator`を開いて、プロジェクトファイルを選択する
2. メイン部分で`TARGETS`を選択して、`Build Phases`を選択する
3. `Link Binary With Libraries`を開いて、`＋`ボタンを押下して以下のライブラリを追加する。追加後追加したすべてのライブラリの**Status**を**Required**から**Optional**に変更する
    - StoreKit.framework
    - AppTrackingTransparency.framework
    - CoreTelephony.framework
    - iAd.framework
    - AdSupport.framework

# 4.許諾ポップアップを表示するコードの追加
この辺は公式の記述通りにすんなり。以下コードを自分はトップの画面の`componentDidMount`に記述しました。

```
Adjust.requestTrackingAuthorizationWithCompletionHandler(function(status) {
    switch (status) {
        case 0:
            // ATTrackingManagerAuthorizationStatusNotDetermined case
            break;
        case 1:
            // ATTrackingManagerAuthorizationStatusRestricted case
            break;
        case 2:
            // ATTrackingManagerAuthorizationStatusDenied case
            break;
        case 3:
            // ATTrackingManagerAuthorizationStatusAuthorized case
            break;
    }
});
```

# 5.Info.plistに許諾用文言の追加

ルート直下で**NSUserTrackingUsageDescription**の項目を追加して、Valueには許諾のポップアップに表示したい、文言を記述する。以上でbuildすればiOS14以降で広告ID取得許諾のポップアップが表示されるかと思います。

# 参考
https://github.com/adjust/react_native_sdk#att-framework
【Docker】できること・操作の流れ

<h1>本投稿の目的</h1>
・Dockerの操作についての議事録です。

---
<h1>学習に使った教材</h1>
Udemyの ["米国AI開発者がゼロから教えるDocker講座"](https://www.udemy.com/course/aidocker/) を教材として使用しました。

---

<h1>○Dockerとは?</h1>
・PC上での仮想環境構築を用意にするためのツール
・Host PC上に複数のcontainerを生成しそこにconatainer分の仮想環境を作成する

<h1>○Docker導入のメリット</h1>
・Host PC とは別のフラットな空間で環境構築するためコンフリクトが起きずらい
・Container作成は決められたルールで簡単に作成できる
・他人に全く同じ仮想環境を配布することができる

<h1>○Dockerの要素</h1>
・Dockerは以下4つの要素から構成される
①Dockerfile
②Docker Hub
③Docker image
④Docker container

<h1>○各要素の説明</h1>
**①Dockerfile**
・テキストファイル
・ここにimage作成時に必要な情報を記述する

**②DockerHub**
・imageを保存するリポジトリ集団
・ContainerをDockerfileから作成しない際にはDocker Hubを使用

**③Docker image**
・containerを作成する際に必要なリソース
・①Dockerfileを使って作成するファイル
・②Docker Hubから直接取得することも可能
・imageから作成したcontainerをここにimageとして保管することも可能

**④Docker container**
・ここに,サーバー用のOS,Softwareなど仮想環境のリソースを設置
・これが一番得たいもので,Host PC上に別の仮想PCを作成できるようなイメージ
・各containerごとに仮想PCを作成できる
・③Docker imageから作成する
・作成後に情報を追加して上書き保存することが可能

<h1>○container作成までの流れ</h1>
・作成方法は以下2つの方法がある

**1.imageを作成する場合**
①Dockerfile作成
②image作成
③container作成

**2.作成済みimageを利用する場合**
①image取得(Docker Hubから)
②container作成

---
初投稿・ご挨拶

###自己紹介
Cisco Japan に2020年新卒入社し、現在プリセールスエンジニアをしております @donzaki と申します。
3年前からCisco Japanで毎年開催されているAdvent Calendarに私も参加させていただくことになり、ご挨拶の投稿をさせていただきました。
Qiitaで情報発信するのは初めてではありますが、入社前からCiscoのAdvent Calendarを拝見していたので、自分も参加できることにワクワクしています。

###Cisco Advent Calendar
こちらが2020年のAdvent Calendarです。
・ [2020年 Advent Calendar 一枚目](https://qiita.com/advent-calendar/2020/cisco)
・ [2020年 Advent Calendar 二枚目](https://qiita.com/advent-calendar/2020/cisco2)

過去のAdvent Calendarもこちらにまとめておきますので、ぜひご覧ください。
・ [2019年 Advent Calendar](https://qiita.com/advent-calendar/2019/cisco)
・ [2018年 Advent Calendar](https://qiita.com/advent-calendar/2018/cisco)
・ [2017年 Advent Calendar](https://qiita.com/advent-calendar/2017/cisco)

###最後に
Qiitaの初回投稿には容量制限があるようなので、今回はご挨拶だけさせて頂き、次の記事から本格的に作成していきます。
皆様のお役に立つ情報が発信できれば幸いです。
それでは、Advent Calendar にてお会いしましょう！
2年生で就活を初めてみた感想

# はじめに
　はじめまして。
　これは、IT業界を主に志望する大学２年生の僕が、１年生の頃からインターンに行ってみたり、２年生になってみてからは志望業界でのアルバイトや就活サイトへの登録、就職課イベントへの参加をしてみた感想です。

　どう書こうか迷ったんですが質疑応答みたいな形で書いたら書きやすいかなと思ったのでそうします。

##Q. 早めに始めてよかった？
###A. よかったです。
自分にまだ残された時間が何年かある中で、何をした方がいいのかがぼんやりとですが分かりました。業界を知っていくことで、働いている自分を想像したり、勉強へのモチベも上がりました。

##Q. 逆に、もっと遅くても良かった？
###A. そうは思いません。
　早めに始めるメリットを知った今では、もっと遅いのはもっと大変になるから嫌だという感想を持ちます。３年になったら周りと比べてしまうことで起こる焦りもあると思いますし、卒論のことも考え始めて忙しくなるのかなあと思っています。

##Q. もっとこうしたほうがよかったと思ったことはある？
###A. あります。
　どうせなら１年生の頃から資格取得に向け動き出していけていたらよかったと思います。今は基本情報や応用情報の資格取得に向けて、まずは基本情報から勉強を始めていますが、基本情報なら１年で勉強して２年の頭や半ばで取ることも出来たのかなあと思います。就活を有利に進められるのはもちろん、授業での理解を深めやすくもなるでしょう。

##Q. インターンはどうだった？
###A. とても楽しく、有意義なものでした。
　モチベは上がりましたし、企業の内実を知ることもできます。早めに情報が集まるので、早めに対策ができます。

##Q. インターンで気をつけていた事は？
###A. 言葉を鵜呑みにしないことと、きちんと記録を取り後で見返すことに気をつけました。
　インターン先は、あくまで業界のうちの一社であったり、視野を広げるために志望業界ではないものでした。それぞれの事情やそれぞれの見解があり、インターンで頂けるアドバイスは様々な様相を呈します。本当に必要なインターンなのかを考えつつも、色々なインターンを受けることでバイアスのかからないようにしてきましたし、そうするのがよいと考えています。記録をきちんととることであとから振り返る時に役立ちます。

#おわりに
　初めて書く記事でしたが、いかがでしたでしょうか。他にも聞きたいことがあれば追記しますのでコメントいただければと思います。
　結局のところ早めに初めて損は感じませんでした。強いて言えば時間が取られることでしょうか、有意義に使えていないと無駄っぽくなってしまうのは否めません。皆さんもぜひいい就活ライフを！
getCompiledSelect の罠、 useSoftDelete が抜け落ちる

体調不良で大遅刻しました・・・
申し訳ないです。


さて、

CodeIgniter4のクエリビルダにはCodeigniter3にもあった、ビルド中のクエリを取得するメソッドがある。

それが `getCompiledSelect` というメソッド（Codeigniter3では `get_compiled_select`）だが、これ、**モデル中でも利用できて便利！**

と思うじゃん？

実際取得してみるとあれ？となる。

``` app/Models/ItemModel.php
namespace App\Models;
use CodeIgniter\Model;
class ItemModel extends Model {
	protected $table = 'items';
	protected $primaryKey = 'item_no';
	protected $returnType = 'array';
	protected $useSoftDeletes = true;
	protected $allowedFields = [];
	protected $useTimestamps = false;
	protected $createdField = 'created_at';
	protected $updatedField = 'updated_at';
	protected $deletedField = 'deleted_at';
	protected $validationRules = [];
	protected $validationMessages = [];
	protected $skipValidation = false;
	protected $afterFind = [];
}
```

``` app/Contorllers/Hoge.php
$itemModel = model('ItemModel');
$itemModel->select('item_no');

echo $itemModel->getCompiledSelect(false);
// SELECT `item_no` FROM `items`

// 実行してからgetLastQueryしてみると
$itemModel->find();
echo $itemModel->getLastQuery();
// SELECT `item_no` FROM `items` WHERE `items`.`deleted_at` IS NULL
```

つまり、**モデル中の `useSoftDelete` が適用されない**ということ。
Codeigniter3は `useSoftDelete` なる機能がなかった（というか、モデルとDBがFW上で紐付いていなかった）ため、論理削除のクエリもクエリビルダに含めてから `get_compiled_select` をするため、まず間違えることはないのだが、Codeigniter4のモデル機能に甘えてこれを忘れてしまうと **大変なことになる** ので要注意。

**まとめ：論理削除を用いたモデルを利用する場合は getCompiledSelect を使わずにクエリを実行してから getLastQuery をしよう（もしくは論理削除のwhere句を記述する）**

※ 本当は `getCompiledSelect` を使わないように設計するのが一番いいのだが、そうは行かないケースは結構あるわけで・・・

----

解決編： getCompiledSelect で useSoftDelete が効くようにする
https://qiita.com/bananacoffee/items/1b9b56ce541174a3fb7d
M1 macにhomebrewをいれる

## 概要

[Homebrew](https://brew.sh/index_ja)がversion2.6でm1 macに対応しましたね！👏


>
Today I’d like to announce Homebrew 2.6.0. The most significant changes since 2.5.0 are macOS Big Sur support on Intel, brew commands replacing all brew cask commands, the beginnings of macOS M1/Apple Silicon/ARM support and API deprecations.
https://brew.sh/2020/12/01/homebrew-2.6.0/


ARM版はまだ完全版じゃないため、Intel版(Rosetta使用)と並行して使えるように、 `/opt/homebrew` にインストールするようにとのこと

>
macOS Homebrew running natively on M1/Apple Silicon/ARM has partial functionality. We recommend installing into /opt/homebrew and forbid installing into /usr/local (to avoid clashing with the macOS Intel install and allow their usage side-by-side). We currently recommend running Homebrew using Intel emulation with Rosetta 2.


## 実行環境
```
Big Sur 11.0.1
MacBook Pro (13-inch, M1, 2020)
```

## インストール方法

[ここ](https://docs.brew.sh/Installation#alternative-installs)を参考にインストールします。
先述通り `/opt/homebrew` に置くようにとのことなので、まずはディレクトリ作成から

```bash

sudo mkdir /opt/homebrew
sudo chown -R $(whoami) /opt/homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C /opt/homebrew
```

## PATHを通す
macのデフォルトシェルがzshになっているためzshrcに入れました

```bash

touch ~/.zshrc
echo 'export PATH=$PATH:/opt/homebrew/bin' >> ~/.zshrc
source ~/.zshrc
```

## インストールできてるか確認
```bash

which brew
/opt/homebrew/bin/brew

brew --version
Homebrew >=2.5.0 (shallow or no git repository)
Homebrew/homebrew-core N/A
```

## version上げ
2.5になってたのでバージョンを上げます

```bash

brew update
brew --version
Homebrew 2.6.0-104-g24f7898
Homebrew/homebrew-core (git revision 694814; last commit 2020-12-07)
```

## 動作確認

ちゃんとarm版がインストールされました🎉

```bash

brew install jq

file /opt/homebrew/bin/jq
/opt/homebrew/bin/jq: Mach-O 64-bit executable arm64

echo '{"mac":[{"id":1,"name":"intel"},{"id":2,"name":"arm"}]}' | jq .
{
  "mac": [
    {
      "id": 1,
      "name": "intel"
    },
    {
      "id": 2,
      "name": "arm"
    }
  ]
}
```
WordPressで親テーマの余計なCSSを削除

ワードプレスのテーマtwentytwentyを基盤に、wp_head( )を記述した際にビューが崩れる問題に対し、wp_head( )内で親テーマのCSSを読み込まないようにする実装を行ったので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 7.3.12
WordPress：version 5.5.3
WPテーマ：twentytwenty

# 作業

子テーマのfunction.phpに以下を記述することで解決しました。

```function.php
//parent-style-cssの削除
function my_delete_plugin_files() {
    wp_dequeue_style('parent-style');
}
add_action( 'wp_enqueue_scripts', 'my_delete_plugin_files' );

// //twenty-twenty系cssの削除
function remove_enqueue_parent_style() {
    $name1 = 'twenty-twenty-style';
    $name2 = 'twenty-twenty-print-style';
    if( wp_style_is( $name1 ) ) { wp_dequeue_style( $name1 ); }
    if( wp_style_is( $name2 ) ) { wp_dequeue_style( $name2 ); }
}
add_action( 'wp_enqueue_scripts', 'remove_enqueue_parent_style', 11);
```
MAMPでPDO接続の際にUnknown character set,Connection failed,が出た時の対応

人生で初めてPDO接続したので速攻起きたエラーのまとめです。

<h2>SQLSTATE[HY000] [2019] Unknown character setへの対応</h2>

```index.php
<?php

try{
    $db= new PDO('mysql:dbname=my_db;host=127.0.0.0;charset=utf-8',
    'root','root');

}catch(PDOException $e){
    echo "DB接続エラー".$e->getMessage();
}

?>
```
<strong>
SQLSTATE[HY000] [2019] Unknown character set
</strong>
と出ました。

<strong>charcter</strong>ってことは、<strong>utf-8</strong>
あたりが悪いだろうなと大体察しはつくのですが、
どこが悪いのかよくわかりません。

どこがいけないのだろうとググってみると.

```
charset=utf-8
```
の
<strong>utf-8</strong>ではなく<strong>utf8</strong>
で「-」（ハイフン）は不要とのこと！
これは罠ですよね...



```index.php
<?php

try{
    $db= new PDO('mysql:dbname=my_db;host=127.0.0.0;charset=utf8',
    'root','root');

}catch(PDOException $e){
    echo "DB接続エラー".$e->getMessage();
}

?>
```

これで書き換えてOKかと思いきや...
次は<strong>「Connection failed」</strong>が発生しました。

全くわからないので、調べてみました。

<h2>Connection failed: SQLSTATE[HY000] [2002]への対応</h2>

<strong>Connection faild</strong>は接続が失敗している...
どうやら接続しているhostやportがいけないみたいですね。

```index.php
host=127.0.0.0
```

ではなく

```idenx.php
port=8889
```
に変えると、良いと書いてありました。

そういえばMAMPのportデフォルトのままだった...


```index.php
<?php

try{
    $db= new PDO('mysql:dbname=my_db;port=8889;charset=utf8',
    'root','root');

}catch(PDOException $e){
    echo "DB接続エラー".$e->getMessage();
}

?>
```

これでエラーが解消しました!


参考にした記事

<a href="http://thinkexpress.hatenablog.com/entry/2017/09/05/002104">【解決方法と原因】PHPでConnection failed: SQLSTATE[HY000] [2002] のエラー</a>

<a href="http://azuuun-memorandum.hatenablog.com/entry/2016/03/06/100139">ざっくりん雑記  |SQLSTATE[HY000] [2019] Unknown character set</a>
初心者のNewRelic。エージェントをインストールしてみる。

New Relicを使うに当たってサーバーにエージェントをインストールするとより詳細なメトリクスが取得できます。
また、「on-host integrations」というプラグイン群を追加すると、さらにサーバーでなにが起きているか詳しく知ることができます。
手始めのエージェントインストールと一部設定方法を残しておきます。

## インストールした環境
- AWS EC2
- Amazon Linux2 or Windows Server2019

## 注意点
New Relicのバージョンによって管理画面の構成などが異なることがあります。

## 概要
手順はとても簡単です。
必要なことはサーバーへのSSHおよびRDPログイン。
Linux/Windowsともにコマンドを実行するだけです。
互換性や要件などは下記公式ドキュメントで確認してください。
https://docs.newrelic.co.jp/docs/infrastructure/install-infrastructure-agent/get-started/requirements-infrastructure-agent

## 手順 - エージェントインストール
### ① 管理メニューの「Add more data」を選択し、一覧より「Host operating systems」の対象OSを選択
![adf0a659-8137-44b0-a8f4-69311b7d0a99.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/3ec765d9-688d-49f1-9d74-3aa4be59a78e.png)
#### Linux(Amazon Linux2)の場合
![スクリーンショット 2020-12-07 11.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/d2ab9dc0-ea44-4779-9d8d-d2fac3fbde44.png)
#### Windowsの場合
![スクリーンショット 2020-12-07 13.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/52e411f9-0a22-56d5-d3b0-12061d825358.png)
### ② 対象のNewRelicアカウントおよびOSのバージョンを選択し、インストールコマンドを生成
#### Linux(Amazon Linux2)の場合
![スクリーンショット 2020-12-07 11.15.20_02_22fd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/ea331156-57a1-4167-05d7-ad4c9f5ca91d.png)
![スクリーンショット 2020-12-07 11.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/4da13f71-df0a-3229-4ab2-41db02ec6b19.png)
#### Windowsの場合
![スクリーンショット 2020-12-07 13.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/8931086a-68d4-e56b-1a75-13d233587d7d.png)
![スクリーンショット 2020-12-07 13.33.26_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/a9024d6c-e19f-2ccf-6e11-1a264da0f860.png)
### ③ 対象のNewRelicアカウントおよびOSのバージョンを選択し、インストールコマンドを生成
あとは生成されたコマンドをLinuxならbashなど、WindowsならPowerShellで実行するだけです。
実行後、数分してからNewRelicの Infrastructure > hosts などでサーバーが表示されているか確認します。

## 手順 - プロセスメトリクス取得
下記設定ではOSで管理できる全てのプロセスに関するメトリクスを取得します。
プロセスをフィルターしたい場合は下記を参照
https://docs.newrelic.co.jp/docs/infrastructure/install-infrastructure-agent/configuration/infrastructure-agent-configuration-settings#include-matching-metrics
### ① newrelic-infra.ymlに有効化の設定を記述
1行追記するだけです！
簡単！
Linux: /etc/newrelic-infra.yml
Windows: C:\Program Files\New Relic\newrelic-infra\newrelic-infra.yml

```
license_key: 3***********L ←デフォルトでの記載行です

# ここから下を追記
# プロセス監視
enable_process_metrics: true
``` 
### ② エージェントを再起動
#### Linux(Amazon Linux2)
```
$ sudo systemctl restart newrelic-infra
```
#### Windows
```
PS C:\Users\Administrator> Restart-Service -Name newrelic-infra
```
### ③ 管理画面で設定反映を確認
![スクリーンショット 2020-12-07 12.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/4c5c085e-2fe7-12f1-d3b4-5398fa614107.png)
1行追加するだけで、サーバーで実行されているプロセスやWindowsサービスについてCPU使用率やメモリ使用率が把握できるようになります。
とても簡単。

他にもMySQLやapache固有のメトリクスを取得できたり、コンテナやdockerにインストールできたりします。
いろんな環境で触ってみたいと思います。

参考サイト:
https://docs.newrelic.co.jp/docs/infrastructure/install-infrastructure-agent/get-started/install-infrastructure-agent
Mate Desktopで、フォルダの右クリックに「Codeで開く」を追加する。

# はじめに
Amazon Linux 2 + Mate DesktopでVS Codeを使っています。
フォルダを右クリックして、コンテキストメニューからVS Codeで開く方法を共有します。

# 前提
- Mate Desktopがインストールされている
- VSCodeがインストールされている

# 方法
１．~/.config/caja/scripts/ディレクトリに移動します。
２．「VSCodeで開く」というファイルを作成して、次の2行を入力します。

```shell
#!/bin/sh
code $CAJA_SCRIPT_SELECTED_FILE_PATHS
```
３．ファイルに実行権限を付けます。

```shell
chmod u+x VSCodeで開く
```

# 実行例
コンテキストメニューの「スクリプト」から、「VSCodeで開く」が実行できるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155165/7768082a-a5c9-1b83-9d79-bd4459fe730e.png)

# 終わりに
mate-desktopは、amazon-linux-extrasからインストールして使っています。
あと、「Mate」って、マテと読むのですね。

# 参考
https://help.ubuntu.com/community/NautilusScriptsHowto
Docker開発環境でCapybara, FactoryBotを使ったテスト環境を構築追加する

######概要
docker開発環境でRSpecテスト環境を構築するやり方の備忘録としてまとめました。
独学なので間違っている部分があると思いますが、その時はご指摘頂けると嬉しいです。

以下の記事を参考にしました。
https://qiita.com/at-946/items/e96eaf3f91a39d180eb3
https://qiita.com/na-tsune/items/91630257294aa0ea4fc8

##1.docker-compose.ymlの編集


```ruby:docker-compose.yml
version: '3'
services:
    db:
        image: mysql:5.7
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql
    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        volumes:
            - .:/myapp
            - gem_data:/usr/local/bundle
        ports:
            - 3000:3000
        depends_on:
            - db 
            - chrome # ←追加
        tty: true
        stdin_open: true
    chrome:
        image: selenium/standalone-chrome:latest
        ports:
            - 4444:4444
volumes:
    gem_data:
```
web:配下のdepends_onに-chromeを追記。
services:配下にchrome:以下を追記。

##2.RSpecの導入
Gemfileに必要なgemを追記

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'pry-rails'
  gem 'pry-byebug'
  #rspec用のgem 2つ追記
  gem 'rspec-rails', '~> 4.0.1'
  gem 'factory_bot_rails', '~>4.11'
end
```
dockerのbuild, up, gemのインストール,Rspecのインストールをする。

```terminal
$ docker-compose run web bundle install
```

```terminal
$ docker-compose build
```

```terminal
$ docker-compose up
```

```terminal
$ docker-compose run web rails g rspec:install
```
次に、
RSpecのインストールによって作成されるファイルの中に、"rails_helper.rb"の設定を記述していきます。ついでにtestディレクトリは削除しておく。

```ruby:/spec/rails_helper.rb
#↓追記
Capybara.register_driver :remote_chrome do |app|
  url = "http://chrome:4444/wd/hub"
  caps = ::Selenium::WebDriver::Remote::Capabilities.chrome(
    "goog:chromeOptions" => {
      "args" => [
        "no-sandbox",
        "headless",
        "disable-gpu",
        "window-size=1680,1050"
      ]
    }
  )
  Capybara::Selenium::Driver.new(app, browser: :remote, url: url, desired_capabilities: caps)
end
#↑追記

#↓追記
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :remote_chrome
    Capybara.server_host = IPSocket.getaddress(Socket.gethostname)
    Capybara.server_port = 4444
    Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
  end
  #↑追記
```
最後に.rspecを編集して、rails_helper.rbの設定を読み取るようにします。

```ruby:.rspec
--require spec_helper #削除する
--require rails_helper #追記
```
あとはテスト記述、実行できるか確認する。
```terminal
$ docker-compose run web rspec [rspecテストファイルのpath]
```
JavaScriptでのUncaught TypeError: Cannot read property 'addEventListener' of null　エラー



Javascriptの中で指定ページ以外のページのconsoleを見ると

```

Uncaught TypeError: Cannot read property 'addEventListener' of null
```

というエラーが突然出た件。

あれ？指定ページでは出ないのに、、なぜ？となったので備忘録として。

今回のコード

```javascript

window.addEventListener("load",function(){
const priceGet = document.getElementById("item-price");
priceGet.addEventListener("input", () => {

以下略
````


原因は他のページではidがitem-priceの要素が存在しないため
priceGetがnullになってしまう。
nullに対してaddEventListenerを使用したことでエラーが発生した。


対応策として

```javascript

window.addEventListener("load",function(){
const priceGet = document.getElementById("item-price");
if (!priceGet){ return false;}
priceGet.addEventListener("input", () => {

以下略
````

```javascript

if (!priceGet){ return false;}
```

を記載することで
priceGetがnullの場合にそれ以降のコードを読まないように実装できる。



もし何か間違い等あれば教えていただきたいです！
Sidekiqの管理画面で500エラーが発生


Sidekiqの管理画面(Sidekiq::Web)で500エラーが発生しており、無事に解決できたので、対応方法をまとめておきます。


## 開発環境
- Rails: 5.2.3
- Ruby: 2.6.3
- rack: 2.2.3
- Redis: 4.1.2
- Sidekiq: 6.0.0

## 発生していたエラー

```
NoMethodError (undefined method `match' for #<Rack::Session::SessionId:xxxxxxxxxxxxxx>):
```

## やったこと
#### 試してみたこと
1.セッションを消してみる
2.rackをアップデート
3.bundle updateしてみる

#### 解決した方法
4.redis-rackをアップデートしてみる
5.redis-actionpackをアップデートしてみる

---
### 1.セッションを消してみる

```config/routes.rb
require 'sidekiq/web'
Sidekiq::Web.set :sessions, false # 追加
```

管理画面は表示されるが、セッションを消しているだけなので、
根本的な解決とはなっていない。

### 2.rackをアップデート

`bundle update rack`

```
Note: rack version regressed from 2.2.3 to 2.0.9
```

エラーが変わらず。

### 3.bundle updateしてみる
`bundle update`
正常に動いたのでgemに問題がありそう。
今回の修正範囲以外にも影響が大きいため、gem全てがアップデートされる`bundle update`は避けて、
一旦もとに戻して原因を探る。

---

### 4.redis-rackをアップデートしてみる
`bundle update redis-rack`


管理画面は正常に表示されたが、テストが失敗してしまう。

```
NoMethodError:
  undefined method `private_id' for "xxxxxxxxxxxxxxx":String
  Did you mean?  private_methods
```

### 5.redis-actionpackをアップデートしてみる
上記の`redis-rack`のアップデート実行後、
こちらの記事
https://github.com/redis-store/redis-rack/pull/50#issuecomment-567649953
を参考に
`bundle update redis-actionpack`

これでサーバー再起動後、Sidekiqの管理画面の500エラーが解消し、テストも通った。

## まとめ
`redis-rack`と`redis-actionpack`のアップデートで解決しました。
C言語　メモリリーク確認方法　Mac編

# メモリリークを確認したい。

valgrindというツールを使う方法がありますが、最新版のMacだと動かないようです。

そこで、私が知っている方法で、便利なのが、mainファイルをいじる方法か、コンパイルをclangで行い、オプションに`-g -fsanitize=leak`をつける方法です。

## system関数をmain関数に入れる

### SYNOPSIS

```terminal
     #include <stdlib.h>

     int
     system(const char *command);
```

main関数の最後にleaksコマンドを実行する関数を入れて、チェックします。

```c

int main()
{
    // ~~ コード ~~

    system(leaks a.out);
    return 0;
}
```

## `-g -fsanitize=leak`オプションを付けてコンパイルする方法

デフォルトのMacのclangでは、`-g -fsanitize=leak`オプションは使えないので、最新版をインストールします。

```
brew update
brew upgrade
brew install llvm
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc
sorce ~/.zshrc
```

念の為、このあとPC再起動すると使えるようになると思います。

コンパイルする際に以下のようにコンパイルしてください。

### コンパイル

```terminal
clang -g -fsanitize=leak test.c
```

### 出力結果

```
=================================================================
==5145==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 12 byte(s) in 1 object(s) allocated from:
    #0 0x10ec4be68 in wrap_malloc+0x58 (libclang_rt.lsan_osx_dynamic.dylib:x86_64+0x7e68)
    #1 0x10ec30f18 in main test.c:5
    #2 0x7fff6aaf9cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)

SUMMARY: LeakSanitizer: 12 byte(s) leaked in 1 allocation(s).
```

## その他


以下の方法をアレンジして、malloc、freeをマクロを使ってラップする方法。
[C言語　メモリリーク検出ツール - Qiita](https://qiita.com/keitean/items/c2d6d2849b6d273d674a)

mainをマクロを使ってラップする方法等もありそうです。

リンクで紹介している方法では、書き換える部分が多く、大変なので、コンパイル時に巻き込むだけで、簡単に検出できるようなツールを作りたいですね。
[ServiceNow]Formに拡張先の項目を配置する。

#概要
　ServiceNowは、テーブルの拡張という考え方を持っており、共通項目は拡張元のテーブルに、独自の項目は拡張先テーブルにのみ存在する。
　Reference項目で、拡張元のテーブルを参照しているが、拡張先のテーブル項目も画面に表示する、ということができる。


##詳細
　例えば、HardWare資産の画面に、紐づく構成情報のOS、OSドメイン等の情報を見えるようにする。
　[Hardware資産]
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/96389729-413a-dc7b-de84-75137896e3e9.png)

　[CMDB(構成情報)]
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/23b5e802-abde-a106-1fdb-81a5b348f033.png)

　OSの情報は、「ci」のテーブルには存在せず、「cmdb_ci_computer」に存在する項目である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/b2c69afe-97b5-3c80-2d37-eeb6ecac736b.png)

　HardwareのConfigurationItemは、基底の「ci」テーブルとのReferenceとなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/b2393ebb-7724-6142-a23a-211c6a410a80.png)

HardwareのForm LayoutではOS情報が表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/effab639-3ba4-fc7a-fa52-e7cc7251a4a6.png)


##表示のさせ方
1.System UI>Viewsから、該当のViewを開き、追加したいSectionのFormSectionを開く

2.Section Elementに、今配置している項目が出る。FormLayoutで設定されている内容がそのまま出てくる

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/d451ff33-1c5b-7117-66b1-90c18eb7fe45.png)

3.「New」で、表示したい項目を直接指定する。
   書き方は、「reference項目.ref_参照したいテーブル名.項目名」という書き方。
　 今回はHardwareから見て、OSを表示したいので、「ci.ref_cmdb_ci_computer.os」となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/de87bbac-09e3-11be-5af9-12f72543d6ca.png)

4．(念のため)Form Section、UI View自体のUpdateを行い、cacheをクリアする。

これで、表示されるようになる(・ω・)/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/fca3d294-2cec-8764-45b6-db53f93a2954.png)

このまま、Form Layoutを見てみるとComputerから参照されていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/a74408fd-f845-15d2-955a-b710aae445e4.png)