OmniAICreator/Qiita-1.07M huggingface dataset:
LINE BOTで天気を返すサンプルがngrokで動いてnowで動かない件


[こちらのサンプル](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)がngrokで動いて、Nowだとうまく動かない件の対応。

axiosを使って別のサーバーにリクエストを出してるので非同期処理のあたりが怪しいですね。

## もとのコード

これだとngrokでうまく動くけど、now上でうまく動かないというレポート

```server.js
・
・
省略
・
・

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  let mes = ''
  if(event.message.text === '天気教えて！'){
    mes = 'ちょっとまってね'; //待ってねってメッセージだけ先に処理
    getNodeVer(event.source.userId); //スクレイピング処理が終わったらプッシュメッセージ
  }else{
    mes = event.message.text;
  }

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: mes
  });
}

const getNodeVer = async (userId) => {
    const res = await axios.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=400040');
    const item = res.data;

    await client.pushMessage(userId, {
        type: 'text',
        text: item.description.text,
    });
}

・
・
省略
・
・
```

## 書き換え

replyとpushのタイミングを変えてみる。

```server.js
・
・
省略
・
・

async function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  //"天気教えて"以外の場合は反応しない
  if(event.message.text !== '天気教えて') {
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: '"天気教えて"と言ってね'
    });
  }

  let mes = '';
  mes = 'ちょっと待ってね'; //"ちょっと待ってね"ってメッセージだけ先に処理
  await client.replyMessage(event.replyToken, {
      type: 'text',
      text: mes
  });

  //axiosを使って天気APIにアクセス
  const CITY_ID = `400040`; //ライドアのAPIから取得したいシティのIDを
  const URL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;
  const res = await axios.get(URL);
  const item = res.data;
  return client.pushMessage(event.source.userId, {
      type: 'text',
      text: item.description.text,
  });
}

・
・
省略
・
・
```

## おまけ: 関数分けサンプル

関数に分けるとこんな感じ。

```server.js
・
・
省略
・
・

async function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  //"天気教えて"以外の場合は反応しない
  if(event.message.text !== '天気教えて') {
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: '"天気教えて"と言ってね'
    });
  }

  let mes = '';
  mes = 'ちょっと待ってね'; //"ちょっと待ってね"ってメッセージだけ先に処理
  await client.replyMessage(event.replyToken, {
      type: 'text',
      text: mes
  });

  const CITY_ID = `400040`; //ライドアのAPIから取得したいシティのIDを
  return getWeather(event.source.userId, CITY_ID);
}

const getWeather = async (userId, CITY_ID) => {
  //axiosを使って天気APIにアクセス
  const URL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;
  const res = await axios.get(URL);
  const item = res.data;
  return client.pushMessage(userId, {
      type: 'text',
      text: item.description.text,
  });
}

・
・
省略
・
・
```
docker-composeで起動したプロセスのUID、GIDをホストユーザと同じにする

dockerは本当に便利で、何でもdockerで開発をしています。
でもちょっと不満があるとすれば、コンテナの中のユーザと、ホスト側で実行したユーザのUID/GIDが異なるため、
コンテナ内のユーザがvolumeマウントして生成するファイルが、ホスト側のユーザパーミッションで書き換えられない
というのが不満でした。

# どう解決するのか
この環境はプロダクション環境で使うのではなく、あくまで開発環境で使用することを想定しています。
nodeのオフィシャルイメージだと最初からnodeユーザが登録されているので、
コンテナ内で何かしら動かす際にnodeユーザで実行することを想定しています。
悩んだ挙げ句、とりあえず落ち着いたのは以下。

### ホストユーザのUID、GIDを環境変数としてコンテナに渡す
.envファイルを作成し、以下のような情報を記述。
記述する際にはシェルスクリプトを準備して作成。

```bash:make_env.sh
#!/bin/bash
set -eu
cat <<EOT > .env
LOCALUID=`id -u`
LOCALGID=`id -g`
EOT
```

生成されたファイルは以下な感じ。

```bash:.env
LOCALUID=1003
LOCALGID=1003
```

### entrypointでUID/GID を変更する
nodeのオフィシャルイメージだと最初からnodeユーザが登録されている。
コンテナ内で何かしら動かす際にnodeユーザで実行する。

```bash:entrypoint.sh
#!/bin/bash
set -eu

# 一時的なグループを作成
groupadd -g 11111 tmpgrp

# nodeユーザを一時的なグループに一旦所属させる
usermod -g tmpgrp node

# もともと所属していたnodeグループを削除
groupdel node

# ホストユーザのGIDと同じGIDでnode グループを作成
groupadd -g $LOCALGID node

# nodeユーザのGID をホストユーザのGIDに設定
usermod -g $LOCALGID node

# nodeユーザのUID をホストユーザのUIDに設定
usermod -g $LOCALUID node

# 一時的に作ったグループを削除
groupdel tmpgrp

su node
exec "$@"
```

### 結果
以下のようなdocker-compose.yamlを作成して実験。

```yaml:docker-compose.yaml
version: "3"

services:
  node:
    image: node:lts-buster-slim
    volumes:
      - ./app:/app
      - ./entrypoint.sh:/entrypoint.sh:ro
    entrypoint: /entrypoint.sh
    env_file:
      - ./.env

```

無事ホストユーザと同じUID/GIDに変更されていることが確認。

```
$docker-compose run --rm node bash
node@e9aa2121a23f:/$ id
uid=1003(node) gid=1003(node) groups=1003(node)
node@e9aa2121a23f:/$ 

```

一人で自マシン上で開発しているのならUID/GIDが1000でコンテナ内のUID/GIDも1000で同じだから気にしなくても
良いかなと思うのですが、会社内で共有PC上で開発していると、UID/GIDの1000じゃなくなるのでちょっと困っていました。
これをベースイメージとして社内で使えば、root権限を与えなくてもコンテナが生成したファイルやディレクトリを
ホストユーザが編集・削除できるようになりそうです。
Vue Internals②watcher　2-2実際の動き

#はじめに
前回はwacherの生成とwacther↔depsが追加されるタイミングについてみていきました。
今回は実際にmessageに新しい値を入れてどのような動きをするか見ていきましょう。

#実際の動きを見ていく
vm._data._message="test"とconsoleに入力してデバッグを開始します。
するとmessageのsetterが起動してvm.messageが"test"になり、dep.notify()へ
![messageSetter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/1aa0e332-3b4e-6fb6-5695-299f7c592832.png)
![dep.notify().png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/9259771f-1168-1334-9feb-df7ddcf56d33.png)

まず一つ目のcomputedのwatcher.update()
![wacther.update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/b14ade31-e745-d9e5-8d1d-14a539175466.png)
computedのwacther.lazy=trueだったのでdirty.trueにするだけです。
二つ目の全体のwactherはqueueWactherに行きます。
ただ、処理が複雑なうえに、本筋とはほとんど関係ないのでここは飛ばします。
そのまま全体のwacther.run()→wacther.get()へ
![wacther.run().png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/02bcc5bf-f87e-6796-b418-ff2489a535c8.png)

wacther.get()周りの動きは前回やりました。
今回のpushTargetやらpopTarget()、dep.depend()はすでにmessageのdepが二つのwatcherに、wactherのdepsにはmessageのdepがもう入っているため特に何もしません。

全体のwatcherのgetterなのでvm._update(vm._render())へ

![computedGetter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/5e4f5f3f-ff6f-0dc5-925e-0d68233c1863.png)

comp_messageのgetterであるcomputedGetterが呼ばれ、computedのwatcherをdirtyに設定していたのでwacth.evaluate()へ

wacth.evaluate()→wacther.get()→comp_message()→messageのgetterの流れで進み、messageのgetterからvalueである"test"が返ります。
comp_message()からは"comp　test"となって返り、
watcher.evaluate()に戻ってcomputedのwatcher.valueが"comp　test"に。

そして

```js
(function anonymous(
) {
with(this){return _c('div',{attrs:{"id":"vue_example"}},[_v("\n  "+_s(comp_message)+"\n")])}
})
```
ここのcomp_messageが"comp_test"になり、後の処理は①astを中心にとほとんど同じで、違いはvm._updateのdiffアルゴリズムだけです。
このdiffアルゴリズムは④diffアルゴリズムでやっていきましょう。

ここまでで②wactherは終わりです。
次回からはv-系の処理について見ていきます。
Rails6.0でYoutubeDataAPIv3を使う

プログラミングの練習がてら、愛しのホロライブのチャンネル、動画情報をyoutubeのapiを利用して表示しようと思ったときに、以前YoutubDataAPIを利用した時と勝手が変わっていたので、改めて実装方法を備忘として残しておこうと思います。

## 開発環境
- CentOS 7.6
- Ruby 2.5.3
- Ruby on Rails 6.0

# 準備
### APIキーを取得する
APIを利用するためにはAPIキーを準備する必要があります。
これはこれで説明がいるほどめんどくさいのですが、ググればいくらでも出てきますので調べてみてください。説明するのがめんどくさいわけではないです。説明するのがめんどくさいわけではないです。

