OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6でJQueryが動かない

#JQueryをインストール
Rails6でのJQuery導入方法は[こちら](https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13)を参照しました。

#JQueryが動かない
無事に動作確認（[こちら](https://qiita.com/tatsuhiko-nakayama/items/b2f0c77e794ca8c9bd74)を参照）を済ませ、application.jsファイルにJQueryを記述するも動かず...
Chromeの検証からConsoleを確認すると次のようなエラーが
>
Uncaught DOMException: Failed to execute 'querySelectorAll' on 'Document'　
//記述したJQueryコード
is not a valid selector.
>

動作確認はできているため、どうやらapplication.jsの読み込み時にエラーしている様子。
エラー文やネット上を調べていると、「$('クラス名')」の箇所でエラーが起きていると推測できました。

改めてapplication.jsの記載を確認すると、下記のようになっていました。

```ruby
import Rails, { $ } from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
import ('jquery')

Rails.start()
Turbolinks.start()
ActiveStorage.start()
```

1行目の{ $ }がなにやら怪しい...と思い下記のように修正しました。

```ruby
import Rails from "@rails/ujs" #ここを修正
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
import ('jquery')

Rails.start()
Turbolinks.start()
ActiveStorage.start()
```

これで無事に動きました！
import Rails, { $ } from "@rails/ujs"　の行を触った覚えもなく、rails newで新しく立ち上げたプロジェクトにJQueryを導入して確かめましたが再現性はありませんでした...
この一行が記述された原因を特定することはできませんでしたが、解決することはできたので同じようなエラーでお困りの方の参考になれば幸いです！
laravel クッキーのサンプル

# ルーティング

/routes/**web.php**

```php
<?php
Route::get('/cookie_sample', 'SampleController@cookieSample');

Route::post('/cookie_sample', 'SampleController@cookieDelete');
```


# コントローラー

app/Http/Controllers/**SampleController.php**

```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class SampleController extends Controller{

      public function cookieSample(){
 
        $count = \Cookie::get('count', 0);
        $count++;
 
        \Cookie::queue('count', $count, 60 * 24 * 90);
 
        return view('samples.counter_sample', [
          'title' => 'クッキーを利用するサンプル',
          'count' => $count,
        ]);
      }
      
       public function cookieDelete(){
 
        \Cookie::queue(\Cookie::forget('count'));
 
        return 'cookieを削除しました。';
      }
 
}
```



# ビュー

resources/views/samples/**csv_sample.blade.php**

```php
@extends('layouts.default')
 
@section('title', $title)
 
@section('content')
 
<h1>{{ $title }}</h1>
@if($count === 1)
  <p>初めての訪問です。</p>
@else
  <p>{{ $count }}回目の訪問です。
@endif
 
<form method="post">
  @csrf
  <input type="submit" value="履歴を削除">
</form>
 
@endsection

```

# 共通レイアウトファイル

```PHP
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
    <style>
        .header_nav {
            display: flex;
            list-style: none;
            padding-left: 0;
        }
        .header_nav li {
            margin-right: 30px;
        }
        /* エラーメッセージ用のスタイル */
        .error {
          color: red;
        }
    </style>
</head>
<body>
    @yield('header')
 
    {{-- エラーメッセージを出力 --}}
    @foreach($errors->all() as $error)
      <p class="error">{{ $error }}</p>
    @endforeach
 
    @yield('content')
</body>
</html>
```
［接続編］WebLogic Server Remote Consoleを使ってみた。

[こちら](https://github.com/oracle/weblogic-remote-console)で公開されているOSS、WebLogic Server Remote ConsoleをPCにインストールしてWebLogicServerにアクセスしてみたいと思います。

##環境
WebLogic ServerはOracle Cloud Infrastructureのコンピュートインスタンス上にインストール済です。今回はこちらの環境にアクセスをしてみたいと思います。

- OS：Oracle Linux 7.9
- WebLogic Server：12.2.1.4
- 実装済application：Oracle Analytics Server
- Client PC：windows10 64bit

##事前準備
予め、アクセスしたいWebLogic Serverドメインにリモート コンソール拡張機能をインストールしておきます。
※必須ではありませんが、リモートコンソールの機能を最大限利用する上でインストール推奨とのことです。

#####手順
1. アクセスするWebLogicドメインホームディレクトリに、management-services-extディレクトリを作成
1. [こちら](https://github.com/oracle/weblogic-remote-console/releases)からconsole-rest-ext-1.0.warをダウンロード
1. 作成したmanagement-services-extディレクトリに management-services-extを格納
1. 管理サーバーが起動中の場合は再起動

```
cd DOMAIN_HOME/bitools/bin
./stop.sh
./start.sh
```

##インストール
1. GitHubからWebLogic.Remote.Console.Setup.1.1.0.exeをダウンロードし、クライアントPCにインストールします。
1. インストールが完了したら、WebLogic Remote Consoleを実行します。

##WebLogic Serverへの接続
WebLogic Remote Consoleを実行すると、認証情報の入力ウィンドウがポップアップされますので認証情報を入力して接続します。
![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542975/eaaeb442-abd0-61eb-d154-7b97d57746c0.png)
![006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542975/3cea73b1-807a-ddec-d853-5446b6801f44.png)

TOP画面が表示されたら、接続完了です。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542975/0e62caa2-ca9c-6efa-18e2-3bcd8a815361.png)

試しにサーバー一覧を開いてみると、管理サーバー・管理対象サーバー（BIサーバ）共に問題なく参照できているようです。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542975/ecaad8b7-e9c7-e6f4-b441-484dd2d45b5a.png)

以下が標準の管理コンソールですので、見た目は違えど構成は似ていますね。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542975/78712653-3230-9525-1102-d2945a8fc8c8.png)


って事で本日はここまでにして、次回は現在外部からのアクセスがHTTPになっている所をRemote Consoleを使ってSSL設定をしてみたいと思います。

ほなまた。
少しでもサーバに楽してログインしたい

# 仕事中
サーバの台数多くて、いちいちホスト名とかIPアドレス覚えてられんなー
サーバだけじゃなくて、ロードバランサとかのネットワーク装置もあるからいちいち管理表見ながらログインするのめんどくさいなー

ということで、慣れないシェルスクリプトを書いてサーバログインを少しだけ楽にしました。

# 方針
業務としてはDNSサーバの運用や各種ログサーバなどを運用しており、チームで管理しているサーバは100台以上あります。
自分の会社のサーバは英数字が羅列されたホスト名のため、パッと見ただけではどういう用途のサーバかもわかりません。

そのため、スクリプトを実行した際にホスト名や用途、IPアドレスが表示されること、選択式にして数字さえ入力すれば簡単にサーバにログインできるようにしたいと思いました。

始めは、Pythonとかで作ろうと思ったのですが、`python3 ~~.py` と打つのさえも少しめんどくさいため、`./~~.sh`　とさえ入力すれば実行できるシェルスクリプトで作成しました。


# 完成

シェルスクリプトでつくってみました。

```login.sh
#!/bin/sh

if [ -z $1 ] ; then
  echo "Usage: $0 <read_file>"
  exit 3
else
  READ_FILE=$1
  READ_FILE_LINE_NUM=`cat ${READ_FILE} | wc -l`
  column -s, -t ${READ_FILE} | nl

  echo -n "login: "
  read ANS
  if [ ${ANS} -le ${READ_FILE_LINE_NUM} ] ; then
    LOGIN_HOST=`sed -n ${ANS}p ${READ_FILE} | cut -d , -f 2`
    echo -ne "\e]2;${LOGIN_HOST}\a"
    ssh -A ${LOGIN_HOST}

    # miss or end
    CURRENT_HOST=`hostname`
    echo -ne "\e]2;${CURRENT_HOST}\a"
    exit 5
  else
    echo "${ANS} no file_line ... Select 1 - ${READ_FILE_LINE_NUM}"
    exit 4
  fi
fi

exit 0
```

サーバのリストが入ったテキストファイルも用意します。

```serverlists.txt
sv001,10.0.0.1
sv002,10.0.0.2
sv003,10.0.0.3
```

実行してみます。
ファイル名長くない？と思うかもしれませんが、タブ補完使えば気になりません。

```
$ ./login.sh serverlists.txt 
     1  sv001  10.0.0.1
     2  sv002  10.0.0.2
     3  sv003  10.0.0.3
login: 
```

実行すると数字、ホスト名、IPアドレスが表示され、左に紐づいている数字を入力さえすれば簡単にログインできるようになりました。
鍵がある場合は `login.sh` の `ssh` に `-i` オプションをつけて鍵を指定すれば簡単にログインできると思います。

# 感想・まとめ
業務ではサーバに入って作業をすることは多いものの、シェルスクリプトは初心者で調べながらつくりました。
こういう身近な自動化スクリプトをつくって実践的に学べたので、いい経験になったと思います。
簡単なスクリプトならリファレンスを読まずにささっとつくれるようになって、より仕事を楽にしたいです。
laravel バリデーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/a6540912-a48e-812e-ff6c-b60306c55b4e.png)




# ルーティング

/routes/**web.php**

```php
<?php
Route::get('/validation_sample', 'SampleController@validationSampleForm');

Route::post('/validation_sample', 'SampleController@validationSample');
```


# コントローラー

app/Http/Controllers/**SampleController.php**

```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class SampleController extends Controller{


      public function validationSampleForm(){
        return view('samples.validation_sample_form', [
          'title' => 'バリデーション用サンプルフォーム',
        ]);
      }



      public function validationSample(Request $request){
 
        $request->validate([
          // ここに項目ごとのバリデーションルールを記述
          'name' => ['required', 'min:2', 'max:20'],
          'user_name' => ['required', 'min:3', 'max:20'],
          'email' => ['required', 'email'],
          'age' => ['required', 'integer', 'min:16', 'max:150'],
          'birthdate' => ['required', 'date', 'before:now', 'after_or_equal:1900-1-1'],
        ]);
 
        return redirect('/validation_sample');
      }

}
```

# ビュー

resources/views/samples/**validation_sample_form.blade.php**

```php
@extends('layouts.default')
 
@section('title', $title)
 
@section('content')
 
<h1>{{ $title }}</h1>
 
<form method="post">
  @csrf
  <div>
    <label>
      名前:
      <input type="text" name="name">
    </label>
  </div>
  <div>
    <label>
      名前（ふりがな）:
      <input type="text" name="name_kana">
    </label>
  </div>
  <div>
    <label>
      ユーザー名（アルファベットor数字）:
      <input type="text" name="user_name">
    </label>
  </div>
  <div>
    <label>
      メールアドレス:
      <input type="text" name="email">
    </label>
  </div>
  <div>
    <label>
      年齢:
      <input type="text" name="age">
    </label>
  </div>
  <div>
    <label>
      生年月日:
      <input type="date" name="birthdate">
    </label>
  </div>
  <div>
    <label>
      住所:
      <input type="text" name="address">
    </label>
  </div>
  <div>
    <label>
      電話番号:
      <input type="text" name="phone">
    </label>
  </div>
 
  <div>
    <label>
      プライバシーポリシーに同意します:
      <input type="checkbox" name="policy">
    </label>
  </div>
  <div>
    <input type="submit" value="登録">
  </div>
</form>
 
@endsection
```

# 共通レイアウトファイル

```PHP
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
    <style>
        .header_nav {
            display: flex;
            list-style: none;
            padding-left: 0;
        }
        .header_nav li {
            margin-right: 30px;
        }
        /* エラーメッセージ用のスタイル */
        .error {
          color: red;
        }
    </style>
</head>
<body>
    @yield('header')
 
    {{-- エラーメッセージを出力 --}}
    @foreach($errors->all() as $error)
      <p class="error">{{ $error }}</p>
    @endforeach
 
    @yield('content')
</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/49657514-ed43-bb4c-4339-f72523ef53a3.png)
【RSpec 基本】 Rails初学者の自分が知らなかった開発環境ごとにDBが違う話

