OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】primarySwatchの色を動的に変更する方法

#０、概要
FlutterアプリのメインカラーはprimarySwatchによって設定されます。
これの変更がプリセットから外れてカラーコードでオリジナル設定しようとすると大変だったので、
記事にしました。

#１、失敗例
その前にやってみてダメだった失敗例を記述します。

```main.dart
// 大元のコードをpinkとかにする これはOK
primarySwatch: Colors.pink

// pinkが濃かったので[100]などのように薄めてみた　NG
primarySwatch: Colors.pink[100]

// カラーで指定できるのではないかと思い NG
primarySwatch: Colors(0xFFFDFDFD)
=>color is not a subtype of material color
```

ColorsとMaterial Colorは別物であり、
primemarySwatchにはMaterial Colorを適用しなければならない。とのこと。

#２、完成したコード
先に完成形を載せておきます。

```main.dart
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  static Map<int, Color> color = {
      50: Color(0xFFFFFBFD),
      100: Color(0xFFFFF4F9),
      200: Color(0xFFFFEDF6),
      300: Color(0xFFFFE5F2),
      400: Color(0xFFFFE0EF),
      500: Color(0xFFFFDAEC),
      600: Color(0xFFFFD6eA),
      700: Color(0xFFFFD0E7),
      800: Color(0xFFFFCBE4),
      900: Color(0xFFFFC2DF),
    };

  final MaterialColor primeColor = MaterialColor(0xFFFFDAEC, color);
  @override
  Widget build(BuildContext context) {
  //  省略   //
  //
  //
    primarySwatch: primeColor,

```

#３、解説
方針: MaterialColorを定義する必要があります。
そのためには、変数で参照されるメインとなる色(500)と<font color="DeepPink">10色からなる色定義リスト</font>を作成する必要があります。
10色からなる色定義リストはここでは使用しませんが、内部的に参照している箇所があるため、作成して渡さないといけません。

##3-1 カラーコードの作成
下記サイトで作成することが可能です。
MATERIAL DESIGN PALETTE GENERATOR
http://mcg.mbitson.com/#!?mcgpalette0=%23ffdaec

アクセスしたら、右上のパレットを押して、完了したらchooseを押します
![スクリーンショット 2020-12-19 18.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/5f2de16b-83c4-1d07-645e-ccbcf96d126a.png)

chooseを押したら、左のクリップボードのようなアイコンを押し、
![スクリーンショット 2020-12-19 18.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/01bd554e-742d-a076-02e9-bd6df9e3e271.png)

カラーコードが表示されるので50~900までをコピーします。

##3-2、コードにする。
コードにする際に気をつけなければならないのが、
<font color="Orange">カラーコードの先頭に必ず0xFF(16進数表記の明示)を入れること</font>です。

カラーコードが'FFEDF6'の場合は、
0xFF+FFEDF6でこのような感じになります。

```
200: Color(0xFFFFEDF6),
```
また、MaterialColorの第一引数にも入れ忘れないようにしましょう

```
final MaterialColor primeColor = MaterialColor(0xFFFFDAEC, color);
```


#最後に
これで色を動的に変更することが可能です。
同じように困った人の助けになれば幸いです。
最後まで読んでいただき、ありがとうございました。
【Ruby】ネストしたハッシュの検索

先日、業務の中でネストしたハッシュが特定のキーに値を持っているか、判定する処理を書きたいときがありました。
こんなときは[]ではなくdigメソッドを使おう！という話。


```ruby:例題ハッシュ
hash = { "A" => { "x" => "obj1", "y" => "obj2" }, "B" => { "z" => "obj3" } }
```

要素は、例えば、次のように指定します

```ruby:
hash["A"]["x"]
# => "obj1"
```

しかし存在しないキーの場合だと、

```ruby
hash["A"]["z"]
# => nil
```
のように常になってほしい。

しかしながら、一番外側のキーの時点で存在しないキーを指定すると

```ruby
hash["C"]["z"]
# NoMethodError: undefined method `[]' for nil:NilClass
# from (pry):89:in `<main>'
```
nilエラーが出てしまいます。

原因はおわかりのように

```ruby:
hash["C"] # =>nil
```
に対して["z"]を適用しているから。
nilが返った時点でハッシュでなくなっているため、nilに対して[]を適応しても、「そんなメソッド知りませんがな」となるわけですね。

そこで[]ではなくdigメソッドに置き換えます。

```ruby
hash.dig("C", "z")
# => nil
```
どこかの時点で見つからなければnilを返し、見つかれば格納された値を返します。

```ruby:
hash.dig("A", "x")
# => "obj1"

hash.dig("A", "z")
# => nil
```
これでエラーが返ることなく検索を終えることができます。

digの中身を動的に変更したいときは、

```ruby:
ary = []
ary << "C"
ary << "z"

ary
# => ["C", "z"]
```
みたいに配列にしてやった上で

```ruby:
hash.dig(*ary)
```
と書けば長さも値も変幻自在です。
(*を配列に接頭してやると、展開して渡してくれます)

ハッシュの検索結果によってif分岐するようなコードを書きたかったので、エラーが返らないのであれば無事目的を達成できますね。

んまあ、digメソッドの存在を知ったときにはもう、別の妥協案でプルリクだして、マージしちゃってましたけどね😅
curlでSSOサイトからファイルをダウンロードする

#概要
curlを利用してSSOサイトからファイルをダウンロードする手順です。
Basic認証の場合ではcurl -u ユーザ名:パスワードでサイトにログインしてファイルを取得することはできますが、SSOの場合は認証エラーになります。

#手順
1. ChromeからSSOのページを開き、ファイルをダウンロードします。
2. F12キーを押下してデベロパー・ツールを開きます。
3. 「Network」タブを選択します。
4. Nameに表示されるURLを右クリックして「Copy」-「Copy as cURL(cmd)」か利用する形式を選択します。
5. テキストエディタに内容をペーストします。
6. WindowsのcUrlでは「--compress」オプションをサポートしていないので、その行を削除します。
7. ファイルに保存する場合は「-o ＜ファイル名＞ ^」オプションを追加します。
8. httpsの場合は「--ssl-no-revoke ^」を追加
9. curlの呼び出しurlを修正する
10. -H "accept:"をダウンロードするファイルのcontent typeに修正する（例：-H "Accept: text/csv"）
11. -H "User-Agent"の行を削除する
12. -H "Referer"行を削除する
9. .batファイルに保存します。
10. batファイルを実行するとファイルはSSOサイトから取得されて保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/f0fd0f8c-493e-ce49-49fe-8d651c13a7c0.png)
【iOS】Objective-Cでハッシュ値を計算するアプリを作ってみた(SHA256)


# 雰囲気

なんか、
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188881/17b88bdd-f088-0bd6-7621-bd060761f930.png)


こんな感じで動く。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188881/eebf650f-4fc6-074d-dd9b-b6844b8d6bec.png)



# 環境

Mac mini (M1チップセット Big Sur)
Xcode 12.2
（My Macで動作確認）

# ViewController.m

```Objective-C

//
//  ViewController.m
//  sha256
//
//  Created by hayao on 2020/12/16.
//

#import "ViewController.h"
#import <CommonCrypto/CommonHMAC.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (NSString*)sha256:(NSString *)text{
    //NSLog(@"%@", text);
    const char *s = (char *)[text UTF8String];
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)];
     
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
    CC_SHA256(keyData.bytes, keyData.length, digest);
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    NSString *hash = [self hexadecimalStringFromData:out];
    return hash;
}

- (NSString *)hexadecimalStringFromData:(NSData *)data
{
    NSUInteger dataLength = data.length;
    if (dataLength == 0) {
        return nil;
    }

    const unsigned char *dataBuffer = data.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02x", dataBuffer[i]];
    }
    return [hexString copy];
}

- (IBAction)CalcHashButton:(id)sender {
    if ([_tv.text  isEqual: @""]) return;
    _hashedValue.text = [self sha256:_tv.text];
    [[UIPasteboard generalPasteboard] setValue:_hashedValue.text forPasteboardType:@"public.utf8-plain-text"];
    //NSLog(@"%@", _hashedValue.text);
    _message.text = @"copied to the clipboard";
}
@end