一応良さそうな記事をお借りさせていただきます。
[YouTube APIキーの取得 (2020/03/25時点)](https://qiita.com/iroiro_bot/items/1016a6a439dfb8d21eca)

### Gemをインストールする
Railsプロジェクトの中のGemfileの中に以下を追記してbundle installする。

```ruby:Gemfile
gem 'google-api-client'
```

### (必要があれば) 環境変数の設定をする
APIキーを使うとyoutubeのパーソナルな情報が利用できるのですが、逆に言うと悪用すると他人のパーソナルな情報を引き出せるということになるので、GitHubなどにソースをコミットした時に意図せずAPIキーを公開してしまわないように別で管理する必要があります。
というわけで、環境変数を利用してコミットされるソースの外側でAPIキーを管理します。
ただしAPIを触るというだけなら必要ない手続きになるので、必要のない方はスルーしてください。

まずは以下のをGemfileに以下のコードを記述し、bundle installする。

```ruby:Gemfile
gem 'dotenv-rails'
```
こちらのGemは環境変数を利用しやすくしてくれる優れものです。

次にAPIキーを管理するファイルを用意します。
.gitignoreというファイルと同じところ(おそらくプロジェクトの直下)に.envファイルを作成し、中にAPIキーの情報を記入します。

```..env
YOUTUBE_DATA_API_KEY=APIキー
```

管理ファイルを作成したらそのファイルをコミットの対象外にします。
.gitignoreファイルに設定するとそのファイルはコミット対象外になるので、.envを追記します。

```ruby:.gitignore
# 追記
.env
```
これで環境変数の準備完了です。

# いざ
### YoutubeDataAPIに接続するためのインスタンスを準備
APIを使うたびにインスタンスを生成する必要はないので、イニシャライザーで生成します。というわけで/config/initializersディレクトリにそれ用のファイルを作成します。ファイル名は仮にyoutube.rbとします。

```ruby:/config/initializers/youtube.rb
require 'google/apis/youtube_v3'

API_KEY = ENV['YOUTUBE_DATA_API_KEY']

def get_youtube_service
  
  service = Google::Apis::YoutubeV3::YouTubeService.new
  service.key = API_KEY

  return service
end
```
これでAPIにアクセスできるインスタンスを取得できるメソッドが用意できました。
ちなみに環境変数設定をしていない方は、ENV['YOUTUBE_DATA_API_KEY']の個所をAPIキーに置き換えてください。

### ようやっと使用。
お使いのコントローラー等で、先ほど用意したメソッドでインスタンスを取得し、用意されたメソッドで情報を持ってきます。下記ではチャンネル情報を取得しています。

```ruby:使用例
# インスタンスを取得
youtube = get_youtube_service
#APIに接続して、目的の情報を取得する
channel_data = youtube.list_channels("snippet,brandingSettings", id: "UCDqI2jOz0weumE8s7paEk6g")

#インスタンスに情報を詰める
@member = Member.new
channel = channel_data.items.first
snippet = channel.snippet
branding_settings = channel.branding_settings
@member.channel_id = channel.id
@member.channel_name = snippet.title
@member.icon = snippet.thumbnails.high.url
@member.banner = branding_settings.image.banner_image_url

return @member
```
@memberのモデル構造は察してください。

今回は我が愛しのロボ子さんのチャンネル情報を取得しました。
取ってきた情報は結構な入れ子構造になっていて、そこんとこをわかっておかないと利用するのは結構きついです。具体的な話は公式のリファレンスを参照するのがいいと思うのでそちらをご確認ください。
ただし若干情報が古いらしく、たまに使えない箇所があります。
[公式リファレンス](https://developers.google.com/youtube/v3/docs?hl=ja)

チャンネル情報以外の情報を取るときは、今回イニシャライザーでrequiredしている'google/apis/youtube_v3'のソースを直接参照するのが速いと思います。
（他にいいやり方があれば是非教えてください。。。）
OSごとに保存先は違うとは思いますが、私自身の備忘も兼ねて参考程度に載せておくと以下のようになります。
/home/(ユーザー)/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/google-api-client-0.37.2/generated/google/apis/youtube_v3/service.rb

以上です。
何か不備があればコメントやご連絡をいただけますと幸いです。
Search For Filesの使い方_3

# Seach for Files

##0.設定方法

"開発タブ"→Visual Basicをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/e3bc7dc5-98d6-febf-4afa-75220276005b.png)

コードが表示される（表示されない場合、"標準モジュール"内"Module1"をクリック）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/4db303c1-40fa-da97-6c13-8b48189a8644.png)

4か所修正する必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/675b7678-5689-4523-29fb-967495c48641.png)

①初期フォルダパスの指定
取得したいファイルの入っているフォルダを指定する
ここを変えることで下記部分が変更されるので、いちいちフォルダを変える必要がなくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/04648329-db5e-0853-82a4-0ee4dce417fe.png)

②リンクを書き込むセルの初期化
pdfファイルのリンクを書き込むセル列を指定する
今回は"C列の2行目"から書き込むため、"C2:C"と記載
もし下記のような場合、"D3:D"と記載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/2ea61d69-40e0-2ca4-dd7a-83312c54d42d.png)

③読み取るセルの指定
会社IDなどのキーワードが記載されているセル列の始まりを指定する
今回は"B列の2行目"から読み取るため、Range("B2", Range("B" ~
もし下記のような場合、"Range("C3", Range("C" ~"　と記載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/57889ae6-b18b-07a0-4ae1-719caa13addc.png)

④リンクを書き込むセルの指定
実際にリンクを生成させるセルの指定をする
※②で行ったように直接セルを指定するわけではないので注意
今回は"B列"にあるキーワードを"C列"にリンクを生成するためオフセット値を"1"に設定
もし下記の場合、"2"と記載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/dd1bb0c4-8136-e4cd-ea8c-6d7ea58ed159.png)
コードを書くときの工数の見積もり方

# 概要
後輩に「どうやって工数見積もってますか？」と尋ねられて回答したことがあって、自分用にまとめた。

## 今から対応する場合
### 自分がやることを洗い出す
仕事を依頼されたら、設計書を読んで理解するところから、実装して動確してプルリクエストするまでに自分がやることを全部洗い出す。
他人が動作確認・レビューする時間は含まない。レビューを待っている時間も含まない。

#### 洗い出す粒度

人による、仕事によるだろうけど、最近は「Controller作成」「FormType作成」くらいの単位。 今関わっている仕事では、ソースレビューをしあう習慣がない(仕様を満たすかどうかのチェックはある)のでレビュー後の修正はほぼ見積もってない・・・。
社会人1年目の案件では、プルリクエスト後にしっかりレビューし合う習慣があり、コードの書き方や自分のミスで指摘される頻度が多いだろうと予想できたので、

```
工数見積もり→実装方針を決める→実装→リファクタリング→動作確認→プルリクエスト→レビュー後の修正→プルリクエスト2回目
```
くらいの粒度だった。`実装`の部分はもう少し細かくしてたかも。

### 各タスクの工数を見積もる
やることを洗い出したら、各項目ごとに何時間くらいかかりそうか数字として出していく。この合計が見積もった工数になる。
入ったばかりの案件とか、初めて工数見積もるときは予想より多かったり少なかったりするけど、それでOK。
徐々に精度をあげていくこと、**予定工数より大幅に工数がかかりそうなことが分かったときにすぐに上長や周りに伝えること**が重要...だと思う。

#### 見積もったらN倍することで割り込みタスクを許容する
設計やお客とのやり取りがメインであるAさんは「自分が最初に見積もった工数を3～5倍にしてそれを予定工数としている」と言っていた。客とのやり取りとか、他の人からの質問とか、割り込みのタスクが多いからそれでちょうどいいみたい。
私もそれを見習って初めは3倍くらいにして計算していたけど、基本的に毎日調査と実装をしていて割り込みタスクが少ないので今は3～5倍にすることはあまりない。
未知のタスク(使ったことのないライブラリを導入するとき等)は3～5倍にすることが多い。

#### 工数を記録して見積もりの精度を上げる

私の場合、スプレッドシートに「見積もった工数」「実際にかかった工数」を毎回記録している。

最近人に見せるために作っていないのでめちゃくちゃだけど、こういう感じ・・・。こうやってスプレッドシートで管理し始めた頃は、上長に共有して進捗管理していたのでもう少し丁寧にする必要があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/ac59e4c9-2150-696a-4afc-2761f6de0b8f.png)


A～G列にやることを書き出し、かかる工数を入力し、それを合計する。実装時に自分が忘れそうなこと、懸念していることを備考にメモしたりする。

実際にかかった工数は、H列以降に直接数字を入力したり、E列の値を使って算出する。ここらへんは本当に適当。マメなひとに怒られそう。

ステータス欄を埋めないまま実装完了していることが多いので、不要かもしれない。でも金曜の夜とかにどこまで進んだか記録しておくと、月曜にどこまでやったっけ？何やってたっけ？ってなりにくくなっている・・・かも。

記録しておくと、次回以降それを参考に見積もることができる。

```
例
・注文明細PDF出力機能は50hかかった。見積書PDF出力機能は注文明細PDF出力機能を流用できるから、注文明細のときよりかなり工数減らして8hくらい
・注文履歴ページは、お気に入りリストページと同じレイアウトだから流用できる。閲覧履歴ページを実装したことがあるけど少し処理が違うから16hくらい
```

## まだ対応しない場合

「全体であとどれくらいかかりそうか？」とスケジュール把握したいとき、着手するのはまだまだ先の仕事でも、かかる工数を見積もる必要がある。
その場合は、やることの洗い出しはせずに、わりとざっくり見積もっている。
半日、1日弱、1日、3日、etc...

着手開始するときに、改めてやることを洗い出して見積もり直す。
それまでにこなした仕事で実装方針がすぐ決められるようになっていたり、ライブラリの使い方の調査が済んでいたりするので、最初に見積もっていた工数よりぐっと減らせることがあるから。
逆に、最初に想定していたよりも予定工数が増えることもある。そういうときは早めに周囲に伝える必要がある。
クラスとインスタンスで使うメソッドなど

##ゲッター
あるクラスのインスタンスのインスタンス変数の値を返すだけのメソッドのことです。これを定義することで、インスタンスから自身の持つインスタンス変数の値を取得することができます。
【例】MovieクラスとTicketクラスがあるとします。