プログラミング初学者の私が、RSpecを書いていて
環境ごとにDBが違うことを知らずハマったので、記事に書き留めておきます。
プログラミング初学者の方の参考になれば嬉しいです。
また、間違い等ありましたらご指摘頂けると助かります。

それでは、見ていきましょう！！


<h2>【RSpec 基本】 Rails初学者の自分が知らなかった開発環境ごとにDBが違う話</h2>
RSpecを書く中で
<ul>
<li>「テストってそもそもプロダクトコードをブラウザで動かしながらやってるの？」</li>

<li>「RSpecで定義した変数と、プロダクトコードに定義した変数ってどう違う？」</li>

<li>「RSpecで定義したデータって、テストのあとはどうなるの？」</li><br>
こんな疑問が頭の中にブワーッと入ってきて、「何がわからないのかわからない」状態になりました。笑

そんな初学者あるある？な疑問を解決していきます！
<h2>Railsの環境には3つの種類がある</h2>


結論から言うと、下記の4点を知ることで疑問が解決しました！<br>
<ul><li>「Railsには 本番環境、開発環境、テスト環境の3つの環境が用意されており、それぞれで違うDBを参照している。」</li>
<li>「RSpecは テスト環境で実行されるため、作成されたレコードはテスト環境用のDBに格納され、テスト終了後に削除される。」</li>
<li>テスト時には新しくヘッドレス（見えない）ブラウザを立ち上げて、テスト用DBから取得した内容を表示したページを検証している。</li>
<li>表示ページのHTMLはプロダクトコードを元に生成される。</li><br>
Railsの「３つの環境」については他の記事でもたくさん解説されています。

<a href="https://qiita.com/shin1rok/items/8fb091f5d94ed9a60476#:~:text=Rails%E3%81%AB%E3%81%AF%E3%83%86%E3%82%B9%E3%83%88%E7%92%B0%E5%A2%83,%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%AFdevelopment%E3%81%A7%E3%81%99%E3%80%82">【Rails】Railsの3つの環境</a>
<a href="https://qiita.com/yuta-38/items/7466d71613500ef01983">【Rails】configのenvironments配下のファイルの意味と記述内容を理解する。（development.rb, production.rb, test.rbとは？開発環境・本番環境・テスト環境の違い）</a>


<h3>本番環境</h3>
実際にユーザーがシステムを使用する環境のことです。

具体的に言うと、普段私たちが使っている「amazon」や「楽天市場」が本番環境にアップされたサービスです。
<br>
例え話をすると、、

プログラミングを初めると必ずといって良いほど
<b>「herokuにデプロイする」</b>
という言葉を見かけます。

これはコーディングしたプログラムをherokuにデプロイする（pushする）ことでURLが作られて、そのURLを友だちに送ったりすると作ったサービスを見られるようになります。
（本番環境にアップしないとそのサービスを第３者がインターネット上で見ることはできません）
<br>
誰でも見られるそのサービスは<b>「本番環境で動いている」</b>ということになります。


<h3>開発環境</h3>
これが普段、私達がプログラミングをして、ブラウザで動きをチェックしている環境です！

Railsではデフォルトの設定がこの「開発環境」になっています。

ちなみにそれぞれの環境の設定をしているファイルは
<b>config/environments</b>の中にある以下の３つです！
<ul>
<li>development.rb（開発環境）</li>
<li>production.rb（本番環境）</li>
<li>test.rb（テスト環境）</li>
</ul>

<h3>テスト環境</h3>
そして、残りのひとつがテスト環境です。
<br>

プロダクトコードのHTMLをヘッドレス（見えない）ブラウザで表示し、「RSpec」や「Minitest」などによって定義されたテスト用DBのレコードを参照して、テストを実行します。
<br>
つまり、localhostでアクセスするページに表示されている内容と、テストで検証している内容には全く関係がありません。
<br>
ちなみにRailsでは「Minitest」がデフォルトになっています。


<h2>なぜ環境ごとにDBが分かれているのか</h2>
環境ごとにDBが分かれていないと、DBには開発用のダミーデータと顧客のデータが混在することになり、間違えて削除してしまう、ということになりかねないからです。
<br>
先程も例に挙げた「amazon」を使って説明します。
<br>
「amazon」では顧客のクレジットカードや住所などの情報を入力します。

これらの重要な情報をDBに保存し、管理するわけですが、DBがひとつだけの場合、顧客のデータを消してしまうことがあるかもしれません。

そして本番環境では常にサービスが動いています。

本番環境のDBに不具合が発生すると、買い物したくてもできなくなってしまうということです。
amazonくらい大規模になるとその損失は計り知れませんね。。。


<h2>おわりに</h2>
今回はRSpecで私自身が引っかかったところについて記事を書きました。

まだまだ知識が少なく、間違っている点など見付けた際はぜひご教授頂けると助かります。
<br>
それでは、最後まで読んで頂きありがとうございました。
<br>

<h4>追記</h4>
コメントにてご指摘を頂きました。
Railsの環境は名前を付けて増やすことができます。
以下に解説記事のリンクを貼っておきます。
https://qiita.com/yusabana/items/a1f4fe2c37b20db2a3f6

またひとつ勉強になりました！
Jenkinsとは？

## 勉強前イメージ

自動のテストツールのイメージ

## 調査

### Jenkinsとは？

ジェンキンスと読み、CI/CDを実現するためのツールになります。
開発作業の自動化を目的としています。

歴史が長く、Javaで動いておりプラグインが豊富という特徴があり
幅広く使われています。
GitHubなどとも連携させることが出来ます。

### そもそもCI/CD とは？