```

# 素晴らしすぎるコピペ元様（順不同、多謝）

[Objective-Cでハッシュ関数を使う（SHA256）- Sim@Memo](
http://zak-za-k.blogspot.com/2011/09/objective-csha256.html)

[(いまさら)Objective-C 型変換まとめ - Qiita](https://qiita.com/CUTBOSS/items/97669c712449510fe7f0)

[iOS13におけるプッシュ通知に必要なデバイストークンの取得方法 - Takahiro Octopress Blog](https://grandbig.github.io/blog/2019/09/28/ios-devicetoken-2/)

[[Xcode]UIViewが画面の大きさによってずれてしまう時の対処法  | Code School](https://code-schools.com/xcode-autolayout/)
Spigot プラグイン 依存ライブラリのバージョン競合

依存関係を定義する際推移的依存関係でバージョン競合が起こってしまうのは致し方ないことです
Gradleにはそれを回避する機能がありますがそれはあくまで
自分が依存しているライブラリ内でのバージョン競合を回避する方法にすぎません
Spigotにある拡張機能の場合他プラグインが依存しているライブラリとのバージョン競合は
あらかじめ想定されていないと回避できません
そして機能がいくつも追加できるという反面、推移的依存関係を管理できないという問題にぶち当たります
SpringBootのようにバージョンごとでClassLoaderに読み込まれればいいのですがSpigotにはない様子...

解決策
競合する恐れのあるライブラリは全部relocateしてしまうという荒業

これしかない
Salesforce と Pardot のインテグレーション　⇒　Salesforce アカウントの設定

１．ユーザが Pardot で新しいプロスペクトを作成すると、Pardot はそれを何とみなして Salesforce に転送しますか?
２．リードおよび取引先責任者ページレイアウトの Pardot 項目はどのように整理すべきですか?
３．Pardot ボタンを Salesforce キャンペーンオブジェクトに追加するのはなぜですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/1d18c281-387a-5c50-1937-543de8f3a889.png)
AtCoder185 A問B問をKotlinで解いた

普段はPHPしか触らないのですが、Kotlinを書いてみたくなったので、
手始めにAtCoderをやってみました。
とりあえずACされますが、もっといい書き方があるかもしれません。

## A

https://atcoder.jp/contests/abc185/tasks/abc185_a

入力の最低値を出す問題ですね。

入力例
```5 3 7 11```

出力例
```3```


```kotlin
/*A - ABC Preparation  /
実行時間制限: 2 sec / メモリ制限: 1024 MB
配点 :100点

問題文
高橋君は、プログラミングコンテストを何回か開くことにしました。
コンテストを
1回開くには、100点問題、200点問題、300点問題、400点問題が
1問ずつ必要です。
100,200,300,400点問題の案がそれぞれ

A1,A2,A3,A4
 個あるとき、コンテストを最大で何回開けるでしょうか？
なお、同じ問題案は1 度しか使えません。

制約
1 ≤ Ai ≤ 100
(1 ≤ i ≤ 4)
入力は全て整数
*/

fun main(args: Array<String>) {
  val array = readLine()!!.split(" ").map(String::toInt)
  println(array.min())
}
```

## B

https://atcoder.jp/contests/abc185/tasks/abc185_b

- 初回入力でバッテリー残量、カフェに行く回数、最終的に家に帰る時間の、３つを受け取る
- カフェにいる間は時間１あたり１充電される
- 充電はバッテリ容量以上にされない
- 次回以降の入力でカフェ入店時間と退転時間の２つが渡される
- 一度でも充電が０になればNo,帰るまでに残っていればYesを出力する
- **0.5という謎の値が渡されるが無視でいい**...普通に混乱しました

```kotlin
fun main() {
  var departTime = 0
  var list: List<Int>

  val (battery, countGoingCafe, timeToBack) = readLine()!!.split(" ").map(String::toInt)
  var remain: Int = battery

  for (i in 1..countGoingCafe) {
    list = readLine()!!.split(" ").map(String::toInt)
    val consumeDuration = list[0] - departTime
    val stayCharge = list[1] - list[0]

    remain -= consumeDuration //カフェに着くまでの消費

    if (remain <= 0) {
      return println("No") //途中で０になる場合
    }

    remain += stayCharge

    if (remain > battery) {
      remain = battery //容量以上に残量が増えないように処理
    }

    departTime = list[1] //カフェを出る時間の記憶
  }

  remain -= (timeToBack - departTime) //最後のカフェを出てから家までの消費

  if (remain <= 0) {
    return println("No")
  }
  return println("Yes")
}
```
標高 PNG の仕様

## 国土地理院の標高 PNG

国土地理院では標高データをタイルで配信しています。テキスト形式のほか、 PNG 形式でも配信されています。

* [地理院タイル一覧 - 標高タイル（基盤地図情報数値標高モデル）](https://maps.gsi.go.jp/development/ichiran.html#dem)

配信されている標高 PNG 画像は、こんな画像です。

![1626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/54f5f84e-d95c-99bf-f578-1c5b8f197aa9.png)

- https://cyberjapandata.gsi.go.jp/xyz/dem5a_png/12/3588/1626.png

## 仕様

こんな画像を見ても、どこが高くて、どこが低いのかわかるような気もしないでもないですが、具体的にどのくらいの標高か判断することは難しいです。しかし標高 PNG は、 $RGB$ の色情報から標高値を計算できるようになっており、計算機で扱いやすい形式になっています。

```math
\begin{align}
& x = 2^{16} R + 2^8 G + B & \\
& h = xu & ( x < 2^{23} ) \\
& h = NA & ( x = 2^{23} ) \\
& h = (x-2^{24})u & ( x > 2^{23} )
\end{align}
```

* [標高タイルの詳細仕様](https://maps.gsi.go.jp/development/demtile.html)
* [PNG標高タイル　－Web利用に適した標高ファイルフォーマットの考察と実装－](https://www.jstage.jst.go.jp/article/geoinformatics/26/4/26_155/_pdf)（西岡芳晴・長津樹理、情報地質第26巻第4号、2015）

## つまり…どういうことだってばよ?

一見するとややこしい式に見えますが、2進法で考えると比較的わかりやすいです。

たとえば、 $(R, G, B) = (0, 3, 255)$ のとき、 $x = 00000000 \  00000011 \  11111111_{(2} = 1023_{(10}$ となります。

国土地理院が提供する標高 PNG の場合は $u = 0.01$ なので、 $h = xu = 10.23$ と計算することができます。

$(R, G, B) = (128, 0, 0)$ のときは、無効値 $NA$ を表す特別な値です。

たとえば、 $(R, G, B) = (255, 255, 255)$ のときは $x = 2^{24}-1$ より、 $h = (x-2^{24})u = -0.01$ となり、負数を表します。

## 色としては

$h = 0.00$ である $(R, G, B) = (0, 0, 0)$ は黒色です。そこから標高が増えるにつれ、徐々に青みが増していき $h = 2.55$ のとき $(R, G, B) = (0, 0, 255)$ すなわち青色になります。

更に標高が増え、 $h = 2.56$ になると「繰り上がり」が生じて $(R, G, B) = (0, 1, 0)$ になります。色としては、ほぼ黒に戻ることになります。標高が高くなるにつれ、それが繰り返され、徐々に緑がかっていくことになります。

逆に海抜0メートル地帯などの標高がマイナスのエリアでは、 $h = -0.01$ である $(R, G, B) = (255, 255, 255)$ すなわち白から、徐々に黄色い色に推移していきます。

水域等のデータ欠損地や、山間部等のデータ未提供地では臙脂色で表現されます。

## 整理すると

こんな感じすね。

![スクリーンショット 2020-12-19 18.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/1504efa0-919d-ddd9-a1ae-03a53a04bdf1.png)
ExpoがDownloading JavaScript bundle 100.0%で止まっちゃう件

# 急に`Downloading JavaScript bundle 100.0%`で動かなくなった
ExpoでReactNativeの開発中、ビルドは正常に終了するものの、`Downloading JavaScript bundle 100.0%`で固まってしまう現象が発生し、非常に困った。

# 結論
結論としては、iOSでインストールしていた、**Expo Clientアプリを削除して再インストール**することで解決した。
ただ、理由はわからない。調べてみてもよくわからなかったので、もし原因をご存じの方がいらっしゃいましたらぜひコメントで教えて下さい。。。

細かいところを理解しないまま作っちゃうから、ちょこちょこ困ることがあるんだよなぁ。。。
JavaScript,11,関数,function,初心者向け

11,関数
JS（JavaScript）で関数（function）を使う方法と、関数を使って税込み価格を簡単に計算できるアプリケーションを作ってみましょう。
returnとは何か？そして引数（ひきすう）とは何か？
そしてその活用方法とは？を解説しています。


関数の定義


function 関数名　（引数）　{
行う処理;
return 戻り値;
}

例
引数＝大根
関数＝おろし機
戻り値＝大根おろし

関数は機能を部品化したもの
引数は関数に渡す材料
戻り値とは関数から返ってくる処理結果



消費税を例えに

```
const tax = 1.1;
function calculation () {
  return Math.floor(120 * tax);
}

