OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js 依存モジュールのファイルはケースセンシティブの件


皆さん開発の時ほとんど macOS を使ってるんでしょうか、だが macOS のファイル名はケースインセンシティブ（大小文字は区別しない）。つまり同じフォルダ下に `package.json` と `packagE.json` は一緒にいられない。

ほとんどの人は知ってるかにもかかわらず、あまりこれに注意を払ってないのではないかなと思って、だってみんなの母語は英語ではないし、インポートの際は intelliSense も結構賢く補足してもらってるので、あんまりここに転んだことはないと思います。転んでもすぐ忘れるんだろう。

<!-- more -->

よく会った問題はこれです👇

# Linux でデプロイ時にモジュールは見つからない

多分誰がメモ帳で書いたコード

```javascript
const list = require('./List');
```

でも List のファイル名は`list.js`、

そしたらすべての List を list に変えなきゃいけない。

細かい点で解決には難しくないが、時間ちょっと無駄しましたね。

でも今日話したいのは僕の午後をまるごと無駄しましてこの技術的な内容あまりない記事を書くことになったこれです👇

# `require('./a.js') !== require('./A.js')`

TypeORM を使ってる時新しいスキーマ（テーブル）を入れたが、デバッグの時ずーとそのスキーマが見つからないエラーに怒られて

```
TypeORM EntityMetadataNotFound: No metadata for "***" was found
```

option に何度も確認しまして確かにスキーマは入ってるが。

どうしようと思って、 node_modules に入って直接ソースコードを改ざんしてデバッグすることになった。

`console.log` でスキーマはたしかに入ってますが、

https://github.com/typeorm/typeorm/blob/master/src/connection/Connection.ts

```typescript
    /**
     * Gets entity metadata for the given entity class or schema name.
     */
    getMetadata(target: Function|EntitySchema<any>|string): EntityMetadata {
        const metadata = this.findMetadata(target);
        if (!metadata)
            throw new EntityMetadataNotFoundError(target);

        return metadata;
    }
```

```typescript
    /**
     * Finds exist entity metadata by the given entity class, target name or table name.
     */
    protected findMetadata(target: Function|EntitySchema<any>|string): EntityMetadata|undefined {
        return this.entityMetadatas.find(metadata => {
            console.log(metadata.target, target, metadata.target === target) // ←ここ
            if (metadata.target === target)
                return true;
            if (target instanceof EntitySchema) {
                return metadata.name === target.options.name;
            }
            if (typeof target === "string") {
                if (target.indexOf(".") !== -1) {
                    return metadata.tablePath === target;
                } else {
                    return metadata.name === target || metadata.tableName === target;
                }
            }

            return false;
        });
    }
```

左と右は同じく `Function xxx` がリファレンスは同じではない。

これは事件ですね。んでファイル両方の import を一行一行で確認して、最終的に import のパスに問題を見つかった。
自分がインポートした際に、一つは Class 名をそのままコピペしたが、もう一つはファイル名でしたが、Class 名は PascalCase が、ファイル名は camelCase でした。

そしたらなぜ同じファイルで使う時ファイル名が違ったらリファレンスは違うになりますか？

Node.js のソースコードに見てきました。
https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/loader.js#L936

Node.js の require は一回しか実行しない、その原因は Node.js はモジュールをメモリに保存して、その後コードの中で require したらすぐ使えるという意図で設計されました。
ソースコードからも見えて、Node.js はファイル名でキャッシュしますが、ここの filename は require のファイル名 + 絶対パス。

なので Node.js は２つモジュールとみなすが、windows だと、 filename は path.resolve で toLowerCase で同じファイル名にするが、Linux だとケースセンシティブでモジュール見つからないで弾かれますが、この問題は macOS しか出ませんね。

ま、デプロイまで問題出るよりラッキーですね。
nreal lightのWifiのIPアドレスの調べ方

nreal lightのSettingsを見ても**IPアドレスはわかりません。**

なのでPCに接続し、Androidの操作を行うことで確認します。

# 手順

- PCからAndroidを操作できるソフト[Vysor](https://chrome.google.com/webstore/detail/vysor/gidgenkbbabolejbgbpnhbimgjbffefm/related?hl=ja)をインストール
- PCとNrealをUSB-Cケーブルで接続
- Vysorを立ち上げ,ViewボタンでAndroid画面を起動
- Settings>Network&Internet>Wi-Fi>{指定のWifi}>IPアドレスの確認


# Vysorを立ち上げ,ViewボタンでAndroid画面を起動

このような画面が立ち上がったら、あとはAndroid操作と同じく

Settings>Network&Internet>Wi-Fi>{指定のWifi}>IPアドレスの確認で確認しましょう

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/0e143f9b-4ddc-0549-d97f-b0d9fe24de25.png width=300>
Coopel初歩1

DeNAのRPAであるCoopelについてチュートリアルの一歩先くらいを目指します。

####RPA挫折歴：
UiPath：　単純に難しく感じ、挫折。やれることが多いのだろうが、Pythonの方が簡単。
Heartcore Robo:　UiPathより簡単なのだろうが、最初の敷居をまたぐことができず挫折。

Coopelは、できることが限られている分だけ簡単・明解で、契約から2時間で最初のひたすら特定のボタンを1000回ループで押しまくる自動化を実現できたため、やりたいことがCoopelの枠内に収まるのであれば、最高のサービスになりえます。

####できること
・Chromeブラウザ操作の自動化
・Excel操作の自動化
・Googleスプレッドシートの自動化

####できないこと
・個別アプリケーションの操作

####契約
Coopelと検索して、30日間の無料トライアルに申し込みましょう。
月額は￥5400です。その辺のRPAと桁が違いますね。

#基本中の基本
ブラウザにログインして、IDパスワードを入れるところまでやってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96158/9c5383ca-6d85-bbc5-4aae-b658e8ac7bfc.png)

#######１．URLにアクセスパーツを配置し、右ペインでURLを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96158/86849132-4a82-f193-ad43-aad5e424c0c8.png)

#######２．ID入力パーツを配置し、右ペイン「指定」ボタンを押し、ブラウザを起動
この、スライドボタンが左に寄ってるときに画面をクリックすると、そこをクリックするようCoopelに指示することになります。指定したい画面がこの先にある場合は、スライドボタンを右にして画面を進めて、指定したい画面でクリックすると、目的の入力個所を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96158/f27ce7f0-5b6a-811e-370a-d2621959a2f7.png)

#######右ペインの「入力内容」にIDを入力します。

#######３．パスワード入力パーツを配置し、右ペインでパスワードを入力
要領はIDと同じです。

#######４．クリックパーツを配置し、クリック先を指定
「指定」ボタンを使うと簡単です。
多分、もっといいやり方もあると思いますが・・


こんな調子で、ボタンを押すだけの自動化なら、2時間かかりません。

###重要なポイント
簡単な条件分岐は、クリックの「エラー無視」で実現できる。
要は、そのボタンが存在すれば押すし、存在しなければエラー無視して次の工程に進むという分岐まがいのことができる。Coopelを使いこなすコツとして、重要なポイント。

第二回以降で詳しく書きます。
Your Ruby version is 2.4.6, but your Gemfile specified 2.6.4

マイグレーションファイルを作成しようとしたら、RubyのバージョンがGemfileで指定しているものと違うと言われ、実行できなかった。

```
$ bin/rails g migration hoge
Your Ruby version is 2.4.6, but your Gemfile specified 2.6.4
```

rbenvがインストールされていることを確認。

```
$ which rbenv
/usr/local/bin/rbenv
```

指定されたRubyのバージョンをインストール。

```
$ rbenv install 2.6.4
Downloading openssl-1.1.1g.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
Installing openssl-1.1.1g...
Installed openssl-1.1.1g to /Users/tamu/.rbenv/versions/2.6.4

Downloading ruby-2.6.4.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.4.tar.bz2
Installing ruby-2.6.4...
ruby-build: using readline from homebrew
Installed ruby-2.6.4 to /Users/tamu/.rbenv/versions/2.6.4
```

インストールされたことを確認。

```
$ rbenv versions
  system
* 2.4.6 (set by /Users/tamu/.rbenv/version)
  2.6.4
```

今回は、特定のディレクトリ配下にのみ適用したかったので、以下のように指定。

```
$ rbenv local 2.6.4
```

切り替わったことを確認。