CI/CDは2つの言葉に分かれています。

- CI

Continuous Integration の略で、継続的インテグレーションの意味になります。
開発時のビルドやテストなどを自動化して、継続的に実施します。

- CD

Continuous Delivery の略で、継続的デリバリーの意味になります。
↑のCIによってビルド・テストされたコードをのマージや本番へのビルドなどを自動的に行うことです。

CI/CDとは、
ビルド → テスト → デプロイ を自動化するシステムのことです。
リリースが増えるとテストやビルドなどの工数がかさむためそれらの自動化を目指します。
自動化を行うツールの一つがJenkinsになります。

## 勉強後イメージ

テストだけじゃないのか、ビルドもしてくれるんだ・・・
そもそもCI/CDの解釈が微妙に間違ってた

## 参考

- [CI/CDとは](https://pfs.nifcloud.com/navi/words/ci_cd.htm)
- [Jenkins とは？](https://openstandia.jp/oss_info/jenkins/)
【heroku】dynoが追加できないのでコマンドラインで追加する方法

herokuにアプリをデプロイしたのはいいんですけど、dynoがない。
画面から追加しようにもできない。（すでに何個か動かしているせい？）

というわけでコマンドラインからやる方法を探しました。

## 結論

`heroku login`　でログインしてる前提で。

```
heroku ps:scale bot=1 --app hogehoge_app
```

これでいけるはずです。

`bot=1` の部分は、Procfileに書かれてる、

```Procfile
bot: python discord_bot.py
```
のbotの部分です。webとかの場合はwebにしましょう。

`--app` にわたすアプリ名ですが、これは

```
heroku list
```

で引っ張ってこれます。
http/httpsとwwwありなしのリダイレクトとSSLのドメイン適用範囲でハマった話

SSL証明書対応+www付きのドメインにリダイレクトさせる設定をしていたところ
何故かwwwが付かず、且つSSLが適用されずエラーが発生する問題に遭遇
![スクリーンショット 2021-06-10 19.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/9089232c-43bb-5758-53cd-1b519da31d5c.png)

## 設定を確認する

```apache
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^chinjaolose\.co\.jp$
RewriteRule ^(.*)$ https://www.chinjaolose.co.jp/$1 [R=301,L]
```

合ってるのではないのか
:closed_lock_with_key: マークをクリックしてSSL証明書を確認

サブジェクト名：*.chinjaolose.co.jp

## 「*」って何〜？

調べたところSSLの適用範囲が chinjaolose.co.jp のサブドメインに対してのみらしい。
なのでネイキッドドメイン「chinjaolose.co.jp」に対してはSSLが無効（というかなりすましみたいな扱い）になってしまうようである。

## 改めて確認してみる

```apache
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^chinjaolose\.co\.jp$
RewriteRule ^(.*)$ https://www.chinjaolose.co.jp/$1 [R=301,L]
```

http://chinjaolose.co.jp でアクセスした場合のリダイレクトの順番としては

1.httpにsがついてない
　→sを付けてリダイレクト（https://chinjaolose.co.jp)

2.ホスト名がchinjaolose.co.jpである
　→wwwを付けてリダイレクト

となるのだが、1の段階でchinjaolose.co.jpにはSSLが適用されないので
リダイレクトが中断してエラーになってしまうようである。

## 対応策

灯台なんとやらでこうすれば良かった

```apache
# RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# RewriteCond %{HTTP_HOST} ^chinjaolose\.co\.jp$
# RewriteRule ^(.*)$ https://www.chinjaolose.co.jp/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^chinjaolose\.co\.jp
RewriteRule ^(.*) https://www.chinjaolose.co.jp/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

SSLが有効なドメインに対してリダイレクトを掛けた後にhttps を付けてあげる

<FONT SIZE=6>逆にしただけ</FONT>

<FONT SIZE=6>終わり。</FONT>
[ECCUBE4]ECCUBE_ADMIN_ALLOW_HOSTS を後から設定する方法

こういうくだらないことに時間使うのが一番疲れる･･･｡マニュアル大事｡←自戒

誰かが助かりますように｡

## 背景

管理サイトアクセスできる端末を制限する指定ですが､インストールする時は未指定で後から設定したくなりました｡
[公式の開発者ドキュメント](https://doc4.ec-cube.net/)には設定例が書いてありません｡

インストール後の未設定の状態を見ると､以下のようになっています｡

```
ECCUBE_ADMIN_ALLOW_HOSTS='[]'
```

## 設定例

適当に指定したらNG（=システムエラー発生）でした｡

ちなみに当該キーワードでソースコードを検索すると`.env.dist`というのがあって､その設定は`[]`（シングルクォートなし）だったので混乱に拍車がかかりました｡

### 間違った設定例

```
ECCUBE_ADMIN_ALLOW_HOSTS='[123.456.789.000,123.456.789.999]'
ECCUBE_ADMIN_ALLOW_HOSTS='['123.456.789.000','123.456.789.999']'
ECCUBE_ADMIN_ALLOW_HOSTS=["123.456.789.000","123.456.789.999"] これとかやりがち?
ECCUBE_ADMIN_ALLOW_HOSTS=['123.456.789.000','123.456.789.999']
```

### 正しい設定例

正解は以下｡シングルクォートで囲んで､IPアドレスはダブルクォートで囲みます｡

```config:.env
ECCUBE_ADMIN_ALLOW_HOSTS='["123.456.789.000","123.456.789.999"]'
```

## 参考

上述したNG例を試してみたらNGだったので､まじめに調査して解決しました｡

`ECCUBE4 インストール`で検索して見つけたインストール画面入力フォームのスクショからプログラムに渡される値を推測（行ごとにIPアドレスを入力するっぽい）して､さらに`InstallController.php`の`convertAdminAllowHosts`メソッドの実装を見て逆算しました｡

```php

// 使われ方
public function complete(Request $request)
{
   ...
   'ECCUBE_ADMIN_ALLOW_HOSTS' => $this->convertAdminAllowHosts($sessionData['admin_allow_hosts']),
}

public function convertAdminAllowHosts($adminAllowHosts)
{
    if (empty($adminAllowHosts)) {
        return '[]';
    }

    $adminAllowHosts = \json_encode(
        \explode("\n", StringUtil::convertLineFeed($adminAllowHosts))
    );

    return "'$adminAllowHosts'";
}
```
Saasを学習してみた

#はじめに

絶賛HTMLとCSSを復習中！

今回は **Saas**という言語を学び始めたのでアウトプットします

#Saasとは

[公式サイト](https://sass-lang.com/)

Saasとは**「Syntactically Awesome StyleSheet」**の略で

**Syntactically（文法的に）**

**Awesome（最高・素晴らしい）**

**StyleSheet（スタイルシート）**

という言語です。

>公式抜粋
Sass is the most mature, stable, and powerful professional grade CSS extension language in the world.

>略
Sassは、世界で最も成熟した、安定した、強力なプロフェッショナルグレードのCSS拡張言語です。


めちゃくちゃ凄そう！

自分なりに簡単にまとめてみると・・・

CSSをより便利に記述できるようにしたもので、cssでいっぱい記述するよりも完結に記述ができ、関数を設定してコードを再利用したりできます。

しかし、ブラウザ上ではSaasは読み込む事は出来ません。

そのため必ずSaasからCSSに変換してブラウザー上に反映させます。

#変数

CSSの場合、

```.style.css
#container {
    color: white;
}

.btn {
    color: white;
}
```

CSSでは変数は定義出来ないがSaasの中では定義する事ができます。
共通の数値や色の指定などに便利だと思います。

```style.scss
//色を定義
$cWhite: white;

#container {
    color: $cWhite;
}

.btn {
   background-color: $cWhite;
}

```

#ネスト

入れ子という言葉はrailsでよく使いました。

CSSでは1つのブロックの中に他のブロックを含める事は出来ませんが、Saasの中では異なるブロックを含める事ができます。

本来のCSSの記述

```style.css
nav ul {
    margin: 0;
    padding: 0;
    list-style: none;
}
 
nav li {
    display: inline-block;
}
 
nav a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
}
```

Saasの場合

```style.scss
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { 
     display: inline-block; 
  }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}
