OmniAICreator/Qiita-1.07M huggingface dataset:
Time.zone.todayってTimeクラスに話しかけたのになぜDateクラスが返ってくるのか？

# たまげたこと
こんなRailsのコードがあります。

```ruby
Time.zone.today
```

Timeにtodayなんて名前のメソッドを使えるからなんか違和感を感じておりまして。
興味本位で、このインスタンスに「君のクラスは？」と尋ねてみたら、**Dateクラスのインスタンスが返ってきてたまげました**。

![time_current_time_zone_today.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/9921d490-e4e4-7a71-df48-a111fa718710.png)

僕はTimeクラスさんに話しかけたはずなのに。。なぜなんだ！？
いつの間にDateクラスさんにすり替わってるのだ！？

順を追って整理したいと思います。

### 環境
ruby 3.0.0
Rails 6.0.3

## １、Time#zoneとは？

Time#zoneはTimeZoneクラスのインスタンスを生成するそうな。

>zone()
Returns the TimeZone for the current request, if this has been set (via Time.zone=). If Time.zone has not been set for the current request, returns the TimeZone specified in config.time_zone.
https://api.rubyonrails.org/classes/Time.html#method-c-zone

抜粋したドキュメントによれば、Railsだとここを見に行くそう↓。

```ruby:config/application.rb
module AppName
  class Application < Rails::Application
    #　中略
    config.time_zone = 'Tokyo'
```

確かに「いかにも、わしはTimeZoneクラスじゃが？」と返事が返ってきた。

```
[2] pry(main)> y = Time.zone
=> #<ActiveSupport::TimeZone:0x00007ff4a889c548 @name="Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil>
[3] pry(main)> y.class
=> ActiveSupport::TimeZone
```

これで生成されるTimeZoneクラス
https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html


## ２、TimeZone#todayとは？

TimeZoneクラスはインスタンスメソッド`today`を持っている。
ソースコードを覗いてみたら...↓
https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/activesupport/lib/active_support/values/time_zone.rb#L491

抜粋↓

```ruby:time_zone.rb
    # Returns the current date in this time zone.
    def today
      tzinfo.now.to_date
    end
```

**`to_date`している！
Time.zone.todayの返り値を最終的にDateクラスにしていたのは君だったのか！**
納得。

ちなみに、to_dateメソッドは↓
https://docs.ruby-lang.org/ja/latest/method/Date/i/to_date.html

# 最後に
ちっちゃいけど、なぜか地味にこういうのがおもしろい。

これを書き終えて、「あれ、ていうか今日の情報が欲しいなら、シンプルに`Date.today`でもいいんじゃ...」との疑問が湧いてきました。
@jnchito さんの記事で後で整理しよう...。
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c#time%E3%82%AF%E3%83%A9%E3%82%B9

そして、実はこの記事は今下書き中のもっとエモい記事の副産物記事であります。

追記：書きました！↓

https://qiita.com/kakudaisuke/items/b9835e1eef21bc001a71
かまいたちの漫才のあの台詞、構文解析してみた

## はじめに
皆さんはお笑いコンビ「かまいたち」の漫才「UFJ」の中で登場する、かの有名な言い回しをご存知でしょうか。

<b>もし俺が謝ってこられてきてたとしたら、絶対に認められてたと思うか？</b>

これを聞くと毎回、頭がきりきりと痛み始めます。


## 実装
そこで本記事では、構文解析ツール「CaboCha」に頼ることにします。
CaboChaをgoogle colaboratory上で動かすにあたって、以下のページが参考になりました。

[Google Colab で MeCab と CaboCha を使う最強の方法](https://qiita.com/tomowarkar/items/b6a89145c06956618542)

構文解析を以下のコードにより実行します。

```python
import CaboCha
cp = CaboCha.Parser()
sentence = 'もし俺が謝ってこられてきてたとしたら、絶対に認められてたと思うか？'
tree = cp.parse(sentence)
print(tree.toString(CaboCha.FORMAT_LATTICE))
```

## 実行結果

```python
* 0 2D 0/0 0.040745
もし	副詞,一般,*,*,*,*,もし,モシ,モシ
* 1 2D 0/1 1.241029
俺	名詞,代名詞,一般,*,*,*,俺,オレ,オレ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
* 2 3D 0/8 2.749115
謝っ	動詞,自立,*,*,五段・ラ行,連用タ接続,謝る,アヤマッ,アヤマッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
こ	動詞,非自立,*,*,カ変・クル,未然形,くる,コ,コ
られ	動詞,接尾,*,*,一段,連用形,られる,ラレ,ラレ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
き	動詞,非自立,*,*,カ変・クル,連用形,くる,キ,キ
て	動詞,非自立,*,*,一段,連用形,てる,テ,テ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
と	助詞,格助詞,引用,*,*,*,と,ト,ト
* 3 5D 0/1 0.313320
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たら	助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
、	記号,読点,*,*,*,*,、,、,、
* 4 5D 0/1 2.442421
絶対	名詞,副詞可能,*,*,*,*,絶対,ゼッタイ,ゼッタイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
* 5 6D 0/4 0.313320
認め	動詞,自立,*,*,一段,未然形,認める,ミトメ,ミトメ
られ	動詞,接尾,*,*,一段,連用形,られる,ラレ,ラレ
て	動詞,非自立,*,*,一段,連用形,てる,テ,テ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
と	助詞,格助詞,引用,*,*,*,と,ト,ト
* 6 -1D 0/1 0.000000
思う	動詞,自立,*,*,五段・ワ行促音便,基本形,思う,オモウ,オモウ
か	助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
？	記号,一般,*,*,*,*,？,？,？
EOS
```
基本情報技術者試験勉強0826

本日の積み上げ結果
基本情報技術者試験勉強
平成28年秋過去問
平成29年春過去問
間違えた問題の復習
AWSの本を読む

クラッシング　プロジェクトのスケジュールを短縮するために，アクティビティに割り当てる資源を増やして，アクティビティの所要期間を短縮する技法。

CPUにおける投機実行の説明　分岐命令の分岐先が決まる前に，あらかじめ予測した分岐先の命令の実行を開始する。

PCへの侵入に成功したマルウェアがインターネット上の指令サーバと通信を行う場合に，宛先ポートとしてTCPポート番号80が多く使用される理由　　Webサイトの閲覧に使用されることから，通信がファイアウォールで許可されている可能性が高い。

CRMの目的　顧客ロイヤリティの獲得と顧客生涯価値の最大化

スラッシング　仮想記憶システムにおいて主記憶の容量が十分でない場合，プログラムの多重度を増加させるとシステムのオーバヘッドが増加し，アプリケーションのプロセッサ使用率が減少する状態

CIOの果たすべき役割　全社的観点から情報化戦略を立案し，経営戦略との整合性の確認や評価を行う。

ストライピング　データを分散して複数の磁気ディスクに書き込むことによって，データ入出力の高速化を図る方式。

事業継続計画(BCP)について監査を実施した結果，適切な状況と判断されるもの　従業員の緊急連絡先リストを作成し，最新版に更新している。

ウイルス検出におけるビヘイビア法に分類されるもの　検査対象をメモリ上の仮想環境下で実行して，その挙動を監視する。

アクセス管理機能の検証　システム管理基準に基づいて，システムの信頼性，安全性，効率性を監査する際に，システムが不正な使用から保護されているかどうかという安全性の検証項目として，最も適切なもの。

メッセージの形式　EDIを実施するための情報表現規約で規定されるべきもの。

平均サービス回復時間　ITILでは，可用性管理における重要業績評価指標(KPI)の例として，保守性を表す指標値の短縮を挙げている。この指標に該当するもの。

JIS Q 20000-1は，サービスマネジメントシステム(SMS)及びサービスのあらゆる場面でPDCA方法論の適用を要求している。SMSの計画(Plan)に含まれる活動　権限，責任及び，プロセスにおける役割についての枠組みの作成

エンタープライズアーキテクチャ(EA)  各業務と情報システムを，ビジネス，データ，アプリケーション，テクノロジの四つの体系で分析し，全体最適化の観点から見直すための技法。

システムに関わるドキュメントが漏えい，改ざん，不正使用されるリスクに対するコントロールを監査する際のチェックポイントはどれか　ドキュメントの機密性を確保するための対策を講じていること。

サービスマネジメントシステムにおけるサービスの可用性　あらかじめ合意された時点又は期間にわたって，要求された機能を実行するサービス又はサービスコンポーネントの能力。

顧客番号をキーとして顧客データを検索する場合，2分探索を使用するのが適しているもの　顧客番号の昇順に配置されているデータ構造。

ソフトウェア開発の活動のうち，アジャイル開発においても重視されているリファクタリング　ソフトウェアの保守性を高めるために，外部仕様を変更することなく，プログラムの内部構造を変更する。

ディレクトリトラバーサル攻撃に該当するもの　攻撃者が，パス名を使ってファイルを指定し，管理者の意図していないファイルを不正に閲覧する。

企画，要件定義，システム開発，ソフトウェア実装，ハードウェア実装，保守から成る一連のシステム開発プロセスにおいて，要件定義プロセスで実施すべきもの　システムに関わり合いをもつ利害関係者の種類を識別し，利害関係者のニーズ，要望及び課せられる制約条件を識別する。

経済産業省とIPAが策定した"サイバーセキュリティ経営ガイドライン(Ver1.1)"が，自社のセキュリティ対策に加えて，実施状況を確認すべきとしている対策　自社のサプライチェーンのビジネスパートナが行うセキュリティ対策。

共通鍵暗号の鍵を見つけ出そうとする，ブルートフォース攻撃に該当するもの　一組みの平文と暗号文が与えられたとき，全ての鍵候補を一つずつ試して鍵を見つけ出す。

RDBMSが二つの表を結合する方法のうち，ソートマージ結合法に関する記述　結合する列の値で並べ替えたそれぞれの表の行を，先頭から順に結合する。

Webサーバの検査におけるポートスキャナの利用目的　Webサーバで稼働しているサービスを列挙して，不要なサービスが稼働していないことを確認する。

標本化　音声などのアナログデータをディジタル化するために用いられるPCMにおいて，音の信号を一定の周期でアナログ値のまま切り出す処理。

ひずみゲージ　変形を感知するセンサを用いると，高架道路などの状態を監視してメンテナンスすることが可能である。この目的で使用されているセンサ。

会議におけるファシリテータの役割　中立公平な立場から，会議の参加者に発言を促したり，議論の流れを整理したりする。

システム開発の進捗管理などに用いられるトレンドチャートの説明　作業の進捗状況と，予算の消費状況を関連付けて折れ線で示したもの。

不正競争防止法において，営業秘密となる要件は，秘密として管理されていること、事業活動に有用な技術上又は経営上の情報であることともう一つはどれか。　公然と知られていないこと。
S3やGCSでSPAやSSG、ISRのフロントエンドコードをホスティングするときに気をつけること

# 概要

SPAやSSG、ISRをS3やGCSなどのクラウドオブジェクトストレージでホスティングする場合、

静的コンテンツが存在するパス以外にアクセスするとクラウドオブジェクトストレージでステータスコードの403エラーを返します。

![S3_forbidden.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/9948b8ef-38cf-332c-0300-89f54cd8998e.png)

今回はこれを防ぐためにどのように対策するのがいいのかをアプリケーションコードによるHTTPの挙動を交えて説明しようと思います。

## 気をつけるポイント

- 例外処理の場合どこの層でルーティングされるのか
    - S3の層でルーティングされるのか、フロントエンドの層でルーティングされるのか

## 前提条件

- 今回はSPAを例にとって話をします
- 使う言語はVue.jsにします
- AWS環境です

# 例外処理でのフロントエンドでのルーティング

まずはVue.jsでのルーティングの挙動を確認していきます。

Vue.js と vue-routerで制定コンテンツが存在しない場合のルーティングの書き方は以下の通りになります。

```yaml
const router = new VueRouter({
  routes: [
    // コロンで始まる動的セグメント
    { path: '/user/:id', component: User }
    { path: '/*', component: NotFound }
  ]
})
```

参考資料: [https://router.vuejs.org/ja/guide/essentials/dynamic-matching.html#すべてキャッチするルート-404-not-found-ルート](https://router.vuejs.org/ja/guide/essentials/dynamic-matching.html#%E3%81%99%E3%81%B8%E3%82%99%E3%81%A6%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%81%99%E3%82%8B%E3%83%AB%E3%83%BC%E3%83%88-404-not-found-%E3%83%AB%E3%83%BC%E3%83%88)

これでVue.js上に存在しないパスにアクセスすると404エラーを返すようになるとお思いになるでしょう。

ただし、これだとS3の403エラーが返ってきます。

## よくはまるミス

これの原因は至ってシンプルです。vue-routerにアクセスする前にS3バケットにアクセスするため、S3のエラーが出てしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/e1191335-931d-cb19-47a3-a7ba96424367.png)


## 対策

これを解消するためにはS3の前にL7ロードバランサー or CDN(ここだとCloudFront)を置き、S3が403を返してきたときに/404.htmlにアクセスするように設定してVue.jsへアクセスできるようにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575547/9e9b4894-c345-ebb0-75e8-499e1a14ee5e.png)