```movie.rb
class Movie
  def initialize(title, fee, start_date, end_date)
〜省略〜
  end

  def title  #ここから
    return @title
  end

  def fee
    return @fee
  end   #ここまでがゲッターの定義です
end
```
```ticket.rb
class Ticket
  def initialize(movie)
    @title = movie.title   #movieクラスのインスタンス.titleで参照できます
    @fee = movie.fee   #movieクラスのインスタンス.feeで参照できます
  end
end
```
インスタンスは自身のインスタンス変数titleやインスタンス変数feeの値を返します。つまり、movieクラスのインスタンス.titleなどとすることで、それぞれの値を取り出せるようになったのです。
##require
あるファイルから他のファイルの記述内容を参照するためのメソッドです。
例えばhoge.rbとfuga.rbいうファイルがあった時、fuga.rbにrequire "./hoge"と書くことでfuga.rbにhoge.rbの記述が書かれていることにしてくれます。
なぜまとめて書かないかというと、クラスの中身が大きくなってきた時に不便で、細かく分けると管理しやすいからです。
【例】

```xxx.rb
require './movie'
require './ticket'
```
##Dateクラス
【例】

```xxx.rb
require './movie'
require './ticket'
〜省略〜
oceans_eleven = Movie.new(
                          "Ocean's Eleven",
                          1800,
                          Date.new(2020, 4, 4),
                          Date.new(2020, 6, 4)
                )
```
Date.new()は日付を表現するためのクラスです。Dateクラスを使って日付を扱えば、うるう年など日付関連の計算が楽になります。Dateクラスを利用するには明示的にrequireを使って読み込む必要があります。
Dateクラスのインスタンスには、第一引数から順に年、月、日の順で数字で値を渡します。
[Rubyの公式ドキュメント](https://docs.ruby-lang.org/ja/latest/method/Date/s/new.html)
##セッター
インスタンス変数の値を更新するためのインスタンスメソッドです。
【例】セッターを使用せずに値を更新する場合

```yyy.rb
  def initialize
    @movies = []
  end
```
```xxx.rb
   @movies = 更新したい値
```
【例】セッターを使用し値を更新する場合

```yyy.rb
  def initialize
    @movies = []
  end

  def movies = (movies)   #セッターを定義してます
     @movies = movies
  end
```
```xxx.rb
   yyy.moveis = [A,B,C]
```
「=が一つの代入式」に見えるのは、メソッド名に=が含まれていたからです。Rubyはメソッド名であっても半角スペースを無視するため、このようなことができます。
##self
例えば映画の選択肢が出て、どれかを選択できる状態にできるとします(今回は1つしか設定していませんが、)。メッセージを出すためにputsメソッドを、ユーザーが選択肢を選べるようにgetsメソッドを使います。

```
puts "どの映画を見ますか？"
    i = 0
    self.movies.each do |movie|
      puts "#{i} #{movie.title}: #{movie.fee}円"
      i += 1
    end
    gets
```
インスタンスメソッドの中でselfと書くと、そのインスタンスメソッドを使っているインスタンス自身を参照できます。
つまり、self.moviesの返り値は今回の場合xxx.rbにある[oceans_eleven]となります。その後、eachメソッドで一つ一つのmovieが参照され、それぞれのタイトルと金額が並んで表示される形になります。

```yyy.rb
class Yyy
  def initialize
    @movies = []
  end

  def movies
    @movies
  end

  def movies=(movies)
    @movies = movies
  end

  def display_menu
    puts "どの映画を見ますか？"
    i = 0
    self.movies.each do |movie|
      puts "#{i} #{movie.title}: #{movie.fee}円"
      i += 1
    end
    gets
  end
end
```
##attr_accessor
ゲッター、セッターを簡単に定義できるメソッドです。
【例】

```
class Dog
  attr_accessor :name, :type, :age
end
```
以下の定義と同様の意味合いです。
【例】

```
class Dog

  def name
    @name
  end

  def name=(name)
    @name = name
  end

  def type
    @type
  end

  def type=(type)
    @type = type
  end

  def age
    @age
  end

  def age=(age)
    @age = age
  end

end
```
標準機能：ログインフローを利用してSSO以外のログインユーザをブロックする方法！

# はじめに
　お客様の要望として、一般ユーザなど特定のユーザがSSO以外の方法でログインした場合、ログインできない仕組みがないかということで、以前から標準機能として提供されていたログインフローについて検証しました。

# ログインフローとは
　目的やユースケース、制約事項は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/8300823c-c63e-d517-c26d-040deaa15f49.png)

# ログインフローの入力情報
　ログイン方法毎に変数に設定される情報をまとめました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/b16b7d5c-0cf4-67be-4607-d19349a25293.png)

# ログインフローの設定
　ログインフローの設定は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/553a765d-2b4e-4b85-cce0-9ef6d2b36041.png)


# 結果の確認
　ＳＳＯと標準ログインの２パターンで確認した結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/be5d5737-16d8-cdf7-468d-b2335c73d01a.png)

　フローからログインフローの変数情報を確認したところ、アクションの実行ユーザはログインユーザであることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/18f7a249-ba8b-2ef9-07e8-e4883adce536.png)

# まとめ
　これまで、ログインフローの目的から結果の確認まで説明しました。
　結果の確認では、正常にＳＳＯ以外のログインユーザがブロックされたとを確認できました。
　ログインフローは、複雑なポリシーの実行以外にもユーザ毎に初期表示画面を指定することができます。
　ユーザ毎に組織にアクセスする前に実行できるアクションが増えたことで色々なことができそうですね。
　では、
Laravelで Target class [App\Http\Controllers\***] does not exist. エラー!

#Laravel6 あるある言いたい#
コピペでルーティングとコントローラを増やして、ついついやっちまうミス。
えぇ〜なんでぇ〜ってなります。

**以下を確認しよう！**
１．　コントローラのnamespaceのパスが違う。
コントローラのnamespaceが違うとClassを見つけられません。
パスがあっているか確認しよう。
これが一番あります。

２． 複製したコントローラのエクステンドしているパスが違う
管理画面を作ったりすると、Contoller.phpとは別に管理画面用にBaseControllerのエクステンドを作っていたりする事あれば、そこも確認しよう。

３．　ルーティングのスペルミスかパスが違う
コントローラのパスとスペルミスを確認しよう。
artisan route:list でエラーがでなくなるまで、
web.phpのルーティングの記述を1行1行コメントアウトして、間違い箇所を特定しましょ。

4．　コントローラーに記述した use App\Xxxx\xxxxのパスで大文字小文字違いが原因でエラー
ローカルでは動くのにサーバーで動かない場合は、大文字小文字違いがあると疑ったらいい。

これくらいですね。
凡ミスで時間とられないように、気をつけましょ。
deno v0.38.0の変更点まとめ

https://github.com/denoland/deno/releases/tag/v0.38.0

denoのv0.38.0がリリースされたため、変更点をまとめます。

# 新機能

## `deno doc`コマンド

引数として与えたファイルのソースコードを解析し、そのドキュメントを生成してくれます。

```sh
 # std/http/server.tsのドキュメントを表示
 $ deno doc https://deno.land/std@v0.37.1/http/server.ts
 
 # ドキュメントをJSON形式で表示
 $ deno doc std/encoding/csv.ts --json
```

https://github.com/denoland/deno/pull/4500

## Chrome DevToolsサポート

Chrome DevToolsを使用してデバッグが出来るようになりました。

`deno run`を実行するときに`--inspect`を指定するとInspectorが起動します。

```
$ deno run --allow-net --allow-read --inspect https://deno.land/std@v0.38.0/http/file_server.ts
```

`chrome://inspect`のRemote Targetの欄からinspectをクリックすると、Chrome DevToolsが開くので、そこからデバッグができます。

https://github.com/denoland/deno/pull/4484

## Unixドメインソケットのサポート

Unixドメインソケットがサポートされました(未検証です)

https://github.com/denoland/deno/pull/4176

## queueMicrotask.d.ts

@keroxpさんにより、`queueMicrotask`関数の型定義が追加されました。

例えば、下記のようなコードのコンパイルが通るようになります。

```typescript
queueMicrotask(() => {
  console.log("Hello"); 
});
```

https://github.com/denoland/deno/pull/4477

## `window.close`の実装

https://github.com/denoland/deno/pull/4474

# その他の変更点

## `console.log`でオブジェクトを表示する際の挙動が改善された

今までは、オブジェクトを`console.log`で表示しようとすると、ネストされたオブジェクトが省略されました。

v0.38.0でNode.jsと同様の挙動をするように修正され、ネストされたオブジェクトも表示されるようになりました。

https://github.com/denoland/deno/pull/4425

## `Deno.fsEvents`に不正なパスを指定するとパニックする問題が修正された

https://github.com/denoland/deno/pull/4488

## `Deno.inspect`の第2引数として渡すデータ型が`ConsoleOptions`から`InspectOptions`にリネームされた

https://github.com/denoland/deno/pull/4493
ユニバーサルリンク（UniversalLinks）iOS13以降でのコールバックメソッド

 **ユニバーサルリンク（UniversalLinks）経由で起動した場合、呼ばれるメソッドがiOS13以降では違います。**

##### iOS12までは

```AppDelegate.swift
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {}
```
    
##### iOS13以上は

```SceneDelegate.swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {}
```


 **記載するファイル**と**関数名**が違います。
Firebaseとか、UniversalLinksの機能を使用しているドキュメントは更新してほしいとこです。
railsでのcsv形式ファイルの出力、入力

#CSVファイルとは
CSVファイルとはモデルのインスタンスの中身を外部へ出力したり、外部から入力するのに必要。具体的にいうと、出力は他のソフトウェアに出力するために使い、入力は他のソフトウェアからの大量データの一括などに使われる。

#####準備

```ruby:config/application.rb
require 'csv'
#アプリ全体でcsvが使えるようにライブラリを取り入れる
```

#インスタンスの中身をCSV出力する方法
今回の例ではtaskモデルの全インスタンスの中身をCSVファイルで出力する