```

上記のように、Sassではネストで書くことができ、コードの可読性が向上します。

#終わり

もっともっと良いメリットがあると思いますが、これから学習していきます！
SimpleDateFormatでUTCのISO形式日時文字列を出力するんだあ

##　諸元

ニフクラのmBaaSに移行することになって、RestAPIのリクエストで渡す日時がUTCのISO形式だったのでなんとかしたかった。

`2021-06-13T12:34:56.789Z` ←　現在日時をこういう形式の文字列にしたい。

##　やりかた

`Calendar`を使うてもあるけど、簡単なのはこっちか。

```java
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String iWant = sdf.format(new Date());
```

"T"とか"Z"はシングルクォートで囲まないと***死***。

##　ちなみに

`ZonedDateTime`と`DateTimeFormatter`使えっていう話はいったん置いておきます:)
うっかり他コンポーネントとのインターフェースを`Date`でやっちゃったんだあ:0
【PHP】よく使う関数・文法・オブジェクトまとめ

PHPでよく使う関数や文法、オブジェクトを自分用にまとめました。
随時ページは更新していきます。

##データベース接続
###PDOオブジェクト
```php5:php
<?php
  try{
    $dsn = 'mysql:host=loacalhost;dbname=library;charset=utf8;';
    $user = 'root';
    $password = 'password';
    $db = new PDO($dsn, $user, $password);
  }catch(PDOException $e){
    echo 'DB接続エラー：'.$e ->getMessage();
  }
?>
```

##SQL文を実行

###prepare関数
SQL文を実行する準備を行い、statementオブジェクトを返す。
準備をするだけで実行自体は行わない。
SQL文で値が変わる可能性がある箇所に対して、変数のように別の文字列を入れておき、後で置き換える仕組みです。

```php5:php
$stmt = $db->prepare('INSERT INTO memos SET memo=?,created_at=NOW()');
// prepare([SQL文]);
```

###execute関数
プリペアドステートメントを実行する際に使われる関数です。

```php5:パターン1
$stmt = $db->prepare('INSERT INTO memos SET memo=?,created_at=NOW()');
$stmt->execute(array('テキスト'));
$memo = $stmt->fetch();
```

```php5:パターン2
$stmt = $db->prepare('INSERT INTO memos SET id=:id, created_at=NOW()');
$stmt->bindValue(':id',1);
$stmt->execute();
$memo = $stmt->fetch();
```

```php5:パターン3
$stmt = $db->prepare('INSERT INTO memos SET memo=?,created_at=NOW()');
$stmt->bindParam(1,$_POST['memo']);
$stmt->execute();
```

###bindParam関数
プレースホルダーに値をバインドさせる。

```php5:
stmt->bindParam(1,$_POST['memo']));
```

###exec関数
外部コマンドやプログラムを実行するのにexec関数を使用します。
返り値は最後の行を返します。

```php5:
$db->exec('INSERT INTO memos SET id=:id, created_at=NOW()');
// $db->exec('SQL文');
```

###fetch関数
該当するデータを1件ずつ返す。

```php5:
$stmt = $db->prepare('INSERT INTO memos SET id=:id, created_at=NOW()');
$stmt->bindValue(':id',1);
$stmt->execute();
$memo = $stmt->fetch();
```

###query関数
=準備中=

##別ファイルを読み込む

###require関数
共通で使いたいスクリプトなど、別のファイルを読み込む

```php5:
require('dbconnect.php');
```

##別ファイルの内容の読込み・書込み

###file_get_contents関数
ファイルの内容を全て読み込んで、結果を出力するパターン。

```php5:パターン1
$str = file_get_contents('php.txt');
```
=準備中=



###file_put_contents関数
=準備中=

###simplexml_load_file
XMLファイルをパースし、オブジェクトに代入する
=準備中=


##プログラムを終了させる
###exit関数
メッセージを出力して、現在のプログラムを終了するのに使用します。
参考サイトは[こちら](https://www.sejuku.net/blog/23857)。

```php5:
<?php
$value = 10;
if ($value < 20){
  exit('プログラムを終了します');
}
echo $value;
?>
```

##エンコード・デコード

###json_encode関数
JSONをエンコードして値を、JSON形式にして返す。


###json_decode関数
JSONをデコードしてテキストデータにして返す。

```php5
$file = file_get_contents('/json/text.json');
$json = json_decode($file);
```

###htmlspecialchars関数
htmlをエンコードする。セキュリティ対策に使う。

##文字列と配列
###explode関数
文字列を文字列により分割して、配列にする
=準備中=

###implode関数
配列要素を文字列により連結する
=準備中=

##変数確認
###isset関数
変数が宣言されていること、そして null とは異なることを検査する
=準備中=

##正規表現系
GCEのMIGをまとめてみる

# この記事の目的
公式ドキュメントが充実しているものの、AWSからGoogleCloudに手を広げた自分自身の経験として、MIGに最初に触れた際に少し混乱したり、混乱する人もいそうだなぁと感じたところを中心に、書き残しておきたいと思います。
誰かのお役に立てれば、これ幸い。

詳細については、公式ドキュメントを参照ください。

# What is "MIG"

Management Instance Groupの略。
ロードバランサーの配下のインスタンス群を自動増減・復旧させたり、アップデートしたりする際に利用する。

Unmanaged Instance Groupというものもある。
こちらは、名前のとおり手動で操作する。
管理用サーバーが必要であったり、複数の種別のサーバー群を一纏めに取り扱う場合に利用する。

MIGは、以下の２種類がある。

* ステートレスMIG
* ステートフルMIG

以下にそれぞれの概要を示す。

## ステートレスMIG
### 用途
webサーバーや、ACID特性を満たすようなバッチ処理サーバーのようなシステム向け。

### 特徴
サーバーの更新は、ベースイメージの定期的を更新（インスタンステンプレートの更新）または、最新コンテンツをGitやGCSのような外部ストレージから取得するなどで実現する。
オートスケーリングポリシーを元に、スケールイン/スケールアウトを自動的に行う。
オートヒーリングによるVMインスタンスの自動復旧も可能である。

## ステートフルMIG
DBサーバーなどのような中断/再開のために処理が必要なシステム向け。

### 特徴
各サーバーごとに状態を持つ。
そのため、更新などの操作は複雑になる。
オートヒーリングによるVMインスタンスの自動復旧も可能であるが、オートスケーリングの機能はない。

# 更新 
MIGの更新のために、ローリングアップデートの機構が提供されている。
自動ローリングアップデートを行うにはステートレスMIGである必要がある。
ステートフルMIGにてローリングアップデートを行うためには、ステートフルディスクにデータを保持する必要がある。

ローリングアップデートには、同時に複数のテンプレートを指定する、カナリアテストの指定もできる。

更新タイプには、PROACTIVE（自動先行更新、更新型）とOPPORTUNISTIC(日和見、選択更新、追従型)がある。
公式ドキュメントでは日本語表記でカッコに書いたような揺らぎがあるので注意！
前者がマネージド、後者が指定型といったイメージ。インスタンス名を指定したりする場合は後者を選ぶ必要がある。

## maxSurgeとmaxUnavailable
ローリングアップデート時に指定するパラメータ。
以下の図のように更新されていく。

![Untitled(9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/8ede9d87-3aca-119f-a564-38ec123c9a3d.png)




可用性を重視する場合は、maxSurgeを上げる。
一方、コストを優先したい場合は、許容される範囲までmaxUnavailableをあげる。


# 関連機能、リソース
## インスタンステンプレート
イメージやインスタンスタイプの指定、ポート開放設定など、VMインスタンスを起動するためのパラメータ群を登録しておく。
イメージにはカスタムイメージも指定可能。ただし、マシンイメージは指定できない。

### スナップショットとカスタムイメージとマシンイメージ
VMインスタンスの特定のディスクのバックアップがスナップショット。
ディスクのバックアップに加え、VMインスタンスを起動するために必要な情報を付与したものがカスタムイメージ（コンソール上は、「イメージ」と表記）。
複数のディスクで成立するVMインスタンスに対応するカスタムイメージが、マシンイメージ。

AWSでいうところの、スナップショットはEBS snap shot、カスタムイメージおよびマシンイメージがAMIのイメージが近そう。
ざっくりとスケッチするとこんな感じ。
![Untitled(8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/07f9d555-9f26-c7ec-dbe5-a454fbff3f83.png)

マシンイメージは比較的新しいためか、インスタンステンプレートとかには対応していなかったりする。
インスタンステンプレート目線で見れば、当然な気もするが、AWSに慣れている人からは、混乱するところに思う。
Laradock環境におけるClass 'Pusher' not found のエラーについて


#はじめに
Laradock環境でLaravelアプリに通知機能を付けたい方向けに、タイトルのエラーが生じた場合の対処について記載しました。

#Pusherの登録と.envの記述を済ませた後...

laradockディレクトリ下で以下を実行
$ docker-compose exec workspace composer require pusher/pusher-php-server

すると以下の表示が、、、

```
Fatal error: Allowed memory size of 1610612736 bytes exhausted 略
```

単純に容量の問題かな？と思い、以下を実行してコンテナ内へ
$ docker-compose exec workspace bash

コンテナに入り、root@xxx:/var/www/html下で以下を実行
$ COMPOSER_MEMORY_LIMIT=-1 composer require pusher/pusher-php-server

しかし上手くいかず何故か
killedで強制的に追い出される、、、

#composerコマンドはLaradock下ではなくLaravel下で
ここでlaradock下で実行するのが適切でないのでは？と思い、laravelディレクトリ下で以下を実行
$ composer require pusher/pusher-php-server

すると以下の表示が、、、

```
Problem 1
    - Root composer.json requires barryvdh/laravel-debugbar ^3.6, found barryvdh/laravel-debugbar[v3.6.0, v3.6.1] but the package is fixed to v3.5.7 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