console.log(calculation ()); 
```


関数を出すときはfunction　calculation() {   (次に書くものは関数名なんでもok)

 returnは値を関数ちに返す

120円の消費税を出す
Math.floor(120 * tax);
Math.floor(で小数点以下切り捨て


何個も出したいときは


```
const tax = 1.1;
function calculation (price) {
  return Math.floor(price * tax);
}

console.log(calculation (120)); 
console.log(calculation (150)); 
ここの数値がprice(引数)に入って計算してくれる



<div id="result1"></div>
<div id="result2"></div>

const tax = 1.1;
function calculation (price) {
  return Math.floor(price * tax);
}
```


document.getElementById("result1").textContent = "100円の税込価格は110円です";
↑が表示される


100円の税込価格は110円
↑ここを関数にしたい

```

const tax = 1.1;
function calculation (price) {
  return Math.floor(price * tax);
}
function insertText (itemPrice) {
document.getElementById("result1").textContent = itemPrice + "円の税込価格は" + calculation(itemPrice) + "円です";
};
insertText(100);
```

100円の税込価格は110円です



```

const tax = 1.1;
function calculation (price) {
  return Math.floor(price * tax);
}
function insertText (itemPrice, element) {
document.getElementById(element).textContent = itemPrice + "円の税込価格は" + calculation(itemPrice) + "円です";
};
insertText(100,"result1");
insertText(200,"result2");
insertText(250,"result3");
```

100,200,250がitemPriceに行き出力先がelementに入りresultに入る



```

const tax = 1.1;
function insertText (itemPrice, element) {
  function calculation (price) {
    return Math.floor(price * tax);
  }
  document.getElementById(element).textContent = itemPrice + "円の税込価格は" + calculation(itemPrice) + "円です";
};
insertText(100,"result1");
insertText(200,"result2");
insertText(250,"result3");
```

こっちでも大丈夫でこっちの方が正しい

関数の中に関数を入れるとその中でしか動かない関数になる
他の場所で関数を使うなら外に置いておく上
関数の中でしか関数を使わない場合は下
[UE4] テクスチャのMipを強制的にロードする

テクスチャのMipmapを画面に描画させずに強制的にロードする方法になります。
間違ってたらごめんなさい、指摘ください。
検証UE4: 4.25.3
<font color="OrangeRed">要C++</font>

#はじめに
- MipとTextureStreamについてはこちらを参照してください  
    - [[UE4] テクスチャのメモリについて - Qiita](https://qiita.com/com04/items/cea6da4949fc8774fcb8)
- SceneCaptureを使った適正なMipロード方法、もしくはActor単位での強制的なMipロードについてはこちらをご参照ください
    - [UE4 SceneCaptureComponent2DでTextureStreamingが走らない場合の対処法 - PaperSloth’s diary](https://papersloth.hatenablog.com/entry/2020/05/02/173732)


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Texture Streamingを考慮するようにしたバージョン。できてるけど、表示された瞬間から読み込むから最初数フレームはボケちゃう。 <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/bks4OEYkl6">pic.twitter.com/bks4OEYkl6</a></p>&mdash; スミオ（SUMIO） (@tempkinder) <a href="https://twitter.com/tempkinder/status/1097143280318332929?ref_src=twsrc%5Etfw">February 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
（いつも引用すみません）
このような感じで低解像度Mipが出る前に、Mipロードを済ませておいてから表示させる的な事ができます。

もしActor単位で良ければ、前述参考リンクの[PaperSloth's diaryさんのような形](https://papersloth.hatenablog.com/entry/2020/05/02/173732#%E8%BF%BD%E8%A8%98-Blueprint%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B)で実装できます。（BP実装）
全テクスチャのロード待つと遅くなるので一部テクスチャだけロード完了してから表示したい、
マテリアルのテクスチャを差し替えて使うのでそこだけ先にロードしておきたい、的な時に今回のは使えるかと思います。

#テクスチャのMipを強制的にロードする
```c++
// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  // 強制的なMipロードを有効化する秒数
  const float Seconds = 100000.0f;
  Texture->SetForceMipLevelsToBeResident(Seconds);
  Texture->bForceMiplevelsToBeResident = true;
}
```
UTexture2Dの親クラス、UStreamableRenderAssetに操作があります。
Secondsで指定した秒数の間、強制的なMipロードが入ります。

#設定を解除する

```c++
// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  Texture->SetForceMipLevelsToBeResident(0);
  Texture->bForceMiplevelsToBeResident = false;
}
```
設定解除しても即時メモリから破棄はされません。
この辺りはTextureStreamingのCacheに積まれた時と同じ挙動になります。

#テクスチャのMipのロードの完了を取得する

```c++
// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
bool Finish = true;
if (IsValid(Texture))
{
  // 同数なら終わってる
  Finish = (Texture->GetNumResidentMips() == Texture->GetNumMipsForStreaming());
}
```
bForceMiplevelsToBeResident を設定して即時ロード完了とはなりません。
TextureStreamingを使用してロードしますので、完了までには時間がかかる場合があります。

GetNumResidentMips は現在TextureStreamingで読み込めてる数、
GetNumMipsForStreaming はTextureStreamingで使用できるMip数
となります。
ロードが完了すると同数になります。

#ほか
- 強制的にMipをすべて読み込む為、Textureの使用メモリが増えます。
    - 例えば画面表示的に1024サイズで良くても、4096までのMipが存在していれば全部読み込みます。
    - 現在この機能で「指定Mip以上だけ読み込む」的なのは無い筈です（あったら教えて下さい。。。）
- エディターで確認する場合は、PIEですとキャッシュが残ったままになる事もありますのでStandaloneで確認するのをお勧めします。

## ForceMiplevelsToBeResident の中でも優先的にロードさせる
あまり確証ないですが ForceMiplevelsToBeResident の設定後に下記Fast設定すれば優先されそうな感じがしました。
（細かい挙動までは追っかけてないです）

```c++
// 操作したいテクスチャ
UTexture2D* Texture = GetNanka();
if (IsValid(Texture))
{
  IStreamingManager::Get().GetTextureStreamingManager().FastForceFullyResident(Texture);
}
```
競技プログラミング、コーディングテストの雛形：Python3

# 目的
- コーディングテスト、競技プログラミングで使える雛形を載せておきます
- 要件
    - Python3
    - 提出前にデバッグするときは、テストできること（複数パターンをテストできること）
    - 提出前にデバッグするときは、ログを出せること
    - 提出用のコードを作るときに、なるべく手作業が少ないこと

# 雛形
- 雛形では足し算を実装して、2パターンテストしています
- 説明はコードコメントにて
- 提出時には、`inputters = [UtilityForRelease()]`に手作業で切り替えてください（コード参照）

```python
"""
    コーディングテスト用の雛形
"""

from abc import ABCMeta, abstractmethod

# 無くてもいいが、意図が伝わりやすいかと思って入れている
class IUtility(metaclass=ABCMeta):
    """ユーティリティのインタフェースクラス
    """
    @abstractmethod
    def input(self):
        pass
    @abstractmethod
    def check(self, test_outputs):
        pass
    @abstractmethod
    def debug(self, message):
        pass

class UtilityForRelease(IUtility):
    """本番用のユーティリティ
    """
    def input(self):
        """
            標準入力から1行返す
           Returns:
                string: 標準入力
        """
        return input()
    def check(self, test_outputs):
        """
            何もしない
        """
        pass
    def debug(self, messsage):
        """
            何もしない
        """
        pass

class UtilityForDebug(IUtility):
    """デバッグ用のユーティリティ
    """
    def __init__(self, test_inputs, test_answers):
        """コンストラクタ
            Args:
                test_inputs (array of string): 入力文字列の配列(文字列であることに注意！！)
                test_answers (array of string): 正解文字列の配列(文字列であることに注意！！)
        """
        self.test_inputs = test_inputs
        self.test_answers = test_answers
        self.counter = 0

    def input(self):
        """
            コンストラクタで与えられた文字列を1行返す
            Returns:
                string: 入力文字列
        """
        test_input = self.test_inputs[self.counter]
        self.debug("input{0}: {1}".format(self.counter, test_input))
        self.counter += + 1
        return test_input

    def check(self, test_outputs):
        """
            コンストラクタで与えれた答えと照合する
            Args:
                test_outputs (array of string): 出力文字列の配列(文字列であることに注意！！)
        """
        self.debug("test: expected {0}, output {1}".format(self.test_answers, test_outputs))

        if self.test_answers == test_outputs:
            self.debug("test: result: TRUE");
        else:
            self.debug("test: result: ******FALSE******");
        
    def debug(self, message):
        """
            ログを出力する
        """
        print("DEBUG::" + message)

