OmniAICreator/Qiita-1.07M huggingface dataset:
特定条件のみに呼応するプログラムの作成

## 初めに
rubyの練習問題を私なりの解説で解いてこうと思います。

### 練習問題
今日の曜日を表示するコードをDateクラスを使用して記述してください。

ただし、金曜日だった場合だけ以下のように表示の内容を変えてください。

（出力内容）
「今日は月曜日」
「今日は金曜日だ ！！！」

まずはDateクラスについてまとめてきます。
### Dateクラス
Dateクラスとはrubyの標準ライブラリの1つです。標準ライブラリとはruby本体をインストールした時に自動でインストールされるクラスやモジュールのことです。
### Dateクラスの読み込み
Dateクラスは日付や曜日を取得することができます。初めにDateクラスを使うにはためにはDateクラスを使用しますと宣言する必要があります。よって以下の文をコードの初めに書きDateクラスを使用することを宣言します。

```
require "date"
```
上記の記述によりDateクラスをライブラリから読み込みました。
次に今日の曜日を取得します。
曜日の取得は以下のような記述になります。

```
Date.today.wday
```
ちなみにwdayは曜日を取得することができるDateクラスに用意されているメソッドです。曜日を整数の0（日曜日）から6(土曜日)まで取得します。
しかしこのままでは使えないので上記の記述を変数dayに代入します。

```
day = Date.today.wday
```
上記の記述で曜日に合わせて整数を取得することができるようになりました。しかし整数だけで文字列がありません。よって配列daysを定義します。そしてその中に整数に合わせて曜日を格納します。

```
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
```
さて、ここまでで準備は完了です。
あとはif文を使用して問題文のような出力内容になるように記述するだけです。

###問題の解答
今回は金曜日の場合のみ『今日は金曜日だ！！！』と出力します。まずはif文を使い金曜日の時に上記の内容が出力されるように記述します。

```
if day == 5
  puts "今日は#{days[day]}だ！！！"
```
ポイントとしては曜日は日曜日から順番で０から数えることです。私は１から数えてよく間違えました。
あとは金曜日以外の記述をelseを使い記述します。

```
else
  puts "今日は#{days[day]}"
end
```
### 解答全体のコード

```
require "date"

day = Date.today.wday
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]

if day == 5
  puts "今日は#{days[day]}だ！！！"
else
  puts "今日は#{days[day]}"
end
```
以上です。
初学者なのでもし間違いなどありましたご指摘お願いします。
【docker】docker-compose build  したらERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 7

railsアプリにローカル環境にdockerを導入していました。buildしようと、```docker-compose build```を実行したら、このようなエラーがでました。

```terminal
Your bundle is locked to mimemagic (0.3.5), but that version could not be found
in any of the sources listed in your Gemfile. If you haven't changed sources,
that means the author of mimemagic (0.3.5) has removed it. You'll need to update
your bundle to a version other than mimemagic (0.3.5) that hasn't been removed
in order to install.
ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 7
```

どうも、mimemagicというgemが悪さしてそうで、調べてみると0.3.5はyanked（公開停止）されているようでした。

# 対策
gem mimemagicをアップデートする。

```terminal
$ bundle update mimemagic
```


ちなみにDOCKERFILEはこのように書いていました。

```dockerfile
FROM ruby:2.6.6

RUN apt-get update -qq && \
  apt-get install -y build-essential \ 
  libpq-dev \        
  nodejs      

RUN mkdir /app_name 

ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler 
RUN bundle install
ADD . $APP_ROOT

```


# 参考
https://masahiro.me/2021/03/your-bundle-is-locked-to-mimemagic-0-3-5-but-that-version-could-not-be-found/

https://qiita.com/Wacci6/items/dc6ffec9b50578d44d6c
【OpenRPA】初心者向け操作説明書～その３．変数～

レコーディングの続きを書くつもりでしたが、変数の話をしていなかったのでそっちを先に。

# はじめに

プログラムでは常識のように「変数」という言葉が登場しますが、RPAでも使います。

[出典: フリー百科事典『ウィキペディア（Wikipedia）』](https://ja.wikipedia.org/wiki/%E5%A4%89%E6%95%B0_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))
> プログラミングにおける変数（へんすう、英: variable）とは、高水準言語のプログラムのソースコードにおいて、扱うデータを読み書きする記憶域 (storage) のことであり、固有の名前（識別子）によって識別される[1]。変数を用いることで、データを一定期間記憶し必要なときに利用することができる。

要は値の入る箱、のようなものです。
RPAでも、計算結果を一時的に保存したり、文章を編集したりするのに使ったりします。

# 変数の作り方

変数を作るには、シーケンスを選択したあとに「変数」タブから作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/dd8fdca9-18c5-d876-ac5a-d1a3d82dee19.png)

変数タブの中の「変数を作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/7c0ed7ba-5622-2bff-77f7-ac62856b056a.png)

「名前」「変数の型」「スコープ」「既定値」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/69bc588d-2ce8-6ae7-0690-5c2c1392a365.png)

## 型ってなに？

型とは、変数という箱の形のようなイメージです。

三角形の箱に、四角は入れられないですよね？
プログラムの世界では、例えば「int（数値）」という型の変数には、文字列を入れることはできません。

よく使うと思われる型は、以下の通りです。

| 型 | 意味 |
|:-:|:--|
| Boolean | True(真) または False(偽) のどちらかしか入らない変数。  |
| Int32 | 整数の数値しか入らない変数 |
| String | 文字列しか入らない変数 |

ほんとはもっとたくさんあるのですが、キリがないのでこれくらいにしておきます。

## スコープってなに？

スコープとは、その変数が使える範囲を示します。
言葉で説明するより、図で説明するほうがわかりやすいので、こんなかんじ。

例えば、以下のようなシーケンスと変数があったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/b558dcce-0ac8-c822-98e2-4d7b60bd53ab.png)

| 変数 | スコープ |
|:-:|:--|
| parent | シーケンス（親） |
| child1 | シーケンス（子１） |
| child2 | シーケンス（子２） |

このとき、それぞれの変数が使える（箱に値を入れることができる or 箱から値を取り出すことができる）のは、以下の範囲になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/00fea4ad-503c-53e3-2cc8-4bf32ea308c6.png)

`child1`は、「シーケンス（子１）」の中でしか使うことはできません。
`child2`も同様に、「シーケンス（子２）」の中でしか使うことはできません。

さて、`parent`が使える範囲はどこでしょう？

`parent`のスコープは「シーケンス（親）」なので、「シーケンス（親）」の中でしか使うことができない、というルールは同じです。
ですが、「シーケンス（親）」の中に「シーケンス（子１）」「シーケンス（子２）」がいますね？
なので、「シーケンス（親）」の中、つまり「シーケンス（子１）」「シーケンス（子２）」の中からも使うことができます。

これがスコープです。

## 既定値ってなに？

既定値とは、デフォルト値のことです。
つまり、最初から変数に設定されている値を指定します。
ここは、状況に応じて設定するものなので、指定しなくても良いです。

# 変数を使ってみよう！

ワークフローの中で変数に値を設定するときは、「Assign」というアクティビティを使います。
やってみましょう。

変数を作って、ワークフローに「Assing」アクティビティを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/fdeb81c4-7317-9fd2-f27c-853ce9b09cd4.png)

`parent`という変数に、「こんにちは！」という文字列を設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/ad98b73b-73d6-54e4-adfb-79742180423b.png)

これだけだと本当に設定されたかがわからないので、「WriteLine」というアクティビティを使って、出力ウィンドウに変数の値を表示するようにしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/e3036c97-c50e-fc83-9021-027802c47cdb.png)

ワークフローを保存して、動かしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/a8dd63da-110e-37a2-b0d1-fb075899cfbc.png)

変数の内容が表示されました！

# おわりに

RPAって「プログラミングの経験が無くても使える」と言われたりしますが、経験は必要なくても「多少の知識」は必要になると思うんですよね。
今回の記事はかなり初心者向けの記事になってしまいましたが、「多少の知識」もないのに業務上RPAをやらざるを得なくなった人、そんな方の役に立てば幸いです。
【Swift】大文字のSelfまとめ

#はじめに
小文字のselfはよく使いますが、大文字のSelfというのもあります。
大文字のSelfについてまとめてみました。