```
$ ruby -v
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin18]
```
react nativeでtypescriptを使ってproject初めたかったのに、typescriptが適用されなかった問題

## 問題

react nativeで何かアプリを作ろうとして、その際にtypescriptで始めようとしたのです。その際に公式のドキュメント通りに、以下を叩きました。

```
npx react-native init <MyApp> --template react-native-template-typescript
```

しかしあらびっくり。。作成されたディレクトリを覗いてみると、普通のJSプロジェクトになっていました。という事象です。


エラー文を見てみると、こんな感じ。

```
(node:20898) UnhandledPromiseRejectionWarning: Error: Command failed: npm install --save --save-exact react-native-template-react-native-template-typescript
```

## 解決策

https://github.com/react-native-community/react-native-template-typescript/issues/80
上記によれば、インストールしているreact-native-cliが悪さをしているみたい。react-native-cliをインストールする際に`npm install -g react-native-cli`でインストールをすると、問題が起きるようです。。
たしかに、react-native-cliをインストールする時にこのコマンドを使った覚えがありました。

ではどうすればよいのかというと、下記の流れでうまくいきました。

```
npm uninstall -g react-native-cli // 既存のcliを削除

npm i -g @react-native-community/cli // こっちのcliをインストール

npx react-native init <MyApp> --template react-native-template-typescript
```
[Rails]migrateファイルの変更(rails db:rollback)


こんにちは、tt_tsutsumiです。
今回はmigrateファイルの変更方法についてです。
こちらの記事が何方かのお役に立てると嬉しいです。

アプリケーション作成中にカラムの変更や追加を行った時に
普通のコードの書き方と違いが生まれたので困惑しました。
その際に自分が行った工程と流れの記載を致します。
##1. rails db:migrate:status

まずは現在作成しているアプリケーションのmigrateの稼働状況の確認を行いましょう。
コンソールにて下記コードを入力します。

```
$　rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     year/month/day  Devise create users
   up     year/month/day  Create spots

```

※　year/month/dayの部分はご自身で作成された日付等が表示されます

上記でstatusの部分がupになっている場合、migrateファイルは稼働しております。
この際にmigrateファイルの変更や追加を行っても反映されません。

##2. rails db:rollback

migrateファイルの稼働状況をdownします。

```
$　rails db:rollback
$　rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     year/month/day  Devise create users
   down   year/month/day  Create spots
```

ここで重要なのは **rails db:rollback** です!!
このコードを打つことにより稼働しているmigateファイルをdownさせる事ができます。

※　注意点としてこちらのコードはファイルを１つずつしかdownに出来ません。
##3. rails db:migrate

downになっているのを確認してからmigrateファイルの変更や消去を行って下さい。
そして変更が終わったら保存をし、**rails db:migrate**　を行います。

```
$　rails db:migrate
$　rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     year/month/day  Devise create users
   up     year/month/day  Create spots
```

これでmigrateファイルの変更と保存は終了です。
ご覧いただきありがとうございました !!
色相（Hue）の回転はHSL色空間よりLCH色空間のほうが自然に見える

色相（Hue）を少しずつずらして別の色を作ることがたまにありますが、その際、HSL色空間よりLCH色空間でずらしたほうが人間の知覚にとって自然に見えます。

それを視覚的に確認するためにデモサイトを作りました。

デモ: https://fujiharuka.github.io/color-rotation/

## HSL 色空間で色相をずらした場合

<img width="834" alt="スクリーンショット 2020-07-04 15.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96361/a2556fb3-84dd-dd7f-4693-978da887ad3c.png">

左端の色が基準となる色で、HSL 色空間で色相を少しずつずらして色を生成しています。白を背景色とした場合、文字が読みにくい色があることがわかります。

## LCH 空間で色相をずらした場合

<img width="843" alt="スクリーンショット 2020-07-04 15.48.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96361/63045993-e8ba-628b-970f-6dd5ec45c4c8.png">

左端の色が基準となる色で、今度は LCH 色空間で色相を少しずつずらして色を生成しています。白の背景色に対して文字が読みにくい色はありません。LCH のほうが自然に色のバリエーションが作れています。なぜこうなるのかというと、LCH色空間は人間の知覚差異を考慮した空間だからです。

## 参考

- https://qiita.com/tibigame/items/40ab217c863a20cdb264
docker pull時に dial unix /var/run/docker.sock: connect: permission denied が出る場合の対処法

docker pull時に dial unix /var/run/docker.sock: connect: permission denied が出る場合の対処法

```
$ docker pull ubuntu:18.04
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/create?fromImage=ubuntu&tag=18.04: dial unix /var/run/docker.sock: connect: permission denied
```

/var/run/docker.sockはrootもしくはdockerグループのユーザしかアクセスできないようだ。

```
$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0  7月  4 15:38 /var/run/docker.sock
```

なので、現在のユーザをdockerグループに追加する
以下はユーザID：ubuntuの例

```
$ sudo usermod -g docker ubuntu
$ sudo /bin/systemctl restart docker.service
$ id ubuntu
uid=1000(ubuntu) gid=999(docker) groups=999(docker),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
```

その後、ログアウト／ログインしてグループ追加設定を有効化する。
そして、再度、同手順を実行してpermission deniedが出ないことを確認する

```
$ docker pull ubuntu:18.04
(permission deniedが出ない)
```

