OmniAICreator/Qiita-1.07M huggingface dataset:
【無人対応】チャットボットの導入と技術的資料

チャットボットを設置したサイトが最近多くなってきています。自社のサイトにも設置して申し込みのコンバージョンをあげようだとか、社内で立ち上げて問い合わせの量を減らそうなどの目論見をしている方々も多いかと思います。「どれがいいかちょっと調べといて」など上司から頼まれて、比較サイトを見ながら調査を始めたものの、色々なチャットボット製品が数多く出ていて、どれも見た目は同じなので違いがわかりにくく、どう評価していこうか悩んでいる担当者も少なくないのではと思います。
「どこからどう考えていこうか？」というステージの方に参考になればと思います。

>  アップデート：2021-2-15 機械学習型のリンクを追記をしました。

# 目的を明確にして選ぶ
そもそも、無人でやるべきかどうかという観点も入れて、対応内容に応じて有人型のほうが良いもの、無人型が適しているものがあるので目的を明確にして選ぶのが重要になります。
例えば、大規模で複雑なシステムの問い合わせ対応をチャットボットで効率化したいという課題に対して、シナリオ型のチャットボットを導入し、途中でシナリオの数が多くなりすぎて、全体を把握できなくなりメンテンナンスできなくなるなど・・・
以下では企業が抱える課題と現状を照らし合わせて適切なチャットボットを選択するためのマッチングチャートが公開されているので、検討の参考にしてはいかがでしょうか。

