OmniAICreator/Qiita-1.07M huggingface dataset:
Azure SQLでのSQL Server認証の無効化について【備忘録】

#SQL Server認証の無効化とは
※2019/10/19時点

Azure SQLでは以下の２つの認証方式がありますが、SQL Server認証が無効化できませんでした。
(Azure SQLにはSQL DatabaseとSQL Data Warehouseがありますが、双方をまとめてAzure SQLと記載しています。)


- SQL Server認証
- AD認証


[ベストプラクティス](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/database-best-practices#azure-active-directory-ad-authentication)ではAD認証が推奨されていますが、AD認証以外を許さないという形にはできないようです。機能要望ができますのでぜひこちらより投票ください。

[投票リンク](https://feedback.azure.com/forums/217321-sql-database/suggestions/38856790-authentication-method-when-connecting)


#補足
ちなみにオンプレのSQL Serverでは下記のようにWindows認証モードをチェックすることで、SQL Server認証を無効化できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fffe35be-7bbb-f418-c6c4-2e0793d30b73.png)
【GAS】スプレッドシートで参照元のセルにジャンプする関数を書いた(vlookupにも対応)

### Googleスプレッドシートのここが辛いよ

日頃からGoogleスプレッドシートのお世話になってて大好きな製品ですが、参照元のセルを確認したいときにショートカットがなくて辛くありませんか？

### 参照とは

正しい表現なのかわからないのですが、ここでいう `参照` とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7027/acd77c71-d7d7-86bd-7555-e98c82970854.png)

このように別シートから値を参照しているケースや、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7027/62151a1f-612a-09f3-6eb1-c7f5a1df57a1.png)

vlookupで特定のセルの値を参照しているケースを指します。
（同一シートか別シートかは問わず）

こういった参照元のセルを見たいときどうするかというと、数式を見てシート名とセルの番地やvlookupで指定した列番号を覚えたりメモをとったりせねばならずストレス。

ということでGASを書きました。
このスクリプトを実行すると以下のような動きをします。

### 地味なデモ動画

![Oct-21-2019-21-32-20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7027/201b660e-2b09-2240-323a-2dc6bc94dd64.gif)

▲ものすごく地味なデモ動画。
値を参照しているセルで関数を実行すると、となりのシートの該当セルに移動しています。

## GAS

以下のコードを、使いたい自分のスプレッドシートのスクリプトエディタにコピペすれば使えます。
値を参照しているセルを選択し関数を実行すれば、該当のセルにシュッとジャンプしてくれます。

```javascript

function JumpToCellReference() {
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var formula = sheet.getCurrentCell().getFormula()
  
  var str = "vlookup" //vlookupかどうかで処理を分ける
  if(formula.match(str)) {
    JumpToReferrerVlookup(); 
  }else{
    JumpToReferrer();
  }
}

function JumpToReferrerVlookup() {
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var formula = sheet.getCurrentCell().getFormula().replace("=vlookup(","").replace(")","").split(",");
  var vColumn = sheet.getRange(formula[1]).getColumn();
  var vKeyword = sheet.getRange(formula[0]).getValue();
  var vIndex = parseInt(formula[2]) -1;

  var vSheetName = sheet.getRange(formula[1]).getSheet().getName(); 
  var vSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(vSheetName);

  var textFinder = vSheet.createTextFinder(vKeyword);
  var ranges = textFinder.findAll();  
  var rows = [];
  var targetCol = vColumn;
  
  for (var i = 0; i < ranges.length; i++ ) { 
    var row = ranges[i].getRow(); 
    var col = ranges[i].getColumn();
    
    if(col === targetCol) {
      col = col + vIndex;
      var tagetCell = vSheet.getRange(row,col);
      tagetCell.activate();
      
      rows.push(ranges[i].getRow());
      break;
    }
  }
}


function JumpToReferrer() {
  
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var value = sheet.getCurrentCell().getFormula().replace("=","");
  var objRange = sheet.getRange(value);
  objRange.activate();

}
```

### メニューに追加しておくと便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7027/0e4a1804-093b-9c4f-4710-27dc326c8254.png)

よく使う場合はスプレッドシートのメニューにしておくと便利です。

```javascript
function onOpen() {
   var ui = SpreadsheetApp.getUi();
   var menu = ui.createMenu('関数');
   menu.addItem('参照元のセルにジャンプ', 'JumpToCellReference');
   menu.addToUi();
 }
```

### おわりに

毎日セルを参照しまくってる人はぜひお試しください。
（いったいどれくらいいるのか?）