# 参考
[Ubuntu 18.04にDockerをインストールする](https://qiita.com/naomichi-y/items/93819573a5a51ae8cc07)
[dockerコマンドをsudoの付与無しに実行できるようにする](https://www7390uo.sakura.ne.jp/wordpress/archives/631)
vue.jsの簡単な始め方。



## 方針
vue単体ではなく、vue-cliからvueが導入済みのプロジェクトを生成する

## 事前準備
yarnとnpmが入っていることを確認する

```
yarn -v
npm -v
```

## vue-cliを導入する
```
npm install -g @vue/cli
```

## vue-cliのvueというコマンドで、ディレクトリを作成する
```
vue create hoge
```
色々聞かれるけど、全部デフォルト設定でOK

## サーバ起動

```
yarn serve
```

localhost:8080にアクセスする

<img width="1048" alt="スクリーンショット 2020-07-04 15.52.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98997/f859114d-40c2-789b-e8a2-09cb5da074d0.png">

こうなればOK
# ディレクトリ構造について
```
- node_modules      # nodeモジュールが入っています
- public            # なんやこれは
- src               # アプリのソースコードが入っています。
  - assets          # 画像とか
  - components      # App.vueから呼ばれるコンポーネント
  - App.vue         # main.jsから呼ばれるvueファイル 
  - main.js         # 最初に実行されるJavaScript
- .gitignore　　　　　 
- babel.config.js
- package.json
- README.md
- yarn.lock
```
G検定　2020 #2を受けてみて

# G検定　2020 #2（7/4実施）の受験後の感想
法律関係が多かった。
⇒　AI白書をもっと読んで勉強が必要。

強化学習に関する問題が多かった。
問題集の強化学習の概念だけだと全く歯が立たず。
⇒　強化学習の本を一通り通読して、ある程度中身を知る必要あり。

# 合格自信度

正答率70%は微妙なところ。
Twitterを見ても難しかったとのコメント多数であり、補正が入ればワンチャンスあるかも？レベルです。

# 今後
とりあえずG検定が終わって、暗記系の勉強から解放されたので、いろいろコードを書いて勉強していこう。
法学部生のマッチグサービス開発(途中経過)

#自己紹介
まず簡単に自己紹介をさせていただきます。
・中央大学法学部在籍中(2020年現在)
・大学では公共法務を専攻。
・プログラミング歴、トータル約5か月。(progate、PyQ、書籍)
・言語はpython、フレームワークはdjangoを使用。
・目標はマッチングサイトの作成。

#バージョン
```
Package        Version

Python 3.8.3
asgiref        3.2.9
beautifulsoup4 4.9.1
Django         3.0.7
mysqlclient    1.4.6
pip            20.1.1
PyMySQL        0.9.3
pytz           2020.1
setuptools     41.2.0
soupsieve      2.0.1
sqlparse       0.3.1

```

#途中経過
・ログイン機能の実装中





#これまでにつまずいた所
※web開発、djangoに関する前提知識なしでインプットとアウトプットを同時進行しています。

・djangoのview、formについての勉強不足。
　(個人情報登録のタグ等をtemplateに全部手書きしていた。base.htmlも使用していなかったため修正必須。)

・MySQLとdjangoの連携。
　(デフォルトがSqliteだったため各種のインストールが必要だった。IT知識のなさを痛感。)
　(githubのリポジトリに思いっきりMySQLの情報をcommitしてしまいプロジェクト全消し。gitignoreについて詳しく知らなかった…)

・djangoのユーザー認証機能の存在を知らなかった
　(moels.pyやforms.pyでの試行錯誤に時間をかけすぎた…)

#反省とこれから
・フレームワークについてあまりにも知識がなく無駄に無駄を重ねているので、適度にdjangoについてのインプットの比重を上げる。
Ubuntu 18.04 LTS にdockerをインストールする

環境

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.3 LTS
Release:	18.04
Codename:	bionic
```

インストール手順

```
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt-get update
sudo apt-get install -y docker-ce
```

バージョン確認

```
$ $ docker --version
Docker version 19.03.12, build 48a66213fe
```

# 参考
[Ubuntu 18.04にDockerをインストールする](https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbc)
[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
高位合成言語NSL その2

#概要

windowsでiverilogやってみた。
nslやってみた。
_random使ってみた。

#サンプルコード


```
declare test_rand simulation { 
}
module test_rand {
	reg trigger[3] = 0;
	reg temp[8] = 0;
	reg cnt[8] = 0;
	func_self neko();
	trigger := { trigger[1:0], 0b1 };
	if (trigger == 3'b011) neko();
	func neko seq {
		for (cnt := 0; cnt < 5; cnt++) {
			_display("random == %d", _random[7:0]);
		}
		_finish("End Simulation");
	}
}
```

#テストベンチ


```
module test;
	reg clk,
		rst;
	test_rand u(.clk(clk), .rst(rst));
	always #1 clk = ~clk;
	initial
	begin
		clk = 0;
		rst = 1;
		#1
			rst = 0;
		#1
			rst = 1;
		#100
			$finish;
	end
endmodule
```

#実行結果


```

Warning: register set hazard(test_rand:cnt) at                    1
random ==  99
random ==  13
random == 141
random == 101
random ==  18
End Simulation


```

以上。
Macにてスクリーンショットを取得する方法

# はじめに
今回は、MacOSにてスクリーンショットを取得する方法についてアウトプットしていきたいと思います。

# スクリーンショット取得方法

全体キャプチャと選択箇所キャプチャ方法を紹介します。

## 全体キャプチャ

下記キーを同時押し
`Command + Shift + 3`


## 選択箇所キャプチャ

下記キーを同時押し
`Command + Shift + 4`

→保存したい箇所を選択して保存可能
(Windowsで例えると、**snipping tool**のような感じ)


# スクリーンショット保存先指定方法

ターミナルにて下記コマンドを実行

```bash
defaults write com.apple.screencapture location ディレクトリパス
```

※デフォルトではデスクトップに保存されるようになっている。

<br>

```bash:実行例
defaults write com.apple.screencapture location /Users/satton/Desktop/screenshot 
```

## 保存結果

このような形で保存される。

<img width="888" alt="スクリーンショット 2020-07-04 15.26.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/b600962b-35f6-cdb9-8760-f8e8ff6d1db5.png">

# 参考

[Mac - スクリーンショットで撮影した画像の保存場所を変更](https://pc-karuma.net/mac-customize-screencapture-location/)
G検定を受けてみて

## 概要

7月4日に実施されたG検定の受験直後の感想をまとめます。
主に・・・11月に受験するであろう自分のために。

G検定の詳細は以下リンク先へ。
https://www.jdla.org/certificate/general/

## 感想

公式テキストや黒本でがっつり勉強をしていたつもりでしたが、
割と理解できていないところがあったようで、確信を持って回答ができていない状況でした。
各手法や歴史や動向も再学習の要です。
これは私の悪癖の部分もあるので反省。

時事問題もいくつかありテキストだけでは割とどうにもならない問題もちらほらと見かけました。
※そこも含めてか自宅からできる・・・のだと思います。

問題数については事前の通り200前後、時間は2時間なのであまり時間的な余裕はないです。
と言いつつ、私は40分程度残ったのでそこから見直しをかけています。
そしてあまりのぼろぼろっぷりに次回受験をほぼ確定となりました。
合格結果は約2週間後になりますが、不合格を前提で次回11月を迎えたいと思います。

無論、テキストで学んだ内容も出ております（当たり前ですが）
あとに記載するテキストの中で強調されているものなどが重要になるので、そこを中心として学ぶと吉です。
どこかのサイトで●●章からは出ない・・・といった記事もありましたが、普通に出てきますので勉強しましょう。
※記憶違いだったすいません。

## 学習

テキストの読み込みと問題集のやりこみ。ほぼこれだけです。

感想で書きましたが、時事問題とかテキストにはない問題もあるので、
次回受験時にはそのあたりも考慮したいとも思います。

[深層学習教科書 ディープラーニング G検定（ジェネラリスト） 公式テキスト](https://www.kinokuniya.co.jp/f/dsg-08-EK-0596344)

[徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集](https://www.kinokuniya.co.jp/f/dsg-08-EK-0671227)

紀伊國屋の電子書籍で購入していますが、理由は以下の通り。
1. iPadやスマフォで手軽に見れるので。
2. 主に金～日でポイントアップキャンペーンをやることが多いので。25倍とか。2000円（税抜）のテキストで500ポイント返ってくるとか神か。

## 次回に向けて
- 参考書の読み直し。上に自分で書いたとおり、強調箇所を重点的に。
 - 参考書はあくまで下地作り。問題集など複数使ってカバーすることが重要かも。
 - できれば問題集や参考書ではなく機械学習・ディープラーニングの専門書を読んでおくとよいかも。
- 参考書では得られない知識の補完。主に法律や機関が絡むものです。
 - 都度ネットで調達。過去20年程度の世界全体の情報を持っているのであればいけるかも。
- Aは●●であるという説明がある場合、●●とはAという・・・といったやり方で勉強し、理解力を深める方向も取る。

## その他
- 問題の詳細は当然書けないので記載なしで。
- G検定に向けた参考書兼問題集が他にもあるので要検討。
 - 公式テキストや問題集一つ程度では知識面ですら太刀打ちできない。RNNやらCNNやらも詳細に把握する必要もあり。
- Pythonのデータ分析の資格が存在するが、そちらを勉強している人だと数学の基礎ができていると思うので、まっさらな状態で挑む人より若干有利な気もする。
- 2回めで落ちるならもう受けない。別のWebサービスや専門書で勉強はするだろうけど。

終わり
高位合成言語 NSL


# 概要

windowsでiverilogやってみた。
nslやってみた。

# サンプルコード


```
declare test_finish {
}
module test_finish {
	reg trigger[3] = 0;
	reg cnt[4] = 0;
	func_self exec_add();
	trigger := { trigger[1:0], 0b1 };
	if (trigger == 3'b011) exec_add();
	func exec_add seq {
		for (cnt := 0; cnt < 10; cnt++) {
			_display("%d", cnt);
		}
		_finish("neko");
	}
}
```

# テストベンチ


```
module test;
	reg clk,
		rst;
	test_finish u(.clk(clk), .rst(rst));
	always #1 clk = ~clk;
	initial
	begin
		clk = 0;
		rst = 1;
		#1
			rst = 0;
		#1
			rst = 1;
		#100
			$finish;
	end
endmodule
```

# 実行結果


```


Warning: register set hazard(test_finish:cnt) at                    1
 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
neko

```

以上。
Javaを知らずに、Java Silverを2週間で合格してみた


#はじめに
Javaをほぼ知らない状態でJava Silverに受かるか挑戦してみました。
Java SE 8 Programmer I（JAVA Silver)の学習方法を参考にして勉強し、合格できたので、Java Silverを取りたい方はご参考ください。


#試験について、試験までの手続き

まず試験申込が意外と大変。
下記の記事は試験をとる意味や手続きまで把握できるので是非ご参考ください。

参考にした記事
[「Java Silver受験手続きの仕方と学習方法」](https://qiita.com/tunelog/items/2c78d753b385b09576c9)

自分もこちらの記事をまるまる参考にしてます。


#勉強資料

以下の２冊のみを使い倒しました。

- [「徹底攻略Java SE 8 Silver問題集」](https://www.amazon.co.jp/dp/B01ASGJYIE/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
こちらはごりごり問題を解いていく用です。基本的にはこちらしか使いませんでした。

- [「スッキリわかるJava入門」](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC-ebook/dp/B07ZQWKL2Q/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%81%99%E3%81%A3%E3%81%8D%E3%82%8AJava&qid=1593835856&s=digital-text&sr=1-1)
こちらは問題集の解説見てもわからない時用の参考書です。


#学習の流れ
「徹底攻略Java SE 8 Silver問題集」の内容は１〜９章がトピック別の問題集、１０・１１章は総合問題（模擬試験）が入っています。
それを踏まえて下記の流れで勉強しました。

（１） １章〜９章をまず解く　→　答えだけチェック（自分の実力チェック）　正答率は１０％
（２） １章〜９章を解く　→　じっくり解説理解（単語の定義や処理の流れを知る）　正答率２０％
（３） １章〜９章を解く　→　間違ったところを特にじっくり解説理解(理解が深まった気がする）　正答率５０％
（４） １０・１１章（模擬試験）を解く　→　じっくり解説理解　正答率２０％　ここで心が１回心が折れる
（５） １０・１１章を解く　→　じっくり解説理解　正答率４０％
（６） １０・１１章を解く　→　どのトピックが苦手かわかってくる　正答率７０％
（７） 苦手な問題を暗記する
（８） 苦手な問題ジャンルの章にもどって復習
あとは（６）〜（８）を繰り返すのみです。


#時短術
- わからないところが出た時、わからないところをそのままの言葉でGoogle検索。
→調べ方がわからないため、いろいろ考えずにまずは検索する
→考える時間を削減！

- 何回も調べたものもその場で分からなくなったら何度も調べる。
→何度も同じフローを辿って記憶の定着。
→復習時間を削減！

- それでも分からなかったら分かる人に聞く。
→理解する時間を削減！
※オンライン・オフラインどちらでもいいので質問できる環境はおすすめ。

- 問題を繰り返す段階で、答えも合う、解説も自分でできる問題は繰り返し解かない。
→周回の時短

ここら辺は短い期間で理解を深めるための方法として有効だと思います。

#勉強時間
自分は１５日間で約１２０時間ほど
受験した方の情報を集計したところ、最低でも１００〜１５０時間ほどの勉強時間を確保しているようです。


#まとめ
結果は合格ラインが65%に対し、75％で合格しました。

**勉強環境を作ること**
**勉強時間を確保すること**
**やること**

言いたいことはこれに尽きます。

そもそも座学が苦手だと言う人はまたその対策記事も書こうかと思います。
それでは、また！
【読書メモ】リーダブルコード　　　　（第Ⅰ部 1章〜6章）

#目的
客観的に見て「より良い」コードの書き方・考え方を学び、今後のコードの記述に生かすため。今回は、区切りよく第Ⅰ部をまとめた。

#一言でいうと、どんな本？
###とにかく「他人にとって」、「読みやすい」コードを書くことに専念しろ！！

#印象に残った点のメモ（一部自分なりにまとめています）
##1章　理解しやすいコード

###「読みやすさ」の基本定理：コードは他の人が最短時間で理解できるように書かなければならない

 「短い」だけが優れたコードではない。数日後の「自分」も含めた”他人”にとって、理解するまでの時間が短いコードが望ましい

##2章　名前に情報を詰め込む
基本はこの6つを意識してコードを書くこと。

###1. 明確な単語を選ぶ

**シソーラス（類語辞典）**などを使って類語で示せないか考えること。

###2. 汎用的な名前は避けるor使う状況を選ぶ

ポイントは、その変数に、その変数を定義した目的や値を理解できるかどうか。予め決まりきっているものに汎用的な名前をつけるのはOKだが、そうでない場合、名前は慎重に選ぶこと。
 
###3. 抽象的な名前よりも具体的な名前を使う

「メソッドの動作をそのまま表していることが分かる」など、具体的で動作のイメージが分かりやすい名前を使うこと。複数の概念が混ざる場合、分けて定義しても良い。

###4. 接尾辞や接頭辞を使って情報を追加する

大切なこと、知らせたいことがある場合は、変数名に重要な内容を書いてしまうという手もある（単位、危険、注意を喚起する情報など）。

###5. 名前の長さを決める

名前の長さは問題ではない（エディタの補完機能により長い名前でも時短で書けるため）。省略することで、新しいメンバーが見たときに「何これ？どんな意味なん？」ってならないように気をつけよう。スコープが数画面におよぶ変数には長い名前をつけること。

###6. 名前のフォーマットで情報を伝える

大文字や_（アンダースコア）などに意味を含めること。ローカル変数との区別も意識して。


##3章　誤解されない名前

###鍵となる考え：名前が「他の意味と間違えられることはないだろうか？」と何度も自問自答すること

つまり、書いている自分の意図が、他の人に正しく伝わる名前を設定しろということ（"read"は、「読（み込）む」「読んだ」なのか分からない）。限界値などは、max,min、範囲ならfirst,lastなどを使って伝わりやすくする。

##4章　美しさ

###見た目が美しいコードを書くこと。個人的に「これ大事だな」と思ったものはこちら。

- 一貫性のある適切な改行位置
- 重複する内容があれば、（ヘルパー）メソッドを使って整列させること
- コードを”段落”に分割する（分割するものの間にコメントを入れるなど）

##5章　コメントすべきことを知る

###コメントを書く目的は、書き手の意図を読み手に知らせること

- 逆にコメントにしなくていいこと、**「コードを見ればすぐに分かるな」**というもの
- 優れたコメントより、優れた”名前”
- 優れたコメントとは、**自分の考えを記録した**もの（「こんな風に考えているんだな」と思考過程が分かるコメントがないとレビューしてもらいにくいらしい）
- 欠陥のあるコードについて、コメントで書いてOK。大切なのは、これからそのコードをどうするつもりなのか？自由に書くことで、コードの状態把握や改善に向かっていける
- **「このコードを見てびっくりすることはなんだろう？」「どんな風に間違えて使う可能性があるんだろう？」**と自問してみること。
- ソースコードを読んだだけでは分からない内容や、ファイルやクラスの全体像などを、高レベルのコメントに記述すること。
- コメントを書く作業のポイントは、 
  
1. 頭の中にあるコメントをとにかく書き出す
2. コメントを読んで改善が必要なものを見つける
3. 改善する

##6章　コメントは正確で簡潔に

###鍵となる考え：コメントは領域に対する情報の比率が高くなければならない

- 複数のものを指す可能性がある代名詞は避ける
- 関数の動作はできるだけ正確に説明する
- よく分からない引数にはインラインコメントを使う
- 多くの意味が詰め込まれた言葉や表現を使って、コメントを簡潔に保つ


#感想・気付き

- ポートフォリオ制作で一時的にコードを残す以外でコメントを残したことがなかったので、GitHubに上げる際も、コメントを残していこうと思った。
- 自分が設定している変数が、ちゃんと意味の理解しやすいものなのか？ポートフォリを改修する際にコードを見直していこうと思った。

#書籍のURLはこちら
[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)
G検定2020#2受けました

# ご挨拶
　はじめまして、hazel1と申します。

# 私の能力、習得資格など
　・2018年7月からAIについて（特に深層学習）勉強
　・E資格2019#2取得済
　・仕事でAIを使い始めようかなー。kaggleもやってみようかなーってレベル

# G検定2020#2の感想
これは無理。
何が無理って、今回の問題、理論の分野はE資格でも出なかったようなところが出てきて、
尚且つ、新技術や政策、ガイドライン、法令がてんこ盛りでした。
一応最後まで目を通しながら解きましたが（残り時間５秒　５秒！？）
自信は全くありません。

公式テキストや問題集だけやっていた方々は爆発四散しているのをTwitterで見受けられました。

最新版のAI白書は必携ですよ。
ネットで調べるのは時間がかかりすぎて答え出ない場合も多いです。


#忠告
E資格保有の方々、G検定を下位資格と侮るなかれ。地獄を見ますよ。

それと、初学者の方は、時間をかけて段階的に
テキスト
　↓
問題集
　↓
AI白書
　↓
study-AIの模擬試験
　↓
時事内容の検索

としていった方が良いと思います。
それでも足りないかも。

さて、僕はkaggleと実装で頑張ります。

皆様のご検討を記念して・・・

#追記
合格しました。
忠告とか言ってた自分が恥ずかしい。
でも、まあ全体得点率が低くてボーダー下げたんじゃないかなと思います。
G検定得点率のフィードバック無いのでわかりませんが。
(E資格だと分野毎にフィードバックありました。機械学習のところ6割だった記憶が…)
まあ、半額で受けて、本腰で一週間勉強して
受かってラッキーということで。
docker run --tmpfsでエラーが出た時の対処方法

### はじめに

本記事は以下の「Docker実践ガイド　第2版」を進めていて詰まったポイントの解決メモです。

![91j47MxChxL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293681/96052e7d-f52a-b6e6-b1c1-6e4b37fea980.jpeg)

## 3-9-1 コンテナでのApache Webサービスの起動

### /sbin/initを使ったDockerコンテナの起動
ここで示されているコマンド

```
$ docker container run \ 
-it \
--tmpfs /tmp \
--tmpfs /run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--stop-signal SIGRTMIN+3 \
--name test01 \
-h test01 \
centos:test01 /sbin/init
```

を実行したところ、

```
docker: invalid reference format.
See 'docker run --help'.
```

と返された。
`docker run --help`
を実行したところ、きちんと全てのオプションは見つかって使い方も問題なさそう。

いろいろ調べた結果
`--tmpfs /tmp`
となっている--tmpfsオプションを
`--mount type=tmpfs,destination=/tmp`
のように--mountオプションで代替することで解決

####修正後

```
$ docker run \
-it \
--mount type=tmpfs,destination=/tmp \
--mount type=tmpfs,destination=/run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--stop-signal SIGRTMIN+3 \
--name test01 \
-h test01 \
centos:test01 /sbin/init
```

###参考
[Docker Documentation](https://docs.docker.com/storage/tmpfs/)
Laravel シンボリックリンクが切れた時の復旧方法

Laravel のStorage を使っていて、シンボリックリンクが切れてファイルの読み込みができなくなる時があります。

その時の復旧方法を備忘録的に残します。



## シンボリックリンクの設定

```
php artisan storage:link
```

これでシンボリックリンクの設定ができます。

Storage フォルダがroot直下にでき、/public 直下からリンクが張られます。

それでうまくいっていたはずが、色々やるうちに変わったり外れてしまった場合の対処法です。



## シンボリックリンクの確認

ローカルの場合、仮想環境のサーバにログインします。

プロジェクトのフォルダまで移動し、ls -la でシンボリックリンクを確認します。

```
vagrant@homestead:~/code/project$ cd public
vagrant@homestead:~/code/project/public$ ls -la
total 24
drwxr-xr-x 1 vagrant vagrant  384 Jul  4 02:52 .
drwxr-xr-x 1 vagrant vagrant  960 Jun 28 07:37 ..
drwxr-xr-x 1 vagrant vagrant   96 Jun 16 11:26 css
-rw-r--r-- 1 vagrant vagrant 6148 May 15 06:23 .DS_Store
-rw-r--r-- 1 vagrant vagrant    0 Apr 10 07:56 favicon.ico
-rw-r--r-- 1 vagrant vagrant  603 Apr 10 07:56 .htaccess
-rw-r--r-- 1 vagrant vagrant 1823 Apr 10 07:56 index.php
drwxr-xr-x 1 vagrant vagrant   96 Jun 16 11:26 js
-rw-r--r-- 1 vagrant vagrant   71 Jun 28 07:38 mix-manifest.json
-rw-r--r-- 1 vagrant vagrant   24 Apr 10 07:56 robots.txt
lrwxr-xr-x 1 vagrant vagrant   45 Jul  4 02:52 storage -> /User/hogehoge/code/project/storage/app/public/
drwxr-xr-x 1 vagrant vagrant  128 May 15 08:02 voice
```



仮想環境なのに /User/hogehoge/code/project/storage/app/public/ みたいなパスになっていたら間違いです。



## シンボリックリンクを削除する

リンクが間違っていたら、unlink でリンクを削除します。

```
vagrant@homestead:~/code/project/public$ unlink storage
```



## 正しいパスでシンボリックリンクを設定する

シンボリックリンクの設定は ln -s [正しいパス] [storage] です。

正しいパスは、$pwd でプロジェクトrootのパスを確認し、/project/storage/app/public/ を設定。

```
vagrant@homestead:~/code/project/public$ ln -s /home/vagrant/code/project/storage/app/public/ storage
```


## ついでに： 本番環境でシンボリックリンクが繋がらないとき
単純に繋がっていないだけのことが多いので、サーバにログインして、storage:link しましょう。

```
php artisan storage:link
```

## 参考

https://qiita.com/YasuhaF/items/9a897e83afe1819d97af

https://www.wakuwakubank.com/posts/342-linux-ln-unlink/
文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #6 ユーザーのモデルを作成する

Railsチュートリアルについて調べてみると、「プログラミング経験者にとっても易しくはないレベル」とのコメントを見つけ、自分の理解度に対して安心した。
やはり1周目で理解し切るのは難しいようだ。

そんなわけで第6章をやっていく。

# 6.1 Userモデル
本段落ではユーザーの情報を格納するための場所をつくるっぽい。
そして、データ構造のことをモデルと呼ぶらしい。

`rails generate controller hoge`でコントローラーを作成できるみたいだ。

`rails db:migrate`というコマンドでマイグレーションという作業をする。
マイグレーションが何を指すかは調べてみてもよくわからない...。

とりあえず演習をしてみる。
`rollback`をするといままでのものが台無しにされ、`migrate`をすると原状回復されたことだけは理解した。

そして、UserクラスはApplication Recordクラスを継承していることを知る。（演習 6.1.2）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648931/1127edf9-63da-9a9d-0c90-7f26ad4a3843.png)

そして、どうやら`save`をすることで、データベースにUserオブジェクトを保存できるようだ。
あとは、`find_by`で特定のレコードを検索したり、`update_attributes`でレコード情報を更新できたりするっぽい。

# 6.2 ユーザーを検証する

この章では、属性に入力規則をつける。
名前は空ではいけない、メアドはフォーマットに従う、など。

そして、テストは

1. 有効なモデルのオブジェクトを作成
2. その属性のうち1つを有効ではに属性に変更
3. バリデーションで失敗するかどうか確認

という具合に進める。

テスト用のコードでは、`setup`というメソッドを利用するが、これによってここで定義したインスタンス変数はすべてのテスト内で使えるようになるらしい。

そして、`valid?`メソッドを使うと、オブジェクトの有効性をテストすることが可能。

演習は難しいので、答えをガン見する。

最も基本的なバリデーションは「存在性」らしい。
これは文字通り、属性が存在することを検証する。
（nullを許容しないってこと？）

存在性の次は、長さを検証する。
ここでいう長さとは、文字列の文字数のこととほぼ同義となる。

あとは、フォーマットや一意性を検証するという感じ。
正規表現に関してはなにも読めなかった。

# 6.3 セキュアなパスワードを追加する
この章ではパスワードを入力させ、「ハッシュ化」ということをするらしい。
ハッシュ化とは、ハッシュ関数を使って、入力されたデータをもとに戻せない（不可逆な）データにする処理のことらしい。

ハッシュ化をするおかげで、データベースに生のパスワードを保管しなくていいため、リスク回避的になることは理解した。

もちろんパスワードの最小文字数を決めたりすることもできる。

いろいろ設定したあと、`rails console`をしてユーザーを作成する。
開発環境用のデータベースをDB Browser for SQLiteで開き、usersテーブルの中身を見てみましょう、とさらっといわれるがどうやってやるのかまったくわからないので、飛ばす。

最後の演習ももうよくわからないので、答えだけみて飛ばす。
Docker&LaravelでSQLSTATE[HY000] [2002] Connection refusedが出た時の対処法

# はじめに

こんなエラーでた。

```bash:terminal
  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +37 vendor frames 
  38  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

### 結論

configがしっかり反映されていなかったので、以下のコマンドでconfigに`.env`の内容を反映させると解消された。

```bash:terminal(Docker内)
$ php artisan config:clear
```

# 対処法

`php artisan tinker`で.envの内容が反映されているか確かめる 

```bash:terminal(Docker内)
$ php atisan tinker

>> config('database')
=> [
     "default" => "mysql",
     "connections" => [
       "sqlite" => [
         "driver" => "sqlite",
         "url" => null,
         "database" => "xxx",
         "prefix" => "",
         "foreign_key_constraints" => true,
       ],
       "mysql" => [
         "driver" => "mysql",
         "url" => null,
         "host" => "mysql", // この辺に注目
         "port" => "3306",
         "database" => "xxx", // この辺に注目 
         "username" => "xxx", // この辺に注目
         "password" => "xxx", // この辺に注目
         "unix_socket" => "",
         "charset" => "utf8mb4",
         "collation" => "utf8mb4_unicode_ci",
         "prefix" => "",
         "prefix_indexes" => true,
         "strict" => true,
         "engine" => null,
         "options" => [],
       ],

       # 以下省略
```


configに、`.env`の内容が反映されてなかったら結論で示したコマンドでどうにかなるかも（自分は解決した）
【無料】freeCodeCampにPythonの認定コースが追加されました！

# freeCodeCampとは
[freeCodeCamp](https://www.freecodecamp.org/learn/)

コース毎に用意された５つのプロジェクトを完了させると認定証がもらえるサービスで、プロジェクト達成に必要な技術を身につけるためのレッスンも含めて無料です。


**ただ、全文英語です。**
[Mouse Dictionary](https://qiita.com/wtetsu/items/c43232c6c44918e977c9)とか使えばだいぶ楽になると思います。

#本題

[公式ブログ](https://www.freecodecamp.org/news/python-curriculum-is-live/)

freeCodeCampに既にあった６コースに、

 - **Pythonでの科学計算**
 - **Pythonでのデータ分析**
 - **Pythonでの機械学習**
 - **情報セキュリティ**

の４コースが追加されました。

カリキュラムとか詳細は公式サイトを確認してください。
アカウント登録しなくてもコースを見ることはできますが、進捗の保存や証明書の発行には登録が必要です（もちろん無料）。
iOSアプリの新規ブランクプロジェクト作成

## 前提

- この記事はXcode 11.5をベースに記載しています。

## 1. セットアップ

App StoreからXcodeをインストールしておく。
複数の開発者で開発する場合はバージョンを揃えておく。

Cocoa Podsもセットアップしておく。
 参考: [CocoaPodsの導入と利用 \- Qiita](https://qiita.com/fksk/items/9e5fdc201af4f03f2dec)

## 2. Xcodeで新規プロジェクト作成
Xcodeを起動し、`Create New Xcode Project` -> `Single View App` を指定して次へ。

`Product Name` と`Organization Name`は任意の名前を指定。
`Language`は `Swift`、`User Interface` は `Storyboard` を指定して次へ。
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/42a3f9ff-633e-eb19-c0a5-3a55417f8963.png)

ファイルの保存場所を指定する際に`Create Git Repogitory on my Mac`にチェックをするとGitリポジトリが初期化される（チェックを忘れても後からgit init すれば OK）

プロジェクトが開いたら、一旦実行してみる。
iOS Simulatorのデバイスが選択されていないとエラーになる場合があるので注意。
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/e168f3ea-9da3-106d-9921-84c5251b6eb0.png)


## 3. Cocoa Pods 初期化

Xcodeを閉じて、ターミナルで空のPodfileを作成する

```bash:terminal
      cd /path/to/MyFirstApp

    pod init  
```
読み込みたいライブラリに応じてPodfileを編集する。ここではまだ何も導入しないでおく。

Podsディレクトリと. xcworkspaceファイルを作成する。

```bash:terminal
    pod install 
```

作成されたxcworkspaceファイルの方からXcodeを開く。Podsディレクトリが読み込まれた状態でワークスペースが開く。

- 参考: [CocoaPodsの導入と利用 \- Qiita](https://qiita.com/fksk/items/9e5fdc201af4f03f2dec)

## 4. Gitリポジトリを作成・共有
ターミナルでプロジェクトディレクトリへ移動。

Gitを初期化する（Xcodeプロジェクト作成時にリポジトリを作成をチェックしている場合は省略）

```bash:terminal
    cd /path/to/MyFirstApp

    git init
```

.gitignore ファイルを作成する

```bash:terminal
    touch .gitignore
    ls -al
    open .gitignore
```

.gitignoreファイルに、以下のサイトのテンプレートを貼り付ける
- [gitignore/Swift\.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Swift.gitignore)
(参考：[CocoaPods を \.gitignore すべきか \- Qiita](https://qiita.com/star__hoshi/items/1f06a58275cdd0b6e450) )


全てのファイルをgitコミット対象としてステージ

```bash:terminal
    git add -A
    git status #ステージされている状態を確認
```

プロジェクトをローカルgitにコミット

```bash:terminal
    git commit -m "initial commit"
```

Githubなどでリモートリポジトリを作成する
- [GitHub](https://github.co.jp/)

ローカルGitのリモート接続先に作成したリモートリポジトリを紐づける

```bash:terminal
    git remote add origin https://path/to/your-repository
```

リモートリポジトリにプッシュ

```bash:terminal
     git push -u origin master
```
ブランクプロジェクトの準備完了

次の記事： [iOSアプリの作成（ボタンとラベルのみのシンプルコード） \- Qiita](https://qiita.com/sunack/items/55b9a251f7efe1402a3f)
mac のディスプレイを 24 インチ（HDTV 1920×1080）から 27 インチ（WQHD 2560×1440）に変えたときの注意点

24 インチ（HDTV 1920×1080）から 27 インチ（WQHD 2560×1440）のディスプレイに変えましたが、控えめに言って最高です。

Mac mini (Late 2012) を使っていますが、ディスプレイを変えるときに注意すべきポイントをまとめます。

# 購入時の注意点

作業領域を増やしたくてディスプレイを購入する方は、購入するディスプレイの解像度に注意してください。
単純に 24 インチから 27 インチに変えても同じ解像度なら作業領域は変わりません。
**今よりも大きいディスプレイを買ったら作業領域が広がるわけではなく、今よりも高い解像度に対応したディスプレイを買うことで作業領域が広がります。**
仮に現在 HDTV 1920×1080 サイズの解像度で使っていて、それ以上に作業領域を増やしたい場合は HDTV 1920×1080 サイズ以上の解像度に対応したディスプレイを買う必要があります。
あと、解像度が高くなると全体的に小さく表示されます。
24 インチで WQHD 2560×1440 サイズにすると表示が全体的に小さすぎるかなと思い、今までの 24 インチよりも大きい 27 インチにしました。
あと、使っているパソコンによっては DisplayPort ケーブルにも対応したディスプレイを選びましょう。

# 設置するときの注意点

使っている Mac mini の場合、ディスプレイを接続するには主に HDMI または Thunderbolt のどちらかを使います。
apple に掲載されている [Mac mini (Late 2012) - 技術仕様](https://support.apple.com/kb/SP659?locale=ja_JP) を見るとわかりますが、HDMI は 1080p解像度 にしか対応していません。
1080p は HDTV 1920×1080 サイズ です。
WQHD 2560×1440 サイズで出力するには Thunderbolt を使います。
他にも [Mac mini (Late 2012) - 技術仕様](https://support.apple.com/kb/SP659?locale=ja_JP) を見るとわかりますが、「最大2台のディスプレイで2,560 x 1,600ピクセル表示をサポート」と記載されています。
使っているパソコンによって対応できる解像度が異なりますので、事前に調べてください。
Thunderbolt とは Mini DisplayPort のことです。
Thunderbolt の差込口に Mini DisplayPort ケーブルがそのまま挿せます。
今回、購入したディスプレイは HDMI の他に DisplayPort にも対応しており、両方（HDMI・DisplayPort）とも WQHD 2560×1440 で出力できます。
片方が Mini DisplayPort でもう片方が DisplayPort のケーブルを購入してディスプレイと Mac mini を繋げることで WQHD 2560×1440 サイズで描画できます。

ちなみに今回購入したディスプレイ（回転するので縦置きも可）とケーブルは下記です。

- [I-O DATA ゲーミングモニター 27インチ GigaCrysta RPG向き WQHD ADS HDMI×3 DP×1 リモコン付 高さ調整 回転 EX-LDGCQ271DB](https://amzn.to/2NTrwyv)
- [Amazonベーシック Mini DisplayPort - DisplayPort 変換ケーブル 0.9m](https://amzn.to/2VHWcqI)

ディスプレイの使用感ですが、縦置きにすることもでき、前後左右角度も調整できるのが便利です。
また、個人的にはリモコンで電源のオン・オフ、音量の調整ができるのが役立ってます。
1点、スピーカーがディスプレイの後ろにあり、こもった感じがします。
スピーカーはおまけ程度で音質を気にしない方は選択肢として有りかなと思います。
Haskellで超簡単にシングルバイナリを作る

# はじめに

Haskellをローカル開発環境で勉強していろいろな抽象的な知識を得たものの、実際活用するにあたってデプロイとかその辺どうするんだろう？やっぱりdocker使って簡単にやりたいな〜

でも、Goとかだと簡単に100%静的なシングルバイナリになるし、Rustとかもmuslを利用していい感じに行けそうだけどHaskellだとわからない>< というお気持ちが強かったので、簡単にデプロイできる100%静的リンクのシングルバイナリ作るぞ！と思って調べたお話です。

# 追記

下記の紹介しているものとほぼ同じような手順で、自分で拡張しやすいDockerfileでのみ構築されたDockerイメージを自分で作成したので、是非参考にしてみてください。

[GitHub](https://github.com/shin-sakata/ghc-single-binary-builder)
[Docker Hub](https://hub.docker.com/repository/docker/shinsakata/ghc-single-binary-builder)

## 対象読者

Haskellを本番で使ったことない人向け

# 大雑把に説明

## 概要

1. 静的リンクされたバイナリを作るためのDockerコンテナ上でプロジェクトをビルドしてバイナリを手に入れる
2. 動作用のDockerイメージにそのバイナリを乗っける
3. そのイメージを動かす！

## 環境
```yaml
OS : MacOS Catalina
パッケージマネージャ : Stack
```

今回はHaskellのパッケージマネージャであるStackを利用してやっていきますが、cabalでもなんでもできそうなので調べてみてください。


## Stack Docker integration

StackにはDockerと協調していい感じにバイナリを作ってくれる機能があります。

```yaml:stack.yaml
docker:
  repo: {{docker imageの名前}}
  enable: {{ true or false }}
```

こんな感じで追記すると、

```
$ stack build
```

としたときに`repo`に記載しているimageを使ってbuildをしてくれます。
`enable`をfalseにした場合は`$ docker build --docker` ってコマンドになるので僕はfalseにしてます。

## local-bin-path

stackにはinstall機能もありますね。

```
$ stack install
```

とすると、ローカルのプロジェクトのソースをビルドして、`~/.local/bin` この辺(つまりグローバル)に実行可能ファイルを置いてくれます。

### でもグローバルはやじゃん！

```
$ stack install --local-bin-path=./bin
```

こうすると、現在のディレクトリの `bin` 配下にいい感じにビルドしてくれるのでバイナリが手に入ります！

## ghc-musl

musl-libcを使って静的リンクされたバイナリを簡単に作ることができるimageをHaskell界の[聖人](https://github.com/utdemir)様が作ってくれているので、利用します。

参考リポジトリ: https://github.com/utdemir/ghc-musl

## やっていき！

上で説明した三つの項目を利用していい感じに動作用imageを作る作業をやっていきます。

#### 1. まずはHaskellのdocker integrationを利用してビルド時のイメージを設定

```yaml:stack.yaml
docker:
  repo: utdemir/ghc-musl:v7-libgmp-ghc883 # 正しいhaskellコンパイラを指定しよう
  enable: false
```

#### 2. 静的リンク用の設定を追加

```package.yaml
executables:
  example-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    - -static -optl-static -optl-pthread -fPIC # <- これを追加！
    dependencies:
    - example

```

#### 3. バイナリを手に入れよう

これで `./bin/docker/` 配下に静的リンクされたバイナリが手に入ります

```
$ stack install --local-bin-path=./bin/docker --docker
```

#### 4. 動作用のDockerイメージをビルドする

ベースイメージは本当に何にも含まれていないscratchを利用することによって、静的リンクされていることを確認します。
こうすると、イメージのサイズもバイナリと同じサイズになってめっちゃちっちゃくて最高です。
(実用上いろいろ考えるとAlpineの方がいいかもしれないです)

```dockerfile:Dockerfile
FROM scratch
COPY ./bin/docker/{ バイナリの名前入れてね } /
CMD ["./{ バイナリの名前入れてね }"]
```

ビルドします

```
$ docker build . -t {任意のイメージの名前}
```

#### 4. そして動かす！

```
$ docker run --rm --init {イメージ名}
```

# おわり

Servantのシンプルなプロジェクトで動作確認をしたけれど、他のDB操作系のライブラリとかでHaskell以外の他の依存がある場合はどうなるんやろな？ってところはやってないので、大規模プロジェクトでは未知数ですが、試してみてコメントいただけるとありがたいです〜。

もっといい方法があればコメントにて教えてください！
あと、聖人様の[リポジトリ](https://github.com/utdemir/ghc-musl)にスターをつけてたくさん開発してもらえるように促してください！
deviseを使ったログイン画面で表示される描画を出し分ける方法

**環境**
*Ruby 2.7.0*
*Rails 6.0.3*
*devise 4.7.2*

## やりたいこと
- ユーザー認証画面（サインイン・サインアップなど）は通常のレイアウトと画面の描画を変えたい
- 通常の画面（ユーザー認証画面以外）では、`application.html.erb`に記載の内容を表示させたい

## 背景
deviseを使ってて、サインアップとかログインの時はapplication.htmlの表示とは違う描画をしたいなーて時、どうやって画面の切り分け（deviseを使って描画される時の画面と、通常の画面でapplication.htmlでの画面を出し分けたい）って時の対処法が分からん！サインインの画面はheaderとかfooterとかの表示いらないんだけどなー…ってときに調べたら公式に書いてあった^^;

## 結論
[devise github（公式ページ）](https://github.com/heartcombo/devise/wiki/How-To:-Create-custom-layouts)
1. ユーザー認証用のHTMLを作る
2. ApplicationControllerに描画の切替を制御する記述をする

## 説明
ユーザー認証用のHTML（ファイル名は任意）のファイル名で作って、`app/views/layouts/`配下に作ります
※ためにし`app/views/layouts/devise.html.erb`で作るとします

```erb:devise.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Sample</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header class="header">
      <div class="header__inner">
        <div class="header__logo">sample</div>
      </div>
    </header>
    <%= yield %>
  </body>
</html>
```

ApplicationControllerに描画の切替を制御する記述します
表示される内容がdevise_controllerかどうかを判断するために`if devise_controller?`を記述し、
**true**だったら`devise.html.erb`
**false**だったら`application.html.erb`
を呼ぶようにしています

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  layout :layout_by_resource

  private

  def layout_by_resource
    if devise_controller?
      'devise'
    else
      'application'
    end
  end
end
```
この2ステップで描画の切り分けができます^^
RSpec実行時の便利なオプションまとめ

Rails開発にRSpecによるテスティングを利用している方は多いかと思います。
となると、RSpecの実行効率が日々の生産性に影響を与えていると言っても過言ではないかもしれません。

RSpecには効率的にテストを実行できるオプションが多く用意されているため、私が特に便利だと感じたオプションに絞って紹介します。

## 失敗したテストのみを実行する

[--only-failures](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/only-failures)

## 1件でも失敗したらテストをやめる
[--fail-fast](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/fail-fast-option)

## タグがついたテストのみを実行する
[--tag](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/tag-option)

## テスト結果をドキュメント形式で表示する
[--format documentation](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/format-option)

## テスト一覧を出力する
[--dry-run](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/dry-run-option)

## テスト時間を計測する
[--profile](https://relishapp.com/rspec/rspec-core/v/3-9/docs/configuration/profile-examples)
ProgateでJava　勉強メモ2

#型の話
データの型は結構いろんな種類があるみたい。
intとか数字ってざっくり思ってたけど、正確には「整数」。
少数点以下を持つ数字はdouble型に分類される。
int型同士の計算は結果はint型で返ってくるし、double型同士の計算はdouble型で返ってくる。

```Java
System.out.println(5/2);            2    //int型
System.out.println(5.0/2.0);        2.5  //double型

```
結果が変わるので、注意:hand_splayed_tone2:

データ型が違うもの同士を`+`などで処理することはできないので、**型を変換**する必要がある。

##型変換
###自動型変換

```java
//String型＋int型
System.out.println("今日は" + 6 + "月です")
=>("今日は" + "6" + "月です")
int型がString型に自動で変換される
 ```

####int型とdouble型　⇒　double型
int型がdouble型に自動変換されるため。

###強制型変換（キャスト）
整数同士の計算で答えを正確に(小数点以下も含めて)出したいときは、強制型変換を行う。
たとえば、10/4 の計算変換したいとき→どちらかもint型なので、どっちかの値をdouble型にする。
すると、自動型変換がかかって、両方ともdouble型になり、得られる値もdouble型になる。
型変換なしであれば小数点は切られて２になる

```java
System.out.println((double)10/4);
                     10をint型からdouble型に変更
                     //2.5
ps aとps -aの違い

`man ps`で調べてみた

```
       a      Lift the BSD-style "only yourself" restriction, which is imposed upon the set
              of all processes when some BSD-style (without "-") options are used or when
              the ps personality setting is BSD-like.  The set of processes selected in
              this manner is in addition to the set of processes selected by other means.
              An alternate description is that this option causes ps to list all processes
              with a terminal (tty), or to list all processes when used together with the x
              option.

       -A     Select all processes.  Identical to -e.

       -a     Select all processes except both session leaders (see getsid(2)) and
              processes not associated with a terminal.
```
Node.jsのバージョンを切り替えてnode -vしてもバージョンが切り替わっていない！

Node.jsのバージョン切り替えで詰まった話。

バージョンを設定して、確認すると

```terminal:terminal
$nodebrew use v12.18.2

$nodebrew ls
v10.16.3
v12.4.0
v12.18.2
v14.5.0

current: v12.18.2 // nodebrewでは選択されている
```

順調っ！

```terminal:terminal
$node -v
v10.16.3
```

あれっ？設定されていない？
環境変数PATHに設定されているディレクトリを確認してみる。

```terminal:terminal
$which node
/usr/local/bin/node ← Systemのnode
```

* システムのnodeを参照していることが原因だった

## 解決法

環境変数を追加

```/.bash_profile
...
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```terminal:terminal
$source ~/.bash_profile

$which node
/Users/macuser/.nodebrew/current/bin/node ←nodebrewが適用されている

$node -v
v12.18.2
```

### できた！！
Cloud Firestore で特定の collection のドキュメント全件数を count する方法

# 概要

Cloud Firestore で特定の collection のドキュメント全件数を count するサンプルコードをご紹介します。

# 前提知識: count() クエリは無い

まず、前提として Firestore には `db.collection("users").count()` みたいな `count()` クエリはありません。

# 結論: FieldValue.increment(1) を活用する

`count()` クエリが無いため、以下のように `db.collection("users")` のドキュメントが増減するタイミングで、ドキュメント全件数を管理する `db.collection("counters")` の値を `FieldValue.increment()` で増減させて、これでドキュメント全件数を管理します。

```js
db.collection("counters").doc("user").update({ count: FieldValue.increment(1) })
```

# サンプルコード: 特定 collection のドキュメント全件数 count
```js
const admin = require("firebase-admin");
admin.initializeApp();
const db = admin.firestore();
const FieldValue = admin.firestore.FieldValue;

db.collection("users")
  .add({
    name: 'test'
  })
  .then(() => {
    return db
      .collection("counters")
      .doc("user")
      .update({ count: FieldValue.increment(1) })
      .finally(() => {
        return res.status(200).send("OK");
      });
  })
  .catch((err) => {
    console.error(err);
    return res.status(500).send("NG");
  });
```

以上、Cloud Firestore で特定の collection のドキュメント全件数を count したい、現場からお送りしました。

# 参考情報

- [node\.js \- Increment counter with Cloud Functions for Firebase \- Stack Overflow](https://stackoverflow.com/questions/51016210/increment-counter-with-cloud-functions-for-firebase)
- [The Firebase Blog: Incrementing Values Atomically with Cloud Firestore](https://firebase.googleblog.com/2019/03/increment-server-side-cloud-firestore.html)
- [FieldValue \| JavaScript SDK  \|  Firebase](https://firebase.google.com/docs/reference/js/firebase.firestore.FieldValue)
【Spring Boot】独自のプロパティファイルを追加して、env.getProperty()で値を取得したい。

# デモアプリの構成
<img width="368" alt="デモアプリ構成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/b9112d18-64fa-72ae-f7c8-1065c6916b63.png">
src/main/resources/test.properties
が追加したプロパティファイル。
このファイルから、値を取得する。

<img width="457" alt="プロパティファイル内.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/d60fca11-5d15-7bd8-2017-b41a4ae209dc.png">
プロパティファイル内は、↑の状態。
# @PropertySource でEnvironmentにプロパティファイルを追加する
```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@PropertySource("classpath:test.properties")
public class PropertyTestApplication {

	public static void main(String[] args) {
		SpringApplication.run(PropertyTestApplication.class, args);
	}

}
```
@PropertySource()の引数に、プロパティファイルのパスを指定してやれば、Environmentに追加できる。

@PropertySourceは、@Configurationと一緒に宣言する必要があるが、
@SpringBootApplication内で、@Configurationが宣言されているため特別に宣言する必要はない。

[@PropertySourceのレファレンスはこちら](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html)

# env.getProperty()で取得する。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class PropertyGetComponent {

	@Autowired
	Environment env;

	public void printProperty() {
		String value = env.getProperty("test.property.key");
		System.out.println("取得した値は[ " + value + " ] です。");
	}

}
```
printProperty()の実行結果は↓

```
取得した値は[ test value ] です。
```

env.getProperty()で追加したプロパティファイルから、値を取得することができた:blush:
# 参考にした記事
* [Spring BootのAutoConfigureの仕組みを理解する](https://qiita.com/kazuki43zoo/items/8645d9765edd11c6f1dd)
* [Spring Bootでプロパティファイルとのバインディング方法](https://qiita.com/KevinFQ/items/bc5c3b7796bb72fa049c)
acts-as-taggable-onを使って絞り込み機能を作る

## 環境
- ubuntu(WSL)
- rails 6.0.3


## 事前準備
以下の機能は作成済みとします。

- 投稿機能
- 投稿詳細
- gemのインストール
- テーブルの作成
- ransackの導入

## 手順
- タグの保存
- ビューで表示
- 絞り込みの実装

### タグの保存
タグをつけたいモデルに以下を追加。

```micropost.rb
acts_as_taggable
```
保存するためにストロングパラメータに以下を追加。
念のためcreateも載せておきます。

```microposts_controller.rb
 def create
    @micropost = Micropost.new(micropost_params.merge(user_id: current_user.id))
    if @micropost.save
      redirect_to @micropost, flash:{success: "投稿しました"}
    else
      render :new
    end
 end

 def show
    @micropost = Micropost.find(params[:id])
 end

 private

 def micropost_params
   params.require(:micropost).permit(:content, :image, :tag_list)
 end
```

### ビューの作成と表示
ビューに以下を追加してください。
入力ビューと表示ビューを作ります。

```new.html.slim
= form_with model:  micropost, local: true do |f|
  .form-group
    = f.label :tag
    //,で区切る
    = f.text_field :tag_list, value: @micropost.tag_list.join(","), class: "form-control"
  = f.submit "送信", class: "btn btn-primary"
```

```show.html.slim
table.table.table-hover
    today
      tr
        th = Micropost.human_attribute_name(:tag)
        td
          - @micropost.tag_list.each do |tag|
            = link_to tag, microposts_path(tag_name: tag), class: "micropost_tags__link"
```

### 絞り込み機能の実装

```microposts_controller.rb
  def index
    @q = Micropost.ransack(params[:q])
    if params[:tag_name]
      #選択した同じ投稿の情報を返す
      @microposts = Micropost.tagged_with(params[:tag_name]).page(params[:page])
    elsif params[:q]
      #投稿を一覧を返す
      @microposts = @q.result(distinct: true).page(params[:page])
    else
      @microposts = Micropost.page(params[:page])
    end
  end

```

## 終わりに
間違いがありましたら編集リクエストまたはコメントお願いします。
zsh で実行したコマンドを一部変更して実行する

## 概要

git の pull と push だけを変えて実行したい時に、コピペしてカーソルを戻して実行していたのですが、zsh ではヒストリ履歴のコマンドを一部修正して実行できると聞いたので、やり方を調べました。

## 環境

macOS Catalina 10.15.5
zsh

## 方法

history から再利用したい履歴を検索

```
% history | grep git | grep pull | grep hoge | grep -v grep
  111 git pull origin hoge:hoge
```

pull を push に変更して実行

```
% !111:s/pull/push/
git push origin hoge:hoge
```

## 参考

下記サイトを参考にしました。
ありがとうございます。

[Modifiers](http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers "Modifiers")