# まとめ

今回はS3でフロントエンドのコードをホスティングしましたが、オブジェクトストレージでフロントエンドのコードをホスティングする場合は、コードの前段にホスティンサービスにリクエストが届くので、HTTPのリクエスト/レスポンスをねじ曲げる層が必要になってきます。そこを意識してインフラ構成を考えるとハマることが少ないと思います。

[こちら](https://dev.classmethod.jp/articles/s3-cloudfront-spa-angular-403-access-denied/)はSPA(AngularJS)でCloudFront+S3環境でホスティングする場合の具体的な対応が書いていますので、実装の時の参考にしていただければ幸いです。
[Tomcat]久しぶりにTomcatを起動したら、ポートの競合が起きていた件⇒その対処

# はじめに
私は過去の研修にて、Tomcatを用いたJava Servlet系のアプリを作ったことがあります。
先日それを久しぶりに起動しようとしたところ、なぜか起動しませんでした…何故だ?!

# ポートの競合が起きていた件⇒その対処
### 原因分析
元々TomcatのHTTP通信用ポート番号は、私の環境では"55000"を使用しておりました。
このためtomcatを起動すると、以下のURLにアクセスできるはずです。
http://localhost:55000/
それができないということで、Tomcat起動時のエラー文を見ると…

```text
16-Aug-2021 13:36:35.625 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-nio-55000"]
 java.net.BindException: Address already in use: bind
```

何やらポートが既に使われているようでした。

本当にポート番号は"55000"は使われているのか?
下記コマンドで調べると…

```bat
PS C:\Users\(ユーザ名)> netstat -nao

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  …
  TCP         0.0.0.0:55000          0.0.0.0:0              LISTENING       (PID)
　…
```

使われてました。
前は競合が起きていなかったので、いつの間にか使われるようになったのでしょう…

### 対処
対処法として確実なのは、tomcatのポート番号を変えてしまうことです。
tomcatのフォルダのうち"conf"フォルダにある"server.xml"を書き換えます。

``` conf.xml
    <!-- 変更前 -->
    <Connector connectionTimeout="20000" port="55000" protocol="HTTP/1.1" redirectPort="8443"/>
    <!-- 変更後 -->
    <Connector connectionTimeout="20000" port="55001" protocol="HTTP/1.1" redirectPort="8443"/>
```

そのうえでtomcatを再起動した結果、

```text
26-Aug-2021 00:23:13.208 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1513 ms
```

起動URL：http://localhost:55001/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655112/f6a3de36-8164-8095-ea0d-c1f51221a303.png)

起動に成功しました。

# おわりに
まだまだ私はポート番号のような通信関係の知識が少なく、今回の事象では最初は慌てていました。
この原因として考えられるのは、研修時のテキストにポートの競合に関する記載がなく
結果的に私自身がポート番号を気にしていなかったからと思います。
今後web系の案件に関わる場合、あるいは上流の工程に関わる場合に備えて、
今まで気にしていなかった知識にも目を向けていきたいです。
【初学者向け】まとめておさえるPHPの基本

#はじめに#
　PHPとは、サーバーサイド言語と呼ばれるものの一つで、ブラウザ上ではなくサーバーサイドで動き、さまざまな動的なWebページの生成やデータベースの処理などをやってくれます。

　動的なWebページとは、ページにアクセスした時の状況によって異なる内容が返されるWebページのことです。例えば、ログインが必要なSNSやショッピングサイトなどは人によって違う内容のページが表示されます。

　ちなみに静的なWebページとは、いつ誰が見ても同じ内容のページが表示されます。例えば企業のホームページなどです。


　PHPはデータベースからデータを取ってきて、状況に応じて異なるHTMLを生成するための言語になります。
　今回はそんなPHP(というよりプログラミング言語全般)を使うための最も基本的な２つの機能、「繰り返し」と「条件分岐」についてご紹介していきたいと思います。




#繰り返し#
　繰り返しには「for」「while」「foreach」の3種類があります。

##for文##

```php:for.php
for($i = 1; $i <= 10; $i++)
{
    echo $i;
}
```

\$i=1 で初期値を設定
\$i<=10で繰り返す条件を指定
\$i++で増減式を指定
｛｝の中には繰り返す処理の内容が書かれています。

　一巡目は\$iに1が代入され処理が実行されます。そして二巡目に移った時点で増減式の\$i++が実行されて\$iは2になり、また処理が実行されます。
　このようにして繰り返しは条件内で順番にループされ、条件から外れる(10より大きくなる)とループから抜けます。


##while文##

```php:while.php
$i = 1;
while($i <= 10)
{
    echo $i;
    $i++;
}
```

　for文とは違い、\$iはwhile文の外で定義されます。やってることはfor文と同じで二巡目、三巡目と繰り返すたびに\$i++が実行され、\$iの値が増えていきます。




##foreach文##

```php:foreach.php
$nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
foreach($nums as $num)
{
     echo $num;
}
```

　これが1番よく使われるかもしれませんのでぜひ覚えておいてください。
for文やwhile文があらかじめ条件を指定する必要があったのに対し、こちらはその必要がありませんforeach文では、配列の値の数だけ繰り返しが実行されます。配列の値の数によって繰り返し条件が変わるので非常に便利ですね。
　()の中は(配列 as 変数)という風に書きます。配列名は複数形、変数名は配列名の単数系にするのが一般的です。
　配列の中身を一つずつ取り出し、変数に入れていきます。最後の値まで処理が終わったところで繰り返しが終了されます。



#条件分岐#
　続いて条件分岐について見ていきます。

```php:if.php
$num = 80;

if($num >= 70)
{
   echo '合格です！';
}
```

　()の中には条件が記載されており、結果がtrueであれば｛｝の中身が実行され、falseの場合はスルーされます。

　この場合、\$numは80ですので条件に合致しているため、()内はtrueになり、{}内の処理が実行され「合格です！」という文字列が出力されます。

```php:else.php
$num = 60;
if($num >= 70)
{
  echo '合格です！';
} else {
  echo '不合格です・・・';
}
```

 if文の後ろにさらにelse文を追加してみましょう。こうすることで()内がfalseだった場合の処理を書くことが出来ます。この場合、\$numは70より小さいため()内はfalseとなり、else文の処理が実行されます。

```php:elseif.php
$num = 60;
if($num >= 70)
{
  echo '合格です！';
} elseif($num >= 60) {
  echo 'ぎりぎり合格です。';
} else {
  echo '不合格です・・・';
}
```

　elseif文を追加することで条件を追加することが出来ます。この場合、\$numは70より小さいのでif文の()内はfalseとなり、スルーされます。そしてelseif文の判定に移ります。\$numは60ですので今回はtrueになり、処理が実行されます。


#まとめ#

　PHPの最も基本的な部分についてまとめていきました。正直これだけでも簡単なアプリは作れてしまうので、ぜひアウトプットしてスキルを身につけていきましょう。
【UiPath】日付の0埋めを除いて取得する【VB.net】

DateTime型からToStringで取得します。

月の場合は
```Now.ToString("%M") ```
か、
```Now.Month.ToString ```
でOK。

```Now.ToString("M") ```
だと別の値が返るので注意です。

日にちの場合は```Now.ToString("%d") ```か```Now.Day.ToString ```です。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/60798e3e-55cc-6fb4-a177-9d3357675e9a.png)

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/1545a27d-ac3c-a42f-712a-8e9cd8532746.png)|
|:--|

