OmniAICreator/Qiita-1.07M huggingface dataset:
Mac USキーボードの日本語・英数字切替を左右のcommandキーのみで行う方法【karabiner】

MacのUSキーボードの日本語・英数字切替は、デフォルトではctrl+spaceキーでができるようになっています。
が、karabiner-elementsというソフトをDLすれば、左右のcommandキーのみで可能になります。
少し設定が必要なので、自分用に記録を残しておきます。


#karabiner-elementsをDL
[karabiner-elementsをDL](https://bityl.co/4Yhe)

#privacy設定を許可する

####①command+spaceでspotlight search(Mac用の検索窓)を開いてKarabiner-EventViewerと入力。

![Screen Shot 2020-11-23 at 15.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619224/dd34d122-ae33-9c3e-2510-ce3272ebbc2f.png)

####②Karabiner-EventViewerをクリックして開く

####③praivacy設定を許可。


#その後の設定方法などは、以下記事を参照
参考: [簡単！MacのUSキーボードで半角小文字の英数字に切り替えるショートカット](https://bityl.co/4Yhd)
Not Null制約とmodelのバリデーション(presence: true)の違い

マイグレーションファイルでNot Null制約をつけるのと、モデルにバリデーションを付与するのって、結局同じことやってるような気がするけど何が違うの？という疑問が湧いたので調べてみました。

####結論
分かりやすい記事をQiitaで見つけたのでご紹介させていただきます。

[【Rails】「テーブルのカラムに定義するNot Null制約」と「モデルに定義するバリデーション（presence: true）」の挙動の違い。](https://qiita.com/wonder_meet/items/fa804f0d436a29c97460)

この記事によると、

|ケース|結果|
|:--|:--|:--:|
|DB自体にNotNull制約をつける|nillを拒否(rollback)|
|モデルへのバリデーション(presence: true)|nill && 空文字(“”) を拒否(rollback)|

・・・ということのようです。要するに、NotNull制約はnilは拒否するが、空文字は拒否しないということですね。

####自分でもやってみた
######Not Null制約
参照したサイトと全く同じ結果になりますが、一応自分でもやってみます。

```migration.rb
class CreateTasks < ActiveRecord::Migration[5.2]
  def change
    create_table :tasks do |t|
      t.string :task_name, null: false
    end
  end
end
```

コンソールで実行してみると、予想通りの結果。NotNull制約に引っかかっります。

```rb
irb(main):002:0> Task.create(task_name: nil)
(中略)
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "task_name" violates not-null constraint)
```
しかし。 task_name の要素を nil ではなく空文字にしてみると。

```migration.rb
irb(main):003:0> Task.create(task_name: "")
   (0.3ms)  BEGIN
  Task Create (2.4ms)  INSERT INTO "tasks" ("task_name", "created_at", "updated_at") VALUES ($1, $2, $3） RETURNING "id"  [["task_name", ""], ["created_at", "2020-12-17 03:57:38.946999"], ["updated_at", "2020-12-17 03:57:38.946999"]]
   (4.3ms)  COMMIT
```
普通に保存できてしまいます。マイグレーションファイルのNotNull制約はnilは拒否するが、空文字は拒否しないということが確認できました。
######モデルへのバリデーション(presence: true)
今度はmodelファイルにバリデーションを付与してみます。

```model.rb
class Task < ApplicationRecord
  validates :task_name, presence: true
end
```
irb で確認すると。    

```rb
irb(main):001:0> Task.create(task_name: "")
   (0.1ms)  BEGIN
   (0.2ms)  ROLLBACK
=> #<Task id: nil, task_name: "", created_at: nil, updated_at: nil>
irb(main):002:0>
```
今度は Rollback されて保存できないようになっていました。

####公式リファレンスで調べてみる

それならmodel ファイルにバリデーションを設定するだけでいいじゃん！と思ってしまいそうになりますが、調べてみるとそういうものでもないらしい。例えばRailsチュートリアルの[こちらの記事。](https://railstutorial.jp/chapters/modeling_users?version=4.2#sec-uniqueness_validation)

以下、Railsチュートリアルからの引用になります。

>しかし、依然としてここには1つの問題が残っています。それはActive Recordはデータベースのレベルでは一意性を保証していないという問題です。具体的なシナリオを使ってその問題を説明します。

>アリスはサンプルアプリケーションにユーザー登録します。メールアドレスはalice@wonderland.comです。
アリスは誤って “Submit” を素早く2回クリックしてしまいます。そのためリクエストが2つ連続で送信されます。
次のようなことが順に発生します。リクエスト1は、検証にパスするユーザーをメモリー上に作成します。リクエスト2でも同じことが起きます。リクエスト1のユーザーが保存され、リクエスト2のユーザーも保存されます。

>この結果、一意性の検証が行われているにもかかわらず、同じメールアドレスを持つ2つのユーザーレコードが作成されてしまいます。

>上のシナリオが信じがたいもののように思えるかもしれませんが、どうか信じてください。RailsのWebサイトでは、トラフィックが多いときにこのような問題が発生する可能性があるのです (筆者もこれを理解するのに苦労しました)。幸い、解決策の実装は簡単です。実は、この問題はデータベースレベルでも一意性を強制するだけで解決します。具体的にはデータベース上のemailのカラムにインデックス (index)を追加し (コラム6.2)、そのインデックスが一意であるようにすれば解決します。

ここでの解説はメールアドレスの一意性（同じメールアドレスは２つ以上登録できない）について例を挙げて説明していますが「RailsのWebサイトでは、トラフィックが多いときにこのような問題が発生する可能性があるのです」という説明がある通り、modelファイルのバリデーションはトラフィックが多い場合にすり抜けてしまうケースがあるようです。

そうすると、万が一 Null の値が model ファイルのバリデーションをくぐり抜けても、データベース上のカラムにNot Null 制約を設定しておけば弾くことができる、ということになります。

####まとめ
・データベースでのNotNull制約はnilは拒否するが、空文字は拒否しない
・modelファイルのバリデーション設定(presence: true)はnilも空文字も拒否する
・modelファイルのバリデーションは、トラフィックが多い時に不正な値がすり抜けてしまうことがあるので、とりあえずデータベースへのNotNull制約とmodelファイルへのバリデーション設定の両方をやっておくのがベスト
アドホックテストのデータで見る性格

##はじめに
出来る人はアドホックテストで意外な不具合を発見するところを今まで見てきました。
実際に不具合でなくても、こういうテストには性格が顕れる物です。
弊社のテスト用環境に残っているアドホックテストのデータを参考に様々な性格を見ていきたいと思います。
※これは個人がこう思っているだけで実際は違うと思います。でもほら、あなたの周りにもこういう人いるでしょう。

## アドホックテストとは
ソフトウェアテストの手法の1つに、「アドホックテスト」があります。アドホックには「その場限りの」という意味があり、ソフトウェアテストにおいてはテストケースを用意しないで行うテストのことを指します。通常のテストでは発見しにくい不具合を発見したり、開発の終盤で品質を追い込んだりしたいときに有効な手法です。
参考：https://service.shiftinc.jp/service/softwaretest/test-ad-hoc/

## 勝手に分析はーじめーるよー:sunny:

### 自分の名前などの具体例で攻めてくるタイプ
**性格**
基本真面目な性格だが、うだうだ悩まず即断即決できる。
**データ例**
山田 太郎
**総評 ★★★⭐︎⭐︎**
平凡だけど、自分のテストした内容をしっかりロギング出来る、剛腕の一手。
基本にして頂点な気もするが、自分の名前ってタイピングしやすいから手癖でやってる感否めない。
もういない人の名前や、歴長い人の昔のテストデータを見て微笑ましい気持ちになれます。

### 文字数テストは任せておけタイプ
**性格**
過去にやらかしたんだろうなぁ・・・。きちんと反省し、未来に生かせる性格
**データ例**
ああああああああああああああああああああ ああああああああああああああああああああ
**総評 ★★⭐︎⭐︎⭐︎**
「あ」じゃなくても良くない！？って思ってしまう。
ダントツで「あ」が多い。「あいうえお」の進化系もあるけど大体同じ。
もう少し色々欲しいよね。って感じ。テキストエリアだとニュース記事が貼られている事とかあるよね。
全角数字で１２３４とかも結構見る気がする。

### テストであることを教えてくれるタイプ
**性格**
猪突猛進・シンプル思考の質実剛健。
**データ例**
テスト苗字 テスト名前
**総評 ★★⭐︎⭐︎⭐︎**
いっぱいいるのでどれが自分かデータみても分からなくなるパターン。
これの悪い所が、入力した値なのかモックの値なのか分からなくなる場合が過去あった。
テストもtstとかにすればそのリスクも幾分減るか。
DB見たら、ほとんどこのタイプなのでまあポピュラーではあるよね。

### 独り言が文字になっているタイプ
**性格**
優しい。メガネかけてる率高い。
**データ例**
名前　だよ
**総評 ★★⭐︎⭐︎⭐︎**
テストであることを教えてくれるタイプの亜種。しかし最後が「だよ」で終わる。「ですよ」とか「でしゅ」などのパターンもあり。「項目名 だよ」以外にも「山田 だよ」と言った具体例とのハイブリッドとか、「優勝 したよ」とかのよく分からない独り言があったりする。


###小ボケを挟んでくるタイプ
**性格**
小さな事にも楽しさを見つけられる。頭の回転が早く、周りの人を巻き込むムードメーカー。
**データ例**
おとう おかあ 
※補足:「こんにちは！○○さん！」って表記が「こんにちは！おかあさん！」
**総評 ★★★★⭐︎**
会社にも慣れてきた3年目くらいがちょうどやりがち。
こういうテストを楽しむ姿勢を見習いたい。
「ミス ハッピー」っていうテストデータ見た時はちょっと複雑な気持ちでした。

###エンジニアと言ったらこれでしょうタイプ
**性格**
性格ではなく、これは必要。
**データ例**
<script>alert('hoge')</script> <script>alert('fuga')</script>
**総評 ★★★★★**
SQLインジェクション・JavaScriptインジェクションは脅威です。
もちろんやった方がいいテストだし、これはアドホックテストではなくテスト計画に書いてやる方がいいと思います。

### 欧米タイプ
**性格**
着眼点が鋭い芸術肌。多分血液型はAB型。
**データ例**
Louis Dieudonné
**総評 ★★★★★**
グローバルな視点・フランス語が入るかどうか。そんな事考えた事ないです。
基本日本語しか入らないとは言え、word-breakで改行されずに凄まじく画面が崩れるとかあるあるです。
名前だと文字数もそうないですが、社名だと、本当にびっくりするぐらい名前が長いパターンがあるので、文字数テストは任せておけタイプと併用するのが良さそうです。

### 願望丸出しタイプ
**性格**
誰も見ていないと思って書いちゃうハラグロ・スタイル
**データ例**
肉食いたい 太郎
**総評 ★★⭐︎⭐︎⭐︎**
わかる・・・わかるよその気持ち。日時を見ると「2020−12−16 22:16:31」とか書いていると夜は辞めた方がいいんじゃないかな・・・。って思ったりする副作用付き。前後して、テスト 太郎が乱立していたりする。
動かなかったんだろうなぁきっと。

##おわりに
テストデータから色々な面が見れますよね。一緒に楽しく仕事している人の意外な面も見つかるかも知れませんね。
reload()を使ってもloggingのloggerオブジェクトにHanlderを多重登録させない

この記事は[Takumi Akashiro ひとり Advent Calendar 2020](https://qiita.com/advent-calendar/2020/takumi_akashiro "ひとり Advent Calendar 2020")の17日目の記事です。

未だにloggingの綺麗な使い方が分からねェ……って思いながら書いた記事です。
ご了承ください。

## 始めに

普通のPythonを書いているとまず、`reload`関数なんて使わないですよね。
だが、DCCツールの開発を行っているTAやデザイナーなら`reload()`を目にしたことはあるとおもいます。

(今回の記事はPython3で書くので、3系で非推奨になった`reload()`に代わって、`importlib.reload()`を使います。)

でも安易な`reload()`を使うとロガーがぶっ壊れます。

```python 
#! python3
import logging

logger= logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

sh = logging.StreamHandler()
sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

logger.addHandler(sh)

def main():
    pass
    logger.debug("test")

if __name__ == '__main__':
    main()
```

普通に使うと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/c8179843-8593-07be-25bb-6e473e099093.png)


問題ないですね。

そしてインタプリタでモジュールを`import`して`main()`を実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/f815e998-cb28-549f-a3a9-66f675ad6720.png)



これを`reload()`してから`main()`してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/48d67e70-ec42-f8c4-07b2-b3ba3572db30.png)

はい、1行多く書き出されましたね。
これは`reload()`でモジュールが再評価されるときに、再度`log.addHandler(sh)`が評価されたからです。

これを避ける為に、logger用のモジュールを分けてみます。

```python:log.py
#! python3
import logging

def __gen_logger():
    # これだとlog階層に集まってしまうので間違いですが、、
    # 時間がないので見逃してください！
    logger_ = logging.getLogger(__name__)
    logger_.setLevel(logging.DEBUG)

    sh = logging.StreamHandler()
    sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

    logger_.addHandler(sh)

    return logger_


logger = __gen_logger()


def get_logger():
    return logger

```

```python:logger_sample.py
#! python3
import log

def main():
    logger = log.get_logger()
    logger.debug("test")

if __name__ == '__main__':
    main()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/9ac335d8-e596-bcf6-205e-b82e1a23d225.png)

これで重複しなくなりましたね！

## モジュールを分割しない方法

……でも毎回、log.pyみたいなロガー用サブモジュールを作るのもな……と思っていましたが、
最近になって良い方法を見つけました。

```python
#! python3
import logging

def get_logger():
    logger_ = logging.getLogger(__name__)
    if logger_.hasHandlers() is False:
        logger_.setLevel(logging.DEBUG)

        sh = logging.StreamHandler()
        sh.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))

        logger_.addHandler(sh)

    return logger_

