OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby on Rails]  devise導入後にログアウトできなくなるエラー

誰でも簡単にユーザー管理機能が作れるGemの
**devise**を導入した後のエラーの解決方法を
備忘録として書き留めておきます。


　　


本来ならログアウトする際に**path**の記入と
**method**の記入だけでログアウトできるはずが、
エラーが立ち塞がった。

いつもは下記の記述ででエラーなんか起きたことなかったのに...

```
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %>
```


　　

エラー内容はスクショし忘れましたが、
翻訳に履歴が残っていました。


Could not find devise mapping for path "/users/sign_out". This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user]
パス「/ users / sign_out」のデバイスマッピングが見つかりませんでした。 これは2つの理由で発生する可能性があります：1）スコープブロック内にルートをラップするのを忘れた。 例：devise_scope：user do get "/ some / route" => "some_devise_controller" end 2）ルーターをバイパスするDeviseコントローラーをテストしています。 その場合、使用するマッピングをDeviseに明示的に指示できます。@ request.env ["devise.mapping"] = Devise.mappings [：user]

正直なんのこっちゃわかりません。(泣)

　　
とりあえず、
##解決方法



```config/initializers/devise.rb
config.sign_out_via = :get
```

大体２６９行目の記述。
ここは元々、**delete**と書かれていたのを
**get**に直すことで、読み込みが上手く行くようになりました。
【学習メモ】AWS Best Practices

#11 Best Practices
##1.スケーラビリティの確保
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/6e3a7ade-1475-8dd2-22c4-2d905b534322.png" width=40%>

##2.環境の自動化使い捨て
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/9de1be93-4af0-428a-bd61-a5e350b1c524.png" width=40%>

##3.リソースの使用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/76ffbb7e-c611-eacd-da59-805a206e66c1.png" width=40%>

##4.コンポーネントの疎結合
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/973731d8-9e8f-dae1-3cdb-05c2514815bd.png" width=40%>

##5.サーバーではなくサービス（サーバレス）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/ec2dd5ff-02d5-af75-d173-ad3c5850dade.png" width=40%>

##6.増大するデータ量対応
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/5dd252d2-a338-78aa-a615-5c1240b4ad6c.png" width=40%>

##7.単一障害点の排除
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/541851c3-6722-1014-86de-efd30d3970a4.png" width=40%>

##8.コスト最適化
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/43e9a88f-ac42-ce71-12e0-b0436a39bf86.png" width=40%>

##9.キャッシュの利用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/f8616967-7af1-6bb1-2ca3-2b7e488766b3.png" width=40%>

##10.セキュリティの確保
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/9589ca42-81df-5936-2229-12b80ba9e580.png" width=40%>

##11.最適なデータベース選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/42e92d4f-6842-455a-9507-8e4c6f15d2a0.png" width=40%>
[Angular] TSLintからESLintに移行する

## はじめに