## 参考

https://forum.uipath.com/t/topic/109784

https://teratail.com/questions/320015
JavaScriptを基本からまとめてみた【17】【try-catch｜エラーハンドリング】

##はじめに

####学習するに至った経緯
2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、卒業後、フロントエンドのエンジニアを目指す事に。
Javascriptの学習した事を言語化し、認識の深化による備忘録として記載。

##「try...catch文」とは

『try...catch文』は、予想していない異常によりエラーが発生するような場面で意図的に回避するための処理。

##「try...catch文」の使い方

tryブロック内に例外エラーが発生する可能性のある処理を記述し、例外が発生した場合にはcatchブロック内の処理が実行される。 catchブロックの引数にはErrorオブジェクトが渡される。

```sample.js
try {
    //例外エラーが発生する可能性のある処理
} catch(error) {
    //例外エラーが起きた時に実行する処理
}
```


```SampleExample.js
try {
    var greeting = "こんにちは、" + name + "です。";
    console.log( greeting );
} catch(e) {
    console.log( e.message );
}
```

```ExecutionResult.js
name is not defined
```
このコードを実行すると、変数nameが定義されていないという例外が発生する。通常はそこで処理が終了するが、try~catch文を記述していることでcatchブロック内の処理が実行される。Errorオブジェクトのmessageプロパティを使うとエラーメッセージを取得できる。

##throw文で例外を発生させる
throw文を使うことで、オリジナルの例外を定義することができる。

```sample.js
let num = "RED";
try {
    if(num.search(/^[-]?[0-9]+$/) === -1){
        throw new Error('変数numには整数を入れてください')
    } 
    var like = "好きな数字は、" + num + "です。";
    console.log( like );
} catch(e) {
    console.error( "エラー：", e.message );
}
```


このコードでは、変数numに数値以外の値が入っている場合にthrow文を使って例外を発生させている。throw文で文字通りcatchブロックにErrorオブジェクトを投げている。throw文が実行されると即座にcatchブロックの処理に移る。Errorオブジェクトのコンストラクタにはエラーメッセージを持たせることも可能。

##Errorオブジェクトとは
Errorオブジェクトはエラー情報を出力する際に使われるオブジェクトで、エラーの種類によっていくつかのオブジェクトが用意されています。

|  オブジェクト名  |  用途  |
| ---- | ---- |
|  Error  |  一般的なエラー全般で利用  |
|  ReferenceError  |  宣言されていない変数によるエラー  |
|  SyntaxError  |  プログラムの文法エラー  |
|  TypeError  |  想定された値と異なるデータ型によるエラー  |
|  RangeError  |  想定された許容範囲を超えた値によるエラー  |
|  URIError  |  不正なURIが指定されたことによるエラー  |
|  EvalError  |  不正なeval関数が実行されたエラー  |
throw文などで例外の種類によってオブジェクトを使い分けると、どのようなエラーが起こったかがわかりやすくなりデバッグにも便利。

##finally文で例外発生後の処理を記述する
『try~catch文』では、例外が発生した場合には即座にcatchブロックの例外処理に移るため、例外発生個所以降の通常処理は実行されない。例えば、メモリの開放処理やデータベースのコネクション解除処理などといった、例外の発生の有無にかかわらず必ず実行させたい処理がある場合にはfinally文を使用する。

```finally.js
    try {
        //例外が発生した場合の処理
    } catch (e) {
     //例外が発生した場合の処理
    } finally {
         //必ず実行される処理
    }
```
finallyブロック内に記述した処理は例外発生の有無にかかわらず必ず実行される。