```

どうやらcomposer.lockに記述されているbarryvdh/laravel-debugbaのバージョンがv3.5.7では噛み合わず、v3.6系に変えてくれ、ということらしい。

composer.lockに記述を以下のように書き換えた

```
"packages-dev": [
        {
            "name": "barryvdh/laravel-debugbar",
            "version": "v3.6.1",         //v3.5.7からv3.6.1へ書き換え
            "source": {
                "type": "git",
                "url": "https://github.com/barryvdh/laravel-debugbar.git",
                //略
            },
```

結果、以下が通り、Class 'Pusher\Pusher' not foundの問題が解決！！！
$ composer require pusher/pusher-php-server --with-all-dependencies

以上です。
M1 MacのVSCodeにPlantUMLを導入

# インストール
brew コマンドを使って必要なパッケージを導入

```sh
$ brew install graphviz adoptopenjdk plantuml
```

# VSCode で利用する
PlantUML をインストールする。
インストールが完了したら VSCode を再起動。

`.pu` ファイルを作成し、以下の通り記入してみる。

```
@startuml
Class1 <|-- Class2
Class3 *-- Class4
Class5 o-- Class6
Class7 .. Class8
Class9 -- Class10
@enduml
```
その後、`⌥(option) + D` を入力すると図が描写される。


# Reference
* [Mac の VSCode に PlantUML を導入](https://qiita.com/wariichi/items/e55a728b10b310c822f2)
* [PlantUMLをMac OS Xで使う](https://qiita.com/kohashi/items/1d2c6e859eeac72ed926)
* [PlantUMLを使ってみる(MacOS) ~Visual Studio Codeでもっと使いやすく~](https://qiita.com/Takaichi00/items/8e03258c3c956d4848c4)
Cakephp4 Authentication プラグイン ログインできない (login URL did not match)

#環境
* CakePHP4.2.6
* PHP7.4.16
* cakephp/authentication2.6.1

#やりたかったこと
公式の[認証チュートリアル](https://book.cakephp.org/4/ja/tutorials-and-examples/cms/authentication.html)を参考に、Usersテーブルを使って、src/Controller 直下にある UsersController 経由でログインする。ただこれだけ。

#時系列：やったこと
###ログイン機能の作成
[認証チュートリアル](https://book.cakephp.org/4/ja/tutorials-and-examples/cms/authentication.html)に書いてある通り実装。

###ログイン画面にリダイレクトされない
ログイン画面にリダイレクトされるか確認するとなぜか、開発サーバのルートに飛んでしまいログインページが表示されない。
####Router::urlを使用して回避
[こちらの記事](https://www.orenante.com/cakephp4-auth-plugin-login-router-failed/)を参考に以下のように Router を使用してリダイレクトを指定。

```
use Cake\Routing\Router;

$authenticationService = new AuthenticationService([
            'unauthenticatedRedirect' =>  Router::url(['controller' => 'Users', 'action' => 'login']),
            'queryParam' => 'redirect',
        ]);
```
これでログイン画面にリダイレクトされた。

###今度はログインできない
ログイン画面にリダイレクトされると思ったら、次はログインできない。
hashの確認したが特に問題はなさそう・・・。
`print_r($result);`　で確認すると、

```
Authentication\Authenticator\Result Object ( [_status:protected] => FAILURE_OTHER [_data:protected] => [_errors:protected] => Array ( [0] => Login URL `/hogehoge/users/login` did not match `/users/login`. ) )
```
LoginURL did not matchで調べたところ[こちらの記事](https://stackoverflow.com/questions/59065494/cakephp-3-authentication-plugin-login-url-did-not-match)を見つけたので、書いてある通りに `loginURL` も Router を使うように変更。
####こちらもRouter::urlを使用して回避

```
$authenticationService->loadAuthenticator('Authentication.Form', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ],
            'loginUrl' => Router::url([
                'plugin' => null,
                'prefix' => null,
                'controller' => 'Users',
                'action' => 'login',
            ]),
        ]);
```

無事ログインできた。
誰かの役に立ちますように・・・。

#参考
[【CakePHP4】Authentication plugin:サブディレクトリに設置したCake4で、未ログイン時のリダイレクト先が荒ぶる【Router使おう】](https://www.orenante.com/cakephp4-auth-plugin-login-router-failed/)
[CakePHP 4 : CakePHP Route Url Missing Route](https://stackoverflow.com/questions/60053397/cakephp-4-cakephp-route-url-missing-route)
[Cakephp 3 Authentication plugin, login URL did not match](https://stackoverflow.com/questions/59065494/cakephp-3-authentication-plugin-login-url-did-not-match)
はじめてのSimpleDateFormatで引っかかった

## はじめてのjava.text.SimpleDateFormat
とりあえずフォーマットを定義したらその形で出力できるらしいのでやってみた。

```java:SimpleDateFormat_DD
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM月DD日");
String today = sdf.format(date);
System.out.println(today);
```

```
//　出力結果
6月161日
```
えー、なんで。。？

調べたら大文字とか小文字でいろいろ定義がされていて、
大文字のDDは年における日数がでるらしい。ふむ。


## ddを小文字に変えた。

```java:SimpleDateFormat_dd
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");　//ddを小文字に変更
String today = sdf.format(date);
System.out.println(today);
```
思った通りに出た。


```
//　出力結果
6月10日
```


## 日時パターン
| 文字 | コンポーネント | 例 |
|:-:|:-:|:-:|
| y  | 年  |2021;21   |
| M  | 年における月  |11   |
| D  | 年における日  |161   |
| d  | 月における日  |25   |
| F  | 月における曜日  |2   |
| E  | 曜日の名前 |Tuesday;Tue   |
| u  | 曜日の番号  |1(1=月曜）   |

## まとめ
便利なので基本的なパターンを覚えて使いこなしたい。
AWS S3 にテストウイルスのファイルを CloudShell でアップする

# はじめに

<a href="https://www.eicar.org/">EICAR</a> のテストウイルスが HTTP でダウンロードできなくなったので、Amazon S3 の静的ウェブサイトを使ってテストウイルスのダウンロード環境を作ってみました。
（以前 Lambda 版を公開していましたが、今回は CloudShell 版です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/9aa2ced9-486a-e02c-9e10-015e92e51e1f.png)

# CloudShell にて

S3 バケットを作成します。

```bash
$ aws s3 mb s3://[バケット名]
```

公開設定を行います。

```bash
$ aws s3api put-public-access-block --bucket [バケット名] --public-access-block-configuration  "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"
```

確認します。

```bash
$ aws s3api get-public-access-block --bucket [バケット名]

以下の結果であればOK
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}
```

バケットポリシーを設定し匿名ユーザーへアクセス許可します。
まずは CloudShell のローカルで json ファイルを作成します。

```bash
$ cat  << EOS > bucket-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow", 
            "Principal": "*", 
            "Action": "s3:GetObject", 
            "Resource": "arn:aws:s3:::[バケット名]/*" 
        } 
    ] 
}
EOS
```

作成したjsonファイルを元にS3バケットへポリシー適用します。

```bash
$ aws s3api put-bucket-policy --bucket [バケット名] --policy file://bucket-policy.json
```

必要ないと思いますが、index ファイルの設定も行っておきます。

```bash
$ aws s3 website s3://[バケット名] --index-document index.html
```

CloudShell のローカルにテストウイルスのファイルを作成します。

```bash
$ cat << EOS > eicar.com
X5O!P%@AP[4\PZX54(P^)7CC)7}\$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!\$H+H*
EOS
```

作成したテストウイルスを S3 にアップロードします。

```bash
$ aws s3 cp eicar.com s3://[バケット名]/
```

S3 にアップロードできたか確認します。

```bash
$ aws s3 ls [バケット名]
2021-06-10 00:00:01         69 eicar.com
```

curl コマンドで HTTP アクセスできるか確認します。

```bash
$ curl http://[バケット名].s3-website-ap-northeast-1.amazonaws.com/eicar.com