Angular環境でTSLintからESLintへの移行について記載します。</br>
Angularのプロジェクト作成済みの場合は、[こちら](https://qiita.com/reriiasu/items/8f193684349cce1ed62a#tslint%E3%81%8B%E3%82%89eslint%E3%81%B8%E7%A7%BB%E8%A1%8C)から
2021年2月時点

## 簡単な説明

### TSLintとは

TypeScriptコードの静的解析ツール
2020/12/1に開発が中止し、ESLintへの移行が推奨されている。

### ESLintとは

JavaScriptコードの静的解析ツール

## ライブラリのバージョン

- eslint: 7.6.0
- eslint-plugin-import: 2.22.1,
- eslint-plugin-jsdoc: 30.7.6
- eslint-plugin-prefer-arrow: 1.2.2
- @angular-eslint/builder: 1.2.0
- @angular-eslint/eslint-plugin: 1.2.0
- @angular-eslint/eslint-plugin-template: 1.2.0
- @angular-eslint/schematics: 1.2.0
- @angular-eslint/template-parser: 1.2.0
- @typescript-eslint/eslint-plugin: 4.3.0,
- @typescript-eslint/parser": 4.3.0

## Angularのインストール

``` shell
$npm install -g @angular/cli
$ng version
Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1102.0
@angular-devkit/build-angular   0.1102.0
@angular-devkit/core            11.2.0
@angular-devkit/schematics      11.2.0
@schematics/angular             11.2.0
@schematics/update              0.1102.0
rxjs                            6.6.3
typescript                      4.1.5
```

## Angularプロジェクトの作成

``` shell
# プロジェクトの作成
$ng new eslint-convert
? Do you want to enforce stricter type checking and stricter bundle budgets in the workspace?
  This setting helps improve maintainability and catch bugs ahead of time.
  For more information, see https://angular.io/strict Yes
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? SCSS   [ https://sass-lang.com/documentation/syntax#scss]
```

## TSLintからESlintへ移行

・eslint-convertの部分は、プロジェクト名に合わせる。

``` shell
# プロジェクトフォルダにて
$ ng add @angular-eslint/schematics
$ ng g @angular-eslint/schematics:convert-tslint-to-eslint eslint-convert

# TSLintの削除
$ rm tslint.json
$ npm uninstall tslint
```

## VSCode extensionのインストール(VSCodeの場合)

- [VS Code ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)

### VSCodeの設定

- 保存時に自動補正を行う

``` settings.json
{
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```

## 動作確認

- 保存前

``` ts
export class AppComponent {
  constructor() {
    let hoge = '';
  }
}
```

- 保存後 letがconstに置き換わることが確認できる。

``` ts
export class AppComponent {
  constructor() {
    const hoge = '';
  }
}
```

## 参考

[https://github.com/angular-eslint/angular-eslint](https://github.com/angular-eslint/angular-eslint)
AppSyncとは？

## 勉強前イメージ

アプリケーションのデータをsyncするとか・・？

## 調査

### AppSyncとは？

GraphQLというWebAPIを用いてデータにアクセスでき、処理を行うことができるもの

### WebAPI とは？

APIやりとりをHTTP,HTTPSベースで行うAPI
RESTやSOAPなどがあり、そこにGraphQLというものもあります。

### GraphQL とは？

acebookが2015年に公開したAPIの規格で、
RESTでは以下のような課題がありました。

- REST API の課題
	- ドキュメント管理が大変
	- 使い方難しい
	- ドキュメントと実装がずれる

RESTでの課題を解決し、RESTが適合しないときに使うものとして開発されました。

### 改めての AppSyncとは？

GraphQLのマネージドサービス。
GraphQLを簡単に使うことができます。

### 接続イメージ

![構成Untitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/ef9e593d-85e1-5c48-eec3-8ad65b0e3d02.png)


PCやmobileからのリクエストをAppSyncはGraphQLで処理します。
スキーマーとデータソースを繋ぐ役割の `リゾルバー`
データソースは DynamoDB, lambda, Aurora, Elasticsearch, HTTP Endpoint が指定できます。

### AppSyncの特徴

- シンプルかつ安全なデータアクセス

GraphQL からの単一のネットワークリクエストで複数のデータソースからデータの取得が行なえます。

- 組み込まれたリアルタイム & オフラインの機能

データの更新をリアルタイムでプッシュでき、
モバイルのアプリケーションのために、オフライン時のアクセスと、オンラインに復帰した際に競合を解決するための機能を備えた、データ同期機能を提供します。

- サーバー管理が不要

完全マネージド型なので、セットアップ、管理、保守は必要ありません。

### ユースケース

- ダッシュボード
	- リアルタイムでのデータ更新
- 複数ユーザが同時編集するようなもの
	- コラボレーションをするもの
	- 自動更新ができる
- ソーシャルメディア・チャット
	- 複数ユーザ間のメッセージ管理ができる
	- オフライン時でも操作可能で、接続後自動sync

## 勉強後イメージ

APIで自動でデータ取りに行ってくれたりする・・のイメージ
実際に触ってないからまだふんわりとしか理解できてない。

## 参考

- [AWS AppSync](https://aws.amazon.com/jp/appsync/)
- [【AWS Black Belt Online Seminar】AWS AppSync](https://www.youtube.com/watch?v=89NGPaxZlW0)
- [【速報】マネージドGraphQLサービス「AWS AppSync」が一般公開（GA）されました！](https://dev.classmethod.jp/articles/app-sync-ga/)
gatsby + wordpress 日本語での投稿に対応する

# 背景
gatsbyは素晴らしいですね。
簡単に静的サイトが作れて、かつReact.jsをガリガリ書けばカスタマイズ性も抜群。

欠点としてはworedpressのように記事を管理する機能(CMS)がないことです。

それを補う方法としてgatsbyにはプラグインとして[gatsby-source-wordpress](https://www.gatsbyjs.com/plugins/gatsby-source-wordpress/)が用意されており、このプラグインはwordpress APIを使って既存のwordpressのサイトからAPI経由で記事を持ってくることができます。

![グループ 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605320/12753c56-deff-d5d0-a68e-7566cccf2988.png)

実際に使う時は[gatsby-theme-wordpress-mdx](https://www.gatsbyjs.com/plugins/gatsby-theme-wordpress-mdx/)とともに使いうと、一瞬で静的サイトを作ることができます(詳しい作り方は別に投稿します)。

# 課題
大変便利なgatsby-theme-wordpress-mdxですが、欠点としてwordpress側のURLに日本語が含まれている場合、下のようなエラーが出てしまい使えません。
![スクリーンショット 2021-02-21 0.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605320/5e2874d6-fca0-1d15-04fd-2a1e4ca273eb.png)

どうやらURLエンコーディングに対応できていないようです。

# 解決策
クライアント側での解決策をいろいろ探したのですが、どうすることもできないようなのでwordpress側で対応します。

URLに日本語が含まれなければ良いのです。

普通にwordpressを使っている場合、wordpressの記事のURL末尾に自動的に付与される"slug"と呼ばれる部分が日本語になって今います。

http://[ドメイン]/2021/02/20/[slugはこの部分]/

そこで、wordpressのfunction.phpを弄ってslug部分を日本語からpost-[id]に変更します。

```php
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
    if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
        $slug = utf8_uri_encode( $post_type ) . '-' . $post_ID;
    }
    return $slug;
}
add_filter('wp_unique_post_slug', 'auto_post_slug', 10, 4  );
```

すると、urlから日本語がなくなるのでクライアント側で問題なく投稿記事が見れるはずです。
外部通信は非同期で行いましょう

Firebaseなどの外部APIにアクセスするときは必ず非同期処理でかく必要があります。
以前はMVVMでその方法を説明しましたが、Viewに情報を反映しなくていい場合などの状況下ではViewModelは必要ないので、Activity/Fragmentから直接Repositoryを呼び出すことになります。ほぼMVVMとやり方は変わりませんが忘れっぽい私のためにここに残しておきます。
ちなみに、サーバーサイドの処理は非同期にする必要はありません。

```Activity.kt
private val userInfoRepository = UserInfoRepository()
private val notificationRepository = NotificationRepository()

GlobalScope.launch {
      notificationRepository.save(uid, token)
}

var result: List<SaveUserInfo> // SaveUserInfoはデータクラスの名前
GlobalScope.launch {
       // 引数のuidと一致するuidのデータを取得
       result = userInfoRepository.getUser(uid)
       Log.d("TAG", result.toString())
}                    
```
こんなかんじで`GlobalScope{}`を使って非同期処理を実行できます。

RepositoryはMVVMの記事と全く変わりません。
例えばこんなかんじです。

```NotificationRepository.kt
class NotificationRepository {
    // uidとトークンを登録
    suspend fun save(uid: String?, token: String?): Task<Void> {
        return suspendCoroutine { cont ->
            val db = FirebaseFirestore.getInstance()
            val testNotification = TestNotificationDataClass(uid, token)
            val task = db.collection("testNotification")
                .document()
                .set(testNotification)
            Log.d("TOKEN", "about to enter addOnCompleteListener")
            task.addOnCompleteListener {
                Log.d("TOKEN", "in the addOnCompleteListener")
                cont.resume(it)
            }
            Log.d("TOKEN", "finish addOnCompleteListener")
        }
    }

    suspend fun getUser(uid: String?): List<SaveUserInfo> {
        return suspendCoroutine { cont ->
            val db = FirebaseFirestore.getInstance()
            val task = db.collection("userInfo")
                .whereEqualTo("uid", uid)
                .get()
            task.addOnCompleteListener {
                val resultList = task.result!!.toObjects(SaveUserInfo::class.java)
                cont.resume(resultList)
            }
        }
    }
}
```
reactプロジェクトを作成する時のnpm installするパッケージ

## プロジェクトディレクトリを作成

```console:プロジェクトディレクトリ作成
mkdir project
```

## npm init

`npm init`はnpmを使用して対象プロジェクトのパッケージ管理をするために必要な`package.json`を作成するためのコマンド。
先ほど作成したプロジェクトディレクトリに移動して実行する。

```console:
cd project
npm init
```

実行すると、下記の項目について何を設定するか聞かれる。
何も入力せずEnterを押せばデフォルトの項目が設定される。
※全てデフォルトで良いのであれば`npm init -y`で実行することがおすすめ。`-y`はyesの意味。
もし、入力を間違えたとしても後で`package.json`を修正すれば良い。

|項目|意味|デフォルト値|
|:--|:--|:--|
|name|プロジェクト名|プロジェクトディレクトリ名
|version|プロジェクトバージョン|1.0.0
|description|パッケージの説明|空文字
|main|プログラムへの主要なエントリポイント|index.js
|script|テスト用のコマンド|"test": "echo \"Error: no test specified\" && exit 1"
|keywords|キーワード<br>※プロジェクトを公開した時に検索の手助けとなるワードを設定|空配列
|author|著者|空文字
|license|プロジェクトのライセンス|ISC

ちなみにISCライセンスは、簡単に言ってしまえば「自由に使っていいよ。ただし、このプロジェクトのコピーライトは記載してね」というライセンス。原文は[こちら](https://licenses.opensource.jp/ISC/ISC.html)。

コマンド実行後、下記のような`package.json`が作成される。

```
{
  "name": "project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

## reactプロジェクトのためのパッケージインストール

パッケージはローカルインストールで行う。

```console
npm install --save-dev パッケージ名
```

`--save-dev`を指定すると、`package.json`の`devDependencies`に追記してくれる。
本番環境で環境構築や、他のメンバにプロジェクトを手伝ってもらうときに簡単に環境構築できるように`--save-dev`は必ず指定する。

あとは、下記リストのパッケージをインストールすればとりあえずreactは動く。
reduxとか使用したければ別途インストール。

|パッケージ名|役割|
|:--|:--|
|@babel/core|Babel本体|
|@babel/preset-env|サポートされている環境に基づいて必要なBabelプラグインを自動で決定する|
|babel-loader|webpackでコードを変換するためにBabelを使用するよう指示する|
|babel-plugin-add-module-exports|Node.jsの変換時に使用する|
|@babel/preset-react|全てのReactプラグイン用のBabelプリセット|
|babel-plugin-react-html-attrs|JSX内で`className`ではなく`class`を使えるようにする|
|babel-plugin-transform-class-properties|クラス外でクラスプロパティが定義された時に正常にBabelで変換できるようにする|
|react|react本体|
|react-dom|reactでDOMを操作する|
|react-router-dom|React Routerのコアルーティング機能を提供する|
|webpack|webpack本体|
|webpack-cli|`webpack`コマンドを使用できるようにする|
|webpack-dev-server|webpackを用いたフロントエンド開発のときに利用できる開発用のwebサーバー|
|axios|非同期でHTTP通信を行う|



### 参考サイト
[@babel/preset-env (Babel 7)をハンズオンでちゃんと理解する](https://zenn.dev/sa2knight/articles/67f6f5cc4ed5e26e391c)
[react-routerとreact-router-domの違い](https://qiita.com/koja1234/items/486f7396ed9c2568b235)
[Babelの設定を見直すための逆引きガイド](https://aloerina01.github.io/blog/2018-03-19-1)
[npm install の --save-dev って何？](https://qiita.com/heyheyww/items/092fcbc490a249a2d05c)
[Babeljs-babel-plugins
BabelJS-Babelプラグイン](https://www.finddevguides.com/Babeljs-babel-plugins)
Poetry のについてのまとめ

## Poetry とは

Poetryとはpythonパッケージの管理ツール

- ドキュメント：[Poetry - Python dependency management and packaging made easy](https://python-poetry.org/)


## インストール(for Mac)
```
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
```

##アップデート
```
poetry self update
```
【Rails】時刻のJST(日本標準時)への変更

Railsアプリは、デフォルトでUTC(協定世界時)タイムゾーンを使用します。日時を扱う際、自動的にActiveSupport::TimeWithZoneクラスを用います。

#タイムゾーンの変更
アプリケーションの起動時に任意のタイムゾーンの値にするには、Time.zoneの値の制御が必要です。
製作中のアプリは日本での使用を想定しているため、日本時間に変更します。config/application.rbにconfig.time_zoneから始まる1行を追加します。

```ruby:config/application.rb
module TweetApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2
    config.time_zone = 'Asia/Tokyo'
    ...
  end
end
```
![5E583349-31E1-4EE2-929D-6BC0D0788E98.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/6db50585-30c1-51d0-3669-2679f22fd6d7.png)

これで、日時がJST(日本標準時)で表示されるようになりました！

ですが、このままだと読みづらいので表示を変更します。時刻のフォーマットファイルを作成し…

```ruby:config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y/%m/%d %H:%M'
```

あとは以下のコードを投稿時間と更新時間の箇所へと書き換えればOK！

```
.created_at.to_s(:datetime_jp)
.updated_at.to_s(:datetime_jp)
```


#参考
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=ppx_yo_dt_b_d_asin_title_o03?ie=UTF8&psc=1)
[【Rails】created_at、updated_atを日本時間に変更して良い感じに表示する方法](https://qiita.com/tomo_k09/items/e4f19947d35890500492)
[Unity3D] CinemaChineを使用したフォローカメラ設定

1, CinemeChineをインストールする
![ABF546E1-915C-4771-9D00-5F4D82B790E0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/5b49252c-c45c-3792-ae7e-6c68e3970ebf.jpeg)

2, ヒエラルキーにCameraを作成し、TagをMainCameraに設定する
![C3847B38-E64C-49E9-B213-E53D41267A31_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/9c6334d6-ada1-3300-9497-6e832ccc0574.jpeg)

3, CinemachineのCreateVirtualCameraを選択
![B59EAF52-82C8-48C8-A15E-996C5B0D3151_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/3474dcc4-b203-3689-73f8-fcf0e6098f7c.jpeg)

4, FollowCameraに名前を変更、Followにplayerを設定しBobyがDonothingの状態でカメラを移動して合わせる
![D4D3551F-4157-41D4-8B42-1916D4A33A43.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/53b7b8f3-0101-b0e1-e788-eec9b9ef953c.jpeg)

5, BodyをFramingTransposerに変更する
![FDC66C0B-B347-465B-91FE-743AFB48B403.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/8105a3b5-d1f8-e81b-d896-b6d05ad9bccb.jpeg)

6, 各種調整する
![22A2FD34-9911-4F92-9395-CED6BCB4258A_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/a68265ef-db50-8d5a-9dc5-b53ce1a71ee8.jpeg)
RustでつくるDLLの話

こんにちは。 私はメインで使ってるOSがWindowsなので、共有ライブラリといえばDLL派です。 だいたいsoってなんだよドレミファの次にあるやつかよ。 なのでこの記事では共有ライブラリのことをDLLって呼びますがご了承ください。

Rustの得意分野の一つが、FFI (Foreign Function Interface) と呼ばれる他言語との連携ですね。 他の言語で書かれたライブラリをRustから呼び出したりするのはもちろんですが、Rustで書かれたライブラリを他の言語から呼び出してもらうことももちろんできます。
その際には、こういった言語間連携の事実上の標準である、C言語の呼び出し規約に準拠した関数を仕込んだDLLファイルを作成して、それを介して呼んだり呼ばれたりするのが標準なわけですね。

この記事では、Rustの関数を他言語から呼び出してもらうためのDLLの作り方やちょっとした小ネタを書いていきます。

#RustでDLLファイルを作るには#

とりあえず、拡張子 .dll のファイルを出力するだけであれば、クレートの`src`フォルダの下に`lib.rs`というファイルを置き、次のような記述を`Cargo.toml`に追加するだけです:

```toml:Cargo.toml
[lib]
crate-type = ["cdylib"]
```

もしクレートを `cargo new クレート名 --lib` のコマンドで作成したのなら、上述の`lib.rs`はもうできているはずなので、`Cargo.toml`に上記の内容を追加するだけですね。 あとはいつもと同じようにビルド(厳密には`cargo build --lib`)してやれば、`target/debug/`フォルダ以下になんかDLLができあがっているはずです。

ただこれだけだと、DLLは作ったものの中には特に何もないので、DLLで公開する関数を教えてやらなければいけません。

#DLLで公開する関数をつくる#

## 5秒でわかる ##
関数を書くときに、`#[no_mangle]`と`pub`と`extern "C"`をこの順に`fn`の前に書きます。

## もっと厳密に ##

いろいろ試してみた感じ、DLLで公開される関数の厳密な条件はたぶん以下のような感じです：

1. DLLを作るクレートから、`pub`で公開されており、
1. `extern "C"`で定義されており、
1. 関数名がマングル(難読化みたいなの)されておらず、
1. 関数の実体が、DLLを作るクレートから見て静的にリンクされている

### 他クレートで定義された関数をDLLで公開する ###
これは上述の1.の条件を利用します。 DLLのクレートの依存先の別のクレートで、

```rust
#[no_mangle] pub extern "C" fn hogehoge() {
  // ...
}
```

のように定義されている関数があった場合、DLLのクレートでこの関数を`pub use`してやれば、それがそのままDLLで公開されるわけです。 ただし注意しなければいけないのは上述の4.の条件で、依存先のクレートが動的にリンクされるとこの関数はDLLに入らなくなってしまいます。 なので、依存先のクレートは必ず静的にリンクされる`rlib`の設定がされていないといけません：

```toml:Cargo.toml
[lib]
crate-type = ["rlib"]
```

一応、デフォルト設定である`lib`が`rlib`の代わりに入っていても、だいたいは問題なく動くと思いますが、[ドキュメント](https://doc.rust-lang.org/reference/linkage.html#linkage)によると`lib`は静的・動的どちらかをコンパイラが自由に選択するという設定なので、この場合は`rlib`を書いておくのが正解でしょう。

## extern "C" は2種類の文法があり、それぞれ微妙な違いがある ##

あるんです。

主に関数をインポートするときに使う、`extern "C" {}`ブロックの中に関数__宣言__(関数本体部分`{...}`を書かずに、`;`で終わらせるやつ)を書いていく方式と、関数をエクスポートするときに使う、`extern "C"`のあとに関数__定義__を書いていく方式の2通りがあります。

これ、インポートするときとエクスポートするときで対称になってるんやろなぁと思うじゃないですか、ところが微妙に違うらしいんです。

違いは名前のマングリングで、前者は勝手に`#[no_mangle]`相当の非マングル化された関数名をインポートしますが、後者は関数ひとつひとつに明示的に`#[no_mangle]`と書かなければ関数名がマングルされます。

私の感覚では、前者の動作のほうがちょっとおかしい気はします。 `extern "C"`が指定しているのはあくまでも呼び出し規約(関数を呼び出すときに引数を左から渡すか右から渡すかとか、関数の呼び出し元と呼び出し先のどちらがスタックポインタを動かすかなどの取り決め)であって、関数名は呼び出し規約とは直接関係ないところだからです。 とはいえ、普通はどうせ`extern "C"`したら`#[no_mangle]`も同時に書くに決まってるんだから、こうした方がコード書くときにタイプ量が減って楽だという気持ちも分からんでもないです。 問題は言語内で統一が取れていないところですね……。

なんでこんなことになってるのか軽く調べてみましたが、2016年ぐらいにこの問題に気づいた方がいて修正しようとしてみたものの、互換性の問題で修正できなさそうみたいな結論になっている[スレ](https://internals.rust-lang.org/t/no-no-mangle/3973)を発見できたぐらいでした。
Apex の Database.query(String) とインラインSOQLの使い分け

駆け出しsalesforce開発者として、なんとなく併用していたDatabase.query(String)とインラインSOQLに関してもう少しまじめに調べてみました。

### 前提：インラインSOQLの方が望ましい
調べてみると基本的にはインラインSOQLを使った方がいいとのこと。
[【Apex】Database.query(String) を使ってはいけない](https://qiita.com/kaku10/items/b1d60728a3a4b7c8bfc6)
Database.query(String) の問題としては
>1.セキュリティリスクを考慮する必要がある
>2.エディタの補助機能を活かせない
>3.項目の使用場所に引っ掛からない

があり、自分も 2 が理由で自然とインラインSOQLを好んでいました。

### 疑問：インラインSOQLが使えない場面はあるのか
しかしいままでは既存のコードがDatabase.query(String)を使っている部分はとりあえずそれに倣いクエリ文の中身だけ変更する、といった場当たり的な対応をしていました。その中で実際にインラインSOQLに変更できない場面はあるのか、現時点で思いついたのは以下の2つです（経験を積めばもっと事例が浮かぶかもしれませんが）。

### １．バッチのクエリロケータの場合
こんな書き方がされていたので文字列で設定する形じゃないとダメなのかと思いましたが

```apex
private Database.QueryLocator getQueryLocator() {
    String query = ' SELECT ～ ';
    return Database.getQueryLocator(query);
}
```
調べたらこういう書き方もできました。

```apex
private Database.QueryLocator getQueryLocator() {
    return Database.getQueryLocator([SELECT ～]);
}
```
インラインSOQLにおける　[  ]＝ListやSObject　だと思っていましたが、この場合　[  ]＝String　という扱いなのか？？
ともあれクエリロケータに限らずクエリを文字列で渡す、という場合にはこの方法でいけそうです。

### ２．取得項目を変数で渡す場合
「大量の項目を一度に設定」や「ループや条件分岐などによって項目を動的に設定」等の場合です。Database.query(String)を使っているのは特にこのパターンが多かったので、本丸の検証といえます。
以下のように書いてみると…

```apex
Schema.SObjectType               objType   = Account.SObjectType;
Schema.DescribeSObjectResult     objResult = objType.getDescribe();
Map<String, Schema.SObjectField> fieldMap  = objResult.fields.getMap();
String columns = String.join(new List<String>(fieldMap.keySet()), ', ');

Account acc = [
    SELECT
        :columns
    FROM
        Account
    LIMIT 1
];
```
…**ダメでした**。
accでエラーが出ましたがVSCode上で見ると「:(バインド変数)」がこの位置では使えないようです。インラインSOQLでは項目とオブジェクトは直に書く必要がある、だからこそ前提で挙げた諸メリットを享受できるということでしょう。

### 結論：取得項目を変数で渡す場合は Database.query(String) を使う
React*Material-UIのCreateStylesで擬似クラスを扱う

# 概要
何故かMaterial-UIのCreateStyles環境下における擬似クラスの取り扱いの記述が公式にあまりなかった為、どうやって適用すれば良いのか当初詰まりました。

最終的にこうやれば良いのだと発見した為、確認できた対応方法を記載致します

# 記載方法

```typescript:sample.tsx
const useStyle = makeStyles(theme =>
  createStyles({
    box1: {
      color: 'black',
      '&:focus': {
        '& + $box2': {
          color: 'red',
        },
      },
    },
    box2: {
      color: 'black',
    },
  }),
);

export function InputStandard() {
  const clsx = useStyle();

  return (
    <div>
      <input className={clsx.box1} />
      <div className={clsx.box2}>box2</div>
    </div>
  );
}
```

CreateStylesの場合は通常のCSSの記載方法が取れず、例えば隣接要素へfocus時のCSSを適用したい場合は、focus対象のクラス内でネストさせて、そこで $class名とする必要がありました。

なおこの例では$class名としておりますが、$要素名でも行けます。
そもそもStateで管理してJS側で管理するパターンの方が多いかもしれませんが、どなたかの参考になれば幸いです
そうだ、SQLを勉強しよう14

#はじめに
今日はあまり学習に時間を使えなかたので、すこしだけ…

##もし別のテーブルに同じ名前の列名があったら…

```sql
テーブル名.列名
```
`テーブル名.`を列名の前につける。

##同じ意味になる演算子

`NOT IN`と`<>ALL`：全ての値と一致しないと真
`IN`と`=ANY`：いずれかの値と一致すると真
BlueqatでQuantum Phase Estimation (QPE)

# BlueqatでQuantum Phase Estimation (QPE)


```python
pip install blueqat qiskit pylatexenc
from blueqat import Circuit
import math
```

## IQFT
```python
def qft_dagger(circ, n):
    """n-qubit QFTdagger the first n qubits in circ"""
    # Don't forget the Swaps!
    for qubit in range(n//2):
        circ.swap[qubit, n-qubit-1]
    for j in range(n):
        for m in range(j):
            circ.cu1(-math.pi/float(2**(j-m)))[m,j]
        circ.h[j] 
```

## QPE w/ IQFT
```python
def qpe(circ, n_iqft, theta):
  circ.h[0:n_iqft]
  repetitions = 1
  for counting_qubit in range(n_iqft):
    for i in range(repetitions):
        circ.cu1(theta)[counting_qubit, n_iqft] # This is Controlled-U        
    repetitions *= 2
  qft_dagger(circ, n_iqft)
```

## 実行

```python
circ_QPE = Circuit(4)
circ_QPE.x[3]
qpe(circ_QPE, 3, math.pi/4)
circ_QPE.m[:]
circ_QPE.run_with_ibmq(returns='draw', output='mpl', fold=30)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/0c2b9d61-38a9-9750-4db5-cd5fd1615fb1.png)


```python
circ_QPE.run(shots=1024)
```

`Counter({'1001': 1024})`


左端から準に$q_{0,1,2,3}$と定義されています。
$q_{0}$が$2^{-3}$の桁で、$q_{2}$が$2^{-1}$の桁です。
$q_{3}$は固有ベクトルの入力です。


上記のコードは任意ユニタリ行列に対応しているわけではありません。
$U_{1}$にのみ対応しています。


# 結論

qiskitとblueqatは回路記述がほぼ同じなので、簡単に書き直せる。
ただし相違点もある。


- blieqatではchainでゲートを並べられる。 circuit.x[0].h[0] など。
- blueqatに無い機能もある。(指定量子ビットだけの測定、任意ゲートの制御化、量子状態のreset, initialize)
 - 一応m[1]のような記述はできるが、他の量子ビットの測定結果が0に固定されるだけで、必ず$N$桁出てきてしまう。
Dockerのイメージとコンテナ削除

# はじめに
不要なイメージとコンテを一括削除する際のメモ。

参考：
https://docs.docker.com/config/pruning/

# イメージ削除

```bash:コンテナから参照されていない且つタグがついていないイメージを一括削除
$ docker image prune
```

```bash:同じリポジトリ名のイメージを一括削除
docker rmi -f `docker images リポジトリ名 -q`
```

## オプション

|オプション  |説明  |
|---|---|
|--all, -a  |未使用のイメージをすべて削除  |
|--filter  |条件指定。例： "until=24h"  |
|--force, -f  |確認無しで即時削除  |

# コンテナ削除

```bash:停止状態のコンテナを一括削除
$ docker container prune
```
ラズパイ で PMMP鯖構築

##動機
使わなくなった64GB SDカードがあったのでもったいないということでラズパイで
PMMP鯖を建てようということになりました。

##使ったもの
Raspberry Pi 3 model B
サムスン Evo Plus 64GB SDカード
安いキーボード
Windows 10 PC (作業PC)

##手順
まずラズパイで64GBのSDカードを使用するためにはSDカードをFAT32でフォーマットする必要があります。
フォーマットにはBuffaloのDisk Formatterを使用します。

　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/601d0b98-d854-ea82-4881-26a6b43b526f.png)

　　[こちら](https://www.buffalo.jp/support/download/detail/?dl_contents_id=60879) からダウンロード

フォーマットは上部でSDカードを選択しフォーマット(F) ボタンを押すと行われます。
  

つづいてフォーマットしたSDカードにUbuntuイメージを書き込みます。
ラズパイ用のUbuntuイメージは  [ここ](https://ubuntu.com/download/raspberry-pi)  からダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/04a15f95-12f6-2925-0067-aa1dae988a1b.png)

私はUbuntu Server を利用しました。
PMMPは64bitで動作するので 64bit版をダウンロードします。

イメージの書き込みにはEtcherを利用します。
[ここ](https://www.balena.io/etcher/)　からインストール

　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/42d47eac-cd46-e310-c99a-94af17d08fe3.png)
インストール後起動し Flash from file に先ほどダウンロードしたUbuntuイメージを.xzのまま選択します。
select targetでSDカードを選択し，Flash! を押すと書き込みが始まります。

書き込みが終了した後、いったんSDカードを取り出しもう一度挿入します。すると Bootなんたらという名前で読み込まれます。
私の場合ネットワークを有線ではなくWifiでつなぐ必要があるためネットワークの設定をします。

SDカード内のnetwork-configファイルを編集します。
wifisの部分のコメントアウトを外し以下のようにします。

```yaml:network-config 
wifis:
    wlan0:
        dhcp4: true
            access-points:
                    SSID書くとこ:
                        password: "wifiのパスワード"
```

編集後にSDカードを取り出し, ラズパイにセットします。

HDMI, キーボードをつないで起動します。
初回ユーザ名とパスワードは両方
ubuntu となっているので入力します。パスワードは新しいパスワードに変更します。

wifi設定がまだ完了していないので続きます。有線だといらないかも

```shell
sudo netplan --debug generate
sudo netplan --debug apply
```
を入力すると設定ファイルが生成され適用されます

```shell
ip a s
```
でwlan0にipが振られているか確認

ネットワークの設定が終わったのでaptのアプデを行います。

```shell
sudo apt update
sudo apt upgrade
```

キーボードがen配列となっているので日本語配列にします

```txt:/etc/default/keyboard
XKBMODEL="jp106"
XKBLAYOUT="jp"
```
に変更

いよいよPMMPをインストールしていきます。

```shell
sudo apt install -y make automake g++ libtool bison cmake pkg-config re2c libtool-bin
```

新規にユーザを作成します。

```shell
sudo adduser pmmp_user
```

作成したユーザに切り替え，PMMPをインストールするディレクトリを作成

```shell
mkdir pmmp
```

インストールを行う

```shell
curl -sL https://get.pmmp.io | bash -s -
```

これでインストールとコンパイルを自動でやってくれます

サーバ起動

```shell
chmod +x ./start.sh

./start.sh
```

まだファイアウォールの設定が残っています。
ubuntuユーザに切り替え

```shell
sudo ufw enable
sudo ufw allow 19132/udp
```

好きなポートを開いて設定完了です。
お疲れ様でした。w

##感想
意外にスンナリできました。
ただチャンク生成が遅いので本格的な鯖は難しいかも

##参考記事
[Raspberry Pi向けに64GB以上のmicroSDをFAT32にフォーマットする@windows7](https://qiita.com/Higemal/items/2034ef9f772416b4dbb7)
[ラズパイに Ubuntu 20.04-LTS(64bit) をインストールする](https://qiita.com/naomori/items/e45d5dc77ecda860f41a)
Railsで開発中にデータベースのレコードを削除したい時は？

## 目的
開発中に作成したデータベース内のレコードをすべて削除したい。
例）ユーザーテーブルの「test_user」など適当に作ったユーザーデータ

## 方法
ターミナルで「rails db:reset」コマンドを実行。
これでデータベースの中身が空っぽになる。

```ruby
terashimatakaya@MacBook-Air furima-34501 % rails db:reset
Dropped database 'furima_34501_development'
Dropped database 'furima_34501_test'
Created database 'furima_34501_development'
Created database 'furima_34501_test'

```

[Railsガイドv6.1 「4.3データベースをリセットする」]("https://railsguides.jp/active_record_migrations.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B")によるとこのコマンドで行ったことは、「rails db:drop db:setup」と同等とのこと。
注意点としては「rails db:migrate」の意味は含まれていない点。

## 解説
##### 「rails db:drop」コマンド
データベースを削除するコマンド。usersテーブルやらが全て削除される。
「rails db:create」する前の状態に戻ると思えばOK。

##### 「rails db:setup」コマンド
データベースの作成、スキーマの読み込み、シードデータを用いてデータベースの初期化を実行。
実際にRailsがやってる処理の流れは、
①既存のdb/schema.rbを読み込む
②①の情報を頼りにデータベースを再作成
③再作成のタイミングでdb/seeds.rbに開発用のサンプルデータがあればそれもこのタイミングで再度流し込む

## 補足
##### なぜ「db/schema.rb」を参照するのか？
簡単に説明すると、古いマイグレーションファイルたちもイチから順に実行するとエラーが起きやすくなるから。
それよりも**常に最新の状態に保たれているだろうschema.rbの情報をもとにしたほうがエラーが起こらず再度データベースを作成できるから**、といったかんじだろうか。
詳細は以下のリンクで確認してください。

[Railsガイドv6.1 「6.1 スキーマファイルの意味について」]("https://railsguides.jp/active_record_migrations.html#%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6")
windos10からJSON形式のデータをPOSTしてスプレッドシートに反映する方法(複数行データ)

#JSON形式のデータでPOSTしてスプレッドシートに反映する
windows上で作成したエクセルデータの一部googleスプレッドシートにコピペして反映していました。
ちょっと面倒なので、jsonファイルを作成して、curlコマンドでサクッと更新するのが目的
(サーバーから、定期的に情報を自動的に反映することができるので、汎用性が高い)


##JSON形式のデータを用意
複数行で、複数項目を入力できるjson形式を策定
必要データから、下記のJSONに変換するプログラムは別途用意が必要　

postするために用意したjson

```
{ "rows": [{"name":"JON","number":"1123","age":"20"}, {"name":"JIN","number":"2223","age":"23"}] }
```


##JSON形式のデータでPOSTで受信する(GAS)
gasのほうで、Post受信できるように作成
spreedsheetを用意しておきます。

*デプロイ作業が必要となります。

```
function doPost(e) {
  var params = JSON.parse(e.postData.getDataAsString());  // jsonを分解
  var value = params.rows;  //配列
  SHEET_ID=""
  SHEET_NAME=""
  var spreadsheet = SpreadsheetApp.openById(SHEET_ID);
  var sheet = spreadsheet.getSheetByName(SHEET_NAME);
  co=value.length;　　　　//データの行の数をチェック
  for (k=0; k <=co-1;k++){
    number=value[k].number;
    name=value[k].name;
    age=value[k].age;
    sheet.getRange(k+1,1).setValue(number);
    sheet.getRange(k+1,2).setValue(name);
    sheet.getRange(k+1,3).setValue(age);
  }
//返答
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ message: "success!" }));
  return output;
```


##windows10でcurlコマンドでjSONファイルをpost
windows10ではcurlコマンドが利用できます。jsonファイルを用意しないとエスケープシーケンス等面倒です。

jsonファイルを用意しておくと下記で利用可能

```
curl -d @test.json -H "Content-Type: application/json" <デプロイしたgasのURL>
```

コマンドラインでも直書きできますがお勧めしないです。＊イメージ図

```
curl -d　{ /"rows/": ・・・・・・ } -H "Content-Type: application/json" <デプロイしたgasのURL>
```


##実際に使うとき(batファイル実行の注意点)
batファイルで、json作成　とcurlコマンドを一環で実行します。
batファイルを作成するとき「"」についてエスケープしないとエラーになります。＊備忘録

```
@echo off
☆json作る処理
curl -d @test.json -H \"Content-Type: application/json\" <デプロイしたgasのURL>
```
Twitter APIで取得できるツイートのIDの丸め誤差問題を解決する

現在React Native + Expo + Twitter APIで個人開発をしているのですが、Twitter APIに苦戦したので書きます。
コードは基本的にReact/React Native上で動くものになります。

#idが大きすぎる
Twitter APIでは一度で取得できるツイート数に制限があります。

```tsx
import Client from '../hoge';

const getTweets = () => {
  Client.get('favorites/list.json',{
    count: 200, // 最大200まで
    tweet_mode: 'extended',
  })
};
```

なので、自動スクロールなどで追加取得する際にパラメーターにmax_idかsince_idを追加する必要があります。


```tsx
import Client from '../hoge';

const getTweets = () => {
  Client.get('favorites/list.json', {
    count: 200,
    max_id, //　追加
    tweet_mode: 'extended',
  })
};
```

この時、最後に取得したツイートのidをそのまま渡すと、渡されたID以下のツイートが取得されることになるので、最後のツイートが重複してしまいます。なので、idに-1をしてから渡さないといけません(古い順で取得してる時は+1)。

ここで問題が発生します。これは実際の自分のツイートのレスポンスです。

```ts
{
  created_at: "Sat Feb 20 13:38:04 +0000 2021",
  id: 1363120740321558500,
  id_str: "1363120740321558529",
  full_text: "明日中にアプリの申請絶対だすぞ",
  ...
}
```
number型のidとstring型のid_strが返ってくるのですが、number型の方は値が大きすぎて丸まっています。さすがTwitterです。

実際に計算をしてみても、結果は以下のようになります。

```js
console.log(tweet.id, tweet.id - 1);
// 1363120740321558500 1363120740321558500
```

正確な値であるid_strの方を使うことになるのですが、文字列なので数値に変換しないといけません。しかしparseIntなどで変換しても上記の計算と同じ結果になってしまうので、Big Intとして計算しないといけません。



#解決策
簡易的なコードの例ですが、自分の解決策を載せます。bignumber.jsというライブラリを使用しました。


```js
yarn add bignumber.js
```

```tsx

import React, { useState } from "react";
import { BigNumber } from "bignumber.js";
import Client from '../hoge';

export const App = () => {
  const [tweets,setTweets] = useState([]); // 既に取得しているツイートが入ります
  
  ...
  
  const getMoreTweets = () => {
    const max_id = new BigNumber(tweets.slice(-1)[0].id_str).minus(1).c?.join(''); // 最後に取得したツイートのidを-1
    Client.get('favorites/list.json', {
      count:200,
      max_id,
      tweet_mode: 'extended'
    }).then((res:any) => setTweets([...tweets,...res]));
  }

  ...
  
}
```
[ERROR rubocop] Assignment Branch Condition size for search is too high.

`bundle exec rubocop` したら以下のようなエラーが発生しました。
簡単に和訳すると、コードが長すぎるから短く書き直して！、のようなエラーです。

私の場合、`def update ... end` までのコードが長すぎるらしい...

```
Metrics/AbcSize: Assignment Branch Condition size for update is too high. [<6, 23, 2> 23.85/17]
  def update ...
```

`[<6, 23, 2> 23.85/17]` が点数を表しています。MAXスコアは `17` なのに `23.85` で長いので、コードを短く書き直せるなら書き直します。
無理な場合は `.rubocop.yml` に以下を追記します。

```:rubocop.yml
Metrics/AbcSize:
  Max: 25 
```
このMaxの部分を 今回は `23.85` で警告が出たので `25` にしました。
Pythonで数式を書く_02（tanh）

# 数式
以下がtanh関数(hyperbolic tangent function)です。
※tanhはハイパボリックタンジェントやタンエイチと読みます。日本語では双曲線正接関数と呼びます。

```math
y\ = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
```

# Pythonで記述

```python
import numpy as np

# tanh関数
y = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
```
上の記述方法の他に次のような方法もあります。

```python
import numpy as np

# tanh関数
y = np.tanh(x)
```

一番最初の記載方法だと長いので、
以降は np.tanh(x) の方で記載していきます。

```python
import numpy as np

x = -1
y = np.tanh(x)
print(y)
```

```php:x=-1の出力結果
-0.7615941559557649
```
コードを省略しますが、x = 0 と x = 1 のときは以下のように出力されます。

```php:x=0の出力結果
0.0
```
```php:x=1の出力結果
0.7615941559557649
```

# tanh関数を視覚化
先ほどの入力と出力を表にまとめると次のようになります。

|  | x = -1|x = 0|x = 1|
|:---:|:---:|:---:|:---:|
|**出力結果 y**|-0.76|0.0|0.76|

表だけだとわかりにくいですが、
グラフにするとtanhの出力は -1 ~ 1 の間になることがわかります。
![tanh.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654501/19df102b-b102-0d0c-c3c5-a74949ed8cd4.jpeg)

ちなみに、上のグラフは以下のコードで描くことができます。

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-5, 5, 0.1)
y = np.tanh(x)

plt.plot(x, y)
plt.title("tanh")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
```
シグモイド関数と同様にtanhもニューラルネットワークの活性化関数として利用されますので、
その方面に興味のある方はこちらも覚えておいてもよいかもしれません。
[メモ] バイナリーサーチ

#バイナリーサーチ
バイナリーサーチ(二分探索)はソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズムです。



```ruby.rb
def binary_search(array, center, num)
  left = 0
  right = 9
  centers = array[center]  #添字が中央の値10
  lefts    = array[left]   #添字0
  rights   = array[right]  #添字9
  
  while left <= right
    if num == centers
      puts "#{num}は配列の#{center + 1}番目に存在する"
      return
    elsif num < centers
      right = center - 1 #添字4
      center = (left + right) / 2 #添字(0 + 4) / 2
    elsif num > centers
      left = center + 1 #添字6
      center = (left + right) / 2 #添字(6 + 9) / 2
    else
      puts "値は配列内に存在しません"
    end
  end
  puts "#{num}は配列の#{center}番目に存在する"
end

  array=[1,3,5,6,9,10,13,20,26,31]
  number_of_elements = array.length
  center = number_of_elements / 2
  puts "検索したい数字を入力してください"
  num = gets.to_i
  binary_search(array, center, num)
```
DockerプロジェクトをAWSのECRにプッシュしようとしたらエラーが起きたときに話

DockerのプロジェクトをAWSのECRにプッシュするときに以下のようなエラーが起きました。

```
An error occurred (InvalidSignatureException) when calling the GetAuthorizationToken operation:
The request signature we calculated does not match the signatAn error occurred (InvalidSignatureException) when calling the GetAuthorizationToken operation: 
The request signature we calculated does not match the signature you provided. Check your AWS Sontails.
Token operation: The request signature we calculated does not match the signatAn error occurred (InvalidSignatureException) when calling the GetAuthorizationToken operation:
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
```

エラー内容の通り認証が通ってないのかなと思い、IAMユーザーでアクセスキー、シークレットキーを再発行します。

コンソール画面の右上のユーザーの名前をクリックし「マイセキュリティ資格情報」をクリック。

「アクセスキー」の中の「新しいアクセスキーの作成」をクリックしたらエラーが吐かれました。

どうやらデフォルトではアクセスキーを作成する権限が無いらしい。

※ルートユーザーの方はアクセスキーの発行が可能です。

なので、アクセス権限を追加してあげましょう！

1. サービスの欄に「IAM」と入力
2. 権限を追加したいユーザーを選択
3. 「アクセス権限の追加」をクリック
4. 「既存のポリシーを直接アタッチ」を選択
5. 「IAMFullAccess」と入力し、追加する

これでIAMユーザーにアクセスキーを作成する権限が付与されました。

なので、「マイセキュリティ資格情報」からアクセスキーを作成してください。

すると、アクセスキーとシークレットキーが表示されます。

<font color="red">※注意 シークレットキーはこの時にしか見れないので、画面は閉じないで下さい。もし、閉じてしまった場合はもう一度キーを作成してください。</font>

そしたら以下のコマンドを入力してください。

```
aws configure
```

そして、今発行したアクセスキーとシークレットキを入力してください。

AWSにDockerプロジェクトをプッシュするのめちゃムズイ。。。

以上、「DockerプロジェクトをAWSのECRにプッシュしようとしたらエラーが起きたときに話」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
Pythonで学ぶ制御工学　第4弾：状態空間モデル

# #Pythonで学ぶ制御工学< 状態空間モデル >

##はじめに
基本的な制御工学をPythonで実装し，復習も兼ねて制御工学への理解をより深めることが目的である．
その第4弾として状態空間モデルを扱う．

##状態空間モデル
**行列表現とすることで，多元高階の微分方程式を1階の微分方程式で表現するもの**
伝達関数との違いや，状態空間モデルの一般式を次の図で示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/c8e8cf63-513d-31f8-c8cb-598e78dfc74d.png)

次に1入力1出力である場合の状態空間モデルを示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/a4936c67-668f-9b43-6148-03f7dcae1078.png)

##状態空間モデルの計算
以下では，前々回から扱っている制御モデルについて状態空間モデルをそれぞれ求める過程を示す．なお，ここで扱う制御モデルは1入力1出力である．

###状態空間モデル①：台車
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/ef617675-fdbc-130c-e1af-097d7c2757fb.png)

###状態空間モデル②：アーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/e8159757-a104-2881-b2af-91a00af1b23f.png)

###状態空間モデル③：RLC回路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/12c1187e-976b-2900-7ff2-44d549b7b3e1.png)

###状態空間モデル④：増幅回路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/f2c003ef-4968-b98b-47d8-fc535777841d.png)

##実装
ここでは，Python上で状態空間モデルを表現する方法を学ぶために実装する．そのため，適当な値を用いて実装している．以下にソースコードとそのときの出力を示す．

#####ソースコード
```python:state_space_model.py
"""
2021/02/20
@Yuya Shimizu

状態空間モデル
"""
from control import ss, ssdata

##ss関数では，MATLAB表記が可能

#状態空間モデル構築
A = '0 1; -1 -1'
B = '0 ; 1'
C = '1 0'
D = '0'

state_model  = ss(A, B, C, D)
print(f"<状態空間モデル>\n{state_model}\n")

#状態空間モデルからA~D行列の抽出
print("<定数行列A~D>")
print('A=', state_model.A)
print('B=', state_model.B)
print('C=', state_model.C)
print('D=', state_model.D)

#もしくは，以下の方法でまとめて抽出できる
sysA, sysB, sysC, sysD = ssdata(state_model)

```

#####出力
```
<状態空間モデル>
A = [[ 0.  1.]
 [-1. -1.]]

B = [[0.]
 [1.]]

C = [[1. 0.]]

D = [[0.]]


<定数行列A~D>
A= [[ 0.  1.]
 [-1. -1.]]
B= [[0.]
 [1.]]
C= [[1. 0.]]
D= [[0.]]
```

##感想
状態空間モデルの構成を復習することができた．ここでは，状態空間モデルをPython上で表現する方法についても学ぶことができた．これにより，状態空間モデルを扱うことが可能となった．ただ，状態空間モデルの定数行列はあらかじめ計算しておく必要がありそうだ．ここは，伝達関数のときと同じである．だから，また同じように物理量などを引数にするなどしてある制御モデル特有の状態空間モデル生成関数も作成できそうである．

##参考文献
Pyhtonによる制御工学入門　　南 祐樹　著　　オーム社
ネットワークスペシャリストお勉強ノート【アプリケーション層の基礎技術編】

★HTTP
★DHCP
Dynamic Host Configuration Protocol
IPアドレスなどのネットワーク接続に必要な情報、IPアドレスの有効時間を示すリース機関およびサブネットマスクなどのオプション情報をDHCPサーバから自動的に取得しPCに設定するためのプロトコル
オプション情報：デフォルトゲートウェイ、DNSサーバ、ドメインサフィックス
DHCPディスカバ
DHCPオファー
DHCPリクエスト
DHCPアック
DHCPリレーエージェント：DHCP要求を中継する仕組み
DHCPスヌーピング：覗き見（監視）

★DNS
Domain Name System
ドメイン名を管理する
FQDN：完全修飾ドメイン名
ホスト名＋ドメイン名＝FQDN
SOAレコード：Start Of Authority 自身が管理するDNSの領域（ゾーン）に関する情報を記載
Aレコード：名前に対応するIPアドレスを指定するレコード
MXレコード：Mail eXchanger 電子メールの送り先となるサーバのIPアドレスを指定するレコード
NSレコード：Name Serverレコード　そのゾーン自身やカイドメインに関するDNSサーあのホスト名を指定するレコード
リゾルバ：ネームサーバに問い合わせを行うクライアント
再帰問い合わせ
反復問い合わせ
セカンダリDNSサーバとゾーン転送
DNSキャッシュサーバ
ダイナミックDNS（DDNS）

★SMTP
Simple Mail Transfer Protocol
認証をしない
送信プロトコル

★POP Before SMTP
認証する（POP）

★SMTP Auth
ユーザ名とパスワード認証

★POP3
Post Office Protocol version3
受信プロトコル
パスワードが平文
バックアップが手動
複数PCから同じメールを読むことができない

★APOP
Authentication Post Office Protocol
平文は解決
あんまり普及してない

★IMAP4
Internet Message Access Protocol ver4
いろんなPCから見れる

★POP３S
SSLで暗号化

★SPF
Sender Policy Framework
送信元の認証
送信メールサーバの正当性（当該ドメインの真正のメールサーバであること）を、受信メールサーバ側で確認する方式

★OP25B
Outbound Port 25 Blocking
管理外ネットワークのメールサーバへのSMTP（メール送信）を禁止する

★FTP
File Transfer Protocol
SSH暗号化したのはSFTP
SSL暗号化したのはFTPS

★TFTP
Trivial FTP
簡易型ファイル転送用プロトコル
ユーザ認証しない
UDPを利用する

★プロキシ
HTTP通信の代理
セキュリティ強化
キャッシュによる帯域効率化と高速化

★リバースプロキシ

★VoIP
Voice over Internet Protocol
配線や設備の共通化
通信コストの削減
アプリケーション連携

★RTP
Real time Transport Protocol
UDPでリアルタイムを実現するプロトコル

★SIP
Session Initiation Protocol
電話をかける切るの呼制御をする
framer-motionを使って遷移時にアニメーションを追加する

#お題

###framer-motionライブラリの使い方

・framerが提供しているコンポーネントにアニメーションを付与することができる。

・<motion.div>タグでJSXを包むことでページ遷移にもアニメーションをつけることができる。

#導入方法

①npm install framer-motionでインストールする

②AppRouterページでswitchタグを<AnimatePresence>タグと<motion.div>タグで囲む

包んだswitchにはlocationとkeyを設定する。locationはどこのページにいるかframer-motionに教える役割を持っており、これが設定されていないとアニメーションが機能しない。keyにはlocation.pathnameを設定。これはパス名。ここではloginやtitleが該当する。

HashRouterを使っている場合はRoute render={({ location }) => ()}で取得することができる。

```javascript:AppRouter.js
import { AnimatePresence, motion } from "framer-motion"
  <Router>
    <Route render={({ location }) => (
        <AnimatePresence exitBeforeEnter initial={false}>
            <motion.div>
            <Switch location={location} key={location.pathname}>
                <Route exact path="/" render={() => <Redirect to="/top" />} />
                <Route exact path="/login" component={LoginPage} />
                <Route exact path="/title" component={TitlePage} />
            </Switch>
            </motion.div>
        </AnimatePresence>
        )}
    />
  </Router>
```


これで下準備は完了。後はアニメーションを設定したいページにmotion.divを入れこみます。

ログインページもといサンプルページで実装するとこんな感じになります。


```javascript:Login.js

import { motion } from "framer-motion";
import { animationService } from '../../services/AnimationService';

class LoginPage extends Component {
  
  constructor(props) {
    super(props);
    const errors = {
      mail: "",
      password: "",
    };
    this.state = {
      animation: animationService.getAnimationMotions()
    }
  }
  render() {
    return (
      <Page>
        <LoginHeader title="ログイン" />
        <div id="login-page">
          <motion.div 
            animate={{x: 0}}
            initial={{x: 100}}
            exit={{x: -100}}
            transition={{duration: 0.2}}>
            <Button modifier="large" onClick={this.submit} disabled={this.state.isBtnDisabled}>ログイン</Button>
          </motion.div>
        </div>
      </Page>
    );
  }
}

export default withRouter(LoginPage);

```

motion.divのプロパティにそれぞれ**animate**,**initial**,**exit**,**transition**と設定しています。遷移アニメーションで重要なのは始発点(initial)と終着点(exit)であり、これをinitialとexitでそれぞれx地点のどこからアニメーションが始まるかまたは終了するかを設定する必要があります。

transitionにはアニメーションが動作する時間を設定します。

以上で基本的な実装は完了。

他にもコンポーネントそのものにアニメーションを加えたりページによって遷移アニメーションを分けることもできるので組み合わせ次第でよりリッチに見えるアプリを作ることができます。

initialとかexitの値をアプリで固定して使いたい場合は別ファイルでまとめて管理すると楽になります。

#まとめ

react.jsでアニメーションを描画するのってめんどくさそうと思っていましたがこのライブラリはAppRouterを多少いじることに目を瞑ればめちゃめちゃ便利ですね。
scikit-learnを使ってみる(2)

前の記事「[scikit-learnを使ってみる](scikit-learnを使ってみる)」で三角関数の学習がうまくできなかった。トレーニングデータではそこそこ学習できても、テストデータの結果はボロボロだった。
今回は方法を変更して、sin関数で作成した連続した3つの値から次の値を学習させていく。下図で説明すると、緑の点3つから赤の点を学習させることになる。これを順次行う。
![sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106967/773046c9-3051-0105-1cb5-8f1f0c66c2c8.png)


# 三角関数(2)

```python
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

look_back = 3


def make_data(y, look_back):
    X = []
    Y = []
    for i in np.arange(len(y) - look_back):
        X.append(y[i:i+look_back])
        Y.append(y[i+look_back])
    return X, Y


# 三角関数 Y = sin(X)を求める。
x = np.linspace(0, 20, num=200)
y = np.sin(x)
X, Y = make_data(y, look_back=look_back)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, shuffle=False)

lr = LinearRegression()
lr.fit(X_train, Y_train)

print(f'回帰係数={lr.coef_}')
print(f'切片={lr.intercept_}')
print(f'決定係数={lr.score(X_train, Y_train)}')

plt.scatter(x, y, label='data')
plt.plot(x[look_back:look_back+len(X_train)],
         lr.predict(X_train), color='green', label='train')
plt.plot(x[look_back+len(X_train):],
         lr.predict(X_test), color='red', label='test')
plt.legend()
plt.savefig('linear_regression6.png')
plt.show()
```
さて結果は...

![linear_regression6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106967/3be1cd73-a86c-b655-6cbc-24bfec47c91a.png)

うまく学習できたようだ。
[CSS+Javascript] 指定した段数でピラミッド状の要素リストを自動生成する

## はじめに
先日、あるWEBアプリケーションのデモ開発を行った後、UIの一部、表題内容の処理部分をパーツとして分解し、[JSFiddle](https://jsfiddle.net/STSHISHO/2dsju74h/)と[CodePen](https://codepen.io/STSHISHO/pen/JjbyLEZ)で公開しました。本記事はその詳細という位置づけですが、ほぼ小ネタ扱いです。

## ロジック
以下が実行結果となります。処理部分のロジックは比較的単純です。

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

### 1-ピラミッドの段数を引数として指定
`steps = steps > 10? 10: steps`段数の上限を１０に設定しています。サンプルのため負数や浮動小数点への対応はしていません。

### 2-規定のDIV要素内にUL要素を追加
サンプルのためUL要素を挿入するDIV要素`#stPyramid`を固定しています。HTML内にも空のDIV要素`<div id="stPyramid"></div>`を記述しておきます。このDIV要素がピラミッドのコンテナになります。

```Javascript: Sample01.js
const ul = document.createElement('ul')
document.querySelector('#stPyramid').appendChild(ul) //挿入位置
ul.style.width = `${steps*30+20}px` //ulのサイズを設定
```

### 3-指定段数分LI要素を追加、SPAN要素を現在の段数分追加

```Javascript: Sample02.js
for (let i = 1, rl = steps; i <= rl; i++) {
  let li = document.createElement('li')
  ul.appendChild(li)
  li.style.width = `${steps*30+20}px` //li要素の幅を動的に設定

  //セル設定
  for (let j = 1; j <= i; j++) {
    let span = document.createElement('span')
    li.appendChild(span)
  }
}
```

あとはCSSにてDIV内の要素とLI内の要素を中心揃えにするだけです。

## 使用する場面やカスタマイズについて
サンプルのためUL要素を追加するDIV要素を固定していますが、任意のidを指定できるようにすれば複数のリスト自動生成に対応できます。

また、並べる要素を正方形にしていますが、CSVを読み込んでリストを自動生成する場面を想定し、データに応じたサイズやデザインに対応できるようにしても面白いと思います。

## 最後に
元になったWEBアプリケーションの詳細について、いずれまとめる予定でいます。
サーバーレスで動的サイト作成（Firebase Hosting + Cloud Functions + Node.js + Express + EJS）

**2021/3/4 追記**
Firebase Hosting + Cloud Functions + Node.js + Express を構成する手順が、公式ドキュメントに記載されていました。
https://firebase.google.com/docs/hosting/functions


# 本記事でやること

#### 下記の構成でサーバレスで動的サイトを作成する。

* Firebase
 - Firebase Hosting
 - Firebase Cloud Functions
* Node.js
 - Express（フレームワーク）
 - EJS（テンプレートエンジン）
 - Express Generator（雛形の作成）

プロジェクトディレクトリの新規作成から、Firebase へデプロイして動作確認をするところまでを掲載します。
各種ツールはインストールしておいてください。 

# 環境
* Windows 10
* Ubuntu(WSL) 18.04.5 LTS
* npm v6.14.11
* firebase v9.3.0

# 事前準備
1. Firebase コンソールから新規プロジェクト作成する
2. 料金プランを Blaze (従量制)に変更しておく
 **※ 使用量に応じて料金が発生するのでご注意ください**

# 手順

#### 新規プロジェクトフォルダを作成
```
mkdir testapp
cd testapp
```

#### Firebase Hosting を初期化
```
firebase init hosting

# 対話式の質問には下記のように回答してください。
? What do you want to use as your public directory? public
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? Set up automatic builds and deploys with GitHub? No
```

#### public フォルダは必要ないので削除
```
rm -r public
```

### express-generator で ソースフォルダを作成
```
# テンプレートエンジンは EJS を使用
express -e functions
```

#### npm を初期化
```
npm init
```

#### EJS をインストール
```
npm install -save ejs
```

#### 関連パッケージを削除・インストールしておく
```
npm uninstall debug --save
npm install firebase-functions firebase-admin static-favicon morgan cookie-parser body-parser
```

#### app.js を編集
先頭と末尾に下記を追加

```javascript:app.js
const functions = require('firebase-functions');
（中略）
module.exports.func_https = functions.https.onRequest(app);
```

#### firebase.json を編集
```json:firebase.json
{
    "hosting": {
        "public": "functions",
        "ignore": [
            "firebase.json",
            "**/.*",
            "**/node_modules/**"
        ],
        "rewrites": [
            {
                "source": "**",
                "function": "func_https" ← これに変更
            }
        ]
    },
    "functions": {              ← 以下の3行を追加
        "runtime": "nodejs12"   ← 追加
    }                           ← 追加
}
```

# ローカル環境で動作確認
#### Firebase エミュレータを実行して動作確認する
```
firebase emulators:start
```
localhost にアクセスして下記画像のようになればOK
![エミュレータ起動確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/81f928a0-8851-317f-53af-f50e96ba0411.png)


# Firebase へデプロイ
```
firebase deploy -i
```
Webコンソールで Hosting と Cloud Functions を確認すると、データがアップされています。

Hosting でURLを確認してアクセス
![Hostingで確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/815d9778-96bf-f6cb-d6ce-6dc37cdd4080.png)
無事デプロイができました！

# 参考にさせていただいた記事
[【Firebase】Cloud Functions + Express + EJSで動的コンテンツを配信する](https://qiita.com/kingpanda/items/aa9bdef2706857720058)
大変参考になりました。ありがとうございました。
【初心者でもわかる】cssだけで、徐々に透明にしていく方法

# どうも7noteです。徐々に透過して透明になっていく要素の作り方について

グラデーションを使って、画像やテキストなどの要素を徐々に透明になっていくように見せる方法。

![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/dc1f3bc9-bcbc-2207-fff5-de8b9013ea2c.jpeg)


↓↓↓↓↓↓

![mihon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/130b87da-ba3f-2c56-d000-3b18bd239513.png)
こんな感じに徐々に透明にできます。

## 徐々に透明になる要素の書き方

```index.html
<div class="transparent">
  <img src="sample.jpg">
</div>
```

```style.css
.transparent {
  position: relative;  /* 基準位置とする */
}
.transparent::before {
  content: "";         /* 疑似要素に必須 */
  width: 100%;         /* 幅いっぱい */
  height: 100%;        /* 高さいっぱい */
  display: block;      /* 高さを指定するためにブロック要素にする */
  background: linear-gradient(rgba(255,255,255,0) 0, #fff 80%); /* 徐々に透明にする */
  position: absolute;  /*  */
  top: 0;
  left: 0;
}
```

## 解説

徐々に透明にするためには、画像要素を本当に透明にするのではなく、**背景色と同じグラデーションを上にかぶせることで透明になっているように見せかけています。**

疑似要素でposition指定をしたbeforeに対して、白→透明のグラデーションをかけます。
そしてブロック要素にして画像の高さと幅とおなじになるようそれぞれ100%を指定して位置を指定すれば、徐々に透明になっている要素の完成です。

backgroundのカラー（#fff）を100%にしていないのは、100%にしてしまうと画像の縁がはっきり見えてしまうからです。

## まとめ

CSSでできることは限られているので、どうやって錯覚にかけて**それっぽく見せるかが重要**だと思っています。
もちろんぐちゃぐちゃなソースはアレかもしれないですが、**最終的に動いて思った通りに見えているのであれば、手段はなんでもいいのかな**と思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
sfdx force:org:listに出てくる組織の削除方法

個人的なメモです。

`sfdx force:auth:logout -u <alias>`で一覧から削除できます。

↑のコマンドだと削除してもよいかの確認が出るのでそれが必要ない場合には以下のコマンドでサクッと消せます。

`sfdx force:auth:logout -p -u <alias>`

`sfdx force:org:delete`はスクラッチ組織の削除なのでここでは使えません。