```ruby:models/task.rb
#この関数ではcsv_attributesという配列変数を定義
  def self.csv_attributes
    ["name", "description", "created_at", "updated_at"]
  end

#CSV形式でインスタンスの中身を出力できるようにする
  def self.generate_csv
    #ここでcsv形式の配列csvを定義する、csv形式の配列に代入していくと列ベクトルができる？
    CSV.generate(headers: true) do |csv|
      #まずこのcsvに上記で定義したcsv_attributesを1行目として代入
      csv << csv_attributes
      all.each do |task| #taskを一つ一つ取り出して
        #csvの次に行にtaskの値を代入していく
        csv << csv_attributes.map{ |attr| task.send(attr) }
      end
    end
  end
```

↓
定義したgenerate_csvを読み出すためにcontrollerに記述する

```ruby:tasks_controller.rb
  def index #名前付きURLは/tasks
    .
    .
    .

    respond_to do |format| #この意味はURLのformatによって、新たに変更を加えるよという意味
      format.html #format.htmlの場合は、つまりURLが/tasksの時はという意味。format.htmlの後に処理が書かれていないため何もせず画面遷移する
      format.csv { send_data @tasks.generate_csv, filename: "tasks-#{Time.zone.now.strftime('%Y%m%d%S')}.csv" }
    #format.csvの場合は、つまり/task.csvになっている場合はという意味。その場合は後述の処理をする。ここではsend dataをしているので、データをブラウザからダウンロードされるようにしている
    end
  end
```

↓
では/task.csvでアクセスするにはどうしたらいいのか。以下のようなリンクならアクセス可能

```ruby
= link_to 'エクスポート', tasks_path(format: :csv), class: 'btn btn-primary mb-5'
```

#CSVデータを入力してデータ保存する方法
モデルファイルの中で受け取った値をデータとして保存する関数を定義する

```ruby:models/task.rb
  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row| #受け取ったCSVファイルを行ごとに取り出す、その時1行目headerには項目が書いてあるので、1行目は無視する
      task = new #Task.newと同価
      task.attributes = row.to_hash.slice(*csv_attributes) #taskの属性に順番にデータを格納していく。詳しくは調べてください
      task.save!
    end
  end
```

↓
controllerの中で入力保存してリダイレクトするためのアクションを作る

```ruby:tasks_controller.rb
  def import 
    current_user.tasks.import(params[:file])  #現在のuserのtaskにimportを発動させる
    redirect_to tasks_url, notice: "タスクを追加しました"
  end
```

ちなみにimportの読み出し方がcurrent_user.tasks.importの理解が意外と難しいのでメモ。モデルファイルの中でself.メソッド名で定義したメソッドはクラスメソッドとなるため、インスタンスではなくても使用できる。
↓
現在taskモデルはuserモデルに従属しているのcurrent_user.tasksとすることで、今のユーザーのタスクモデル(クラス)のメソッドとして使用している。参考文献は[Railsのmodelクラスのselfが曖昧だったので](https://qiita.com/suzuki-koya/items/1553c405beeb73f83bbc)

↓
ルーティング設定

```ruby:routes.rb
  resources :tasks do
    post :import, on: :collection 
  end
```

c写真など大きなデータはURLにidとして挟み込めないので、collecionを使用することで、URLの引数として受け取れるようになる

↓
入力画面設定

```ruby
= form_tag import_tasks_path, multipart: true, class: 'mb-5' do
  = file_field_tag :file
  = submit_tag "インポート", class: 'btn btn-primary'
```

この入力でファイルを追加する時は拡張子が.csvになっていることを確認してからやりましょう。
【自分メモ】C#でランダム整数を生成しよう

#はじめに
急にC#を齧ることになり、細々と学習をしています。
文法理解がマジでできない底辺の寝言レベルのメモ。

##環境
・Windows
・Microsoft Visual Studio Enterprise 2017(version 15.9.)
・.NET Framework(version 4.8.03761)

##配列の宣言
```C#:test.cs
//Random
Random r = new System.Random();

//100個のint型要素が入る配列を生成。
int[] arr = new int[100];

//1~100までの整数をランダムに生成し、配列に格納する
for (int i = 0; i < arr.length; i++) 
{
     arr[i] = r.Next(0, 100);
}
```

#まとめ
またひとつかしこくなりました。
京大理学部 物理科学課題演習 C1 （その１０）

#数値積分

　次のような定積分の値を数値的に求めてみましょう。

$$I = \int_a^b f(x) dx$$

数値積分の方法は様々なものが考案されていますが、ここでは簡単な**台形公式**と**シンプソンの公式**を解説します。なお今回のプログラムは `for` ループを回して和を取るだけですから、プログラム例は省略します。各自で課題に挑戦してください。

###台形公式

　まず積分区間を $n$ 等分し、$(x_0, f(x_0)),\ (x_1, f(x_1)), \cdots (x_n, f(x_n))$（ただし $x_0 = a,\ x_n = b$）から積分値を求めます。このとき $(x_i, f(x_i))$ と $(x_{i+1}, f(x_{i+1}))$ の2点間の $f(x)$ を1次式（直線）で補間近似して積分値を求める方法を台形公式とよびます。$(x_i, 0)$, $(x_i, f(x_i))$, $(x_{i+1}, f(x_{i+1}))$, $(x_{i+1}, 0)$ の4点で囲まれた部分の面積 $I_i$ は

$$I_i = \frac{1}{2}h(f(x_i) + f(x_{i+1})),\ \ \ \ \ h = \frac{b-a}{n}$$

ですから、求める積分値は

$$I = \sum_{i=0}^{n-1} I_i = \frac{1}{2}h(f(x_0) + 2(f(x_1) + \cdots + f(x_{n-1})) + f(x_n))$$

となります。

###シンプソンの公式

　この公式は台形公式と同様に、まず積分区間を $n = 2m$ 等分します。そして連接する $(x_{2i}, f(x_{2i}))$, $x_{2i+1}, f(x_{2i+1})$, $x_{2i+2}, f(x_{2i+2})$ の3点間を、今度は2次式で近似することによって積分値を求めます。ラグランジュの2次の補間公式を用いると

$$I_i = \frac{1}{3}h(f(x_{2i}) + 4f(x_{2i+1}) + f(x_{2i+2})),\ \ \ \ \ h = \frac{b-a}{n}$$

となるので、求める公式は

$$I = \sum_{i=0}^{m-1} I_i = \frac{1}{3}h(f(x_0) + 4\sum_{i=1}^{m}f(2_{2i-1}) + 2\sum_{i=1}^{m-1}f(x_{2i}) + f(x_{2n}))$$ 

となります。

　ちなみに、同様に一般に積分区間を $n = km$ 等分し、隣接する $k + 1$ 個の点を通る $k$ 次式で近似して積分値を求める方法を**ニュートン・コーツの公式**とよびます。

##課題

　次の3つの定積分を、台形公式とシンプソンの公式を用いてそれぞれ解きなさい。また、分割数を変えて結果がどう変わるかを調べなさい。

```math
I = \int_0^1 e^x dx \\
I = \int_0^{\pi} \sin x dx \\
I = \int_0^{2\pi} \sin x dx
```
京大理学部 物理科学課題演習 C1 （その９）

#高階微分方程式

　高階の微分方程式の例として、一様重力場（地上付近）における物体の運動方程式（2階の微分方程式）を考えてみましょう。今重力加速度の大きさを $g$ とすると、垂直方向（$z$ 方向）の運動方程式は

$$\frac{d^2x}{dt^2} = -g$$

となります。ここで

$$\frac{dx}{dt} = v$$

とおくと、個の運動方程式は次の1階の連立微分方程式と等価になります。

```math
\left.
\begin{array}{l}
  \frac{dz}{dt} &=& v \\
  \frac{dv}{dt} &=& -g
\end{array}
\right \} \tag{1}
```

このように2階の微分方程式である運動方程式を解くことは、連立微分方程式を解くことに等しくなるわけです。

　ところで、式 (1) と[前回](https://qiita.com/sasakitakanori/items/ebaf980a1cd52cf0f634)の例題を比較してみましょう。式 (7) で

$$x \rightarrow y_1,\ \ \ \ \ v \rightarrow y_2,\ \ \ \ \ t \rightarrow x,\ \ \ \ \ g \rightarrow 1$$

とすると、前回の例題と同じになりますね。実は前回の例題は、加速度 $-1$、初速度 $1$ の等加速度運動を解く問題だったわけです。

##課題

　次の微分方程式を解きなさい。

$$\frac{d^2y}{dx^2} = x \frac{dy}{dx} + y$$

ただし

$$y(0) = 0,\ \ \ \ \ y'(0) = 1$$

とする。

 また次の運動方程式を解きなさい。

```math
\begin{array}{l}
\frac{d^2x}{dt^2} &=& - \frac{x}{(x^2 + y^2)^{3/2}} \\
\frac{d^2y}{dt^2} &=& - \frac{y}{(x^2 + y^2)^{3/2}}
\end{array}
```

ただし

$$x(0) = 1,\ \ \ \ \ y(0) = 0\ \ \ \ \ \dot{x}(0) = 0,\ \ \ \ \ \dot{y}(0) = 1$$

とする。ところでこの運動方程式はどのような状況のもとでの運動を表す方程式なのであろうか。また上記の初期条件を与えた場合、物体はどのような運動をするのだろうか。
京大理学部 物理科学課題演習 C1 （その６）

#非線形方程式の解法

　2次方程式のように解の公式があれば、それを用いて解を求めることができます。しかし、次のような方程式の解を求めたい場合はどうすればよいのでしょう。

$$f(x) = x - \cos(x) = 0 \tag{1}$$

　ここでは、非線形方程式の解法で最もよく用いられる**ニュートン・ラフソン法**を使ってこの問題を解くことにします。ニュートン・ラフソン法の特徴は、ある手続きを用いて一発で解を求めるのではなく、同じ手続きを何回か繰り返すことによって、次第に解に近づいていくところにあります。次第にといっても、実際は（問題にもよりますが）数回であることが多いです。この「同じようなことを繰り返し行う」というのは、コンピュータの最も得意とするところです。では具体的な方法を説明しましょう。

　まず $x$ として適当な値 $x_0$ を選びます。（ここでいう「適当な」は「いい加減な」ではなく「適切な」という意味です。いい加減に選ぶと解が求まらないことがあります。）次に $(x_0,\ f(x_0))$ における $y = f(x)$ の接線を求めます。そして接線が $x$ 軸と交わる点の $x$ 座標の値を $x_1$ とします。再び $(x_1,\ f(x_1))$ における接線を求め、$x$ 軸との交点を $x_2$ とします。このように $x_0,\ x_1,\ x_2, \cdots $ と続けていけば、次第に解に到達するであろうことがわかるでしょう。

　それではこの繰り返しの方法を定式化しましょう。$(x_k,\ f(x_k))$ における接線の方程式は

$$y - f(x_k) = f'(x_x)(x - x_x)$$

ですから、$x_{k+1}$ は

$$x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)}$$