※URLのリージョン部分は環境にあわせて読み替えてください
```

以上でテストウイルスのダウンロード環境構築は完了です。
実際に利用する際は curl コマンドで確認した URL を使ってアクセスしてください。
HTML CSS Rails 基礎の学習だけで作成

私がプログラミングの勉強をしたいと思うようになった理由の１つに、
世の中にあるものを、私も自分の手で作れるようになりたいと思ったからです。

とりあえず簡単な基礎学習を終えた段階で、
かねてより作ってみたいと思っていたものを作成してみました。

サイズや文字の大きさが全く違うけれど、今は良しとしておきます…
また理解が増えたときに修正をできたらと思います。

参考画像
![5D7F4DB3-D908-436B-A9BE-D3292D1E9A5B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1627545/129c7989-5f62-1462-1245-4316b4230ce8.jpeg)




私の作成したもの
![7ED05A3E-0959-4767-B7D4-34ED08E9A0C1_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1627545/d3871817-801c-ed4b-d2bb-0f7dd40072e3.jpeg)
週刊Transformer（画像認識向け）

凄まじい勢いで増殖中のTransformer論文＋αにとりあえず、目を通しつつコメントを残していく。内容があっている保証はない。

[When Vision Transformers Outperform ResNets without Pretraining or Strong Data Augmentations](https://arxiv.org/pdf/2106.01548.pdf)
GoogleとUCLAの論文。ViTとMLP-mixerはsharp local minimaに落ち込むので、SAM(sharpness-aware optimizer)を使ってLandscapeをスムーズにすると更にうまく行く。

[Understanding Robustness of Transformers for Image Classification](https://arxiv.org/pdf/2103.14586.pdf)
Google論文。入力を変えてどれだけRobustかをメインにResNetとViTを比較。大量のデータで学習するとモデルサイズが大きくなればなるほど、ViTはResNetより精度が上がる。中規模データだと変わらない。

[Regularization in ResNet with Stochastic Depth](https://arxiv.org/pdf/2106.03091.pdf)
Regularizerとして有効なStochastic DepthをTheoreticalに調べた。

[Self-Damaging Contrastive Learning](https://arxiv.org/pdf/2106.02990.pdf)
Contrastive Learningで使うタグなしデータの量は、全てのデータで一定とはならない。インバランスなデータに強いネットワークをsimCLRを元に開発。

[Learning from Noisy Labels with Deep Neural Networks: A Survey](https://arxiv.org/pdf/2007.08199.pdf)
Noisy LabelのSurvey。

[Learnable Fourier Features for Multi-Dimensional Spatial Positional Encoding](https://arxiv.org/pdf/2106.02795.pdf)
Google論文。自然言語の方で、Position Encodingを学習できるフーリエの係数にすると精度が上がって収束が速い。
＿＿＿＿＿＿＿＿＿

[Self-supervised Pretraining of Visual Features in the Wild](https://arxiv.org/pdf/2103.01988.pdf)
FAIR論文。新しいSelf-supervised学習。 13億のパラメータで10億の画像を512のGPUで学習するとImageNet:84.2%達成。

[Scaling Local Self-Attention for Parameter Efficient Visual Backbones](https://arxiv.org/pdf/2103.12731.pdf)
Google論文。CNNにAttentionを入れるHaloNetという小さい規模のネットを開発。Efficient Netより良い。

[Not All Images are Worth 16x16 Words: Dynamic Vision Transformers with Adaptive Sequence Length](https://arxiv.org/pdf/2105.15075.pdf)
Huaweiと精華大学の論文。ViTは16x16でパッチを作るけど、簡単に出来るやつはもっと大きくて良いし、難しいのはもっと細かく切った方がいいから、Dynamic Vision Transformers (DVT)っていう大きいのから順にわかるまでやって行くのを考えた。ざっくりやるときのパラメータをReuseするから、小さくて精度が良くなるっぽい。

[Shuffle Transformer: Rethinking Spatial Shuffle for Vision Transformer](https://arxiv.org/pdf/2106.03650.pdf)
Tencentの論文。Tokenの中身を途中でShuffleして精度を上げるTransformer。そのうちCodeを公開。

[Scaling Vision Transformers](https://arxiv.org/pdf/2106.04560.pdf)
Google論文。モデルの規模、学習データ数、学習時間を大きくして、どうなるか調査。パラメータ数20億でImageNetのTop1：90.45％達成。

[ResT: An Efficient Transformer for Visual Recognition](https://arxiv.org/pdf/2105.13677.pdf)
ViTのAttentionの部分をちょっと変えて、BackboneをResNetチックにDownsampleするようにして全体の計算量減らした。

[Transformer in Convolutional Neural Networks](https://arxiv.org/pdf/2106.03180v1.pdf)
TokenをGridに分けて、その中でAttentionを計算し、じわじわとくっつけて行くことで、ネットワークを小さくして、精度を良くする。

[DynamicViT: Efficient Vision Transformers with Dynamic Token Sparsification](https://arxiv.org/pdf/2106.02034.pdf)
精華大学とUCLAの論文。重要じゃないTokenを落としながらInferenceを速くするネットワーク。

[RegionViT: Regional-to-Local Attention for Vision Transformers](https://arxiv.org/pdf/2106.02689.pdf)
細かく見るTokenと大まかに見るTokenを組み合わせる。いろんなデータセットで試したら、ViT系のSOTAと同じか更に良い結果になった。

[Probing Word Translations in the Transformer and Trading Decoder for Encoder Layers](https://www.aclweb.org/anthology/2021.naacl-main.7.pdf)
機械翻訳で、EncoderとDecoderあるけど、実はDecoderの方はそんなに重要じゃない。
【備忘録】 IE11 の Cookie を編集、削除する

▼ メモ記事

https://webtopi.net/archives/23

https://qiita.com/C_HERO/items/4a996bac037c9f6ccb0a

https://mfumi.hatenadiary.org/entry/20100223/1266904044

上記の記事を参考に対応したが、修正した cookie.txt をインポートしてもうまく反映されなかった
最終的には Burp でプロキシ立てて、必要な cookie を定義して解決
[Rails] chart.jsを使って投稿に連動したグラフを作る！

## はじめに
オリジナルアプリの作成にて、投稿に連動したグラフを作成したので作成方法をアウトプット！

## 導入方法
１：chart.jsをCDN経由でRailsアプリに導入
２：グラフ生成のコード記述
３：すこーしコード書き換えて投稿と連動させる

### そもそもCDNってなに？

CDN（Content Delivery Network）の略で、
ウェブコンテンツを効率的かつスピーディーに配信できるように工夫されたネットワークのことのようです。

これによってオリジンサーバーの負担を減らせるみたい。
感覚的には、アマゾンの倉庫をいろいろな場所に設けて、（東京の人は東京の倉庫から出荷！、大阪の人は大阪の倉庫から出荷！みたいな感じで）負担を減らそう！ってことで理解してます。

では、本題、、、
## 1:chart.jsをCDN経由でRailsアプリに導入

以下のリンクからCDNを作成！
https://www.jsdelivr.com/package/npm/chart.js?version=2.8.0
![chart.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522044/0be8c7c9-adcd-20e2-874a-4106d9f41640.jpeg)
![chart.js2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522044/afd5806f-e747-f3c1-4b3a-f6a57f34de0c.png)


view > layouts > application.html.erbのheadタグにscriptを記述


```ruby:application.thml.erb
<!DOCTYPE html>
<html>

<head>
  <title>Nutrik</title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
  <script type="text/javascript" src="https://js.pay.jp/v1/"></script>
  <%= stylesheet_link_tag 'application', media: 'all'%>
  <%= javascript_pack_tag 'application' %>
  <script src=”ここに貼り付ける！！！”></script>
</head>

<body>
  <%= yield %>
</body>

</html>

```

## 2:グラフ生成のコード記述

```index.html.erb
      <div class="chart">
        <canvas id="myChart" ></canvas>
        <script>
        var ctx = document.getElementById("myChart");
        var myChart = new Chart(ctx, {
          type: 'radar',
          data: {
            labels: ["1群", "２群", "３群", "４群", "5群", "6群"],
            datasets: 
            [
                {
                label: '６つの基礎食品群',
                backgroundColor: 'rgba(255,165,0,0.5)',
                borderColor: 'rgba(255,165,0,0.2)',
                data: [1,2,3,4,5,6]
                },
            ]
          },
          options: {
              maintainAspectRatio: false,
              scale: {
                  ticks: {
                      suggestedMin: 0,
                      suggestedMax: 7
                  }
              }
          }
        });
        </script>
      </div>  
```

そしたらこんな感じのグラブができます！

![グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522044/37862507-f5b5-299a-166b-2b62ad8c2de2.png)

## 3:すこーしコード書き換えて投稿と連動させる
こんな感じでコードを少し書き換えてあげる。

```ruby:index.html.erb
 data: [1,2,3,4,5,6]
```

```index.html.erb
 data: [<%= @food_group[1] %>, <%= @food_group[2] %>, <%= @food_group[3] %>, <%= @food_group[4] %>, <%= @food_group[5]%>, <%= @food_group[6] %>]