def main():
    logger = get_logger()
    logger.debug("test")

if __name__ == '__main__':
    main()
```

## 締め

~~安易なreload()してるスクリプト絶滅しろ~~
NoSQLってなんなん？

#とりあえずNoSQLとは

NoSQLとは、一般にNot only SQL（非リレーショナルデータベースシステム）の略称であり、DBの1つのカテゴリとして分類されます。また、DBはRDB（リレーショナルデータベース）とNoSQLに分けることができ、
RDBはSQL言語を用いてデータを書き出しや検索をするDBで、MySQLやPostgreSQLなど当てはまります。

![DataBase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608770/1ad3fab3-e7db-e318-2469-0646bfb2a34f.png)


#RDBとNoSQLの比較
##データの持ち方と参照方法
###RDB
データの構造を表形式で定義し、その構造に基づいてデータを保管したり検索したりすることができます。
SQLなどのデータベース言語を用いて、複数の表から関係のあるデータを参照するなど高度な条件でのデータを閲覧可能です。
例：MySQLやPostgreSQL
![RDBrelation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608770/97a397e1-4807-90ca-0b56-8b4b547f8430.png)

###NoSQL
一言にNoSQLと言っても、一律に同じデータ保有の仕方ではなく、何種類かの「型」に分けられます。
下記に挙げるのは一例であり、グラフ型などまだ様々な型があります。

<b>Key-Value型</b>
RDBのようなテーブルや関係性を定義せず、キーとバリューという組み合わせからなるシンプルなデータモデルです。データが増えるにつれて表が縦の方向に伸びていくイメージです。スケールアウト（＝サーバーの「台数を増やす」ことによる容量拡張）して処理を分散することで、ビックデータに対するCRUDに短い時間で応答できます。
例：RedisやRiak


<b>カラム指向型</b>
上記のキーバリュー型にカラムの概念を持たせたデータモデルです。
行に付与されたキーが複数のカラムを持つことができます。
カラム数はRDBのように固定ではなく、動的に追加していくことができます。
RDBを利用していると異質に思えるかもしれませんが、ほかの行には存在しないカラムを持つ行を作ることができます。
例：CassandraやHBase

<b>ドキュメント型</b>
JSONやXMLなどのドキュメント形式のデータをそのまま格納することができるデータベースです。
Key-Value型データベースに比べて， 階層構造など柔軟なデータ構造に対応が可能です。
1件分のデータを「ドキュメント」と呼び、個々のドキュメントのデータ構造は自由で、データを追加する都度変えることができます。リレーショナルデータベースとは違って、事前にテーブルの構造を決めておく必要がありません。（スキーマレス）
例：MongoDBやFirestore

下記の図はドキュメント型のイメージ（firebase/firestore）ですが、前述した通り、この型にはめられているわけではありません。ドキュメントごとにカラムを変えたり、データ型を変えたりすることもできます。

![NoSQLrelation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608770/fadb67b2-f80e-c50b-29e0-72bc954786ce.png)



##処理速度
###RDB
システムの特性や規模にもよりますが、強固なトランザクション処理を行うため、それほど速くはないというのが通説です。

###NoSQL
トランザクション自体が存在せず、他のプロセスと同期を取らずに読み書きが行われるため、
大量のデータを扱うサービスで参照や追加処理が主な処理である場合、高速となります。
データ構造の特性上、更新や削除処理にはそもそも向きません。

##トランザクション
###RDB
アトミック性、一貫性、分離性、および耐久性 (ACID) の特性があります。

アトミック性：トランザクションは必ず、完全に実行されるか、まったく実行されないかのいずれかになります。
一貫性：いったんトランザクションが実行されたら、データが必ずデータベーススキーマに従うことを指します。
分離性：同時発生したトランザクションが相互に独立して実行されることを指します。
耐久性：予期しないシステム障害や停電が発生しても、異常発生前の最後の状態まで復旧できることを指します。

つまり、銀行でお金を引き出す際にエラーが発生し、お金を引き出すことができなかったが、口座残高が減っている。という処理の途中で終了することはなく、途中でエラーが出たらロールバックして初期の状態に戻すことで、銀行側と顧客側どちらか一方が損をすることはないように作られた仕組みがトランザクションであり、RDBにはこの仕組みが採用されています。

###NoSQL
一方NoSQLでは基本的にはトランザクションは存在しません。
サーバーを増やし、スケーラビリティー(水平分散)することができますが、データの整合性は保証されておりません。


##じゃあ、NoSQLのデータ設計は？
・リレーションを組んでおらず、joinリクエストができないので一度にデータを取得できるようにデータを持つ
・データを重複して持つことを許容する
・データを更新する場合は重複したデータに対してそれぞれ更新リクエストをかける

どの点もRDBではNGとされる設計だと思います。NoSQLの特性上、
スピード感を持ってDBとのやりとりができるようなシンプルな設計が好まれます。


#簡単にまとめると
RDBMSはスキーマをしっかりと定義しリレーションを組むので複雑なデータに向いているが、
データ量が肥大化するとスピード感が失われてしまう。

NoSQLはスキーマを定義する必要がなく、必要なデータを自由に保存できる。
単純なデータに向いており、データが肥大化しても性能劣化が起こりづらいが、複雑なデータは苦手である。


##参考
https://www.footchantech.com/post/nosql

・https://tracpath.com/works/development/nosql_overview/
・https://qiita.com/kubocchi/items/e123cffc518c402b399b
javascriptにおけるtable操作(表示と非表示の切り替えも含む)

#1.はじめに
この記事のキモはselect要素の取得とtable要素の操作

#2.サンプルコード
htmlコード

```
　　<select id="lng" onchange="change()">
        <option id="select">選択してください</option>
        <option id="jap">日本語</option>
        <option id="eng">English</option>
        <option id="all">全て表示</option>
    </select>
    <table id = "table"> 
        <tr>
            <th>あ</th>
            <td>い</td>
            <td>う</td>
            <td>え</td>
        </tr>
        <tr>
            <th>a</th>
            <td>b</td>
            <td>c</td>
            <td>d</td>
        </tr>
    </table>