となります。この式を繰り返し実行していけばいいわけです。では、いつまで繰り返せばよいのでしょう？普通は $x_k$ と $x_{k+1}$ がほとんど同じになったところでこの繰り返しを終了します。つまり、$\epsilon$ を小さな数として

$$\left| \frac{x_{k+1} - x_k}{x_{k+1}} \right| \leq \epsilon \tag{2}$$

が成立したところで終了します。これで $x_{k+1}$ が解に収束したと判断するわけです。ただし上の条件を満たしたからといって、$x_{k+1}$ が $f(x_{k+1}) = 0$ を満たす厳密解とは限りません。あくまでも、解の近似値（近似解）です。

　それでは式 (1) の方程式を解くプログラムを作ってみましょう。

```c
#include <stdio.h>
#include <math.h>

double f(double x);
double df(double x);
void newton(double *x0, double eps, int *nitr);

int main(void)
{
    static double eps = 1.0e-8;
    double x0;
    int nitr;

    printf("初期値の入力: x0 = ");
    scanf("%lf", &x0);

    newton(&x0, eps, &nitr);

    printf("number of iterations: %3d\n", nitr);
    printf("solution: x = %15.8e\n", x0);

    return 0;
}

double f(double x)
{
    return x- cos(x);
}

double df(double x)
{
    return 1.0 + sin(x);
}

/* 非線形方程式を解くための関数（ニュートン・ラフソン法）*/
void newton(double *x0, double eps, int *nitr)
{
    int maxitr;
    double x1, dx;

    maxitr = 10;
    *nitr = 0;

    do {
        *nitr = *nitr + 1;
        x1 = *x0 - f(*x0) / df(*x0);

        if (*nitr >= maxitr) {
            *x0 = x1;
            printf("!!!!!!!!!!!!!!!\n");
            printf("!not converged!\n");
            printf("!!!!!!!!!!!!!!!\n");
            return;
        }
        dx = fabs((x1 - *x0) / x1);
        *x0 = x1;
    } while(dx > eps);
}
```

　ニュートン・ラフソン法は収束も速く、非線形方程式を解く非常に有力な方法です。またここで用いた繰り返し法で解を求めるテクニックは、いろいろなところで応用がききます。しかし、方程式が複数の解を持つ場合は、ニュートン・ラフソン法ではそれらの解を同時に求めることはできません。初期値によってどの解に収束するかが変わります。また、導関数が解析的に求まっていないとこの解法は使えません（微分を数値的に行う方法はあります）。このような制限があることを十分理解して利用してください。