#型の内部で型自身へのアクセス
以下のように、`Self.value`で構造体`A`に紐付いたvalueにアクセスすることができます。

```swift
struct A {
    static let value = 10
    func printValue() {
        print(Self.value)
    }
}
```
ちなみに、Selfを書かずに直接スタティックプロパティ(value)にアクセスしようとすると
`Static member 'value' cannot be used on instance of type 'A'`
このようなエラーが出てきてしまいます。

スタティックメソッドでも同様です。

```swift 
struct B {
    var name: String
    var age: Int
    static func isOld(_ x: Int) -> Bool {
        return x > 60
    }
    func ageFunc() {
        print(Self.isOld(age))
    }
}
```
ちなみに、`Self`を構造体名の`B`と書き換えても同じことです。ここでは`Self == B`ですね。

#プロトコルの定義での利用
プロトコルはそれに準拠させた型の振る舞いを事前に宣言しておくことができますが、プロトコル自身はどの型で準拠されるのかは知りません。例えるなら、車の大きさ、色、ハンドルの位置などは製造の段階で決める事ができますが、製造の段階では一体この車はどんな人が乗るのかは知りません。利用者（型）が購入（準拠）して初めてどんな人が乗るのか（プロトコル自身がどの型で準拠されるのか）を知る事ができます。
しかし、その型と同じ型のデータを返すメソッドや、同じ型同士を比較したい時もあります。その時にSelfキーワードを使います。

注意点として、前項ではその定義を含む型自身をSelfと置いていましたが、本項では少し扱い方が異なります。つまり、プロトコル定義内でSelfを用いてもプロトコルがSelfというわけではありません。ここでのSelfとは、`プロトコルを採用した具体的な型 == Self`です。

```swift
protocol C {
    associatedtype Element
    var x: Element { get }
    var y: Element { get }
    func replace() -> Self
    static func +(lhs: Self, rhs: Self) -> Self
}
```
このように、xとyを入れ替えるreplaceメソッド、左辺の右辺を加算するスタティックメソッドをprotocol Cで宣言しています。replaceメソッドの戻り値にSelfを指定しています。この時点ではどのような型に準拠するのかわからないためです。スタティックメソッド+も同様です。
構造体Dに準拠させてみましょう。

```swift
struct D: C {
    typealias Element = Int
    var x: Int
    var y: Int
    func replace() -> D {
        return D(x: y, y: x)
    }
    static func +(lhs: D, rhs: D) -> D {
        return D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }
}
```
このように、Selfのところが具体的なかたDに変わったのがわかります。このプロトコルCは他の型にも紐付く事ができるようにするため、できるだけ具体的な型はプロトコル宣言時に書きたくないためです。(associatedtypeもそのため)

#クラス内での利用
プロトコルとは違い、メソッドの返り値の型としてのみ扱う事ができます。

```swift 
class E {
    func someFunc() -> Self {
        return self
    }
}
```

#エクステンションでの利用
前述の通り、プロトコルを準拠する型をSelfで参照できますが、一定の条件を満たす型のみプロトコルエクステンションを有効にしたいこともあります。
そのような条件を記述するときにSelfでその型を表す事ができます。

```swift
protocol SomeProtocol { }

class SomeClass { }

extension SomeProtocol where Self: SomeClass {
    func someFunc() {
        print(type(of: self))
    }
}

class SomeSubClass: SomeClass, SomeProtocol { }

let someSubClass = SomeSubClass()
someSubClass.someFunc()
```
この例では、`SomeProtocol`を準拠する型が条件`Self: SomeClass`つまり、SomeClassを継承している場合のみ`someFunc()`を利用する事ができます。
以下のように、`SomeProtocol`に準拠していても`SomeSubClass2`は`SomeClass`を継承していない（条件を満たしていない）ため、`someFunc()`にアクセスしようとするとエラーが出てきてしまいます。

```swift 
class SomeSubClass2: SomeProtocol { }

let someSubClass2 = SomeSubClass2()
someSubClass2.someFunc()
``` 
エラー
`Referencing instance method 'someFunc()' on 'SomeProtocol' requires that 'SomeSubClass2' inherit from 'SomeClass'`


#おわりに
selfと違ってSelfはややこしいですね。
WSL2とDockerを導入してみる

WSL2 と Docker 導入手順の覚書き。
WSL1 から WSL2 に切り替えて、WSL2 上で動作する Docker を導入します。


導入手順は Microsoft の下記ドキュメントを参考にしました。