def main():
    """ エントリポイント
    """

    # 提出時とデバッグ時で下を切り替えて使ってください！！
    # デバッグ時には入力と正解を引数にUtilityForDebugを生成してください
    inputters = [UtilityForDebug(["1", "2"], ["3"]), UtilityForDebug(["3", "4"], ["7"])]
    # inputters = [UtilityForRelease()]

    for inputter in inputters:
        # 以下に入力を取得して、ロジックを実装し、出力するところまで記述してください
        left = int(inputter.input())
        right = int(inputter.input())
        answer = left + right
        inputter.debug("answer: {0}".format(answer))
        inputter.check([str(answer)])
        print(answer)

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

- デバッグ時の結果です

```
DEBUG::input0: 1
DEBUG::input1: 2
DEBUG::answer: 3
DEBUG::test: expected ['3'], output ['3']
DEBUG::test: result: TRUE
3
DEBUG::input0: 3
DEBUG::input1: 4
DEBUG::answer: 7
DEBUG::test: expected ['7'], output ['7']
DEBUG::test: result: TRUE
7
```
【Laravel】コレクションのプロパティ取得ではまった話

・2020/12/20 更新：コメントにてご指摘をいただき、内容を修正しました。
# 経緯

Laravelのコレクションを使用し、以下のようにアローでプロパティを指定し取り出そうとしたところ、うまく動作しなかった。

```php
$user = collect([
    'name' => 'Yuta',
    'age' => 8
]);

print($user->name);
// ERROR: Property [name] does not exist on this collection instance
```

`$user`は`collect`ヘルパで`Illuminate\Support\Collection`インスタンスが返っているはずだから、
アローでキー指定して取り出せるのでは？と思ったのだが、どうもそうはいかないらしい。

# 調査

とりあえず`$user`の情報を見てみることに。

```php
print_r($user);

/*
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [name] => Yuta
            [age] => 8
        )
)
*/
```

`Illuminate\Support\Collection`インスタンスではあるっぽい。

(2020/12/20 追記)
`[items:protected] => Array`とあるように中身が連想配列なのが原因とのこと。

仮に`collect`ヘルパではなく、Eloquentモデルで
`App\Models\SampleModel::where('id', 1)->get()`のように取得したデータの場合は、
中身は`App\Models\SampleModel`オブジェクトの配列なので、

```php
foreach ($users as $user) {
    echo $user->name;
}
```

のようにforeachで回してオブジェクトに対してプロパティの指定ができる。

# 結論

`collect`ヘルパを使って、更にアローでプロパティを指定したい場合は、
連想配列をオブジェクトに変換し、それを配列に入れてあげれば、
以下のようにforeachで回してオブジェクトに対してプロパティの指定ができる。

```php
$users = collect([
    (object)['name' => 'Yuta', 'age' => 8]
]);

foreach ($users as $user) {
    echo $user->name;
}
```

ただ、そこまでしなくても以下のようにCollectionクラスのメソッドの恩恵を素直に受けた方が良さそう。

```php
$user = collect([
    'name' => 'Yuta',
    'age' => 8
]);

$user->get('name')
```

# おわりに

コメントでご指摘いただき、連想配列とオブジェクトをしっかり差別化して使うことが必要だと感じた。
コレクションについてもさらに理解を深めたい。
Built_Valueのすすめ (導入)

この記事は[こちら](https://stacksecrets.com/flutter/introduction-to-built_value-library-in-dart
)の和訳です。Flutterを触り始めて理解があやしかったBuild_Valueライブラリについて、自分の勉強用にまとめます。

## イントロ
Dartは素晴らしいプログラミング言語だが、クラスやEnum周りの実装がじつは大変だったりする。その例として、Serialization、Immutability、Comparisonがある。

## Dartの抱えるSerizalizationの問題
どのアプリを開発しても、モデルをシリアライズする場面が発生する。例えば、メモリやデータベースに保存するために、モデルをJSONオブジェクトへ変換しる場合などだ。Dartはデフォルトではオブジェクトをシリアライズ/デシリアライズ(serialize/de-serialize)する機能をサポートしていない。

### DartでJSON Serializeをしてみる

例えば、`Division`というクラスがあるとする。

```dart
class Division {
  Division() {}
  int id;
  String name;
  String description;
  String displayName;
}
```

このモデルをシリアライズするには、かなりのコードを書く必要がある。
#### モデルをJSONに変換

```dart
Map<String, dynamic> toJson() =>
{
  'id': id,
  'name': name,
  'description': description,
  'displayName': displayName
}
```

#### JSONをモデルに変換

```dart
Division.fromJson(Map<String, dynamic> json)
: id = json['id']
  name = json['name']
  description = json['description']
  displayName = json['displayName']
```

モデルが増えるごとにこのコードを書くことを想像してほしい！

## Dartの抱えるImmutabilityの問題
オブジェクト志向、ファンクションベースのプログラミングでは、immutableオブジェクトとは生成後に変更できないオブジェクトのことを意味するがDartではサポートされていない。

### Dartでオブジェクトを比較してみる

Dartのオブジェクトは参照型であり、値型ではないため、比較が難しい。

```dart
final person1 = Person(name: 'Jane Doe');
final person2 = User(name: 'Jane Doe');

print(person1 == person2); // false
```

`person1`と`person2`は同じ人物だと期待するが、Dartでは別人物として判定される。

## `Built_Value`を使ってみる

Built_Value (built_value)ライブラリは、上記の問題を解決する目的で作られた。Built_Valueを使うとSerialization、Immutability、ComparisonをDartで扱うことができる。さらに、先に挙げた以外にも下記の機能もサポートしている。
- hash valueの生成
- オブジェクトをStringへ変換
- 複雑なデータのシリアライズ　など
[Nuxt.js] middlewareでページのアクセス制御を行う

## 概要
権限等である特定の画面へのアクセスを不可とする制御を行うために
以下のように実装を行なったので、メモとして書き残しておく。

## 詳細
- ページの閲覧が不可の権限の場合、403ページ（`/pages/403.vue`）へリダイレクトする設定を
middleware配下のファイルに記載

```:/middleware/page_control.js
export default ({ store, redirect }) {
    if (store.getters['auth'] === 1) {
        // 403ページにリダイレクト
        redirect('/403');
    }
}
```

- アクセス制御を行いたいページに以下の設定を追加

```:/pages/list.vue
<script>
export default {
    middleware: ['page_control'],
}
</script>
```

middlewareで設定した権限のユーザーが一覧画面（`list.vue`）にアクセスをした場合
403のページにリダイレクトされ、一覧画面は閲覧不可となる
Gradleで生成したjarファイルを実行するとjava.lang.ClassNotFoundExceptionエラー

## 事象
ビルド時は問題ないがjarファイルにして起動すると実行時に`ClassNotFoundException`エラーが発生。
ただし、エラーが発生しない画面もある
inteliJからlocalで起動している場合は、エラー発生なし

## 環境
ビルドツール: Gradle(6.7.1)
言語: Kotlin(1.3.72)

## 再現手順

jarを生成した後、起動

```terminal:terminal
java -jar awba-manage-0.0.1-SNAPSHOT.jar
```

その後、画面を動作させてみると一部ページでエラーが発生。
ログをみる


```kotlin:ログ
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/lang3/RandomStringUtils] with root cause

java.lang.ClassNotFoundException: org.apache.commons.lang3.RandomStringUtils
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[na:na]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[na:na]
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) ~[awba-manage-0.0.1-SNAPSHOT.jar:na]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
	at com.awba.manage.awbamanage.service.EmailSenderService.sendForgotPasswdMail(EmailSenderService.kt:83) ~[classes!/:na]
	at com.awba.manage.awbamanage.controller.LoginController.forgotPasswdSendMail(LoginController.kt:95) ~[classes!/:na]
	at com.awba.manage.awbamanage.controller.LoginController$$FastClassBySpringCGLIB$$accc0aa.invoke(<generated>) ~[classes!/:na]

```

## 調査開始

RandomStringUtilsというクラスが見つからないというのでエラーが出ている。
jarファイルの中身を確認すると確かに該当のjar(commons-lang3:3.5.jar)がない

```kotlin:jarファイルの中身を確認
jar -tf awba-manage-0.0.1-SNAPSHOT.jar 
```

とりあえず以下手順を実施し、一度きれいにして再度buildして起動したが変わらず。。

```terminal:terminal
gradle clean

#cacheディレクトリも削除↓
# %ユーザのホームフォルダ%\.gradle\caches
```

build.gradleをみると・・・

```gradle:build.gradle.kts
compileOnly("org.apache.commons:commons-lang3:3.11")
```