　さて今の場合、関数内部で使っている関数名 `f` と `df` は外部で定義されている関数の名前と一致しているのでよいのですが、もし外部の関数名が変われば、関数内部の関数名も変えなければならなくなります。上のプログラムの場合は変更する箇所が少ないのでそれほど問題ではないのですが、大きなプログラムの場合はちょっと困った問題です。また、有用な関数をライブラリ化する場合には重大な問題になります。全ての情報を（関数名も含めて）引数で関数に渡す方法はないのでしょうか。ここでは詳細は割愛しますが、「関数へのポインタ」を使うことで関数名を関数に渡すことが可能です。つまり、引数に関数名を書いておいて、それを関数の方で適当な名前のポインタで受け取ればよいということです。[次回](https://qiita.com/sasakitakanori/items/ff85a44a473b0a88758e)のプログラムでは実際に関数へのポインタを使っているので、使い方を確認してみてください。

##課題

　上のプログラムの初期値をいろいろ変えて実行しなさい。収束しない場合は maxitr の値を大きくしてみなさい。また収束条件である $\epsilon$ の値を変えて、解への収束状況を調べなさい。また、同様の計算方法を用いて次の方程式の解を求めなさい。

$$x^2 - 2\sin(x) = 0$$

この方程式では $x = 0$ も解ですが、この場合は式 (2) の収束の判定条件が使えません。実は収束条件には様々なものがあります。数値計算の教科書やインターネット上の解説等を参考に、他にどのような収束の判定条件があるのかを調べ、上の方程式で $x = 0$ の場合の解も求められるようにプログラムを書き換えなさい。
コルーチンの書き方がうまくいかずエラーが出てしまいます

Unityを使ってノベルゲームの制作に挑戦しているのですが1文字ずつ表示させるためのコルーチンでエラーが出てしまいます。エラーは
Assets\Scripts\Story\WriteTxt.cs(23,29): error CS0120: An object reference is required for the non-static field, method, or property 'WriteTxt.Timer()'
です。
コルーチン部分をコメント化すると正常に作動するのでたぶんコルーチン部分が間違っていると思うのですがアドバイスをお願いします。
Unityのバージョンは2019.3.71.fです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//文字送りに必要な者たち
using UnityEngine.UI;
using System.Text.RegularExpressions;

public class WriteTxt : MonoBehaviour
{
    public static void Write_Txt(int num)
    {
        //表示中の文字数を示す変数
        int msg_count=0;

        //メッセージの初期化
        MnageSt.messageText.text="";

        while(MnageSt.senario[num].Length>msg_count)
        {
            MnageSt.messageText.text+=MnageSt.senario[num][msg_count];
            msg_count++;
            StartCoroutine (Timer());
        }
    } 

    IEnumerator Timer () {
        yield return new WaitForSeconds (1);
    }
}
京大理学部 物理科学課題演習 C1 （その３）

#多項式の和

　ここでは次のような多項式

$$f(x) = a_0 + a_1x + a_2x^2 + \cdots + a_nx^n \tag{1}$$

の値を求めるプログラムを作るのが目標です。ところでこの問題を考える前に、次の簡単なプログラムを作って実行してみてください。

```c
#include <stdio.h>

int main(void)
{
    int i;
    float a1 = 1.0e7;
    float a2 = 1.0e7;
    float b1 = 1.0;
    float b2 = 0.1;

    for (i = 0; i < 10000; i++) {
        a1 = a1 + b1;
        a2 = a2 + b2;
    }

    printf("a1 = %6.0f\n", a1);
    printf("a2 = %6.0f\n", a2);

    return 0;
}
```

　さて実行結果はどうなりましたか？予想される結果は

```
a1 = 10010000
a2 = 10001000
```

なのですが、実際は

```
a1 = 10010000
a2 = 10000000
```

となってしまったはずです。なぜ $0.1$ は加算されなかったのでしょう。これを正確に理解するためにはコンピュータ内部での実数の表現方法を知らなければなりませんが、ここでは「実数は有限の有効桁しか持っていない」ということを理解しておけば十分です。単精度の実数の有効桁数は、10進法で約8桁です。そうすると、$10000000$ に $0.1$ を加えた場合、$10000000.1$ の最後の $1$ の部分は9桁目になるため、無視されてしまうわけです。このように、絶対値の非常に大きな数に絶対値の非常に小さな数を加えたり引いたりした場合、小さい方の数が計算結果に全く反映されないことが生じます。これを**情報落ち**あるいは**積み残し**などとよびます。

　さて多項式の和を計算する場合、式 (1) をそのまま使ったのでは、$x$ の値や係数によっては、この情報落ちや[前回](https://qiita.com/sasakitakanori/items/619760ce65460a3ed57e)説明した桁落ちが生じる可能性があります。そこで、式 (1) を次のように変形しましょう。

$$f(x) = (\cdots((a_nx + a_{n-1})x + a_{n-2})x + \cdots + a_1)x + a_0 \tag{2}$$

このようにすると、情報落ちをある程度避けることができます。次のプログラムは

$$f(x) = 0.10204 + 1.203x + 0.2335x^2 + 1.786x^3 + 2.334x^4 + 3.4478x^5$$

の $x=\pi$ のときの値を求めるものです。

```c
#include <stdio.h>
#include <math.h>

int main(void)
{
    static double a[] = {0.10204, 1.203, 0.2335, 1.786, 2.334, 3.4478};
    double x, fx;

    x = M_PI;
    fx = ((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0];

    printf("f(%4.21f)=%15.8e\n", x, fx);

    return 0;
}
```

　さて、このプログラムでは式 (3) の多項式にしか使えません。汎用性のある関数を作ってみましょう。関数の名前は `polynomial` とします。（実は C では同様のはたらきをする `poly` という標準関数が用意されているのですが、まあ練習だと思って新たに関数を作ってみましょう）

　呼び方は、メイン関数の方で

```c
#include <math.h>
double polynomial(double *apt, double x, int n);
int main(void)
{
      .....
    fx = polynomial(a, x, N);
      .....
}
```

関数の方は

```c
double polynomial(double *apt, double x, int n)
{
    double fx;
    (多項式の和の計算)
    return 0;
}
```

となります。さて肝心の多項式の和を計算する部分ですが、どうすればよいのでしょう。式 (2) の特徴をつかまなければなりません。今の場合一番内側の括弧の中から順に計算を始めます。

　第1段： $a_nx + a_{n-1}$
　第2段： $(a_nx + a_{n-1})x + a_{n-2}$
　第3段： $((a_nx + a_{n-1})x + a_{n-2})x + a_{n-3}$

この式からわかるように、前段の計算結果に $x$ をかけて、次の係数を加えることで、次の段が得られる図式になっています。これをプログラム風に書いてみると（ここでは第0段を加えます）

```c
第０段：　fx = a[n];
第１段：　fx = fx * x + a[n-1];
第２段：　fx = fx * x + a[n-2];
・・・・・・・・・
第ｎ段：　fx = fx * x + a[0];
```

といった具合になります。第1段以降は同様な手続きの繰り返しですから、`for` ループの中に入れることができます。すなわち

```c
fx = a[n];
for (i = n - 1; i >= 0; i--) {
    fx = fx * x + a[i]
```

と書けるわけです。

##課題

　上の解説を参考にして、多項式の和を求める関数を完成させなさい。
Cocoapodsをmac(10.14.6)Mojavaにインストール

# インストール方法

[こちらの記事](https://qiita.com/tzono/items/b80f6c343355a872dde6)通りにCocoapodssのインストールを行います.
まず, 次のコマンドをターミナル上で実行します.

```
sudo gem install -n /usr/local/bin cocoapods
```

すると, 私の環境では以下のエラーメッセージが出力されました.

```
Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -I /Library/Ruby/Site/2.3.0 -r ./siteconf20200403-30301-1n8idnk.rb extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.12.2/gem_make.out
```
このエラーの対処法を探るために「mkmf.rb can't find header files for ruby at」というキーワードで検索をかけました.
すると, [こちらの記事](https://qiita.com/showylee/items/29220a8bd43fd76474d7)を用いてエラーを解決できました.その手順を記します.

まず, AppleDeveloperよりCommand Line Tools (macOS 10.14)for Xcode 10.2.1をダウンロードします. [このリンク](https://developer.apple.com/download/more/)よりAppleIDでログインをすることでダウンロードできます. ダウンロードが完了したらダウンロードファイルを実行しインストールを完了させてください.

次に, 以下のコマンドをターミナル上で実行します.

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
次に, 以下のコマンドをターミナル上で実行します.

```
sudo gem install -n /usr/local/bin cocoapods
```

そして, 最後にCocoppodsをセットアップして完了です.

```
pod setup
```
以上となります.

#参考文献
[1]CocoaPodsを導入してみた
https://qiita.com/showylee/items/29220a8bd43fd76474d7
[2]MacOS(Mojave)でrailsをinstallしようとしてコケた
https://qiita.com/tzono/items/b80f6c343355a872dde6
テキストの文字コード判定が困難(面倒)な文字列

UTF-8 と SHIFT JIS で文字コードのバイト列が同じだと、機械的な単純判定では区別がつきません。そのパターンを [CP932 と Unicode の変換表(unicode.org より)](http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT) から作り、サンプルとして良さそうなものを選んでみました。

**UTF-8 判定された文字列**

```text:UTF8-2文字.TXT
ぐぁ ぐあ ぐぃ ぐい ぐぅ ぐう ぐぇ ぐえ ぐぉ ぐお
ぐか ぐが ぐき ぐぎ ぐく ぐぐ ぐけ ぐげ ぐこ ぐご
ぐさ ぐざ ぐし ぐじ ぐす ぐず ぐせ ぐぜ ぐそ ぐぞ
ぐた ぐだ ぐち ぐぢ ぐっ ぐつ ぐづ ぐて ぐで ぐと
ぐど ぐな ぐに ぐぬ ぐへ ぐべ ぐぺ ぐほ ぐぼ ぐぽ
ぐま ぐみ ぐめ ぐも ぐゃ ぐや ぐゅ ぐゆ ぐょ ぐよ
ぐら ぐり ぐる ぐれ ぐろ
ぐゎ ぐわ ぐゐ ぐゑ ぐを
ぐん
```

このテキストを保存する場合は、文字コードを UTF-8 としてください。

**SHIFT JIS 判定された文字列**

```text:SJIS-3文字.TXT
縺舌＝ 縺舌≠ 縺舌＜ 縺舌＞ 縺舌≦ 縺舌≧ 縺舌∞ 縺舌∴ 縺舌♂ 縺舌♀
縺舌° 縺舌′ 縺舌″ 縺舌℃ 縺舌￥ 縺舌＄ 縺舌¢ 縺舌£ 縺舌％ 縺舌＃
縺舌＆ 縺舌＊ 縺舌＠ 縺舌§ 縺舌☆ 縺舌★ 縺舌○ 縺舌● 縺舌◎ 縺舌◇
縺舌◆ 縺舌□ 縺舌■ 縺舌△ 縺舌▲ 縺舌▽ 縺舌▼ 縺舌※ 縺舌〒 縺舌→
縺舌← 縺舌↑ 縺舌↓ 縺舌〓 縺舌∈ 縺舌∋ 縺舌⊆ 縺舌⊇ 縺舌⊂ 縺舌⊃
縺舌∪ 縺舌∩ 縺舌ａ 縺舌ｂ 縺舌ｃ 縺舌ｄ 縺舌ｅ 縺舌ｆ 縺舌ｇ 縺舌ｈ
縺舌ｉ 縺舌ｊ 縺舌ｋ 縺舌ｌ 縺舌ｍ
縺舌ｎ 縺舌ｏ 縺舌ｐ 縺舌ｑ 縺舌ｒ
縺舌ｓ
```

このテキストを保存する場合は、文字コードを SHIFT JIS (今のメモ帳だと ANSI?) としてください。

---

「ぐん」(UTF-8)と「縺舌ｓ」(SHIFT JIS) のバイト列を見ると

| ぐ | ん |
|:-:|:-:|
| E3 81 90 | E3 82 93 |

| 縺 | 舌 | ｓ |
|:-:|:-:|:-:|
| E3 81 | 90 E3 | 82 93 |

UTF-8 では 3 バイト区切りの 2 文字で、SHIFT JIS では、2 バイト区切りの 3 文字と判断されます。

---

<details><summary>1文字の UTF-8 と 2 文字の SHIFT JIS 組み合わせ例</summary><div>

```text:UTF-1文字.TXT
§ ¨ ° ± ´ ¶ ÷ Ρ Σ Τ Υ Φ
Χ Ψ Ω α β γ δ ε ζ η θ ι
κ λ μ ν ξ ο С Т У Ф Х Ц
Ч Ш Щ Ъ Ы Ь Э Ю Я а б в
г д е ж з и й к л м н о
п ‡ ‥ … ‰ ′ ″ ※ ℡ Å Ⅱ Ⅲ
Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ ⅰ ⅱ ⅲ ⅳ ⅴ
ⅵ ⅶ ⅷ ⅸ ⅹ ∥ ∧ ∨ ∩ ∪ ∫ ∬
∮ ∴ ∵ ∽ ≡ ≦ ≧ ≪ ≫ ⊥ ⊿ ②
③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭
⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ┣ ┤ ┥ ┨ ┫ ┬
┯ ┰ ┳ ┴ ┷ ┸ ┻ ┼ ┿ □ ▲ △
▼ ▽ ◯ ♪ ♭ ♯ ち ぢ っ つ づ て
で と ど な に ぬ ね の は ば ぱ ひ
び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま
み ァ ア ィ イ ゥ ウ ェ エ ォ オ カ
ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ
ジ ス ズ セ ゼ ソ ゾ タ メ モ ャ ヤ
ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ
ヱ ヲ ン ヴ ヵ ヶ ・ ー ヽ ヾ ㈱ ㈲
㈹ ㊤ ㊥ ㊦ ㊧ ㊨ ㌢ ㌣ ㌦ ㌧ ㌫ ㌶
㌻ ㍻ ㍼ ㍽ ㍾ ㎡ 両 並 丨 个 中 丱
串 丶 丸 丹 主 丼 丿 乢 乱 乳 乾 亡
亢 交 亥 亦 亨 享 京 亭 亮 亰 亳 亶
人 仡 代 令 以 仭 仮 仰 仲 件 价 任
仼 伯 估 伴 伶 伸 伹 伺 似 伽 佩 佯
佰 佳 併 佶 佻 佼 使 価 侫 侭 侮 侯
侵 侶 便 信 俣 俤 俥 修 俯 俳 俵 俶
俸 俺 俾 俿 倡 倢 倣 値 倥 倦 倨 倩
```

```text:SJIS-2文字.TXT
ﾂｧ ﾂｨ ﾂｰ ﾂｱ ﾂｴ ﾂｶ ﾃｷ ﾎ｡ ﾎ｣ ﾎ､ ﾎ･ ﾎｦ
ﾎｧ ﾎｨ ﾎｩ ﾎｱ ﾎｲ ﾎｳ ﾎｴ ﾎｵ ﾎｶ ﾎｷ ﾎｸ ﾎｹ
ﾎｺ ﾎｻ ﾎｼ ﾎｽ ﾎｾ ﾎｿ ﾐ｡ ﾐ｢ ﾐ｣ ﾐ､ ﾐ･ ﾐｦ
ﾐｧ ﾐｨ ﾐｩ ﾐｪ ﾐｫ ﾐｬ ﾐｭ ﾐｮ ﾐｯ ﾐｰ ﾐｱ ﾐｲ
ﾐｳ ﾐｴ ﾐｵ ﾐｶ ﾐｷ ﾐｸ ﾐｹ ﾐｺ ﾐｻ ﾐｼ ﾐｽ ﾐｾ
ﾐｿ 窶｡ 窶･ 窶ｦ 窶ｰ 窶ｲ 窶ｳ 窶ｻ 邃｡ 邃ｫ 竇｡ 竇｢
竇｣ 竇､ 竇･ 竇ｦ 竇ｧ 竇ｨ 竇ｩ 竇ｰ 竇ｱ 竇ｲ 竇ｳ 竇ｴ
竇ｵ 竇ｶ 竇ｷ 竇ｸ 竇ｹ 竏･ 竏ｧ 竏ｨ 竏ｩ 竏ｪ 竏ｫ 竏ｬ
竏ｮ 竏ｴ 竏ｵ 竏ｽ 竕｡ 竕ｦ 竕ｧ 竕ｪ 竕ｫ 竓･ 竓ｿ 竭｡
竭｢ 竭｣ 竭､ 竭･ 竭ｦ 竭ｧ 竭ｨ 竭ｩ 竭ｪ 竭ｫ 竭ｬ 竭ｭ
竭ｮ 竭ｯ 竭ｰ 竭ｱ 竭ｲ 竭ｳ 笏｣ 笏､ 笏･ 笏ｨ 笏ｫ 笏ｬ
笏ｯ 笏ｰ 笏ｳ 笏ｴ 笏ｷ 笏ｸ 笏ｻ 笏ｼ 笏ｿ 笆｡ 笆ｲ 笆ｳ
笆ｼ 笆ｽ 笳ｯ 笙ｪ 笙ｭ 笙ｯ 縺｡ 縺｢ 縺｣ 縺､ 縺･ 縺ｦ
縺ｧ 縺ｨ 縺ｩ 縺ｪ 縺ｫ 縺ｬ 縺ｭ 縺ｮ 縺ｯ 縺ｰ 縺ｱ 縺ｲ
縺ｳ 縺ｴ 縺ｵ 縺ｶ 縺ｷ 縺ｸ 縺ｹ 縺ｺ 縺ｻ 縺ｼ 縺ｽ 縺ｾ
縺ｿ 繧｡ 繧｢ 繧｣ 繧､ 繧･ 繧ｦ 繧ｧ 繧ｨ 繧ｩ 繧ｪ 繧ｫ
繧ｬ 繧ｭ 繧ｮ 繧ｯ 繧ｰ 繧ｱ 繧ｲ 繧ｳ 繧ｴ 繧ｵ 繧ｶ 繧ｷ
繧ｸ 繧ｹ 繧ｺ 繧ｻ 繧ｼ 繧ｽ 繧ｾ 繧ｿ 繝｡ 繝｢ 繝｣ 繝､
繝･ 繝ｦ 繝ｧ 繝ｨ 繝ｩ 繝ｪ 繝ｫ 繝ｬ 繝ｭ 繝ｮ 繝ｯ 繝ｰ
繝ｱ 繝ｲ 繝ｳ 繝ｴ 繝ｵ 繝ｶ 繝ｻ 繝ｼ 繝ｽ 繝ｾ 繹ｱ 繹ｲ
繹ｹ 繩､ 繩･ 繩ｦ 繩ｧ 繩ｨ 繻｢ 繻｣ 繻ｦ 繻ｧ 繻ｫ 繻ｶ
繻ｻ 纃ｻ 纃ｼ 纃ｽ 纃ｾ 緕｡ 荳｡ 荳ｦ 荳ｨ 荳ｪ 荳ｭ 荳ｱ
荳ｲ 荳ｶ 荳ｸ 荳ｹ 荳ｻ 荳ｼ 荳ｿ 荵｢ 荵ｱ 荵ｳ 荵ｾ 莠｡
莠｢ 莠､ 莠･ 莠ｦ 莠ｨ 莠ｫ 莠ｬ 莠ｭ 莠ｮ 莠ｰ 莠ｳ 莠ｶ
莠ｺ 莉｡ 莉｣ 莉､ 莉･ 莉ｭ 莉ｮ 莉ｰ 莉ｲ 莉ｶ 莉ｷ 莉ｻ
莉ｼ 莨ｯ 莨ｰ 莨ｴ 莨ｶ 莨ｸ 莨ｹ 莨ｺ 莨ｼ 莨ｽ 菴ｩ 菴ｯ
菴ｰ 菴ｳ 菴ｵ 菴ｶ 菴ｻ 菴ｼ 菴ｿ 萓｡ 萓ｫ 萓ｭ 萓ｮ 萓ｯ
萓ｵ 萓ｶ 萓ｿ 菫｡ 菫｣ 菫､ 菫･ 菫ｮ 菫ｯ 菫ｳ 菫ｵ 菫ｶ
菫ｸ 菫ｺ 菫ｾ 菫ｿ 蛟｡ 蛟｢ 蛟｣ 蛟､ 蛟･ 蛟ｦ 蛟ｨ 蛟ｩ
```

</div></details>
mysqlでパスワードを変更したい時

変更対象のユーザーは`root`とする

### 1. mysqlにログインして変更するパターン

```
mysql> update mysql.user set password=password('新しいパスワード') where user = 'root';

# 更新して一度ログアウト
mysql> flush privileges;
mysql> exit;

# mysql -u root -p
Enter password:
```
これで設定した新パスワードでmysqlにログイン可能


[参考リンク](https://blog.codecamp.jp/root-password)
ブログにYoutubeを貼り付ける方法

# 概要
自身のYoutubeを自分のブログに貼り付けたのでメモ

動画にもしてみました。
`(完全に個人趣味なので見応え0かも…)`
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/pChiXpnyl1s/0.jpg)](http://www.youtube.com/watch?v=pChiXpnyl1s)

# 結論
こんな感じになりました。

https://hashito.biz/
[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/eb62067d-a5d4-f2a8-c09f-52d42b45eb94.png)](https://hashito.biz/)

## ソースコード

```html
<p class="subtitle">@Youtube</p>
<script src="https://apis.google.com/js/platform.js"></script>
<div 
class="g-ytsubscribe" 
data-channelid="UC9ZSQjR4502aRkU5rJpJ7dg" 
data-layout="full" 
data-count="default"></div>

<iframe 
width="560" 
height="315" 
src="https://www.youtube.com/embed/?list=UU9ZSQjR4502aRkU5rJpJ7dg" 
frameborder="0" 
allow="autoplay; encrypted-media" allowfullscreen>
</iframe>

```

#調べた結果

Code.penにまとめてあります。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="hashito" data-slug-hash="XWbwbZp" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="youtube">
  <span>See the Pen <a href="https://codepen.io/hashito/pen/XWbwbZp">
  youtube</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 動画埋め込み
基本的に3種類程度ありらしく、

```
「単品動画としての埋め込み」
「リスト動画としての埋め込み」
「チャンネル最新動画の埋め込み」
```

の3種類があります。
今回、私は`「チャンネル最新動画の埋め込み」`を行っています。
この場合、`list=UU9ZSQjR4502aRkU5rJpJ7dg`の部分がチャンネルIDを表すのですが、
元のIDから下記のような変更が必要です。

```
元：UC9ZSQjR4502aRkU5rJpJ7dg
変換後：UU9ZSQjR4502aRkU5rJpJ7dg
※頭２文字「UC」から「UU」に変更
```
あとは、文字を表示したりしなかったり…
アイコンを表示したりしなかったりもあるらしいですがそこは今回こだわっていないです。

## 登録ボタン
下記のホームページで`チャンネル名またはID`を入力すれば作れます。

https://developers.google.com/youtube/youtube_subscribe_button?hl=ja
初めの一歩(Lチカ&hello world)

今回はLチカとhello worldをやります。
#やっていこう
##Lチカ
Lチカとは、LEDをチカチカさせる事です。
LEDはarduinoに内臓されているためそれを使用します。
またLEDはarduinoの13ピンに接続されています。
プログラムを作りましょう


**プログラム**

```C++:Ltika.ino
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
```
解説：
arduinoのプログラムの基本として、**void setup()の中は起動時一回しか実行されません。setup()が実行された後　void loop()の中を繰り返し実行します。**


**pinMode(13, OUTPUT);**
Arduinoの13番ピンを出力モードにします。
**digitalWrite(13, ○);**
○がHIGHならば13番ピンがONになります、反対にLOWならばOFFになります。
**delay(○);**
○mS待機するという関数です。

なので上記のプログラムは一秒ごとにLEDがチカチカするプログラムとなっています。
プログラムを書き込んでLEDがチカチカしていれば成功です！！


##hello world
シリアルモニター上にhello worldと表示するプログラムを作ります。


**プログラム**

```C++:hello_world.ino
void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println("hello world");
  delay(1000);
}
```
解説：
**Serial.begin(9600);**
シリアルモニターを使うときのおまじないだと思っておいてください。

**Serial.println("hello world");**
シリアルモニター上にhello worldと表示させます。

プログラムを書き込んでシリアルモニターを開いてください。
そうすると一秒ごとにhello worldと表示するのがわかると思います。
改行させたくないときはSerial.printlnのlnを消してSerial.printにしてください。

#最後に
皆さんここまでできましたか？
もし、できない場合は一度休憩してから再度確認してみましょう、何かミスに気が付くと思います。
それでも解決しない場合は気軽に筆者に質問してください。
ターミナルからAndroidエミュレーターを起動

## エミュレーターのリストを表示します。

```
$ emulator -list-avds
```

Pixel_2_API_26
Pixel_3_API_26


などと端末名が表示されます。

## エミュレーターを起動します。
emulator @Pixel_2_API_26

エミュレーターが起動されました。

## 参考
https://developer.android.com/studio/run/emulator-commandline
TLA+でパズル (1) Lock Challenge

「Alloyでパズル (16)」でやった Lock Challenge を、 PlusCal でもやってみようと思った。
が、PlusCal での書き方がわからず、TLA+版の方が先にできてしまった。

# 問題

[Alloyでパズル (16) Lock Challenge](https://qiita.com/jpwgad/items/38ffe3d31633df677185) を参照。

# TLA+版

まだ『[Specifying Systems](https://lamport.azurewebsites.net/tla/book.html)』をほとんど読んでいないので、TLA+の書き方がよくわからない。
`IF-THEN-ELSE`版はできたので、もっとうまく書けないものか調査中。
現段階では、`Match()`を`Sequences`利用版に置き換えている。

```tla:LockChallenge.tla
---- MODULE LockChallenge ----
EXTENDS Naturals, TLC, Sequences
VARIABLES sol1, sol2, sol3

WellPlace(a,b,c) == (IF a=sol1 THEN 1 ELSE 0)
                  + (IF b=sol2 THEN 1 ELSE 0)
                  + (IF c=sol3 THEN 1 ELSE 0)
Match(a,b,c) == LET Mt(n) == n \in {sol1,sol2,sol3}
                IN Len(SelectSeq(<<a,b,c>>,Mt))
Hint(a,b,c,matched,wellPlaced) == Match(a,b,c)=matched 
                               /\ WellPlace(a,b,c)=wellPlaced

Init == /\ sol1 \in 0..9
        /\ sol2 \in 0..9
        /\ sol3 \in 0..9
     \* lock
        /\ Hint(6,8,2, 1,1)
        /\ Hint(6,1,4, 1,0)
        /\ Hint(2,0,6, 2,0)
        /\ Hint(7,3,8, 0,0)
        /\ Hint(7,8,0, 1,0)
     \* another lock
        \* /\ Hint(1,2,3, 0,0)
        \* /\ Hint(4,5,6, 0,0)
        \* /\ Hint(7,8,9, 1,0)
        \* /\ Hint(9,0,0, 3,1)
     \* result
        /\ PrintT(<<sol1,sol2,sol3>>)

vars == << sol1,sol2,sol3 >>
Next == UNCHANGED vars
Spec == Init /\ [][Next]_vars
====
```

```tla:LockChallenge.cfg
SPECIFICATION Spec
```

# 結果

```
Output
<<0, 4, 2>>
```

# PlusCal版

別記事を起こすほどのことでもない気がするのでひっそり追記で。
今頃気づいたのですが、４つ目と５つ目のヒントは不要なんですね。

```pluscal:LockChallengePlusCal.tla
---- MODULE LockChallengePlusCal ----
EXTENDS Naturals, TLC, Sequences

(* --algorithm LockChallengePlusCal
variable sol1 \in 0..9,  sol2 \in 0..9,  sol3 \in 0..9;

define
WellPlace(a,b,c) == (IF a=sol1 THEN 1 ELSE 0)
                  + (IF b=sol2 THEN 1 ELSE 0)
                  + (IF c=sol3 THEN 1 ELSE 0)
Match(a,b,c) == LET Mt(n) == n \in {sol1,sol2,sol3}
                IN Len(SelectSeq(<<a,b,c>>,Mt))
Hint(a,b,c,matched,wellPlaced) == Match(a,b,c)=matched /\ WellPlace(a,b,c)=wellPlaced
end define;

begin
    if (Hint(6,8,2, 1,1)
     /\ Hint(6,1,4, 1,0)
     /\ Hint(2,0,6, 2,0)
     /\ Hint(7,3,8, 0,0)
     /\ Hint(7,8,0, 1,0)
    ) then
        print <<sol1,sol2,sol3>>;
    end if;
end algorithm *)
====
```
Laravelのユーザー登録を使って、カラムを増やした時のエラーの解決法

# 事象
Laravelでユーザーのカラムを増やそうとした時に
<img width="1074" alt="スクリーンショット 2020-04-04 16.20.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185245/5f584547-b27d-1202-27e4-4b8f1926d38b.png">
>SQLSTATE[HY000]: General error: 1364 Field 'path' doesn't have a default value (SQL: insert into `users` (`name`, `email`, `password`, `updated_at`, `created_at`) values (a, a@a, $2y$10$wb1DAgh21cDvXZd85w2tL.gbW2KocCLWhaAY/bArGB4JOAJhjI6r., 2020-04-04 07:19:22, 2020-04-04 07:19:22))

というエラーが出た。

# 解決法
database.php の
`'strict' => true,`
の部分を
`'strict' => false,`
に変更する。
windowsからlinuxに向けてssh公開鍵認証を自動的に設定する

# ssh公開鍵認証の自動セットアップスクリプトを作った
えっと...`ssh root@192.168.0.2`して...パスワードを入力して...が面倒な人のために。

いつもやっている公開鍵認証の設定作業を短縮するため、公開鍵認証を自動でセットアップする。
linuxでも同様のスクリプトを書いたが、今回はpowershellで書く。
ただしlinuxには `ssh-copy-id` という便利なコマンドがあるようです。configファイルは書いてくれないけど。

# 使い方
1. 下のps1スクリプトを任意の場所に作成する。
2. powershellで実行する。以下のパラメータを実行時または実行中に渡す。
3. 実行後、次回以降は`ssh hoge`等hostnameのみssh接続が可能になる。

- 実行の例: `./GiveRSAAuth.ps1 -user root -hostname hoge -ip_addr 192.0.2.1`
    - `user`パラメータ: 接続先のユーザー名
    - `hostname`パラメータ: 接続先のホスト名
    - `ip_addr`パラメータ: 接続先のIPアドレス

# スクリプト

```GiveRSAAuth.ps1
# to automatic giving RSA authentication via ssh

# get args
Param( [parameter(mandatory=$true)]$user, [parameter(mandatory=$true)]$hostname, $ip_addr )

# read ssh publilc key from file
$public_key = Get-Content $Home\.ssh\id_rsa.pub

# TODO: herestring's return code has \r
# $ssh_command = @"
# mkdir -m 700 .ssh
# echo "$public_key" >> .ssh/authorized_keys
# "@
# ssh $user@$ip_addr "$ssh_command"

# make .ssh directory to target machine via ssh
ssh $user@$ip_addr "mkdir -m 700 .ssh"
# add ssh publilc key to target machine via ssh
ssh $user@$ip_addr "echo "$public_key" >> .ssh/authorized_keys"

# make config file
$ssh_config = @"

Host $hostname
	HostName $ip_addr
	User $user
	IdentityFile $Home\.ssh\id_rsa
"@

# add host config to ssh config file
Write-Output $ssh_config | Out-File -Append -Encoding utf8 $Home\.ssh\config
```

# 課題
- ヒアストリングに\rが挟まり、一回のsshで設定が完了できないため、ヒアストリングの使用を諦めた。
簡単リモートアセット(Unity Addressable Asset System)を試してみた (その2)

# 前提
- unity 2018.4.19f1
- Addressables 1.7.5
- 前の記事「[簡単リモートアセット(Unity Addressable Asset System)を試してみた (その1)](https://qiita.com/tetr4lab/items/1b26755089820b041b4f)」

# やったこと
- エディタ拡張で、デフォルトグループ内のサブアセットをルートに展開します。
- 「[Addressable Assets Systemを完全に理解する ～ Addressablesウィンドウから設定する](https://qiita.com/k7a/items/b4fd298bcb64dc968ad1#addressables%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%8B%E3%82%89%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)」で紹介されていたスクリプトが最近のバージョンには整合しないようでした(`Addressables 1.7.5`で確認)ので、書き直しました。
- なお、アセットがルートになくてもアクセスはできるので、ルートに展開する必然性はありません。
- また、このスクリプトは、デフォルトグループだけを対象にしています。

```cs:Assets/～/Editor/MoveToRoot.cs
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEngine;

public static class AddressableAssetsUtil {

	// サブエントリをルートへ展開して空になったフォルダを削除
	[UnityEditor.MenuItem ("Assets/Addressables/MoveSubEntryToRoot")]
	public static void MoveSubEntryToRoot () {
		var entriesCount = 0;
		var assetsCount = 0;
		var settings = AddressableAssetSettingsDefaultObject.Settings;
		var entries = new List<UnityEditor.AddressableAssets.Settings.AddressableAssetEntry>  (settings.DefaultGroup.entries);
		var assets = new List<UnityEditor.AddressableAssets.Settings.AddressableAssetEntry> { };
		foreach (var entry in entries) {
			entry.GatherAllAssets (assets, false, true, true);
			if (assets.Count > 0 && entry.MainAsset.GetType () == typeof (UnityEditor.DefaultAsset)) {
				entriesCount++;
				Debug.Log ($"MoveSubEntryToRoot: entry {entriesCount}: {entry.address}");
				foreach (var asset in assets) {
					assetsCount++;
					Debug.Log ($"MoveSubEntryToRoot: asset {assetsCount}: {asset.address}");
					settings.MoveEntry (asset, entry.parentGroup);
					if (asset.address.StartsWith ("Assets/")) {
						asset.address = asset.address.Remove (0, 7);
					}
				}
				assets.Clear ();
				settings.RemoveAssetEntry (entry.guid);
			}
		}
		AssetDatabase.Refresh (); // アセットを更新
		Debug.Log ($"MoveSubEntryToRoot: done (entries: {entriesCount}, assets: {assetsCount})");
	}

}
```

# 公式ドキュメント
- [Class AddressableAssetSettings](https://docs.unity3d.com/Packages/com.unity.addressables@1.2/api/UnityEditor.AddressableAssets.Settings.AddressableAssetSettings.html)
    - MoveEntry(AddressableAssetEntry, AddressableAssetGroup, Boolean, Boolean)
    - RemoveAssetEntry(String, Boolean)
- [Class AddressableAssetGroup](https://docs.unity3d.com/Packages/com.unity.addressables@1.2/api/UnityEditor.AddressableAssets.Settings.AddressableAssetGroup.html)
    - GatherAllAssets(List<AddressableAssetEntry>, Boolean, Boolean, Boolean, Func<AddressableAssetEntry, Boolean>)
- [Class AddressableAssetSettingsDefaultObject](https://docs.unity3d.com/Packages/com.unity.addressables@0.4/api/UnityEditor.AddressableAssets.AddressableAssetSettingsDefaultObject.html)
    - GetAllAssets(List<AddressableAssetEntry>, Boolean, Func<AddressableAssetGroup, Boolean>, Func<AddressableAssetEntry, Boolean>)
- [Class AddressableAssetEntry](https://docs.unity3d.com/Packages/com.unity.addressables@0.4/api/UnityEditor.AddressableAssets.AddressableAssetEntry.html)