```

私の場合、持ってきたいデータが特殊だったので、少しコントローラーで加工して、インスタンス変数でビューに渡しています。

##終わりに
結果、すごく簡単にグラフが作れる！！

## 参考記事
https://zenn.dev/be_the_light/articles/1c0933fcc0f8bc
JavaScriptでMap -> Object

Mapって便利ですが、JSONにするとき困りますよね？

```javascript
const m = new Map();
m.set("a","1");
m.set("b","2");

console.log(JSON.stringify(m)); // {}
```


なんか無理やり？

```javascript
const m = new Map();
m.set("a","1");
m.set("b","2");

const o = Object.assign({},...[...m.entries()].map(m=>({[m[0]]:m[1]})));

console.log(JSON.stringify(o)); // {"0":"b","1":"2"}
```
もっといい方法無いのでしょうか？
消えてしまう有給を撲滅するためのアプリをNuxt.jsで作った

## かんたんな紹介と動機
[有給Holder](https://uq-holder.netlify.app/)というアプリを作りました。有給を取り忘れないように1年間である程度計画的に取りたいと思って作りました。

個人的な話ですが、去年度たまたま人生初の入院（コロナではありません）というイベントがあったため、3月末で消えてしまうはずだった有給を辛うじて消化できました。
しかし、そんなイベントが無いと消化できないのは大変もったいないことです（また入院はしたくありません）。
更に、上場企業は有給消化率を公表しているので、そういった企業に勤めている場合はより良い就業環境であることをアピールするために、有給消化率は向上していくことが望ましいと考えられます。
ですので、ある程度余裕をもって有給を消化していくために、いつごろとればいいのかを計画したくて作りました。

## なぜVue.jsか
仕事で使うことになり、練習も兼ねて作ってみました。
また、[v-calendar](https://vcalendar.io/) というpluginがありまして、年間カレンダーを表示するのにちょうど良かったので使っています。

### Netlifyにデプロイ
Nuxt.jsで作ったアプリを簡単にデプロイできるNetlifyに作りました。
無料で作れましたし、アフィリエイトを載せても問題ないようです。

## 有給Holderの使い方
基本的には、休みたい日をカレンダーでクリックするだけです。

スマホは以下のような感じで、月ごとに選択していきます。
![スクリーンショット 2021-06-10 19.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/d0150cc0-a98c-ae55-382b-146e0c763500.png)

PCだと、1年分すべてを一枚のカレンダーで表示しながら、休みたい日を選べます。
![スクリーンショット 2021-06-10 19.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16864/f6dcad65-1897-12f2-77c6-2e3c49e8143e.png)

### 休みたい日をクリック
まず、来年の3月までに消えてしまう有給の日数を入力します。

次に、カレンダー上で有給を取りたい日をクリックしましょう。
土日祝日は予め色が変わっているので、完全週休二日制の場合は色が変わっていない日を選択すれば大丈夫です。
特に土日で制限もしていないので、土曜日や日曜日、祝日を選択することもできます。

選択した日はURLに保持されますので、それをどこかで持っていれば予定が変わったときに最初から作り直す必要がなくなります。

### Twitterでフォロワーに共有
「有給予定日をツイート」のリンクを押すと、URLと一緒にツイートできます。
これであなたが休みの日がフォロワーに共有されるので、休みを合わせて遊ぶのも良いかもしれません。

### GoogleCalendarにインポートして同僚に教える
仕事でも使いたい場合は、CSV形式でダウンロードできます。
[GoogleCalendarにそのままインポートできるCSV](https://support.google.com/a/users/answer/37118?hl=ja&co=GENIE.Platform%3DDesktop#zippy=%2Ccsv-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E7%B7%A8%E9%9B%86) になっています。

### 有給を使ってすることがない場合は漫画を読みましょう
アプリ名の元ネタと色合いとか細かいネタと個人的にオススメの漫画のリンクを載せました。是非読んでみてください。
（エヴァのコミック版だけ完読していなかったので、全部Kindleで買って読みました。絵柄がちょっと古い感じがしましたが、それもまた懐かしく、なかなか良かったです）

## まとめと今後
Vue.jsやNetlifyを使って、こういったツールをサクッと作って公開できて、時代が進んでいることを感じました。
いったん2021年度で作ってあるので、来年度になる前に有給をとって2022年などにも対応していきたいと思います。祝日は毎年微妙に変わっていくので、そのあたりを反映させていく予定です。
Ruby でグローバルなメソッドが書かれたファイルをグローバル空間に出さずにテストする

# 何がしたいか

Ruby でグローバル空間にメソッドが書かれたファイルを、グローバル空間に出さずにテストしたい。

# 例


例えば以下のようなディレクトリ構造で、 `apps/app1` と `apps/app2` は互いに別々のアプリとして起動されるが、specは一箇所でやってしまいたいというとき。(例えば複数の AWS Lambda の `lambda_function.rb` を一つのプロジェクトとして管理してる時みたいなことを考えてください)

```
.
├── spec
│   └── apps_spec.rb
└── apps
    ├── app1
    │   └── main.rb
    └── app2
        └── main.rb
```

で、この `main.rb` はグローバルな空間にメソッドを置いている。

```ruby:src/app1/main.rb
def main
  'hello, app1'
end
```

```ruby:src/app2/main.rb
def main
  'hello, app2'
end
```

# 普通にテスト書こうとすると何が起きるか


このとき spec ファイルでふたつの `main.rb` を `require` してしまうと、後で読み込まれた方で `main` メソッドが上書きされる。


```ruby:だめなapps_spec.rb
require_relative '../apps/app1/main.rb' 

RSpec.describe 'app1' do
  describe 'main' do
    subject { main }
    # 実行時は app2 の main メソッドが上書きされてるので 'hello, app2' となる
    it { is_expected.to eq 'hello, app1' }
  end
end

require_relative '../apps/app2/main.rb' 

RSpec.describe 'app2' do
  describe 'main' do
    subject { main }
    it { is_expected.to eq 'hello, app2' }
  end
end
```

# 解決策: Module の中にメソッドを展開してモジュールメソッドとして実行する

`main.rb` にグローバル空間を汚染させずに、 `main` メソッドを実行してあげる必要がある。ここは無理やり `Module` の中に展開し、モジュールメソッドとして実行してみましょう。

[`module_eval`](https://docs.ruby-lang.org/ja/latest/method/Module/i/class_eval.html)
 の第二引数として `file_name` を渡すと file_name の中で `require_relative` とかしててもちゃんと解決される。

**ただしapp1, app2 で同名のモジュールを `require` してた場合上書き問題起きる。難あり。**

```ruby:app_executor.rb
module AppExecutor
  def self.execute(file_name, &block)
    Module.new.yield_self do |m|
      # file_name を展開して file_name のディレクトリとして eval 
      m.module_eval(open(file_name).read, file_name)
      m.module_eval {
        extend self
        yield(self)
      }
    end
  end
end
```

で、テストの方ではモジュールメソッドとして実行させる。

```ruby:apps_spec.rb
RSpec.describe 'app1' do
  describe 'main' do
    subject { AppExecutor.execute('src/app1/main.rb') { |context| context.main } }
    it { is_expected.to eq 'hello, app1' }
  end
end

RSpec.describe 'app2' do
  describe 'main' do
    subject { AppExecutor.execute('src/app2/main.rb') { |context| context.main } }
    it { is_expected.to eq 'hello, app2' }
  end