* [Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

## 導入環境
Boot Camp ( intel CPU ) 上の Windows 10 Pro 20H2 (10.0.19042) で、既に WSL1 がインストールされている環境です。

```powershell:Windows&#x20;Version
PS C:\> Get-CimInstance -Class Win32_OperatingSystem | Format-List Version
Version : 10.0.19042
```
```powershell:WSL&#x20;Version
PS C:\> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1
```

また、 Hyper-V は無効化されている状態です。
（ WSL2 上で Docker を動作させるため無効状態でOK）
Hyper-V の状態は、「 コントロール パネル\すべてのコントロール パネル項目\プログラムと機能 」の「Windowsの機能の有効化または無効化」から確認するか、PowerShellを管理者権限で実行して「Get-WindowsOptionalFeature」コマンドで確認。

```powershell:Run&#x20;the&#x20;PowerShell&#x20;7&#x20;as&#x20;Administrator
Start-Process pwsh.exe -Verb runas
```
```powershell:Hyper-V&#x20;Status
PS C:\> Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V
FeatureName      : Microsoft-Hyper-V
DisplayName      : Hyper-V プラットフォーム
Description      : 仮想マシンとそのリソースの作成および管理に使用できるサービスを提供します。
RestartRequired  : Possible
State            : Disabled
CustomProperties :
```

## BIOS 内部の仮想化を有効にする
Boot Camp で起動していると、BIOS 内部の仮想化が有効になっていない場合があります。
この設定は「タスクマネージャー」の「パフォーマンス」タブにある「仮想化」欄で確認できます。
最初、この設定が無効になっていたため、下記のエラーメッセージが表示され WSL2 が有効化できませんでした。

>Error: 0x80370102 ??????????????????????????????????????

>コンピューターの BIOS 内部で仮想化が有効になっていることを確認してください

BIOS 内部の仮想化を有効化するには macOS で再起動後、「システム環境設定」から「起動ディスク」 を選択し、ディスクを「BOOTCAMP Windows」に設定してから Windows を起動します。


## WSL2 へ切り替える

WSL1 から WSL2 に切り替えます。
WSL1 がインストール済みのため「Linux用Windowsサブシステム」機能は有効になっており、「仮想マシンプラットフォーム」機能は無効化されている状態です。
仮想マシンの機能を有効化するため、 PowerShell を管理者権限で起動し、以下のコマンドを実行します。
有効化したら PC を再起動します。

```powershell:Enable&#x20;Feature&#x20;VirtualMachinePlatform
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
 
再起動後、上記の参考ドキュメントに記載されている「[Linux カーネル更新プログラムパッケージ](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package)」をダウンロードしてインストールします。
インストールが完了したら、 WSL2 を既定に設定します。

```powershell:Set&#x20;WSL2&#x20;as&#x20;default
wsl --set-version Ubuntu-20.04 2
```
設定完了後、WSL2 に切り替わっているか確認します。

```powershell:WSL&#x20;Version
PS C:\> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

## Docker を導入する
Docker の公式サイトから Docker Desktop for Windows のインストーラをダウンロードします。
インストーラを実行し、「Install required Windows components for WSL 2」欄にチェックが付いていることを確認して OK ボタンを押します。
OK ボタンを押すとインストールが始まります。
インストール完了後、「Close and Log out」ボタンが表示され、押すとログアウトします。
ログインすると、自動的に WSL2 をバックエンドに Docker が起動します。

起動後に表示されているチュートリアルを実行したところ問題なく表示されました。

```shell
docker run -d -p 80:80 docker/getting-started
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1172866/caa5a7f7-c55f-8861-4acd-513f80425eaa.png)
以上で WSL2 上で動作する Docker の導入は完了です。
Railsで日本時刻にする方法

##投稿時刻の表示を変更しよう

###application.rbの編集

```ruby:application.rb
module ShoApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0 
    config.i18n.default_locale = :ja
    config.time_zone = 'Tokyo'
   # 中略
```

### ja.ymlファイルを作成して、表示する時刻のフォーマットを設定

```ruby:config/locales/ja.yml
ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
```
続いて、この時刻設定を元に、lメソッドを利用して、表示する時刻へ反映させます。

* lメソッド
l（エル）メソッドは、日付や時刻を表示するRailsのメソッドです。
国や地域によって時刻は異なりますが、lメソッドを使えば指定した現地時間に対応できます。


```ruby:app/views/messages/_message.html.erb
<div class="message">
  <div class="upper-message">
    <div class="message-user">
      <!-- 投稿したユーザー名情報を出力する -->
      <%= message.user.name %>
    </div>
    <div class="message-date">
      <!-- 投稿した時刻を出力する -->
      <%= l message.created_at %> 　　#ここ修正
    </div>
  </div>
  <div class="lower-message">
    <div class="message-content">
      <!-- 投稿したメッセージ内容を記述する -->
      <%= message.content %>
    </div>
  </div>
</div>
```
DjangoのQuerySetをJSON形式に変換してVue.jsで受け取る

## はじめに##
Vue.jsが気に入ってしまったので、DjangoのQuerySetをJSON形式に変換してVue.js内で扱える様にしました。忘れっぽい自分のために、備忘録的に残します。


###前提条件###
Django: version 3.1.7
Vue.js: version 2.6.12(CDN)
axios等は使用しません

###コード###
 Djangoにアプリ追加したところで各モジュールを書きかえます。

``` urls.py
from django.urls import path
from . import views

app_name= 'app'

urlpatterns = [
    path('list/', views.ListData, name= 'list'),
]
```

``` models.py
import uuid

from django.db import models

class Book(models.Model):

    id= models.UUIDField(primary_key=True, default= uuid.uuid4, editable= False)
    title= models.CharField(verbose_name= 'タイトル', max_length=40)
```
ここでは、JSONが知らない特別なタイプの型をとるために、idをUUIDにしておきます。

``` views.py
import json, uuid

class ListDataView(ListView):
    template_name= "app/listdata.html"
    model= Book

    def get_context_data(self, **kwargs):
        def cnvDataToJson(object):
            if(isinstance(object, uuid.UUID)):
                return str(object)

        context= super().get_context_data(**kwargs)
        books= self.object_list.values('id', 'title')
        bookList= json.dumps(list(books), ensure_ascii=False, default=cnvDataToJson)
        context["bookList"]= bookList

        return context
    
ListData= ListDataView.as_view()
```
Bookモデルからデータを得る時に、**values()**クエリを使って**「辞書のリスト」**に変換しておきます。
その後、この辞書リストを**json.dumps()**でJSON形式の配列に変換しますが、***default=cnvDataToJson***のところで、jsonが知らない型を文字列に変換してあげるためのコールバックを設定します。
なお、***ensure_ascii=False***は文字バケ対策です。


``` listdata.html
 <div id="v-app">
        <button @click="get_books()">GetBooks</button>
        <div>
            <table>
                <tr>
                    <th>No.</th>
                    <th>タイトル</th>
                </tr>
                <tr v-for="(book, index) in books">
                    <td>[[index]]</td>
                    <td>[[book.id]]</td>
                    <td>[[book.title]]</td>
                </tr>
            </table>
        </div>
    </div>

    <script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
    <script>

        Vue.options.delimiters = ['[[',']]']

        const vm = new Vue({
            el: "#v-app",
            data: function(){
                return{
                    books:[],
                }
            },
            methods:{
                get_books: function(){
                    this.books.splice(0);
                    this.books= {{bookList|safe}};  //Djangoから受け取るデータを配列にセットする。
                },
            },
        })
    </script>
```
***Vue.options.delimiters = ['[[',']]']***
DjangoとVue.jsはデフォルトではテンプレート内で使用する{{ }}が衝突してしまうため、Vue.js側でデリミタを再定義してあげます。

***this.books= {{bookList|safe}}***
JSON配列となったデータをVue.js(javaScript)側の配列に移します。このとき***safe***でフィルタすることで、エクケープ処理をします。（細かいことは解りませんが、これがないとダメでした。）

###あとがき###
javaScriptからDjangoの{{ }}を扱う時にずっと"　"で囲うことをしていたために欲しい結果が得られずにいました。
Djangoのテンプレートなので" "は要らないことが判りました。
あと、Htmlタグに仕掛けをすることが出きるVue.jsって素晴らしく便利だと思った。(CLIの方は敬遠します)
[読書メモ] エリック・エヴァンスのドメイン駆動設計

## 全体

## 第1部 ドメインモデルを機能させる

### 第1章 知識をかみ砕く

ドメイン＝解決しようとしている領域
モデル＝現実世界の物事を抽象化したもの

ドメインモデル＝解決しようとしている領域の物事を抽象化したもの
≠ドメイン層のアクターをコードに落とし込んだ成果物

プログラマとしてはどうしてもプログラムに目がいってしまうが、あくまで「モデル」は抽象的な概念である

善いモデルは表層には現れない。継続的なリファクタリングで常に「深い」洞察をする


### 第2章

ユビキタス言語

**ドメインモデル図は実装と一致しない、むしろ常に違いが生じる物である**
ドメインモデル図は実装を可視化した物ではない（リバースエンジニアリング不可能？）


## 第2章
失敗から学ぶ｜「Appleでサインイン」していたIFTTTの退会

## はじめに

IFTTTに、「Appleでサインイン」を利用してアカウント作成した。退会しようとおもってハマったが、なんとかなった。

## （たぶん）正しいプロセス

1. 「Appleでサインイン」で生成されたパスワードを、なにか任意のものに変える
1. アカウント削除する

![IMG_4433 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/414e20a0-ff23-e053-3460-d13d8013de83.jpeg)


## ハマったこと

### `pw:abcdef123456`を変更せずに退会しようとした

理由がよくわかっていないが、下記のようなメッセージがあって、パスワードを変えないといけないようだ

![SS 2021-03-29 9.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/020f1809-8781-bd78-6a3b-97ec7b116e0c.png)

### キーチェーン.appに、「有効ではない方のパスワード」が登録されてしまった。

これは自分のミス……

1. 古いパスワード入力（間違い）
1. 新しいパスワード入力
1. キーチェーンには新しいパスワードが登録される
1. パスワード変更が失敗して、IFTTTは古いパスワードを認識している

となり、キーチェーン以外にパスワードを保管していなかったので、IFTTTの「有効なパスワード」がわからない状態におちいった。

`Alfred`でクリップボード履歴を取っているんだけど、デフォルトでパスワード管理ソフトは「対象外」に設定されていて、クリップボード履歴からも拾えない。

自分のミスと言えばミスなんだけど、キーチェーン.appを利用するときの「よくあるハマりどころ」だよなあ。

### パスワードリセットを、Apple IDのメールアドレスでやろうとした

「Appleでサインイン」で生成される`xyz789@priveterelay.appleid.com`を使わなければならない。


## けっきょくやったこと

1. `ID:xyz789@priveterelay.appleid.com`を用いて、パスワードリセット
1. パスワードを変更
1. アカウント削除

パスワード変更は不要だったのかもしれない。
あるいは、パスワードリセットが必要で、このやりかたが正しかったのかもしれない。
いまとなっては謎である（再度会員登録して確かめるほどでもない……）


## 補足

IFTTTは、Gmailに届いたメールをLINEに転送しようとおもってはじめた。Gmailの仕様変更で、IFTTTに対応しなくなっていた。IFTTTをつかう理由がなくなったので退会。

IFTTTはいいサービスだとおもったし、また使いたいと思うけれど、毎日のようにメールが届くのに閉口した。未使用アカウントを残すのも良くないのでサクサクと削除。


## 環境

ここで書いていることは、下記のバージョンで実施しました。

- Safari バージョン14.0.2 (16610.3.7.1.9)
- macOS BigSur 11.1
warning: CRLF will be replaced by LF in hoge.png.

git で某リポジトリを clone してきたところ、


    warning: CRLF will be replaced by LF in hoge.png
    The file will have its original line endings in your working directory


といった警告が `git status` でたくさん出てきた。改行コードの設定ということで検索すると、`git config autocrlf false` で直る、と出てくるのだがやってみても一向に改善しない。
落ち着いてよくメッセージを眺めると、警告の出ているファイルは画像(といくつかのオフィス文書)だ。つまり、テキストじゃないから無視して、と git に伝えられればいいはずだ。

ということで正解は attributes。
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes

`.gitattributes`に設定されていた内容がこちら。

    * text eol=lf

そのままここに必要な設定を加えてもいいのだが、主に pull しかしないリポジトリでコミットすると管理が面倒なので、`.git/info/attributes` の方に書くことにする。

    *.png binary
    *.pptx binary
grep/sed コマンドの代替としての StreamRelay.NET.exe

---
### はじめに

じつはgrepもsedも使いこなしていないので、代替になるかどうかは分からないけど、正規表現での検索と置換を実装してみた。

---
### grep/sed コマンドの代替としての StreamRelay.NET.exe

ver3.8.0.0 より、.NET Framework標準の正規表現機能([System.Text.RegularExpressions](https://docs.microsoft.com/ja-jp/dotnet/api/system.text.regularexpressions.regex?view=netframework-4.0)クラス)をスクリプト実装のプラグインの一つとして実装した。

オプションとしては「-RegularExpressionMatch」と「-RegularExpressionReplace」がそれである。

---
### 使用上の注意(入出力ストリームの文字列化(Byte配列からChar配列へ))

正規表現なので、ストリームからの入力データを文字列として扱う「-LocalCharset」などのオプションがないと面白い結果は出ないと思う。

---
### 「-RegularExpressionMatch」オプション

`-RegularExpressionMatch 正規表現`

というような正規表現のオプションを一つ受けて、それにヒットした行だけを通過させる。

例えば、

```shell-session:
C:\>type abc.txt
abc
123
aabc
C:\>StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalCharset SHIFT_JIS -LocalInputFile abc.txt -RegularExpressionMatch aa+
aabc
```

---
### 「-RegularExpressionReplace」オプション

`-RegularExpressionReplace 正規表現 置換文字列`

というような正規表現と置換文字列のオプションを2つ受けて、それにヒットした部分を置換して通過させる。

例えば、

```shell-session:
C:\>type abc.txt
abc
123
aabc
C:\>StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalCharset SHIFT_JIS -LocalInputFile abc.txt -RegularExpressionReplace "(a+)" "zz**$1**zz"
zz**a**zzbc
123
zz**aa**zzbc
```

---
### 正規表現のリファレンス

.NET Framework標準のリファレンスは「[正規表現言語 - クイック リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference)」

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
【laravel】vue.jsを導入したら、bootstrap動かなくなったよ

# はじめに

laravelにvue.jsを導入が完了し、喜んでいた最中に発生した、boostrapのモーダルが動いていない問題。


これを解決するのに詰まったので、解決策を記録致します！

#前提
## 環境
PHP 7.4.16 
Laravel  6.20.17
mysql   8.0.23
nginx 1.18.0

##コード

```app.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  <title>
    @yield('title')
  </title>
  <!-- Font Awesome -->
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css">
  <!-- Bootstrap core CSS -->
  <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
  <!-- Material Design Bootstrap -->
  <link href="https://cdnjs.cloudflare.com/ajax/libs/mdbootstrap/4.8.11/css/mdb.min.css" rel="stylesheet">
  <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
</head>

<body>
  @include('nav')
  <div id="app">
    @yield('content')
  </div>
  <script src="{{ mix('js/app.js') }}"></script>  
  <!-- JQuery -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <!-- Bootstrap tooltips -->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.4/umd/popper.min.js"></script>
  <!-- Bootstrap core JavaScript -->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
  <!-- MDB core JavaScript -->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mdbootstrap/4.8.11/js/mdb.min.js"></script>
</body>

</html>
```

```webpack.mix.js
const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js').version();

```

```app.js

import './bootstrap'
import Vue from 'vue'
import LocationTagsInput from './components/LocationTagsInput'

const app = new Vue({
  el: '#app',
  components: {
    LocationTagsInput,
  }
})
```


#解決法
`app.blade.php`から下記をコメントアウトする

```
  <!-- JQuery -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
```



## 原因
```bootstrap.js
try {
    window.Popper = require('popper.js').default;
    window.$ = window.jQuery = require('jquery');

    require('bootstrap');
} catch (e) {}

以降省略
```

上記箇所でも、jQueryを呼んでいたので、`app.blade.php`とダブルで呼び出していたことが原因でした！
SQLite 事始め

# はじめに
WSL2 の Ubuntu 20.04 LTS で SQLite を使ってみた備忘録を残しておく。目的としては[こちらの記事](https://qiita.com/ryamamoto0406/items/489e00fe693b688a4a5e)でデータ生成して、[こちらの記事](https://qiita.com/ryamamoto0406/items/ece1a064f85e7c0466aa)でcsvを作成したファイルをDBに登録し、データをいろいろと操作してみた。

DBに触るのは初めてなので、何か間違いやコメントありましたらどしどしお願いします！

# インストール
SQLite3 をインストールして、そのバージョンを確認した。

```bash
sudo apt update
sudo apt install sqlite3
sqlite3 --version
```

最後のコマンド実行時にバージョンが表示される。

```:出力
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt1
```

問題なくインストールできているよう。

# DB の作成
まず、DBファイルを作成する。

```bash
sqlite3 sample.db
```

SQLite のコンソールが立ち上がるので以下のコマンドを入力。

```sql
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .open sample.db
```

これでsample.dbが作られる。

# DB へ csv のインポート
カレントディレクトリにある data.csv をDBにインポートする。

```sql
sqlite> .mode csv
sqlite> .import data.csv data
```

これで DB 内に data というテーブルができた。

# データの確認
格納されてるデータを確認する。

```sql
sqlite> .table
data
sqlite> select * from data;
1,female,154.208284956131,47.9648481600305,O
2,male,177.885610334895,70.8362056783686,A
3,male,163.380282640745,48.2489691006596,A
--中略--
998,male,169.940812644638,75.6647407081827,O
999,female,148.482217278304,39.0562603398636,O
1000,male,176.658033371611,86.1710695602122,B
```
データが格納されてることは確認できた。テーブルの要素一覧を取得してみると、

```sql
sqlite> .schema
CREATE TABLE data(
  "" TEXT,
  "SEX" TEXT,
  "HEIGHT" TEXT,
  "WEIGHT" TEXT,
  "BLOOD" TEXT
);
```

となり全部のデータ型がTEXTになってしまっていた。これを変更したい。

#データ型の変更
いろいろ調べてみた結果、SQLite でデータ型を直接変更する方法は無い。なので、[SQliteでカラム定義変更（カラム名変更、属性変更など）を行う最短ルート暫定版](http://distorted-unchi.hatenablog.com/entry/2017/11/30/002139)を参考に、新しいテーブルを作り、そこにデータを移すという方法で実行する。新しいテーブルを作るには、

```sql
sqlite> create table tmp(
   ...> id integer,
   ...> SEX text,
   ...> HEIGHT real,
   ...> WEIGHT real,
   ...> BLOOD text);
```

と項目名とデータ型を指定する。次にテーブルをコピーする。

```sql
sqlite> insert into tmp select * from data;
```

これでコピーできたので、元データを消す。

```sql
sqlite> drop table data;
```

テーブル名を変更してテーブルの中身を確認する。

```sql
sqlite> alter table tmp rename to data;
sqlite> .schema
CREATE TABLE IF NOT EXISTS "data"(
id integer,
SEX text,
HEIGHT real,
WEIGHT real,
BLOOD text);
sqlite> select * from data;
1|female|154.208284956131|47.9648481600305|O
2|male|177.885610334895|70.8362056783686|A
3|male|163.380282640745|48.2489691006596|A
--中略--
998|male|169.940812644638|75.6647407081827|O
999|female|148.482217278304|39.0562603398636|O
1000|male|176.658033371611|86.1710695602122|B
```

変更ができている。

# おわりに
次はテーブル内の項目を条件を付けて取り出す、などの細かい操作方法も学んでいきたい。
Rails (V1::Auth::Customers::ConfirmationsController, but didn't (Zeitwerk::NameError))

## railsのプロジェクトをEc2にデプロイしたのち、`rails console -e production`を行うと次にようなエラーが

```console
[ec2-user@ip-10-0-0-93 room_backend]$ /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader/callbacks.rb:18:in `on_file_autoloaded': expected file /var/www/room_backend/app/controllers/v1/auth/customers/confirmations_controller.rb to define constant V1::Auth::Customers::ConfirmationsController, but didn't (Zeitwerk::NameError)
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb:27:in `block in require'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb:26:in `tap'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb:26:in `require'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:409:in `const_get'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:409:in `block (2 levels) in eager_load'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:733:in `block in ls'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:725:in `foreach'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:725:in `ls'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:404:in `block in eager_load'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:393:in `synchronize'
	from /home/ec2-user/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb:393:in `eager_load'
以下略

```

エラー名は Zeitwerk::NameError とのこと
ググってみるとスタックオーバーフローにおんなじような記事があったので処置したら治りました

https://stackoverflow.com/questions/57277351/rails-6-zeitwerknameerror-doesnt-load-class-from-module


## 解決法

```ruby:config/application.rb
class Application < Rails::Application
   config.load_defaults 6.0
   #下の一行を追加する
   config.autoloader = :classic
end
```
Kubernetes の環境を作りたい [Raspberry Pi 編 1]

[2021/3/31 追記]
32 bit のイメージで作業を進めてしまったところ Docker のインストールでどんづまったので 64 bit でやり直すことにしました。

(64 bit: aarch64)
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.9.2009/isos/aarch64/images/

(32 bit: armhfp(armv7l))
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.9.2009/isos/armhfp/
※ 以下の記事で利用したもの。

<h1> これは何? </h1>
タイトルの通り、Raspberry Pi を使った Kubernetes の環境構築の作業記録です。
解説と言えるほどのものにはならないと思うのでご注意ください。

https://www.oreilly.co.jp/books/9784873118406/

基本的には ↑ の本の Appendix にならいつつ、Raspberry Pi 4 model B/4 GB + 3 model B+ * 3 台の計 4 台で環境を構築していきたいと思います。


<h1> 調達 </h1>
Raspberry Pi 本体の調達ですが、Amazon の Raspberry Pi 販売ページを色々みてもどの商品がどのような商流で手元に届くのかいまいちよくわからなかったので、KSY 社の HP から購入しました。

https://raspberry-pi.ksyic.com/

Pi 3 model B が在庫切れだったことと、せっかくなので Pi 4 model B も触ってみたかったことから上記の構成としました。

Pi 4 model B はまずマスター ノードとして構築します。
将来的にはワーカー ノードにして、ワーカー ノードのスペックが一様でない環境のお勉強にも使えたらな、という感じです。

他に、以下を購入しました。

・Cat 6 UTP (1 m) * 4 -- 100 均で購入
・USB (type-A) to USB (micro-B/Type-C 兼用) 充電・転送ケーブル (1 m) * 4 -- 100 均で購入
・16 GB microSD * 4 -- 電気屋さんで購入 (各 870 円)
・100 BASE-TX/8 ポート スイッチング ハブ -- 電気屋さんで購入 (1600 円)

Raspberry Pi の電源供給は手持ちのケーブルやアダプタを組み合わせました。すっきりさせたい場合は USB ポート付きの電源タップなどを買うといいのかも。

<h1> ホスト OS の準備 </h1>
ホスト OS と言う呼び方が正しいのかまずわかってないんですが、Raspberry Pi を走らせる OS のことを指しています。
前述の『入門 Kubernetes』では HypriotOS (https://blog.hypriot.com/) が紹介されていますが、私は AWS のお勉強も兼ねたいという考えから CentOS7 を導入したいと思います (Amazon Linux 2 が CentOS 7 に似てると聞いて)。

ググってみると色々とうまくいったりいかなかったりするようですが、とりあえずこちらの "CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2009-sda.raw.xz" から試してみようと思います。

http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7/isos/armhfp/

microSD カードへの書き込みには Sillicon Linux 様の DD for Windows (Ver.0.9.9.8) を利用させていただきます。

https://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows#s74c46f6

うまくいくでしょうか。

結果として、4 枚の SD カードへのイメージ書き込みすべてにおいて 1 回以上の BSoD が発生しました。
エラーもまちまちで、私の環境では以下が観測されました。

IRQL_NOT_LESS_OR_EQUAL
PAGE_FAULT_IN_NONPAGED_AREA (失敗した内容: fvevol.sys)
PFN_LIST_CORRUPT

どうやら書き込み自体はできているらしく、気にしていたら Windows は使っていられないので、この事象の調査はいつか (いつ?) やることにして次に行きたいと思います。


メモ:
Surface の microSD カード スロットを使って書き込みを行いました。
1 枚目の書き込みで BSoD が起きた後、OS (Windows) を 19042.867 から 19042.870 (※) にアップデートしましたが、そのことによる挙動の変化は確認できませんでした。

(※) 噂の「印刷時に BSoD が発生することがある」という事象の修正が取り込まれた以降のバージョン。ただし、同事象発生時のエラーは APC_INDEX_MISMATCH とのこと。

https://support.microsoft.com/en-us/topic/march-18-2021-kb5001649-os-builds-19041-870-and-19042-870-out-of-band-ebbe0617-3a63-467a-aaaa-2a4c68a6de33


https://qiita.com/yosukei3108/items/eb5815bf90110625ce0a

に続く。
【Swift】遷移先のTabBarControllerを非表示にする

# どういうことか

遷移先ページの下のタブバーを非表示にしたい。

```swift:NextViewController.swift
self.tabBarController?.tabBar.isHidden = true
```

遷移先の `viewDidLoad()` にこれを書いても非表示にはなるが、なんらかの処理で遷移元に戻っても消えたままになってしまう。

## 遷移する処理に追加する

```swift:ViewController.swift
let storyboard = UIStoryboard(name: "NextViewController", bundle: nil)
let vc = storyboard.instantiateViewController(identifier: "NextViewController")

// コレ
vc.hidesBottomBarWhenPushed = true

self.navigationController?.pushViewController(vc, animated: true)
```

おわり(´・ω・｀)
ピックアップ

library(readr)

signal_list<-read_csv("./signal_list.csv")
signal_master<-read_csv("./signal_master.csv")

#対象がall
#

master<-signal_master$signal

for (list in 1:3) {
  tar<-signal_list[list,"signal"]
  tar_val<-as.character(tar)
  pick<-signal_master[signal_master$signal==tar_val,]
  
  pick_dem<-pick[,"dem"]
  pick_dem_val<-as.character(pick_dem)
  
  #条件にあった場合優先度を下げる
  pick_dem_val
  pri_val<-signal_list[list,"pri"]-1
  signal_list[list,"pri"]<-pri_val
  
}
Visual Studio 2017 で Assembly が不足しているのを解決する方法

## 現象

vs2015 Express や vs2019 Community ではビルドできるプロジェクトを
vs2017 WDExpress で開くと、以下参照が見つからない。

```go
Microsoft.Data.Tools.Components
Microsfot.Data.Tools.Schema.Sql.UnitTesting
```

![ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6173fee5-ef05-a339-d397-8a647aa26969.png)

(SSDT や NuGetしてみたが解決しなかった。)

## 解決方法 (`.csproj`から削除)

プロジェクトの`.csproj`ファイルを直接編集し、以下2行を削除し解決した。

```diff:プロジェクトの.csproj
- <Import Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' != ''" />
- <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' == ''" />
```

## 解決方法2 (NuGet)

```go
// Microsoft.Data.Tools.Components
Install-Package Microsoft.Data.Tools.Msbuild -Version 10.0.61707.210

// Microsfot.Data.Tools.Schema.Sql.UnitTesting
Install-Package Microsoft.Data.Tools.UnitTest -Version 10.0.60809
```

としたが、`Microsfot.Data.Tools.Schema.Sql.UnitTesting`のほうがバージョン不一致になったため、
`プロジェクトの.csproj`から手で削除した。

* [NuGet Gallery | Microsoft.Data.Tools.Msbuild](https://www.nuget.org/packages/Microsoft.Data.Tools.Msbuild/)
* [NuGet Gallery | Microsoft.Data.Tools.UnitTest](https://www.nuget.org/packages/Microsoft.Data.Tools.UnitTest/)


## 参考

* [データベース単体テストプロジェクトはVisualStudio2017でビルドされません-VisualStudioフィードバック](https://developercommunity.visualstudio.com/t/database-unit-test-project-does-not-build-in-visua/29842)
【Rails】Rubocopによるコード解析と修正の方法（airbnb設定）

# Rubocopとは
Ruby(Rails）のコードが、コーディング規約に則っているか解析し、修正までしてくれるgem（＝静的コード解析ツール）。
*開発現場では、コードの可読性や統一性を保つために、企業やプロジェクト単位で「コードの書き方のルール（コーディング規約）」が設けられていることが多い。

# Rubocopには様々な設定がある
Rubocopが解析する際の基準となるコーディング規約は、上述の通り、あくまで企業やプロジェクト単位で決められたルールなのでバラバラですよね。

そんな中、今回はairbnbで使用されている設定を使用します。

# 準備
1. Gemfileに以下追記 + `bundle install`

    ```ruby:Gemfile
    group :development do
    #中略
      gem 'rubocop-airbnb'
    end
    ```
2. 設定ファイルの作成
アプリケーションフォルダ配下（appと同じ階層）に、.rubocop.yml、.rubocop_airbnb.ymlを作成。

3. 設定ファイルの編集

```ruby:.rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml

#ここにはrubocopでコード解析したくないファイルやフォルダを指定
AllCops:
  Exclude:
    - 'db/**/*'
    - 'bin/*'
    - 'config/environments/*'
    - 'config/application.rb'
    - 'config/initializers/*'
    - 'config/spring.rb'
    - 'lib/tasks/*'
    - 'vendor/**/*'
    - 'path/ruby'
```
```ruby:rubocop_airbnb.yml
require:
  - rubocop-airbnb
```

# 実行
#### 1. 違反箇所の解析

`bundle exec rubocop —-require rubocop-airbnb`

#### 2. 違反箇所の修正
基本的には、検証で使用したコマンドに-aオプションをつけて、解析対象を指定すれば良いだけ。

- ファイル・フォルダ指定：`bundle exec rubocop --require rubocop-airbnb -a {解析対象ファイルorフォルダ}`

- origin/mainと差分があるファイルを指定：`bundle exec rubocop --require rubocop-airbnb -a $(git diff $(git merge-base origin/master HEAD) —diff-filter=d —name-only)`

# 最後に
-aオプションで自動修正してくれる違反は全てではありません。また、[公式ドキュメント](https://docs.rubocop.org/rubocop/usage/auto_correct.html#safe-auto-correct)でも-aは実験的オプションとありますので、使用には注意してください。
仕事がすごく早く回る方法　タスク削減して、考える時間確保しませんか？

個人タスクを減らし、リソースを確保する。メモ
楽しんであなたは進めれらているか。
カレンダーを見て。自分がどこで集中できるか打ち合わせは厳選して参加すること。

## 実現すること
・メールの最短確認、バックアップ
・残業をしない方法。
・探すのをやめる。
・タスクを断る。


## outlookメールの最短【25分削減】
メールを見たら即削除する。添付ファイルは開かない。
自動でバックアップするから、フォルダへのドラッグアンドドロップもしない。
１回メールチェックの３０分かけてたのが、5分で60通確認可。

https://diamond.jp/articles/-/216239?page=2


→フォルダの中にはなにもない。またはあとで返信するものだけがのこる。


## 残業をしない（計画をこなすだけ）
Google　Calendar　に「予定外」「ルーティン」を計画に入れること。
→できていいる人はする必要なし。

常に次やるタスクを淡々とルーティンでできるようにする、すぐメール返信ではなく区別すること。1分で返信できるものはする。3分かかるものはあとでやる。
月曜日に５日分の予定を登録。

https://note.com/shiratoriyurie/n/nb798567dc116

参考
[Notion×Googleカレンダーで叶える、人生を進めるタスク管理術](https://note.com/shiratoriyurie/n/nb798567dc116)

##探すのをやめる
資料を探すのをやめる。デスクトップには2フォルダのみ。
仕掛りフォルダ。完了フォルダ

https://note.com/jpn_atsushi/n/nf783864bf165


##タスクを断る。
基本は仕事を行うが、部署であれば業績目標。開発Tであれば納期に従いすすめる。
→そもそも仕事は決めるのが基本。緊急度と重要度で優先順位をつけること。
　あなたの時間を消費するマンが周りにいるため基本は、決めたことをやる。
　OKR。やりたかったタスク。プライベートも含めて割り当てる


##後で書く
・できるだけ考えずにルーティンでできるようにする、すぐにしない。区別する。
そのあと重要度と優先度で決める。

こころがけていること
・電話に出ない。仕掛りタスクが間に合うよう落ち着いてから折返す。
・自分のルーティンをつくる。25分ごとのタスク。5分休憩。
・タスクはすぐ着手し、30％で完成し、依頼者を巻き込むみてもらうこと→すぐレビュー依頼する。
・タスク抱えないわからないことは人に回す。仕事のボリュームを調整すること。
・アラートをあげること。
・課題を共有し、議論する。

・話し合う。衝突した場合は、自分の意見を押し通すのではなく徹底的に話し合いを行い合意する。全員とする必要はなし


## Donation
If you want to support my developments you are welcome to buy me a cup of coffee :)

BTC:14kGuL9EnXMrhSiJ3cp4Wsrp6MhAAK6eDQ
BAT:
税込から税抜を求めるには切り上げ？切り下げ？→ケースバイケースで要注意な件

4月から税込み表示が義務化され、また世のエンジニアが苦労する中、逆に税込から税抜を求めるの思った以上に苦労した話です。
一般的な小売では税込から税抜を求める状況はないと思いますが、相対取引で定価が無い場合は税込価格から決まることはザラです。

具体例として`10096円〜10099円`の間の価格でお話ししますと
10097円は÷1.1して**切り捨てた**9179円が正解です。
10099円は÷1.1して**切り上げた**9181円が正解です。

なぜなら双方とも誤って切り上げたり、切り下げると共に9180円になり、そこから税込価格を逆算すると10098円一択となってしまい元に値と矛盾するからです。ちなみに

10098円は割り切れる整数なので、切り捨て切り上げ関係なく、9180円の一択になります。
10096円は切り捨てて9178円、切り上げて9179円としてどちらでも良いのですが、それらからの税込み価格の計算は、端数の取扱次第で10095〜10097円まで幅広く解釈することができます。

これらを踏まえ実装としては、税抜価格netが最大化する按分になるceilでまず計算してみて、そこから税込の逆算が矛盾を起こす場合のみ、floorを採用する条件分岐が必要になります。
MySQLなら以下の通りです。

```sql
mysql> SELECT
    -> taxed,
    -> case when floor(ceil(taxed/1.1)*1.1)=taxed or ceil(ceil(taxed/1.1)*1.1)=taxed then ceil(taxed/1.1) else floor(taxed/1.1) end as net
    -> FROM (
    -> SELECT 10096 AS taxed UNION
    -> SELECT 10097 AS taxed UNION
    -> SELECT 10098 AS taxed UNION
    -> SELECT 10099 AS taxed
    -> ) prices;
+-------+------+
| taxed | net  |
+-------+------+
| 10096 | 9179 |
| 10097 | 9179 |
| 10098 | 9180 |
| 10099 | 9181 |
+-------+------+
4 rows in set (0.01 sec)
```

MySQLは問題ありませんでしたが、実装には浮動小数点の問題があり要注意です。
端的に以下に例示すると100円の税込みは110円のはずですが、どちらも111円になります。体感的にはもはやバグです。

```JavaScript:JavaScriptによる例

Math.ceil(100*1.1) // 111
```

```Python:pythonによる例
import math
math.ceil(100*1.1) # 111
```

このリスクに対応するため8桁以降を丸めた処理を挟んで以下のようになりました。

```Python:pythonによる例
from math import floor, ceil
{taxed: ceil(round(taxed / 1.1, 8)) if floor(round(ceil(round(taxed / 1.1, 8)) * 1.1, 8)) == taxed or ceil(round(ceil(round(taxed / 1.1, 8)) * 1.1, 8)) == taxed else floor(round(taxed / 1.1, 8)) for taxed in [10096, 10097, 10098, 10099]}
# {10096: 9179, 10097: 9179, 10098: 9180, 10099: 9181}
```

１万円までの全価格を走査して統計とったスクリプトを書いたので、貼っておきます。
価格（整数）の集合全体の８割は割った後に切り上げ切り下げどちらでも良いのですが、残り１割ずつは切り上げ限定か切り下げ限定の困ったちゃん価格なのが分かります。

```python
from math import floor, ceil
import pprint
result = {}

for taxed in range(100, 10100):
    recalc = {
        "FF": floor(round(floor(round(taxed / 1.1, 8)) * 1.1, 8)),
        "CF": floor(round(ceil(round(taxed / 1.1, 8)) * 1.1, 8)),
        "FC": ceil(round(floor(round(taxed / 1.1, 8)) * 1.1, 8)),
        "CC": ceil(round(ceil(round(taxed / 1.1, 8)) * 1.1, 8)),
    }
    key = tuple(k for k, v in recalc.items() if v == taxed)
    if len(key) == 0:
        print(taxed)
        raise
    result[key] = [*result.get(key, []), taxed]
    print(taxed, key, recalc)

pprint.pprint({k: {
    "min": min(v),
    "max": max(v),
    "len": len(v), } for k, v in result.items()})

```



税抜き価格の計算は税率で割って丸めるだけ、そんなふうに考えていた時期が俺にもありました。。。


https://www.mof.go.jp/tax_policy/summary/consumption/sougaku.html

https://www.mof.go.jp/tax_policy/summary/consumption/a_001.htm#9

https://dic.nicovideo.jp/a/%E3%81%9D%E3%82%93%E3%81%AA%E3%81%B5%E3%81%86%E3%81%AB%E8%80%83%E3%81%88%E3%81%A6%E3%81%84%E3%81%9F%E6%99%82%E6%9C%9F%E3%81%8C%E4%BF%BA%E3%81%AB%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F
listに含まれる要素で組合せを作る

リストの要素の組合せリスト作成時の備忘録_φ(･\_･

# 目的：listに含まれる要素で組合せを作る
下記のリストを例にします。

```python:
data = [0,1,2,3]
```

# 方法１：重複あり
```python:sample1.py
for i in data:
    for j in data:
        print(i, j)

# 出力結果
# 0 0
# 0 1
# 0 2
# 0 3
# 1 0
# 1 1
# 1 2
# 1 3
# 2 0
# 2 1
# 2 2
# 2 3
# 3 0
# 3 1
# 3 2
# 3 3
```

# 方法２：重複なし
```python:sample2.py
for i in data:
    for j in [x for x in data if x != i]:
        print(i, j)

# 出力結果
# 0 1
# 0 2
# 0 3
# 1 0
# 1 2
# 1 3
# 2 0
# 2 1
# 2 3
# 3 0
# 3 1
# 3 2
```

完全に自分の備忘録のため。
baserCMS用のキャッシュプラグインを作りました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/b6dda7d5-bc05-1ace-b5f1-c3ffb54618a3.png)

去年からbaserCMSの開発に関わっていますが、プラグインを一度も作ったことがないので練習を兼ねて作ってみました。

https://github.com/yama/baser_simplecache/releases
上記からダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/0d9a038a-8c2c-02cf-1e70-d4945c7472ff.png)

表示に1.2秒かかるトップページ(なんでこんなに遅いの？)が、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/f0f9432d-597b-b244-d316-41d79444a43c.png)

0.01～0.03秒くらいで表示されるようになります。静的htmlファイルとほぼ同じです。

ログイン時・投稿時はキャッシュを読まないようにしています。

https://www.google.com/search?q=%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8DGET
条件付きGETにも対応しており、デフォルトでONです。(setting.php)
JavaScript 文字列を配列に変換する

配列の要素がダブルクォーテーションで囲まれている場合

```javascript
let arrayStr = '["A", "B", "C"]';
let array = JSON.parse(arrayStr);
```

配列の要素がシングルクォーテーションで囲まている場合

```javascript
let arrayStr = "['A', 'B', 'C']";
let array = JSON.parse(arrayStr.replace(/'/g, '"'));
```

両方対応

```javascript
let array = arrayStr.replace(/[\[\]"' ]/g, '').split(',');
```

# 参考記事

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace
try Swift：スケジュール画面の解析

# はじめに
try Swiftのスケジュール画面を解析する。ゴールは登場するクラスの洗い出しと関連性のざっくりとした把握。

#スケジュール画面のスクリーンショット
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1228348/7dcfdbe7-a9f2-5655-b0f0-dbae74be6abb.png" width="250px" height="300px">

#スケジュール画面の構成及び構成する主なクラス
### 画面構成
[SessionTableViewCell達]
       ↑
[SessionTableViewController1, SessionTableViewController2,  SessionTableViewController3]
       ↑
ScheduleViewController
### UI部分
ScheduleViewController：スケジュール画面の母体
ButtonBarView：画面上部のバーボタン（ボタンによって画面のコンテンツが表示される）
SessionTableViewController：画面のコンテンツが表示される画面
SessionTableViewCell：スケジュールコンテンツ画面
### モデル部分
ConferenceDay：会議日付及びSession情報を含む構造体
SessionBlock：Sessionsのスタート、エンド、Session情報達
Session：Session情報
備忘録 - 変数の定義【VBA】

##文法
VBAで変数を定義するには、まず変数のデータ型を定義し、その後、その変数にデータを代入する

```vb
'変数の定義方法
Dim 変数名 As データ型
Let 変数名 = 代入したいデータ
```

Letに関しては省略してもOK


```vb
Dim 変数名 As データ型
変数名 = 代入したいデータ
```

複数の変数を定義するときは、コンマで繋げて一度にデータ型を定義できる

```vb
Dim 変数A As データ型, 変数B As データ型, 変数C As データ型

変数A = 代入したいデータ
変数B = 代入したいデータ
変数C = 代入したいデータ
```
##データ型
主なデータ型は以下の通り

Byte: 0 through 255までの整数
Integer: -32,768 through 32,767の整数
Long: -2,147,483,648 through 2,147,483,647の整数
Boolean: True / False
Double:　少数点以下を含む数字
String:文字列
Date:日時
Variant :どのデータ型でもOK（但しデータが重い）

## Setを使う場合(オブジェクト変数）
オブジェクトを変数に格納する場合は、Setを用いる

```vb
Dim 変数名 as オブジェクト 
Set 変数名 = 代入したいデータ
```

おぶｙ##文法
VBAで変数を定義するには、まず変数のデータ型を定義し、その後、その変数にデータを代入する

```vb
'変数の定義方法
Dim 変数名 As データ型
Let 変数名 = 代入したいデータ
```

Letに関しては省略してもOK


```vb
Dim 変数名 As データ型
変数名 = 代入したいデータ
```

複数の変数を定義するときは、コンマで繋げて一度にデータ型を定義できる

```vb
Dim 変数A As データ型, 変数B As データ型, 変数C As データ型

変数A = 代入したいデータ
変数B = 代入したいデータ
変数C = 代入したいデータ
```
##データ型
主なデータ型は以下の通り

Byte: 0 through 255までの整数
Integer: -2,147,483,648 through 2,147,483,647の整数
Long: -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807の整数
Boolean: True / False
Double:　少数を含む数字
String:文字列
Date:日時
Variant :どのデータ型でもOK（但しデータが重い）

##データ型備考

データ型を定義しなかった場合、データ型はVariantになる。

```vb
Dim 変数名 
変数名 = 代入したいデータ
'変数のデータ型はVariantに！
```
## Setを使う場合
オブジェクトを変数に格納する場合は、値を代入する際にSetを用いる

```vb
Dim 変数名 as オブジェクト 
Set 変数名 = 代入したいデータ
```

オブジェクトとして、例えば、Workbook, Worksheet, Rangeなどが挙げられる。以下のように用いる。

```vb
Dim myRange as Range
Set myRange = Range("A1")
```

##配列の定義
配列を定義するには、変数名後にカッコを書き、その中に要素数を定義する。

```vb
Dim SchoolEntranceMonth(1 To 3) As String
    MyMonth(1) = "Jan"
    MyMonth(2) = "May"
    MyMonth(3) = "Sep"
```
##定数の定義
代入する値が変わらない（変えるべきでない）場合、Constを用いて、定数を定義することができる

```vb
Const 変数名 as データ型　= 代入したい値
```
[GitHub Actions] TOEIC試験までのカントダウンツイートを自動化

# はじめに

エンジニアをやっていると、さまざまな試験を受験する機会があります（情報処理試験、TOEICなどなど）。試験日までの残り日数を気軽に確認したいなと思い、GitHub ActionsとTwitter APIを利用して、作成して見ました。

## 1. 作成物

https://github.com/wkamuy/tweet-countdown

## 2. 利用方法

`.github/workflows/main.yml` をお好きなように、編集し利用できます。

```main.yml
name: 'tweet-coutdown'
on:
  schedule:
    - cron: '30 22 * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: |
          npm install && npm run build && npm run package
      - uses: ./
        with:
          consumer_key: ${{ secrets.TWITTER_API_KEY }}
          consumer_secret: ${{ secrets.TWITTER_API_SECRET_KEY }}
          access_token_key: ${{ secrets.TWITTER_ACCESS_TOKEN }}
          access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
          first_message: |
            🕑 カウントダウン
            📝 TOEIC試験 2021/02/28 まで
          target_date: '2021/02/28'
          last_message: |
            あと少し頑張りましょう🙋🏻🙋🏻‍♀️
            ※毎日 7:30 に更新(Github Actionsより)
            #TOEIC
            #カウントダウン
            #勉強
```

結果は以下の通り。


![tweet_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984188/eec509ca-8a01-f371-7567-da5a69910494.png)

## 3. TOEICの結果

ちなみに、結果は 705点 でした。まあ700目標だからOKです。

## 4. Javascriptアクションのテンプレート

以下に、Javascriptのtemplateが用意されています。こちらをベースに作成しました。

https://github.com/actions/typescript-action

## 5. 所感

* アクションが時間通りに動かない。大体15分程度のラグがあるようです。
  * 参考/引用：[GitHub Actions のスケジュール実行はスケジュール通りには動いてくれないようだ
](https://qiita.com/tommy_aka_jps/items/5f4fe384008ffc9fa794)
* 気軽に無料でお試しできます。
netlifyにReactプロジェクトをデプロイ

最近書いたコードはGithubにプッシュをして何かしらのツールでデプロイすることを心がけています。

折角毎日朝起きてコードを書いているのにも関わらず、それを証明するものがTwitterしかないのは心許ないですよね。

それであれば普通に使ったことのあるGithubに草を生やし、作ったアプリは誰でも触れるようにしていきたいと思いました。

今回はGithub経由でNetlifyにデプロイしたいと思います。


#netlifyのコマンドをインストールする
まずコマンドをインストールします。

```sh
npm install -g netlify-cli
```

インストール出来たか確認するためバージョンを見ます

```sh
netlify -v
```

#Reactのプロジェクトを立ち上げる
次にデプロイするReactの準備をします。
定番の方法でやります。

```sh
npm create-react-app ~~~~~
````

それから今作ったディレクトリに移動します

```sh
cd ~~~~~
```

一応インストール出来ているか立ち上げて確認します。

```sh
npm start
```
これでReactの公式ページが見れたらここまで問題ないです。

#gitに上げる準備
ここは簡潔にまとめてしまいます。

```sh
git init
git add -A
git commit -m "first commit"
git remote add origin https://github.com/ユーザー名/プロジェクト名.git
git push -u origin master
```

これでgitへのpushは成功しました。

#netlifyでプロジェクトを立ち上げ
[ここから](https://app.netlify.com)netlifyにログイン/サインアップしてください。
githubアカウントで登録するのが楽だと思います。

ログインするとトップページの真ん中に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/119dbad9-64f2-6007-dbbe-33d9f96be78a.png)
があると思うので、ここをクリックします。

それからGithubとnetliryを連携します。

**New site from Git**をクリックした後のページに
- Github
- GitLab
- BitBuchet
の3つから連携する画面になるので今回はGithubを選択してインストールまで進めていってください。

完了したらもう一度同じ手順でGitHubでプロジェクトを立ち上げて下さい。

次は3つの中からGithubを選択するとGItHubにあるリモートリポジトリが表示されるので、先ほど作ったプロジェクト名のリポジトリを選択してください。

そしたら**Create a new site**と表示され、色々いじれる画面に遷移したと思います。

しかし今回はどこもいじらず**Deploy Site**をクリックしてください。

#完了
そしたら次の画面で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/4c6844a8-c540-5039-57e2-132197d41576.png)

このような場所があると思います。
立ち上げた直後は緑の**Published**が黄色で表示されるので緑なるまで待ちます。

緑になったら**eloquent-~~~~~.netlify.app**をクリックして下さい。

これで無事Reactのサイトを表示出来たら成功です。


# まとめ

どうでしたでしょうか？
Firebaseなどよりも簡単に立ち上げる事が出来たのではないでしょか？

少しセットアップを加えるだけでGithubに草を生やしつつプロジェクトを公開できるのでオススメです！


今後はGit操作なしでnetlifyに立ち上げたりFIrebaseで立ち上げる方法を書いていきたいと思います！

# 追記
別プロジェクトをデプロイしようとしたら``yarn build``あたりで引っかかった。ログを確認すると

```
Treating warnings as errors because process.env.CI = true.
Most CI servers set it automatically.
```
とありデプロイ出来なかった。

そのため上の1文で検索してみた所、vercelで似た感じで引っかかていた人を見つけ、それを参考にしたら1発で修正できた。

> https://masahiro.me/2021/03/treating-warnings-as-errors-because-process-env-ci-true/


同じようにnetlifyの``build command``を``yarn build``から``CI='' npm run build`` に変更したら無事にデプロイが完了した。
(SouceTree)ローカルで作成したgitリポジトリをGitHub上のリモートリポジトリと紐付ける


## 手順
1.ローカルに作業用リポジトリを作成。SouceTree上で開く。
2.(GitHub上)リモートリポジトリを新規で作成する。（紐付けの対象）
3.(SouceTree)対象のローカルリポジトリの、「設定」を選ぶ。
4.「リモート」タブを選択。
5.「追加」を選ぶ。
6.リモートの名前:の欄に「origin」と入力。URL/パス：の欄にGitHub上でコピーできるリポジトリのアドレスを入力してOKする。
7.紐付けたリモートリポジトリにプッシュする。

***
化物語の予告風デザインのホームページを作った

# はじめに
タイトルの通りです。
なんとなく思いついたのでそれっぽいデザインで作ってみました。
モバイル用の実装はしていないのでPCのみです。
コードの書き方とかディレクトリ構成とか色々適当なので分かりにくかったらすみません。
それぞれのページにダミーデータみたいなのを入れてあります。

GitHubにありますので良かったら。
[ソースコード](https://github.com/jonsumisu628/bakemonogatari-ish)

![2021-03-29-050426_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/cea3479b-ca59-f8a4-eef6-118d1ae0c884.png)
こんな感じ

# 参考
今回作ったものの中身などは特に解説はしませんので、GitHubを見てください。
ですが、制作過程で参考にしたサイトなどを紹介します。

## ブログページ関連

- マークダウンファイルをブログ記事として表示する
  - https://code-log.hatenablog.com/entry/2020/02/28/113323
- ページネーション
  - [公式ドキュメント](https://www.gatsbyjs.com/docs/adding-pagination/)
  - https://code-log.hatenablog.com/entry/2020/02/28/113323
  - https://rpf-noblog.com/2021-01-11/gatsby-awesome-pagination/
  - https://ryokatsu.dev/blog/2020/0524/
- 記事内のコードブロック
  - https://littlebylittle.work/2020/01/gatsby-syntax-highlighting/
  - https://nekoniki.com/blog/gatsby-syntax-highlight/

## CSS
- アニメーション
  - https://qiita.com/junya/items/1347238456c88f9dc43a
- 画像の色を変える際filterでの色指定でめちゃ便利だったやつ
  - https://codepen.io/sosuke/pen/Pjoqqp
- CSS Color Code
  - https://www.colordic.org/

## その他
- 画像透過
  - https://www.peko-step.com/tool/alphachannel.html
- 使用させていただいた無料画像サイト
  - https://www.silhouette-illust.com/