OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]WordPressを本番環境へアップする時の流れと、事前準備について

# はじめに
現在進行形での開発を行っているので、備忘録を兼ねております。
経験が浅い独学のエンジニアなので、間違いやアドバイスがあれば嬉しいです！

# 前提
- ローカル開発には、Local by Flywheel(https://localwp.com/)　を使用する
  - 簡単にローカルでwordPressを立ち上げられます。作業するディレクトリの位置を把握しておきましょう。バージョン管理のため、gitを使用。開発がすすんだら、都度githubにプッシュしてました。
- 自作テーマを作成し、それをレンタルサーバーにアップする
 - レンタルサーバー比較サイト
   https://webst8.com/blog/wordpress-recommend-rental-server/



# 事前準備
 - 1.phpファイル（＝テーマ）
   - 圧縮してzip化しておく。テーマアップ後にphpファイルをいじらなくてもいいようにつくりこんでおく。
     - アップ後にいじることもできるが、差分が保存できないと思われるので、少々めんどう。
     - ＊プラグインのショートコードをいれる前提のものは、ダッシュボードでいじれるようなファイル構成にしておく。
   
 - 2.ダッシュボードで操作するデータについて
- 2-1.固定ページや記事について。
      - ツール＞エクスポートで必要なファイルをxml形式でダウンロードしておく。カスタム投稿タイプなどがある場合は、投稿タイプと固定ページをばらけてDLしておく方がいい。（そんなに種類がない場合は一括でもOK）
  - 2-2.画像について。
      - テーマにいれこむ画像と、メディアにアップロードして使用する画像を、ローカル開発時にフォルダをわけておくこと。
      - ＊画像が容量を食うときがあるので、できるかぎりサイズを小さくしておく。

# 手順
- 1.レンタルサーバーを借りて、WordPressをインストール
- 2.wordPressにてテーマをアップロード
  - レンタルサーバーによって、アップロードできるファイルの容量が決まってるので事前に設定をかえておく必要があります。
  - さくらの場合の参考記事をのせておきます。
  - https://www.vektor-inc.co.jp/post/sakura-upload-max-filesize/
  * アップロードはけっこう時間がかかるので注意
  ![スクリーンショット 2021-11-11 7.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407898/73284711-2f7d-757e-2e39-5959a53e1e84.png)
- 3.各プラグインをインストール
  - 事前にリストアップしておく。
- 4.プラグインの設定をダッシュボードでいじる必要があるものは、xmlをインポートする前に設定をしておくこと。
  - 例: CustomPostType UIやsliderなど
- 5.xmlファイルをインポート。また、画像もメディアにアップロード
- 6.各ページの微調整
- 7.global/footer メニューの調整

# 補足
* 既存テーマ（無料・有料問わず）を利用する場合でも、基本的な手順は同じである。
* 変更点としては、手順2「wordPressにてテーマ（自作）をアップロード」ではなく、「テーマ（既存）をインストールする」、という作業になる。
RSpecのインストール

# はじめに
[RSpecコトハジメ ~初期設定マニュアル~](https://qiita.com/naoki_mochizuki/items/1d3026a32786642fc762)と公式ドキュメントを参考にしつつ、RSpecのインストールを実施します。

# 環境
- ruby 2.6.5p114
- Rails 6.0.0

Railsインストールはこの記事を参照してください。
[Windows10のWSLでRails環境構築](https://qiita.com/na-777/items/373414fc34417e52af42)

# RSpecインストール
参照：[rspec/rspec-rails](https://github.com/rspec/rspec-rails)
公式の手順に沿って、インストールしていきます。はじめにGemfileを編集します。

```ruby:Gemfile
group :development, :test do
  [省略]
  gem 'rspec-rails', '~> 4.0.1'
end
```
Gemfileの編集が終わったら、プロジェクトディレクトリ直下で下記のコマンドを実行します。

```shell:command

# RSpecインストール
$ bundle install

# 定型的な設定ファイルの作成
$ rails generate rspec:install
Running via Spring preloader in process 266
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

RSpec用のディレクトリと、設定ファイルが作成されました。以降はRSpecを使用するため、Minitest用の`/test`ディレクトリは削除します。

```shell:command
# testディレクトリの削除
$ rm -rf test
```

## 初期設定
作成された`.rspec`ファイルに設定を追加します。

```ruby:.rspec
--require spec_helper
--color
--format documentation
```
|オプション名|説明|
|:-------|:------------------|
| require| 呼び出すファイルの指定|
| coler  | 出力結果に色を付ける|
| format | 出力形式の設定|
参考：[Command line - RSpec Core - RSpec - Relish](https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line)

この設定によりspecファイルに `require 'spec_helper'` を記載せずに済みます。出力結果もただのドットでなく、文章形式で出力されます。
基本設定はこれで終了です。
# テスト系Gem
とりあえず、リストだけ乗っけておきます。あとでFake系サービスなども追加予定です。

|Gem名|URL|
|:-------|:------------------|
|factory bot|[thoughtbot/factory_bot_rails](https://github.com/thoughtbot/factory_bot_rails)|
|rubocop-rspec|[rubocop-hq/rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec)|
|webmock|[bblimke/webmock](https://github.com/bblimke/webmock)|

## おまけ database_cleanerについて
[Rails 5.1以降のシステムテストをRSpecで実行する（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_01_25/51101)
参照した記事に書いてありましたが、Rails 5.1以降はdatabase_cleanerは不要になりそうです。ただ、database_cleanerが自動でインストールされるのではなく、System Specにロールバック機構が実装されるようです。そもそも

```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.use_transactional_fixtures = true
end
```
参考：[Transactions - RSpec Rails - RSpec - Relish](https://relishapp.com/rspec/rspec-rails/docs/transactions)
上記の設定があれば、RSpecで実行されたデータベース操作はトランザクション上で処理され、ロールバックにより削除されます。なぜdatabase_cleanerを導入していたかというと

[[翻訳+α] Rails/RSpec/Capybara/Seleniumでdatabase_cleaner gemを使う](https://techracho.bpsinc.jp/hachi8833/2014_05_28/17557)
上記の設定はあくまで、RSpecのプロセスで有効に動作するもので、Capybara/Selenum等を使用したユーザ操作のエミュレート(Feature Spec)だと有効に働かなかったからです。それなので、テスト時に細かくDBのクリーンアップを設定したい！System Specでなく、Feaature Specをまだ使用している、という以外ではdatabase_cleanerは不要となります。
【Windows10】初期セットアップ時にローカルアカウントを入力する方法

# はじめに
Windows10の初期セットアップの際に、通常通り進めると強制的にMicrosoftアカウントが求められると思います。
今回は、Microsoftアカウントではなく、ローカルアカウントにてセットアップする方法をアウトプットします。

# 今回の環境

|  項目  |  内容  |
| ---- | ---- |
|  Hypervisor  |  VirtualBox6.1  |
|  OS  |  Windows10 2004  |


![スクリーンショット 2020-09-29 22.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/81f4dec9-afd4-19f5-1487-006da7df2551.png)



# 内容

**Windows10インストール後の初期セットアップ時に、強制的にMicrosoftアカウントが求められる。**
ローカルアカウントにてセットアップできない。


![スクリーンショット 2020-10-01 12.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/3721e768-2d20-14b7-817a-4c9106b9f04d.png)


# 対処

**インターネットに接続しているNICからケーブルを外す。**
※インターネットに接続していない状況にする。

## VirtualBoxの場合

「ケーブル接続」からチェックを外す。

![スクリーンショット 2020-10-01 12.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/dba6fc8e-2eb6-3e5c-02fa-d085928b560e.png)


# 対処後の状態

ケーブル接続から外した後に再度セットアップを実施すると、ローカルアカウントにてセットアップができるようになっている。

![スクリーンショット 2020-10-01 12.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/9616355c-29d4-0869-c26d-517f2e70fa64.png)

# 参考
[Windows 10の初期化時にMicrosoftアカウントでの強制サインインを回避する方法 (ローカルアカウントを作成する方法)
](https://little-beans.net/exposition/win10-setup-1903/)
YouTubeの日本語以外のコメントを非表示にする拡張機能を作った(けどあまりうまく動作しなかった)話

#はじめに

過去の投稿欄を読んでもらうと分かると思うかもしれないんｄねすけど、最近(特に大学院入試前とか)Vtuberの配信をめっちゃくちゃ見ていました。中でもホロライブの配信を見るのが特に多いんですけどコメント欄の英語率のまあ高いこと。アーカイブのコメントを見ようと思ったときに英語で埋め尽くされるのもまーどうかなって感じで色々と探したんですけどそのたぐいの拡張機能が見つからなかったので頑張って作りました。

#コード部分
・manifest.json

```json
{
    "manifest_version":2,
    "name":"HideENGCommentsOnStream",
    "version":"1.0.1",
    "description":"YouTubeの生配信での日本語以外で表記されているコメントを非表示にします。",
    "content_scripts":[
        {
            "matches":["https://www.youtube.com/watch*"],
            "js":["hide_engcomeonstream.js"]
        }
    ]
}
```

・実行部分

```javascript
function DelABComment(){
    let elms__ = document.querySelectorAll("[id='message']");
    const japa = /[\u{3000}-\u{301C}\u{3041}-\u{3093}\u{309B}-\u{309E}]/mu;
    for(let i = 0; i < elms__.length; i++){
        console.log(elms__[i].innerHTML);
        //content[i] = content[i].split('<span dir="auto" class="style-scope yt-formatted-string">').join('');
        //content[i] = content[i].split('</span>').join('');
        if(!(japa.test(elms__[i].innerHTML)) && (elms__[i].innerHTML.indexOf('</path>') == -1)){
            elms__[i].parentNode.parentNode.remove();
        }
    }
}

function initialize(){
    let observer = new MutationObserver(DelABComment);
    observer.observe(document.getElementById('chat-messages'), {
       attributes: true,
       childList:  true
    });
}

window.onload = function(){
    initialize();
    DelABComment();
}
```

chat-messagesのローディングが入るたびにDelABCommentを実行する感じです。

#理想の挙動

https://www.youtube.com/watch?v=kWPQyCIKTtk に対して


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413178/f569f76a-b716-4254-42fb-935b999f683f.png)


これが


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413178/5fc7d36e-7df9-5a7e-7d01-a33e3e9ddfdb.png)

こうなる感じ。

#未解決部分

https://www.youtube.com/watch?v=AAr2lHZLNyU のような、プレミアム動画やアーカイブとして残されている動画だとこれが動作しません...リアルタイムコメントの方が干渉しているのかもしれないです。何か良い解決方法があったらご教授お願い致します。
ディープランニング2　深層学習のチューニング

[Aidemy](https://aidemy.net/)　2020/10/1
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、ディープランニングの2つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・深層学習のハイパーパラメータについて

#深層学習のハイパーパラメータ
##深層学習のハイパーパラメータの種類
・addのハイパーパラメータ
　・__ドロップアウトの割合__：Dropout(rate=)
　・__隠れ層のユニット数__：Dense()
　・__活性化関数__：Activation()
・compileのハイパーパラメータ
　・__損失関数__：loss
　・__最適化関数__：optimizer
　・__学習率__：optimizers.SGD(lr=)
・fitのハイパーパラメータ
　・__バッチサイズ__：batch_size
　・__エポック数__：epochs

##隠れ層の数と予測精度(ドロップアウト)
・隠れ層の数やユニット数は自由に決めることができるが、数が多すぎると学習が遅くなる、過学習を起こしやすくなる、といったリスクがあるので注意が必要である。
・先述の__Dropout(rate=削除するユニットの割合)__をハイパーパラメータとして指定すると、決められた割合のユニット（ニューロン）を削除しながら学習するようになる。ドロップアウトによって特定のニューロンに依存しない学習を行うので、過学習を防ぎ、モデルの精度を上げられる。

##活性化関数
・活性化関数（Activation）は__全結合層の出力（ニューロンの発火）__のために適用する関数である。活性化関数を指定しないとデータを直線で分離できなくなり、データを分類できない。
・逆に、活性化関数を指定すれば線形分離不可能なモデルでも、適切に学習できれば必ず分類できるようになる。

・活性化関数には、入力された値を「０〜1」の範囲で出力する__「シグモイド関数（sigmoid）」__や、入力値が0未満なら0を出力し、0以上なら入力値のまま出力する__「ReLU関数(relu)」__がある。

##損失関数
・出力データと教師データの差を示す関数を__損失（誤差）関数（loss）__という。
・機械学習で使われる損失関数は__「（平均）二乗誤差」__や__「クロスエントロピー誤差」__がある。詳しくは後述。
・（復習）ディープラーニングでは、この損失関数を最小化するように各層の重みを更新する（誤差逆伝播法）。

##平均二乗誤差
・それぞれの出力データと教師データの差を二乗して平均する損失関数。
・平均二乗誤差は連続値の評価に向いているため、__主に回帰モデルに適用される__。

##クロスエントロピー誤差(categorical_crossentropy)
・正解ラベルの出力が1であることを使って、正解ラベルの教師データと出力データとの誤差を０〜1で表した損失関数。（0に近づくほど誤差が小さい）
・クロスエントロピー誤差は__主に分類モデル（二値分類）に適用される__。

##最適化関数
・先述の通り、損失関数が最小となるように重みを更新して学習していくが、この時、__学習率、エポック数、過去の重みの更新量などをどのように重みの更新に反映するか__を定めるために使用するのが最適化関数（optimizer）である。optimizerに設定するのは、後述の学習率を設定した「optimizers」である。

##学習率
・学習率（lr）とは、各層の重みを__一度にどのくらい変更するか__を決めるハイパーパラメータである。
・学習率が低すぎると更新がほとんど進まず、高すぎると値がばらけて更新に無駄が出たり、場合によっては収束しなかったりするので、適切な値に設定する必要がある。

##バッチサイズ
・バッチサイズとは、__モデルに一度に入力するデータの数__である。一度に複数のデータを渡すと、各データの損失と損失関数の勾配の平均値を取って重みを更新するので、__偏ったデータの影響が減らせる__他、データごとに並列計算を行うこともできるので、__計算時間も短縮できる__。
・一方、複数のデータを渡すと大きな重みの更新が行われにくく、一部のデータのみに最適化されてしまう__局所解__を発生させる可能性がある。
・このため、イレギュラーなデータが多い時はバッチサイズを大きくして偏ったデータの影響を減らし、少ない時は局所解を避けるためにバッチサイズを小さくすることが多い。
・バッチサイズを1にする、すなわちデータを1度に1つずつ入力する学習を__オンライン学習__、バッチサイズを全データ数にする学習を__バッチ学習（batch_size）__、その中間ぐらいに設定することを__ミニバッチ学習__という。

##反復学習（エポック数）
・一般にディープラーニングでは同じトレーニングデータで何回か学習を繰り返して精度を上げる。このときの学習の回数を__エポック数（epochs）__という。学習回数が多くてもある程度以降は精度が伸びなくなるが、必要以上に学習させると過学習を引き起こしてしまうため、エポック数も適切な値に設定する必要がある。

#まとめ
・深層学習のハイパーパラメータには、addに設定するものとして、ドロップアウトの割合を示す__Dropout(rate=)__、隠れ層のユニット数を示す__Dense()__、活性化関数を示す__Activation()__・がある。
・ドロップアウトや隠れ層のユニット数は過学習の発生に関わり、活性化関数は設定しなければデータの分類そのものができなくなるので、適切な値を設定する必要がある。
・compileに設定するものとして、損失関数を示す__loss__、最適化関数を示す__optimizer__がある。
・損失関数は、分類モデルでは__「クロスエントロピー誤差（categorical_crossentropy）」__を使う。最適化関数は重みの更新の仕方に関わり、学習率を示す__optimizers.SGD(lr=)__を設定する。
・学習率とは、一度に変える重みの大きさであり、これも適切に設定しないと、学習に無駄が生じたり、進行が遅くなったりする。
・fitに設定するものとして、バッチサイズを示す__batch_size__、エポック数を示す__epochs__がある。バッチサイズはモデルに一度に入力するデータ数を表し、エポック数は学習の回数を表す。これらの値はモデルによって適切な度合いが異なる。

今回は以上です。最後まで読んでいただき、ありがとうございました。
docker-compose 再ビルドして起動 一つのコンテナだけ

```
docker-compose up -d --no-deps --build <service_name>
```

--no-deps - 紐づいている他のサービスを起動しない

--build - コンテナを起動する前にビルドをする

```yaml

version: "3.3"

services:
    app:
        container_name: "my-app"
```

`<service_name>`にはコンテナ名ではなく、docker-compose.ymlのサービス名を入れるのに注意。
上記の例だと、my-appではなく、appになります。

再ビルドして起動したいのは一つのコンテナだけなのに、つい毎回`docker-compose down && docker-compose build && docker-compose up -d`
してしまっていてもっと短い時間でできたらなぁと思い調べた内容でした。



## 参考
https://stackoverflow.com/questions/36884991/how-to-rebuild-docker-container-in-docker-compose-yml
iOSアプリでテストを書く前に知っておきたいこと

# はじめに

こんにちは、iOSエンジニアの dayossi です。

家族が幸せになれるサービスを提供したいと思って、
[HaloHalo](https://hallo-hallo.sakura.ne.jp/home/)という家族日記アプリをリリースしています。


今回は、ユニットテストについて
よくわかっていなかった前提条件を整理したいと思います。


# そもそもユニットテストとは？
アプリが起動した状態でも
コードが作用するのか、継続的にチェックするための手法です。

print()でのデバッグでは、単一の処理結果や変数の値をチェックすることはできますが
他の場面で同様の処理があった場合、
ふたたびprint()を記述する必要があります。

また、同じ処理が何度も出てくるのであれば、
統一したフォーマットで繰り返し使用可能な状態に管理するほうが
可読性が上がり、何をテストしているのかが明確になります。

ユニットテストは、統一したフォーマット下で
繰り返し行う処理の結果を、自動的に繰り返し得られるように
作ることができるツールなのだそうです。

(参考図書 : iOSテスト全書(2019) 第１章より)


# ユニットテスト導入前に知っておきたいこと

ここからが本題となります。

ユニットテストのメリットはわかったのですが、
逆に「処理を繰り返し呼び出せる設計で書けてないと、テストできない」
とも考えられそうです。

この点を私はよくわかっていなかったので、
以下、順に整理していきます。

# ユニットテストができるアプリ設計か？

例えば、特定のクラスにある処理を
毎回そのクラスをインスタンス化して、処理を呼び出している場合。

これはクラスに依存しているケースであり、
処理とクラスが分離できていない状態です。

以下のように、ViewController内に記述したsortAscendData()を
OtherViewCotrollerで使用したい場合、

このままだとViewControllerをわざわざインスタンス化して呼び出したり
同じコードをOtherViewCotrollerに記述する手間が発生します。

同じ様な手間がいくつも発生すると、記述するコード量がムダに増えたり、
アプリ全体の挙動をチェックするときに、どこでバグが起こったのか把握しづらくなります。

```
// 参照されるViewController
import UIKit

class ViewController: UIViewController {

    
    var userDataCollection:[String] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
      
        // Viewの描画
        setupView()
    }

    func setupView(){
        // Viewを描画
        self.view.addSubview(<#T##view: UIView##UIView#>)
    }
    
    func getUserData(){
        // ユーザーデータ取得処理
    }
    
    func reloadView(){
        // Viewの再描画
    }
    
    func didTacAction(){
        // タップ動作の検知
    }
    
    func sortAscendData(_ userDataCollection:Array<String>){
        // データの並べ替え処理
    }
}
```

```
// 参照したいViewController

class OtherViewController: UIViewController {
    
    // 表示用データが格納されていて、並び替えたい...
    var otherUserData: [String] = []

    let vc = ViewController()
    vc.sortAscendData(self.otherUserData)

    // MARK:- ホントに必要なのは、コレだけなのに...    
    func sortAscendData(_ userDataCollection:Array<String>){
        // データの並べ替え処理
    }
}
```

さまざまな場面で使われている共通の処理は
protocolで抽象化しておくと、

特定のクラスに依存することなく、
またprotocolで共通化した処理があることも明確になるので
よりアプリ全体の挙動をチェックしやすくなります。

そのため、ファイルごとに責務が分担できていないと
テストしたい処理を抽出することが難しくなるので、

まずは「どこで、どんな責務を担っているのか？」が明確にできる設計を
考えておくことが重要と思います。

# まとめ

設計を意識するということは、
どの役割をどのファイルで管理しているのかを明確にすることと言えそうです。

管理するファイル数は必然的に多くなると思いますが、
テストユニットによる自動検証と目視でのチェックの両方がやりやすくなるので
開発スピードを意識する場面でも有効そうだと思います。

ユニットテスト、どんどん書いていきます！

（「ここ、こう考えてもいいんじゃない？」など、温かいツッコミをいただけますと幸いです）

# 参考書籍・記事
[松尾 和昭, 細沼 祐介,田中 賢治 他.iOSテスト全書(2019)](https://peaks.cc/books/iOS_testing)
[Swiftユニットテスト入門](https://speakerdeck.com/yoshiyuki_tanaka/swiftyunitutotesutoru-men)
[コードを書きながら同時に設計していくためのiOSアプリ開発方針](https://techblog.yahoo.co.jp/entry/20191202785270/)
[今更MVCとかでiOSアプリつくってみた（Swift）・改](https://qiita.com/am10/items/1a877dc2939962a40aaf)
【メモ】ソフト準備するのが面倒なのでWin10標準機能でSSH接続

# 経緯
MacだとTerminalで即時SSHが使えますが、少し前のWindowsだとputtyとかTeratermのなどターミナルソフトのインストールが必要で面倒。

**SSHでちょっとだけ繋げたいんや！**

そう思ったら最近のWindows10だと標準でSSH機能が備わっているのが判ったのでメモ

# 環境
```powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Users\user> ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]
```

「なんだ！よくある使い方でいけるやん」って思って歓喜

# 使い方
```powershell
PS C:\Users\user> ssh [接続ユーザー名]@[接続先]
```

## 鍵使う場合
-iオプションで鍵ファイルを指定ですね。

```powershell
PS C:\Users\user> ssh -i [鍵ファイル名] [接続ユーザー名]@[接続先]
```

# まとめ
私は環境汚したくない派なので、標準機能でサクッと接続してみましたが用途に合わせて使うソフトを選べばオッケーだと思います。

[putty](https://www.putty.org/)
[Teraterm](https://ja.osdn.net/projects/ttssh2/)
[hyper](https://hyper.is/)
[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)
IOSTでほとんどRAMを使わずにデータを保存する方法


## はじめに
ブロックチェーンのユースケースの一つとして「何かの履歴」を証明として残すということがあると思います．
Ethereumとかを使うと，RAMエコシステムがないので，ストレージ利用は高価．データを消してもETHは戻らない．
でもIOSTの場合はRAMエコシステムがあるおかげで，使い終わったストレージ領域は削除するとRAMトークンが返却されてストレージの再利用ができる．
なので，IOSTの場合は使わなくなったストレージは積極的に削除すべきということだ．
ストレージデータのいいところは「書き換えられる」ということだ．でも履歴データって書き換えますか？？ないですよね．
**じゃあ履歴データはずっとRAMに残しておく必要は無いですよね．**
とりあえずスマートコントラクトのコードを見ていきましょう．

## 悪い例

ずっとRAMに履歴を記録していくスタイル

```js
class BadHistory {
  init() {}
  add(attr, action) {
    const history = JSON.parse(storage.mapGet(tx.publisher, attr)) || [];
    history.push(action);
    storage.mapPut(tx.publisher, attr, JSON.stringify(history));
  }
  destroy(attr) {
    storage.mapDel(tx.publisher, attr);
  }
}

```

これだと，履歴データが増えるにつれてRAMの使用料がかさんでいきます．（この例だとGASもかかってきますね．）

## 提案する方法

```js
class NiceHistory {
  init() {}
  add(attr, action) {
    const prev = storage.mapGet(tx.publisher, attr);
    if (tx.hash === prev)
      throw new Error('duplicated tx hash');
    blockchain.receipt(JSON.stringify({ action, prev }));
    storage.mapPut(tx.publisher, attr, tx.hash);
  }
  destroy(attr) {
    storage.mapDel(tx.publisher, attr);
  }
}

```

これだと，履歴が増えてもRAMの利用は一定値のままになる．
アイデアは，**ブロックチェーンの上にチェーン作ってしまおう**って感じ．
最新の履歴のTxHashだけRAMに記録しておいて，更新があるたびにreceiptに流す．
参照方法は，最初RAMにアクセスして最新Txを得てgetTxReceiptでデータを取得，そのreceiptにさらに一つ前のTxHashが乗っているので同様に参照...を続けていく．TxHashがnullになれば終了だ．
この方法のデメリットは，全履歴へのアクセスまでに時間がかかるという点だ．
App Store Connect でアップロードしたとき Too many symbol files のかべにぶち当たったときの対処方法

- dSYM ファイルがいっぱいあることが原因っぽい (この辺は曖昧)
    - 調べると dSYM ファイルをどうにかするっていう対処法ばっかりだったからそう思ってる

調べた感じ２つ

### １つ目

プロジェクトファイルの debug information format を `DWARF` にする

dSYMファイルを生成しないという設定らしい (多分)
でも Firebase Crashlytics で dSYM ファイルを使用してどうのこうのするっぽいから生成しないのはちょっとなと思う

### ２つ目

Podfile　に　`config.build_settings['VALID_ARCHS'] = 'arm64'` を追加する

これで余分な architecture のdSYMファイルを生成しないでよいっぽい

アーカイブしたファイル(.xcarchive)のパッケージの内容を表示して、dSYMsのフォルダ以下で dwarfdump --uuid * を実行すると下記のように、ライブラリごとに対応しているarchitecture 一覧が見れる。

下記はオプションを入れる前の状態

```
dSYMs % dwarfdump --uuid *
UUID: 081C9609-5C30-3CB0-84B7-DF3326EF8146 (arm64) Kingfisher.framework.dSYM/Contents/Resources/DWARF/Kingfisher
UUID: 24163A65-4498-37DB-BEBF-F6227DBFF77C (arm64) Realm.framework.dSYM/Contents/Resources/DWARF/Realm
UUID: 4165D0CD-F99B-36EB-BC2F-8661D5056F33 (arm64) RealmSwift.framework.dSYM/Contents/Resources/DWARF/RealmSwift
UUID: 70DDE517-8A61-3CE3-B1F4-E4B23FBBAD38 (armv7) Rswift.framework.dSYM/Contents/Resources/DWARF/Rswift
UUID: B1138461-D58C-34A9-805C-CAB35DFC9141 (arm64) Rswift.framework.dSYM/Contents/Resources/DWARF/Rswift
UUID: 8A08736F-4BF9-3F50-8A33-B1F2A4A44AAA (arm64) RxCocoa.framework.dSYM/Contents/Resources/DWARF/RxCocoa
UUID: 0EBDB9F9-30C9-3E3C-9C84-B8FFAFF152FE (arm64) RxRelay.framework.dSYM/Contents/Resources/DWARF/RxRelay
UUID: 8EC6ED8C-9989-32F8-88EF-8D4FED75868B (arm64) RxSwift.framework.dSYM/Contents/Resources/DWARF/RxSwift
UUID: 5D9C7297-AE8C-362F-AB92-72926B9243A2 (armv7) SwiftyBeaver.framework.dSYM/Contents/Resources/DWARF/SwiftyBeaver
UUID: DA55A53C-0AB8-35D6-B00B-3BF11D0A060A (arm64) SwiftyBeaver.framework.dSYM/Contents/Resources/DWARF/SwiftyBeaver
```

下記がオプションを入れた状態

```
UUID: 081C9609-5C30-3CB0-84B7-DF3326EF8146 (arm64) Kingfisher.framework.dSYM/Contents/Resources/DWARF/Kingfisher
UUID: 24163A65-4498-37DB-BEBF-F6227DBFF77C (arm64) Realm.framework.dSYM/Contents/Resources/DWARF/Realm
UUID: 4165D0CD-F99B-36EB-BC2F-8661D5056F33 (arm64) RealmSwift.framework.dSYM/Contents/Resources/DWARF/RealmSwift
UUID: B1138461-D58C-34A9-805C-CAB35DFC9141 (arm64) Rswift.framework.dSYM/Contents/Resources/DWARF/Rswift
UUID: 8A08736F-4BF9-3F50-8A33-B1F2A4A44AAA (arm64) RxCocoa.framework.dSYM/Contents/Resources/DWARF/RxCocoa
UUID: 0EBDB9F9-30C9-3E3C-9C84-B8FFAFF152FE (arm64) RxRelay.framework.dSYM/Contents/Resources/DWARF/RxRelay
UUID: 8EC6ED8C-9989-32F8-88EF-8D4FED75868B (arm64) RxSwift.framework.dSYM/Contents/Resources/DWARF/RxSwift
UUID: DA55A53C-0AB8-35D6-B00B-3BF11D0A060A (arm64) SwiftyBeaver.framework.dSYM/Contents/Resources/DWARF/SwiftyBeaver
```

amrv7（iPhone5, iPhone5c以下の端末)はメインプロジェクトで使用しないので、不要となる。

これでアップロードすればきっとだいじょうぶなはず。
The asset "application.css" is not present in the asset pipeline.の解決法

# 問題
アプリを本番環境にデプロイする過程で、

```
$ rake assets:precompile RAILS_ENV=production
```

アセットパイプラインのエラーが生じた。

# アセットパイプラインとは？
>アセットパイプラインとは、JavaScriptやCSSのアセットを最小化 (minify: スペースや改行を詰めるなど) または圧縮して連結するためのフレームワークです。
アセットパイプラインでは、CoffeeScriptやSass、ERBなど他の言語で記述されたアセットを作成する機能を追加することもできます。

[参考記事：Railsガイド「アセットパイプラインについて」](https://railsguides.jp/asset_pipeline.html)

# エラー
```
The asset "application.css" is not present in the asset pipeline.
```

# 解決法

```ruby:config/environments/production.rb
# config.assets.js_compressor = :uglifier 変更前
config.assets.js_compressor = Uglifier.new(harmony: true) #変更後
```

# 用語の確認
### uglifierとは？
> RailsのGemfileにはデフォルトでuglifierが含まれています。
このgemは、NodeJSで記述されたUglifyJSをRubyでラップしたものです。
uglifierによる圧縮は次のように行われます。
ホワイトスペースとコメントを除去し、ローカル変数名を短くし、可能であればifとelseを三項演算子に置き換えるなどの細かな最適化を行います。
以下の設定により、JavaScriptの圧縮にuglifierが使用されます。

```ruby:config/environments/production.rb
config.assets.js_compressor = :uglifier
```
参考：[Railsガイド「アセットパイプラインについて」](https://railsguides.jp/asset_pipeline.html)


デフォルトは上記の設定だが、[uglifierのGithub](https://github.com/lautis/uglifier#es6--es2015--harmony-mode) によれば、
Railsでは下記の設定に置き換えるようにと書いてある。

```ruby:config/environments/production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)
```

### ECMAScriptとは？
> ECMAScript（エクマスクリプト）は、JavaScriptの標準であり、Ecma Internationalのもとで標準化手続きなどが行われている。

参考：[ECMAScriptのwikipedia](https://ja.wikipedia.org/wiki/ECMAScript)

# 参考記事
- [RailsでES6の機能を使うとプリコンパイルが通らない（Uglifierがエラーを吐く）問題](https://qiita.com/Thort/items/18c44604aba65303c221)
- [uglifierのGithub](https://github.com/lautis/uglifier#es6--es2015--harmony-mode)
Laravelの最適なアプリケーション構造について

# 前提
* Laravel初心者
* 間違った解釈がある可能性あり

# 参考文献
* [Webアプリケーションフレームワーク導入時に考慮すべき22の観点【Qiita】](https://qiita.com/tmknom/items/08b69594e32a92bccee5)
* [【Laravel】リポジトリパターンのディレクトリ構造のメモ【Qiita】](https://qiita.com/ynwa0826/items/04e5978627b76ed11684)

### クリーンアーキテクチャについて
* [「Laravel でやってみるクリーンアーキテクチャ」岡田 正平 / おかしょい【youtube】](https://www.youtube.com/watch?v=9IuDucqAuM0)
<br>
→[参考スライド](https://www.slideshare.net/ShoheiOkada/laravel-phpconfuk-152500600)
* [Laravelで実践クリーンアーキテクチャ【Qiita】](https://qiita.com/nrslib/items/aa49d10dd2bcb3110f22)

### ドメイン駆動設計について
* [Laravelでドメイン駆動設計(DDD)を実践し、Eloquent Model依存の設計から脱却する](https://qiita.com/mejileben/items/302a9f502ca0801b1efb)
* [Laravel5を使ってドメイン駆動設計で作るサンプルアプリ。](https://qiita.com/niiyz/items/d80a9ffdfad3b431dcfd)


### その他記事
* [【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話](https://qiita.com/mejileben/items/f68a50ec9164b261b9cd)
React+Typescriptプロジェクトでnpm install axiosをするとエラーが発生した時の対処法

#エラー内容
TypeScript error in /Users/＜ユーザ名＞/Public/workspace/todoapp/src/App.tsx(1,19):
Could not find a declaration file for module 'react'. '/Users/＜ユーザ名＞/Public/workspace/todoapp/node_modules/react/index.js' implicitly has an 'any' type.
  If the 'react' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react`  TS7016

```react:App.tsx
  > 1 | import React from "react";
      |                   ^
    2 | import "./App.css";
    3 | import Api from "./components/Api";
    4 | 
```

#対処法
npmではなくyarnでインストールすれば正しく動きます。

```terminal
$yarn add axios 
```

#最後に
なぜnpmでは動かないのか調べても理解できませんでした。
原因をご存知の方は是非教えてください。
編集リクエストをいただければ、原因を追記しようと思います。
エラー：”Expected a condtional expression and instead saw an assignment”とは

# エラー内容

JavaScriptを編集した際、siderが以下のようなエラーを表示した。
![スクリーンショット 2020-10-01 12.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/749100/af11e48e-4669-e1bf-ae02-12eeccc64099.png)


英語を直訳すると

_条件式を期待していたのに代入が行われている_

とのこと。

うーん、、わからん、、
動作には問題なさそうだが？、、

# 調べたところ

このエラーは記述が"no-cond-assign"というルールに違反した場合表示されるらしい。
<details><summary>ルールの目的：

条件式を記述する際、比較演算子と代入演算子を書き間違えることは容易であり、
代入演算子が意図的なものであるかの判断がつきにくいため。<summary>

<details><summary>ルールの原則は：

_if, for, while等の条件式において不明確な代入演算子が使われるのを防ぐこと_

<summary>

# 解消方法

意図的な代入演算子であることを示すことでこのエラーは解消する。

今回は厳密な比較演算子を使用して再度コミットしてみることに
```javascript:厳密な比較演算子


    if (img === $(`img[data-index="${targetIndex}"]`)[0]) {
      img.setAttribute('src', blobUrl);

これでエラー分は表示されなくなった。

# 参考文献

https://eslint.org/docs/rules/no-cond-assign
【Rails】rails g scaffoldの使い方、機能、注意点

#scaffoldとは
一言で言えば、必要なファイルをすべて作成し、DBも含めたルーティングも済ませてくれるコマンド。



#生成方法

```
$rails g scaffold モデル名 カラム名1:データ型　カラム名2:データ型 ....
```

###生成されるファイル
モデル
マイグレーションファイル
コントローラー
ビュー
ルーティング

##生成されたファイルの中身
仮に`usersinfo`というモデル名で`nameカラムageカラム`を生成した場合。

```
$rails g scaffold usersinfo name:string age:integer
```

####モデル
特別な記述はないので省略。

####マイグレーションファイル

```*******_*******.rb
class CreateUsersinfos < ActiveRecord::Migration[5.1]
  def change
    create_table :usersinfos do |t|
      t.string :name #生成時に指定したカラム名とデーター型が記述される
      t.integer :age

      t.timestamps
    end
  end
end
```

####コントローラー
生成時点でここまで記述済み

```*******_controller.rb
class UsersinfosController < ApplicationController
  before_action :set_usersinfo, only: [:show, :edit, :update, :destroy]

  # GET /usersinfos
  # GET /usersinfos.json
  def index
    @usersinfos = Usersinfo.all
  end

  # GET /usersinfos/1
  # GET /usersinfos/1.json
  def show
  end

  # GET /usersinfos/new
  def new
    @usersinfo = Usersinfo.new
  end

  # GET /usersinfos/1/edit
  def edit
  end

  # POST /usersinfos
  # POST /usersinfos.json
  def create
    @usersinfo = Usersinfo.new(usersinfo_params)

    respond_to do |format|
      if @usersinfo.save
        format.html { redirect_to @usersinfo, notice: 'Usersinfo was successfully created.' }
        format.json { render :show, status: :created, location: @usersinfo }
      else
        format.html { render :new }
        format.json { render json: @usersinfo.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /usersinfos/1
  # PATCH/PUT /usersinfos/1.json
  def update
    respond_to do |format|
      if @usersinfo.update(usersinfo_params)
        format.html { redirect_to @usersinfo, notice: 'Usersinfo was successfully updated.' }
        format.json { render :show, status: :ok, location: @usersinfo }
      else
        format.html { render :edit }
        format.json { render json: @usersinfo.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /usersinfos/1
  # DELETE /usersinfos/1.json
  def destroy
    @usersinfo.destroy
    respond_to do |format|
      format.html { redirect_to usersinfos_url, notice: 'Usersinfo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_usersinfo
      @usersinfo = Usersinfo.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def usersinfo_params
      params.require(:usersinfo).permit(:name, :age)
    end
end

```

####ビュー
コントローラーに記述されたビューはすべて自動生成される。

####ルーティング
ルーティングは自身で記述する必要がある。

```routes.rb
resources :ビュー名 #自身で記述
```

#注意点
##params.requireへの追加
railsでは、入力内容の確認をする機能があり、scaffoldでコントローラー内のprivateに生成される。
カラムを`scaffoldの実行後`に追加した場合、このprivateのメソッド内にカラム名を追加しなければDBに保存されない。

```***.controller.rb
private
 def usersinfo_params
  params.require(:usersinfo).permit(:name, :age, :location, :description, :certification, :note) 
#permit内には、scaffold実行時に記述したカラム(:name, :age)しか記述されないため、追加したカラムを追記する必要がある。
 end
```
WARN  mode option is deprecated. Please use ssr: true for universal mode or ssr: false for spa mode and remove mode from nuxt.config

# WARN

```
WARN  mode option is deprecated. Please use ssr: true for universal mode or ssr: false for spa mode and remove mode from nuxt.config
```

v2.14.5にアップグレードすると上記の警告が出るようになりました。

https://github.com/nuxt/nuxt.js/releases/tag/v2.14.5

## 対応

警告文に書いてあることをやるだけですが以下のような修正で対応できます。

```diff:nuxt.config.js
-  mode: 'spa',
+  ssr: false,
```
PHP: 初心者にクラスの使い方から説明しよう！

`クラス`は初心者にとって`オブジェクト指向の門番的存在`じゃないでしょうか？
`わかっている人`からすれば、`空気のような存在`になっているためにどうにも説明ができなかったりします。
`クラスはクラスだよな`的な笑
そこで思ったことは、隠蔽化等の概念を先に勉強するよりも、とりあえず使い方をマスターすることが近道ではないか？でした。
`PDOでDB接続`のところでクラスの理解度が少しでも上がると後が楽かなと思い、`PDOクラスの呼び出し`から`配列に持っていくまで`を説明に使っていこうと思います。

```php:PDOクラスでDBからデータ読み込み
//データベースへの接続を表すPDOインスタンスを生成する
$dbh = new PDO($dsn, $username, $password); // : object(PDO)

//実行したいSQLステートメント
$sql = 'SELECT * FROM users';

//SQLステートメントを実行してPDOStatementオブジェクトを返す
$stmt = $dbh->query($sql); // : object(PDOStatement)

//全ての結果行を含む配列を返す
$users = $stmt->fetchAll(PDO::FETCH_ASSOC); // : array
```
参考：
[PDO::__construct](https://www.php.net/manual/ja/pdo.construct.php)
[PDO::query](https://www.php.net/manual/ja/pdo.query.php)
[PDOStatement クラス](https://www.php.net/manual/ja/class.pdostatement.php#class.pdostatement)

以上の説明で分かる人はここまでで大丈夫です笑
ここからは`公式`の`クラスの基礎`を使って最小限のクラスの説明に入ります。

[クラスの基礎](https://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic)

`以下公式からのコピペ`

```php:例１_簡単なクラス定義
<?php
class SimpleClass
{
    // プロパティの宣言
    public $var = 'a default value';

    // メソッドの宣言
    public function displayVar() {
        echo $this->var;
    }
}
?>
```
クラスの中には、 `定数` や `変数 ("プロパティ" といいます)` そして`関数 ("メソッド" といいます)` を含めることができます。

この説明に`基礎`が集約されてますね。

PDOのときのように`このクラス`を呼び出して`実行`してみましょう！
`クラスを代入した変数名`->`プロパティ名` -> プロパティへのアクセス
`クラスを代入した変数名`->`メソッド名`  -> メソッドの実行

次の例は`１ファイルで完結`してます。ぜひ`My環境`で試してみてください！

```php:同一ファイルでクラスを使ってみる
<?php
class SimpleClass
{
    // プロパティの宣言
    public $var = 'a default value';

    // メソッドの宣言
    public function displayVar() {
        echo $this->var;
    }
}
//SimpleClassクラスのインスタンスを生成する
$simple_class = new SimpleClass();
var_dump($simple_class); // : object(SimpleClass)

//displayVarメソッドの実行
$simple_class->displayVar(); //-> 'a default value'

//$varプロパティへアクセスして内容を書き換える
$simple_class->var = 'Hello world';

//displayVarメソッドの実行
$simple_class->displayVar(); //-> 'Hello world'
?>
```

いかがでしょうか？このクラスは単純なだけにわかりやすいと思います。

それではもう一度PDOクラスの方を見てみましょう。
PDOクラスの`メソッド`には`引数`と`返り値`があるのが特に`重要ポイント`です。

```php:PDOクラスでDBからデータ読み込み
//PDOインスタンス生成
//newで実行されるメソッドは__construct（コンストラクタ）です。
//引数： $dsn, $username, $password : string
//返り値：$dbh は `PDOインスタンス` となります。
$dbh = new PDO($dsn, $username, $password);
var_dump($dbh); // : object(PDO)

//実行したいSQLステートメント
$sql = 'SELECT * FROM users';

//PDOクラス->queryメソッドの実行
//引数： SQLステートメント : string
//返り値: SQL実行結果を含む`PDOStatementインスタンス`
$stmt = $dbh->query($sql);
var_dump($stmt); // : object(PDOStatement)

//PDOStatementクラス->fetchAllメソッドの実行
//引数： fetch_styleオプション(定数) : int
//返り値: SQL実行結果の配列 : array
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($users); // : array
```
`メソッドの実行`は通常関数の実行と同じです。
`クラスは構造上`、`隠蔽化`がされているため`何をしているのかがブラックボックス`になっています。
`公式サイト`を参考にして`引数`・`返り値`の確認をするのが理解の近道になります。
コピペして動いたで終わらせず、少しだけ深堀りしてみると理解度が深まっていきます。
`使っているうち`に`クラスの本来の目的`も見えてきますので、`まずは組込みクラスの使い方`をマスターしてほしいです。

`LGTMお願いします！`
`モチベーションがあがります！`
neo4jでsandbox

#概要

neo4jでsandboxやってみた。


#参考にしたページ

https://qiita.com/him0net/items/280792ab148f8bac83f2


#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e9316a86-626b-a6bf-22e1-2da6c2cac192.png)

#sparqlの実行

https://embed.plnkr.co/plunk/f5hPzYxYDzRRMyXf

#データの加工

https://embed.plnkr.co/plunk/OIPu95gmr1e9Pfr2

#データの投入

```
LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/20ff770bfda7d9dafbb1fc0e259aeb9f/raw/fe0fe8ca2d69b63432b0723ff2370406c70fe876/node0.csv" AS line
CREATE (:Anime {id:line.id, name:line.name})

LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/20ff770bfda7d9dafbb1fc0e259aeb9f/raw/fe0fe8ca2d69b63432b0723ff2370406c70fe876/node1.csv" AS line
CREATE (:Actor {id:line.id, name:line.name})

LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/20ff770bfda7d9dafbb1fc0e259aeb9f/raw/fe0fe8ca2d69b63432b0723ff2370406c70fe876/relation.csv" AS line
MATCH (x:Anime {id:line.Anime_id}), (y:Actor {id:line.Actor_id})
CREATE (x)-[:ROLE]->(y)

```

#表示

```
MATCH (n)-[r]->(m)
RETURN n, r, m
LIMIT 100
```

以上。
بۇ تۇنجى يازمام ئۇيغۇرچە يىزىپ سىناپ باقتىم.

بۇ تۇنجى يازمام ئۇيغۇرچە يىزىپ سىناپ باقتىم.
خەت نۇسقىسى  ئۇلۇنۇش ئەھۋالىنى كۆرۈپ بېقىش ئۈچۈن يوللۇدۇم .
بۇندىن كېين يەنە داۋاملىق يېڭى بىلىملەرنى يوللاپ تۇرۇشنى ئويلاۋاتىمەن

2020/10/01
JavaScript Loop処理

JavaScriptでループ処理
---

こんにちは。ayabouzuです。phpのループ処理は、そんなに抵抗なく出来るんですけど、
JavaScriptだと、よく分からないなあと感じることが多かったので、記事にして、復習しようと思っています。また、初学者の方の参考になれば、嬉しいです。

reduce
---

reduce関数ですが、結構、使える関数なので、良かったら、覚えてしまいましょう。


```JavaScript
var numbers = [1,2,3,4,5,6,7,8,9];

var result = numbers.reduce(function(a, b) {

return a + b;

})
```

上をconsole.log(result)すると、

```javascript

45
```

と答えが返ってきます！！

中で起こっている事は以下になります。

```JavaScript
1+2=3 (a+b)(この３が次のaとなる)
3+3=6 (a+b)
6+4=10 (a+b)
10+5=15 
15+6=21
21+7=28
28+8=36
36+9=45
//ここで終了
```
要は、合計値を求めてくれているんですね。便利だと思いませんか？

for ループ処理
---
ちなみにfor文で記述すると以下になります。

```javascript

var total = 0;
for(let i=0; i<10;i++){
total += i;
}
console.log(total);

//45
```

reduceは応用が効く
---

```JavaScript
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = numbers.reduce(function (a, b, index, arr) {
if (index >= 3) arr.splice(2);
return a + b;
});
document.write(result);

document.write(" " + numbers);
```

上のsplice関数っていうのが、()の中以降のインデックス番号の数字を全て削除しますよという意味になります。上の例だと、配列の中の３番目の数値である４を通過した時点で、２番目以降の配列の値を全て削除してしまいます。

```javascript
numbers = [1,2,3,4];
/*合計値を求めると、10の値が返ってきます。試しに配列の中身をみてみると、1,2と返されました。
つまり、インデックスが３を超えたら、繰り返し処理から抜けると言うことになりますね。このように、break文のように使うことも可能なんです。ちなみに、今回は、インデックス番号は１から始まっています。
*/
```

オブジェクト指向型言語のメリットっていうのは、引数をいくつも設定出来る、関数を呼び出せば、何度も繰り返し使える、そこに尽きるんですかねー？私も、まだまだペーペーですが、引き続き、Jsを鍛えていこうと考えています。

私のYouTube動画、是非見てやってください！！
---
https://youtu.be/GmdT4GspZDU
Nginxの名前の由来と設定ファイルの書き方、locationの書き方

# はじめに
はじめまして、youtuber系エンジニアのやっすんです！

今回、以下の内容について説明します。

- Nginxとは
- 設定ファイルの基礎
- locationの書き方

同内容はYoutubeでも説明しているので、ぜひチェックしてみてください！

[【YouTube動画】NGINXの設定ファイルの基礎、locationの書き方](https://youtu.be/5596pIxdIMo)
[![設定ファイルの基礎、locationの書き方](https://img.youtube.com/vi/5596pIxdIMo/0.jpg)](https://www.youtube.com/watch?v=5596pIxdIMo)

# Nginxとは
Nginxはエンジンエックスと発音します。

名前の由来は、何らかのエンジンであるという意味
Ngin (engine)をエンジンと読むアイデア
さらに、UNIXみたいにトレンドさをつけるため、最後にxをつけて、Nginxとしたそうです。

[参考]
[1] https://www.nginx.com/company/the-nginx-name
[2] https://thinkit.co.jp/story/2014/06/18/5060


# 設定ファイルの基礎
Nginxでは、ディレクティブという要素で設定を書いていきます。
ディレクティブには「;」 (セミコロン) と「{...}」 (波括弧, ブロック) を使うことができます。
特に、波括弧で囲ったディレクティブはコンテキストと呼びます。

外観は外側から、main, http, server, locationのように階層構造になっています。
Nginxでは、includeで別ファイルの設定を読み込むこともできるので、実際に設定を触るときはserver以下を触ることが多いです。

```nginx.conf
# mainコンテキスト
# worker数や実行ユーザーを記述する
worker_processes  1;

# コネクション数の制限などを設定できる
events {
  worker_connections  1024;
}

# Webサーバー全体の設定
# アクセスログの形式、保存場所も指定できる
http {
  include       mime.types;
  default_type  application/octet-stream;

  sendfile        on;
  keepalive_timeout  65;

  #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  #                  '$status $body_bytes_sent "$http_referer" '
  #                  '"$http_user_agent" "$http_x_forwarded_for"';

  #access_log  logs/access.log  main

  # バーチャルサーバーの設定
  # ホスト名、IPアドレス、ポートによって何を配信するかを設定できる
  server {
    listen       80;
    server_name  localhost;

    # 1つのバーチャルサーバー内でのパス毎の設定
    location / {
      root   html;
      index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }
}
```

[参考]
[1] https://github.com/nginx/nginx/blob/master/conf/nginx.conf
[2] 『Nginx実践入門』 久保達彦， 道井俊介　著

# locationの書き方
serverコンテキスト内で記述するlocationコンテキストには、5つの書き方が存在します。
また、識別子が同じ場合は、最長一致で判断されます。

| 識別子 | 意味 | 例 |
|:------------:|:------------:|:------------:|
| = | 完全一致 | location = test |
| ~ | 正規表現 (case-sensitive) | location ~ test |
| ~* | 正規表現 (case-insensitive) | location ~* test |
| なし | 前方一致 | location test |
| ^~ | 前方一致 | location ^~ test |





# まとめ
今回はNginxの名前の由来に触れ、設定ファイルの構成やlocationを紹介しました。
locationの書き方は間違えやすいので、別動画・別記事で再度詳しく説明します！

何か間違いや指摘がありましたら、コメントよろしくお願いします。

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
VSCodeに予測変換風のスニペットを登録してみた

#あらすじ
コーディング効率化のために、if文などの頻出する構文を予測変換っぽく入力できたらいいなあと思いましたが、
既に拡張機能として存在しているスニペットは、予測変換というより、
極端な省略表記という感じでした（`imp`を`import fs from '○○';`に変換するなど）ので、
ユーザースニペット機能を活用して自作のスニペットを登録してみました。

#手順
##1. ユーザースニペットの編集画面を開く。
**Win:** メニューバーの **ファイル(F)** > **ユーザー設定** > **ユーザー スニペット**
**Mac:** メニューバーの **Code** > **基本設定** > **ユーザー スニペット** 

##2. スニペットファイルの選択欄を入力する。
どの言語モードで入力しているときに使用したいスニペットか選択する。
（言語モード･･･下部の青いバーの右側で選択できる、現在入力中の言語を表すところ）

注: Vueのコンポーネントファイルを入力中は、\<script> の内部では、JavaScriptモードの時のスニペットが有効になりました。
　  Vueモードの時のスニペットは、カーソル位置が\<template> などのタグの外でしか適用されないようです。

##3. スニペットを登録する。 
コメントアウトに書き方の例が説明してあるので、それに従って記入します。

```JSON
	"スニペットの名前": {
		"prefix": "予測変換前の文字",
		"body": [
			"予測変換後の文字（１行目）",
			"予測変換後の文字（２行目）…　これ以降も、同じように行を増やせる。",
		],
		"description": "説明文"
	},
```
　　
注: "description" は、実際に予測変換する際に、変換候補を選ぶ欄で表示される文です。
注: \$1、\$2と指定していくと、予測変換後の最初のTabキーで\$1に、次のTabキーで\$2に移動できますが、
　  この機能を使うと、最後のカーソル位置に移動するまで、他の予測変換（スニペット）が使用できなくなるようです。
　  \$0と指定すると、最後のカーソル位置が指定できるので、\$0だけを使うようにしたほうが操作感が良いと思います。
注: \$ を文字として入力したい場合は、\\\$ と入力します。 Tabを入力したい場合は、\$t と入力します。

##4. スニペットを使う。
さきほど選択した言語モードで入力をしてみます。
"prefix"に指定した文字を入力したあとでTabキーを入力すると、
入力候補の選択欄がでてきます。
ただし、登録したばかりのスニペットは、一番上には来ないようです。
既存のスニペットが存在する文字を入力する際は、きちんと自身が登録したスニペットかどうか
 "description" の説明文を見て確認してみてください。
【Ruby on Rails】更新日、作成日を好みの表記に変更する

# 目標
デフォルトの表記ではなく、
2020年09月◯◯日や2020/09/◯◯
11時05分や11:05と変更する

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 流れ
1 gem 'rails-i18n'を導入
2 config/application.rbを編集
3 viewを変更

# gem 'rails-i18n'を導入
```rb:Gemfile
gem 'rails-i18n'
```
```:ターミナル
$ bundle install
```
# config/application.rbを編集
config.load_defaults以下４行を追記。

```rb:config/application.rb
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2
    config.paths.add 'lib', eager_load: true
    config.time_zone = 'Tokyo'
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
```
# viewを変更
下記のように記載すればOKです。

```erb:app/views/posts/show.html.erb
<%= @post.updated_at.strftime("%Y年%m月%d日").to_s %>
<%= @post.updated_at.strftime("%Y/%m/%d").to_s %>
<%= @post.created_at.strftime("%H時%M分").to_s %>
<%= @post.created_at.strftime("%H:%M").to_s %>
```

# 補足
gem 'rails-i18n'を使えばエラーの表記も日本語にできます。
詳しくは[こちら](https://qiita.com/japwork/items/aba5a5883d0588ce926f)
【Android Studio】おすすめの初期設定

## はじめに

Android Studio用に個人メモとして書こうと思いました。

Xcodeについては[こちら](https://nakashimaakio.hatenablog.com/entry/2024/08/21/162209?_gl=1*1f02njr*_gcl_au*MTczNjU4NzQxMi4xNzIwMDc5OTgw)。

https://nakashimaakio.hatenablog.com/entry/2024/08/21/162209?_gl=1*1f02njr*_gcl_au*MTczNjU4NzQxMi4xNzIwMDc5OTgw

## フォント設定

見やすいフォントに変更しましょう。私のおすすめは、Ricty Diminished (自分でインストールが必要)、サイズが19、Line spacingが1.2です。

File -> Settings -> Editor -> Font

## システムのフォント設定

私はフォントはYu Gothic UIのままで、フォントサイズを13に変更してます。

File -> Settings -> Appearance & Behavior -> Appearance -> Use Custom font

## ダークモード設定 

これは個人的な好みがありますが、私はダークモードにしています。ダークモードのほうが目に優しいそうです。

File -> Settings -> Appearance & Behavior -> Appearance -> ThemeをDarculaに変更。

## ショートカットキーの変更 (Windows)

Android Studioは自動保存するので、ctrl + S をフォーマット修正 に割り当ててます。

File -> Settings -> Keymap -> 右の検索ボックスでReformat Codeで、Ctrl + Sを追加

## フォーマット修正時にimportの最適化を行う (Windows)

つまり、ctrl +  S でフォーマット修正 + importの最適化ができるようになります。

(ちなみに、Save Actionsというプラグインを使用すると、まとめて設定してくれるようです。)

Shift + Ctrl +Alt + L -> Optimize importsとRearrange codeにチェックを入れる

その他フォーマット設定は[こちら](https://qiita.com/nakashimaakio/items/a7f83949604ef672ed80)

https://qiita.com/nakashimaakio/items/a7f83949604ef672ed80

## ツールバーを小さく表示

これをすることで、コードビュー領域が若干広がります。

`Android Studio`→`Settings…`→`Appearance & Behavior`→`Appearance`→`UI Options`→`Compact mode`にチェックをつける

## encodingをUTF-8に設定

File -> Settings -> Editor -> File Encodings -> Global Encoding, Project Encoding, Default encoding for properties filesをUTF-8に変更

## プロジェクトカラーを変更

[こちら](https://nakashimaakio.hatenablog.com/entry/2024/12/16/171129?_gl=1*o3ryp6*_gcl_au*MTIxNzM0OTI1OC4xNzI3OTE5MjAy)の記事を参照してください。

https://nakashimaakio.hatenablog.com/entry/2024/12/16/171129?_gl=1*o3ryp6*_gcl_au*MTIxNzM0OTI1OC4xNzI3OTE5MjAy

## 関数の定義に移動・関数が使われいる箇所の表示

Windows: ctrl + B
Mac: cmd + B

## プロジェクト全体のファイル検索

Windows: shift + ctrl + F
Mac: shift + cmd + F


## Run

Windows: shift + F10
Mac: ctrl + R

## emulatorのダークモード設定

emulator右下の「・・・」-> Settings -> General -> Emulator window theme -> Dark

## 1クリックでフォルダ / ファイルを開く

`Project右上の3点リーダー` → `Open Files with Single Click` `Open Directories with Single Click` にチェックを入れる

![singleClick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/8068f83f-fc47-681e-358f-65b54e978539.png)

## ビルド時に`Run`タブを開かないようにする

https://qiita.com/george1998/items/f3eca659cc1e20f4b78b

## MacのAndroid Studioで複数プロジェクトを開く際、新規ウィンドウで開く

https://qiita.com/nakashimaakio/items/a37ad6a27717bcc1b7b8

# おわりに

一部、作業効率化とは異なるジャンルも含まれてしまいました。Git連携も便利なので書こうと思ったのですが、ここまでにします。
任意の3つの数字を、同じ値を除外して合計を出力する方法

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのようにコーディングするのか</b>






1.結論
----------------------------------------
<b>配列、eachメソッド、if文</b>を使う！

<br>
2.どのようにコーディングするのか
----------------------------------------

```ruby
def any_three_sum(array)
  unique_nums = [] #---❶
  array.each do |num| #---❷
    count = 0
    array.each do |i| #---❸
      if num == i
        count += 1
      end
    end
    if count < 2 #---❹
      unique_nums << num
    end
  end

  three_sum = 0 #---❺
  unique_nums.each do |unique_num|
   　three_sum += unique_num
  end

  puts three_sum

end
```
まず被らない数字を取り出すプログラムをコーディングしています。例えばany_three_sum([4,3,4])で考えてみます。
❶：重複しない数字を配列に入れ込む箱を用意しています。❺で再度使用します。
❷：num=4,num=3,num=4として、eachで取り出しています。
❸：❷で取り出した数字と❸i=[4,3,4]の数字が一緒の場合はcountが+1になるようにしています。❹に重複した際の重要なコーディングをしています。
❹：count < 2の時はunique_numsに配列に含めるようにしています。count は重複の数字をカウントしているので、num=4の場合は、count=2になるのでunique_sumsに追加しないようになっています。なのでnum=3 が unique_sumsに追加されます。
❺：unique_sums = [3]のみなので、puts three_sum は”3”になります。unique_sumsの値をそれぞれ取り出し(=each)全てを合計(three_sum +=により1回目・2回目の数字も反映する)したものをthree_sum変数に代入しています。
<br>
【AWS EFS】 EFS導入と「自動マウントされない問題」や「マウントされたときの表示がいまいち問題」、「帯域制限を掛けながらrsyncでデータを流す」をしたときのメモ

# はじめに

EBSをEC2にマウントしていると、他のサーバからそのEBS内容を閲覧したいときにつらいので、EFSを使ってみました。
その際に、「EFSが自動マウントされない問題」とか「「$ df -h」した際に、表示されるefsが127.0.0.1とかlocalhostとかの表示になっていてわかりづらい問題」、「帯域制限を掛けながらrsyncでデータを流す」の内容も記述します。

自分用メモです。


# 内容

## EFSのマウント

これは、多くの参考記事がありますのでそちらを参考に。

・https://qiita.com/rubytomato@github/items/4a821fc9e07848a15e59
・https://qiita.com/aWdfcfG2jLr73pe/items/adb807df4c4fb305006b

ありがたいですー

## EFSの自動マウントがされない問題

これも、多くの記事がありますので参考に。

https://dev.classmethod.jp/articles/tsnote-support-efs-nfs-utils-reboot-mount-launch-001/

ありがたいですー

## 「$ df -h」した際に、表示されるefsが127.0.0.1とかlocalhostとかの表示になっていてわかりづらい問題

マウント時に、

```
sudo mount -t efs -o tls fs-12345678:/ /mnt/efs
```
※「fs-12345678」は例です。

の-oにtlsを指定すると起こるポイです。
詳しく内容を確認していないので、それが元凶かはわかりませんが、sslかされていないシステムに対して行ったのでそれが原因かもしれません。（関係ないかも）

**ちゃんと調べたときに追記していきます。申し訳ございません・・・**

まあ普通に、参考記事が行っているように普通に以下のようにマウントしたら、


```
mount -t efs fs-74444555:/ /mnt/efs
```
※「fs-74444555」は例です。


以下のようにefsがマウントしているんだというわかりやすい表示になります。

```
$ df -h
hogehoge.efs.ap-northeast-1.amazonaws.com:/
```

## 帯域制限を掛けながらrsyncでデータを流す

後は、EBSのデータをEFSに流し込めば、他のEC2でも同じようにデータを閲覧できます。
ただ、移す際のEC2に負荷を掛けたくなかったので、rsyncの「--bwlimit」を使って制限を掛けました。

```
rsync --bwlimit=1024 EBSディレクトリ EFSディレクトリ
```

これでゆっくりとデータを流せますー。
bwlimitに関しては、負荷と速度を調整して、変更すればいいと思います。
以上。
mockkでprivateなメソッドをモックする

mockkでprivateなメソッドをモックするやり方のメモ。

こんなクラスFooがあるとする。

```kotlin

 class Foo {
     fun sayHello(name: String) = createHelloText(name)
     private fun createHelloText(name: String): String = "Hello $name"
 }
```

`createHelloText` メソッドが返す値を変えたい場合次のようにする。

```kotlin
@Test
fun fooTest() {
    val foo = spyk(Foo(), recordPrivateCalls = true)
    every { foo invoke "createHelloText" withArguments listOf(ofType<String>()) } returns "Goodbye horie"
 
    val text = foo.sayHello("horie")
 
    verify { foo invoke "createHelloText" withArguments listOf(ofType<String>()) }
    Truth.assertThat(text).isEqualTo("Goodbye horie")
}
```

`recordPrivateCalls  = true` することで `verify` がちゃんと動くようになる。

`withArguments` で引数を指定しています。複数の引数を指定する場合、 `listOf(ofType<String>(), ofType<String>()), ..)` のように増やせばOK。
PostgreSQL11.3のCOALESCE関数でreal型がエラーになる問題の解決方法(備忘録)

# エラー内容

PostgresSQLでreal型カラムをCOALESCE関数につっこんだらシンタックスエラーが発生した。

`ERROR:  invalid input syntax for type real: ""`

以下は全てダメだった。

```problem.sql
COALESCE(real型カラム,'') -- 1
COALESCE(real型カラム,'-infinity') -- 2
REPLACE(CAST(COALESCE(real型カラム,'-infinity') as TEXT),'-infinity','') -- 3

-- 1 エラー
-- 2 エラーにはならないがnull値に"-infinity"が出力される
-- 3 エラーにはならないがnull値に"-infinity"が出力される
```

# 解決方法

素直にキャストしてあげればよい。

```solution.sql
COALESCE(CAST(real型カラム as TEXT),'')
```

# 環境

- Windows10 Pro ver.1909
- PostgreSQL 10.6, compiled by Visual C++ build 1800, 64-bit
- Windows Server 2019 Standard ver.1809
- PostgreSQL 11.3, compiled by Visual C++ build 1914, 64-bit

# 余談

公式ドキュメントの9.17.2. COALESCEを読んでも特に記載されていなかった。
エラーを読めばわかる問題だからか？

https://www.postgresql.org/docs/9.6/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL
RubyOnRailsコマンド一覧①


 railsのコマンドを色々まとめて見ようと思います。

# 常用コマンド
まず基本的に使うコマンドについてさっと載せます。


```bash
# 一覧,作成,起動
rails --help
rails new app_name
rails server

# 各種機能作成
rails generate
rails db:migrate
rails db:create

# 機能チェック
rails test
rails routes
rails dbconsole
rails console
```
コマンド入力の省略ができるエイリアスはこちら

```bash:エイリアス
rails server    => rails s
rails generate  => rails g
rails console   => rails c
rails dbconsole => rails db
```

## 一覧,作成,起動
まず最も基本的な内容から

### コマンド一覧

```
rails --help
```

### アプリ作成

```
rails new app_name
```

### アプリ起動

```bash
rails server
# エイリアス
rails s
```

## 各種機能作成

### コントローラー,モデル作成

```bash
rails generate
# エイリアス
rails g
```
使用例

```bash
rails g controller 名前
rails g モデル 名前
```

### データベース作成

```
rails db:create
```

### データベース更新

```
rails db:migrate
```
Railsのエラー　Webpacker configuration file not found


またまたエラーが出たのでその備忘録を
どうも色々更新されて面倒が増えたようです。

# 起動からのエラー

いつも通りに起動しようとしたら

```
rails s
```

こんなエラーが

```
~ Webpacker configuration file not found ~
```

## wevpacker

調べて見ると
node.jsのモジュールの1つ
CSS、JavaScript、画像などを１つのファイルとしてまとめるためのモジュールバンドラーだとのこと
Rails5.1から実装されたそうです。


## yarn
webpackerを使うためのツール
Facebookが開発したnode.jsのパッケージマネージャ

インストールはこちら

```
brew install yarn
```

# エラー対応

調べて見た結果
下記のコードをターミナルで打ち込んで解決しました。


```bash
rails webpacker:install
# ここでインストール使用としたらnode.jsがないとのこと

brew install node
# nodeのインストール

brew install yarn
# webpackerのインストールに必要とのこと

rails webpacker:install
# ようやくインストールができました。
```

これでようやくrailsの起動ができました。
[Ruby on Rails]「〜を満たすまでループする」をやめる

#なぜ書くのか
実務スタートしてから本日でまる１ヶ月が経ちました。
同期と協力し、一つの機能をリリースし、正常に稼働させることに成功しました。
しかし実は一度、本番環境で処理を完了できないという不具合を起こしてしまいました。
2度と同じことを起こさないための備忘録としアウトプットさせていただきます。

#なぜ起きたのか
簡単に言えば「無限ループ」に陥ったことが原因です。
 Sidekiq上で走っているジョブを監視するという機能で、ジョブがダブったり喪失したりするのを検知しSlackにアラートを出すというのが、今回の実装内容でした。

まずぶち当たったのが、
・予定から実行
・実行中から予定
この双方の行き来のタイミングでジョブを取得してチェックに入ってしまうと、度々エラーとして検知してしまうということです。

行き来のスピードは１秒から最大５秒ほどのラグがありました（ローカル環境でのチェックでは）。
そのタイミングで新機能の監視用のジョブが動いてしまうと、正常にジョブが動いていたとしてもエラーとして検知してしまうということです。

これに対し私が行った対策は
**ジョブを取得する際にループを回し、10回取得する中で５秒の「sleep」もかけて全てのデータが同じであれば次の処理に渡す**
というものでした。これがよくありませんでした、、、。

#どう改善したのか
本番環境では、３０秒度に走り、１０秒ほどで、処理を終えるという、予定と実行を目まぐるしく動き回る、それはそれは元気なジョブが動いていました。

ループを回す中で取得するにも、取得だけで50秒以上かかるので（わざとそうしていたのですが）、永遠に10回の取得の中で得られるデータが同じになることはないという原因で無限ループになっていたのです。

修正の際にはまず、**全てのデータが同じになるまでループを回す**と言うのをやめました。
しかし取得はきちんとふるいにかけなければ、Slackのアラートをめちゃくちゃ鳴らすことになってしまうのはわかっていました。

そこで、**ループの上限を決め、得られたデータの中で一番多かったデータを次の処理へ渡す**仕様へと変更しました。

```ruby:monitoring_sidekiq.rb
#省略
def sidekiq_logs_arr_in
  consistency_check_sidekiq_logs = []
  #以前はwhile文とredoを使っていたが明確な上限を定めた
  50.times do
    queues = []
    # 予定から実行、実行から予定に移るタイミングにばらつきがあるために、sleepを使って回避
    sleep 2
    #Sidekiq上のジョブを取得
    Sidekiq::Workers.new.each { |_process_id, _thread_id, job| queues << job["queue"] }
    Sidekiq::ScheduledSet.new.each { |job| queues << job["queue"] }
    queues = queues.sort
    consistency_check_sidekiq_logs << queues
  end
  #最終的にカウントでループの中で一番多いデータを返す
  consistency_check_sidekiq_logs.max_by { |x| consistency_check_sidekiq_logs.count x }
end
#省略
```

こうすることで、この後の処理の際に、正常時にも例外を吐いてしまうと言うことはなくなり、元気なジョブがいようとも、整合性の取れたログを取得することができるようになりました。

#今後どうするか
まず特定の条件を満たさなければ、やり直すと言う処理をなるべくループ処理の中で行わないようにします。
上限を決め、どんなことがあっても、どんな状況であれ抜けられるループを組むと言うのはめちゃくちゃ大切なことなのだなと痛感しました...。

無限ループを本番環境で起こしてしまうのは会社に大損害を与える可能性もあるために今後は本当に気をつけます。
「Ctrl + Space」 で IMEをON/OFF

# tl;dr
通常、[全角/半角]キーでIMEをON/OFFしますが、これを「Ctrl + Space」や「Shift + Space」で行うことができます。

# 設定方法
タスクバー右端にあるIMEのアイコン（「あ」とか「A」とか表示されるやつ）を右クリックし、そこから「設定」を選択すると、「Microsoft IME」 の設定ダイアログが表示されます。

![コメント 2020-10-01 101329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/15bd5954-cd71-92f0-b66e-8c337c9cc86d.png)
赤丸で囲まれた「キーとタッチのカスタマイズ」をクリックすると、「キーとタッチのカスタマイズ」の設定ダイアログが表示されます。
![コメント 2020-10-01 101329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/eedd8176-4c98-b1dc-0ef0-4325eb72114c.png)

- 赤丸で囲まれた「各キーにお好みの機能を割り当てる」を「オン」にします。
- 「Ctrl + Space」ドロップダウンリストより「IME-オン/オフ」を選択すると、「Ctrl + Space」によるIMEのON/OFF切り替えができるようになります。
- 「Shift + Space」ドロップダウンリストより「IME-オン/オフ」を選択すると、「Shift + Space」によるIMEのON/OFF切り替えができるようになります。

以上。