* [【お客様にマッチしたチャットボットを選ぶには？～チャットボットマッチングチャート～】](https://www.enoki.ifocus-network.com/operation-1/)

# 仕組みを知る
このサイトには技術者の方が多いと思いますが、その関係上チャットボットの仕組みに興味がある方も多いと思います。「そんなの当然AIでしょ」など言われる方も多いと思います（文脈にもよりますが、ここでのAIは一般的にはAI=ディープラーニングを指していることが多いようです）。実際、種類にはいくつかあるようで以下の記事では4種類（**検索型**、**シナリオ型**、**機械学習型**、**オントロジー型**）に大別して仕組みや特徴を説明しています。他にそれらを組み合わせた**ハイブリッド型**というのもあるようです。検索型チャットについては簡単な性能評価の実験結果が掲載されています。

それぞれ向いているもの向いていないものがあるようなので、チャットボット製品を調査するときは仕組みについてよくベンダに説明を聞いてから選ぶのが良いかと思います。

* [【チャットボット – その種類別の仕組み】](https://www.enoki.ifocus-network.com/tech-2/)
* [【検索型チャットとENOKI5.0を比べてみる】](https://www.enoki.ifocus-network.com/tech-3/)
* [【シナリオ型チャットとENOKI5.0を比べてみる】](https://www.enoki.ifocus-network.com/tech-4/)
* [【機械学習型チャットとENOKI5.0を比べてみる】](https://www.enoki.ifocus-network.com/tech-5/)
* [【機械学習型エンジンでチャットボットを作ってみた】](https://www.enoki.ifocus-network.com/operation-%ef%bc%94/)

# トライアル
チャットボットの導入を検討したときに、最近は無料でトライアルができる製品も増えてきました。百聞は一見にしかずで、なんでも試してみるとよくわかるかと思いますが、何も考えずにお試しを始めるのも考え物ですよね。チャットボットは登録するデータが一番重要だと思いますが、メンテナンス性がどれだけ容易でどれだけ精度を上げることができるかがポイントのと思われます。実際やってみないと、なかなか気がつかないことかと思いますが、事前に知っているかどうかでも評価にだいぶ差が出てくるかと思います。
こちらは試す際に考慮したほうが良いことを説明した記事です。

* [【チャットボット – 無料トライアルの落とし穴】](https://www.enoki.ifocus-network.com/operation-2/)

# レコメンド
これからのチャットボットはユーザーの質問に対して回答を出すだけでなく、ユーザーへの提案もすることが求められます。提案の手法はいろいろ考えられますがその参考記事です。

* [【チャットボットの入力補完機能とレコメンド機能】](https://www.enoki.ifocus-network.com/operation-3/)

# おわりに
普段はこちらの会社で自然言語関連の業務をしていますが、そちらで公開しているチャットボットに関する情報を纏めて見ました。チャットボット製品も提供しておりますので、興味あればぜひご覧ください。
→  [ENOKI - アイフォーカス・ネットワーク株式会社](https://www.enoki.ifocus-network.com/)
dockerのcontainerが起動後すぐに停止してしまう問題を見つける方法


```
$ docker-compose logs
```
このコマンドで、docker起動時のログを見る事ができます。
僕の場合は、vueがすぐに停止してしまい、こんなエラーが出てきました。


```
front_1  | npm ERR! errno ENOENT
front_1  | npm ERR! app@0.1.0 serve: `vue-cli-service serve`
front_1  | npm ERR! spawn ENOENT
front_1  | npm ERR! 
front_1  | npm ERR! Failed at the app@0.1.0 serve script.
front_1  | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
front_1  | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
front_1  | 
front_1  | npm ERR! A complete log of this run can be found in:
front_1  | npm ERR!     /root/.npm/_logs/2020-11-26T00_35_26_684Z-debug.log
front_1  | 
front_1  | > app@0.1.0 serve /app
front_1  | > vue-cli-service serve
front_1  | 
front_1  | sh: vue-cli-service: not found
front_1  | npm ERR! code ELIFECYCLE
front_1  | npm ERR! syscall spawn
front_1  | npm ERR! file sh
front_1  | npm ERR! errno ENOENT
front_1  | npm ERR! app@0.1.0 serve: `vue-cli-service serve`
front_1  | npm ERR! spawn ENOENT
front_1  | npm ERR! 
front_1  | npm ERR! Failed at the app@0.1.0 serve script.
front_1  | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
front_1  | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
front_1  | 
front_1  | npm ERR! A complete log of this run can be found in:
front_1  | npm ERR!     /root/.npm/_logs/2020-11-26T00_36_01_318Z-debug.log
front_1  | mba:project hoge$ 

```

原因がわかったので、これをググります。
【JavaScript】for文の入れ子を理解したい！

#プログラミング勉強日記
2020年11月26日
for文の入れ子の処理について学習したので、記録します。
間違えている自信しかないので、何かあればコメントください🙇

#for文とは
指定された回数だけ繰り返し処理を行う命令です。
[(for-Javascript | MDN)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for)

##書き方

```for文.
for(初期化式; ループ継続条件式; 増減式) {
 ループ内で実行する命令
}
```

##処理の流れ
####1.初期化処理
####2.条件判定
####3.判定がtrueの場合、ループ内の処理実行、falseの場合、ループの終了
####4.増減処理
####5.3の判定がfalseになるまで繰り返し


##(例) 変数iが10未満の間、コンソールに数値を出力
```script.js
for (let i =0; i < 10; i ++) {
    console.log(i);
}
```

#for文の入れ子
for文の中にfor文を書くことが可能です。

##例
※わかりやすい例文が思いつかなかったので、許してください


```script.js

for (let i =0; i < 2; i ++) {
        console.log('外側のループです');
        for(let n =0; n < 2 ; n ++) {
            console.log('内側のループです');
    }
}
```
###処理の流れ
####1.変数iに0を代入
####2.条件判定( i < 2 )
####3.コンソールに`外側のループです`と文字列を出力する
####4.内側のループに入る
####5.変数nに0を代入
####6.条件判定( n < 2 )
####7.コンソールに`内側のループです`と文字列を出力する
####8.変数nに1を加算する( n ++ )
####9.内側のループが終了すると、外側のループの変数iに1を加算する( i ++ )
####10.外側のループが終わるまで繰り返す

##結果
![スクリーンショット 2020-11-26 9.32.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854121/d99b1757-611a-184c-34c4-9f01e8947c39.jpeg)
【Laravel Passport】APIで”Replicating claims as headers is deprecated and will removed from v4.0.”が発生した場合

要件だけ早急に。

Laravel Passportを使用し、APIの認証や実行時に、稀に以下のエラーが発生するようです。

```
Replicating claims as headers is deprecated and will removed from v4.0. Please manually set the header if you need it replicated. 
```

こちらは、関連ライブラリ”lcobucci/jwt”が、11/25にてv3.4.0へのアップデートが行われ、そのライブラリで不具合が発生している模様です。
https://github.com/lcobucci/jwt/issues/550

早い段階でマイナーバージョンアップが入るとは思いますが、万が一このエラーが発生する場合、以下のコマンドを実行し、ダウングレードを行ってください。

```
composer require lcobucci/jwt=3.3.*
```

公開しているサービスで問い合わせを受け、急いで調査。APIは割と影響度高いので。
サクッとParcel

# あぁ
サクッと画面がみたい、TS書きたい、動かしたい。。。
そんな時にParcelが便利だったのでその感動を残す。。。

# Parcelとは
コンフィグレスを謳ったバンドラー。[公式](https://ja.parceljs.org/)
tsconfigとか、webpack.configとかすっ飛ばしてシンプルに動かせる。

# なにはともあれ
見てもらうのが早い。
適当にディレクトリを切って、npm init します(あ、nodejs、npmは入ってる前提です)。

```sh
mkdir parcel_hoge
npm init -y
```
Parcelをインストールします。

```sh
npm i -D parcel-bundler
```
devDependenciesに **parcel-bundler** を入れます。

簡単にディレクトリ構成を整えます。今回は下記のようにしましたがお好みで。

```
parcel_hoge/
　├ node_modules/
　├ src/
　│　└ index.html
　│　└ scripts/
　│　    └ index.ts
　│　    └ sub.ts
　└ package.json
```

それぞれの中身はこんな感じ

```typescript:index.ts
// subから受け取ったmessageを画面に描画
import { message } from "./sub";
document.write(message);
```

```typescript:sub.ts
// messageとしてmomentを渡している
import moment from "moment";
export const message = moment();

```

```html:index.html
<!-- ここでTSを直接指定していることに地味に驚く -->
<script src="scripts/index.ts">
```


package.jsonに加筆します。
globalにparcelがあれば直接叩いてもいいです。

```json:package.json抜粋
  "scripts": {
    "web": "parcel ./src/index.html",
    "test": "echo \"Error: no test specified\" && exit 1"
  }
```

さて、お立ち会い。
コマンドを叩くと、必要なモジュールのインストールが行われ（！）、localhostにサーバーが立ち上がります。
![スクリーンショット 2020-11-26 13.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531310/6ab84996-2b78-9b83-7776-d1c35563ceee.png)

ブラウザで確認すると。。。
![スクリーンショット 2020-11-26 13.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531310/0f237202-0b47-9b85-ad09-a37d855282f7.png)
動いている！

package.jsonを確認すると。。。
![スクリーンショット 2020-11-26 13.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531310/8e7f1415-161a-889a-c54e-d02ddc0a10b6.png)
使ったモジュールがインストールされてる！


っとまぁ、これといった設定ファイル無しでも
さらには必要なパッケージのインストールを事前に行わなくても
TS→JSへのトランスパイルやモジュールのバンドルを賢く捌いてくれます！

# 補足
* エントリーポイントはHTML以外でもOK
* nodejsらしくサーバーサイド実装する場合は注意が必要。<br>下記のようにビルド時に **--target node** オプションを指定しないと、node向けのビルドになってくれず困ったことになる（fsすらうまく動かず苦労しました。。。)。

```sh
parcel build src/scripts/index.ts --target node
```
[Rails]ユーザー新規登録時にメールを自動配信する機能を実装する[備忘録]

#はじめに
先日、Ruby on Railsでアプリケーションを作成しました。
その中で、ユーザーに新規登録をしてもらうと同時に、ユーザーのメールアドレス宛にメールを送る機能を作りました。
ネットで調べつつ、試行錯誤しながら実装したのですが、色々な情報が入り乱れていて、少しだけ分かりにくかった印象があったので、備忘録も兼ねて、ここでまとめたいと思います。
それでは参りましょう！

#メール送信機能を記述

````ruby:config/environment/development.rb
#以下を追記
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => 'localhost:3000'}
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => 'smtp.gmail.com',
  :port => 587,
  :domain => 'gmail.com',
  :user_name => "hoge@gmail.com",  # user_name, passwordはご自身のものに変更して下さい。
  :password => "hogehoge",
  :authentication => :plain,
  :enable_starttls_auto => true
}
````

#メーラーを作成
メール送信におけるコントローラー的役割を果たすMailerを作成します。
``rails g mailer <メーラー名> <メソッド名>``

````ruby:ターミナル
$ rails g mailer ThanxMailer complete_registration
````
このコマンドを打つことにより、``app/mailers/application_mailer.rb``と``app/mailers/thanx_mailer.rb``が生成されます。
次に、それらのテンプレートファイルを編集していきましょう！！

#メーラーを編集

````ruby:app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: '管理者'
  layout 'mailer'
end
````

````ruby:app/mailers/thanx_mailer.rb
class ThanksMailer < ApplicationMailer
  def complete_registration(user)
    @user = user
    mail(:subject => "登録ありがとう！！！！", to: user.email)
  end
end
````

#メール本文の作成

````ruby:views/thanx_mailer/complete_registration.text.erb
<%= @user.name %> 様

会員登録ありがとう！！！！
````

#コントローラへの記述

````ruby:app/controllers/users_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    ThanxMailer.complete_registration(@user).deliver
  end
end
````

メーラーは、``メーラー名.メソッド名``と記述することで、クラスメソッドを呼び出すように実行できます。
実際の送信は``deliver``メソッドが行います。

#おわりに
メール送信機能自体は、記述する量も比較的少ないため、理解がしやすいと思います。
ただただコピペするだけでなく、一つ一つの意味をしっかり理解していきたいですね。
Formオブジェクトについて

## Formオブジェクトとは？
　**1つのフォーム送信で複数のモデルを操作したい場合**や、テーブルに情報を保存しない情報に対するバリデーションを行いたい場合使うデザインパターンのこと。

## 実装手順
####①　新たにformオブジェクト用のmedelを作成する
```ruby:ターミナル
% rails g model モデル名
```

####②　form_withメソッドに対する機能とバリデーションを行う機能を持たせる。
```ruby:test_form.rb
class TestForm

  include ActiveModel::Model
```

◯　**include ActiveModel::Model**
　この記述のように、ActiveModel::Modelをincludeすることで、form_withやrenderなどのヘルパーメソッドの引数として扱えたり、バリデーションの機能が使用できるようになる。
　この記述は「**Formオブジェクト**」を呼ばれる。

####③　保存したい複数のテーブルのカラム名全てを属性値として扱えるようにする。
```ruby:test_form.rb
class TestForm

  include ActiveModel::Model
  attr_accessor :カラム名1, :カラム名2, ・・・
```

◯attr_accessor
　ゲッターとセッターを定義してくれるメソッド。与えられた引数をもとに属性を設定し、これを取得するメソッド（ゲッター）と更新するメソッド（セッター）を定義することができる。
　モデルに対応するテーブルのカラム名以外の属性を扱いたい場合は、attr_accessorを用いて追加する。

####④　バリデーションを設定する。
```ruby:test_form.rb
class TestForm

  include ActiveModel::Model
  attr_accessor :カラム名1, :カラム名2, ・・・

  validates :カラム名1, 各オプション
  validates :カラム名2, 各オプション

            or
  
  with_options 各オプション do
    validates :カラム名1
    valitates :カラム名2
  end
```

◯with_options
　同じオプションがある場合は、with_optionsを使用することで、validatesをまとめることができる。

　formオブジェクトで使用するモデルのバリデーションは、各モデルにバリデーションを記述するのではなく、formオブジェクトに記述する。
　理由としては、バリデーションが引っかかった場合に、各モデルにバリデーションを記述していると、引っかかった理由をうまく画面に表示できなくなるため。

####⑤　データをテーブルに保存する処理を書く。
```ruby:test_form.rb
class TestForm

  include ActiveModel::Model
  attr_accessor :カラム名1, :カラム名2, ・・・

  validates :カラム名1, 各オプション
  validates :カラム名2, 各オプション

            or
  
  with_options 各オプション do
    validates :カラム名1
    valitates :カラム名2
  end

　def save
    変数 = 外部のモデル名.create(カラム名1： 保存したい値, カラム名2： 保存したい値, ・・・）
    モデル名1.create(カラム名1： 保存したい値, カラム名2： 保存したい値, ・・・, カラム名： 変数.id）
    モデル名2.create(カラム名1： 保存したい値, カラム名2： 保存したい値, ・・・, カラム名： 変数.id）
)
  end
```

　保存したい複数のモデルに外部モデルに関するidを保存したい場合は、変数に外部モデルの情報を代入して、その変数のidを保存したいモデルに記述する。
Contact Form 7の送信ボタンを右寄せにする方法

WordPressでの開発では、Contact Form 7を気に入って使うのですがこんな問題が起こりました。

![74c68277c6b8519bb28cc06a9f9d606a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/505788b4-b5af-d8ee-93b9-290f70384b3b.png)

ボタンを右寄せにするCSSを当てても微妙に余白ができていました。
こちらの解決策をまとめました。

##何が隠れているのか確認する
下の画像の通り何か隠れていました。
こちらは、送信の通信をしているときに表示されるクルクルまわっているやつです。

とりあえずこちら表示される必要がないのでこれを消せば良さそうですね。
![c7ba0512e6aa9820d743612ad8f48ec8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/0d324edc-2295-b2dd-294e-eedd158d795b.png)
cssはこのようになっています。

![08dda9f32991d2dac688cb1d4b87ca70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/91dc3277-2985-b398-8066-1420676ecac0.png)


こちらを非常時にするために、Contact Form 7のプラグインフォルダのCSSを触ります。
ここに格納されています。
![fef49ad56fd2fff700a12fb5f12287d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/0dce8a04-524f-3703-a7ca-7736434e2b31.png)


ファイルを開いたら、こちらで検索します。
【検索ワード】
`div.wpcf7 .ajax-loader`

![9a15bbae5db201ba868bbe9b0852f884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/804305db-e3fe-b0db-4719-49158dc06940.png)

あとは、`display:inline-block`を`display:none;`に変更します。
![5612c540998b1bea3d3dd723fdf99d11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/981bb4b7-d286-c717-1e02-3882ee3be702.png)

ブラウザで確認します。
問題なさそうですね。
![6831ced5eb07778e951dbc076657362e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/f8d6ce47-5803-3456-8ecc-445c7f83d558.png)

一応プラグインのコードを触ったので、送信確認も問題ないかしてみましたが、問題なく送信できました。
Git リモートブランチをチェックアウトする

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！
:::
https://dokupro.dev/

## 目的

- 自分のローカルにないリモートブランチを取得する方法をまとめる

## 詳細
※ 実行するコマンドはすべてローカルリポジトリ内で実行するものとする。

1. 最新の状態を取得する。

    ```terminal
    $ git fetch
    ```
1. リモートブランチの一覧を表示する。

    ```terminal
    $ git branch -r
    ```
1. リモートブランチをローカルリポジトリにチェックアウトする。（ローカルリポジトリでの表示ブランチ名は任意のもので良い、しかしリモートブランチ名と合わせることが自然である。）ブランチ名に`#`などが含まれる場合、`""`でくくって文字列として扱わせる必要がある。

    ```terminal
    $ git checkout -b ローカルリポジトリでの表示ブランチ名 origin/リモートブランチ名
    ```
1. ローカルリポジトリにリモートブランチと同じブランチがない場合下記のコマンドでもチェックアウトする事ができる。

    ```terminal
    $ git checkout リモートブランチ名
    ```

## 参考文献

- [https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)
Mysql2::Error: Table '○○_production.users' doesn't existを解消した話

表題が発生し、解消するまでの顛末をまとめました。原因は２つありました。

# 開発環境
ruby 2.6.5
Rails 6.0.3.2
capistrano 3.14.1
AWS EC2
webサーバーNginx 
アプリケーションサーバーUnicorn

# 事の発端
データベース関連の修正を行ったため、本番環境(EC2)で一度テーブルを落としてから再作成しました。
そしてマイグレーションを行った際、表題のエラーが発生しました。結論、原因は2つありました。

# 原因その１　userを参照するreferencesメソッドが、userテーブルが作成される前に読み込まれていた
こちらの方がわかりやすくまとめられてます。
https://obel.hatenablog.jp/entry/20170719/1500456452

rails db:migrate:statusで確認すると、確かにテーブルのステータスがdownになっていました。
タイトルの通り、エラーメッセージの指摘は何ら矛盾がありませんでしたね。
ただ、開発環境ではエラーにはならず？アプリも正常に動いていたので、気づくのにかなり時間を費やしました。

こちらの記事の通り、マイグレーションファイルの日付を修正して、読み込まれる順序を変更しました。
そして、statusはupになりましたが、それでもエラー自体は解消されませんでした。

# 原因その2　本番環境でgit pull origin masterをしていなかった
結論、これによって上の作業がEC2上に反映され、ようやく解消に至りました。

いやもう思い違いをしていたというか、今なお十分な理解に至っていないのですが、githubへpush(作業ブランチで開発していた場合はmergeしてmasterへpullまで)したら、このコマンドは必要ないと思っていました。
実際、それで自動デプロイのコマンドを打てば、本番環境に機能を実装させることはできていました。

git pull origin masterは毎回必要なのだろうか？この辺りは宿題になっています。
git,githubは大分慣れたように思っていましたが、まだまだ知識が不足しているようです。
[C++] yyyyMMdd形式の文字列を日付(tm)に直す

# もくじ

https://tera1707.com/entry/2022/02/06/144447


# やりたいこと

[別の記事](https://qiita.com/tera1707/items/c01ee7b9d30635a112cf)で取り込んだ`yyyyMMdd形式`の文字列を、tm構造体に入れて、日付として比較などできるようにしたい。

# やり方

やり方は下記。

- `sscanf_s()`で、`20201012`などのyyyyMMdd文字列の中の年/月/日の数字を、分解してint型の変数に入れる(今回はwchar_tの文字列なので、`swscanf_s()`を使う)
- そいつらを`tm`に入れなおす
- その`tm`を、`mktime()`でtime_tに入れなおす→①
- 比較対象のtime_tを用意する→②
- ①と②のtime_tを、`disstime()`関数で比較する

これで、比較ができる。
下のサンプルでは、②として「今の時間」を使った。

# サンプル

```cpp
#include <windows.h>
#include <timezoneapi.h> 
#include <iostream>
#include <time.h>
#include <regex>

int main()
{
    int year, month, day = 0;
    std::wstring input = L"20201115";

    // 文字列をintとして取り込み
    swscanf_s(input.c_str(), L"%04d%02d%02d", &year, &month, &day);

    // tmに移し替え
    tm myTm = { 0 };
    myTm.tm_year = year - 1900;
    myTm.tm_mon = month - 1;
    myTm.tm_mday = day;

    // ログファイル名からログ日時を取得
    time_t log = mktime(&myTm);

    // 現在日時を取得
    auto t = std::time(nullptr);
    auto tmnow = tm();
    localtime_s(&tmnow, &t);

    // ログの時間と今の時間を比較
    double dif = difftime(t, log);

    // 経過した日数を算出(difftimeの戻り値は秒)
    int keikabi = dif / 60 / 60 / 24;

    std::wcout << L"Keika shita Hi ha : " << keikabi << std::endl;

    system("pause");
}
```

# 参考

[C言語] 時間を扱う
https://qiita.com/edo_m18/items/364ffc6713b81c4d1c87

sscanf_s
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/sscanf-s-sscanf-s-l-swscanf-s-swscanf-s-l?view=msvc-160

mktime
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/mktime-mktime32-mktime64?view=msvc-160

difftime
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/difftime-difftime32-difftime64?view=msvc-160
Composerがインストールできない環境でComposerを使用したい時

PHPでシステムを組むときにComposerを使うかと思いますが、
レンタルサーバーだったり、権限がなかったりと、Composerをインストールできないときがあると思います。

その場合、以下手順でComposerのコマンドを叩けます。
※既にローカル環境などで開発していて、composer.jsonがある前提です。
- - -
まずはcomposer.jsonがあるフォルダに移動します。

次にcomposer.pharというComposerを叩くためのファイルを落としてきます。

```
curl -sS https://getcomposer.org/installer | php
```
あとは以下で叩けます。

```
php composer.phar install
```

update

```
php composer.phar update
```

composer
が
php composer.phar
に置き換わった感じですね。
Flowでカスタムラベルを使う　winter21後の注意点

普段はApexでコーディングすることが多いので、Flowやプロセスビルダーはほぼ使いません。
今回は　思いつかない解決方法が紹介されていたので、覚えとして作りました。

質問
https://trailblazers.salesforce.com/answers?id=9064S000000DDhK

サンドボックスにWinter'21が含まれていると、カスタムラベルを参照する数式フィールドを使用できなくなります。
例えば。
画面フローに、次のように設定されたデータ型テキストの数式フィールドがあります：{！$ Label.UW_frmFiscalYear}

UW_frmFiscalYearは、私が英語とフランス語で定義したカスタムラベルです。


解決策

ラベルを「FlowRT_」として再作成すると、新しいラベルがフローに表示されました。

プレフィックスFlowRT_のラベルを作成しましたが、機能します。フローを終了して、フローが表示されるように戻る必要がありました。

よくわからないけど、プレフィックスFlowRT_　が必要みたいですね。

リリースノートを見てもそんな記述はみつけられなかったです。

思いつきません。
【Swift】Stringの改行する方法

SwiftでのStringの改行の方法です。

|動作環境|バージョン|
|:-----------|:-----------|
|Xcode|12.1|
|Swift|5|

#改行方法その①　改行文字 \n を使う
```swift:
let newLineCharacter = "newLine\nCharacter"
print(newLineCharacter)
```

##出力結果
<b>newLine</b>
<b>Character</b>

##バックスラッシュ " \ " の打ち方
<code>option</code> + <code>¥</code>

#改行方法その②　３つの二重引用符 """ を使う
```swift:
let newLineString = """
new
Line
String
"""
print(newLineString)
```
""" 3つの二重引用符で挟むと、改行がそのまま出力結果に反映されます。

##出力結果
<b>new</b>
<b>Line</b>
<b>String</b>

##文字列に"二重引用符"を含める
３つの二重引用符で挟む場合は、文字列に"二重引用符"を含むことができます。

```swift:
let newLineString = """
new
"Line"
String
"""
print(newLineString)
```

##出力結果
<b>new</b>
<b>"Line"</b>
<b>String</b>

##間違った書き方

```swift:
let mistakeString = """mistake
String
"""
```
この記述だと、Xcodeに怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/a3b22c80-6e5d-76e6-4fd3-16de46440bbc.png)
>複数行文字列リテラルは改行から必ず開始してください。

ということで、開始と終了する時には改行が必要です。

##参考
<a href="https://qiita.com/ktanaka117/items/15ef57511a3d01cd6029">[Swift]改行の仕方</a>
<a href="https://www.hackingwithswift.com/example-code/language/how-to-create-multi-line-string-literals">How to create multi-line string literals</a>

<br>
それでは、Swiftでの改行ライフをお楽しみください！
ヒラギノ角ゴを簡潔に使うExtension【Swift 5】

こんにちは、@Zhalen です。読み方は、「ツァーレン」です。



この記事では日本人が最もよく使っているフォント、<b>ヒラギノ角ゴ</b>、

通称```HiraginoSans```をよく使う方のためのExtensionを簡潔にご紹介します。



#Extension
```swift

extension UIFont {
    
    enum borderStyle: String {
        case light = "HiraginoSans-W3"
        case bold = "HiraginoSans-W6"
        case extraBold = "HiraginoSans-W7"
    }
    
    static func hiraginoSans(style: borderStyle, size: CGFloat) -> UIFont {
        return UIFont(name: style.rawValue, size: size)!
    }
    
}
```


#Usage

このようにお使いください。ちなみに、Qiitaのこの文章で使われているフォントはおそらく```HiraginoSans-W3```です。以前ブログをやっていたこともあり、フォントをよく選ぶようになってくると見ただけで「あ、これは〇〇のΔΔだな」というのが本当にわかってきます。

```swift

//細め
label0.font = UIFont.hiraginoSans(style: .light, size: 15)

//太め
label1.font = UIFont.hiraginoSans(style: .bold, size: 15)

//極太
label2.font = UIFont.hiraginoSans(style: .extraBold, size: 15)
```

<>

#まとめ

好きなフォントは```Helvetica Neue Ultra-light```一択です。
FastAPIの公式ドキュメント翻訳の紹介

FastAPIのドキュメント翻訳について書きます。FastAPIに貢献してみたい、OSSに興味がある方などへ向けた記事です。

## FastAPI

[FastAPI](https://fastapi.tiangolo.com/)はPythonのWeb frameworkで、Flaskのようなマイクロフレームワークです。
パフォーマンスの高さ、書きやすさ、本番運用を強く意識した設計、モダンな機能などが強みです。

## 公式ドキュメント

FastAPIの強みの一つとして充実したドキュメントが挙げられます。

[日本語ドキュメント](https://fastapi.tiangolo.com/ja/)も**一部**公開されています。

![スクリーンショット 2020-11-25 194448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246552/e1c6a979-ec82-385d-414a-67fb5e4ecc7b.png)

日本語以外にも多くの翻訳プロジェクトが立ち上がっています。10か国語に翻訳されています(2020年11/25時点)。

![スクリーンショット 2020-11-25 193920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246552/88513716-e17c-b0c0-25a4-a1c6f9aa2379.png)

## 翻訳

FastAPIの公式ドキュメントは静的サイトジェネレーターである[MkDocs](https://www.mkdocs.org/)で生成されています。markdownでドキュメントを書き、yamlで構成を設定できます。

各ページ、言語に対応したmarkdownとyaml ファイルがFastAPIの[レポジトリ内](https://github.com/tiangolo/fastapi/tree/master/docs)に配置されています。masterブランチが更新されるとGitHub Actionsで自動的にデプロイされます。

FastAPIは1人で開発されており、開発者は日本語など翻訳されているほとんどの言語を話せません。なので、各言語圏のコミュニティに翻訳を任せています。

現状、**誰でも**翻訳のプルリクエストを出せますし、レビューも歓迎されています。

## 翻訳の流れ

翻訳はページ毎 (1つのmarkdown毎) に順次[プルリクエスト](https://docs.github.com/ja/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request#changing-the-branch-range-and-destination-repository)を出す形式になっています。

![スクリーンショット 2020-11-25 195435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246552/a8768628-7d65-2d1e-13ee-c1817c1e4378.png)

プルリクエストは、**レビュワー**が誤字脱字などをチェックします ([参考](https://docs.github.com/ja/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews))。(注: 誰でもレビュワーになれます。何の手続きもなく、ただレビューするだけです。)

![スクリーンショット 2020-11-25 204431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246552/ee50553a-0031-6e89-2438-b30841ad7f06.png)

プルリクエストは、2人以上 (あくまで目安です) のレビュワーからApproveされるとマージしてもらえて、公開されます。

## 日本語への翻訳

日本語圏のコミュニティの貢献によって、以下の様に多くの[プルリク](https://github.com/tiangolo/fastapi/pulls?q=is%3Apr+is%3Aopen+label%3Alang-ja)がでており、マージされています。他言語の翻訳と比べると非常に活発な方です。
(レビューが追い付いていないですが。。。)

![スクリーンショット 2020-11-25 211601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246552/5ee4a172-4418-3dd0-eb86-0aebd46bc32c.png)

## さいごに

ドキュメントが手厚いので翻訳対象が結構多いです。まだまだ、チュートリアルは半分以上手つかずで、レビューが必要な翻訳はそれ以上にたくさんあります。

ドキュメントは細かくセクション分けされているので一つ一つのプルリクエストは内容や翻訳の分量が様々です。興味のあるセクションがあればぜひ参加してみてください。

興味や質問がある方はぜひ[こちらの日本語翻訳issue](https://github.com/tiangolo/fastapi/issues/1572)へ！

翻訳に関して以下のドキュメントにより詳しい説明があります。

* [開発 - 貢献 / 翻訳 (公式ドキュメント)](https://fastapi.tiangolo.com/ja/contributing/#_8)
異常検知本5冊読んだので書評書く。


#本記事のモチベーション

- 製造業では異常検知が結構案件として出てくる
- 異常検知は時系列系にも役立つ、というか見方を変えると異常検知のタスクだったとかある

といことで異常検知を学んでいきましたので備忘録

# 読んだ本


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/8e81382d-2ead-c6fa-47c1-4abf90d77e76.png)



#1冊目：統計的工程管理―製造のばらつきへの新たなる挑戦


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/ce5af1e6-1892-453a-0f9d-641ddedb2038.png)

```
著者：仁科 健
出版社: 朝倉書店
発売日： 2009/12/1
```

#感想

- 製造業向け、QC工程表とか腐らせずに管理できている会社ならこのレベルまで実現できているのか？
- やはり管理コストをかける半導体の話が多い様子
- X-bar管理などは有名だけど、累積和やV-maskのような単純な考え方で生成してくるデータの異常を知る方法は大変に面白かった
- 重回帰やARIMAも一部アリ
- 異常検知の異常度判定基準がISOやJISで参考に決められていることを初めて知った

余談
現実は管理手法よりも、「管理していこう」という合意を取り付けて危機感を持ってもらってデータ化するという壁がある...

#2冊目：異常検知と変化検知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/2ded4877-1ced-b6ae-dbd0-b654915bdea3.png)


```
著者：井手剛
出版社: 講談社
発売日： 2015/8/7
```

#感想

- 紹介されている方法が多い
- 初心者からするとレベルはかなり高かった
- 異常検知でのアプローチの方法はパターンがありそうで、特定の特徴量空間に落としてから異常なデータとの距離を測る
- 距離は確率分布で確率値を計算したりする場合もある
- ラベルがない場合は1class-SVMのように正常データの超球を定義してそこから外れたかどうかを判別する
- EMアルゴリズムの説明が非常にわかりやすかった



#3冊目：入門 機械学習による異常検知―Rによる実践ガイド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/4480ac08-64e6-08bf-1d28-6d5e9992d1ee.png)


```
著者：井手剛
出版社: コロナ社
発売日： 2015/2/19
```

#感想

- この本を一番初めに読んでおけばよかった
- 数学的な記述も多くて初心者にはレベルが高いかと思ったけれども、時間をかければ理解できるように工夫されていた
- 統計や線形代数の入門本をおさらいすることで読み進められる
- 付録参照の部分はさすがにレベルが高い
- タイトルにもある通り、Rを使って動かせるのでパッケージの中身まで確認できる程度にRに詳しければより理解しやすい

#4冊目：データマイニングによる異常検知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/2eb3c51f-135e-3ebc-ed9a-d7b4daabf915.png)




```
著者：山西 健司
出版社: 共立出版
発売日： 2009/5/23
```

#感想

- EMアルゴリズムや平滑化を使って確率分布求めて珍しさを求める
- コマンドの遷移確率からロボットを検知する
- 自己相関からありえない波形を判断する
- など、他の本でも似たような記述はあるが、セキュリティやリアルタイムに増え続けるデータを想定した話が多くて具体的な使い道をイメージしやすかった


#5冊目：Pythonと実例で学ぶ機械学習 識別・予測・異常検知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/91b28ac1-d5b1-2244-d6e0-82707b205937.png)


```
著者：福井健一 
出版社: オーム社
発売日： 2018/11/27
```


#感想
- amazonレビューがすこぶる悪くて買う前に心配した
- どの本にも言えることだけど、悩んだら図書館で借りて様子見してからの購入をオススメする


#以上
SwiftUI初心者向け：ビューコンポーネントを条件に応じて表示し、ビューモディファイアを設定する

本記事はSwiftUIプログラミングの初心者に向けたものです。次についてお話しします：

- インラインの条件ステートメントを使う
- 条件に応じてビュー要素が表示されるように条件ステートメントを使う
- ビューモディファイア（フォント `.font`、パディングなど `.padding`）に条件ステートメントを使う

画面にどの要素が表示されるかを簡単にコントロールできるのは、SwiftUIの最も素晴らしい機能のひとつだと思います。

# インライン条件ステートメント

インライン条件ステートメントを使うことができます。例えば、サインインしていないユーザーには「あなたはサインインしていません」、サインイン済みのユーザーには「サインインしました」と表示されるようにできます。

```swift
Text(isSignedIn ? "サインインしました" : "あなたはサインインしていません")
```

構文は以下のとおりです:

```
[条件] ? [条件が真の場合の表現] : [条件が偽の場合の表現]
```

# ビューコンポーネントを条件に応じて表示する

ビュー要素を条件に応じて表示することもできます。例えば、ユーザーがサインインしていなかったら、サインボタンを表示するようにできます。

```swift
struct ContentView: View {
    
    @State var isSignedIn: Bool
    
    var body: some View {
        if !isSignedIn {
            SignInWithAppleButton(...)
        }
    }
    
}
```

# 条件に応じたビューモディファイア

また、入力付きのビューモディファイアを作成することもできます。`View` にエクステンションを追加できます。

```swift
extension View {
    @ViewBuilder
    func redacted(showPlaceholder: Bool) -> some View {
        if showPlaceholder {
            self
                .redacted(reason: .placeholder)
        } else {
            self
                .unredacted()
        }
    }
}
```

これで、自作のビューモディファイアを条件に応じてコールできます：

```swift
WeatherView(weatherInformation: $weatherInformation)
    .redacted(showPlaceholder: (weatherInformation == nil))
```

条件付きビュー修飾子を使用することで、一定の条件を満たした場合にのみビューにアニメーションを適用することもできます。[こちらの以前のQiita記事で、それについて説明しています。](https://qiita.com/MaShunzhe/items/4ed187a140259775c23c)

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
rtl-sdr その4

#概要

windowsでgnuradioやってみた。

#環境

windows 7 64bit
gnuradio v3.7

#FMラジオ

![無題2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/031e1829-095a-16c8-8db1-a4a609c6a67f.jpeg)

#結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/41b66561-d9ec-df49-d5ff-f43ecc02372a.jpeg)


以上。
Shopifyストアの速度とパフォーマンスを最適化する9つの方法

Shopifyは、オンラインストアにより多くの訪問者を引き付け、最高のサービスを提供し、常連客に変えるさまざまな機会を提供する最高のプラットフォームの1つです。しかし、あります！あなたのウェブサイトは美しくデザインされ、多くの機能を備えており、最も競争力のある購入と配達の条件を提供しているかもしれません。しかし、サイトが遅い場合、これらの利点はどれも重要ではありません。あなたの潜在的な顧客は一回の購入をせずに船を放棄するでしょう。

このガイドでは、Shopifyの速度の最適化に関連する最も重要な質問と、高速なWebサイトがShopifyのコンバージョンの最適化にどのように影響するかを説明します。

ここでは、主にShopifyストアのパフォーマンスと速度に影響を与えるこのプラットフォームの主な弱点について詳しく説明します。

Shopifyストアの所有者がShopifyの速度を向上させるためにできることはすべて、フロントエンドに関連する問題の最適化に関連しています。これは、テーマ、サードパーティの機能、最適化されていない画像の量が多すぎるなどの可能性があります。

ここでは、主にShopifyストアのパフォーマンスと速度に影響を与えるこのプラットフォームの主な弱点について詳しく説明します。

1レスポンシブテーマを選択します

オンラインストアに適切なテーマを選択することは、ウェブサイトの読み込み速度の基礎の1つであり、Shopifyのモバイル最適化全体です。オンラインストアページの一般的なパフォーマンス分析では、ストアのテーマがどの程度最適化されているかについての詳細は提供されていません。そこで、Shopifyテーマを最適化する方法を理解するのに役立つように設計されたもう少し情報があります。

現在のテーマでShopifyストアの速度を最適化するために改善が必要かどうかを確認するには、PageSpeedInsightsで個別に確認する必要があります。

分析でパフォーマンスに問題が見つかった場合、最初にすべきことは、プロバイダーから入手できるテーマの更新を探すことです。

テーマを選択するときは、デバイスに対応していることを確認してください。現在、ユーザーの少なくとも半数がスマートフォンやタブレットを閲覧してオンラインで購入していますが、そのほとんどは画面サイズが異なります。 Shopifyをモバイル向けに最適化し、ユーザーがWebサイトを閲覧するときに最高のエクスペリエンスを確実に得られるようにすることが重要です。

カスタムウェブサイトのデザインはあなたの店を際立たせるもう一つの機会です-そしてそれはあなただけのものになります。

2インストールされているアプリを修正します

Shopifyプラットフォームは広大なネイティブ機能を提供しますが、サードパーティのアプリを使用して実装できる、含まれていない多くの機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/34d1dd2b-6f21-1af2-4a58-40ef07b91974.png)

ストアの機能を拡張することを決定するたびに、インストールするアプリが多いほど、Webサイトの重みが大きくなり、サーバーに送信されるリクエストが多くなり、それぞれの読み込みに時間がかかることを覚えておくことが重要です。完全にページ。では、これらすべてのアプリでShopify Webサイトの速度を上げる方法は？

最初に行うことは、インストールされているすべてのアプリの在庫を取得することです。多くの場合、インストールされているアプリケーションの中には、ほとんど使用されないものもあれば、まったく使用されていないものもあります。

購入する前に、すべてのアプリをテストして、その欠点を明らかにする必要があります。これには、データベース要求の数が多すぎるなどが含まれる可能性があります。

詳細[こちら](https://whidegroup.com/blog/shopify-performance-optimization/)
IBMクラウド　アカウントを停止するための手順

#要旨
IBMクラウド　アカウントを停止するための手順を記す。


・基本的にはcaseを作って依頼する。
・case作成・編集ができない場合はチャットでコメントを残す
I understand all data should be deleted .

下記アドレス参考
https://cloud.ibm.com/docs/account?topic=account-accountfaqs&locale=ja#cancelaccount

#発端
2020/11/25 7:08 に料金改定のメールがアメリカのIBMから来た。
見ると無料枠は関係がないようなので以前作った「従量課金アカウント」を停止することにした。





下記本文

Dear IBM Cloud Foundry User,

We are sending this notice as you are an IBM Cloud Foundry Public service user and there is an important pricing change of which you need to be aware.

The IBM Cloud Foundry Public compute service is updating some pricing details, starting February 1st, 2021. This means that the amount you are paying for IBM Cloud Foundry application runtime usage will change and potentially increase.

See IBM Cloud Foundry Public Pricing Updates for details.

The IBM Cloud Team


IBM Cloud Foundry Public サービスをご利用いただいているお客様には、ご注意いただきたい重要な料金変更があり、このメールをお送りしています。

IBM Cloud Foundry Public コンピュート・サービスは、2021年2月1日から料金プランを変更します。これにより、IBM Cloud Foundry アプリケーション・ランタイムのご利用料金が変更となり、増加する可能性ががございます。

詳細はIBM Cloud Foundry Publicの価格更新をご覧ください。

#経緯
[１回目]オフィスは日本外で日本語が話せる担当者
以前も似たようなことがありその時使ったチャットで相談することにした。
https://www.ibm.com/jp-ja/cloud/support
最初の日本語を話す男性にケースを作ってもらい確認を促されるがチャットが途切れてしまった。
[2回目]オフィスは日本で日本語が話せる担当者
メールで回答するとのことだった。それ以上は聞かないでください。AIがやってるのかな？
超変な感じだった。

[３回目]オフィスは日本外で英語が話せる担当者
ケースを作ってもらって、確認を促されるが確認できない。ケースを見る権利が私にないらしい。
[４回目]オフィスは日本外で英語が話せる担当者
ケースはすでに作ってあるので、確認はチャットにコメントを残すという指示を受け、そのようにした。

#感想
アカウント停止するのに手間がかかりすぎるのではないだろうかと思われる。
下手すると精神的に病んでしまうかも知れない。
Cloud Foundryを停止すればいいだけかも知れないが、それにしても面倒だと思う。
日本のオフィスはあんまり頼りにならないなという印象だった。権限がないのも原因だと思われる。
日本以外のオフィスの担当者の人が連携もちゃんとしているし比べれば頼りになるようだ。
チャットには画像も載せられた方が良いようだ。

#画像
まだ、アカウントは停止されてないようだが、大丈夫ではないかと思います。

![スクリーンショット 2020-11-26 4.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271383/a57ffd8f-d059-d3c1-8461-9c9ee020d1c9.png)
Laravel で Target class [Controller] does not exist.が出た時の対応

# 事象
最近のLaravel (多分v8以降とかそのあたり)では、初期状態で以下のようなコードをroutes/web.phpに記述すると、あるはずのController Classを見つけられずエラーが発生する。


```php
Route::get('/hoge', 'Controller@index');
```

```
Illuminate\Contracts\Container\BindingResolutionException
Target class [Controller] does not exist.

http://laravel.internal/hoge

Illuminate\Container\Container::build
htdocs\laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php:811
```

どうやらContollerの初期位置を見失うようになったらしい。


# 対応

App/Providers/RouteServiceProvider.php の```$namespace``` のコメントアウトを外す

```php
    /**
     * The controller namespace for the application.
     *
     * When present, controller route declarations will automatically be prefixed with this namespace.
     *
     * @var string|null
     */
    protected $namespace = 'App\\Http\\Controllers'; // ここがデフォルトでコメントアウトされるようになった
```


#参考等

https://kawax.biz/laravel8-routing/
(ここまで書いて理由とか気になってググったらこのブログで全部解決していた)
[iWork]Apple Pagesのファイル形式を解析してみた

#Apple Pagesとは
まあApple製品についてくるWordみたいなもの。.docx形式への変換なんかは結構簡単にできるが、.docxに変換し、Wordで編集してPagesで開き直したら全然違うレイアウトになっていたら元も子もない。
うっかり.pagesの形式のままで保存して、Windowsで編集を迫られるということもあるかもしれない。iPhone持ってないので知らないが、あれだと標準の文書ソフトウェアがPagesなのでわりと使ってる人口は多い。
そこでこの謎めいたファイル形式を解読すべく、調査を開始した。
#Pagesのファイル形式
全体としてはZip圧縮されたいくつかのファイルとディレクトリなため、unzipすれば簡単に中身を見ることができる。
文章はIndex/Document.iwaに保存されている。.iwaはiWork Archive Formatのことらしく、Snappy圧縮という形式で圧縮されている。だが、どうやら圧縮はちょっと独自なところがあるようだ。
詳しくは
https://github.com/obriensp/iWorkFileFormat/blob/master/Docs/index.md
に載っている。
パスワードを設定した時の圧縮形式はAESらしい。

なんでiwa形式をわざわざ使っているのかといえばおそらく過去の形式からの互換性のためだろう。
マークダウンテキストをプレーンテキストへ変換

[remove-markdown](https://github.com/stiang/remove-markdown) 
というものを使用。

## remove-markdownをインストール

```
npm install remove-markdown
```

## プレーンテキストへ変換

```
const removeMd = require('remove-markdown')
const markdown = '# マークダウンテキスト'
const plainText = removeMd(markdown)
````
Nuxtにマークダウンエディタを埋め込む

[vue-simplemde](https://github.com/F-loat/vue-simplemde) 
というものをありがたく使わせていただき、マークダウンエディタを埋め込んでみる。

## インストール

```
npm install vue-simplemde --save
```

## plugins配下にnuxt-simplemde-plugin.js作成

```nuxt-simplemde-plugin.js
import Vue from 'vue'
import VueSimplemde from 'vue-simplemde'
import 'simplemde/dist/simplemde.min.css'

Vue.component('vue-simplemde', VueSimplemde)
```

## nuxt.config.jsに追加

```nuxt.config.js
module.exports = {
   // some nuxt config...
   plugins: [
     { src: '~plugins/nuxt-simplemde-plugin.js', mode: 'client' },
   ],
   css: [
     'simplemde/dist/simplemde.min.css',
   ],
};
```

## コンポーネントで使用する

```main.vue
<template>
   <div class="wrap">
     <client-only>
       <vue-simplemde v-model="content" />
     </client-only>
   </div>
</template>

<script>
export default {
   data() {
     return {
       content: ''
     }
   }
}
</script>
```

## マークダウンエディタのカスタマイズ

マークダウンエディタのカスタマイズなどはconfigで設定できる。
設定項目の詳細については[こちら](https://f-loat.github.io/vue-simplemde/doc/configuration_en.html)

```main.vue
<template>
   <div class="wrap">
     <client-only>
       <vue-simplemde v-model="content" :configs="configs" />
     </client-only>
   </div>
</template>

<script>
export default {
   data:() =>( {
       content: '',
       configs: {
         autosave: {
           enabled: false
         },
         initialValue: '',
         toolbar: [
           'preview',
           '|',
           'bold',
           'italic',
           'heading',
           'heading-smaller',
           'heading-bigger',
           '|',
           'code',
           'quote',
           'link',
           '|',
           'unordered-list',
           'ordered-list',
           'table',
           'horizontal-rule',
           '|',
           'guide'
         ]
       }
   })
}
</script>
```
Pytorch_geometric の前処理にて、複数の自作transformクラスを渡す方法

# 概要
グラフ関連のDeep Learningの研究をしているためPytorch_geometricにはお世話になっています。が、最近geometricのデータセットにアクセスするたびに複数の種類の前処理(transform)を行いたいと思って調べましたが意外と時間がかかったためメモ

##実装方法

論文の引用関係データセットの'Cora'をインストールし、複数の前処理(transform)を行う場合、

```
from torch_geometric.datasets import Planetoid
import torchvision.transforms as transforms

transforms = transforms.Compose([TransA(), TransB(), ...])
dataset = Planetoid(root='./data', name='Cora', 
                    transform=transforms)

```

上記のように渡したい複数の自作transform(TransA, TransB, ...)をリストとしてComposeに渡してあげます。そのオブジェクトをgeometric.datasetsの引数transformに渡せば、その順に前処理してくれます。
Pythonで、配列要素のデータ型と、配列の長さを型検査する依存型ライクなメソッドを作ってみた

###定義したメソッド

自作クラスを宣言するときに、定義するクラスが用いるデータ型に制約を与えるのと同時に、そのクラスのインスタンスが持ちうる値の範囲や、長さの範囲にまで、制約を与えることができる言語は、依存型や篩型の型クラスを宣言できる言語として、知られています。

*Idris*やv6.11以降の*Racket*言語が、これらの型を宣言し、静的な型検査を行うことができる言語です。

・[Dependent Types と Refinement Types の違い](https://7colou.red/blog/2018/07-07-difference/index.html)
・[Refinement Types For Haskell](https://goto.ucsd.edu/~nvazou/refinement_types_for_haskell.pdf)
・[型をさらに拡張するーーRefinement Typesについて](http://bugrammer.hateblo.jp/entry/2016/07/21/152813)
・[LiquidHaskell のインストールと学習方法](https://haskell.e-bigmoon.com/posts/2018/03-03-liquidhaskell-intro.html)
・[Liquid Haskell で普通の型システムの上を行け #NGK2017B](https://www.slideshare.net/y_taka_23/liquid-haskell-ngk2017b-83162127)

これらの言語は、関数型言語です。*Haskell*が、関数型言語として、Qiitaでも多くの良質な記事が書かれています。

元々は手続き型言語であったPythonでも、以下のように、関数型言語のスタイルを取り入れる動きが進行中です。

1. __型アノテーション__の導入（*typing*モジュール）
2. 外部のツールとして、静的な型検査を行う*mypy*の登場
3. *map*や*reduce*の多様
4. 破壊的代入が可能な*List*ではなく、破壊的代入が言語レベルの仕様で禁止されている*tuple*型の利用を推奨するプログラミングスタイルの普及

こうした流れを受けて、この記事では、__Pythonで「依存型」クラスを実現する__ための一歩として、ある配列オブジェクトの__要素が持つデータ型__と、__配列全体の長さ__を検査するメソッドを定義してみました。

定義したメソッドの返り値は、bool型（*True*もしくは*False*のいずれか）です。

####定義するメソッドが行う型検査の内容
___

1. 第１引数に渡した配列の要素がすべて*str*型のオブジェクトであるかどうか。
2. 配列の要素数が第２引数に渡した数値未満であるかどうか。

___

__以下、Ipythonの対話型インタプリタで実行しました。__

```Python3:Python3
In [1]: from typing import List, Sequence, TypeVar

In [2]: T = TypeVar('T')

In [3]: def func_(x: List[T], n: int) -> bool:
    ...:     condition_1 = (len(x)  < n)
    ...:     condition_2 = not(False in [isinstance(elem, str) for elem in x])
    ...:     condition = (condition_1 and condition_2)
    ...:     return condition
    ...: 

```

###（ 動作確認 ）

以下の2つの条件が揃った場合のみ、*True*が帰ることが確認できました。

__（ AND条件 ）__
1. 第１引数に渡した配列の要素がすべて*str*型のオブジェクトである。
2. 配列の要素数が第２引数に渡した数値未満である。

```Python3:Python3
In [4]: test_list = [1, 2, 3, "a", 1, 5, 9, 10, 17]

In [5]: result = func_(test_list, 7)

In [6]: print(result)
False


In [7]: test_lis2t = [1, 2, 3, "a", 1]

In [8]: test_list2 = [1, 2, 3, "a", 1]

In [9]: result = func_(test_list2, 7)

In [10]: print(result)
False

In [11]: test_list = [1, 2, 3, 1, 5, 9, 10, 17]

In [12]: result = func_(test_list, 7)

In [13]: print(result)
False

In [14]: test_list2 = [1, 2, 3]

In [15]: result = func_(test_list2, 7)

In [16]: print(result)
False

In [17]: test_list3 = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]

In [18]: result3 = func_(test_list3, 7)

In [19]: print(result3)
False

In [20]: test_list4 = ["a", "b", "c"]

In [21]: result4 = func_(test_list4, 7)

In [22]: print(result4)
True

In [23]: test_list5 = ["a", "b", 1, 3]

In [24]: result5 = func_(test_list5, 7)

In [25]: print(result5)
False

In [26]: 
```
ラビットチャレンジ - 深層学習 Day3 Section3 GRU

# 0．概要
本記事は日本ディープラーニング協会認定の講座プログラムである「ラビット・チャレンジ」が提供している科目の1つである深層学習のレポートである。
記事タイトルに記載のとおり、Day3 Section3 GRUについて以下にまとめる。

# 1．GRU(Gated Recurrent Unit)
LSTMはパラメータが多く、計算負荷が高くなる問題があったが、GRUでは構造を変えることでパラメータを削減し、タスクによっては精度も同様またはそれ以上を望めるようになった。
いわばLSTMを簡易化したもの。

上記のように計算負荷がLSTMより低い。
また、簡易化したものではあるが、必ずしもLSTMより劣るとは限らない。
これまでにも最適化手法や初期化等を通して感じてきたが、どのような手法も結局はやりたいタスクに合うかどうかによって良し悪しは変わる。

構造は下記サイトを参照。構造と合わせて数式やソースを比べるとそれほど複雑ではないことが分かる。

参考：
https://axa.biopapyrus.jp/deep-learning/rnn/gru.html
https://agirobots.com/lstmgruentrance-noformula/
https://ja.wikipedia.org/wiki/ゲート付き回帰型ユニット#完全ゲート付きユニット

## 1.1．リセットゲート
過去の情報を保持させるか忘却させるかを決定する。
LSTMで言うところの忘却ゲートに該当する。

```math
r=\sigma(W_{r}h_{t-1}+U_{r}x_{t})
```

## 1.2．更新ゲート
過去の情報をどれだけ取り込むかを決定する。

```math
z=\sigma(W_{z}h_{t-1}+U_{z}x_{t})
```

## 1.3．出力

```math
c=tanh(W_{c}(h_{t-1}\otimes r)+U_{c}x_{t})
```

```math
h_{t}=((1-z)\otimes h_{t-1})\oplus(z\otimes c)
```

# 2．確認テスト

## 2.1．確認テスト1
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。

回答：
LSTM：パラメータが多いため計算負荷が大きい。
CEC：重みが一律になって学習ができない。過去の情報が不要になっても残り続ける。任意のタイミングで伝搬や忘却が出来ない。

## 2.2．確認テスト2
LSTMとGRUの違いを簡潔に述べよ。

回答：
LSTM：
・ 入力ゲート、出力ゲート、忘却ゲートの3つのゲートがある。
・ ゲートも多いためその分パラメータ数も多い。

GRU：
・リセットゲート、更新ゲートの2つのゲートがある。
・LSTMをいわば簡易化したものであるため、パラメータ数は少なくなっている。

# 3．演習チャレンジ

## 3.1．GRU

```Python:
def gru(x, h, W_r, U_r, W_z, U_z, W, U):
  # リセットゲート
  r = _sigmoid(x.dot(W_r.T) + h.dot(U_r.T))
  # 更新ゲート
  z = _sigmoid(x.dot(W_z.T) + h.dot(U_z.T))

  # 仮h
  h_bar = np.tanh(x.dot(W.T) + (r * h).dot(U.T))
  # h_{t}
  h_new = (1 - z) * h + z * h_bar
  return h_new
```

LSTMと同様に順伝播の計算は概要図と合わせて確認すると個々の計算はシンプルであることが分かる。

# X．ラビットチャレンジとは
ラビットチャレンジとは、日本ディープラーニング協会認定の講座プログラムの1つ。
E資格を受験するためにはこのラビットチャレンジ等、いずれかの講座プログラムを修了しなければならない。

ラビットチャレンジの特徴は「現場で潰しが効くディープラーニング講座」の通学講座録画ビデオを編集した教材を使用した自習スタイルであるという点。
サポートは他の講座より少なく、受け身ではなく自主的に学んでいく姿勢でなければ進められないが、その分、他の講座に比べると安価であり、手が出しやすい。
ある程度知識がある人、自力で頑張るぞというガッツのある人向けではないかと感じる。

![bnr_jdla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389699/bce66671-a2f5-a7f9-de6f-3f87e15c253b.png)
【Linux】ブートプロセスについて


低レイヤーの学習が疎かだったので勉強中。
定期的にアウトプットしていこうと思う。

# TL;DR
Linuxの起動順序（ブートプロセス）は
【BIOS/UEFI → ブートローダ → カーネル → init】
の流れで行われる。

# 1. BIOS起動〜ブートローダ起動

### 【BIOSとは】
ファームウェアの一つ。Basic I/O Systemの略でBIOSらしい。
最もハードウェアに近い部分を司り、物理的なハードウェア（マザーボード）上に搭載されている。BIOS自身はプログラムであり、フラッシュメモリ（フラッシュROM）に格納されている。


主に以下の設定ができる。

- 日付と時刻
- 電源管理
- 起動デバイスの優先順位
- 組み込みデバイスの有効/無効化


### 【処理の流れ】
#### 1-1. PCの電源投入と同時にBIOS実行
これはそのまんまの意味。
BIOSはフラッシュメモリに格納されているため、何度も繰り返し書き込みができ、通電をやめても記憶内容が維持される。

#### 1-2. POST処理
PCに接続している周辺機器(ビデオ、キーボード、メモリ、マウス、FDD、HDDなど)や組み込まれているパーツをチェックし、正常にPCを起動できるかどうかをチェックする。このことをPOST（Power On Self Test）処理というらしい。

#### 1-3. 起動ドライブの決定
プログラムが動作し、設定された起動デバイスの優先順位に従ってOSが格納された外部記憶装置へアクセス。

```           
BIOS →　CD-DVD　(優先順位:高)
     →　HDD_01
　　　→　HDD_02
　　　→　HDD_03
　　　→　USB   　(優先順位:低)
```

参照先のデバイスにOS起動ファイルがあればそいつに引導を渡し、空だったり起動用ファイルが無い場合はBIOSは次のデバイスを参照する。この過程で起動ドライブが決定し、BIOSはそのドライブの先頭セクタをロードする。


#### 1-4. MBR読み込み ~ ブートローダ起動
起動ドライブ先頭領域(MBR)に記録されたOS起動用のプログラム（2次ブートローダ）を主記憶装置（メインメモリ/RAM）に読み込み、制御を移す。メモリ上に読み込んだ「ブートローダ」を実行する。

### 【MBRとは】
Master Boot Recordの略称であり、ハードディスクの先頭セクタに置かれ、PC起動時に最初に読み込まれる領域。

### 【ブートローダとは】
BIOSによる呼び出しを受け、外部記憶装置からOSを読み出して起動するもの。
ブートローダはプログラムであり、実際には二段階の異なるプログラムに分かれていることが多い。一般的に「ブートローダ」と言われているものは「二次ブートローダ」であり、前述したBIOSなどが「一次ブートローダ」という言葉で説明されるようなこともある。

Linuxでは一般的にGRUBというブートローダが用いられることが多い。

ユーザがどれか1つのOSを選択すると、GRUBはそのOSのカーネルとRAMディスクをメモリ上にロードし、カーネルの先頭アドレスにジャンプするとその役目を終える。



# 2. カーネル起動
- 高度にハードウェアを認識・制御。ルートファイルシステムのマウントなど様々な初期化処理を行う。
- メモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムからマウントする
- その後、initと言う特別な最初のプロセスをルートファイルシステムから起動する。

# 3. initプロセス起動
initは、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。
デーモンとして動作し、一般にPID 1 を付与される。ブートローダがカーネルを起動し、カーネルがinitを起動する。という流れになる。

### initの種類
BSD系/System V系のOSかによって異なる

### initの代替
設計上の限界に対処するために、様々な代替が開発されてきた。
代表的なものとして

- Upstart
- systemd

がある。


# その他

### UEFI,GPTという存在について
実はBIOSはもう古くて、現在はUEFIというものに変わりつつある。
(UEFIはUnified Extensible Firmware Interfaceの略)
こいつは従来のBIOSを拡張した新しいファームウェアで、

- GUI操作をサポート
- ファームウェアが使用可能なメモリ量の上限緩和

などといった点でBIOSより優れている。

その他にもBIOSとUEFIの違いはいくつかあるが、その内のひとつとしてMBRとGPTがある。
HDDやSSDのディスクの先頭には、MBRかGPTというディスクのパーティション形式を規定する領域があり、

- BIOSでインストールするとMBR
- UEFIでインストールするとGPT

になる。システムドライブのパーティション形式は必ずこのようになり、前者をBIOSブート、後者をUEFIブートとも言う。


この辺の違いについても、後日追って書くようにしていきたい。
アイテムの運動と回転について(1)-速度のとり方と性質

この記事ではVCIのスクリプトで運動や回転をしたい場合に見て欲しいことを書いていきます。

#内容を３行で
- 速度は直接取る関数はない
- どう頑張っても正確には取れない
- 状況に合わせて工夫するしかない

# バーチャルキャストでの速度
バーチャルキャストでは、速度を直接取ることはできないので、フレームごとに位置の差分と微小時間を使って毎度割り算するしかありません。
しかし、これが安定しなくて、どうしても値が１割くらいぶれます。見た目はスムースに移動していても、です。
なのでそのまま使うとかなり挙動がばらついてしまいます。。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VCIで速度を取るとこうなった。平均値1.007,標準偏差0.095真の値は１(m/s)ほんとに１割位ブレる、、、 <a href="https://t.co/K6xcUMTwoi">pic.twitter.com/K6xcUMTwoi</a></p>&mdash; さっきのなな☆彡vket5 デフォルトキューブ (@sakkinonana) <a href="https://twitter.com/sakkinonana/status/1314179695177416704?ref_src=twsrc%5Etfw">October 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それでは困る！という方は次のような方法はいかがでしょうか。

## 移動平均を取る方法
安直に実装するとフレームでの速度を求める際には直前のフレームとの位置差分だけを使いますが、移動平均というのはその前の速度を記録しておいて（例えば５フレーム分くらい）、それらの平均をとって出力とします。
更新頻度が高くてもそこそこの頻度でそこそこの制度で出力できる方法です。
これでも動作が他の重い処理を伴う動作と競合しがちなものだったりすると、その周りだけ処理落ちして不正確になったりします。

## 長時間平均を取る方法
単純で効果が大きい方法です。１フレームごとに計算するのではなく、複数フレーム（例えば２０フレーム）の差分と時間差とで速度を計算します。
弾丸のように一度放てば等速直線運動するような物体だと使いやすいです。
速度が急激に変わったりすると不正確になるのと、更新頻度が高い場合は不正確になりがちです。

## フィルタリングをする方法
いわゆるカルマンフィルタですね。（細かいこと言うと移動平均もフィルタリングなので、ここでは直接速度を測らずに内部パラメーターの推定という意味で使っていますのであしからず）タイミングのズレをノイズ源として等速直線運動や一定の法則に従ったなめらかな運動では抜群の性能を出してくれます。
重力シミュレーターのようにある程度決まっている動きを期待している運動に合わせ込む方法としてはこれが適していると思われます。ただし、実装難易度が高いのと、せっかく物理演算あるのにaddforceを使ったあとの物理的挙動をいちいちハードコードしなければならないのは労力がかかるのがデメリットかも。

# なんでこんな事になっているんだろう・・・？
どうやら、lua側でgetPositionとかを読んだときに即座に実行されていないっぽいです。そのせいで時間を呼び出したときと位置を呼び出したときとでタイミングがずれて（処理落ちなど含む）ばらついているようです。
unityで直接ゲームを作ったりするときにはfixed updateというものがあって、それは更新の間隔が決まっているのでその関数の中で位置などを取得するのが定石のようで、現状はバーチャルキャストではこの関数にアクセスできない模様。しばらくは上記のような方法でだましだまし使うしかないですね。。もっといい方法知っている方いらっしゃいましたら教えてくださりますとみんな喜びます。
Word VBA 必ず使うシリーズ Wordの表バグの存在と対処法のツール表を作成するときに微調整のときのルーラーの単位を文字単位とミリ単位に切り替えるマクロ

表を作成するときには文字単位とミリ単位を切り替える必要があります。
そうしないと細かくずれないためです。
通常は細かすぎるので文字単位で決めるほうがはるかに効率がいいのですが、
既存の様式をWordにするときにはそうも言っていられません。
そこで、ミリ単位と文字単位を切り替える必要があります。

```vb
Sub toggleOptionUseUnitCharacter()
Options.SnapToGrid = False
Options.MeasurementUnit = wdMillimeters
Options.UseCharacterUnit = Not Options.UseCharacterUnit
End Sub
```

そして、このマクロにはもう一つ重要な役割があります。
それは表を保存するときには
`Options.UseCharacterUnit`はFalseにしたほうがいいのです。
本当はStatusBarに表示したかったのですが、実は現在のWordにはありません。
>[Word2010/2013/2016：均等割り付けが崩れる 【解決法】](http://office-qa.com/Word/wd621.htm)
「均等割り付けが、 保存して再度開くと崩れている」「均等割り付けがずれる」といった場合の回避法です（再現ファイルは末尾）
※表でよく見られます。

特にここの回避方法1
回避法(1) 〇字を使わず ｍｍを使う
というのがシンプルで有効です。
しかし、縦書きの場合はこの方法を使ってもだめみたいです。
そしてこの方法を使った場合、これを有効なままバグを起こさないようにするには、オプションを切り替えたまま保存したほうがいいようです。
そうしないと均等割り付けが崩れるどころか最悪の場合<b>不正終了を起こしてデータが飛ぶ</b>ことになります。（実際なりました）
[Word で文書が破損している場合のトラブルシューティング方法](https://docs.microsoft.com/ja-jp/office/troubleshoot/word/damaged-documents-in-word)
まあ書いてあることがちっとも役立たないのはマイクロソフトワードの伝統ですが、まだ治らないのかというのはびっくりですね。
[『文書内の表が破損しています』のようなメッセージ](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14230622504)
全部均等割がおかしくなり、それを直しているとこのようなメッセージが出て、次は不正終了するというのがWordのお家芸です。
文章だけなら起きないのですが、表だと1ページでも発生します。なので、表はまめに保存すると同時に必ず1度閉じてから開きましょう。
このときオプションを開くことなく変えるにはこのツールを使いましょう。
[iOS]モーダルを閉じる

この記事は「[[iOS]音速でモーダルを実装する](https://qiita.com/tanaka-tt/items/32004a64fcdb609c6d31)」の続きです。
モーダル開いたらモーダル閉じたいよなぁ？という記事です。

# バージョン
Swift 5.3
Xcode 12.1

# モーダルを閉じる
モーダルを閉じるにはUIViewControllerのインスタンスメソッドであるdismissを使います。

# 実装
## ファイルの追加
まず、モーダル用のViewControllerを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/2a7e3fb3-e4b9-fde1-261d-76c22460208a.png)
New File...から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/bc7f73dd-a551-f12a-dbd5-b015de7d78b8.png)
Cocoa Touch Classを選択してNextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/5ab62175-2151-4305-1400-de80183a6fd2.png)
今回はModalViewControllerという名前にしてファイルを作成します。

## ファイルとビューの関連付け
モーダル用のビューとファイルの関連付けを行います。
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/2cd8a7df-e216-b803-267a-dbda15946be3.gif)

## 閉じる用のボタンを配置
Modal用のビューにボタンを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/e9c43c2d-6920-de36-05ec-4c050dc0c87f.png)

## モーダルを閉じる関数を書く
モーダルを閉じる関数を書きます。

```swift:ModalViewController.swift
import UIKit

class ModalViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
	@IBAction func closeModal() {
		self.dismiss(animated: true, completion: nil)
	}
}
```

## ボタンと関数を関連付ける
ボタンと関数を関連付けます。

![closemodal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/2f9baf98-c7a8-d9b9-4250-07336da730e9.gif)

## 完成
完成だ！やった！！！
![modaldemo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/18e25047-4351-0d46-4abd-5367c8d9c89b.gif)


# 参考文献
- [dismiss(animated:completion:) | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss)
30代からのプログラミング勉強　2日目


ズブズブの素人(おっさん)備忘録。
学習は主にUdemyを活用。
ブラックフライデーで講座が安い。明日の休みを利用して色々と探して見たいと思う。

##学習内容

[HTML/CSS/JavaScript] フロントエンドエンジニアになりたい人の Webプログラミング入門

１日目の続き。本日は短時間で切り上げとなった。
コロナ禍の今、体調管理は大事。


学習したタグなど

    <!DOCTYPE html> 規格。html5はこれ
    <html>   この辺ちゃんと書かないと

    <head>   文字化けしたりする
        <meta charset=""> 近年はUTF-8が一般的（文字）
        <meta name=vieport" content="width=device-width"> 表示される幅
    <title></title> ブラウザのタブの所に出るタイトル
    </head>　
    　　　
    <body>
    この中にサイトの中身のコードを書く
    </body>
    </html>
現状はこの様な決まりごとがありきちんとそれに習わないと文字化けを起こしたり正しく表示されないという事が学習出来た。

その後CSSに差し掛かったところで体力が尽きる。

##所感

【>】を1つ入力するのを忘れてエラーになったりと実際に手を動かしてみてわかる事も多い。継続的に学習と復習を繰り返し、アウトプットしていこう。

ブラウザのタブの表示など普段何気なく目にしているものがどの様にして作られているのかを知ることができるのもまたプログラミングの面白さかもしれないと感じた。
静的サイトジェネレーター　Gatsby.js　入門

#Gatsby.js入門
第１回は、Gatsby.jsのインストールの仕方について書いていこうと思います
##Gatsby.jsを利用するための準備
開発環境の用意
・Node.js(nvm)
・yarn
・git

のインストールが必要です
インストールの仕方については、次の記事を参照してください

##Gatsby CLIをインストールする
`yarn global add gatsby-cli`
と入力して、Gatsby.jsをインストールしていきます。

#スターターをダウンロードしてみる
`gatsby new`
と入力して、サイトを構築していきます。

入力すると、プロジェクト名と使用するスターターを聞いてくるので、自分にあったプロジェクト名とスターターを選んであげましょう。

※スターターについては、https://www.gatsbyjs.org/starters/?v=2
を参照してみてください

ダウンロードできたら、`cd プロジェクト名`でプロジェクトフォルダに移動し、`gatsby develop`で開発サーバーを起動してみます。

開発サーバーが起動したら、URLからページに飛んでページの表示を確認してみましょう！

##サイトを公開する
`gatsby build`と入力するとpublic/フォルダにサイトのデータができあがります。
これを公開すればサイトの公開は完了です。

※ちなみにビルドしたサイトの表示を確認する場合、`gatsby serve`と入力するば、ビルドしたサイトを確認することが可能です。

参考文献：Webサイト高速化のための静的サイトジェネレーター活用入門　GatsbyJSで実現する高速＆実用的なサイト構築
Blocked hostのエラー対処方法

#結論
rails sコマンドを実行した際に起きたBlocked hostエラーでこの解決策がベストかは判断しかねますが、私はこれで対処できたので載せておきます。
##エラー対処法
application.rbにホワイトリストに許可したいhostを記述します。

```config/application.rb
config.hosts << 'example.com'
```

example.comにはエラーで起きたTo allow requests toに続くhostを入れてください。
これでとりあえずは動くようになります。