```

javascriptコード

```
function change(){
  let ta1 = document.getElementById("lng").value;
  let table = document.getElementById("table");

  var firrow = table.rows[0];
  var secrow = table.rows[1];

  switch(ta1){
    case "日本語":
      firrow.style.display = "block";
      secrow.style.display = "none";
      break; 
    case "English":
      secrow.style.display = "block";
      firrow.style.display = "none";
      break;
    case "全て表示":
      firrow.style.display = "block";
      secrow.style.display = "block";
      break;
  }
}
```

#3.プロセス
①selectの値を取得

```
let ta1 = document.getElementById("lng").value;
```

②tableの値を取得
rows[*]でテーブルの列を取得するのがキモ。
そしてそれを変数に代入する。

```
let table = document.getElementById("table");

var firrow = table.rows[0];
var secrow = table.rows[1];
```

③
selectで取得した値をswitchでふるいにかける。
なお、cssを変更してdisplay = "block"で表示して、display = "none"で非表示にするのがキモ。

```
switch(ta1){
    case "日本語":
      firrow.style.display = "block";
      secrow.style.display = "none";
      break; 
    case "English":
      secrow.style.display = "block";
      firrow.style.display = "none";
      break;
    case "全て表示":
      firrow.style.display = "block";
      secrow.style.display = "block";
      break;
  }
```

以上。
【Ruby】&. の意味。レシーバ（オブジェクト）がnilの場合にエラーを回避する方法

個人メモです。

`&.`の役割について。通常のオブジェクト（レシーバ）に対しメソッドを実行する処理の、ドットの前に`&`をつける。

##構文と役割

・`レシーバ&.メソッド`

**レシーバがnilの場合に、エラーではなくnilを返す**。


##実例

```ruby:通常の処理（エラー）
x = nil
x.length

=> NoMethodError (undefined method `length' for nil:NilClass)
```

```ruby:&.メソッド
x = nil
x&.length

=> nil
```

エラーにならず、nilを返すことができる。



##デフォルトの値をもつ処理
文字列に変換する`to_s`メソッドや、数値に変換する`to_i`メソッドはレシーバがない場合エラーではなくデフォルトの値になる。

ただし、`&.`を使うとレシーバが`nil`のときは`nil`を返す。


```ruby:通常
x = nil
x.to_s
=> ""

x.to_i
=> 0 
```

```ruby:&.
x = nil
x&.to_s
=> nil

x&.to_i
=> nil 
```


##実用
実用ベースでは、レシーバがnilになる可能性がある場合は、エラー表示ではなくnilを返し、その場合は`||`でデフォルトで設定した値を返す。

```ruby:実例1
x =nil
x&.lenght || 0

=> 0
```

```ruby:実例1
x =nil
x&.lenght ||  "nilです"

=> "nilです"
```

シンプルに例外処理っぽく書ける。
Nuxt.jsにてVuetify使用時【/css?family=Roboto:100,300,400,500,700,900&display=swap】読み込むのを止める方法

Nuxt.jsにてVuetify使用時、デフォルトの設定だと、

```
/css?family=Roboto:100,300,400,500,700,900&display=swap
```
上記のwebフォントを読み込んでしまいます。不要な時に読み込むのを止める方法です。

## nuxt.config.jsにてオプションを指定する

```nuxt.config.js
export default {
  vuetify: {
    defaultAssets: {
      font: false,
    }
  }
}

```
nuxt.config.jsにて、上記のように`defaultAssets font`を`false`に指定することで、デフォルトで読みこまれるWebフォントを無効にすることができます。

## Vuetifyのfont-family
`.v-application class`にfont-family指定することで、上書きできます。

```scss
.v-application {
  font-family: 'Hiragino Sans', 'Hiragino Kaku Gothic ProN',
    'Noto Sans Japanese', Meiryo, 'Yu Gothic Medium', sans-serif;
}
```
Windows10のタスクスケジューラでタスクが失敗したときに再起動させようと思ったが上手くいかず、、結局BATファイル内で再起動させることにした件

Windowsには、「タスクスケジューラ」という、日時を指定したり、定期的にBATファイルを動かしたりとできる便利なツールが組み込まれています。

Windows10ならば、左下の「検索」で、「タスク」と打ち込むとタスクスケジューラが候補にあがります。（※「タスクマネージャー」ではないので注意を）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/b76280f1-3f02-92c2-8b23-dbcfdae704b2.png)

こちら、１つのタスクに対して↓のように失敗したときの指定ができるようなので、それを使ってみたかったというのが事の発端でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/29bdb80a-6d8f-b321-cff7-46f14b92cc95.png)

きっと、「プログラムが失敗したとき（Exception発生時とか、Exit 1とか）に、再度実行できる」ような機能なのだと思い、いろいろ工夫してみて、結局はコレが上手く機能せずに、こうしちゃいましたーという話の共有です。

#「タスクスケジューラ」で失敗を検知して、自動で再実行してみた。（けれど、上手くいかなかった…）

私が、BATファイルで動かしたいプログラムは、Pythonです。
実験のために、以下のプログラムを作りました。

```Python:py_test03.py
import sys
 
for i in range(5):
    print(str(i + 1) + "回目 開始")
    if i == 2:
        print("エラーが発生")
        sys.exit(1)
    print(str(i + 1) + "回目 終了")
```

これで i が 2 になった際に終了コード「1」を返して、強制終了させます。
そして、そのプログラムを実行するBATファイルを↓のように書きました。

```bat:bat_test01.bat
echo off
cd /d %~dp0

echo start >> log.txt
python py_test03.py >> log.txt
echo end >> log.txt

EXIT %errorlevel%
```

これで、「log.txt」に「py_test03.py」から標準出力される文字列が出力され、何回動いたかもわかります。
さらに、最後の「EXIT %errorlevel%」で、「py_test03.py」で発生した終了コードを受け取り、BATファイルの中でも同様に終了コードを「1」で返すことができるようにしました。

タスクスケジューラで再起動の設定をしました。

|![タスク スケジューラ 2020_12_17 18_53_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/02d150c9-5984-5e99-c6af-d5a7df387439.png)|
|:-:|

|![タスク スケジューラ 2020_12_17 18_55_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/30355bc2-8480-fb79-a360-35622242677b.png)|
|:-:|

ここで定期的に実行させるプログラムを上記の「bat_test01.bat」を指定します。

|![タスク スケジューラ 2020_12_17 19_06_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/8c612b91-24bc-e1e4-9521-3b2762e9a559.png)|
|:-:|