[【GAS】以前書いた「参照元のセルにジャンプするスクリプト」をバージョンアップして vlookup()にも対応した – pplog](https://pplog.club/?p=5432) という記事を書いた後、Qiitaを使ってみたくなって、ほぼ同じ内容だけど投稿してみました。

おわり
Chocolatey で Docker Desktop 2.1.0.3 安定板をインストールする

# Chocolatey で Docker Desktop 2.1.0.3 をインストールする

タイトルの通りです。ChocolateyでDocker Desktop 2.1.0.3 をインストールしてみます。



# なぜ 2.1.0.3 ？

2019年10月21日時点で最新版（2.1.0.4-edge）をインストールしてみたところ、非常に不安定だったので、比較的安定しているらしい 2.1.0.3 をインストールします。

Chocolatey でも 2.1.0.3 のダウンロード数が最多のようです。
[Chocolatey / Docker Desktop 2.1.0.3](https://chocolatey.org/packages/docker-desktop/2.1.0.3)



# Chocolatey をインストールする
Chocolateyがインストールされていない場合は、インストールしましょう。

以下の記事がとてもわかりやすいです。
[Windows向けのパッケージ管理ソフト「chocolatey」が便利 / chocolateyのインストール](https://qiita.com/tomokin966/items/7c7f444d74a5cb7ef596#chocolatey%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

認証プロキシ配下の場合は、以下の記事がとてもわかりやすいです。
[認証プロキシ環境下でのchocolateyインストール](https://qiita.com/geotrader/items/33b5db1832bb42979ba9)



# Docker Desktop をインストールする

以下のコマンドでインストールできます。

```bash
choco install -y docker-desktop --version=2.1.0.3
```

簡単ですね！




# さいごに

以下のサイトを参考にさせていただきました。

- [Chocolatey / Docker Desktop 2.1.0.3](https://chocolatey.org/packages/docker-desktop/2.1.0.3)
- [Docker初心者がDocker Desktop for Windowsを動かそうとしてハマったところ](https://dev.classmethod.jp/server-side/docker-server-side/point-to-make-note-of-docker-desktop-for-windows/)
無料フォトグラメトラーのススメ

#まずはじめに
この記事で扱う無料フォトグラメトリソフトは
この2つです。

- [3DF Zephyr Free](https://www.3dflow.net/3df-zephyr-free/)
- [Meshroom](https://alicevision.org/#meshroom)

##VRChatで使うなら3DF Zephyr Free
VRChatに投稿できるワールドやアバターにはポリゴン数制限があるため、なるべくポリゴン数を少なくする必要があります。

###3DF Zephyr Freeの特徴
- 一度に使える写真は50枚まで
- blenderのポリゴン数削減モディファイヤが使える
- テクスチャを一つにできる

##STYLYで使うならMeshroom
STYLYにはポリゴン数制限がない(っぽい)ので、できるだけきれいなモデルを使いたいところです。
###Meshroomの特徴
- 一度に使える写真は無制限
- blenderのポリゴン数削減モディファイヤをつかうとテクスチャがおかしくなる
- テクスチャが複数になってしまう

#まとめ
フォトグラメトリは作品のリアリティを高めるのに一番簡単な方法です
うまく使ってよきフォトグラメトリライフを！
BeetleC(M5StickC)をゲームパッドで簡単に？操作する

こんにちは **だーいー** と申します！
※某会社の非公式サークル　[野良ハックチーム](https://qiita.com/yskmjp/items/cedbfd3f3980c42a8771)　で活動しています。

それはさて置き、みなさんは**BeetleC**は買いましたかー！？
M5StickCをラジコンにしてしまう例のやつです:point_up:
#1 標準のUIは操作が難しい
ただこれ、標準のUIがとても特殊で操作がメッチャ難しいんですよ。
こんな感じで直進すら困難なんです・・・:frowning2:
<IMG width="500" SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323060/b24bb7ce-357b-299f-5f9d-6b47c8f09ff5.gif">　
実はこのUIは、**スマホ**からM5StickCに URL ***htttp://192.168.4.1/ctl*** で接続すると表示されるWebのUIなんですね。
<IMG width="200" SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323060/4fc45497-a153-ccb2-a709-c68447407d76.jpeg">　これです。
このLeftやRightを指でビーっとドラッグすると対応したタイヤが動く仕組みです。
下の色の付いた四角形は、車体の下のLEDがその色で点灯します。
これ、直進させるにはLeft＋Rightを同時に同じ分上方向にドラッグしないといけないんですよ！（ありえない・・・:worried:

あとスマホからって書いたのには理由があって、PCだとブラウザが画面タッチのイベントを拾ってくれないので操作できません。
#2 HTTPのGETメソッドで操作出来る
この難しい操作を何とかしたいですよね！？
BeetleCはGitHubでソースも公開されているのでArduinoIDE等でカスタマイズしちゃえばいいんじゃない？って声も聞こえてきそうですが、標準UIがWebUIならHTTPで操作する方が簡単なんじゃないかと考えたわけです。これなら本体に手を加えなくていいですもんね。:stuck_out_tongue_winking_eye:
しかも **http://** で分かるように暗号化されてないので割と簡単です。

実際に動作を解析したところ、次のようなGETメソッドで操作が可能でした。

```
　GET /control?left=XX&right=YY&color=ZZ HTTP/1.1
　(フルURL http://192.168.4.1/control?left=XX&right=YY&color=ZZ )
```

|項目  |説明  |設定値  |
|---|---|---|
|XX  |左タイヤの回転  |前進(1～124), 後退(-1～-124)  |
|YY  |右タイヤの回転  |前進(1～124), 後退(-1～-124)  |
|ZZ  |車体下のLEDの色  |無(0), 赤(1), 緑(2), 青(3) |

他のヘッダ部分はこのようにします。(余計な物も入ってるかもしれませんが、とりあえず固定で良いです)

```
HOST: 192.168.4.1
Connection: close
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)
Accept: */*
Referer: http://192.168.4.1/ctl
Accept-Encoding: gzip, deflate

```
ちなみにURLを知っていればUI操作もいらないので例えばLED赤で速度100で直進させるなら、PCのブラウザから

```
http://192.168.4.1/control?left=100&right=100&color=1
```
 と打ち込むだけです。至ってシンプル:smiley:
#3 ゲームパッドで操作する
ブラウザからでも操作できますけど、現実的ではないので操作にゲームパッドを使いたいと思います。（たまたま家に良い感じのがありました:v:）
<IMG width="400" SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323060/2d205810-a5d1-2bf0-da53-d47adc8b160f.jpeg">
実装の仕方はボタンを押したときに、必要に応じてHTTPのGETをすれば良いだけです！
今回は、十字キーの上を押すと前進、下を押すと後退、左で左旋回、右で右旋回する様にして、Aボタン(ボタン1)はスピードアップ、Bボタン(ボタン2)はスピードダウンに割り当てました。(※十字キーを押すとHTTP GETが発行される仕組みです)
![control.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323060/c69ed1fd-d76b-a8c7-1d1a-d962591a2a16.gif)
#4 作ったアプリを配布します
簡単ですが、上に書いた内容でゲームパッドからBeetleCの制御を行うWindowsのアプリを作りましたのでGitHubで配布したいと思います。
<IMG width="300" SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323060/3424a086-56e6-4620-cebc-145cd42881a4.jpeg">
使い方は、ゲームパッドをPCに繋げてPCからBeetleCにWifiで接続後、アプリを起動して「開始」ボタンを押してください。(BeetleCは上で書いたように公式の初期アプリのままで良いです）

配布先：https://github.com/da-eee/BeetleC-Controler

良かったら使ってみてください:information_desk_person_tone1:
macOS Catalinaで、brew upgradeする時にPermission denied @ apply2files - が出た時の対処法

```
brew upgrade
```

を実行すると

```
Error: Permission denied @ apply2files - 
```

と出て、止まってしまった時の対策

```
sudo chown -R $(whoami) $(brew --prefix)/*
```

を実行すれば良い。

元ネタ
[https://gist.github.com/irazasyed/7732946](https://gist.github.com/irazasyed/7732946)
CSSで波を作ってみる

# CSSで波を作ってみる

## 揺らぐ円を描いたら、波も作ってみたくなった

__ので！！__

調べてみたところ、すでに記事があったので参考にさせていただきました。

- 参考記事
    - https://qiita.com/duka/items/c4cf7fef21d7410063cb
- 揺らぐ円を描いてみた
    - https://qiita.com/MogeTaro/items/d1d4cf5bf25eeba17c6a
自分では思いもつかない方法で感激したのですが、
これって、もしかして、海も作れるんじゃないかと思ってやってみました。

## 理想形???(結果)

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="yamaok" data-slug-hash="OJJWJRQ" 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="Wave">
  <span>See the Pen <a href="https://codepen.io/yamaok/pen/OJJWJRQ">
  Wave</a> by YamaOK (<a href="https://codepen.io/yamaok">@yamaok</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## やったこと

基本的には参考記事の通りです。
工夫したところといえば、vueで可変にしたところでしょうか。

```js
    const waves = new Vue({
        el:'#waveBack',
        data:{
            // 波の数を指定
            waveCount:28,
            // 波の動き/形を2通り指定
            features:[
                {radius:9,duration:8},
                {radius:10,duration:9},
            ],
        },
        methods: {
            // animationを動的に作成
            getCss:function(wave){
                let feature = this.features[wave % this.features.length]
                // 左から順に重ねるが、２つセットで等間隔に配置する
                let left = -10 + wave * 3 + wave%2 * 3
                return `left:${left}em;bottom:2em;border-radius:${feature.radius}em;animation-duration:${feature.duration}s`
            }
        },
    })
```
[ゼロから作るDeep Learning]損失関数 二乗和誤差をわかりやすく解説してみた

#はじめに
この記事は**ゼロから作るディープラーニング 5章ニューラルネットワークの学習**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

#二乗和誤差
二乗和誤差とは回帰問題を解くためのニューラルネットワークの性能の悪さを出したいときによく使われる損失関数です。
<img width="208" alt="スクリーンショット 2019-10-21 19.35.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/5bfdac64-bbc6-cf9d-af03-528f81ee8453.png">
予測値から正解データの値を引いた予測値と正解データの誤差を二乗して総和したものを➗２します。
<img width="704" alt="スクリーンショット 2019-10-21 20.19.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/649f4b71-559a-e197-c2fd-f0832a678b88.png">

では実際に実装してみます。

```python
#二乗和誤差実装
t = np.array([0,0,0,0,1])#正解データ
y = np.array([0.1,0.05,0.05,0.1,0.7])
def Sum_squared_error(t,y):
    s = ((y - t)**2).sum()
    return s * 0.5
Sum_squared_error(t,y)
0.057500000000000016
```

前回の記事でも解説しましたが、ニューラルネットワークの学習は損失関数の最小化を目指すので、上の例はかなり0に近い値なのですごく良いと言えます。
個人的によく忘れるgitコマンド



# 直前のコミットを取り消す
```
git reset --soft HEAD^
```
#ローカルブランチ名を変更してリモートに反映する

１　ローカルブランチ名変更

```
git branch -m <古いブランチ名> <新しいブランチ名>
```

２　リモートに反映

```
 git push origin <新しいブランチ名>
```

# 特定のブランチをクローンする

```
git clone  -b ブランチ名　https://github.com/ユーザー名/リポジトリ名.git
```

# gitで特定のコミットから新しくブランチを切る
```
git checkout (コミットハッシュを特定できるもの) -b <ブランチ名>
```
コミットハッシュのままブランチを切ると名前が肥大化してしまう

# リモートブランチ削除

```
 git push --delete origin ブランチ名
```

# ローカルブランチ削除

```
git branch -D [ブランチ名]
```
何回も調べなおすの面倒なので、どんどん追記していきます。
【駆け出しWEBエンジニアのためのメモ】ターミナルへの文字入力と表示_1（Ruby）

※TECH::EXPERTで学び始めた駆け出しエンジニアのメモです!

タイトルの通りですが、ターミナルから文字を入力し、
ターミナル上に入力した文字を表示します。

基本的な書き方から、ハッシュを用いて少し応用した書き方までを順々に記載します。


##１．　基礎的な入力と表示
まずは、以下の「gets」を使ってコードを書きます。
ちなみにここでは意図しない改行を防ぐべく、「.chomp」を追記してます。

```
a = gets.chomp #aにターミナルからなにかしら入力
b = gets.chomp #bにターミナルからなにかしら入力
c = gets.chomp #cにターミナルからなにかしら入力

puts a
puts b
puts c
```

以下の通り、「あ」「い」「う」と入力すると、「あ」「い」「う」と表示されます。

```
maedamasaterunoMacBook-Pro:desktop xxxxxxx$ Ruby sample1.rb
あ
い
う
あ
い
う
```


##２．　分かりやすくするために入力指示のコメント追記

```
puts "なにか入力してよ（1/3）"
a = gets.chomp #aにターミナルからなにかしら入力
puts "なにか入力してよ（3/3）"
b = gets.chomp #bにターミナルからなにかしら入力
puts "なにか入力してよ（3/3）"
c = gets.chomp #cにターミナルからなにかしら入力

puts a
puts b
puts c
```
そうすると、1つ目の「あ」を入力する前に「なにか入力してよ（1/3）」というコメントができました。
「い」「う」にも同様にコメントをつけました。

```
maedamasaterunoMacBook-Pro:desktop xxxxxxx$ Ruby sample1.rb
なにか入力してよ（1/3）
あ
なにか入力してよ（3/3）
い
なにか入力してよ（3/3）
う
あ
い
う
```

##3．　さらにハッシュでまとめます

```
# 空のハッシュを宣言
post = {}

# 要素の追加
puts "なにか入力してよ（1/3）"
post[:a] = gets.chomp
puts "なにか入力してよ（2/3）"
post[:b] = gets.chomp
puts "なにか入力してよ（3/3）"
post[:c] = gets.chomp

# レビューの描画
puts post #まとめて表示も可能
puts post[:a]
puts post[:b]
puts post[:c]
```
同じく、「あ」「い」「う」と入力すると、「あ」「い」「う」と表示されます。

さらに「puts post」だけにすると、
{:a=>"あ", :b=>"い", :c=>"う"}
というように、内部に格納された全てが表示されます。

```
なにか入力してよ（1/3）
あ
なにか入力してよ（2/3）
い
なにか入力してよ（3/3）
う
{:a=>"あ", :b=>"い", :c=>"う"}
あ
い
う
```

##4．　表示にもコメントしたい
このままだと、表示は「あ」「い」「う」が並ぶだけの味気ない感じで終わるので、
少しコメントを表示できるようにします。

```
# 空のハッシュを宣言
post = {}

# 要素の追加
puts "なにか入力してよ（1/3）"
post[:a] = gets.chomp
puts "なにか入力してよ（2/3）"
post[:b] = gets.chomp
puts "なにか入力してよ（3/3）"
post[:c] = gets.chomp

# レビューの描画
puts post #まとめて表示も可能です
puts "入力1つ目 : #{post[:a]}"
puts "入力2つ目 : #{post[:b]}"
puts "入力3つ目 : #{post[:c]}"
```
こちらも同じく、「あ」「い」「う」と入力すると、「あ」「い」「う」と表示されます。
が、それぞれの文字の前に「入力1つ目 :」「入力2つ目 :」「入力3つ目 :」が表示されました。
”文字　#{　式　}”　とすることで、変数と文字を組み合わせることができます。

```
なにか入力してよ（1/3）
あ
なにか入力してよ（2/3）
い
なにか入力してよ（3/3）
う
{:a=>"あ", :b=>"い", :c=>"う"}
入力1つ目 : あ
入力2つ目 : い
入力3つ目 : う
```
【Swift】クラスの継承とプロトコルの準拠の使い分け

#抽象概念の共有
各クラスや構造体に共通の抽象概念を共有する場合、クラスでは親のクラスを継承しその親の特徴を子にも共有できるようにし、プロトコルではその決まりごとを準拠して共通のルール（特徴）を他の構造体などと統一することができます。
親の特徴を受け継ぎ、子でも使えるようにするこの機能は一見同じように見えますが、実際はどのような違いがあり、どのように状況に合わせて使っていけば良いのでしょうか？？？
今回はこれについて考えていきます。

#プロトコルの準拠
Swiftの機能であるプロトコルを準拠した場合の利点について解説していきます。
まず最初にクラスで実装した際の欠点について考えていきます。

以下のコードを見て、どのあたりが問題でしょうか？

問題点は２点あります。
一つ目は、インスタンス化してはいけない親クラスのFoodがインスタンス化可能であること。
二つ目は、店ではなく自然に生えているberryクラスにもshop変数が継承されているということです。

それでは上記の2点を解決していくためにプロトコルを用いていきます。

```
class Food {
  var shop: String?
  func taste()
  func eat()
}

class Sushi : Food {
  override func eat() {
    print("dip a soy source")
  }
}

class Berry : Food {
  override func eat() {
    print("take from tree")
  }
}
```
以下のコードがプロトコルで実装したコードです。
親をプロトコルにしたため、誤ってインスタンス化される恐れがなくなりました。そして変数shopがSushiだけに準拠でき、必要のない要素を各構造体に入れずにすみました。また、Foodプロトコルを拡張しtasteメソッドを実装することで構造体に共通のメソッドの記述しなくてすみました。

```
protocol Shop {
  var shop: String { get set}
}

protocol Food {
  func taste()
  func eat()
}

extension Food {
  func taste() {print("tasty!")}
}

struct Sushi : Food, Shop {
  var shop: String
  func eat() {print("dip a soysource")}
}

struct Berry : Food {
  func eat() {print("take from tree")}
}
```

#クラスの継承
クラスの継承を用いる時は複数の型同士で同一のストアドプロパティを共有したいときに利用します。
以下のコードのように継承するクラス達が同じ持ち主（ストアドプロパティ）である場合、クラスのような参照型を利用すると、同じストアドプロパティを参照するのでこのような結果になります。

このように同じ値を共有したい場合はクラスの継承を使用するべきです。一応プロトコルでも実装可能ではありますが、複雑で冗長なコードになるので使わないのが得策です。

```
class Item {
  var owner: String? {
    didSet {
      guard let owner = owner else {return}
      print("\(owner) has a this item."
    }
  }
}

class Phone : Item {}

class Shoes : Item{}

let phone = phone
phone.owner = "Sanetugu Nekoyasiki"

//実行結果
Sanetugu Nekoyasiki has a this item.
```
【React Native入門】3-2 UIコンポーネント ListViewによるリスト表示

「React Native入門　掌田 津耶乃著」にて動作確認したコードを逐一まとめた記事です。
基本は自分用のメモですので、動作確認したい場合ご利用ください。
ある程度は1記事を更新していき、セッションが切り替わったら別記事に残していこうと思います。

目次
[ P.103〜P.117 ] ListView関連もろもろ　<font color="red">エラーになる</font>

```
Invariant Violation: ListView has been removed from React Native.See https://fb.me/nolistview for more infomation or use `deprecated-react-native-llist view` .
```

Google翻訳
不変の違反：ListViewはReact Nativeから削除されました。詳細についてはhttps://fb.me/nolistviewを参照するか、 `deprecated-react-native-llist view`を使用してください。

翻訳から今の環境からではListViewは使えないようです。
詳しい方おられましたらコメントください。
異なるドメイン間でlocalstorageを共有する方法

# はじめに
localStorageは基本的に同じドメイン内（厳密にはポート番号なども一致している必要がある）でしか有効ではありませんが、postMessage API（Web Messaging API）を使用することでクロスドメインでも共有することができます。

調べてみても古い記事が多かったり、サンプルのコードが無かったりだったので自分用の備忘録も兼ねてやり方をご紹介します。

# 構成
**【ドメインA】**
・localstorageのデータを持つ側。
・ドメインBからの要求に応じてlocalstorageの操作を行う。

**【ドメインB】**
・ドメインAに保存されているlocalstorageの値の参照や更新を要求する側。

（実際の動作確認はA側を**Github Pages**、B側を**ローカルサーバー**に置いた状態で行いました。）

# ドメインA側

ドメインB側からのメッセージをトリガーにlocalstorageの操作を行っています。
（厳密にメッセージの中身を検証して処理を切り分けたりまではしていません。）

```html:index.html
<body>
  <script>
    (function() {
      var origin = 'http://B.com';
      window.addEventListener('message', function(event) {
        // 送信元が指定のオリジンと一致していれば処理を行う
        if(event.origin === origin) {
          var message = event.data;

          // メッセージが'get'ならlocalstorageの値を返す
          if(message === 'get') {
            var storageData = localStorage.getItem('test');
            event.source.postMessage(storageData, event.origin);
          }
          // getでなければメッセージを分割してlocalstorageに保存する
          else {
            var messageArray = message.split(',');
            var key = messageArray[0];
            var value = messageArray[1];
            localStorage.setItem(key, value);
          }
        }
      });
    })();
  </script>
</body>
```

# ドメインB側
`display:none`で非表示にした`iframe`でドメインA側のindex.htmlを読み込み、`iframeObject.contentWindow`でWindowオブジェクトを取得して、それに対して`postMessage`でメッセージを送っています。


```html:index.html
<body>
  <iframe id="iframe" src="http://A.com/index.html" style="display: none;"></iframe>
  <input type="text" name="text" id="text">
  <button id="set">ストレージに値を入れる</button>
  <button id="get">ストレージの値を取得する</button>
  <script>
  (function() {
    var iframeWindow = document.querySelector('#iframe').contentWindow;
    var $text = document.querySelector('#text');
    var $setButton = document.querySelector('#set');
    var $getButton = document.querySelector('#get');
    var origin = 'http://A.com';

    window.addEventListener('message', function(event) {
      // 送信元が指定のオリジンと一致していれば処理を行う
      if(event.origin === origin) {
        alert(event.data);
      }
    });

    $setButton.addEventListener('click', function() {
      // テキストエリアに入力されている値を送信
      iframeWindow.postMessage(`test,${$text.value}`, origin);
    });

    $getButton.addEventListener('click', function() {
      // localstorageの値の取得を要求するメッセージ送信
      iframeWindow.postMessage('get', origin);
    });

  })();
  </script>
</body>
```


以上になります。
もう少しややこしいロジックが必要かと思っていましたが、postMessage APIのおかげで意外と楽にできました。
【Kotlin】Kotlin 1.4.x未満では型パラメータに対するアノテーションが機能しない【BeanValidation】

# TL;DR
内容はタイトルの通りです。
ただし、「バージョン`1.4.x`未満」としたのは暫定の表現で、実際に解決されるか、解決されるとして具体的にいつになるかなど、具体的なことは定かではありません。

# 前提
`SpringBoot`等でよく利用される`BeanValidation`は、リスト等の型パラメータ（型引数、`Type Argument`とも）に対してアノテーションを振ることで、内容に対するバリデーションが可能です[^beanvalidation]。

```java:Javaで型パラメータにアノテーションを付与したフィールドの例
private final List<@Size(max = 255, message = "{max}文字以内で入力してください。") String> hoge;
```

# 問題点
`Kotlin`で同じように書いてもバリデーションが機能しません。

```kotlin:Kotlinで型パラメータにアノテーションを付与したフィールドの例（機能しない）
private val hoge: List<@Size(max = 255, message = "{max}文字以内で入力してください。") String>
```

このことは既に`issue`になっています。

## 問題解決の目処
[KT-13228](https://youtrack.jetbrains.com/issue/KT-13228)には`Target Versions: 1.4`が指定されていますが、少なくともこの問題は3年以上放置されています。

# 参考にさせていただいた記事
- [How do we do kotlin data class validation on Collection? \- Stack Overflow](https://stackoverflow.com/questions/55870571/how-do-we-do-kotlin-data-class-validation-on-collection)
- [Java EE 8新機能解説 \-Bean Validation 2\.0編\-](https://www.slideshare.net/masatoshitada7/java-ee-8-bean-validation-20)

[^beanvalidation]: この機能がサポートされたのは`BeanValidation 2.0`から。
vbsの作法 その45

#概要

vbsの作法調べてみた。
winsock使ってみる。
httpserver作ってみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9089f281-25e7-c259-ab7b-4a98a99750a7.png)

#環境

windows7 64bit


#サンプルコード


```
Dim oWin
Dim App6
Dim Appflg
Dim html
Const LocalPort = 80
Const sckClosed = 0
Const sckOpen = 1
Const sckListening = 2
Const sckConnectionPending = 3
Const sckResolvingHost = 4
Const sckHostResolved = 5
Const sckConnecting = 6
Const sckConnected = 7
Const sckClosing = 8
Const sckError = 9

Sub App6_exit()
	Appflg = 2
End Sub

Sub App6_ok()
	Set oWin = CreateObject("OSWINSCK.Winsock")
	WScript.ConnectObject oWin, "soc_"
	oWin.LocalPort = LocalPort
	ServerListen
End Sub

Sub soc_OnConnectionRequest(requestID)
	If oWin.State <> sckClosed Then
		oWin.CloseWinsock
	End If
	oWin.Accept(requestID)
	WScript.Sleep 2000
End Sub

Sub soc_OnDataArrival(bytesTotal)
	Dim strData
	strData = ""
	oWin.GetData strData, vbString
	App6.text = strData
	oWin.SendData html
	WScript.Sleep 1000
	oWin.CloseWinsock
End Sub

Sub soc_OnError(Number, Description, SCode, Source, HelpFile, HelpContext, CancelDisplay)
	MsgBox "Server Error " & Number & vbCrLf & Description
	ServerClose()
End Sub

Sub ServerListen()
	If oWin.State <> sckClosed Then
		oWin.CloseWinsock
	End If
	oWin.Listen
End SUb

Sub ServerClose()
	If oWin.State <> sckClosed Then
		oWin.CloseWinsock
	End If
	Set oWin = Nothing
	Wscript.Quit
End SUb

Set App6 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App6, "App6_"
html = "HTTP/1.1 200 OK" & vbcrlf & "Content-Type: text/html" & vbcrlf & "Content-Length: 100" & vbcrlf & vbcrlf & "<!DOCTYPE html><html><body><h1>it's work!</h1></body></html>" & vbcrlf
App6.text = html
Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing


```

以上。
Vagrantアップデートを乗り越える

Vagrantアップデート後は大体いつも面倒くさい事になる気がします。今回もなったので備忘録。

## 環境
 Windows10 Virtualbox Vagrant CentOS7 Docker Docker-compose


## 症状1: Vagrantが起動しない
Vagrantアップデート後にvagrant up が失敗するようになり以下のエラーメッセージが出る。

```
Vagrant failed to initialize at a very early stage:

The plugins failed to initialize correctly. This may be due to manual
modifications made within the Vagrant home directory. Vagrant can
attempt to automatically correct this issue by running:

  vagrant plugin repair

If Vagrant was recently updated, this error may be due to incompatible
versions of dependencies. To fix this problem please remove and re-install
all plugins. Vagrant can attempt to do this automatically by running:

  vagrant plugin expunge --reinstall

Or you may want to try updating the installed plugins to their latest
versions:

  vagrant plugin update

Error message given during initialization: Unable to resolve dependency: user requested 'vagrant-vbguest (= 0.19.0)'
```

指示に従って`vagrant plugin repair`とかを試してみても解決しないが、プラグイン入れ直し時に

```
Installed the plugin 'vagrant-vbguest (0.20.0)'!
```

と出ているのに起動に失敗する際には

```
Error message given during initialization: Unable to resolve dependency: user requested 'vagrant-vbguest (= 0.19.0)'
```
となるので、どうもどこかで最新と指定の間でバージョンの整合性が取れてないっぽいことがわかる。

## 対処1: plugins.jsonを直す

調べてみると`./.vagrant/plugins.json`内で古い方のバージョンを指定してるっぽいのでエディタで開いてバージョンを新しい方のに書き換える。
(ちなみに最初横着して「このファイル無かったら起動時に自動で正しい奴が生成されんじゃね」と思って試したけど普通に駄目だった)

`vagrant up`して、祈る。
→ **駄目でした。**

```
default: bash: line 4:  3251 Segmentation fault      /usr/local/bin/docker-compose-1.24.1 -f "/vagrant/docker-compose.yml" up -d
```
＼( 'ᾥ' )／ ｫｧｰ

ひとまずVagrantfileのdocker-composeでプロビジョニングしてる辺りをコメントアウトしたら起動には成功するようにはなりました。
docker-composeは手動で起動するか。

## 症状2: docker-composeがセグフォ
```
>vagrant ssh
$ docker-compose up -d
Segmentation fault
```

 **とてもつらい**

どうもdocker-composeがおかしいっぽいので入れ直す

```
$ sudo yum install docker-compose
No package docker-compose available.
```
(間違えた)

```
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

```
> vagrant reload
```
→ 成功

:clap:ヤッター!:clap:
MediaRecorderは便利だけどまだちょっと辛い

ブラウザで音声や映像を記録するためのAPIとして
[MediaRecorder](https://developer.mozilla.org/ja/docs/Web/API/MediaRecorder)があります。
これを使うと、音声や映像をデバイスからサクっと取ってBlobに出来ます。

``` typescript
const media = await navigator.mediaDevices.getUserMedia({ audio: true });
      const recorder = new MediaRecorder(media);
      recorder.addEventListener('dataavailable',(event:BlobEvent) => {
        const data:Blob = event.data;
        //Blobを使った処理
      })
      recorder.start();
```

こんな感じにサクっとカメラやマイクのデータが取れます。

が、色々厳しいところがまだあります。

## typescriptの型定義が追い付いていない
実は上記のtypescriptコード、そのままだとコンパイルが通りません。
MediaRecorderやBlobEventが標準ではまだ存在していないので自分で足してやる必要があります。

## 非対応ブラウザがあるのでpolyfillが必須
上記のMDNを見ても、IEどころかEdgeが真っ赤ですし、？になっているiOSのsafariも普通にダメでした。
ついでに、この辺りのpolyfillに標準でtypescriptの型定義が付いているのがなかったので、
結局そこは自分で頑張るかanyでごまかすしかありません。
(型が付いているextendable-media-recorderというものもあったものの、こちらは逆にクロスブラウザ対応していない)

# まとめ
* 便利だけどカバーされていない部分も多いので注意
Sharematerialの意味（URL参照）

# sharematerialとは
同じマテリアルを使用しているものの設定を同時に変えることができる。
```lineObj.AddComponent<MeshRenderer>().sharedMaterial = _parent._material;```
こんな感じの使い方

同じマテリアルって言ってるけど、これだと左のマテリアルが共通化されてるのかな

正直詳細がわからないので下のリンクを参考にしてみる
[マテリアルのプロパティをスクリプトから変更【Unity】](http://kan-kikuchi.hatenablog.com/entry/Material)
MBR削除とその確認方法

SRE的に実行したコマンドは必ず結果を確認したいやーつ

```sh
# 現在のMBRを表示
dd if=/dev/sda bs=512 count=1 | hexdump -C

# Erase MBR
dd if=/dev/zero of=/dev/sda bs=512 count=1
 
# 削除後のMBRを表示
dd if=/dev/sda bs=512 count=1 | hexdump -C
```

## e.g.
```sh
# show MBR
[root@hostname:~]#  dd if=/dev/sda bs=512 count=1 | hexdump -C
1+0 records in
1+0 records out
512 bytes (512 B) copied, 8.1932e-05 s, 6.2 MB/s
00000000  eb 63 90 00 00 00 00 00  00 00 00 00 00 00 00 00  |.c..............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
省略
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
 
# erase MBR 
[root@hostname:~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 7.9788e-05 s, 6.4 MB/s
 
# show MBR
[root@hostname:~]#  dd if=/dev/sda bs=512 count=1 | hexdump -C
1+0 records in
1+0 records out
512 bytes (512 B) copied, 6.5033e-05 s, 7.9 MB/s
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
```
オセロをＶＢＡで作成　＃３石を置いた座標と石の種類をコレクションに代入

####オセロをＶＢＡで作成　＃３石を置いた座標と石の種類をコレクションに代入
今回はタイトルにもある通り石を置いた座標とどっちの色の石があるかをコレクションに代入して
その情報をメッセージで表示させたいと思います。

    Public stone_collection As New Collection   '盤面の石の状況を保存するコレクション
まずプロシージャ外でひっくり返す判定を行うのを考慮してPublic型でコレクションを宣言しました。

    'コレクションの初期化
    Set stone_collection = New Collection
最初に初期化の文を記述しておきます。これでコレクション内の要素が引き続き入り続けることはなくなります。

            '盤面情報をコレクションに保存
            With stone_collection
                .Add cell_click_row
                .Add cell_click_column
                .Add stone
            End With
石を置くコードの跡にダブルクリックした行と列の座標と置いた石の種類をコレクションに代入します。

            'コレクションに入れた要素を表示
            For Each v In stone_collection
                MsgBox v
            Next
For Each文を使ってコレクションの中身をMsgBoxで入っている要素分繰り返し表示します。
For Each文とは配列やコレクションの中身の文だけ繰り返すループ文です。

            '要素数の出力表示
            MsgBox "要素数: " & stone_collection.Count, vbInformation
要素が何個入ってるかMsgBoxで表示させてます。
![2019-10-21 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/c498dd3f-5480-94a5-55eb-088858158492.png)
![2019-10-21 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/30afdf9c-f3f9-cf96-d1de-81b6d1f72f92.png)
![2019-10-21 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/dc14f4e8-61a2-1105-64ac-af7b1a086410.png)
![2019-10-21 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/73d3d88a-3cfe-0b24-8b93-37170db366d7.png)

# まとめ
コレクションとFor Eachを初めて使ったのでこれだけの処理をするだけで結構手間取りました。
次からが本番でコレクションに保存した石の座標と色のデータを使ってひっくり返す処理を行っていきたいと思います。
RSpecのletでcreateした時に気をつけること　〜遅延評価〜


|環境||
|:-:|:-:|  
|Rails|6.0.0|  
|RSpec|3.9|  
|factory_bot|5.1.1|  

自分がプチハマりしたので備忘録も兼ねて。

RSpecを書いているとよく見る以下のようなコード。

```
before do
  @user = create(:user)
end
```
```
let(:user) { create(:user) }
```
この2つはほぼ同じ事をしています。
factoryファイルを元にDBにユーザ情報を作成、前者は@user、後者はuserという変数に代入をします。

ここだけ見ていると、letを使った方が1行で書けるし、letだけ使っていれば問題なさそうな気もします。
しかし注意しなければいけないことがあります。

以下のように、代入した変数を使わずにActive Recordにアクセスする場合、letだとエラーが発生します。

```
User.find 1

=> ActiveRecord::RecordNotFound: Couldn't find User with 'id'=1
```
これは、letが遅延評価される(代入した変数が参照されたタイミングで評価される)ために起こります。
`User.find user.id` ならエラーになりません。

遅延評価されたくない場合はletが使えないのかというと、そういうわけではありません。
遅延評価をしないlet!が用意されています。
`let!(:user) { create(:user) }` とすれば、テストを行う前(before doと同じタイミング)に実行されます。

遅延評価にも、必要のない時まで処理をしなくてすむといったメリットがありますので、適切な方を選べるようにしたいですね。
Unity メッセージのないエラーログ

# エラーメッセージのないエラー発生
先日から突然Unityで意味不明なエラーログが発生しだしかなり苦労させられたので、備忘録に残しておきます。

# 環境
Unity2018.4.2f
Mac 10.14.5

# 現象
Unityを触っていたらこのような意味不明なエラーログが４つほど発生。

<img width="1740" alt="スクリーンショット 2019-10-20 23.14.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/2f024698-5abc-c7a3-2ce1-07f08ad3de23.png">

# 試したこと

* 他のプロジェクトでも立ち上げると同じエラーが発生
* 新規プロジェクト作成するも同じエラー発生

どうやら、Unity自体に問題がありそう。。

[ここの記事](https://qiita.com/fujita06/items/95f79f81146e1a496115)を参考にUnityをクリアインストールを試すが解決せず。。


# 発見その１

昔使っていた`Unity2018.2.5`では謎のエラーは発生せず正常運転！

Unityのバージンで問題があるかもしれないと推測し、バージョンごとにテストした結果

> Unity2018.2.xx以下ではOK
> Unity2018.3.xx以上ではNG

<img width="1216" alt="スクリーンショット 2019-10-21 18.18.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/da2743f8-3889-d3fc-45a5-9364f1f91fc9.png">


Unityのバージョンで問題があるのならば、もっと大きな問題になっているはずなので、根本的にはバージョンの問題ではない気がする。


# 発見その２

Bootcampで入れたWindows10側でUnity2018.4.11をインストールして試してみると、正常運転！

やはり、Unityのバージョンが問題ではなく、MacOSとUnityの組み合わせで問題が出ている気がする。


# 解決

結局、MacOSのバージョンをMojave（10.14.5）から最新のCatalina（10.15）へアップデートすることで謎のエラーは出なくなりました。
根本的な解決ではないような気もしますが、とりあえず結果オーライということで。

<img width="562" alt="スクリーンショット 2019-10-21 18.34.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/c0cbc74f-a034-d9f0-9a89-4d122cc0c5f7.png">



# あとがき

アップデートしてソフトウェアが動かなくなることは多々ありますが、アップデートしないことで動かないという現象は初めての経験でした。

OSのアップデートは、不具合も多いのでいつもは１ヶ月ほど様子見てからにするのですが、今回のようなこともあるので、また一つ勉強になりました。

ちなみに、最近調子悪かった`Adobe Creative Cloud`もアップデート後は正常運転するようになってくれて、いろいろと問題が解決できました！！

<img width="1392" alt="スクリーンショット 2019-10-21 18.37.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/fa57152a-a822-417c-3150-f8a7004918b1.png">


# 追記（2020.11.23）

2020/11/20にUnity立ち上げると突然いまわしき無言のエラーが吐き出されるようになった。。

![スクリーンショット 2020-11-22 13.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/f6f35415-137b-c0da-fb57-df2ff46b9cf2.png)

前回同様、`Adobe Creative Cloud`も謎の不具合メッセージとともに起動しなくなった。。
ちょうどその頃、MacOSのメジャーアップデートが来ていたので、前回の教訓のもとバックアップを取ってからアップデートを行うとすべて丸っと正常運転。

### OSバージョンアップ

更新前： Catalina (10.15.7)
↓
更新後： BigSur (11.0.1)

![スクリーンショット 2020-11-22 13.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/96b8bed6-b9cb-0131-ab4b-afad77ce00c8.png)

![スクリーンショット 2020-12-04 12.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260143/55b31a1e-bc0b-95ed-8118-1119e11c114c.png)
Railsのcheck_boxにデフォルトでチェックを付ける方法

# 環境

- Rails 5.2.3 
- Ruby 2.6.5

# 失敗例

`check_box`に`{ checked: true }`をつけるとチェックは付きますが、チェックを外しても`true`がサーバに送られてしまいます。

```
<%= f.check_box :published, { checked: true }, true, false %>
```

# 成功例

controllerで`new`する時にセットします。

```ruby
def new
  @book = Book.new(published: true)
end
```

`check_box`に`{ checked: true }`は付けない。

```
<%= f.check_box :published, {}, true, false %>
```
【Unity(C#)】Emptyなオブジェクトを可視化してEdit簡略化

##Transformだけのオブジェクト
Create EmptyしたObjcetって文字通りメッシュも何もないので、
位置調整が必要なオブジェクトとして設定してしまった場合、微調整がけっこう大変ですよね。

AudioSourceだけのオブジェクトで音源の位置を変化させた場合なんかも、
視覚情報だけでデバッグしたいところです。

そこで、ギズモを描画する機能を使って編集、デバッグをしやすくします。

もうすでにきれいにまとめてくださっている方がいらっしゃったので、らくちんでした。
[UnityのGizmosを使ってシーンビューで視覚的なデバッグの補助をする](https://gametukurikata.com/customize/sceneview/gizmos)

##コード

```C#
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
/// <summary>
/// ギズモちゃん
/// </summary>
public class DrowGizmo : MonoBehaviour {

    [SerializeField]
    enum MODE
    {
        CUBE,
        WIRECUBE,
        SPHERE,
        WIRESPHERE
    }

    [SerializeField,Header("描画モード選択")]
    MODE m_mode;

    [SerializeField, Range(0,5),Header("ギズモの大きさ")]
    float m_gizmoSize = 0.3f;

    [SerializeField, Header("ギズモの色")]
    Color m_gizmoColor = new Color(1f, 0, 0, 0.3f);

    void OnDrawGizmos()
    {
        Gizmos.color = m_gizmoColor;

        Vector3 thisObjPos = this.gameObject.transform.position;
        switch (m_mode)
        {
            case MODE.CUBE:
                Gizmos.DrawCube(thisObjPos,Vector3.one*m_gizmoSize);
                break;

            case MODE.SPHERE:
                Gizmos.DrawSphere(thisObjPos, m_gizmoSize);
                break;

            case MODE.WIRECUBE:
                Gizmos.DrawWireCube(thisObjPos, Vector3.one * m_gizmoSize);
                break;

            case MODE.WIRESPHERE:
                Gizmos.DrawWireSphere(thisObjPos, m_gizmoSize);
                break;
        }

    }

    [CustomEditor(typeof(DrowGizmo))]
    public class CustomWindow : Editor
    {
        public override void OnInspectorGUI()
        {
            EditorGUILayout.BeginVertical(GUI.skin.box);
            {
                EditorGUILayout.HelpBox("ギズモでEditサポート", MessageType.Info);
            }
            EditorGUILayout.EndVertical();

            base.OnInspectorGUI();
        }
    }
}
#endif
```


上記コードをアタッチしたらギズモが表示されます。
![gizumoDemo.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/f03864bf-8522-7d0b-84d6-0d734bebc1cd.png)

##OnDrawGizmos
`OnDrawGizmos`内に書いた処理はオブジェクトを選択していなくてもされます。
基本こちらしか使わないかな～？と思います。
[Rails]migration恐怖症からの脱却

#migrationでやらかさないために
上手く動かないから一旦migrationファイルけしちゃお〜とか、
過去のmigrationファイルをいじってロールバックしたりmigrationしたりとごたごたするとか、、

するとコードの辻褄が合わなくなり、マイグレーションエラーの迷路から抜け出せなくなってしまって、戻り方わかんない、、migrationこわっってなったので今後そうならないように整理しようと思います。

# ロールバックの注意
`rails db:migrate`は最新まで一気にmigrateしますが、
`rails db:rollback`は**ひとつ前**まで戻します。

※ひとつ前とは一個前のmigration分戻すということ。(ファイル数ではない)

ですので、`rails db:rollback`した後に、
けっこう前のファイルに変更を加えて、
`rails db:migrate`ってやってしまうとのエラーになってしまうんですね。

具体的には次のような感じです。
ひとつロールバックしたのに３つ前のファイルをいじっちゃってるみたいな状態。

```
20190828061424　#変更を加えたファイル
20191021065344
----------------- #ココから下はmigration済
20191021065713 
```

この状態でmigrationしてしまうとアウトです。

## エラーになっても焦らず対処
仮に変更を加えてしまったファイルが
**20190828061424**だとしまして、

まず、今どこまでロールバックできているのかの確認！
`$ rails db:abort_if_pending_migrations`これをしてみましょう。

```
$ rails db:abort_if_pending_migrations
# => You have 1 pending migration:
  20191021065713 CreateUsersComment
```

状況はこうなります。

```
20190828061424　#変更を加えたファイル
20191021065344
----------------- #ココから下はmigration済
20191021065713 
```

どうやらあと２つ戻る必要があるみたい。
`rails db:rollback STEP=2`とやる。

一応現状でどこまでmigration済みかを確認すると

```
$ rails db:abort_if_pending_migrations
# => You have 3 pending migrations:
  20190828061424 CreateComments
  20191021065344 CreateBooksAuthors
  20191021065713 CreateUsersComment
```
**20190828061424**のファイルがmigrationしていない状態まで戻れました！
つまりこうなったと。

```
...
----------------- #ココから下はmigration済
20190828061424　#変更を加えたファイル
20191021065344
20191021065713 
```
この状態で、`rails db:migrate`すれば無事変更できる。

もう怖くない。
js/tsでimg要素(HTMLImageElement)をloadしたらPromiseを返す拡張メソッド(モンキーパッチ)を実装する


## TL;DR

```ts:monkey-patch.ts
interface HTMLImageElement {
  asyncLoad(): Promise<void>
}

// jsなら↓だけでおk
HTMLImageElement.prototype.asyncLoad = function() {
  if (this.complete) return Promise.resolve()

  return new Promise(resolve => {
    this.addEventListener("load", function callback() {
      resolve(this)
      this.removeEventListener("load", callback)
    })
  })
}
```

`if (this.complete) return Promise.resolve()`を記述しないと、読み込み済みの場合 Promise が解決されないので注意

## 概要

全ての img 要素が読み込み終わったら特定のアクションを実行するとか、`new Image()`したやつを読み込み終わるまで await したりなどでわざわざ関数書くのも面倒なんで、モンキーパッチと呼ばれるテクニックで HTMLImageElement に asyncLoad というメソッドを追加してみました。

※ [Effective JavaScript](https://www.amazon.co.jp/Effective-JavaScript-David-Herman/dp/4798131113)にやみくもなモンキーパッチは避けるべきと書いてあるので、業務で使用する場合は上の確認を取ってから実装するように！

## 使用例

```ts
import "./monkey-patch.ts"

/** img要素の全てが読み込まれた場合Promiseが解決される*/
const asyncLoadAllImages = async () => {
  const promises = Array.from(document.querySelectorAll("img"), el => el.asyncLoad())
  await Promise.all(promises)
}

/** 特定パスから画像を読み込まれた場合Promise<HTMLImageElement>が解決される */
const asyncGetImage = async (src: string) => {
  const image = new Image()
  image.src = src
  await image.asyncLoad()
  return image
}
```

## 余談

Promise を返却するような非同期関数の命名規則ってどうなっているんだろう。。

基本的に関数名先頭に async を付けてるけど正直コレジャナイ感がすごい。。

あと、「Promise が解決される」って言い方は[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)にそって言ってるけど、これも日本語的にすごく違和感...🤔
初めて勉強する機械学習　

##機械学習とは

人間が自然に行っている学習能力と同様の機能をコンピューターで実現しようとする技術。

犬や猫の写真を見た時に、人は、写真に写った動物の形を脳で解析して特徴を見定め、これまでの知識と経験に沿って犬か猫かそれ以外かを判断する。
この過程をプログラムで再現しようと考え出されたのが機械学習の技術。

##機械学習の２つのフェーズ

###フェーズ１　学習

プログラムに入力された大量のデータから、規則や判断基準を発見する。

###フェーズ2　推論

新たなデータが入力されたときに発見した規則や判断基準を元に推論し結果を出力する。

##機械学習に使うアルゴリズム

###教師あり学習（最も多く採用）

あらかじめ人によって正解ラベルをつけたデータをコンピュータに大量に読み込ませ、それを元に特徴を学習させる。

学習後に正解ラベルなしのデータを入力し答えを出力させる。

機械が判断した結果を採点（正解/不正解）することによってさらに精度を高める。

###教師なし学習

正解ラベルのついていないデータを読み込ませ、その中から何らかの規則性や共通点、関連性をコンピュータ自身に発見させ分類させる。

上記と異なり、正解、不正解がない。

###強化学習

教師あり学習のような正解は提示されず、その代わりに報酬が提示される。
与えられた条件の中でどのような行動をとれば最大の報酬を得ることができるかを、コンピューター自身に試行錯誤させながら学ばせる。

報酬は、連続した行動の結果に対して与えられる。
ほとんどのゲームは最終的な報酬（スコア）を最大化することが目的なので、強化学習と相性が良く、ゲームをプレイするAIを強くする際などに使われる。
n-queens

めもめも

```js
(number=>{

const init=width=>{

  const h=i=>~~(i/width), v=i=>i%width, d=i=>h(i)+v(i), u=i=>h(i)-v(i);

  const test=(grid,i,f)=>grid.filter((e,j)=>f(i)==f(j)).reduce((a,c)=>a+c,0) < 2;

  let count=0;

  const log=grid=>[...Array(width).keys()].map(e=>e*width).forEach(
    e=>((e==0)?console.log((++count)+":"+"-".repeat(width)):false)
     ||console.log(grid.slice(e,e+width))
  );

  return solve=(grid=[...Array(width**2)].fill(0),row=0)=>
    [...Array(width)].map((_,i)=>i+row*width).forEach(i=>[
      grid[i]=1,
      (test(grid,i,v)&&test(grid,i,d)&&test(grid,i,u))?
        (row+1==width?log(grid):solve(grid, row+1)):0,
      grid[i]=0
    ]);
};

init(number)();

})(8)
```
画像で学ぶ用語編

どなたか間違っていたらコメント下さい。

拾ってきた画像でIT用語を学びます。

センサー・アクチュエータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/c6e6812a-9f26-70af-7566-a967cc6fb760.png)

SDK…ソフトウェアを開発する上で便利な物の詰め合わせセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/4b20f79c-cbb1-c0a9-9f2c-ee634d65c814.png)

Xamarin(ざまりん)…C#でAndroidもiosも開発出来ちゃう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/f90be0aa-f5d6-58d3-eec3-4669bae073ed.png)

プロシージャ…戻り値の無い関数のことvoid的な
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/366e3e10-5f99-8d09-c23a-4ae2eeeb6d4c.png)

API
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/7f8bbc18-d783-a336-9e40-c37dee3b0b7d.png)

フレームワーク…アプリケーションの設計部分(骨組み)が完成している＋必要なものを付け足す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/32764d8a-2c1c-643c-3bee-4f18a7511d35.png)

ITオンサイト…障害対応
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/f9e3f698-e2dc-bc80-6dbd-4ec3ab301367.png)

Exchangeサーバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/85e748e7-0343-1d77-3aac-304901801d8d.png)

オンプレミス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443250/d0c69fdd-0aed-361c-a66c-8f1420c8a77f.png)
【Java】MySQLに接続する

# 概要
MySQL : 5.7
Java : 8.1
Mac
Eclipse

## 始める前に以下条件をクリアしている
・MySQLで既にtableなどができている。
・ターミナルなどで難なく接続できている

# JDBCをダウンロード
MySQLのJDBCをダウンロード
https://dev.mysql.com/downloads/connector/j/

**「Platform Independent (Architecture Independent), Compressed TAR Archive」** をダウンロード
![スクリーンショット 2019-10-21 17.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197404/0bc93100-367a-aac8-e9dd-c58d15c1ff4e.png)

解凍したファイルに``mysql-connector-java-5.1.48-bin.jar``があるから、
Tomcatの``/Tomcat/lib``に入れる
（私の場合、``/Users/namari/apache-tomcat-9.0.27/lib``）

## 接続してみる
プロジェクトの中に、``SqlTest.java``を適当に作ってみる。


``` ruby:SqlTest.java
package chapter14;

import java.io.*;
import java.sql.*;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

/**
 * Servlet implementation class SqlTest
 */
@WebServlet("/SqlTest")
public class SqlTest extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(
	    HttpServletRequest request,
	    HttpServletResponse response
	) throws ServletException, IOException {

	    // 今回は、localhostにあるbook のデータベース
	    String url = "jdbc:mysql://localhost/book";

	    try{
	    	Class.forName("com.mysql.jdbc.Driver");
	    	Connection conn = DriverManager.getConnection(url, "ユーザー名", "パスワード");

	    	// データベースに対する処理
	    	msg = "ok";
	    } catch (SQLException | ClassNotFoundException e){
	    	msg = "NG";
	    	
	    }
	    response.getWriter().println(msg);
    }

}
```
CENTOS8.0にGPU高速計算のためのCUDA10.1 toolkit and Driverのインストール

**<font color="Red">全てはBIOS設定のsecure bootをdisableにするところから始まる。**


追加、途中でエラーが出たらこちらの先人のアドバイスを参考にしてください
https://qiita.com/sikeda107/items/e916fbb07ca5c3fe60da

**GPUがCPUに刺さっているのかを確認するために<font color="Red">yum</font>を使って<font color="Blue">pciutils</font>をインストールする。**

    sudo yum install pciutils

**そして以下のコマンドを入力しこれで<font color="Red">GPUの詳細が表示されたら</font>OKである。**

    sudo lspci |grep -i nvidia

自分のワークステーションの環境は<font color="Blue">Xeon ( gpu nvidia GM200[GeForce GTX TITAN X])</font>と表示された。
以下の<font color="Red">NVIDIA公式サイト</font>から
https://developer.nvidia.com/cuda-downloads
以下の画像のように選択し、CUDA10.1 toolkit and Driverのソースコードを取得する。
<img width="812" alt="スクリーンショット 2019-10-21 16.43.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/1a0a8fd8-d312-a90f-ad19-43cb18db543a.png">

**ネットワークからcudaのrpmファイルを取得するために<font color="Red">yum</font>を使って<font color="Red">wget</font>をインストールする。**

    sudo yum install wget

そしてサイトの説明に従ってCENTOS8.0のスクリーン上でインストールを行う。
<img width="797" alt="スクリーンショット 2019-10-21 17.14.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231863/5eadf8a0-adbd-eafe-d1fc-a815ecf96971.png">

    $ wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-rhel8-10-1-local-10.1.243-418.87.00-1.0-1.x86_64.rpm
    $ sudo rpm -i cuda-repo-rhel8-10-1-local-10.1.243-418.87.00-1.0-1.x86_64.rpm
    $ sudo dnf clean all
    $ sudo dnf -y install cuda

再起動する。

    sudo reboot


その後CUDAのPATH指定を行う。

    $ export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
    $ export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    $export CUDA_HOME=/usr/local/cuda

以下のコマンドでバージョンが確認できる(CUDA ver.10.1)

    $ nvcc -V

以下のコマンドで何か表示されればNvidia Driverは正常にインストールされたことになる。
 
    $ nvidia-smi
combination, 逆元の計算

# combination, 逆元
階乗、逆元を事前に計算しておくことで$_{n}C_k$を$O(1)$で計算できる。

```python
fac = [1] * (n + 1)
inv = [1] * (n + 1)
for j in range(1, n + 1):
    fac[j] = fac[j-1] * j % mod


inv[n] = pow(fac[n], mod-2, mod)
for j in range(n-1, -1, -1):
    inv[j] = inv[j+1] * (j+1) % mod


def comb(n, r):
    if r > n or n < 0 or r < 0:
        return 0
    return fac[n] * inv[n - r] * inv[r] % mod
```


AtCoder Regular Contest 077 D 11
https://arc077.contest.atcoder.jp/tasks/arc077_b
dockerのコンテナ＆イメージの一括削除

# 概要
dockerを利用していると使っていないコンテナやイメージがたまる
それを一括で削除する方法について調べたことをざっくりまとめておく

# イメージの一括削除
一覧を確認するコマンドのfilterオプションを使って検索した結果を削除時に渡すことで実現する
（-qはIDのみを出力するためのオプション）

```
タグ付けされていないものを一括削除
docker rmi $(docker images -f "dangling=true" -q)
```

filterオプションで指定できるのは下記があり、上記の`$()`内を入れ替えるて実行できる

```
タグ付けされていない
docker images --filter "dangling=true"

指定のIDより前の
docker images --filter "since=e07d647d1a8e"

指定のIDより後に
docker images --filter "since=e07d647d1a8e"

ラベル付けされた
docker images --filter "label=com.example"
ラベル付けされた（複数もいける）
docker images --filter "label=com.example=TEST"
```

# コンテナの一括削除
イメージと同様にfilterを使います。
ドキュメントによるとコンテナIDでの指定も可能のようですが、私がためした時は見つからないとエラーがでました

```
docker rm $(docker ps -a --filter since=[コンテナ名] -q)
```

filterの詳細については、多数あるためここでは割愛します。
詳細はこちらを参考に[Docker-docs-ja(psについて)](http://docs.docker.jp/engine/reference/commandline/ps.html)

# 参考
imageのfilterオプションの詳細
[Docker-docs-ja(imageについて)](http://docs.docker.jp/engine/reference/commandline/images.html)

psのfilterオプションの詳細
[Docker-docs-ja(psについて)](http://docs.docker.jp/engine/reference/commandline/ps.html)

Dockerの基礎がわかりやすく解説されています
[Dockerイメージの理解とコンテナのライフサイクル@Zenbutsu](https://www.slideshare.net/zembutsu/docker-images-containers-and-lifecycle)
備忘録：Railsにおける多次元配列のリファクタリングについて（+ jsonでの受渡しについて）

# 前提
json形式で配列を送りたかったが、配列が別々に２つ存在するため多次元配列（2次元配列）を作る必要があった。

# 最初
```ruby:name.rb
names = ["hideki", "takahiro", "miki"]
descriptions = ["すごい", "かっこいい", "かわいい"]

inventories = []

names.each_with_index do |name, i|
  inventories.push [name, descriptions[i]]
end
```

出力結果

```
 [["hideki", "すごい"], ["takahiro", "かっこいい"], ["miki", "かわいい"]]
```

# 改善

```ruby:name.rb
names = ["hideki", "takahiro", "miki"]
descriptions = ["すごい", "かっこいい", "かわいい"]

inventories = names.zip(descriptions)
```

出力結果

```
 [["hideki", "すごい"], ["takahiro", "かっこいい"], ["miki", "かわいい"]]
```

# メモ：受け取り側での処理

上記をjson形式で送る

```ruby:name.rb
render json: inventories
```

ループさせる

```name.coffee
success: (json) ->
  html = ""
  for i of json
    html += "<div class='name'>#{json[i][0]}</div><div class='description'>#{json[i][1]}</div>"
  $(".names").html(html)
```

上記の[0][1]をループさせる方法がわからずでして、、どなたかわかる方がいらっしゃいましたら教えて頂けるとうれしみです。。

# 参考にした記事
[Rubyの配列でごにょごにょするときzipとinjectとevalが便利すぎる件](http://hash.hateblo.jp/entry/20090625/1245949183)
[C++] usingを使用したコンストラクタの継承

C++で書かれたライブラリを読解していて初めて知ったので備忘録として残しておきます。
何か間違いがありましたらコメントか編集リクエストをいただけると幸いです。

## はじめに
この記事では `using Base::Base` のような継承コンストラクタの説明記事になります。
前置きがいらない方は [コンストラクタの継承](#コンストラクタの継承) から本題へどうぞ。


## 継承とコンストラクタ
継承とは親クラスのメソッドやプロパティを受け継ぐというオブジェクト指向を構成する重要な概念の1つです。
C++では以下の様にクラスを継承します。

```cpp:classBがclassAを継承する関係
class A {};
class B : public A {};
```
オブジェクト指向では、継承されたクラスを親(スーパー)クラス、継承するクラスを子(サブ)クラスと呼びます。
子クラスからは親クラスの要素にアクセスできるようになります。

```cpp:継承
class A {
public:
    void display() {
         printf("called display\n");
    }
};

class B : public A {};

int main() {
    B b;
    b.display(); // "called display"
}
```

また、親子クラスのコンストラクタは「親 -> 子」の順序で実行されます。

```cpp:コンストラクタの実行順序と引数の引き渡し
class A {
public:
    A (int a, int b) {
         printf("A, %d\n", a + b);
    }

    void display() {
         printf("called display\n");
    }
};

class B : public A {
public:
    B (int a, int b) : A(a + 1, b + 1) {
         printf("B, %d\n", a + b);
    }
};

int main() {
    B b(1, 2); // "A, 5" "B, 3"
    b.display(); // "called display"
}
```

上記の通り、引数を持つ親クラスのコンストラクタを呼び出す場合は子クラスのコンストラクタに `: <SuperClass>(Args)` と書くことで引数を引き渡してコンストラクタを呼び出すことが可能です。

## コンストラクタの継承
前節で、引数のある親クラスのコンストラクタの呼び出しに `: <SuperClass>(Args)` を使用する方法を紹介しました。
では、親クラスが以下のような状況を考えてみます。

```cpp
class A {
public:

    A (int a) {}
    A (int a, char b) {}
    A (std::string str) {}
    A (int a, int b, int c, int d, int e) {}
    A (int a, int b) {
         printf("A, %d\n", a + b);
    }

    void display() {
         printf("called display\n");
    }
};

class B : public A {
public:
    B (int a, int b) : A(a + 1, b + 1) {
         printf("B, %d\n", a + b);
    }
    
    B (int a) : A(a) {}
    B (int a, char b) : A(a, b) {}
    B (std::string str) : A(str) {}
    B (int a, int b, int c, int d, int e) : A(a, b, c, d, e) {}
};
```

子クラスでは引数のある親クラスのコンストラクタを呼び出す処理を個別に書かなければいけないため非常に面倒くさいです。
また、子クラスの4つのコンストラクタは引数をそのまま親クラスに引き渡しているだけで、子クラスのコンストラクタが特別に何かの処理をしているわけではありません。

このような子クラスから親クラスのコンストラクタに引数を転送するようなコードを省略して簡単に書けるような機能としてC++11から**継承コンストラクタ**という機能が導入されました。

継承コンストラクタでは **using A::A** のように `using` キーワードの後に親クラス名とコンストラクタ名を`::`区切りで記述することで親クラスのコンストラクタを直接呼び出せるようになります。

```cpp:継承コンストラクタの例
class A {
public:

    A (int a) {}
    A (int a, char b) {}
    A (std::string str) {}
    A (int a, int b, int c, int d, int e) {}
    A (int a, int b) {
         printf("A, %d\n", a + b);
    }

    void display() {
         printf("called display\n");
    }
};

class B : public A {
public:
    using A::A; // 継承コンストラクタ

    // コンストラクタ毎に個別の処理を書くこともできる。
    B (int a, int b) : A(a + 1, b + 1) {
         printf("B, %d\n", a + b);
    }
};

int main() {
    B b1(1, 2);
    B b2(1, 2, 3, 4, 5);
    b1.display(); // "called display"
}
```

このように子クラスに `using A::A;` という記述を追加することで引数を転送するだけのコンストラクタを省略できるようになりました。
ただし、これまでと同じ処理を書くことでコンストラクタ毎に個別の処理を定義することも可能です。

## 参考文献
https://cpprefjp.github.io/lang/cpp11/inheriting_constructors.html