## 原因
build.gradleで該当のライブラリの宣言部分を`compileOnly`にしていたため。
compileの時にのみ必要なライブラリとなり、jarファイルには含まれない。

## 対応
`implementation`で宣言する

```gradle:build.gradle.kts
implementation("org.apache.commons:commons-lang3:3.11")
```
Azureでディスク暗号化セットを作成する

# はじめに  
Azureのサービスをデプロイしていくうえで、ディスク暗号化セットの指定を問われる場合があります。 
「ディスク暗号化セット」で調べてもピンポイントで作成の仕方は出てこないことが多いので、この記事で簡単にですがまとめておきます。  
# ディスク暗号化セットとは 
名前の通りですが、マネージドディスクなどを暗号化する際に、Key Vaultのマネージドキーを使用して暗号化する方法です。

次の図は、マネージド ディスクで Azure Active Directory と Azure Key Vault を使用して、カスタマー マネージド キーを使って要求を行う方法を示しています。
![diskenc-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/08c6cb13-cc1e-6e76-af11-0268823ce898.png)
1. Azure Key Vault の管理者が Key Vault リソースを作成します。
2. Key Vault 管理者は、RSA キーを Key Vault にインポートするか、Key Vault 内で新しい RSA キーを生成します。
3. この管理者は、Azure Key Vault ID とキー URL を指定して、ディスク暗号化セット リソースのインスタンスを作成します。 ディスク暗号化セットは、マネージド ディスクのキー管理を簡略化するために導入された新しいリソースです。
4. ディスク暗号化セットを作成すると、システムによって割り当てられたマネージド ID が Azure Active Directory (AD) に作成され、ディスク暗号化セットに関連付けられます。
5. Azure Key Vault の管理者はその後、Key Vault 内での操作を実行するためのアクセス許可をマネージド ID に付与します。
6. VM ユーザーは、ディスク暗号化セットにディスクを関連付けることによってディスクを作成します。 また、VM ユーザーは、既存のリソースに対するカスタマー マネージド キーを使用したサーバー側の暗号化を、ディスク暗号化セットへのリソースの関連付けによって有効にすることもできます。
7. マネージド ディスクは、マネージド ID を使用して Azure Key Vault に要求を送信します。
8. データの読み取りまたは書き込みを行うために、マネージド ディスクは Azure Key Vault に要求を送信して、データの暗号化と暗号化解除を実行するためにデータ暗号化キーを暗号化 (ラップ) および暗号化解除 (ラップ解除) します。
引用：
https://docs.microsoft.com/ja-jp/azure/virtual-machines/disk-encryption

# 作成方法
1. すべてのサービスから「セキュリティ」を選択します  
2. 一覧から「ディスク暗号化セット」を選択します  
![2020-12-15-16-27-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/34b01cb9-073f-a22a-5b43-f58135c6d773.png)
3. 「ディスク暗号化セットの作成」を選択します
![2020-12-15-16-34-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/adbb1cdd-ff19-7953-e2bd-ece82079d45d.png)
4. まずは基本情報を入力していきましょう  
   * サブスクリプション：デフォルトで選択されています
   * リソースグループ：任意のRGを選択  
   * ディスク暗号化セット名：任意の名前を設定しましょう  
   * キーコンテナーとキー：「クリックしてキーを選択します」をクリックします  
![diskenc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/207c6fb1-57c0-c1b6-50ec-875e0e5a6e6a.png)
5. クリックすると、右ペインに下記の画面が表示されると思います。  
   事前に用意したキーを使うか、またはこの画面でKey Vaultのキーを作成していきます。
   今回は、すでに用意してある前提で手順を実施します。 
各項目から対象のキーを選択していけば問題ありません。 