「プロパティ」を開き、以下のように「タスクが失敗した場合の再起動の間隔」と「再起動試行の最大数」を設定

|![失敗タスクを再起動させれるかの実験 のプロパティ (ローカル コンピューター) 2020_12_17 18_57_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/f30db0ee-1a43-052b-d254-55aced939baa.png)|
|:-:|

これで、このタスクを適当な時間を指定して、実行してみたのですが、**１回しか動きません** orz

調べてて、以下のサイト見つけました。どうやら、私と同じことで悩んでるご様子です。。

[Windows7のタスクスケジューラの「タスクが失敗した場合の再起動の間隔」の失敗の定義について](https://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/windows7%e3%81%ae%e3%82%bf%e3%82%b9%e3%82%af/338fcdce-6d40-4481-ae6f-bfb4e3cd6c2e)

「タスクスケジューラ上の「失敗」とはタスクそのものが実行されなかった場合を指している可能性がある」と書かれておりました。おうふorz

#結局、BATファイルの中で再実行させるように修正しました。

以下のようにFOR文で異常な終了コードの場合には、３回までSleep３秒を入れつつ再実行するようにしてみました。

```bat:bat_test01.bat
echo off
cd /d %~dp0

SET result=0
SET count=0

:loop

if %count% neq 0 powershell sleep 3

echo start >> log.txt
python py_test03.py >> log.txt
SET result=%ERRORLEVEL%
echo end >> log.txt

SET /a count=%count%+1
echo %count%

if %result% equ 1 if %count% lss 3 goto :loop
```

これで、とりあえず、やりたかったことは達成！
( ´Д｀)=3 ﾌｩ
laravel 8 Target classが見つからない件

laravel 8が今年の9月8日にリリースされてたことを知り早速使ってみようとした矢先、予期せぬエラーに出鼻をくじかれたのでどこかの誰かのためになればと思い一応メモしておきます。

# やったこと
検証したいことがあり**route/api.php**に下記のコードを記述。

```
Route::post('/login', 'Auth\LoginController@login');
```
そして**app/Http/Controllers/Auth**配下に**LoginController.php**を配置して、loginメソッドを記述しました。念のため程度に**php artisan route:list**で設定したルーティングがきちんと認識されているか確認しようとしたらエラーが出てしまった。

# エラー内容
```
   Illuminate\Contracts\Container\BindingResolutionException 

  Target class [Auth\LoginController] does not exist.

  at vendor/laravel/framework/src/Illuminate/Container/Container.php:832
    828▕ 
    829▕         try {
    830▕             $reflector = new ReflectionClass($concrete);
    831▕         } catch (ReflectionException $e) {
  ➜ 832▕             throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
    833▕         }
    834▕ 
    835▕         // If the type is not instantiable, the developer is attempting to resolve
    836▕         // an abstract type such as an Interface or Abstract Class and there is
```
なぜかLoginControllerクラスが見つからない。。。。

# 結論
なぜか**app/Providers/RouteServiceProvider.php**で定義されているデフォルトのネームスペースがlaravel 7までコメントアウトされていなかったのにlaravel 8からコメントされるようになってただけでした。
コメントアウト外せば無事解決しました。

laravel 7

```
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';
```
https://github.com/laravel/laravel/blob/8.x/app/Providers/RouteServiceProvider.php

laravel 8

```
    /**
     * The controller namespace for the application.
     *
     * When present, controller route declarations will automatically be prefixed with this namespace.
     *
     * @var string|null
     */
    // protected $namespace = 'App\\Http\\Controllers';
```
https://github.com/laravel/laravel/blob/7.x/app/Providers/RouteServiceProvider.php
webページを更新しても Status Code:OK (from ServiceWorker) で頑固に古いバージョンが表示されるときの対処法

# 発生した現象
WordPressが使われていたサイトでNext.js によりサイトのリニューアルをした
そのときトップページだけ通常アクセスや通常リロードで古いサイトが表示された
スーパーリロードすると新しいサイトが表示された
スーパーリロード後でも通常アクセスや通常リロードで古いサイトが表示された
ブラウザのdevtoolsにはページへのアクセスに対し `Status Code:OK (from ServiceWorker) ` が表示されていた
![200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50442/e662fffd-81c6-1b93-516b-fdc3b1f736ec.png)


# 原因
旧サイトにServiceWorker（今回は /serviceWorker.js というリソース）があり、トップページやそのリソースをキャッシュし `self.addEventListener('fetch'...` でレスポンスをキャッシュに差し替える処理が書かれていた
それがブラウザに登録された状態で新サイトに置き換わり、 /serviceWorker.js がなくなって `404 (from ServiceWorker)` になった

![スクリーンショット 2020-11-13 12.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50442/c3663b88-992b-ab2a-040b-c5bc949607f0.png)

そして[ServiceWorkerの仕様](https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle?hl=ja#updates)によると

> 新しい Worker は、ステータス コードが正常でないか（たとえば 404）、解析に失敗するか、実行中にエラーをスローするか、インストール時に棄却される場合は破棄されますが、現行の Worker はアクティブなままです。

ということなので、24時間更新チェックが走ろうともキャッシュを保持して返すWorkerはアクティブなまま残ったと思われる

# 原因の原因
WordPressのThe ThorというテーマにPWA設定があり、オンになっていた
これが /serviceWorker.js を設置していた

# ダメな解決策
- Chromeの問題ドメインのサイトのデータを全削除
- Chrome devtoolsの Application > Service Workers からUnregisterする
![unreginster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50442/0b9032f4-038c-bba2-bd4c-df4ddc3a2736.png)

これらのどちらかで直るが、自分しか直らないので意味がない

# 解決策
以前あったのと同じServiceWorkerのファイルを作り、以下のように、全てのキャッシュを消してunregisterするような内容に置き換える
これにより、旧サイトにアクセスしたブラウザに登録されたServiceWorkerが新サイトにアクセスした時点で消える

```js
if (navigator.serviceWorker) {
  navigator.serviceWorker.getRegistrations().then(function (registrations) {
    for (let registration of registrations) {
      registration.unregister();
    }
  });
}

self.addEventListener('install', function (event) {
  event.waitUntil(skipWaiting());
});

self.addEventListener('activate', function (event) {
  event.waitUntil(self.clients.claim());
  event.waitUntil(
    caches.keys().then(function (cacheNames) {
      return Promise.all(
        cacheNames.map(function (cacheName) {
          return caches.delete(cacheName);
        }),
      );
    }),
  );
});
```

# 感想
- ServiceWorkerのキャッシュ強すぎだろ…。24時間チェックで404になってたらunregisterしといてくれ
- WordPressの **テーマに** PWAの設定があり、設定されていたなんて予想外だった（自分がアタリをつけれたのはwordpressプラグインまでで、同僚が見つけてくれないと分からないままだった）。WordPressってそういうこともあるんですね
- 自分自身を `404 (from ServiceWorker)` と言ってるのを見たときはちょっと面白かった

# 参考
- https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle?hl=ja
- https://kenjimorita.jp/status-code200-ok-from-servce-worker/ （とても助かった）
正規表現(基本)をまとめてみました

# はじめに
仕事で正規表現を使うことがあるんですけど、忘れては調べてを繰り返しているので、
基本的な表現を一覧でまとめてみました。
簡単かつシンプルなので、難しいことは載っていません(笑)(参考URL先に詳細な説明ありました！)
基本的なところだけサクッと知りたい方の役に立てば嬉しいです(^^)/

# 正規表現まとめ

|No|記号|意味|正規表現|検索結果例|
|:-:|:-:|---|---|---|
|1|.|任意の1文字|a.c|aac  abc  acc|
|2|*|直前の文字が0個以上|a*c|c  ac  aac  aaac|
|3|+|直前の文字が1個以上|a+c|ac  aac  aaac|
|4|?|直前の文字が0個か1個|a?c|c  ac|
|5|^|行の先頭|^ac|ac  acdb|
|6|$|行の最後|ac$|ac  dbac|
|7|｜|いずれかの文字列|ac｜db|ac  db|
|8|[ ]|いずれかの文字|[ac]|a  c|

### ★No1(.)とNo2(*)の組み合わせ
.*とすることで、任意の文字列を意味します。

|正規表現|検索結果例|
|---|---|
|a.*|a  ab  abc  abcde|

例だと、aが先頭にあればOKです。

### ★No8([ ])
[ ]の中身は全文字羅列ではなく、略して書くことができます。
[A-Z]や[0-9]はそれぞれ半角英字、半角数字を意味します。

また、
[ ]の内で先頭に^を使うと、否定の意味になります。

|正規表現|検索結果例|
|---|---|
|[^ac]|b  d  bd  bbdd|

### 試しにやってみよう
#### 例1
正規表現：[bd][^ac]

#### 例2
正規表現：[^bd][0-9]z*

#### 回答例
例1：b  bb  bd  bdbd  d  dd  db  dbdb
例2：a0  c0  a1z  c9zz

# 参考URL
・正規表現を可視化してまとめたチートシート
https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128
↑図もあって分かりやすいです。

# おわりに
最初はもうちょっと掘り下げて沢山書きこもうと考えていました。
でも投稿日も近いので、今回は基本編ってことにします。
一覧にしてみると結構頭の中入った気がします！
Photon×WebGL（5）サラリーマンに1人称カメラをつける

やりたいこと

・サラリーマンにカメラを追従させる
--
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/e327fa2a-14d9-56d7-086f-0d417bf1f948.jpeg)

--

<dl>
<dt>カメラ追従くらい簡単そうなんだけど、、、</dt>
<dd>・1つのメインカメラしかないのに</dd>
<dd>・複数のプレーヤーインスタンスがいると、</dd>
<dd>・追従するのは、大変そう</dd>
</dl>

--
##実装手順
<dl>
<dt>サラリーマンプレファブに2つのスクリプトを張り付ける</dt>

<dt>1）CameraWorkスクリプトを作成して</dt>
<dd>CameraWorkスクリプトは[6 - プレイヤーのカメラワーク]スクリプト全コピペ</dd>

<dt>2）PlayerManagerスクリプトも作成して</dt>
<dd>・PlayerManagerスクリプトは[7 - Player Networking]ページの真ん中よりちょっと上にあるカメラの制御スクリプトをコピペする</dd>
<dd>・void Start()部分だけしか書いてないけどそこだけあれば動くので大丈夫</dd>

</dl>
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/732ed532-b638-171e-d14f-bae3a95d8f71.jpeg)
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/324ee00c-082f-d4a2-6c95-da85c9dbe14c.jpeg)