end
```

かなり無理やり感はあるが動いたので良しということにする。
実行環境を取り出せるようにしたらモックとかもできるのでそっちのほうがいいかも。
[ソースコードはこちら](https://github.com/oieioi/ruby_global_method_pollution)
AWS CloudWatch Logs Insight で一定時間以上の処理に時間かかってるリクエストの割合を抽出したい

# 何がしたいか

AWS CloudWatch Logs Insight で、一定時間以上の処理に時間かかってるリクエストの**割合**を抽出したい。

# どうやるか

`>` は真の時は `1`, 偽の時は `0` になるので、 `sum` で数えられる。

例えば `@duration` が `2000`ms よりかかったログの全体の割合を抽出したいときはこんな感じ。

```shell
fields @duration, @duration > 2000 as slow_res
| stats count(@duration) as cnt, sum(slow_res) as slow_cnt, (slow_res / cnt) as slow_ratio
```

# 注意

[公式の記述](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html#CWL_QuerySyntax-operations-functions)によると `1` とか `0` ではなくブール値を返すって書いてあるので使えなくなる時が来るのかも。

>比較オペレーション
>
>比較オペレーションは、filter コマンドで使用できます。また、他の関数の引数としても使用できます。比較オペレーションは、すべてのデータ型を引数として受け入れ、**ブール値の結果を返します**。

(強調は筆者による)
【SQL】ウィンドウ関数について

> ウィンドウ関数について学習したことをまとめています。

# ウィンドウ関数の概要
ウィンドウ関数を使えば今までは相関サブクエリを使用して求めていた移動平均などがSELECT句に記載するだけで簡単に求めることができます。

## ウィンドウ関数でできること
- 移動平均
- 異なる行を現在行に持ってこれる（行間比較）

## ウィンドウ関数の動作
1. PARTITION BY 句によるテーブルのカット
1. ORDER BY 句によるレコードの順序付け
1. フレーム句によるカレントレコードを中心としたサブセットの定義

## ウィンドウ関数の型
```sql:ウィンドウ関数構文
OLAP関数(引数) OVER (
    [ PARTITION BY 句 ]
    [ ORDER BY 句 ]
    [ フレーム句 ]
)
```

### OLAP関数
分析関数とも言われる分析のための関数で専用の関数もあるが、集約関数も使用することができます。
以下よく使用されるOLAP関数を記載します。

| 関数名      | 機能                                                                    |
|-------------|-------------------------------------------------------------------------|
| AVG         | 平均を求める                        |
| COUNT       | 件数を求める                        |
| MAX         | 最大値を求める                                  |
| MIN         | 最小値を求める                                  |
| SUM         | 全合計を求める                        |
| ROW_NUMBER  | 1から数えたパーティション内の現在行の数を返す　（例：　1,2,3,4,5）                 |
| RANK        | 現在行の順位を返す(同じ値の場合に重複あり、値は重複分飛ぶ)　（例： 1,2,2,4,5） |
| DENSE_RANK  | 現在行の順位を返す(同じ値の場合に重複あり、値は飛ばない)　（例： 1,2,2,3,4）   |
| NTILE       | 行をバケットに分割する                                        |
| FIRST_VALUE | 最初の行の値を返す                                               |
| LAST_VALUE  | 最後の行の値を返す                                                |
| LAG         | 前の行の値を返す                                                |
| LEAD        | 次の行の値を返す                                                 |

### フレーム句
フレーム句で使用できるオプションは以下になります。

| キーワード                | 機能名                                            |
|---------------------|--------------------------------------------------------------------|
| ROWS                | 移動単位を行で設定する                                             |
| RANGE               | 移動単位を列の値で設定する。基準となる列はORDER BY句で指定された列 |
| n PRECEDING         | nだけ前へ移動する。nは正の整数                                     |
| n FOLLOWING         | nだけ後ろへ移動する。nは正の整数                                   |
| UNBOUNDED PRECEDING | 無制限に遡る方へ移動する                                           |
| UNBOUNDED FOLLOWING | 無制限に下る方へ移動する                                           |
| CURRENT ROW         | 現在行                                                             |



# ウィンドウ関数の構文
無名構文は簡潔に書けるがOVER以降の括弧（ウィンドウ）に名前をつける名前付き構文を使用すればウィンドウを使いますことができます。
どちらにも利点があるため、使用する場面によって使い分ける必要があります。

## 無名構文
```sql:無名構文
SELECT
	product_id,
	product_name,
	sale_price,
	AVG(sale_price) OVER (
		ORDER BY product_id 
		ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
	) AS moving_avg
FROM
	Products;
```

# 名前付き構文
```sql:名前付き構文
SELECT
	product_id,
	product_name,
	sale_price,
	AVG(sale_price) OVER W AS moving_avg
FROM
	Products
WINDOW W AS (
		ORDER BY product_id 
		ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
	);
```
Route53 ヘルスチェックタイプ

#【Route53 ヘルスチェックタイプ】

業務内で少し耳にした内容になります。その備忘録です。

##3種類のヘルスチェックタイプ

###エンドポイントをモニタリング

IPアドレス、ドメイン名で特定するエンドポイントをモニタリングする。

指定された一定の間隔で、自動リクエストをインターネット経由でアプリケーションやサーバーなどのリソースに送信して、そのリソースが到達可能、使用可能、機能中であることを確認する。

###CloudWatchアラームをモニタリング

DynamoDBへのスロットル読み込みイベント数や正常と推測されるELB数など、CloudWatchメトリクスのステータスをモニタリングする。

###他のヘルスチェックを監視

他のヘルスチェックが正常あるいは異常であるかを判断する時にモニタリングする。

複数のWebサーバーなどの同じ機能を実行する複数のリソースがあるときに、最低限のリソースが正常であるかを確認する。
ヘルスチェックの通知設定をせずに、各リソースにヘルスチェックを作成できる。
Webリソース数が指定する閾値を下回る場合に通知を行うように設定することも可能。
Harmony OSはオープンソースなのか？OpenHarmonyと何が違うか？

Harmony OSはオープンソースコードのOSで、ファーウェイはオープンソース財団OpenAtom Foundationにリリースしたのですが、しかし、これは完全に正しくありません。正確にいうと、ファーウェイがオープンソースにしたのは、Harmony OSではなく、そのもとであるOpenHarmonyです。

ではHarmony OSとOpenHarmonyはどう違うでしょうか？それをお話しする前に、まずAndroidについておさらいします。

# よくあるAndroid端末
AndroidもHarmony OSと同じく、オープンソースというイメージが強いですが、実はこれも間違いです。
私たちがよく使っているAndroidはGmailが使えたり、YouTubeが見れたり、Googleマップが使えたりします。その中身は[Android オープンソース プロジェクト（AOSP）](https://source.android.com/)＋[Google モバイル サービス](https://www.android.com/intl/ja_jp/gms/)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/d7765dde-9ca4-92ca-ecce-00274c400a81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/bddf543c-1de8-47c2-b29b-28d952bcedba.png)

つまり、一般的なAndroidの正体はこのようなオープンソースの部分と非公開の部分で構成されたものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/63f4aedc-eea0-c2dc-c18a-8c8ce2066832.png)

当然AOSPだけでも動作します。ただグーグルのモバイルサービスが使えないだけです。たとえば中国のAndroid端末はGMSを搭載しないものが多いです。

# Harmony OS
Harmony OSとOpenHarmonyの関係性をわかりやすく説明すると、Harmony OSはオープンソースである[OpenHarmony](https://gitee.com/openharmony)と非公開である[HMS](https://consumer.huawei.com/jp/mobileservices/)で構成されたものというわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/ca59d733-3e83-cc06-6ea6-43961bab716e.png)


# 参考
Harmony OS : https://www.harmonyos.com/en/home
OpenHarmony : https://gitee.com/openharmony
HMS : https://consumer.huawei.com/jp/mobileservices/
HMS開発 : https://developer.huawei.com/consumer/jp/hms
Blenderで出力した3DモデルをAR.jsで使う

AR.jsで表示する3Dモデルを無料サイトで探していたのですが、Blenderのプロジェクト形式でしか配布していないモデルがあり、じゃあBlenderでglbファイルにしてやれば良いじゃんとなった際のやり方。

環境はBlender2.93.0です。

##Blenderのインストール
ここからできます。

https://www.blender.org/download/

基本的に画面上部の青いボタンを押せば環境に合ったものがダウンロードできると思いますが、
もし違うものになっていたら少し下にあるドロップダウンリストから選ぶとダウンロードできます。

ダウンロードしたらインストーラーの指示に従いながらインストール。
何も考えずにNextを選んでいけば大丈夫。

##対象のプロジェクトを開く
Blenderを立ち上げて、言語の設定をすると以下の様な画面が出てくるので左下の「開く」を選択して、
対象のプロジェクトを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264471/4a211780-f816-c1b9-9903-ffcbe031e736.png)

##glbファイルとしてエクスポート
プロジェクトを開いたら早速エクスポートします。
画面左上のツールバーから「ファイル」⇒「エクスポート」⇒「glTF2.0(.glb/.gltf)」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264471/3f9e6605-d51d-2c74-3d41-6a37c979b380.png)

出力先の選択ダイアログが出てくるので右上のフォーマットから「glTFバイナリ(.glb)」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264471/46f91fd3-8afb-5f7b-bfdd-d3a0d5046ba0.png)

最後に右下の「glTF2.0をエクスポート」を選択すればglbファイルがエクスポートされます。

##AR.jsでの使用
後はglbファイルを適当なアップローダーでWeb上に置いて、AR.jsから参照できるようにすればOK

```HTML
<a-entity
    position="0 0 0"
    rotation="0 0 0"
    scale="0.05 0.05 0.05"
    gltf-model="https://arjs-cors-proxy.herokuapp.com/アップロードファイルのURL"
></a-entity>
```
SQL。処理の順番

上から順番に実行される

〜句	内容
from	テーブル指定
join	テーブルの結合
where	条件指定
group by	グループ化
sum,avgなど	関数
having	集計後の絞り込み
select, distinct	検索
order by	並べ替え
limit	取得件数の指定