![diskenc-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/bdfe1864-3128-cf00-597c-3d1c718d6cd5.png)
Key Vaultの作成は[こちら](https://qiita.com/kk-ishii/items/0176b1f02e77bd4fd948)の記事を参照してください。

6.次にタグの設定です。 
   必要に応じて設定してください。  
![diskenc-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/f025ce1e-125d-42d0-d21c-c9ed4710c14f.png)

7.最後に設定の確認です。  
   確認して問題なければ作成しましょう。
![diskenc-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941818/467c8ed0-01c6-72d9-7049-ed128ca86f32.png)

# まとめ
作成自体は非常に簡単です。
ただ、情報がうまく検索で引っかからないこともあるので、辿り着くまでが苦戦することがあります。
機能はセキュリティを強化するにも有効なのでぜひ使っていきたいところです。
pythonで多重起動禁止

[fcntl \-\-\- fcntl および ioctl システムコール — Python 3\.9\.1 ドキュメント](https://docs.python.org/ja/3/library/fcntl.html)

```py:lock_test.py
import os
import fcntl
import time

def process_lock():
    lockfile = os.path.splitext(os.path.abspath(__file__))[0] + '.lock'
    lockfp = open(lockfile, "w")
    try:
        fcntl.flock(lockfp, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except IOError:
        return
    return lockfp

def main():
    lock = process_lock()
    if not lock:
        print("lock error")
        exit(1)

    # 処理
    time.sleep(360)

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

```
$ python3 lock_test.py &
$ python3 lock_test.py
lock error
```
Ruby on Rails DB負荷を減らす変数作成

# はじめに

先日アプリケーションに対するアクセス負荷によるDBダウンを経験しまして、業務でアプリケーション内のクエリ発行処理を見直しました。

# Railsのクエリ発行がどこで行われているか

モデルを介してDBにアクセスする際に行われます。
controllerやmodelで行う以下のような処理でクエリが発行されます。

```users_controller.rb

def index
   @users = User.all
   @user = User.find(params[:id])
   @user2 = User.find_by(user_id: current_user.id,
                         profile_id: params[:profile_id])
   @user3 = User.where(name: "aaaaa")
end

```

ローカルで起動している時、上記コードがコントローラーにある上でindexのページをロードします。

その最中にターミナルを凝視してください。

すると

![スクリーンショット 2020-12-19 17.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661300/b69dbec6-3b6d-120a-7874-dc7f84f813a1.png)

字が小さくて申し訳ないです。
そしてこの画像のクエリは先程のコントローラーのやつとは別物です。参考画像です。


紫の文字が実際のクエリですね。
用はモデルに対してはfindとかallとかで指令を出していますが、
モデルはDBに対して紫文字のようなSQLを発行しています。
これがクエリ発行です。

この処理が多くなればなるほどページロードも遅くなり、ユーザビリティが悪くなります。

(1.6ms)とかというのはDBからのレスポンスの時間です。
これはローカルでの数値になるので実測値とは異なりますが、ここでも遅いか早いかの判断は付くと思います。
さらに言えば、今は１アクセスに対しての数字が出ているのですが、
実際の運用では同時何千アクセス、とかになるのでレスポンスにかかる時間はどんどん遅くなっていきます。

DBのスペックももちろん大事ですが、アプリケーション内で出来ることはやりましょうと。


## 実際にどう抑えていくか

### とにかく1モデルに対してのアクセスは各アクション内で基本1回！
### 大量データを取得する処理（.all）とかがあるならその中から欲しいデータを抽出する！

どういうことかというと

例えば

```users_controller.rb

def index
   @users = User.all
   @user = User.find(params[:id])
   @user2 = User.find_by(user_id: current_user.id,
                         profile_id: params[:profile_id])
   @user3 = User.where(name: "aaaaa")
end

```

みたいな処理があるとして、
これ実は凄い無駄なんですよ。
@usersはともかく、その他に関しては
モデルにアクセスする必要ないんですよね実は。

もうお気づきかもしれませんが、@users変数の中に、@userと@user2,@user3は既に入っているんです。

であればこのusersのデータの中からRubyのメソッドで欲しい情報を取ればいいんです！

```users_controller.rb
def index
   @users = User.all
   @user = @users.to_a.detect{ |user| user.id == params[:id].to_i}
もしくは
   @user = @users.to_a.find { |user| user if user.id == params[:id].to_i} 


   @user2 = @users.to_a.map { |user| user if user.id == current_user.id && user.profile_id == params[:profile_id].to_i}

   @user3 = @users.to_a.select {|user| user.name == "aaaa"}
end

```

恐らくこんな感じで書き換えられます。
ただし、整合するデータのデータ型には気をつけないと上手くマッチしませんので、byebugとかでparams[:id].classとかでinteger型なのかString型なのかを判断するようにしましょう。
"1"と1ではデータ型が違うので、同じ物と見なされず==はfalseになります。配列を返してくれません。

※コードに関してはqiitaを書いている時に実際に検証はしていないので、コピーだとエラー出るかもしれません。
ですが、select map find detect collect　など配列を返すメソッドを上手く使用することでモデルアクセス時のデータと同じものを大きいデータを持っている変数内から取ることができます。


# 効果
各コントローラー内で実装しました。

基本大きなデータを取っているのであればそれを使って、小さく整形していく。
重複のクエリは発行させない。


この処理を実装した翌日からアクセスの負荷は半分以下になり、ロードのスピードも実測値として上がることが確認できました！！！


# 注意事項
それならもう全てallで取ったろ！みたいに思うかもしれませんが、
一回に取るデータが大きくなればなるほど、処理は重くなるのでそこはお気をつけください。
あくまで大量データを絶対に取らなければならない場合に限り今回の整形は有用です。
また、同じデータをデータベースから取るにしても検索（一致）させる情報も多ければ多いほどレスポンスは早いということが分かりました。

```user_controller.rb

def index

  @users = User.where(user_id: current_user.id)
  @users2 = User.where(user_id: current_user.id,profile_id: 1)

end

```
のようなコードがあったとして、
取得するデータは大差なくても処理にかかる時間は大きく変わるようです。

実際に私も安直にもっと大きな枠でデータ取得しとけばコントローラー内でのクエリ発行処理を0に出来ると思って、@users2から@usersのような処理に変更してコントローラー内のクエリ発行処理を全て無くしたところ、次の日からデータベースへのアクセス負荷数値は大幅に上がってしまいました。笑
なので最初にあった既存処理を変えてもっと大枠を狙う場合は負荷テストもしっかりした上で実装が望ましいです。


# まとめ

地味な作業ですがシンプルに勉強にもなり、効果が目に見えて分かるのが面白いので機会があれば是非やってみてください。

分かりづらかったらコメントお待ちしております。
Big SurにおけるMacVim-KaoriYaの動作設定

# 背景

MacをBig SurにアップグレードしたところMacVim-KaoriYaが動作しなくなったのでその対応方法を共有致します。
結論だけいうと、以下の対応が必要でした。

* 環境設定の詳細で、「Core Textレンダラの使用する」のチェックを外す。
* フォントをRictyにする。

# 症状と対応方法

### 1. 画面がまっくろになる

MacVim-KaoriYaをウインドウを開くと、画面が真っ黒になりアプリが利用できません。。。

![スクリーンショット 2020-12-19 16.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965805/074c9f25-09c8-ad5d-b201-18f6355ca023.png)

#### ■ 対応方法

環境設定の詳細で「Core Textレンダラの使用する」のチェックを外す。

![スクリーンショット 2020-12-19 17.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965805/ece72a0a-0455-7b0a-3dce-2a81b2e48677.png)


### 2. カーソルなどの表示位置がおかしい

フォントと利用しているプラグインの組み合わせで、カーソルなどの表示がおかしくなるようでした。

![スクリーンショット 2020-12-19 17.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965805/acc8dfbf-df1b-6fb6-2e05-056e168632d2.png)

#### ■ 対応方法

フォントをMenloからRictyに変更することで解消しました。

※ 解消後の画面
![スクリーンショット 2020-12-19 17.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965805/eb5230cd-aa57-d696-55f3-79055c627f2a.png)

# 最後に

Big SurへのアップデートでMacVim-KaoriYaが動かなくなった際は非常に焦りました。。
こちらの記事が、同じ症状でお困りの方のお役にたてば幸いです！
Markdownにbibtexの参考文献を入れる


pandocを使って，Markdownで書いたbeamer (に限らずLaTeX）からPDFを作る際にbib形式の参考文献を入れる方法をメモします。[pandoc-citeproc](https://github.com/jgm/pandoc-citeproc)に書いてある情報がありますが，もう使われていないので注意。`--citeproc`オプションを使用。

# bibを作る。

Zoteroのクイックコピーの設定でBetter BibTeXを選んでおくとCommand+Shift+Cでbib形式でコピーできるので便利。

![zotero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/0d2d96c3-2724-cd3c-b951-56ec00bd8877.png)


# CSL

スタイルを[Zotero Style Repository](https://www.zotero.org/styles)から取得。文献がbibでもスタイルはCSLで指定。

![csl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/668af60a-2b57-d6d6-3b5b-5ec408742423.png)


# YAMLヘッダ

```YAML
bibliography: rbf.bib                                    
csl: american-meteorological-society.csl 
```

# 引用の仕方

citekeyが`Hardy:1971`の場合。

* Hardy (1971) `@Hardy:1971`
* (Hardy 1971) `[@Hardy:1971]`複数の文献は`;`で区切る。
* 引用箇所に表示しないがリストに載せる。
   - マイナスをつけると年だけになる。`-@Hardy:1971` `[-@Hardy:1971]`
   - YAMLヘッダの`nocite:`フィールドに書く。

# 参考文献リスト

`# References` `Bibliography`と書くだけ。
`# References {.allowframebreaks} `と書くと複数のスライドにわたって出力される。

# pandocコマンドの例

```zsh
% pandoc foo.md -o foo.pdf --pdf-engine=xelatex --citeproc -t beamer -V theme:Madrid
```

`xelatex`に関しては他をあたってください。

# おまけ

テンプレートをカスタマイズするには，pandocにテンプレートを出力させて保存，編集。`--template`で指定。

```zsh
% pandoc -D beamer > mytemplate.tex
```

# 参考文献

* Pandoc User's Guide
    - [Citation rendering](https://pandoc.org/MANUAL.html#citations)
    - [Template](https://pandoc.org/MANUAL.html#templates)
* [RMarkdown Bibliographies and Citations](https://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html)
均等論に関する判例

特許法第68条(特許権の効力)には、以下のように規定されています。

>特許権者は、業として特許発明の実施をする権利を専有する。

>ただし、その特許権について専用実施権を設定したときは、専用実施権者がその特許発明の実施をする権利を専有する範囲については、この限りでない。

特許権者(又は専用実施権者)は、業として特許発明の実施をする権利を専有します。したがって、業として特許発明の実施をする権利を正当に有しない者が業として特許発明の実施をした場合は、権利侵害となります。

権利侵害を回避するためには、特許発明とは異なる発明を実施すれば良いことになります。特許発明と異ならせるためには、特許発明がどの範囲まで及ぶかを把握する必要があります。

「特許発明」の技術的範囲については、特許法第70条第1項に、以下のように規定されています。

>特許発明の技術的範囲は、願書に添付した特許請求の範囲の記載に基づいて定めなければならない。

「特許請求の範囲の記載」については、特許法第36条第5項に、以下のように規定されています。

>第二項の特許請求の範囲には、請求項に区分して、各請求項ごとに特許出願人が特許を受けようとする発明を特定するために必要と認める事項のすべてを記載しなければならない。

したがって、特許請求の範囲に区分して記載された「請求項」によって特定される発明が、特許発明となります。

そして、請求項には、一般的には、発明を特定するための構成(要素)が記載されるので、請求項に記載された構成(要素)の全てを備えたものが、特許発明となります。

権利侵害を回避するためには、請求項に記載された構成(要素)を変更した発明を実施すればよいこととなります。

請求項に記載された構成(要素)が1つでも欠けている発明に対しては、特許権者は、特許権を行使できません。

特許発明の技術的範囲は、請求項に記載された構成(要素)の全てを備えたものに限るという原則を、「権利一体の原則」といいます。

# 文言侵害と均等侵害

業として特許発明の実施をする権利を正当に有しない者が、請求項に記載された構成(要素)の全てを備えた発明を実施することで特許権を侵害することを、「文言侵害」といいます。

しかし、請求項に記載された文言通りに解釈すると、特許権の侵害を簡単に回避できてしまい、特許発明の保護が不十分となる恐れがあります。

そこで、請求項に記載された文言通り解釈すれば権利侵害とはならないものの、所定の要件に該当する特許発明を実施している場合は、特許発明と均等な発明が実施されたとして、特許発明の技術的範囲に属する発明を実施していると解釈されます。

特許権者からすれば、特許発明の技術的範囲（特許権の効力が及ぶ範囲）が拡張されると見ることも可能です。このように、所定の要件を満たすとき、特許発明の技術的範囲（特許権の効力が及ぶ範囲）が拡張することが認める理論を、均等論といいます。

また、特許発明と均等な発明を実施することで特許権を侵害することを、「均等侵害」といいます。

なお、特許権の侵害の有無は、まずは、「文言侵害」であるかどうかを判断します。「均等侵害」は、「文言侵害」であるとは考えられない場合に、続いて判断されるべきものです。

# ボールスプライン軸受事件

均等の要件は、ボールスプライン軸受事件(最高裁平成10年2月24日第三小法廷判決)によって、以下のように判示されています。

>特許請求の範囲に記載された構成中に対象製品等と異なる部分が存する場合であっても、
>（１）右部分が特許発明の本質的部分ではなく、
>（２）右部分を対象製品等におけるものと置き換えても、特許発明の目的を達することができ、同一の作用効果を奏するものであって、
>（３）右のように置き換えることに、当該発明の属する技術の分野における通常の知識を有する者（以下「当業者」という。）が、対象製品等の製造等の時点において容易に想到することができたものであり、
>（４）対象製品等が、特許発明の特許出願時における公知技術と同一又は当業者がこれから右出願時に容易に推考できたものではなく、かつ、
>（５）対象製品等が特許発明の特許出願手続において特許請求の範囲から意識的に除外されたものに当たるなどの特段の事情もない
>ときは、右対象製品等は、特許請求の範囲に記載された構成と均等なものとして、特許発明の技術的範囲に属するものと解するのが相当である。
>(適宜改行を挿入しました)

上記の均等の要件を、均等5要件ともいいます。なお、文中の「対象製品等」は、「相手方が製造等をする製品又は用いる方法」です。また、「右部分」は、「対象製品等と異なる部分」です。

また、第4要件が若干読みづらいかもしれませんが、第4要件は、「対象製品等」が、「特許発明の特許出願時における公知技術と同一又は当業者がこれから右出願時に容易に推考できたもの」であれば、「対象製品等」は何人も特許権を取得できなかったはずのものであるので、そのような技術に特許権の効力を及ぼすことはできないという考えに基づく要件です。

# マキサカルシトール製法事件（知財高裁）

均等5要件の主張立証責任については、マキサカルシトール製法事件の知財高裁判決の、「第４ 当裁判所の判断」「１ 訂正発明との均等の成否について」「(1) 均等の５要件及び立証責任について」において、以下のように示されています。

> 第１要件ないし第５要件の主張立証責任については，均等が，特許請求の範囲の記載を文言上解釈し得る範囲を超えて，これと実質的に同一なものとして容易に想到することのできるものと認定される範囲内で認められるべきものであることからすれば，かかる範囲内であるために要する事実である第１要件ないし第３要件については，対象製品等が特許発明と均等であると主張する者が主張立証責任を負うと解すべきであり，他方，対象製品等が上記均等の範囲内にあっても，均等の法理の適用が除外されるべき場合である第４要件及び第５要件については，対象製品等について均等の法理の適用を否定する者が主張立証責任を負うと解するのが相当である。

すなわち、第１要件～第３要件は特許権者側に主張立証責任があり、第４要件及び第５要件は権利侵害を主張された側に主張立証責任があります。

なお、判例では、上記引用部分の前に、均等論の考え方に関する記載があるので、均等論の理解を深めるために参照すると良いと思います。

# 参考文献

* [特許権侵害 -侵害論 2 -(塚原国際特許事務所)](http://www.tsukahara-ip.com/patinf4.html)
* [均等論(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%9D%87%E7%AD%89%E8%AB%96)
UMLでgoのpackage間の依存関係をvalidationするlinterを書いた話

この記事は Go2 Advent Calender 2020 の 19 日目の記事です。

今年、業務の中でメンバー間でコードの各パッケージの役割とその依存関係に対する認識が異なり、コードの依存関係が複雑化してしまう。といったようなことを感じる機会が何度かありました。パッケージ間の依存関係が整理されず複雑化してしまうと、以下のような問題が生じると思います。

- 外部のAPIと連携するためのパッケージにロジックが直接依存し、コードが具体的なことを知りすぎてしまい、メンテナンスがしにくくなってしまう
- 複数のpackageの機能を跨いだテストが随所に書かれてしまい、パッケージを独立に開発・テストすることが難しくなってしまう

このような状況を避けるために、依存関係を明文化し、継続的にメンテナンスするための仕組みは作れないかな？と思い作ってみたという話です。

## UMLで依存関係を定義する

UML (Unified Modeling Language)は、システムの全体的な構成やその依存関係を記述するのに広く使われており、ソフトウェア開発の中でよく使われていると思います。

私も業務でよく[PlantUML](https://plantuml.com/ja/)を使い、システムの設計やシーケンスその他もろもろの資料を作成しています。

ここでは、UMLライクにgoのpackage間の依存関係を記述します。

手元に適切なコードがなくて恐縮なのですが、今回の場合は、自分の適当なpackageを選びます。

https://github.com/sodefrin/appengine-boilerplate

このpackageがimportしている全てのpackageを役割ごとに分類してみると以下のようになります。

```
main : github.com/sodefrin/appengine-boilerplate
app : github.com/sodefrin/appengine-boilerplate/app
controller : github.com/sodefrin/appengine-boilerplate/app/controller
model : github.com/sodefrin/appengine-boilerplate/app/model/xo

proto : github.com/sodefrin/appengine-boilerplate/proto
proto : github.com/grpc-ecosystem/grpc-gateway/runtime
proto : github.com/golang/protobuf/descriptor
proto : github.com/golang/protobuf/proto
proto : github.com/golang/protobuf/ptypes/empty
proto : github.com/grpc-ecosystem/grpc-gateway/utilities
proto : google.golang.org/genproto/googleapis/api/annotations
proto : google.golang.org/grpc
proto : google.golang.org/grpc/codes
proto : google.golang.org/grpc/grpclog
proto : google.golang.org/grpc/status

util : github.com/sodefrin/appengine-boilerplate/log
util : go.uber.org/zap
```

- main : コードのエントリーポイント。
- app : 各種DIを実行し、サーバーを起動するコード。
- controller : リクエストをハンドリングし、各種ロジックを実行するコード。
- model : DBを操作するコード。
- proto : GRPCのサーバの生成コード。
- util : loggerなどのどこから呼び出してもいいコード。

これらの間の依存関係として矢印のような依存関係が存在します。

```
main -> app
app -> proto
app -> controller
app -> model
controller -> proto

main -> util
app -> util
controller -> util
```

この関係性をPlantUMLを使って図示すると以下のようになります。

![bLDBRiKW3DnpYbmWOTz5xq8IFse9R0H6RNhw0idxIK_DOnEPySnWOjiRfE5Zi2XVUPuMzZhn2fU8f4q8G1O9nfdHGGpE2AY2zl0hgXOcYUmArYlLTwdoXUsw3PfA_x1I8R9mbxufNkaiEqDspy_vebT8IyGW7DzXlsqRP0kGDFWIlEJ7i8omSDgIm76qfV1li-cOIT13homBEXI4T1SoMmVJNjl4qMeBr99wJvc0gVn0r8Q8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846386/74b15c7d-617d-a4ce-3ad9-128a9d3df2e6.png)

## packageの依存関係をvalidationする

今回作成したlinterでは、前述したようなUMLでの依存関係の定義に基づいてソースコードを解析し、違反するimportがないかvalidationします。

https://github.com/sodefrin/archi-checker

例えば、下記のように、違反するimportがあると教えてくれます。

```
$ archi-checker -s $(go list ./... )
main.go:9:2: cannot import github.com/sodefrin/appengine-boilerplate/proto (proto) from github.com/sodefrin/appengine-boilerplate (main)
```

参照リンク：

https://github.com/sodefrin/appengine-boilerplate/pull/5

## 試してみた結果

現在、私が業務で書いているコードの依存関係をUMLで定義し、上記linterを回してみたのですが、あまりにも多くのエラーが存在し、修正はできませんでした。現実は厳しい・・・。

また、UMLをメンテナンスするコストもかなり高く、結構しんどいかもな、という気がしています。

<b>linterにしなくても依存関係がUMLなどで明文化して共有されていれば、コードレビューで指摘できるので十分では・・・・？という個人的な結論になりました。</b>

とはいえ、定期的に依存関係を整理して図示して見直してみたりすることは有益だと思うので、機会があると試してみるといいかもしれません！

最後までお付き合いいただきありがとうございました。
【Three.js】美しくゆらゆらゆがむシェーダー

# マウスの位置に合わせて画像の揺れが変わる

コード
・画像ありの四角形を描画する
・マウスのy座標に合わせて、四角形に適用されたシェーダーの値が変化する

コード内に解説は全て書きました。
![text6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/4d1f5f7f-7008-2521-9643-7950eae562bf.gif)

<p class="codepen" data-height="1065" data-theme-id="dark" data-default-tab="js,result" data-user="yamkaz" data-slug-hash="OJRgoNJ" 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="ThreeJS: Plane Geometry + imagg + Distoration">
  <span>See the Pen <a href="https://codepen.io/yamkaz/pen/OJRgoNJ">
  ThreeJS: Plane Geometry + imagg + Distoration</a> by やまかず / Kazuyuki Yamamoto (<a href="https://codepen.io/yamkaz">@yamkaz</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
アドベントカレンダー17日目：SREを読んでみた「Googleにおける自動化の進化」編③

前回は、自動化の価値について、学びました。
今回は、実際にGoogleで行われた自動化の実例を見ていきます。

## Googleの自動化の歴史①

Google Adsのプロダクト軍は長きにわたり、データをMySQLデータベースに保存していました。GoogleSREのあるチームがそれを管理する役割を持っていました。2005年から2008年にかけて、システムの重要な部分を自動化し、Adsのデータベースは十分管理されており、最適化とスケーラビリティが簡単に行えるようになるにつれ、システム開発は、次のレベルへ向かうことになりました。
つまり、MySQLをGoogleをBorg（Googleのクラスタスケジュールシステム）へ移行することを行い始めました。

この移行には、以下のようなメリットがあると考えました。
> * **マシン/レプリカのメンテナンスを完全になくすことができる。Borgは、新しいタスクや壊れたタスクのセットアップ/再起動を自動的に処理できるだろう**
* **単一の物理マシンへの複数のMySQLのインスタンスの格納。Borgは、コンテナを使って、マシンのリソースの活用効率を上げることができるだろう。**<sup>1</sup>

2008年の終わりには、検証環境でMySQLインスタンスをBorgにデプロイすることに成功しましたが、問題がありました、それはBorgの運用上の特徴の一つに、タスクが自動的に移動するということがあり、その頻度が週1から2回ありました。この頻度はBorgマスターでは受け入れがたいものでした。なぜなら、この時点ではマスターのフェイルオーバーはインスタンスごとに30から90分かかっていました。共有マシンを使っており、通常のマシンの障害の頻度やカーネルのアップデートによる再起動が必要だったため、数多くのフェイルオーバーが発生することを覚悟しなければなりませんでした。
これは、この時Googleが持っていた可用性などの要件を満たしませんでした。この解決の為に残された選択肢はフェールオーバーを自動化することでした。（実際には、他にも自動化しなければならないものがありましたが）
2009年に「Decider」という自動フェイルオーバーデーモンを完成させました。
このデーモンは、予測されているかどうかに関わら95%のフェイルオーバーを30秒以内に完了させるものでした。これにより、当初目的としていたMySQL on Borg（MoB）を実現し、インフラストラクチャの最適化から障害復旧の最適化を行うようなりました。
しかし、これに伴い、新しいコストも発生しました。すべてのアプリケーションを修正し、より耐障害性の高いロジックを持たせる必要がありました。
ですが、MoBによりチームが日常的に費やすコストの95%を削減することができました。
また、複数のMySQLインスタンスを同じマシン上にスケジューリングできるようになったことにより、ハードウェアの利用率が改善されました。

このように、既存の手作業を自動化するのではなく、プラットフォームの実現に労力をさくことは、とても有意義です。
次回は、さらに難しいトレードオフについて、見ていきます。

##まとめ
* システムの成熟に伴い、自動化のシステムも進化する。
* 手作業の自動化でなく、自動化のプラットフォームを実現することを考える。

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　77-79
gtest を Xcode で動かしたい

# gtest を Xcode で動かしたい

単にリンクを貼るのではなくて、XCUnit の一部として gtest を動かすという、ちょっとマニアックな記事。

## gtest/gtest.h を偽装する。

一般的な gtest は #include <gtest/gtest.h> があるので、ここを接合点として区切る。

区切った後につなぎ合わせるヘッダはこんな感じ

```cpp
#define TEST_F(classname, testname) - (void) test ## testname
namespace testing {
class Test {
}
}
```

## Unit Test クラスを作成する。

Xcode から Unit Test クラス（言語は Objective-C）を作成する。

その後、名前を *.m から *.mm に変更し、Objective-C++ とする。

次に @implementation ~ @end の間に #include "~.cpp" を追加する。
Objective-C のカバレッジが取りたい人が読むページ


# はじめに
iOS ライブラリのテストカバレッジを取るのに苦戦したので、まとめる。

# Jenkins を用いたカバレッジレポートの出力

[Cobertura Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Cobertura+Plugin) を使ってカバレッジを出力します。
Objective-C のカバレッジツールで Cobertura XML 形式で結果を出力し、
結果をプラグインに読み込ませることでグラフ化できます。

## 事前準備

プロジェクトの設定で、下記のオプションを YES にします。

- Generate Test Coverage Files (Xcode 7 以降は Generate Leagcy Test Coverage Files) 
- Instrument Program Flow

ただし、Xcode 7 でこの設定を使うと、まれにテスト実行後に落ちることがあります（[ここ](https://forums.developer.apple.com/thread/9765)とか、[ここ](https://github.com/jonreid/XcodeCoverage/issues/40)とかを参照）。
そのため、テスト「実行前」に下記を叩いておくのが無難です。
※slather については後述

```shell-session
slather setup path/to/xcodeproj
```

## [XcodeCoverage](https://github.com/jonreid/XcodeCoverage) を使う場合

本家をみると、標準的な方法と CocoaPods を利用する方法の２種類があります。
ここでは、標準的な方法を例に環境を作る方法を紹介します。

### Xcode 6 以前

1. 適当な場所で XcodeCoverage をクローンする。

    ```shell-session
    git clone https://github.com/jonreid/XcodeCoverage.git
    chmod -R +x XcodeCoverage/lcov-*/bin
    ```

2. Xcode のプロジェクト設定の Run Script に XcodeCoverage/exportenv.sh を実行するように設定する。

3. xcodebuild でテストを実行する。

    ```shell-session
    xcodebuild clean test -project path/to/xcodeproj -scheme scheme -destination 'platform=iOS Simulator,name=iPhone6s'
    ```

4. XcodeCoverage/getcov でカバレッジを取得する。

    ```shell-session
    XcodeCoverage/getcov --xml
    ```

5. [gcovr](http://gcovr.com/) でカバレッジ結果を Cobertura XML 形式に変換する。

    ```shell-session
    brew install gcovr
    gcovr 
    ```

### Xcode 7 以降

1. について
    lcov のプログラムが足りないため、[lcov](http://ltp.sourceforge.net/coverage/lcov.php) から足りないプログラムを持ってくる必要があります（[ここ](https://github.com/jonreid/XcodeCoverage/issues/40)を参照）。

    ```
    git clone https://github.com/jonreid/XcodeCoverage.git
    git clone https://github.com/linux-test-project/lcov.git
    cp lcov/bin/* XcodeCoverage/lcov-*/bin
    ```

2. について
    カバレッジデータが出力される場所が変わったため、パスを変更する必要があります。

3. 以降は Xcode 6 と同様。

## [Slather](https://github.com/venmo/slather) を使う場合

1.  xcodebuild でテストを実行する。
2.  slather でカバレッジ結果を出力する

    ```shell-session
    slather --cobertura-xml --build-directory path/to/gcda path/to/xcodeproj
    ```

# 開発中のカバレッジ取得

## Xcode 6 以前

### XcodeCoverage を使う場合

getcov に --show オプションを追加するとカバレッジレポートを取得できます。

### Slather を使う場合

slather に --html --show オプションを追加するとカバレッジレポートを取得できます。

## Xcode 7 以降

1. Enable Coverage を YES にします。

2. Enable Coverage にチェックを入れます（各環境ごとに必要です！）

3. テストを実行すると、コード上にカバレッジ結果が表示されます。

4. レポートとしてみたい場合


# 最後に

カバレッジが取得できるようになると、テストコードを書くモチベーションが上がるので、ぜひ環境構築したいところですね。

若干ややこしいですが、トライしてみる価値はあると思います。
【Laravel】外部キーを設定するにはデータ型を揃えること

#【Laravel】外部キーを設定するにはデータ型を揃えること

###使用環境
* windows10
* XAMPP 7.3.18
* Laravel 6.*

##背景
Laravelでテーブルを作成し、外部キーを設定しようとしているのにエラーが発生する。

###エラー内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/17276c5f-6417-3023-fe05-5020a9f6b424.png)

```
SQLSTATE[HY000]: General error: 1005 Can't create table 'hoge'.'hoge'(errno:150 "Foreign key constraint is incorrectly formed")")

```

##原因
今回の原因はデータ型が適切でないことだった。
[【Laravel】migrate時の「Foreign key constraint is incorrectly formed」エラーの解消方法](https://blog.websandbag.com/entry/2018/05/23/201708)


##対処法
参照先```$table->increments('id')```のとき、参照先カラムのデータ型が符号なしの整数型だったため、外部キーを設定するカラムも符号なしの整数型```$table->unsignedInteger('user_id')```で指定する必要があるらしい。

データ型を適切に指定し、```php artisan migrate:refresh```でテーブルをすべて作り直し解決！