いい感じになるよ。

--
[6 - プレイヤーのカメラワーク](https://doc.photonengine.com/ja-jp/pun/v2/demos-and-tutorials/pun-basics-tutorial/player-camera-work)
[7 - Player Networking](https://doc.photonengine.com/ja-jp/pun/v2/demos-and-tutorials/pun-basics-tutorial/player-networking)
※日本語のWebページが分かりやすい。外国のWebページGoogle翻訳すると分かりにくい。。

次回：チャット（日本語入力対応）（★★★）
"NO FILE"となっているマイグレーションファイルを削除したい時にやること

＜この記事について＞
自作のアプリ製作中に"rails db:migrate:status"で状況確認した所、
"NO FILE"となっているマイグレーションファイルを発見。
不要なファイルのため削除する方法を備忘録として投稿！

[環境]
・Ruby 2.6.5,
・Rails 6.0.0
・macOS

```
% rails db:migrate:status
```
ステータスを確認すると"NO FILE"と表示される

```
Status   Migration ID    Migration Name
--------------------------------------------------
up     20201201125021  Remove name from tweets
up     20201202142455  Create comments
up     20201206104547  ********** NO FILE **********
```
以下のコマンドを入力する

```
% vim db/migrate/(migration_file_id)_tmp.rb 　　*この場合"20201206104547"
class Tmp < ActiveRecord::Migration
  def change
  end
end
```
再度ステータスを確認

```
% bundle exec rake db:migrate:status
```

先ほど入力した"Tmp"に変わる

```
Status   Migration ID    Migration Name
--------------------------------------------------
up     20201201125021  Remove name from tweets
up     20201202142455  Create comments
up     20201206104547  Tmp
```
ステータスをdownに変更する

```
% bundle exec rake db:migrate:down VERSION=(migration_file_id)
```

```
Status   Migration ID    Migration Name
--------------------------------------------------
up     20201201125021  Remove name from tweets
up     20201202142455  Create comments
down     20201206104547  Tmp
```
削除する

```
% rm -rf db/migrate/20150708134153_tmp.rb 
```
最後にステータスを確認

```
% bundle exec rake db:migrate:status
```

```
Status   Migration ID    Migration Name
--------------------------------------------------
up     20201201125021  Remove name from tweets
up     20201202142455  Create comments
```

消えました！
AWS CodeBuild上でdocker pull時のエラ「You have reached your pull rate limit」をAWS ECRを使って回避する

## 初めに
本記事は Fusic Advent Calendar 2020 の18日目の記事です。


## 紹介する内容
- AWS Codebuild上でdocker pullしすぎるとでるエラを回避する方法を提案します
   - AWSのCodeBuildとECRを触った経験ある方は読みやすいと思います


## 結論
### AWS Codebuild上でECRに対してpullしてみてもし、ダメだったらDocker HubからpullしてECRにpushする
- `You have reached your pull rate limit` はdocker pullの回数制限が厳しくなったことが原因です。**pull先をECRに変えたら回数制限を気にしなくていい**ことに注目しました
   - ECRにimageかあるか？ → もしないなら、Docker Hubからpullする → Docker HubからpullされたimageのtagをECRで使う予定のtag名に変更する → ECRで使う予定のtag名に変更できたらimageをECRにpushする
   - 最初の一回だけはDocker Hubからpullします
   - 二回目からはECRにimageがあるから、Docker Hubからpullしなくてよくなります


## 紹介始めます
### まずはエラ画面です
![toomanyrequests_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/7bd03a1c-24c0-a60d-3741-37ea48510dae.png)


### Codebuildのbuildspec.yamlです
pre_buildフェーズとbuildフェーズが話したい部分です。

```
version: 0.2

phases:
  install:
    runtime-versions:
      ruby: 2.7

  # ECRへのログイン、ECRへのpushとpullに利用する変数定義
  pre_build:
    commands:
      - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
      - ECR_REPOSITORY_NAME=nomorelimit
      - WEB_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}

  # ECRに欲しいdocker image（ECR_RUBY_URI）がないなら、Docker HubからpullしてECRにpushする
  build:
    commands:
      - ECR_RUBY_URI=$WEB_URI:ruby-2.7.1-slim
      - DOCKER_RUBY_URI=ruby:2.7.1-slim
      - docker pull $ECR_RUBY_URI || (docker pull $DOCKER_RUBY_URI && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI && docker push $ECR_RUBY_URI && true)

```

### pre_buildフェーズ詳しく説明
- 1行目：ECRにログインする部分です
- 2行目、3行目：既に作られているECRのリポジトリURIを文字列で組み合わせるために取得しました
- 4行目：既に作られているECRのリポジトリURIを文字列組み合わせ完成させた変数です

### buildフェーズ詳しく説明
- 1行目：ECRで使いまわすdocker imageのtag名を含むURIを `ECR_RUBY_URI` にします
- 2行目：Docker Hubからpullするdocker imageの原本tag名を含むURIを `DOCKER_RUBY_URI` にします
- 3行目：
  - ECRからpullを試します `docker pull $ECR_RUBY_URI || …`
  - もし、ダメだったら、Docker Hubからpullします ` || (docker pull $DOCKER_RUBY_URI …)`
    - Docker Hubからpullが成功したら、そのdocker imageをECRで使い回す予定だったtag名 `$ECR_RUBY_URI` に変えます ` (… && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI …)`
    - ECRで使い回す予定でるtag名 `$ECR_RUBY_URI` をECRにpushします ` (… && docker push $ECR_RUBY_URI && true)`

## Dockerfileへの活用(ボーナス)
ECRのURIをDockerfileのFROMで動的に使えます。
dockerのARGを使って上で話した `ECR_RUBY_URI` を渡すことになります。

- CodeBuild上で実行するコマンド
`docker build --build-arg ECR_RUBY_URI=$ECR_RUBY_URI --file ファイルが/ある/パス/Dockerfile .`

- CodeBuildと連携する予定のDockerfileの中身

```
ARG ECR_RUBY_URI

FROM $ECR_RUBY_URI
# FROM ruby:2.7.1-slim

…
```
iSH を使って iOS 上で Laravel を動かす

## はじめに

[オープンロジ](https://corp.openlogi.com/)のエンジニアで @ttaka と申します。
この記事は [OPENLOGI Advent Calendar 2020](https://qiita.com/advent-calendar/2020/openlogi) の18日目になります。

さて、先日 [iSH](https://ish.app) という iOS 上で動作する Linux エミュレーターが App Store に公開され、なかなか面白そうだったので、手元の iPad mini でローカル開発環境が構築できるか試してみました。

## iSH のインストールと設定

まずは App Store から [iSH Shell](https://apps.apple.com/us/app/ish-shell/id1436902243) をインストールします。そして、起動するとこのような root でログインした状態の画面が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103088/b0c3486c-aef0-fe1b-0e92-cde5922d751d.png" width="50%" alt="iSHの起動画面">

標準キーボードの左上に、Tab/Ctrl/Esc/カーソルキーのボタンが追加され、これがあれば大抵のコマンドライン操作は困らないのと、設定ボタンから他にもカスタマイズできるので、操作性は申し分ないですね。

また、ベースは Alpine Linux で、 apk コマンドも使えるため、パッケージ管理も楽チンです。

ちなみに、このあたりで Apple とひと悶着あり、あわや App Store から削除されかけたものの、何とか回避できたらしいです :sweat_drops: 

それでは、何はなくとも Emacs をインストールしましょう。

1. リポジトリの追加 `echo "file:///ish/apk/community" >> /etc/apk/repositories`
2. リポジトリの更新 `apk update`
3. Emacs のインストール `apk add emacs`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103088/bc285277-59fb-bf3f-d53e-e925cf1fabe5.png" width="50%" alt="iSH上でのemacs起動画面">

無事 Emacs が起動しました！

ちなみに、この iSH のストレージですが、なんと iOS 側のファイルアプリからもアクセスできるので、 iOS 側のエディターで編集することもできます。便利！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103088/fd53e249-7521-be30-d9e1-44a0fde16344.png" width="50%" alt="ファイルアプリでの閲覧画面">

あと、 `/dev` を覗くと `/dev/clipboard`, `/dev/location` というデバイスがあり、 `cat /dev/location` とすると、位置情報へのアクセス許可が求められ、許可すると緯度と経度が出力されます。

また、 `echo "from iSH" > /dev/clipboard` とすれば、 iOS 側のクリップボードに送ることができ、 `cat /dev/clipboard` とすれば、 iOS 側でクリップボードにコピーした文字列が表示されます。

こういったホスト側との連携がきちんと実装されてるのは、なかなか素敵ですねー

## PHP のインストールと Laravel プロジェクトの作成

次は Laravel を動かしてみましょう。

1. PHP と composer をインストール
    - `apk add php7 composer unzip`
    - `apk add php7-dom php7-xml php7-xmlwriter php7-fileinfo php7-tokenizer php7-session`
2. [Laravel のドキュメント](https://laravel.com/docs/8.x#installation-via-composer) を参考にサンプルのプロジェクトを作成
    - `composer create-project laravel/laravel example-app`
    - エミュレーターのためか、結構時間がかかるので、のんびり待つ
3. 動作確認
    - `cd example-app`
    - `php artisan serve`
    - ブラウザで http://127.0.0.1:8000 にアクセス

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103088/a1329c07-6c7c-c10a-77d5-807926d2c059.png" width="50%" alt="Laravelの動作画面">

こちらも無事動作！あとは必要に応じて RDB などをインストールして環境を整えていけば、ローカルで開発できそうですね。

## おわりに

エミュレーターのため、やはり速度がネックにはなりそうですが、ホスト側との連携も充実してますし、なかなか面白い環境ではないでしょうか。みなさんも機会があれば、ぜひお試しくださーい。
Apple Silicon(M1)搭載MacでGatsbyJSをビルドする


# 経緯
Apple SiliconのMac上でGatsbyJSのプロジェクトをビルド&開発サーバの起動をしようとしたところ、以下のようなエラーが表示されて失敗した。

* コマンド

```sh
cd gatsby-project
yarn develop 
```

* エラー

```sh
error /Users/{current directory}/node_modules/sharp: Command failed.
Exit code: 1
Command: (node install/libvips && node install/dll-copy && prebuild-install --runtime=napi) || (node-gyp rebuild && node install/dll-copy)
Arguments:
Directory: /Users/{current directory}/node_modules/sharp
Output:
info sharp Downloading https://github.com/lovell/sharp-libvips/releases/download/v8.9.1/libvips-8.9.1-darwin-arm64v8.tar.gz
ERR! sharp Prebuilt libvips 8.9.1 binaries are not yet available for darwin-arm64v8
```

画像処理に利用されているライブラリ"libvips"のインストールに失敗しているようだったので、以下のリンクの通り実行してビルドに成功した。 
https://github.com/lovell/sharp/issues/2460

# 手順

### 1. 最新版(Apple Silicon対応)homebrewのインストール
Rosetta2を有効にせずターミナルを開き、以下のリンクの通りインストールコマンドを実行する。
(ホームディレクトリに".zshrc"が存在しない場合エラーが出るので用意しておく。/opt/への書き込み権限エラーが出る場合もあるので対応する。)
https://docs.brew.sh/Installation

```sh
cd /opt/
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
```
成功すると、".zshrc"にnvm関連のコマンドが追記される。
ターミナルを再起動する。

### 2. node.jsのインストール
以下のコマンドでlts版のnode.jsをソースからコンパイル&インストールする。

```sh
nvm install -s --lts
```
以下のコマンドでバージョンを確認する。
(本記事執筆時はバージョンv15.3.0)

```sh
nvm ls
```
### 3. パッケージのインストール
いくつかのパッケージをインストールする。

```sh
brew install pkg-config glib zlib
brew install libjpeg-turbo libpng webp
```
pkg-configのパスを.zshrcに追記し、ターミナルを再起動する。

```sh
# .zshrc

...
export PKG_CONFIG_PATH="/opt/homebrew/opt/zlib/lib/pkgconfig"
...
```

### 4. libvipsのインストール
以下のリンクから最新版のlibvips(執筆時はvips-8.10.4.tar.gz)をダウンロードする。
https://github.com/libvips/libvips/releases

tarを解凍する。

```sh
tar -zxvf vips-8.10.4.tar.gz
```
libvipsをビルドし、インストールする。

```sh
cd vips-8.10.4
./configure
make
sudo make install
```

### 5. GatsbyJS開発サーバ起動
GatsbyJSのプロジェクトディレクトリ上で開発サーバを起動する。

```sh
cd {your-gatsby-project-path}
npm run clean
npm install
npm run develop
```
はじめてのiPhoneアプリ開発・公開でつまづいたところ

# 作成したアプリ概要
世界中でプレイされているPCオンラインゲーム「League of Legends」の周辺アプリです。

内容は[こちら](https://universe.leagueoflegends.com/ja_JP/champions/)に表示されているキャラクター（以下、チャンピオン）たちの背景ストーリーを読めるというもの。
ローカルでデータを持っているので、電波が安定しない場所でもチャンピオンたちの物語を読めます。

[Legal Jibber Jabber ポリシー](https://www.riotgames.com/ja/legal)を見てもらえばわかりますが、無料で提供する限りは何やってもいいって書かれています**（過言）**。
開発会社のRIOT GAMES、太っ腹すぎます。
そりゃコミュニティが活性化しますわ。

# この記事を作るにあたって
Swift歴は今回のアプリ開発ではじめてSwiftを勉強した程度（4ヶ月くらい）。
特別英語が読めるわけではないのでReferenceを読むのも一苦労でした。

「賢者は歴史から学び、愚者は経験から学ぶ」という言葉がありますが、
まさしく自分は後者で、とりあえずやってみっか精神でリリースしてみたという感じです。

Swiftプロジェクトを作成した際に一緒に作られるファイルにいたっては、
それがどう言った役割を持っていて、どう参照されて、どう反映されるのかなどを一切勉強せずに
多分ここがこう影響してそう、といった雰囲気でアプリ開発を続けていました。
（次に作るアプリでは、これらファイルたちを詳しく調べて活用してみようかなと思ってますよ！モチロン！）

言わずもがな、そんな状況で開発を続けていたら要所要所でコケにコケまくるワケで......

Swift初学者で何もわからん状態からリリースまで、つまずいたところをメモがわりに共有します。

# アプリ開発
**ダークモードでアプリ起動**
Info.plistファイル
Appearanceの欄を追加（Keyカラムの値の右側プラスボタン）　→　ValueをDarkに。ライトモードにもできると思う。

**アプリアイコンの下に表示する名前**
Info.plistファイル
Bundle display name　→　Valueに表示したい名前を記入
![64424495ba63eba738b4317c425e4869.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952976/70a32a9b-ad4b-c406-da57-478270282289.jpeg)


他にもいろいろあったと思いますが忘れました。
Qiita開きながら開発しないとメモにならんなと反省してます。

# アプリリリース
リリースまでは下記の記事を参考に進めました。
少し違っていたところもあるけれど、おおよそ同じ流れでしたのでスムーズに進めることができました。
[個人でiOSアプリをリリースしました](https://qiita.com/prunzfrfx/items/75e38926a2673dec64c7) by @prunzfrfx

**iPhoneだけでリリースしたい**
無理でした。
iPadにはiPhone互換モードが搭載されているとのことでiPad対応はマストらしい。

自分はiPhoneだと問題なかった表示が、iPadだとUIに被ってしまっているとご指摘を受けました。
Launch Screen FileをUIViewControllerにした（デフォルトに戻した）ら全部解決しました。
そんなファイル作ってないのになんで解決されたんだ......わからん。

**アプリ内で独自の暗号方式を使用していない**
アプリ開発初心者が独自暗号方式などわかるはずもなく......
使用していないにチェックすると、Appleさんに下記のように言われました。

```
独自の暗号方式使ってないなら最初っから Info.split に
App Uses Non-Exempt Encryption : No
って追加しとけや
```

はい。すみませんでした。

**Xcode のアプリアップロード時エラー**
1回目の審査でリジェクトされたので、修正したのちに2度目のアップロードのはずが下記のようなエラーが出ました。

```
ERROR ITMS-4238: 
"Redundant Binary Upload. There already exists a binary upload with build version '1' for train '1.0'" at SoftwareAssets/PreReleaseSoftwareAsset
```

解決方法を探していたら下記の文言を見つけた。

```
「Build」のバージョンが同じバイナリが重複してアップロードされているというエラーメッセージ。
```
ということで下の画像のように、
General　→　Identity　→　Build　のナンバリングをちょいと変えてやればOK。
「1.0」から「1.1」にしました。
![2394af8e5cef0a8edcdcb36182dbaa28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952976/82f0a703-614a-1a4c-73aa-550bb6873248.png)

# 今後について
ひとまずアプリ開発・公開までを経験できてよかったと、素直に感じています。

LoLの周辺アプリを作ったからには、LoL側の更新があればすぐに対応できるように自動化とかしなきゃいけないですね。
少しでも運営を楽にできればと思います。

そういう基盤が作れたら、他のLoL周辺アプリとかも作れそうですね。楽しみだ。

徒然なるままに書きました。
以上。

（記事内容に問題ありましたらご連絡いただけると幸いです......）
ECMAとWebpackなんとかしてくれ

去年はこの３つに悩まされてました。
今日は [Node.js Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nodejs "Node.js Advent Calendar 2020")１７日目です。

#クラスとパッケージの混乱
マジにこれには苦しめられてました。
Javascriptアドベンドカレンダーにも書いたんですが流儀多すぎ。
何で書いてるかわからなくなるくらい苦しめられました。
実際Node.jsはサーバサイドでWebpackとECMAはブラウザサイトというのはわかるのですが。
クラスの書き方マジでこれに苦しめられた。
その上フレームワークとか組み込むときにどっちに組み込むんだっけと悩まされまくりました。
マジで言いたいことはJavascriptの組み込み方の統一してくれ。
#Node.jsの関係者に言いたい
正直言っていいですか。
使えるメモリ容量少なすぎて拡張しないといけないのはもうやめませんか。
１GB制限撤廃を求めたいです。
V8はたしかにいいブラウジングエンジンですが。
えぇ下限開発するときにマジにこの制限にハマって苦しむんですよ。
大半のエンジニアが。
実は俺もだったんでど。
正直V8こだわってもいいけどメモリ制限撤廃しましょう。
そうしないとサーバサイドJavascript誰もいつかなくなりますよ。
俺PHPerに戻ったんだっけｗ．
正直Webpackがメモリ要求が多くなり何度か落ちて仕事にならなかったことあります。
#マジで困るのはビルド
ほんとこれいちばん最初に困りました。
職場で経験したことなんですがBuildパターンがいっぱい有りすぎてどれを使えばいいのと悩みました。
正直言うとBuildコマンドなんて一個でいいんです。
多すぎると迷うだけになる。
これから自分たちが心がけないといけないのはなるべく少なく簡単にできる環境つくりだと思います。
あとはテストをビルド似合わせてやるとメモリ食いなのでみんなやめるようにしましょう。
ほんとこれ一番イヤです。
#スマートに行こうぜ
ほんとそう思いますわ。
いつも迷わされるのは本当に嫌だし。
そう言えばNPMとNode.jsの最新版って今Githubでしたっけ。
あとLaravelもDockerもしかもjQueryも。
GithubってMSさんでしたよね親会社。
それを理解していない開発会社多すぎです。
MSさんの最新ビルドもLaravelの最新もDockerHubも全部使えないじゃ意味がない💢。
頼みますよ。
Githubの開放願います。
いまマジ開発者困ってます。
Git使うんだったらGithub開放しなきゃだめでしょう。
Git自体の最新版も落とせません。
マジで泣きそう。

こんなところで愚痴ばかり書いてすいません。
Node.jsもJavascriptも好きなんですけどこればっかりは許せないので書いちゃいました。
ホント申し訳ない。

明日は [sena_v](https://qiita.com/sena_v "sena_v")さんです。
何を書いてくれるのかな。
【AWS】CodeGuru Reviewer 触ってみた

----------------------------------------
本記事は**[ Advent Calendar 2020 ](https://qiita.com/advent-calendar/2020/htc)**の2020/12/18分です。
※Advent Calendar 2020 へはHTCのチームメンバー5人で
毎日日替わりで投稿させていただいていますので、暇なときに覗いてください。
※HTCの紹介は[本イベント1日目の投稿](https://qiita.com/koooota/items/d5b8b036d3b6541a4f63)をご参照ください。

----------------------------------------
文系学部卒SIer新人の**かいと**です。

12/16 AWS re invent 2020 Warner Vogels Keynote にて、
**CloudShell**などの開発社用サービスのGAや新機能追加が発表されましたね。
Code系のサービスを触り始めて以来、開発者用サービスに興味がありまくる筆者です。。。

なので、個人的にはWarnerさんのKeynote以外で発表された、CodeGuruの新機能や、DevOpsGuruのGAが気になるところです。
という事で、早速その辺りを触ってみたいと思います！

と行きたいところですが、、、
そもそもCodeGuruを触ったことが無いので、新機能ではない部分から今回は触ってみました！


#Amazon CodeGuru とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/0fe6fdbd-ee16-4d42-2cca-1e81bffac1df.png)

[Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)は、機械学習を利用したデベロッパーツールで、コードの品質を向上し、アプリケーションの最もコストがかかっているコード行を特定するためのインテリジェントな推奨事項を提供します。（公式ドキュメントより引用）

簡単に言えば開発者がコーディング/管理者がソースの品質向上
を図ろうとする際にお助けしてくれるサービスという事です。

また、CodeGuruには**Profiler**と、**Reviewer**というサービスに分かれており（新機能としてSecurity Detectorが加わる）

- **Amazon CodeGuru Profiler** 
    - デベロッパーがアプリケーションの最もコストがかかっているコード行を見つけるだけでなく、特定の視覚化と、コードを改善してコストを節約する方法に関する推奨事項を提供します。

- **Amazon CodeGuru Reviewer** 
    - 機械学習を使用して、アプリケーション開発中に重大な問題や見つけにくいバグを特定し、コードの品質を向上します。

といった感じのサービスとなっております。
正直、テキストベースでは理解が進まないので、**「Now Go Build（今すぐ手を動かして作ろう）」**です！！
※「Now Go Build」はワーナーがKeynoteで毎年言う定番文句ｗ

#用意するもの
- AWSアカウント
- Java or Python のソース
- リモートリポジトリ（ローカル開発環境と繋いでるもの）
    - Bitbuket/GitHub/CodeCommit

# Amazon CodeGuru Reviewer 実践!
###Step1：リポジトリを Amazon CodeGuru Reviewer と関連付ける
私はリモートリポジトリとして、```Bitbucket```を関連付けましたが、
```CodeCommit```や```GitHub```も関連付けることができます。
※例だとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/df57fc53-acb1-5eef-a822-a5c795095e2a.png)

###Step2：コードを変更
なんでもいいですが、コードを変更してpush →プルリク。
※対応しているjava,Pythonのソースを変更しよう。jsとかhtml,cssいじっても意味ない。（下みたいに推奨なしになるよ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/2b98cba9-6d6d-b179-9cec-3b95b5d6e2a3.png)
すると、通常、pull request が作成されてから約 15 分ほどで CodeGuru Reviewer がコメントを残してくれます！
※例だとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/2639ec6c-4ffd-9a03-08b1-232082879826.png)

ちなみに、コメントに対してEmoji でリアクションしてあげると
機械学習のモデルが更に賢くなるそうなので、正しい指摘はぜひ褒めてあげてください（笑）


以上、CodeGuru Reviewer でした！

Profilerも触ってみたのですが、今回は割愛します。書くと長いのでまた今後！（しない）

# まとめ
CodeGuru Profiler/Reviewerを触ってみましたが、
・Reviewerは開発者同士で、オンタイムで開発をしながら進行していくときに、若干のヘルプとなりそう。
　例えば、アジャイルでガンガン開発→プルリク承認は開発リーダーと一緒にチームメンバーで行うなどの時かな。
・Profilerは開発メンバー/リーダーがときどきコードの品質向上図ったり、
　開発メンバーでない管理者がコードの品質担保の為に定期的にのぞきつつ、ソースの監視をする際に便利かなと思います。

・ちなみにコストは下記で、Reviewerは無料トライアルあるし、Profilerはエージェントが入ってるインスタンスごとにかかるけど、1つを1カ月プロファイルしても18000円。計画して触ったらそこまでお金かからないですね。
・Reviewer
90 日間の無料トライアル後	→　コード 100 行ごとに 0.75USD
・Profiler
毎月、プロファイリンググループごとに最初の36,000 サンプリング時間まで、1 サンプリング時間あたり 0.005USD
Android Kotlin Navgation paths

## ナビゲーションとは
`ユーザーがアプリ内のさまざまなコンテンツ間を移動する操作を指します。`
(公式引用：https://developer.android.com/guide/navigation)

---

##前提として、下記内容は実施しているとする

- Fragmentの作成

## 依存関係の宣言します

```gradle:build.gradle
dependencies {
  def nav_version = "2.3.2"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:1.0.0-alpha03"
}
```

## Resource Fileにナビゲーションを追加します

Android Resource Fileを選び、Resource typeを`nagation`を選択します。
![navgation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953777/fd1b2d27-14f5-0e7e-1cd3-88479df85ee8.png)


```xml:navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nagation">

</navigation>
```

## ナビゲーショングラフにフラグメントを追加する
今回は、Navigation Editorを使用して、追加します。

![navgation_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953777/d94b7080-4cc0-bf56-2864-04675c301249.png)

説明については、公式を参照:
https://developer.android.com/guide/navigation/navigation-getting-started?hl=ja

- [New Destination]を押下、作成していたFragmento選択

下記のようなコードができる

```xml:navigation.xml
<fragment
   android:id="@+id/testFragment"
   android:name="com.example.android.navigation.TestFragment"
   android:label="TestFragment"
   tools:layout="@layout/fragment_test" />

```

- destinationを接続する

```xml:navigation.xml
<fragment
        android:id="@+id/testFragment"
   android:name="com.example.android.navigation.TestFragment"
        android:label="fragment_test"
        tools:layout="@layout/fragment_test" >
        <action
            android:id="@+id/action_testFragment_to_testTwoFragment"
            app:destination="@id/testTwoFragment" />
    </fragment>
    <fragment
        android:id="@+id/testTwoFragment"
   android:name="com.example.android.navigation.TestTwoFragment"
        android:label="fragment_test_two"
        tools:layout="@layout/fragment_test_two" />

```

## ボタンでユーザーを別の画面に移動させる

```kotlin:Sample.kt
binding.nextButton.setOnClickListener{ view: View ->
  view.findNavController().navigate(R.id.testTwoFragment)
}
```

特定のフラグメントから次のフラグメントへ移動する場合は、if/elseで条件を定義する方法もあります。

参考サイト：
https://developer.android.com/guide/navigation?hl=ja
https://developer.android.com/guide/navigation/navigation-getting-started?hl=ja
https://developer.android.com/guide/navigation/navigation-conditional?hl=ja
「重複組合せと両替問題の公式・漸化式と母関数>有名な数列の母関数をいくつか紹介」を参考にWolframAlphaでやってみた。

(オリジナルポスト)
https://qiita.com/saikyouyaki/items/4a010b68b47445e203e8

以下抜粋。申し訳ございません。意味を理解していません。
#有名な数列の母関数をいくつか紹介

###フィボナッチ数の母関数
https://www.wolframalpha.com/input/?i=%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0%E3%81%AE%E6%AF%8D%E9%96%A2%E6%95%B0&lang=ja
出力
-z/(z^2 + z - 1)

###カタラン数の母関数
https://www.wolframalpha.com/input/?i=%E3%82%AB%E3%82%BF%E3%83%A9%E3%83%B3%E6%95%B0+%E3%81%AE%E6%AF%8D%E9%96%A2%E6%95%B0&lang=ja
出力
2/(sqrt(1 - 4 z) + 1)

###分割数の母関数
入力1:
https://www.wolframalpha.com/input/?i=%E5%88%86%E5%89%B2%E6%95%B0%E3%81%AE%E6%AF%8D%E9%96%A2%E6%95%B0&lang=ja
Wolfram|Alphaは，このクエリが理解できません．

入力2:
 Generating function　Partition function
https://www.wolframalpha.com/input/?i=+Generating+function%E3%80%80Partition+function&lang=ja
出力
(省略)
###Bell数の母関数
入力1:
ベル数の指数型母関数
https://www.wolframalpha.com/input/?i=%E3%83%99%E3%83%AB%E6%95%B0+%E6%8C%87%E6%95%B0%E5%9E%8B%E6%AF%8D%E9%96%A2%E6%95%B0&lang=ja
Wolfram|Alphaは，このクエリが理解できません．

入力2:
Generating function　Bell　number
https://www.wolframalpha.com/input/?i=+Generating+function%E3%80%80Bell%E3%80%80number&lang=ja
出力？
B_n = n! [(t - 0)^n](e^(-1 + e^t)) ( (n element Z と n>=0) のとき )
継承しないmin-heightの高さを小要素に適応させる方法

`min-height`は小要素へ継承されません。
小要素をheight:100%のようにしたい場合は、シンプルに`小要素にも同じmin-heightを設定`すればOK

サンプル

親要素にはmin-height:250pxを設定
┗左: 小要素にheight:100%
┗右: 小要素にmin-height:250px

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="nonMan21" data-slug-hash="RwGVqGY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="RwGVqGY">
  <span>See the Pen <a href="https://codepen.io/nonMan21/pen/RwGVqGY">
  RwGVqGY</a> by non Man (<a href="https://codepen.io/nonMan21">@nonMan21</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
SQL Server: 主キーが存在しないテーブルにauto incrementなIDカラムを追加して主キーにする手順

# 背景
主キーが存在しないテーブルに後からauto incrementなIDカラムを追加して主キーとするための方法を考えてみました。例えば、[変更の追跡](https://docs.microsoft.com/ja-jp/sql/relational-databases/track-changes/about-change-tracking-sql-server?view=sql-server-ver15)をテーブルに設定するためには、そのテーブルに主キーが存在する必要があります。このように、主キーが存在しない既存のテーブルに対して何らかの理由で主キーを追加したくなった場合に、どのような手順で実施するのが良いか、一例をご紹介します。

# 元テーブル
column1/column2/column3の3カラム構成の[Table]に、デフォルト制約が1つと、インデックスが1つ作成されているとします。

```sql
-- 元テーブル
CREATE TABLE [dbo].[Table]
(
    [column1] [int] NOT NULL,
    [column2] [int] NOT NULL,
    [column3] [int] NULL
) ON [PRIMARY]
GO

-- 制約
ALTER TABLE [dbo].[Table] ADD CONSTRAINT [DF_Table_column3]  DEFAULT ((0)) FOR [column3]
GO

-- インデックス
CREATE CLUSTERED INDEX [IX_Table] ON [dbo].[Table]
(
    [column1] ASC
)
GO
```

# IDカラム追加とPK化クエリ


```sql
-- 新テーブルの作成
CREATE TABLE [dbo].[Table_New]
(
    [column_id] [bigint] identity NOT NULL,
    [column1] [int] NOT NULL,
    [column2] [int] NOT NULL,
    [column3] [int] NULL
) ON [PRIMARY]
GO

-- 制約
ALTER TABLE [dbo].[Table_New] ADD CONSTRAINT [DF_Table_column3_New]  DEFAULT ((0)) FOR [column3]
GO

--ここで、[Table]へのデータ更新が一切ない状況をつくる

-- 新テーブルにデータを投入。IDカラムも自動で採番されつつINSERTされる。
INSERT INTO [Table_New] ([column1], [column2], [column3]) SELECT * FROM [Table]
GO

-- PK 作成
ALTER TABLE [dbo].[Table_New] ADD CONSTRAINT [PK_Table] PRIMARY KEY NONCLUSTERED ([column_id])
GO

-- 既存インデックス作成
CREATE CLUSTERED INDEX [IX_Table] ON [dbo].[Table_New]
(
    [column1] ASC
)
GO

-- データ確認
SELECT * FROM [Table]
EXCEPT
SELECT [column1], [column2], [column3] FROM [Table_New]

SELECT [column1], [column2], [column3] FROM [Table_New]
EXCEPT
SELECT * FROM [Table]

-- テーブルのリネーム
EXEC sp_rename N'Table',  N'Table_Old'
EXEC sp_rename N'DF_Table_column3', N'DF_Table_column3_Old'
GO
 
EXEC sp_rename N'Table_New', N'Table'
EXEC sp_rename N'DF_Table_column3_New', N'DF_Table_column3'
GO

--ここで、[Table]へのデータ更新が通常通り行われる状況に戻す

--万一何か起きた時に戻す用クエリ
/*
EXEC sp_rename N'Table',  N'Table_New'
EXEC sp_rename N'DF_Table_column3', N'DF_Table_column3_New'
GO
 
EXEC sp_rename N'Table_Old', N'Table'
EXEC sp_rename N'DF_Table_column3_Old', N'DF_Table_column3'
GO
*/
```

リネーム以外は事前にリハーサルできるので所要時間をほぼ正確に事前に見積もることもできます。

#### 注意点
データ量が多い場合はトランザクションログの容量を使い切らないように注意が必要です。（自動拡張OFFだと更新できなくなりますし、ONだと自動拡張が走ったときに一時的に更新がストップする可能性があるため）