##参考サイト
[【3分でJavaScript講座】try catch文]
(https://www.youtube.com/watch?v=I367V10JSsY&t=5s)
[JavaScriptのtry~catch文で例外処理をする方法]
(https://techplay.jp/column/629)
[【JavaScript入門】try…catchの使い方と例外処理のまとめ！]
(https://www.sejuku.net/blog/29293)
Lightsailにssh接続できない・プラグインの新規追加で検索できない時にとった方法

## 環境
Lightsail

## 症状
- LightsailのブラウザーベースのSSHターミナルを使用しインスタンス接続するも、黒い画面のまま
- FileZilla等でSFTP接続をするも、タイムアウトになる
- プラグインの新規追加をしようと検索するも、「不明なエラーが発生しました。WordPress.org またはこのサーバーの設定に何か問題が起きている可能性があります。問題が解決しない場合はサポートフォーラムに投稿してみてください。」と表示される

## 解決方法
1. インスタンスを停止
2. インスタンスの起動

[参考サイト](https://clean-copy-of-onenote.hatenablog.com/entry/2020/11/28/071518)

停止に数分、起動に数分かかったので、停止後にすぐ起動できなくても慌てないでください（LightsailはEC2インスタンスの停止よりも時間が長く、全然起動ができなかったので、おかしなことになったのかと冷や汗もんでした）

<br>

##### 参考サイトと共通の症状

- LightsailのブラウザーベースのSSHターミナルを使用しインスタンス接続するも、黒い画面のまま

- FileZilla等でSFTP接続をするも、タイムアウトになる

##### 参考サイトと違う症状

- インスタンス上に構築していたウェブサイトにアクセスすることができる

- 検索結果がでないので、プラグインの新規追加ができない

<br>

参考サイトを読む限りはインスタンスの物理的な障害の可能性が高いようです。
どうしようもない時は、インスタンスの停止→起動や再起動を試すことで解決するケースもあるというのを学びました。
STM32L010とCO2センサーモジュールMH-Z19CでCO2測定


x いろいろあるから回路、FWは、非公開

目的
ちょつと役に立つ物を作ってみた
今、コロナで流行りのCO2測定器
二酸化炭素濃度を測る

外部仕様
400から5000
AC100V(DC6V)からアダプターを使い内部5Vに変換
秋月のＣＯ２センサーモジュール　ＭＨ－Ｚ１９Ｃ　M-16142
ＳＴＭ３２マイコン　STM32L010F4M6
スタート後、約8秒　キャブレーション　リセットでも同じ
1秒毎に更新
7セグ4桁　見やすい為
仕様書通りに作ったら値がおかしいので調整した。


![h_con32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bd7b137f-e1e5-f930-0e27-2c020b7f80df.jpeg)
magento、DB確認場所


# はじめに

下記、さくナレの記事にて、使用したDBのテーブルの確認場所。

# リンクはこちら

https://knowledge.sakura.ad.jp/20206/

# 最終更新日

2021年8月26日

# 環境の情報

OS
ubuntu 20.04

# 実際に

```

vagrant@ubuntu2004:/var/www/html/magento$ 

mysql -u magento -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 424
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

```

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| magento            |
+--------------------+
5 rows in set (0.03 sec)

```

```

mysql> use magento
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

```



```
mysql> show tables;
+------------------------------------------------------+
| Tables_in_magento                                    |
+------------------------------------------------------+             
| my_news                                                                                                                                       
+------------------------------------------------------+
410 rows in set (0.08 sec)

```


```

mysql> select * from my_news;
+---------+----------+-------------------+---------------------+---------------------+
| news_id | title    | content           | created_at          | updated_at          |
+---------+----------+-------------------+---------------------+---------------------+
|       1 | 記事1    | これは記事1       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       2 | 記事2    | これは記事2       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       3 | 記事3    | これは記事3       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       4 | 記事4    | これは記事4       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       5 | 記事5    | これは記事5       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       6 | 記事6    | これは記事6       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       7 | 記事7    | これは記事7       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       8 | 記事8    | これは記事8       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|       9 | 記事9    | これは記事9       | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
|      10 | 記事10   | これは記事10      | 2021-08-26 03:30:28 | 2021-08-26 03:30:28 |
+---------+----------+-------------------+---------------------+---------------------+
10 rows in set (0.00 sec)


```
テストコード　記述するファイルを作成

雛形なるファイルの生成を行う。

```
ターミナル
ユーザー名 @ コンピューター名 カレントディレクトリ % rails g rspec:model モデル名
```

```
create  spec/models/モデル名_model.rb
```
ファイルの生成が完了。


spec/models/モデル名_spec.rb

```ruby:qiita.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end
```

RSpecにてMVCのテストを行うためには、rails_helperのファイルを読み込む必要がある。
require 'rails_helper'と記述することでファイルの読み込みが完了している。

##rails_helper##
RSpecを用いてrailsの機能をテストするときに共通の設定を記述しておくファイルのこと。
各テスト用ファイルでspec/rails_helper.rbを読み込むことで、共通の設定やメソッドを適用する。
rails g で作成したら、自動的に生成されている。
M5Paperが文鎮化したので蘇らせた

# 結論
SDカードを抜けばROMをEraseできる！
## 現象
ジェネリックなmicropythonを使いたくてROMを焼こうとしたらなぜかコケる。
何気なくM5BurnerのCOM MonitorでResetをクリックして見ていたらブートでコケている。
まさにこの状況。
[はおりん / はおっこ on Twitter: "esptool flash_idで Manufacturer: ff Device: ffff Detected flash size: Unknown ってなってる。さて…" / Twitter](https://twitter.com/haoling/status/1335761893982568448)
# おかしくなったら
SDカードとかセンサを外す。
いにしえのWindowsみたいだ……
## 参考文献
[はおりん / はおっこ on Twitter: "microSDを抜き差ししたらuploadできた。なんで！？" / Twitter](https://twitter.com/haoling/status/1335762512885633025)
4.1(標準) コーシー・シュワルツの不等式，共分散

## 方針

コーシー・シュバルツの不等式：

```math
\mathbb{E}_{X\sim f_X}[(X-\mu_X)^2]\mathbb{E}_{Y\sim f_Y}[(Y-\mu_Y)^2]\geq\mathbb{E}_{X\sim f_X,Y\sim f_Y}[(X-\mu_X)(Y-\mu_Y)]^2
```

を証明する．これより，相関係数：

```math
Corr(X,Y)=\frac{\mathbb{E}_{X\sim f_X,Y\sim f_Y}[(X-\mu_X)(Y-\mu_Y)]}{\sqrt{\mathbb{E}_{X\sim f_X}[(X-\mu_X)^2]}\sqrt{\mathbb{E}_{Y\sim f_Y}[(Y-\mu_Y)^2]}}
```

について，

```math
|Corr(X,Y)|\leq 1
```

が成り立つ．問題では，tについての二次関数：

```math
h(t)= \mathbb{E}_{X\sim f_X,Y\sim f_Y}[\{(X-\mu_X)-t(Y-\mu_Y)\}^2]
```

の判別式を求めることでコーシー・シュワルツの不等式を証明する．


## 答案

tについての二次関数：

```math
\begin{align}
h(t)&= \mathbb{E}_{X\sim f_X,Y\sim f_Y}[\{(X-\mu_X)-t(Y-\mu_Y)\}^2]\\
&= t^2\mathbb{E}_{Y\sim f_Y}[(Y-\mu_Y)^2]-2t\mathbb{E}_{X\sim f_X,Y\sim f_Y}[(X-\mu_X)(Y-\mu_Y)]+\mathbb{E}_{X\sim f_X}[(X-\mu_X)^2]
\end{align}
```
について，定義より，任意のtに対し，

```math
h(t)\geq 0
```

が成り立つので，二次方程式h(t)=0の判別式をDとおくと，

```math
D=4(\mathbb{E}_{X\sim f_X,Y\sim f_Y}[(X-\mu_X)(Y-\mu_Y)])^2-4\mathbb{E}_{X\sim f_X}[(X-\mu_X)^2]\mathbb{E}[(Y-\mu_Y)^2]\leq 0
```

なので，コーシー・シュワルツの不等式が証明された．

次に，コーシー・シュワルツの不等式の等号成立条件を考える．h(t)を平方完成して，

```math
\begin{align}
h(t)&= t^xVar(Y)-2tCov(X,Y)+Var(X)\\
&= Var(Y)\{t^2-2t\frac{Cov(X,Y)}{Var(Y)}\}+Var(X)\\
&= Var(Y)(t-\frac{(Cov(X,Y)}{Var(Y)})^2-\frac{\{Cov(X,Y)\}^2}{Var(Y)}+Var(X)
\end{align}
```

より，

```math
-\frac{\{Cov(X,Y)\}^2}{Var(Y)}+Var(X)=0
```

の時h(t)=0なので，

```math
Cov(X,Y)=\pm\sqrt{Var(X)}\sqrt{Var(Y)}
```

の時等号成立．

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
no basic auth credentialsでdocker build出来ない

# 起きたこと
`docker build`しようとしたら`no basic auth credentials`と言うエラーが出てうまく行かない
S3環境を見に行けてなかったっぽい（エラーログ保存し忘れました）

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html

>aws ecr get-login-password コマンドを使用して Docker に対して正常に認証されても、HTTP 403 (Forbidden) エラーが発生したり、docker push コマンドまたは docker pull コマンドからのエラーメッセージ no basic auth credentials が表示されたりする場合があります。この問題の既知の原因をいくつか次に示します。



# 解決策
## 1.AWS CLIインストール
もうしてある人は飛ばしてOK

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html

バージョン2が推奨されてる感じだったのでバージョン２をインストールしました。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

MacOSを選択。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

手順に沿って最新をインストールしました。

## 2.AWS CLIセットアップ

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region

上記URLに沿ってセットアップを行います。

設定の基本に書いてある方法でアクセスキー ID とシークレットアクセスキーを発行します。

```
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```

上記コマンドにアクセスキーID、シークレットアクセスキーを当てはめます。
`region`は東京なので自分は`ap-northeast-1`を設定しました。
`Default output format`は例に習ってjsonを設定しました。

## 3.デフォルトレジストリに対して認証する

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region

AWS CLIなので

```
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
```

これに自分の情報を当てはめていきます（上記リンク先赤文字部分）。
`region`は先程自分が指定したregion、`aws_account_id`はAWSのアカウント設定の一番上に書いてあります。

これで`no basic auth credentials`は出なくなると思います。


# 終わり

AWS公式ドキュメントにキレイにまとめられているので助かりました。
テストコード　RSpecの設定方法

gemfileにgemの追加を行う。

```ruby:qiita.rb
group :development, :test do
<略>
gem 'rspec-rails', '~> 4.0.0' →追加gem
end
```

group :development, :testというグループの中に記述する。
動作を制限するため。

```
ターミナルにて
ユーザー名@PC名 カレントディレクトリ % bundle install

その後
ユーザー名@PC名 カレントディレクトリ % rails g rspec:install
```

インストールが済んだら

```
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```

ディレクトリやファイルが生成される。
rspecの設定を完了するために

```ruby:qiita.rb
.rspecファイル
--require spec_helper →デフォルト
--format documentation
```

設定完了。
vagrantファイルメモリ設定箇所

# はじめに
vagrantファイルにメモリの設定を書く。


# 最終更新日

2021年8月26日

# 環境の情報

OS
ubuntu 20.04


# 場所
vagrantファイルのここのコメントアウトを外します。



```rb
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
```
【Scratch】イージング最強

Scratchでイージング使ったら最強すぎた。
というわけでプログラム紹介します。

![Screenshot 2021-08-26 19.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525654/7f93c3a0-9ed5-1810-97bf-3c7653502cfa.png)
これです。"目的地"のとこには目的地の座標が入ります。
わかるでしょうか....目的地に近づくにつれて変える座標が細かくなっていってます。
それでなめらかに見えます。
横に動かしたいときはy座標のとこをすべてx座標に変えます。
んで、「<>まで繰り返す」や「マウスのポインターに触れたなら」などの制御と組み合わせたら！！！すごく使いやすくなります。

では！！！
DOTweenでSequenceをthis.DOKillする方法。SetIdとSetTargetの違い。

#SetIdを使おう！
`SetId(this)`を使用します。

```c#:MyMonobehaviour.cs
void Start()
{
    DOTween.Sequence().Append(~~).SetId(this);
}

// 上のSequenceが止まります。
void Stop()
{
    this.DOKill();
}
```

Sequence以外にも使用できます。

```c#:MyMonobehaviour2.cs
public Transform image1Transform;
public Transform image2Transform;

void Start()
{
    image1Transform.DOMove(Vector3.one, 3.0f).SetId(this);
    image2Transform.DOMove(Vector3.zero, 3.0f).SetId(this);
}

//両方とも止まります。
void Stop()
{
    this.DOKill();
}
```

#上級編：SetTargetとの違い
`SetTarget`でも動きますが、用法が異なります。
`SetTarget`はターゲットを設定した上でIdをそのターゲットにするため、見た目上は正しく動くのですが、普段使いするには`SetId`を使用するのがよいそうです。

`SetTarget`は次のように**自作のDOTweenを作る時**に使います。

```c#:MyDOTween.cs
public static class MyDOTween
{
    // DOMoveのVector3 endValueをTransformに変えたもの。
    // 指定時間かけてendTargetを追いかけます。
    // endTargetの位置が変わっても追いかけてくれるのが特徴です。
    // 味方キャラが手を伸ばして取ったコインをアタマの上に移動させる時などに便利です。(そのキャラのアタマの上がendTargetになります)
    public static Tweener DOChase(this Transform target, Transform endTarget, float duration)
    {
        var firstPosition = target.position;
        var doChase = DOVirtual.Float(0, 1, duration, v => target.position = Vector3.Lerp(firstPosition, endTarget.position, v));
        doChase.SetTarget(target); // ←ここで使ってる！！！！
        return doChase;
    }
}
```
モータで紙や布を巻く等速PI制御


会社の案件で、理論的な背景があるのでまとめておく

# モータを使って生地を巻く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/5f150496-9cc0-40b2-a681-5746b8d17f81.png)



- 送り駆動モータと自由に回転する円盤で、生地同士が繋がっている
- 送り駆動モータは、半径$R_0$、一定の回転速度$\Omega$であり、入力として与えられる。(案件ではステッピングモータを使用しましたが、DCモータでも可です)
- 中間地点にロータリーエンコーダが付いており、送り速度$v$をエンコーダから読み取った値$u$を使って、等速に制御する。
- ロータリーエンコーダには極端な偏芯がないものとする
- 送る生地は、摩擦があり、円盤は滑らずに転がるものとする


# 応用出来そうな例

例えば、メカ構成を変えると、中間に衝立を置くような構造だったり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/7d01ba8d-f2ee-1de6-6cd1-49c74263a6a0.png)


よく物理学の教科書で出てくるような一定張力の滑車の問題のような形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/1bffdd24-b978-9513-9ba8-f98717af34b2.png)


などに応用出来そうである。

また、今回巻いた対象物は生地であるが、トイレットペーパーを巻いたり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/63f05736-2035-37dc-7090-51ad491f86d1.png)

面白いことが出来るかもしれない。

# ブロック図

## 通常の制御

通常はDCモータなどを使用して等速制御したり、トルクモータを使って等張力を実現したりする。

例えば、[東北学院大学　熊谷教授の教材](http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/mechatronicsB/archive/2015/MechatroCS_No14.pdf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/357aeb13-636c-f2a5-0c73-1c1a9003b335.png)

こんな感じになっていて、DCモータの駆動入力は電流部なので、速度に変換した後、電流に変換するという2段ステップを挟む必要がある。

## ステッピングモータの場合

一方で、ステッピングモータは、一定角度を同軸上に回転させるモータである。
全てパルス制御によって回転を行い、1パルスに対して同じ角度$\Delta\theta$が与えられる。

オリエンタルモータのサイトが分かりやすいだろう。

https://www.orientalmotor.co.jp/products/stepping/overview_1/

この場合、電流指令に対応する部分はパルス駆動で代替されるので、その部分が不要になり、
速度制御のパラメータが減り単純な構成となる

私が考えた方式がこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/1a53bb5b-f1af-ff10-8d9b-4a07f09b2248.png)


PI制御での駆動を行なう。
厳密には、エンコーダ角速度≠モータ角速度であり、**角度微分はエンコーダ入力から与える必要があるが、その部分をP制御で代替し、エンコーダの角度微分(に相当するフィードバック量)を与えられるようにする。**

また、I制御を追加することで、**巻いたサンプルの累積誤差を抑制する。**
巻取り続けると、送り駆動モータの半径が上昇し、送り駆動モータの角速度$\omega$に対して、モータ面の生地の速度$v$は上昇する。
この上昇する性質をP制御のみで行おうとすると、生地が綺麗に巻けていないときに困るので、累積値もフィードバックとすることで最適値を設定できるようにした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/d61dc24c-4852-63ed-7e5c-e4ba417fc701.png)

**速度は、エンコーダパルスが入れば入るほど、下がるように設定する。
太ってきた部分に対して、生地の面の径が大きくなるので、表面の速度が高くなるためだ。**

電流制御に関しては、送り駆動モータがステップ角を与えられる。
電流が小さくなる制御の代わりに、ステップ角に対する速度を遅くする制御に切り替えた。この遅くする制御は巻き始めの角速度$\Omega_0$に対して概ね線形に変わるものと予想されたので、フィードバック量$\delta u'$が0に近い場合、巻き始めの角速度に近いものとして制御するようにした。

サンプリングは50ms単位で行い、平均化は500ms（10データ単位）で実施.　Systick割り込みをVC++で生成することでサンプリングを実現

駆動側モータのローラ径は28mm

# 効果検証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/cec9dae3-d746-95c0-da22-fbf3dfe6e472.png)

ノイズによるバラつきはあるものの、後半ではある程度安定してエンコーダ信号が設定されていることが分かる
前半が難しい理由としては、前半は巻取り時にノイズが大きくなるためであり、この部分に関しては信号取得を省いている。

本来であればもう少し安定化も実現できる可能性があるものの、
全体を通して一定に近い速度で推移していれば良いので、今回の設計においてはこれで十分と判断した
Excelのリンク最大文字数

上司「リンク開けないんだけど？他のExcelならリンク開けるよ。なんで開けないの。開けないはずは無い」
って言われたけど、
私「今回は文字数多くないですか？、そのせいだと思いますよ」

↓調べる①
Excelの最大文字数
255文字
https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E5%88%B6%E9%99%90-1672b34d-7043-467e-8e27-269d656771c3

ん？リンクは240文字、、、。言い訳にならない。
調べる②
Excelのリンクで開ける最大文字数
https://docs.microsoft.com/ja-JP/office/troubleshoot/office-suite-issues/error-open-document
218文字
これですね。
フォルダ名が240文字超えているので、リンククリックで開くことはできませんという仕様。と伝えました。というお話。
もちろん回避策で可能ですが、今回はそこまでする話ではなかったので、除外。
（Rails tutorial）rails server がエラーになった際の備忘録

[rails tutorial](https://railstutorial.jp/)（Rails 6.0）の内容に沿って進めていた時のメモです。

# ぶち当たった現象＆やってみたこと
`rails s` したら下記のような表示が出て、ローカルサーバーが起動せず。
（筆者は第2章にて）

```
=> Booting Puma
=> Rails 6.0.3 application starting in development 
=> Run `rails server --help` for more startup options
warning Integrity check: System parameters don't match                                                        
error Integrity check failed                                                                                  
error Found 1 errors.                                                                                         


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.22.5
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.


Exiting
```

第1章では特に問題なかったのにクソ〜と思いつつ、とりあえずエラー文を読んでみる。

```
Please run `yarn install --check-files` to update.
```
とあるので、ひとまず言われた通りに `yarn install --check-files` を実行。

ここでも下記のようにエラーっぽいのが出た。

```
・
・
・
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
error webpack-dev-server@4.0.0: The engine "node" is incompatible with this module. Expected version ">= 12.13.0". Got "10.24.1"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```
nodeとモジュールの互換性がないとかそんな感じ？

ひとまず上記のエラーは無視して、もう一度 `rails s` を実行するも、また冒頭と同じエラーになり困った。


# 解決した方法
ググってみると、似たような状況について書いてくれている人たちがいて感謝…！
下記の流れでひとまず解決（ローカルサーバーは立ち上がるようになった）。

① node_modulesを削除

```
$ rm -rf node_modules/
```

② yarn.lockファイルを削除

```
$ rm -rf yarn.lock
```

③ yarnをインストール

```
$ yarn install
```

`yarn install` 後は「nodeとモジュールがなんたら…」といった上記と同様のエラーが出たが、この状態で再度 `rails s` を実行すると、無事ローカルサーバーが立ち上がった。

（ここではnodeのエラーは見なかったことに）


## 参考記事
下記の記事を参考にさせていただきました。ありがとうございました！
>[Rails6 開発時につまづきそうな webpacker, yarn 関係のエラーと解決方法](https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0)

>[【解決】Your Yarn packages are out of date! Please run `yarn install` to update.]
(https://qiita.com/___xxx_/items/2df7fb111954fd0db4ed)
Swift for ios app のTextFieldの移動方法

# Swift for iOS APP メモ
## キーボードをあげて表示を行う
チャットなどアプリでTextFieldに文字を打ち込みたいときに、TextFieldをキーボードの上にあげる方法

 `AppDelegate.swift` に以下のコードを追加する。

```swift:AppDelegate.swift
import IQKeyboardManagerSwift

func application()

     IQKeyboardManager.shared.enable = true
     IQKeyboardManager.shared.enableAutoToolbar = false
     IQKeyboardManager.shared.shouldResignOnTouchOutside = true


```

これのみで完了
フロントエンドの学習で、初心者にはReactよりもVue.jsをオススメする理由

# フロントエンドの学習で、初心者にはReactよりもVue.jsをオススメする理由

初心者の方が、フロントエンドの学習をしていくときに、

Reactを学習するのか、

Vue.jsを学習するのか。

こういうところで悩んでいる方もいらっしゃいます。

そんな初心者の方に、

個人的な意見ですが、

初心者がフロントエンドの学習をするのであれば、

ReactよりもVue.jsの方が、

取り組みやすくてオススメです。

この記事の内容は、以下に移動しました。

[記事：フロントエンドの学習で、初心者にはReactよりもVue.jsをオススメする理由](https://manabupanda.net/begineer_start_frontend_programming_react_better_vue_js/)
【Java】リクエストパラメータの取得

<h2>リクエストパラメータとは</h2>
<p>リクエストパラメータはjspのフォームから「名前」と「値」を受け取ることができます。
下記に参考コードを記述します。</p>


```
<form name="" action="呼び出したいServlet,jsp" method="post">
ユーザ名：  <input type="text" name="user"><br>
パスワード：<input type="text" name="pass"><br>
           <input type="submit" value="送信">
</form>
```

<p>
action属性：送信先のサーバーサイドプログラムを記述します。Javaの場合はサーブレットかJspファイルを指定します。</p>

<p>method属性：リクエストメソッドを記述します。GETかPOSTを選択。</p>

<h2>サーブレットでリクエストパラメータを取得する</h2>

<p>jspの準備はできたのでサーバーサイドプログラムのサーブレット側でパラメータを取得をしたいと思います。</p>


```
@WebServlet("/呼び出したいServlet")
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
		//リクエストパラメータの文字コードを取得
		request.setCharacterEncoding("UTF-8");
        String user = request.getParameter("user");
        String pass = request.getParameter("pass");
        }
```

<p>String user = request.getParameter("name属性の値");のように
リクエストパラメータの値を取得するにはname属性を引数で指定する必要があります。</p>

<h2>応用編</h2>
<h4>hiddenパラメータ</h4>
<p>input type="hidden" name="pass" value="値"のようにhiddenパラメータという部品を利用すると、
画面には表示されず値を取得することができる。</p>

```jsp:jsp
<form name="" action="呼び出したいServlet,jsp" method="post">
ユーザ名：  <input type="text" name="user"><br>
           <input type="hidden" name="pass" value="値"><br>
           <input type="submit" value="送信">
</form>
```

<h4>リクエストの先に？をつける</h4>
<p>リクエストの先に？をつけることで、値を取得することができます。リンクの場合とフォームの場合で使うことができます。</p>

<h5>リンクの場合</h5>

```
<a href="Servlet?名前=値">リンク先</a>
```

<h5>フォームの場合</h5>

```
<form name="" action="Servlet?名前=値" method="post">
           <input type="submit" value="送信">
</form>
```
<h2>まとめ</h2>
<p>リクエストパラメータはよく使われるので、復習のためにコードを書いてみました。
WindowsクライアントをActive Directoryドメインから抜く場合のトラブル


お仕事でActive Directoryドメインに参加してる端末を別ドメインに移すため一旦現ドメインから抜いた時にハマった…

クライアントをドメイン抜いた後再起動すると、
その後ローカルの何かしらのユーザーでログオンすることになるんだけど
そのユーザー（＝パソコン開梱後後初期設定したユーザー）のことって数年前のことなんで記憶がなくなりがち。
ログオンできないと再度ドメインに入ろうにもそもそもそこまでたどり着けないのでハマるんだよね…
ドメインから抜くときにローカルユーザーでログオンする必要あるから注意せーよ！とご丁寧にメッセージが出るけど
今回ハマったのは同じ時期に導入した？端末の２台目だったので同じユーザーで行けるやろ！と確認を怠ったため。
ドメイン抜く前にはローカルユーザーにちゃんとログオンできるか確かめましょう。


とは言ってももう後の祭り。
今回は色々調べてなんとかしたのでメモ残しときます。

まず、どうにかしてログオンするためにセーフモードを使えば良いらしいと調べはついたけど
セーフモードの入り方もWindows 10だと初期状態ではめんどくさいことに回復モードからしか入れくなってた…
どうやって入るかというと、Windowsの起動中（くるくる回るアニメーションが出てる間）に
電源を強制的に切る！しかも２回連続で！らしい。
しばらくクライアント端末セットアップの最前線から離れてたうちにこんな仕様になってたとは…
こんなことして端末大丈夫なんかいな、と思いつつこれで何とかセーフモードに入る。

セーフモードはAdministratorユーザー固定でログオンするみたいで
この端末はもともとAdministratorアカウントが無効にされてたっぽいけど
アカウントが有効にされた上でログオンしてるっぽい（ようこそ画面が出てた）
でも無効だったからかパスワードを変更しようとしてもできない…？
のでローカルユーザーアカウントを別途作成してAdministratorsグループに参加させた。

ここまで来たら、後は再起動して自分で作ったユーザーでログインすれば
管理者権限持ってるから新しいドメインに参加させてデータ移して無事移行完了。

トラブルなきゃ30分もかからん作業なのに割と時間持ってかれたよ…


後々のために簡単にセーフモードに入れる設定変更の変更もメモ。
コマンドプロンプト（管理者）で以下のコマンドを打つと、
F8を押して起動すれば、Windows 7時代の懐かしいブートメニューから簡単にセーフモードに入れる。
bcdedit /set {default} bootmenupolicy legacy
DIO, DOUT, QIO, QOUTって、なんなん？

## はじめに

M5StickC Plusを使っていて、とある[不具合](https://pcbartists.com/firmware/esp32-firmware/1162-mmu-set-00010000-pos-00010000-esp32-boot-loop-solved/?fbclid=IwAR2Qgdr7bfCvjnHnGAoxOnxRtU4O3nvkSe5GwUqUkDcph7tiryTwS-OUnoo)にぶち当たました。解決策が「QIOで書き込まずにDOUTで書き込め」でした。そういえば、フラッシュの書き込みモードってよく知らんかった。
ということで、調べました。

##  SPI Flash Mode

https://www.esp32.com/viewtopic.php?t=1250

翻訳監修：DeepL先生

### DIO 
SPIホストは、「Dual I/O Fast Read」コマンド(BBh)を使用します。2本のSPIピンは、コマンドのフラッシュアドレス部分の書き込みと、フラッシュデータの読み出しに使用されます。そのため、これらのフェーズに必要なクロック・サイクルは、標準的なSPIに比べて半分になります。

### DOUT 
SPI ホストは「Dual Output Fast Read」コマンド(3Bh)を使用します。2つのSPIピンがフラッシュデータの読み出しに使用されます。1本のMOSIデータ・ピンでアドレスが書き込まれるため、DIOよりも若干遅くなります。

### QIO 
SPIホストは「Quad I/O Fast Read」コマンド(EBh)を使用します。コマンドのフラッシュ・アドレス部分の書き込みと、フラッシュ・データの読み出しには、4本のSPIピンが使用されます。そのため、これらのフェーズに必要なクロックサイクルは、標準的なSPIに比べて1/4になります。

### QOUT 
SPIホストは「Quad Output Fast Read」コマンド(6Bh)を使用します。4本のSPIピンがフラッシュデータの読み出しに使用されます。1本のMOSIデータピンでアドレスが書き込まれるため、QIOよりも若干遅くなります。

（了）
公式資料を使ってゼロから2時間でAWSの全体像を理解しよう！

## 記事の目的

この記事は

- AWSについて全く知らない
- AWSの名前くらいは聞いたことがある
- AWSってなんなのかよく分からない

といった方々が、

- AWSとはなんなのかイメージできる
- 今後の学習をスムーズに進めることができる

ようになるための助けになる情報をご紹介します。

また、AWSに関する情報は色んな形でたくさんのものがありますが、今回はAWSの公式資料に絞って取り上げています。

**ご自身の学習ももちろんですが、後輩やチームメンバーなどこれからAWSを学習する方にこの記事をご紹介いただけるとよいのではないかと思います！**


## 2時間でAWSの全体像を理解するための公式資料

それでは早速資料を見ていきましょう！

#### 1.「クラウド (クラウドサービス) とは？」（Webページ）

こちらは公式のWebページです。

「そもそもクラウドとは？」という大前提の部分をまずは押さえておくのにおススメの内容です。

https://aws.amazon.com/jp/cloud/

#### 2. 「AWS の クラウドが選ばれる 10 の理由」（Webページ）

こちらも公式のWebページで「AWSの強み」や「AWSを利用するメリット」といった情報が分かりやすくまとまっています。

こちらもAWSを利用・学習していくのであれば大前提の内容になりますので是非一度はチェックしておきたいページです。

https://aws.amazon.com/jp/aws-ten-reasons/

#### 3. 「はじめてのAWS～クラウドの有効活用を考える～」（動画：39分）

ここからは動画ベースの資料になります。

こちらはAWSのエバンジェリストである亀田信治さんがお話されている映像で、名前の通りAWSの入門にぴったりの内容になっています。

１つだけ注意点として、こちらの動画を見るには **フォームへの登録が必要** です。

初めて見るとハードルに感じてしまうかもしれませんが、AWSのイベント申込時などにもよくある形式のもので、フォーム送信後の画面ですぐに動画を視聴し始めることができます。

https://pages.awscloud.com/hajimete-ondemand-jp.html

#### 4. 「いまさら聞けない AWS 入門 | AWS Summit Tokyo 2016」（動画：41分）

こちらは公式のYoutubeで紹介されているもので、2016年の AWS Summit（AWSの年次カンファレンスイベント）の映像となっています。

若干スライドが見づらいですが亀田さんの動画とは少し違った観点からAWSの入門情報を学ぶことができます。

https://www.youtube.com/watch?v=wVlRnmB6Ra4

#### 5. 「AWS再入門 - 基本的なサービスをおさえる | AWS Summit Osaka 2019」（動画：36分）

こちらも AWS Summit で行われたセッションの映像となっています。

先ほどの動画との違いとしてはAWSの基本的なサービスが取り上げられている点です。

AWSのサービスは膨大な数がありますが「まずはこれだけ押さえておこう！」といったサービスを知ることができるのでこれから学習を始める前に見ると効果的です。

https://www.youtube.com/watch?v=LgNbu_joVhc

## 次のステップ

こちらで紹介した記事をご覧いただいた後の次のステップとしては、いくつかある基本的な概念や具体的なサービスを学んでいく流れになるかと思います。

AWSの入門資格である「クラウドプラクティショナー」の学習を行うと体系的な知識を得られますが、最初は興味のあるものをつまみ食いしていくスタイルもいいかもしれませんね。

具体的な内容としては気付いたタイミングで追記していくか、今後別の記事にまとめていければと思っているのでLGTMやコメントなどして頂けると早く記事になるかもしれません（笑）

## おわりに

AWSに関する公式資料は各サービスの使い方やユースケースなど比較的細部を紹介するものが多く、そもそもの全体像を理解できるようなものは意外と少ないように感じます。

今回紹介した資料をご覧になって頂くと、

**「なんとなくAWSってこういうものなんだな」**

**「AWSの雰囲気ってこんな感じなのか」**

**「細かいことはまだよく分かんないけどAWSってすごい！」**

といった感想を抱いて頂けるんじゃないかなと思いますので、これからAWSの学習を始める方は参考にしてみてもらえると嬉しいです！
IoTプロジェクトで定義しておきたい内容と実現するためのメモ


## 本記事の目的
* IoTなどのデバイス通信させたいとき、色々な方向から解決を考える際の参考になってほしい
	* 例えば、通信する時Wi-Fiは必須！ではなく、[テレビから出る音に反応して光るもの](https://rhizomatiks.com/release/2020/10/08/home-sync-light/)だったりが考えつけるような手助けになったらいいな

## デバイスの種類
* スマートフォン
    * Webアプリ
    * ネイティブアプリ
* PC
    * Mac
    * Windows
    * Linax
* マイコンやワンボードコンピュータ
    * Arduino
    * M5Stack
    * RaspberryPi
* 製品のコントローラー
    * ニンテンドーSwitchのジョイコン
    * PSコントローラー
    * Oculusコントローラー
    * ラジコン
* 電波発信する製品
    * BLEビーコン
    * MAMORIO等

## 環境

やはり現在主流となっているインターネットにつなげるために、Wi-Fiルーターの電波が届くのかどうか、ルーター設置ができるのかどうかが大きな要因になっていると思われる

* 長距離
    * 主にインターネット越し
* 一定の地域内
    * Wi-Fiが届くのか
* 建物内 20m以内くらい
    * Wi-Fiルーターがある
    * サーバー、中継機がある
    * デバイス同士しかない M2M
* 部屋内 5m以内くらい
    * デバイス間に障害物がない
    * Wi-Fiルーターがある
    * サーバー、中継機がある
    * デバイス同士しかない M2M
* 近距離
    * 接触している
* 混線具合

### 同期タイミング

タイミングによっては普段は長距離だが、近距離通信のものでも可能ということもありうる

* 常に 1毎秒以内くらい
* たまに
* ある一定のトリガーで
    * ユーザーの操作によって
    * 近づいたら

---

以上までがだいたいやりたいことベースの話になるかなと

以下からはじゃあどう実現しようかというものになるかなと

## さまざまな通信方法

以下の階層は、用語の定義の階層とは違います

* インターネット、TCP/IP
* Bluetooth
* XBee
* NFC
* USBケーブルなどの有線
    * シリアル通信
* 音響通信
* 映像による通信
    * 赤外線リモコンなどの光
    * QRコード、バーコード
    * 画像処理
* その他利用可能な周波数帯
    * https://www.tele.soumu.go.jp/resource/search/myuse/use/ika.pdf

### インターネットの利用方法

* LANケーブル
* Wi-Fi
* 電話回線
    * SORACOM
    * sakura.io
* サブギガヘルツ帯での通信
    * LoRa

### インターネットを利用した通信方式

* HTTP
    * GETやPOST
* MQTT
* Socket
* シンプルなTCP、UDP通信
* OSC
* MJPEG

## サービスや製品

インターネットにつながる前提

通信を受け取るサーバー環境が作れるものだったり、すぐに情報を共有できるもの（利用したことないものもある）

* AWS IoT Core
* Firebase
    * RealtimeDatabase
    * FireStore
    * Functions
* GCP
    * pub/sub
* Goole Apps Script
* Youtube
* GoogleDrive
* IFTTT
* LINE
    * LINE Notify
    * LINE MessagingAPI
* IBM Cloud
* Netlify Functions
* Heroku
* CloudMQTT
* Beebotte
グラフ表示　入れたgemはChartkickですが、グラフ描画はchart.jsで書いています。

<h2>初めに</h2>

今回は、こんな感じで棒グラフと、折線グラフを実装しました。

![スクリーンショット 2021-08-26 17.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/e13e36fc-f7cb-9ed2-e923-18c8ae40a6c8.png)

以前、以下の記事で折線グラフは作成済みではあり、
やり方はほとんど一緒です。
この記事ではグラフのコードの解説のみなので、
gemの導入、投稿数の取得方法については以下の記事をご確認ください。
ユーザーがもらったいいね数の取得方法については追って記事を作成する予定です。

https://qiita.com/ki_87/items/37e9f42c118f87416aa6


https://qiita.com/ki_87/items/c105fd2661b5f25836ea

<h2>Javascriptの記述</h2>

turbolinksを無効にしなくてもグラフは表示できました。

一応、chart.jsでの基本の書き方は以下になります。

https://www.chartjs.org/docs/latest/

```html
 <canvas id="myChart_2" width="200" height="48"></canvas>
　　　<!--グラフの記述-->
        <script>
        var ctx = document.getElementById("myChart_2").getContext('2d');
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['6日前', '5日前', '4日前','3日前', '2日前', '1日前', '今日'],
                datasets: [{
                    label: "投稿数",
                    data: [<%= @posts.created_6days_ago.count %>,<%= @posts.created_5days_ago.count %>,<%= @posts.created_4days_ago.count %>,<%= @posts.created_3days_ago.count %>, <%= @posts.created_2days_ago.count %>, <%= @posts.created_yesterday.count %>, <%= @posts.created_today.count %>],
                    backgroundColor: 'rgba(30, 144, 255, 0.5)',
                    borderColor: 'rgba(30, 144, 255, 0.5)',
                    fill: false},{
　　　　　　　　#ここから重ねる２個目のグラフ
                    label: "もらったいいね数",
                    data: [<%= @point.created_6days_ago.count %>,<%= @point.created_5days_ago.count %>,<%= @point.created_4days_ago.count %>,<%= @point.created_3days_ago.count %>, <%= @point.created_2days_ago.count %>, <%= @point.created_yesterday.count %>, <%= @point.created_today.count %>],
                    backgroundColor: "rgba(255,0,0,0.4)",
                    borderColor: 'rgba(255,0,0,0.4)',
                    type: 'line',
                }]
            },
        });
      </script>
```

borderColor: 'rgba(30, 144, 255, 0.5)',とありますが、
最後の0.5とかの数字をいじればもっとぼかしたりできます。
以下のサイトを参考に綺麗なグラフが作れるかと思います！


https://www.webcreatorbox.com/webinfo/color-name
マテリアライズド・ビューの完全リフレッシュで一時的にデータが消える

# はじめに
マテビューリフレッシュのタイミングにマテビューからのデータ取得処理が走っており、
その時に意図しない`NullPointerException`が発生していました。
必ずヒットするマテビューなのでコードを見ても原因を特定できず、
リフレッシュ回りを調べてみたところ「なるほど…」となったため備忘録として残します。

# 環境
oracle：12.2.0.1.0

# 原因
[こちら](https://qiita.com/plusultra/items/86055095e6e3f21772e9)で紹介してくださっていますが、

　・`atomic_refresh`が`true`：`delete`によってデータを削除する
　・`atomic_refresh`が`false`：`trancate`によってデータを削除する

という違いがあるようです。

現状のリフレッシュ処理を確認すると、以下のように`false`が設定されていました。

```sql
exec dbms_mview.refresh(list=>'&1',method=>'C',atomic_refresh=>FALSE);
```

`delete`はトランザクションが効き、`trancate`はトランザクションが効きません。
そのため`atomic_refresh`を`false`でリフレッシュするとテーブルの中身が無くなるタイミングが生じます。

# 結果
`trancate`を用いたリフレッシュが動いたことで一時的にテーブルの中身が無くなり、
そのタイミングで取得処理が動いたことによってデータが取得できずに
`NullPointerException`が発生していたようです。

# 最後に
`atomic_refresh`を`true`にすることでエラーは発生しなくなりそうですが、
今度は`delete`でどれくらい時間がかかるか調べる必要がありそうです。

どなたかの参考になりましたら幸いです。

# 参考
[マテリアライズド・ビューのリフレッシュ動作を試す](https://qiita.com/plusultra/items/86055095e6e3f21772e9)
UTF-8でファイルを保存するバッチ


#説明
###chcp 65001実行前
utf-8で出力されファイル形式も同様

###chcp 65001実行後
文字化けする

```bat:exec.bat
@echo off

set INPUT1=この文字は文字化けしない

@REM utf-8表示
chcp 65001

set INPUT2=この文字は文字化けする

echo INPUT1>>utf-8.txt
echo INPUT2>>sjis.txt


pause
```

```utf-8.txt（utf8）
この文字は文字化けしない
```


```sjis.txt（sjis）
縺薙?譁?ｭ励?譁?ｭ怜喧縺代☆繧
```
IDEAショートカット

|キーボード|結果|例|
|---|---|---|
|psvm|メインメソッド生成||
|fori|for分生成||
|Ctrl+Alt+v|オブジェクト作成|new HashMap<>();|
|ctrl+o|メソッドオーバーライド||
|Ctrl+Shitft+↑|指定したコード群を移動||
|Ctrl+Alt+↑|指定した行を移動||
|Ctrl+d|指定した行をコピーペースト|
|Ctrl+Shift+Enter|";"や"()"を補完|
|Ctrl+Shift+F|全ファイル中に検索|
|Ctrl+Shift+L|コード整形|
|Ctrl+Shift+S|設定開く|
|Ctrl+Shift+R|全ファイル中に文字列をリプレース|
|Alt+Enter|エラーや警告を改善|
[python 備忘録] 空の配列に他の配列を追加していく方法

# 概要
pythonのnumpy配列, リストを活用して空の配列に他の配列を追加していきます。
最終的には連結されたnumpy配列を取得することが可能です。

# 使用メソッド
・リスト用append[1] ：リストにリストを追加
追加されるリスト.append(追加するリスト)
※リストにnumpy配列も追加可能です。

・numpy配列用concatenate[2] ：複数のnumpy配列を結合
結合されたnumpy配列 = np.concatenate([結合させたいnumpy配列1,結合させたいnumpy配列2,......])
※np.concatenate内の[結合させたいnumpy配列1,結合させたいnumpy配列2,......]はリスト内に複数の
numpy配列が入っている状態です。

# ソースコード例
```python
import numpy as np

empty_list = []
np_arr1 = np.array([[1,2],[3,4]])
np_arr2 = np.array([[5,6],[7,8]])

empty_list.append(np_arr1)
#[array([[1, 2],
#       [3, 4]])]

empty_list.append(np_arr2)
print(empty_list)
#[array([[1, 2],
#       [3, 4]]), array([[5, 6],
#       [7, 8]])]

np_concat_arr = np.concatenate(empty_list)
#[[1 2]
# [3 4]
# [5 6]
# [7 8]]
```
空の配列に他の配列を追加していくことができました。
以上、備忘録でした。

# 参考記事
[1] リストへの要素の追加と別のリストとの結合 https://www.javadrive.jp/python/list/index6.html
[2] NumPy配列ndarrayを結合（concatenate, stack, blockなど）https://note.nkmk.me/python-numpy-concatenate-stack-block/
Ruby on rails  モデルにアクションを記述する（belongs_toとhas_many)使い方





usersテーブルに対して、commentsテーブルは多く紐づいており、
commentsテーブルに対して、usersテーブルは一つだけ紐づいている。
という場面がある。
その場合はモデルにアクションを記述し
関連づけを行う。このことをアクションという。










一つだけ紐づく場合belongs_to

```
belongs_to :モデル単数形
```




多く紐づく場合はhas_many

```
has_many :モデル複数形
```




また、REDME!に記載する時は”Association”
に記載するとわかりやすい

![DCE4C73D-6675-4C8E-B0CC-FE5CBCC865FF_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1829786/40338d46-5193-f717-449d-49f1fefae0c9.jpeg)
システムのPHPを５系から７系へバージョンアップする際に修正が必要な関数メモ

システムのPHPを５系から７系へバージョンアップする際に修正が必要な関数をメモ。


```.php
ereg()
eregi()
ereg_replace()
mysql_affected_rows()
mysql_error()
mysql_fetch_assoc()
mysql_free_result()
mysql_real_escape_string()
mysql_fetch_row()
mysql_fetch_array()
mysql_num_rows()
mysql_query()
mysql_insert_id()
mysql_connect()
mysql_select_db()
session_register()
session_unregister()
split()
```
Django + SQLiteをLambda + APIGatewayで動かす

# はじめに
以前、DjangoをLambdaで動かしたいと思ったのですがうまくいかず、諦める予定で下記の記事を書きました。

https://qiita.com/kerorinfather/items/4f9e6c9295ab3886e1f4

しかし、なんか悔しかったので動かしてやろうと思い、（無理やり？）動かすことができましたので記事にまとめました。もしよろしければ、上記の記事も見ていただけると嬉しいです。

# 目指す仕様
できるだけ維持費が安く済むシステムを目指すため、下記の要件を満たすこととします。

- Apacheなどは使わず、APIGateway + Lambdaで動かす
- データベースはSQLiteを使用

Djangoを解説しているサイト等を見ているとSQLiteは使うなというような記事を見かけるのですが、今回はプロトタイプを安く維持することを目標とするのでSQLiteを使います。

# 問題点と解決方法
さて、上記の条件でシステムを動かす上で、上記記事中でも挙げているのですが以下の問題があります。

## 問題点(1):Lambdaで動かすSQLiteのバージョンが低い

1点目はLambdaで提供されているVMにインストールされているSQLiteのバージョンが、3.7.17と非常に古いことです。
当初参考にしていた、@umihicoさんの[DjangoをLambdaを使ってサーバレスにデプロイする][1]の記事では、MySQLを使用する設定にすることによって、上記制約を回避し初期画面を表示させています。しかし、これをSQLiteを使用する設定にすると、エラーで初期画面にすらたどり着けません。

そこで、Dockerイメージを利用してLambdaをデプロイする手段を取りました。
Dockerイメージを使用しても、Amazonが提供するイメージではSQLiteバージョンが3.7.17となってしまうため、下記記事を参考にPython3.9のカスタムイメージを作成します。

https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-container-image-support/

最初、上記のブログを読んでも訳が分かりませんでしたが、Dockerのマルチステージビルドについて調べたり、@yohei7328さんの[【AWS Lambda】独自のコンテナイメージを超シンプルに使用する方法][2]を読んで理解できるようになりました。ただ、イメージはできるだけ小さくすべきだと思いますので、結局はAWSブログのコードをベースとして[Dockerfile(GitHub)][3]は作成しました。

## 問題点(2):Serverless Frameworkのプラグインが使えない
2点目は、LambdaのデプロイにDockerイメージを利用すると、Serverless Frameworkのプラグインが使えなくなる問題です。
[DjangoをLambdaを使ってサーバレスにデプロイする][1]の記事では、[Serverless-WSGI][4]というプラグインを使ってデプロイしているのですが、このプラグインは、Lambdaへのデプロイ時にファイルを追加することによって成り立っています。つまり、Dockerイメージでデプロイしてしまうとファイルを追加することができないため利用できません。

そこで、実際にデプロイされたファイルや[GitHub上のコード][5]を確認したところ、`Werkzeug`をインストールした上で、`.serverless-wsgi`、`serverless_wsgi.py`、`wsgi_handler.py`の3ファイルがあれば、該当動きそうであったため、この3ファイルを拝借して動かすことにします。（MITライセンスなので問題ない、よね？）

# 構成
ここまでで、WSGIアプリケーションとSQLiteを動かす準備は整ったので、全体構成を考えます。
まず、DjangoをApacheで動かす場合、以下記事の考え方がとても分かりやすいです。

https://qiita.com/ming_hentech/items/9e21fe175988448e204b

Apacheからアクセスする部分を抜き出すと、以下のようになります。

```
Apache ─ Mod_wsgi    ─ Wsgi.py ─ Django ─ RDBMS
       └ Static file
```

これを、Lambda利用の今回のパターンに置き換えると、以下のようになります。

```
APIGateway ─ Lambda(Serverless-wsgi) ─ Lambda(Wsgi.py) ─ Django ─ EFS(SQLite)
           └ S3(Static file)
```

これらのリソースを手作業で作るのは大変ですので、Serverless Frameworkを利用します。

# 成果物
今回作ったソースコードはGitHubで公開しています。

https://github.com/tabikurage/lambda-django

また、上記の方法でデプロイしたWebアプリも公開してあります。

https://al8gbb0t1e.execute-api.ap-northeast-1.amazonaws.com/

# デプロイしてみての感想
画像が何もないサイトにしては遅すぎると思います。ただ、意外にもGoogleのPageSpeed Insitesの結果は良かったので、ありなのかもしれません。
デプロイ当初はもっと遅かったのですが、EFSのスループットを上げるために1GB程度のファイルをEFS上に置いたところ若干改善しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/522e7346-6a3d-08ae-5f51-bd61e9b68fd2.png)


[1]:https://qiita.com/umihico/items/4534e1f84e8de5a62db5
[2]:https://qiita.com/yohei7328/items/df7ebaa4544621e16c2b
[3]:https://github.com/tabikurage/lambda-django/blob/master/Dockerfile
[4]:https://www.serverless.com/plugins/serverless-wsgi/
[5]:https://github.com/logandk/serverless-wsgi