OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 & .NET Framework の環境で印刷するとメモリリークする

# 背景

Windows 7 の頃には問題なかった処理が Windows 10 に変更するとメモリリークするようになったので調べてみた。

# 再現コード

```C#
var server = new LocalPrintServer();
var queue = server.GetPrintQueue(this.SelectedPrinter.Value);
var writer = PrintQueue.CreateXpsDocumentWriter(queue);
if (!String.IsNullOrWhiteSpace(this.SelectedFilePath.Value))
{
    writer.Write(this.SelectedFilePath.Value);
}
```

# 解説

Windows 7 の頃はこれで問題なかったのだが、 Windows 10 では GetPrintQueue() で取得した PrintQueue がメモリリークすることがある。

具体的には、 XpsDocumentWriter.Write() を実行すると、 Windows 10 では COM Surrogate (dllhost.exe) に処理を委譲するようになっており、印刷が終わっても PrintQueue が破棄されるまでメモリが解放されないようだ。

プリンタドライバを古いものに替えると起きなくなったので、ドライバの不具合を疑いメーカーに問い合わせした所、 **PrintTicket に対応したドライバを使用すると起きる**らしい。
dllhost.exe は OS のモジュールなのでメーカー側ではどうしようもできないようだ。

# 解決方法

印刷が終わったら PrintQueue を Dispose すればメモリが解放される。

```C#
var server = new LocalPrintServer();
using(var queue = server.GetPrintQueue(this.SelectedPrinter.Value))
{
    var writer = PrintQueue.CreateXpsDocumentWriter(queue);
    if (!String.IsNullOrWhiteSpace(this.SelectedFilePath.Value))
    {
        writer.Write(this.SelectedFilePath.Value);
    }
}
```

# 感想

本来、これが行儀のいい書き方なので、困っている人はあまりいないかもしれないが、 Visual Studio で印刷すると同様のリークが起きたりするので、 Microsoft 内でも想定外なバグなのかもしれない。
サンプルのコードなんかを単純にコピペしてる人は困っているかもしれない。

しかし、自分で new したものを Dispose するのは忘れないが、 GetPrintQueue() 内で新規にインスタンスが作成されていると思わないし、フレームワークが返したオブジェクトを勝手に Dispose してもいいのかとか色々考えてしまうので、あまり良い実装でないように思う。

因みにこのリークは .Net Core では起こりません。

サンプルコードは[こちら](https://github.com/SatohNorio/ReportPrinter)
Ubuntu 18.04.4 LTS、Apache/2.4.29、php 7.2.24で、HTTP/2に対応する方法

#はじめに
まず最初に理解しておくことは、
UbuntuのApacheデフォルト設定の`"prefork" MPM (Multi-Processing Module)`は、HTTP/2をサポートしていないということです。
場所： `/etc/apache2/mods-enabled/mpm_prefork.load`

したがって、単純にHTTP/2の設定をするだけでなく"prefork" MPMモジュールも別のものに切り替える必要があります。

下記がその全手順です。

# fpm版のphpインストール
デフォルトのphpが、preforkモジュールに依存しているので、fpm版のphpに切り替えます。

```
sudo apt install php7.2-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.2-fpm
sudo a2dismod php7.2
sudo service apache2 restart
```



# preforkモジュールからeventモジュールに切り替え
preforkモジュールをeventモジュールに切り替える

```
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo service apache2 restart
sudo service php7.2-fpm restart
```

# HTTP/2の設定
`/etc/apache2/sites-available/000-default-le-ssl.conf`の
`<VirtualHost>`に下記を追加します。

```
Protocols h2 h2c http/1.1
```

# http2モジュールをONに
http2モジュールをONにします。

```
sudo a2enmod http2
sudo service apache2 restart
```



以上です。お疲れさまでした。
AWS GuarDutyでS3バケットへのログ保存について

覚書です。
１．AWS GuarDutyを有効にする
２．S3バケットへのログ保存のためGuarDuty画面から
　　［設定］－［結果のエクスポートオプション］でS3バケットを新規に作成し保存をするが
　　KMSが無いので失敗

３．KMSキーをKMS Console画面から作成する
４．GuarDuty画面に戻って再度KMSキー（エイリアスが選択できる）を選択してほぞんするが失敗
５．KMS Console画面に戻って［カスタマー管理型のキー］で対象のエイリアスを選択し
　　キーポリシーエディタを編集で開く※これを実施しないとずーっとエラー

　　{
    "Sid": "Allow GuardDuty to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "guardduty.amazonaws.com"
            },
            "Action": "kms:GenerateDataKey",
            "Resource": "*"
　　}

　　上記内容を適当な場所に追加して保存

６．再度GuardDuty画面からS3バケット作成、キー選択、保存することで成功

７．6時間おきに収集していたので翌日確認したところ年＞月＞日　のフォルダにgzファイルとして
　　保存されていた。

以上
SNSアイコン・ロゴのリンク

* [Facebook Brand Resources](https://ja.facebookbrand.com/facebookapp/assets/%e3%80%8cf%e3%80%8d%e3%83%ad%e3%82%b4/)
* [Twitter Brand
Resources](https://about.twitter.com/en_us/company/brand-resources.html)
* [LINE APP ICON GUIDELINE](https://line.me/ja/logo)
新規タブを開くアイコンを非表示にする方法

いつも忘れてしまうため備忘録

```html
<div class="sample">
  <a href="https://www.sample.com" rel="nofollow" target="_blank"></a>
</div>
```

```css
.sample a[target="_blank"]::after {
  content: none;
}
```
デコレータ

```python:decorator.py
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args,**kwargs)
        print('end')
        return result
    return wrapper

#関数に何かを付け加える場合に便利（デコレーターを複数適用する場合は順番に注意）
@print_info
def add_num(a, b):
    return a+b

r = add_num(10,20)
print(r)
#デコレータを使わない場合、下記のように書けるが分かりにくい
#f = print_info(add_num)
#r = f(10,20)
#print(r)
```
出力：

```
start
end
30
```
●リスト　の"●"を疑似要素にしてカスタマイズする

## 問題点
こんなリストがあったとします。

* リスト1
* リスト2
* リスト3

みなさんは●の部分の色を変えたいと思った時どうしているでしょうか。

```
<li><span>●</span>リスト1</li>
```

こんな感じでspanにCSSで色を付けたりしている方も多いと思います。
しかしこのやり方だとサイズの微調整が難しかったり、微妙に上や下にずれたり、HTMLコードが煩雑になったりして難点も多いです。

## クラスをつけて疑似要素にする
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sphenisc" data-slug-hash="GRJovNR" 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="GRJovNR">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/GRJovNR">
  GRJovNR</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
●をつけたいリストにclass名をつけてCSSで疑似要素として●を付けています。
後から■や画像に変えるのもCSSから一気にできるので楽ちんです。
Dark Sky APIで値を取ってきたらエラーがでる

### 問題
Vue.jsとFirebaseを使ってお天気アプリ作成中にDark Sky APIから値を取ってこようとしたら下記エラーがでた
<img width="630" alt="スクリーンショット 2020-02-03 14.49.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/e0528223-b3b1-14ff-a93a-feb4aa981552.png">

### 解決
urlの前に`https://cors-anywhere.herokuapp.com`をつける

```javascript:weather-mixin.js
getTemperature() {
      this.$axios
        .get(
          "https://cors-anywhere.herokuapp.com/https://api.darksky.net/forecast/APIキー/37.8267,-122.4233",
          {}
        )
        .then(result => {
          console.log("結果", result);
          this.temperature = Temperature.create(result);
          console.log("temp", this.temperature);
        })
        .catch(error => {
          console.log(error);
        });
    }
```

<img width="549" alt="スクリーンショット 2020-02-13 19.00.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/ed638150-837d-2f92-fbf2-32abbcdc42eb.png">
Ruby　コーティング規約について　コレクション編　1

# はじめに
[命名規則編 2 はこちらをクリック願います。]
(https://qiita.com/raigakun/items/9db169935baa654af90d)
[レイアウト編 3 はこちらをクリック願います。過去記事リンクあり。](https://qiita.com/raigakun/items/7416db5b4d70ea93046e)
[構文編 2 はこちらをクリック願います。過去記事リンクあり。](https://qiita.com/raigakun/items/80ba30671d7b2b18c44e)
Rubyの基礎を学習中の方に向けて記載致します。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。


##① 配列やハッシュを生成する時はリテラル記法を使う。

```qiita.rb
# 悪い例
arr = Array.new
hash = Hash.new

# 良い例
arr = []
arr = Array.new(10)
hash = {}
hash = Hash.new(0)
```

##単語(空でなく、スペースを含まない文字列)の配列を生成する時は %wリテラルを使う。
 ※　配列の要素が２つ以上の場合に限り。 

```qiita.rb
# 悪い例
STATES = ['draft', 'open', 'closed']

# 良い例
STATES = %w[draft open closed]
```

#さいごに
毎日更新します。
皆様の復習等にご活用頂けますと幸いです。
コマンドラインで blender から python script を起動するときの引数の渡し方

# やりたいこと
コマンドラインから blender をバックグラウンドで起動して、blender の処理を python で実行する。
python を動かすときに、いくつかの引数を持たせたい。

引数の整理をしやすいように python の argparse ライブラリを使う。


# エラー
run.bat のように引数をとって実行する。

```bash:run.bat
blender.exe --background --python generate.py --gender f --location i
```

と、エラーが出力される。
'--' が引数のリストにないとのこと。

```
  File "C:\hogehoge\generateData\generate.py", line 23, in
<module>
    args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:])
ValueError: '--' is not in list
unknown argument, loading as file: --gender
Error: Cannot read file 'C:\hogehoge\generateData\--gender': No such file or directory
```


# 解決方法
blender で python script に引数を持たせる場合の作法があるようで、引数の前に '--' をつける。

```bash:run.bat
blender.exe --background --python generate.py -- --gender f --location i
```

そうすると、引数は sys.argv で保持する。
sys.argv から argparse で引数を取り出すまでの python コードは以下のようになる。

```python:main()
import sys
import argparse

if '__main__' == __name__:
    parser = argparse.ArgumentParser()
    parser.add_argument('--gender', type=str, choices=['f', 'm'], required=True,
        help='gender: f->female, m->male')
    parser.add_argument('--location', type=str, choices=['i', 'o'], required=True,
        help='location: i->inside, o->outside')
    
    args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:])
    gender = args.gender
    location = args.location
```


# 所感
argparse を使って引数を取り出すところの sys.argv[sys.argv.index('--') + 1:] はおまじない感がある。


# 参照
- https://blender.stackexchange.com/questions/6817/how-to-pass-command-line-arguments-to-a-blender-python-script
Rで第一・第三四分位数を求めるテンプレート

###### tags: `rBasicLearning`
# 四分位数

##  1. 四分位数を求めるテンプレート
四分位数を求めるテンプレートは, 以下に作りました.
宜しければ, 使ってください！
1. データの大きさの剰余で奇数か偶数かの分岐をif文で作ります
2. 前半のデータをデータの大きさの整数商で分けます（整数商にするのは, データの大きさが奇数でも偶数でも変わらないようにするためです）
3. 前半・後半のデータを取り出します（後半のデータは前半のデータを取り除く形で表しています）
4. 前半・後半のデータの中で中央値を取ります

```r
Q1Q3 = function(x) {
  n = length(x)
  if (n %% 2 == 0) {
    firstHalf <- n %/% 2
    firstHalfData <- x[1:firstHalf]

    latterHalfData <- x[-(1:firstHalf)]
  } else {
    firstHalf <- n %/% 2
    firstHalfData <- x[1:firstHalf]
    
    latterHalfData <- x[-(1:(firstHalf + 1))]
  }
  return(c(Q1 = median(firstHalfData), Q3 = median(latterHalfData)))
}
```
##  2. 具体例
###  使うデータ
今回は, 奇数の大きさのデータ（oddData）と
偶数の大きさのデータ（evenData）を使います

```r
oddData <- c(62, 64, 65, 67, 67, 68, 70, 73, 77, 80, 82)
evenData <- c(18, 20, 21, 23, 23, 25, 27, 29, 30, 31, 32, 39)
```
###  データの具体例

```r
oddData <- c(62, 64, 65, 67, 67, 68, 70, 73, 77, 80, 82)
Q1Q3(oddData)

evenData <- c(18, 20, 21, 23, 23, 25, 27, 29, 30, 31, 32, 39)
Q1Q3(evenData)
```
#### データの出力
```r
> evenData <- c(18, 20, 21, 23, 23, 25, 27, 29, 30, 31, 32, 39)
> Q1Q3(evenData)
  Q1   Q3 
22.0 30.5 
```
EXcel VBAで全てのExcelファイル（サブフォルダを含む）を探して処理する

#概要
指定されたフォルダの中にある全てのExcelファイル（サブフォルダ内も含む）を処理するコード

#参照設定
FileSystemObject、Folderオブジェクト、Fileオブジェクトを使うので参照設定。

- コードエディタ
- →「ツール」
- →「参照設定」
- →「Microsoft Scripting Runtime」にチェック
- →「OK」

#コード

```vb

Sub main()
    Dim targetFolder As String
    targetFolder = "C:\hoge"
    
    SearchFolder targetFolder
End Sub

Sub SearchFolder(ByVal path As String)
    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    
    Dim tFol As Folder
    Set tFol = FSO.GetFolder(path)
    
    '全てのフォルダを探索する
    Dim fol As Folder
    For Each fol In tFol.SubFolders
        SearchFolder fol.path
    Next
    
    '全てのファイルをチェックする
    Dim fi As File
    For Each fi In tFol.Files
        '一時ファイルは除外
        If Left$(fi.Name, 2) <> "~$" Then
            'Excelファイルのみ
            If Right$(fi.Name, 5) = ".xlsx" Then
                ProcFile fi.path
            End If
        End If
    Next
End Sub

Sub ProcFile(ByVal path As String)
    'ファイルごとの処理
End Sub

```
TypeScript: オブジェクトリテラルはメソッドオーバーロードできない問題と解決策

TypeScriptでは、オーバーロードメソッドを定義できますが、オブジェクトリテラルにはオーバーロードメソッドを書くことができません。例えば、次のコードは`bar`メソッドを複数定義しようとする例ですが、コンパイルエラーになります。

```typescript
// コンパイルエラーになるコードです
const Foo = {
  bar(value: number): number
  bar(value: string): string
  bar(value: any): any {
    return value
  }
}
```

この問題は、[こちらのTypeScript Playground](http://www.typescriptlang.org/play/#code/MYewdgzgLgBAYiEMC8MDeAoGMBGBDAJwAoA3PAGwFcBTALhjEoFsdqCBKexltrXQ0hRr1oBAJZgA5pxiiJkvvmJkqdGHjABPGRs3o+2AtSiUCYGCpp8AvhmvqIMUJCgYgA)で再現できます。

:bulb: __クラスでのオーバーロード__: TypeScriptのオーバーロードの書き方の基本については、以前「[オーバーロードメソッドを定義する方法](https://qiita.com/suin/items/7d6837a0342b36891099)」で説明したのでご覧ください。今回問題にするのは、クラスでのオーバーロードではなく、オブジェクトリテラルでオーバーロードのやりかたです。

## オブジェクトリテラルでオーバーロードメソッドを作る方法

では、オブジェクトリテラルでオーバーロードメソッドを定義するにはどうしたらいいのでしょうか？ 解決策が2つあります。ひとつずつ見ていきましょう。

### 解決策1: `interface`を定義する

ひとつめの解決策は、`interface`を定義する方法です。この方法では、オーバーロードメソッドの宣言は`interface`に書き、実装はオブジェクトリテラルに書きます。

```typescript
interface FooInterface {
  bar(value: number): number
  bar(value: string): string
}

const Foo: FooInterface = {
  bar(value: any): any {
    return value
  }
}
```

この方法では、クラスのオーバーロードの書き方と異なり、オーバーロードの定義が実装と離れてしまうことがあるものの、ハックのないストレートなコードになります。

### 解決策2: 匿名クラスを使う

ふたつめの解決策は、匿名クラスを使う方法です。この方法は、オーバーロードメソッドの宣言と実装は、同じ匿名クラスに書くことができます。

```typescript
const Foo = new class {
  bar(value: number): number
  bar(value: string): string
  bar(value: any): any {
    return value
  }
}
```

匿名クラスを使うため、ハック感がいなめないコードになりますが、オーバーロードの定義と実装が一箇所で管理できるというメリットはあります。
sqlserver 接続方法についてのまとめ


現在の接続がどのプロトコルで接続されているかの確認。

```
>sqlcmd -U sa -P insight -S (local)\MSSQLSERVER01
1> SELECT net_transport
2> FROM sys.dm_exec_connections
3> WHERE session_id = @@SPID;
4> go

net_transport
----------------------------------------
Shared memory
```

明示的にTCPを指定した場合はTCPで接続される。

```
>sqlcmd -U sa -P insight -S tcp:(local)\MSSQLSERVER01
1> SELECT net_transport
2> FROM sys.dm_exec_connections
3> WHERE session_id = @@SPID;
4> go
net_transport
----------------------------------------
TCP
```


現在のセッションがどのプロトコルで接続されているか、やどのポートから接続されているか確認するクエリ。

```
select * from sys.dm_exec_connections;

51	51	2020-01-20 09:17:52.000	Shared memory	TSQL	1946157060	2	FALSE	NTLM	0	9	9	2020-01-20 09:17:52.080	2020-01-20 09:17:52.087	8000	<local machine>	NULL	NULL	NULL	9EB1E46A-F255-40DB-97C3-CBCA68FDC617	NULL	0x0100010041F2D011B0C89EA5A101000000000000000000000000000000000000000000000000000000000000
52	52	2020-01-20 08:44:40.620	Shared memory	TSQL	1946157060	2	FALSE	SQL	0	18	17	2020-01-20 09:20:46.563	2020-01-20 09:20:46.560	4096	<local machine>	NULL	NULL	NULL	EAB14B05-C5BD-421E-A260-F5B36E26C70A	NULL	0x02000000123E7E259491A4FADE9B1FD9C67F6C92519C5B3D0000000000000000000000000000000000000000
53	53	2020-01-20 08:53:32.870	TCP	TSQL	1946157060	4	FALSE	SQL	0	7	7	2020-01-20 08:53:57.423	2020-01-20 08:53:57.427	4096	172.20.21.32	59893	192.168.100.6	49764	F67AD448-35EC-43C9-A69C-910CFBEB4DC6	NULL	0x02000000BB8CB316E68ED5E40AA8947D6AC94641D6F1B8770000000000000000000000000000000000000000
54	54	2020-01-20 09:16:20.537	TCP	TSQL	1895825409	4	FALSE	SQL	0	18	18	2020-01-20 09:16:20.560	2020-01-20 09:16:20.560	4096	192.168.100.6	50461	192.168.100.6	49764	5B7133FF-A5C7-4E9E-A4AE-150616EB2146	NULL	0x02000000195F78313A29A5559ED8CA53CB2EF8A0E53F8B070000000000000000000000000000000000000000
```

その他SQLServer へのログイン方法は以下を参考に行う。

参考サイト
https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/logging-in-to-sql-server?view=sql-server-ver15
行数が決まっていないテキストを ”上下中央揃え” にする

## いきなり完成版
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sphenisc" data-slug-hash="oNXbwra" 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="oNXbwra">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/oNXbwra">
  oNXbwra</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

pタグのテキストが1行になっても3行になってもちゃんと上下左右中央にテキストが配置されるようにするためのやり方です。
ポイントは

* pタグの高さを指定する
* display: table-cell;
* vertical-align: middle;
historyコマンドで行番号を表示させない

# 実行コマンド
```console
$ history | awk '{$1=""; print}'
```
# 解説
```console
$ history
...
  531  ls -l
  532  ls -l | awk '{$0;print}'
```
`history`コマンドで上記の結果が出力される.
`awk`コマンドでスペース区切りした時の1つ目のフィールドにブランクを代入して出力する.

# 参考
[historyコマンドで行数表示しない](
https://qiita.com/tamahiro/items/1ff30c078390d915b5f5)
[awk で指定したフィールドを削除する | まくまくsed/awkノート](https://maku77.github.io/sed/awk/delete-specified-field.html)
gtk+3.0を使ってウインドウを出してみた#1

#前置き
こんにちは。
今回は、GTK+3.0(C)を使ってUbuntuでウインドウを作ってみようと思います。
(本当はメモ程度です)

使用する環境は
・Ubuntu 19.04 aarch64/arm64 (host: Android 9)
・geany 1.34.1, GTK 3.24.5, gcc 8.3.0
です。

#本題
##開発環境のインストール
Geanyはエディターです、libgtk-3-devは今回のメインのライブラリで、build-essentialはビルドに使うものが詰まってるパッケージです。（今回使うのはgccコマンド）

```bash
$ sudo apt install geany libgtk-3-dev build-essential
...
```

##最初のウインドウを作る
最初に、すっからかんなウインドウを作ります。

```c
#include <gtk/gtk.h> //gtkのライブラリを読み込む

int main(int argc, char **argv) {
  GtkWidget *window; //GtkWidget(int?)にwindowを設置する
  
  gtk_init(&argc,&argv); //処理の初期化
  
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //さっき設置した「window」にGTKのウインドウの処理を追加する
  gtk_window_set_title(GTK_WINDOW(window), "GTK+3.0 App"); //「window」に対して、タイトルを設定する
  gtk_widget_set_size_request(window, 480, 240);  //「window」に対して、サイズを設定する
  
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); //バツボタンが押されたとき、そのプロセスも落とす処理
  gtk_widget_show_all(window); //「window」に対して、全部のウィジェットを表示する
  
  gtk_main(); //ウインドウの表示
  return 0;
}
```
このコードが書き終わったら、ビルドします。

```bash
$ gcc `pkg-config --cflags gtk+-3.0` -o out app.c `pkg-config --libs gtk+-3.0`
```

そして、実行します。

```bash
$ ./out
```

![スクリーンショット_2020-02-14_09-22-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396596/a4f0cd25-e554-7e06-0c66-d3462d912d3b.png)

ちゃんと実行できてる証拠です。

#終わりに
実はこの記事を書いたのはCを始めて一日目で書いたものなので、ところどころおかしいところがあるかもしれません、すみません。
GTK系の記事をちょっとずつ書いていこうかなと思っています。
あと、更新頻度は低いと思います
今回はここまでにします、お疲れさまでした。
Rundeck はじめました： 複数のサーバで1回だけ並行でジョブを実行したい場合の設定

まずは、設定値の説明を備忘録的に残します。

## 「Workflow」設定
### 実行方針
「Workflow」内の「Strategy」で設定します。
Proバージョン以外で利用可能なオプションは：「Node First」「Parallel」「Sequential」。Proでは更に「Ruleset」というオプションもあります。

#### Node First
最初の Node 上でワークフローのすべてのステップを実行し終わってから、次の Node 上の実行へ進む実行方針。複数のサーバで順番に処理が実行される、という意味です。Node の順番はデフォルトではNode名準ですが、どうしても変更したい場合は「Rank Attribute
」と「Rank Order」という設定を活用すればできます。
#### Parallel
Node 上で同時にワークフローのすべてのステップが並行で実行される実行方針です。
#### Sequential
ワークフローの1個めのステップが指定された Node 上で実行されてから、次のステップへ進む実行方針。
#### Ruleset
Proバージョン独自の機能で、ワークフローのステップごとの条件設定など細かい管理ができるオプションです。
### ステップやジョブ実行時の振る舞い設定
「Workflow」部分で設定可能な「If a step fails」の部分もしっかり意識して設定しないといけません。
ステップが失敗した場合、直ちに Failed ステータスにするのか、残りのステップをすべて終えてから Failed とするのかを選びます。
## 「Nodes」設定
### 実行先
Node 指定時に複数を設定することができます。ここで便利なフィルターを使うとラ楽です。Node名が例えば「games-batch-01」「games-batch-02」「web-batch-01」「web-batch-02」があるとして、フィルターでは「games-batch」だけを設定して、検索で確認すると、「games-batch-01」「games-batch-02」が実行先として検出されるのがわかります。
除外フィルターもありますので、「02」だけ抜くのも簡単に設定できます。
### Thread Count
この設定は今回並行実行を設定するにはかなり大事な部分です。
同時進行のスレッド数の設定です。ここでNodeの数と同じにすると、すべてのNodeで同時実行されます。半分の数字にすると、半分のNodeで実行が終わってから、残りの半分で実行が進みます。
### If a node fails
ここはまた失敗時の設定ですが、今回はNode単位です。どれかのNodeで失敗した場合、他のNodeでの実行を続けるべきかどうかを設定します。

```
Fail the step without running on any remaining nodes.
```
上記は、即時にFailedへのステータス変更＆他のNodeでの実行なしという意味です。

```
Continue running on any remaining nodes before failing the step.
```
こちらは、他のNodeでは実行を試み＆終えてから、Failedステータスにするという意味です。

## 複数のサーバで1回だけ並行でジョブを実行したい

この場合どう設定したかというと：

- Strategy は Parallel に
    - If a step fails の設定では私の場合は「Stop at the failed step」にしました
- Node 指定で実行先が複数正しくフィルターで拾得た状態に設定
    - 失敗時の設定は「Fail the step without running on any remaining nodes.」にしました
- Thread Count は Node の数と同じ数字。私の場合は実行先が6個だったので、「6」です。

上記で2ステップがあるワークフローが万が一どこかで失敗した場合、すぐに止まりFailed通知され、他のNodeでの実行へも進みません。
失敗しない状態では、ジョブが6個のNodeで同時に開始され、平行で実行される状態にできました。
クロージャ

```python:closure.py
def outer(a, b):
    #関数内だけで使える関数
    def inner(c):
        return a+b+c
    return inner
#この時点では、関数は実行されていない
f = outer(1, 2)
print(type(f))
print(f)
#()をつけると実行される、関数内関数に引数を渡す場合は、この時に渡す
r = f(3)
print(r)
```


```
<class 'function'>
<function outer.<locals>.inner at 0x112803290>
6
```
Ruby初心者の「結局インスタンスメソッドって何ですか？」にエンジニア歴30年のベテランさん超絶わかりやすいアンサー！！！

## 結論

###インスタンスメソッドとは：インスタンスが(に)使えるメソッド(にくっつくメソッド)

助詞に関しては、インスタンスを主語として考えるか目的語として考えるかの違いです。図で表すとこんな感じ<img width="691" alt="スクリーンショット 2020-02-14 8.38.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513269/181e74f7-3294-7bf8-0168-4232fc15ba0a.png">

#### インスタンスはいわゆる勇者。その勇者の剣がメソッド。つまり「勇者の剣」＝インスタンスメソッドなわけだ！
*ただ剣はモノなので例として完璧ではない。ピカチュウがクラスで、サトシのピカチュウがインスタンスで、十万ボルトがインスタンスメソッドという例の方が正しいかもです。

### 僕の誤解を招いた表現その1
インスタンスメソッドとはインスタンスを含む変数である。*間違い
### 僕の誤解を招いた表現その２
インスタンス変数にくっつくメソッドである　＊惜しい、変数ではなくインスタンス自身にくっつくのがインスタンスメソッド

## そもそもインスタンスって？

#### インスタンス化
クラス(クラスがわからない人は下に説明あります！)はnewすると初期化(インスタンスを作成する方法は他にもあるが基本はnew)し、実体化することができます。実体化したものをインスタンスと呼びます。

#### インスタンス変数
インスタンスは自身の中に複数の値を所有することができます。Rubyでは @ で始まる名前がインスタンスが所有する変数、インスタンス変数です。インスタンスが持つというニュアンスが大切。インスタンスを指し示す変数ではないですよ！
<img width="745" alt="スクリーンショット 2020-02-16 11.48.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513269/23d982ac-2ef2-d934-843a-d9f8b1b43aba.png">



## そもそもクラスってなんぞや？
1と2どちらも同義ですが、自分にわかりやすい方で構いません！
#### 1. 新しい型を作る方法(型ってのは設計図みたいなものですね。）
#### 2. データと処理のまとまりを部品としてわかりやすく定義する方法
Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#3(API 管理)

Google Cloud Platform (GCP)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。


クラウド コンピューティング サービス  |  Google Cloud
https://cloud.google.com/?hl=ja


## Amazon Web Services (AWS)のまとめはこちら！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


## まとめルール

まとめルールについては下記を参考ください。

Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#1(AI と機械学習/AI ビルディング ブロック) - Qiita
https://qiita.com/kai_kou/items/fa930eef23470c2f8f0b


## 概要について

サービス一覧ベージの概要を引用しています。

プロダクトとサービス  |  Google Cloud
https://cloud.google.com/products?hl=ja#product-launch-stages


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## API Management - API 管理

### API Management Platform (Apigee API Platform)

あらゆる場所から API を開発、保護、デプロイ、モニタリングします。

- 正式名称: API Management Platform
- https://cloud.google.com/apigee/api-management/
- 読み方: エーピーアイ マネジメント プラットフォーム
- 略称: なし
- 俗称: なし
- 別名？: Apigee API Platform
  - 読み方: アピジー エーピーアイ プラットフォーム


### Analyze APIs (API Analytics)

API の運用指標とビジネス指標から分析情報を引き出します。

- 正式名称: Analyze APIs
- https://cloud.google.com/apigee/api-management/analyze-apis/
- 読み方: アナライズ エーピーアイ
- 略称: なし
- 俗称: なし
- 別名？: API Analytics
  - 読み方: エーピーアイ アナリティクス


### Monetize APIs (API Monetization)

柔軟で使いやすいソリューションによって API から新たな価値を生み出します。

- 正式名称: Monetize APIs
- 
- 読み方: マネタイズ エーピーアイ
- 略称: なし
- 俗称: なし
- 別名？: API Monetization
  - エーピーアイ マネタイゼーション


### Apigee Hybrid

あらゆる API に対する統合型の API 管理。

- 正式名称: Apigee hybrid
- https://cloud.google.com/apigee/api-management/hybrid/
- 読み方: アピジー ハイブリッド
- 略称: なし
- 俗称: なし


### Secure APIs with Apigee Sense

API を攻撃から守るインテリジェントな挙動検出。

- 正式名称: Secure APIs with Apigee Sense
- https://cloud.google.com/apigee/api-management/apigee-sense/
- 読み方: セキュア エーピーアイ ウィズ アピジー センス
- 略称？: Apigee Sense
- 俗称: なし


### Cloud Endpoints

GCP 上の API を開発、デプロイ、管理します。

- 正式名称: Cloud Endpoints
- https://cloud.google.com/endpoints/
- 読み方: クラウドエンドポイント
- 略称: なし
- 俗称: なし


### Apigee developer portal (Developer Portal)

そのまますぐに使用できるセルフサービス プラットフォームをデベロッパーや API チームに提供します。

- 正式名称: Apigee developer portal
- https://cloud.google.com/apigee/api-management/developer-portal/
- 読み方: アピジー デベロッパー ポータル
- 略称: なし
- 俗称: なし
- 別名？: Developer portal
- 参考: [Apigee Developer Portal のアップデートでデベロッパー エクスペリエンスが向上 \| Google Cloud Blog](https://cloud.google.com/blog/ja/products/gcp/improving-developer-experience-with-enhanced-apigee-developer-portal)


### Apigee healthcare APIx

FHIR API ベースの新しいデジタル サービスの構築を加速させます。

- 正式名称: Apigee healthcare APIx
- https://cloud.google.com/apigee/solutions/healthcare-apix/
- 読み方: アピジー ヘルスケア エーピーアイ
- 略称: なし
- 俗称: なし


### Apigee open banking APIx

オープン バンキングと PSD2 への対応を加速させます。

- 正式名称: Apigee open banking APIx
- https://cloud.google.com/apigee/solutions/open-banking-apix/
- 読み方: アピジー オープンバンキング エーピーアイ
- 略称: なし
- 俗称: なし


### Cloud Healthcare API (beta)

医療に関する実用的な分析情報を引き出すセキュアな API。

- 正式名称: Cloud Healthcare API
- https://cloud.google.com/healthcare/
- 読み方: クラウド ヘルスケア エーピーアイ
- 略称: なし
- 俗称: なし
2020-02-14 VMWare Workstation > Windows Updateによりkillされる 

```txt:動作環境
Windows 10 Pro (v1909)
VMware(R) Workstation 15 Pro (15.5.1 build-15018445)
```

### 症状

夜に計算に動かしていたVMWare Workstationが翌朝には起動していない。

### 原因

Windows Updateがソフトをkillする。

詳細は下記にて。

- [VMWare Workstation 15 Pro shutdown suddenly (when the host Windows 10 is locked)](https://communities.vmware.com/thread/624577)

I appreciate it, wila.

### 対策

- 重要な処理中は「更新を7日間一時停止」にして対処
    - 未確認ではある
- 作業環境の保持 (翌朝の作業をスムーズにするため）に関しては「一時停止」にしておく
    - 一つ一つのゲストOSを起動して作業状況を調整する時間を省く

### tool

WindowsUpdateの時期が来たという注意を出すツールがあるといいかもしれない。
[Git]stash の戻し忘れを git hooks で防止する

## 前フリ
みなさんは `git stash` をつかっていますか？
簡単に説明しますと、**まだ commit や add はしていない作業中の変更内容を退避しておける**、というコマンドです。

git stash についてのわかりやすい説明はこちら
[【git stash】コミットはせずに変更を退避したいとき - Qiita](https://qiita.com/chihiro/items/f373873d5c2dfbd03250)

ありがちなのはこんな場合です。

- 作業中に急な対応等で別の作業ブランチに移動したい
- しかし、やりかけの作業が邪魔をしてブランチの移動ができない
- まだ中途半端な状態だからコミットはしたくない

こんなときに `git stash` を実行すると、作業中の変更をそのまま退避してくれます。なので、別ブランチの用件を片付けて、また元の作業ブランチに戻り、退避していた変更を元に戻すと、当初の状態に戻ってこれる、というものです。

## 問題点
そんな便利な `git stash` なんですが、1つ困った点があります。
**退避した変更を元に戻し忘れることがあります。**

`git stash` を実行すると、`git status` の状態が `nothing to commit, working tree clean` になります。要は変更中のファイルは何もないときと同じ表示です。こうなると何が困るかというと **`git stash` を実行していたことを忘れてしまう** ということが起こります。

さすがに `git stash` 直後は覚えているんですが、別のブランチに移動したり、そっちの作業に追われたりして、さらに間が空いてしまうとけっこう忘れます。

## 解決案
忘れてしまう最大の原因は **git stash してもしなくても見た目上の区別が全くつかない** ことではないかと思います。ならば、見た目でわかるようにすれば解決できるのでは？と考えました。

というわけで、少々前置きが長くなりましたが今日は <font color="tomato">**git stashしたら画面にそれを表示させて変更の戻し忘れを防止する方法**</font> を考案してみましたのでご紹介いたします。


## 動作確認済み環境
- git version 2.23.0
- git version 2.11.0.windows.3

Windows は GitBash で確認しています。

## 導入手順
[**githooks**](https://git-scm.com/docs/githooks) を使います。
これを使うと、Git の特定の操作をトリガーにしたスクリプトの実行を行うことができます。

今回のケースでは **`git checkout` をトリガーに動作するスクリプト** を作ってみます。というのも、git stash していることを通知してほしいタイミングとして、**ブランチを移動した直後** に stash があることを画面に出してくれれば忘れにくいと思ったことが理由です。

ということで、**`git checkout` をトリガーとしたスクリプトを作り、スクリプトは stash の有無を画面に表示する動作を担当する** というのをゴールとしてみます。

[`post-checkout`](https://git-scm.com/docs/githooks#_post_checkout) という、git checkout 直後に動作してくれるというまさにおあつらえ向きなフックが用意されていましたｗ遠慮なくこちらを使うことにします。

### post-checkout 作成
開発中のリポジトリ直下まで移動したら以下の手順で `.git/hooks` 配下に `post-checkout` ファイルを作成します。拡張子はいりません。

```bash
# 新規作成
touch .git/hooks/post-checkout

# 実行権限を付与(755じゃなくても実行さえできればなんでもよい)
chmod 755 .git/hooks/post-checkout
```

### フックの中身を実装

stash の有無を確認して結果を出力するスクリプトを実装します。さきほど作成した `post-checkout` ファイルを以下のように編集してください。

```sh:post-checkout
#!/bin/bash

STASH_LIST=$(git stash list)

if [ -n "$STASH_LIST" ]; then
  echo ''
  echo -e "\033[1;31;239m`echo $STASH_LIST | wc -l | xargs echo` stashed works found.\033[0m"
  echo -e 'Please exec \033[1m`git stash list`\033[0m command to check the stashed works detail.'
fi
```

以上で準備は完了です。


## 使用例
あとは stash があるとき、ないときで、`git checkout` 実行時に以下のように見た目が変わります。ないときは今までと特に何も変わりません。stash があるときはその個数も表示させています。

### stash が何もないとき

<img width="572" alt="スクリーンショット 2020-02-14 8.46.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/8d5418b7-0aff-e39d-0047-26384e306e5c.png">

### stash があるとき

<img width="612" alt="スクリーンショット 2020-02-14 8.47.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/41e0a9c8-51ca-b442-fc4f-01cf02a8ea94.png">


## 感想
git hooks のおかげでやりたいことが意外とすんなり実現できました。
これだけでもけっこう stash の戻し忘れは減るんじゃないかとおもいます。もし気になった方はぜひ試してみてください。


## 参考
- [【git stash】コミットはせずに変更を退避したいとき - Qiita](https://qiita.com/chihiro/items/f373873d5c2dfbd03250)
- [Git - githooks Documentation](https://git-scm.com/docs/githooks#_post_checkout)
volatilityの作法 その10

概要

volatilityの作法、調べてみた。
plugin作ってみた。

#サンプルコード


```
import volatility.plugins.common as common

class MyPlugin(common.AbstractWindowsCommand):
	def render_text(self, outfd, data):
		print "Hello world!"
```

#配置

```
/volatility/volatility/plugins/malware/
```

#コンパイル

```
cd /volatility
make
```

#実行結果

```
>vol myplugin
Hello world!
```

以上。
組み合わせ爆発を回避せよ！Rails初心者エンジニアの工夫

## 初心者である私はif~elseの形に慣れ過ぎていた

最初は下記のように書いていた。(statusは絶対に値が入っているので1では省略)

## 1
```rb
if params[:title].present?
 if params[:price_gteq].present? && params[:price_lt].present?
   @products = Product.where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}").where(status: params[:status]).where(title: params[:title])
 else
  @products = Product.where(title: params[:title])
 end
else
 if params[:price_gteq].present? && params[:price_lt].present?
  @products = Product.where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}").where(status: params[:status]).where(title: params[:title])
 else
  @products = Product.all
 end
end

```

もっと簡単にかけるくない？と思いelseを抜いた。しかしまだゴールではない

## 2
```rb
@products = Product.all
    @products = Product.where(status: params[:status]).where(title: params[:title]) if params[:title].present?
    @products = Product.where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}").where(status: params[:status]) if params[:price_gteq].present? && params[:price_lt].present?
    @products = Product.where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}").where(status: params[:status]).where(title: params[:title])if params[:price_gteq].present? && params[:price_lt].present? && params[:title].present?
```
まだまだ綺麗にかけるぞ！と思い、さらに絞り込む。ここで考えないといけないのが
**ActiveRecord::Relationは、where などで演算した後も ActiveRecord::Relation を返す**ということ
一瞬はてなマークが頭に浮かぶと思います。簡単にいうと、whereなどのActiveRecord::Relationは同じ型を返し続ける性質があるという。

そのことを踏まえて書いたコードがこちら(ゴール)

## 3

```rb

@products = Product.all
    @products = @products.where(title: params[:title]) if params[:title].present?
    @products = @products.where(status: params[:status]) if params[:status].present?
    @products = @products.where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}") if params[:price_gteq].present? && params[:price_lt].present?

```

```rb

###3番のゴールは雰囲気はこれと同じ。三番はこれを場合分けしている###
@products = @products.where(title: params[:title]).where(status: params[:status]).where("price>=? AND price<=?", "#{params[:price_gteq]}", "#{params[:price_lt]}")
```

## 今回のポイント
1. 条件分岐は「存在するときだけ発動する」みたいなニュアンス
2. ActiveRecord::Relationは同じ型を返し続ける
javaからkotlin変換の色々メモ

サーバーサイドのjavaアプリケーションを半年近くちまちまとkotlinに変換しています。多少はコツも掴めてきたので、メモ。

## Intellij IDEAを使う

kotlinなんだから当然ですね。

## 変換

IDEAには、Javaコードをkotlinに自動変換する機能があるので、基本的にはそれを呼び出すだけです。ただし、自動変換できない・失敗するケースがいくつかあります。

### その１：lombok

lombokは素敵なものですが、kotlinとの相性は悪いです。@Data,@Setterアノテーションなどlombokでコード生成しているjavaコードをkotlinから呼び出すことはできません。javaコードの修正が必要となります。IDEAの場合、"delombok"でlombokで生成されているコードをソースに展開してくれます。ちなみに、lombok使用のままでもIDE上では即時にはエラーにはならずに、ビルド時に失敗するので、最初はかなり悩みました。

### その２：stream

streamで少し複雑な処理を記述しているとだいたい失敗します。手作業でちまちまと直します。コードがすごくすっきりして嬉しかったりする。

## kotlinコードをjavaから呼び出す:static

kotlinには、javaのstaticメソッドが存在しません。companion object内のメソッドがそれに対応します。@JvmStatic アノテーションを付けることで、javaコードからstaticメソッドのように呼び出すことができます。

```kotlin
    companion object {
        @JvmStatic
        fun valueOf(value: Int?): Int {
```

## kotlinコードをjavaから呼び出す:例外

javaからkotlinを呼び出す場合で、送出する例外を明示する場合は、@throwsアノテーションを使います。

```kotlin
@Throws(SQLException::class, IOException::class)
fun func() {
}
```

## @Nonnull / @Nullableアノテーションを使う。

全てのコードがkotlinであればいいのですが、そうはいかないことが多いと思います。javaのコードには @Nonnull/@Nullable アノテーションでnull可能性を明示することで、呼び出すkotlin側で意図しないnull例外の発生を防ぐことができますし、コンパイルエラーで弾いてくれます。

## メソッドのパラメーターへの再代入はできない

パラメーターは不変なので、再代入はできません。例えばこんなコードはエラーとなります。

```kotlin
fun func(s: String) {
  s = s.toUpperCase() // ERROR!
}
```

別の変数を割り当てましょう

```kotlin
fun func(sParam: String) {
  val s = sParam.toUpperCase()
}
```

とりあえずここまで。
Chromeリモートデスクトップを使用してスマホからPCをリモート操作する方法①(PC側設定)

外出しているときにスマホから自宅や会社のPCに接続する方法
※大前提としてPC・スマホとも同じGoogleアカウントでログインしている状態と想定して説明します。

PC側の設定手順
①ブックマークバー一番左にある『アプリ』をクリック
<img width="960" alt="スクリーンショット (8).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/382af3e2-bdfa-2ac8-36b3-adcfe354dea1.png">
②アプリ一覧から『ウェブストア』をクリック
<img width="960" alt="スクリーンショット (9).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/a9993c32-03c6-a243-34d9-8e199c6792ef.png">
③検索ボックスに『chromeリモートデスクトップ』と入力し検索する
<img width="960" alt="スクリーンショット (10).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/d7fdce2a-efc8-f700-e22a-e598dde678e8.png">
④検索結果から『Chrome Remote Desktop』をchromeに追加する
※確認メッセージが表示されるので『拡張機能を追加』を選択
<img width="960" alt="スクリーンショット (11).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/d9cdd430-74ea-310b-ed17-1e2df25ebed6.png">
⑤画面右上の歯車マークから、『追加した拡張機能とアプリ』をクリック
<img width="960" alt="スクリーンショット (12).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/fd83b312-b318-0d48-5469-07063b64420a.png">
⑥『Chrome Remote Desktop』の下のURLをクリック
<img width="960" alt="スクリーンショｙット (13).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/bd43cc7f-c0e3-1c2c-42da-bb4426d679e4.png">
⑦設定画面が開かれるのでChrome リモートデスクトップをダウンロード
<img width="960" alt="スクリーンショット (14).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/c9668939-4558-1747-6c30-137eaaa39aa9.png">

⑧『インストール準備完了』と表示されるので、『同意してインストール』をクリック
※確認メッセージが表示されるので、すべて『はい』(or実行)を選択
<img width="960" alt="スクリーンショット (15).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/ebe68f38-5f8e-8381-e7ea-a58943948564.png">

⑨もう一度設定画面が表示されるので『オンにする』をクリック
<img width="960" alt="スクリーンショット (19).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/0c00a845-2d7e-8b87-8aae-6ba875f95916.png">

⑩PCの名前を入力
※任意の名前を入力(PC名じゃなくてOK)
<img width="960" alt="スクリーンショット (16).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/c768fb96-2413-ef3b-ef9e-3a1fd679d3a8.png">

⑪PINコードを設定(接続時に必要)
<img width="960" alt="スクリーンショット (17).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/e24963f6-16af-310c-524e-ae48b7eb9068.png">

⑫PC側の設定が完了
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/960901b5-f681-9e37-67ff-55505c9e3ac6.png)

これでPC側の設定は完了です。
スマホ側の設定～接続は**[こちら](https://qiita.com/gori1747/items/c8ddfa30cc6831854cdb)**を参照ください。

※PCがスリープ状態になるとリモート接続ができなくなるため、スリープ設定の変更は**[こちら](https://qiita.com/gori1747/items/3da916db38689ed606bf)**を参照してください。

ご覧いただきありがとうございました。
スリープの設定を解除する手順

PCのスリープ設定を解除する手順
※電源接続時の設定のみ変更します。(バッテリー駆動時の変更はお好みで。)

①スタート画面より『設定』をクリック
<img width="960" alt="スクリーンショット (20).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/577305b8-d0f0-c312-338f-7569a8f49637.png">

②『システム』をクリック
<img width="960" alt="スクリーンショット (21).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/22214828-7430-dddd-7a9a-3b64afd8cf5b.png">

③左メニューより『電源とスリープ』をクリック
<img width="960" alt="スクリーンショット (27).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/302d2a3b-f51c-0ae9-1def-2012d8ba785b.png">

④スリープ設定を『なし』に変更し、右側の『電源の追加設定』をクリック
<img width="960" alt="スクリーンショット (26).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/2e14443e-79aa-44d8-9ec0-612d745fa21c.png">


⑤左側の『カバーを閉じたとき動作の選択』をクリック
<img width="960" alt="スクリーンショット (24).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/d8af2a3e-4670-7715-4ed4-d6980ea1962c.png">

⑥『カバーを閉じたときの動作』を『なし』に変更し、『変更の保存』をクリック
<img width="960" alt="スクリーンショット (25).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/bbe13394-0180-c587-c664-341da3d9dbe5.png">

以上で設定完了となります。
※電源ボタンを押したときの動作変更等は⑥の画面から同様に変更できます。


ご覧いただきありがとうございました。
#Stripe ダッシュボードのログから API リクエストの内容を見て再現できそうだ

ログとして、ダッシュボードの操作もAPIリクエストとして記録されるみたいだ。

![image](https://user-images.githubusercontent.com/13635059/74381346-95fbf100-4e2e-11ea-8329-b329975d97d5.png)
![image](https://user-images.githubusercontent.com/13635059/74381355-998f7800-4e2e-11ea-8bf0-77699eea7336.png)
![image](https://user-images.githubusercontent.com/13635059/74381360-9ac0a500-4e2e-11ea-9885-b9d951eb4c34.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2982








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AutoLISP 文字列処理関数の使い方

[文字列処理関数リファレンス（公式ヘルプ）](https://help.autodesk.com/view/OARX/2020/JPN/?guid=GUID-8543549B-F0D7-43CD-87A3-F6B827FF0B88)

## 文字列をリストまたはアトムに変換
```scheme
(read "aaa")
;; -> AAA
(read "aaa bbb")
;; -> AAA
(read "(a b c)")
;; -> (a b c)

;; 変数を文字列として扱う
(setq val 12345)
(eval (read "val"))
;; -> 12345
```

## アルファベット大文字、小文字変換
```scheme
(strcase "aaa")
;; -> AAA
(strcase "BBB")
;; -> BBB
(strcase "AbCd")
;; -> ABCD
(strcase "aaa" T)
;; -> aaa
(strcase "BBB" T)
;; -> bbb
(strcase "AbCd" T)
;; -> abcd
```

## 文字列を連結する
```scheme
(strcat "aaa" "bbb" "ccc")
;; -> "aaabbbccc"
(strcat "aaa" "" "bbb")
;; -> "aaabbb"
(strcat "aaa" " " "bbb")
;; -> "aaa bbb"
```

## 文字数を数える
```scheme
(strlen "abcde")
;; -> 5
(strlen "aaa" "bbb" "ccc")
;; -> 9
(strlen "")
;; -> 0
(strlen " ")
;; -> 1
(strlen "あいうえお")
;; -> 10
```

## 部分文字列を取得
```scheme
; 3文字目以降の文字を取得
(substr "abcde" 3)
;; -> cde

;; 1文字目から3文字取得
(substr "abcde" 1 3)
;; -> abc
```

## LISP オブジェクトを表す文字列を、prin1 関数で出力したかのように返す。
```scheme
(vl-prin1-to-string 3.14)
;; -> "3.14"
```

## LISP オブジェクトを表す文字列を、princ 関数で出力したかのように返す。
```scheme
(vl-princ-to-string 3.14)
;; -> "3.14"
```

## 文字列を文字コードのリストに変換
```scheme
(vl-string->list "abcde")
;; -> (97 98 99 100 101)
(vl-string->list "12345")
;; -> (49 50 51 52 53)
(vl-string->list "あいうえお")
;; -> (130 160 130 162 130 164 130 166 130 168)
(vl-string->list "")
;; -> nil
(vl-string->list " ")
;; -> (32)
(vl-string->list "     ")
;; -> (32 32 32 32 32)
```

## 指定位置の文字のASCIIコードを取得する
```scheme
(vl-string-elt "abcde" 3)
;; -> 100
(vl-string-elt "Hello World" 6)
;; -> 87
```

## 指定された文字を、文字列の先頭から削除
```scheme
vl-string-left-trim "a" "abcdea")
;; -> "bcdea"
(vl-string-left-trim " " " Hello World ")
;; -> "Hello World "
```

## 指定された位置から始まる、2 つの文字列の最も長い共通の接頭語の長さを取得
```scheme
(vl-string-mismatch "aaabbb" "aaaccc")
;; -> 3
(vl-string-mismatch "bbb" "ccc")
;; -> 0
```

## 文字列内の指定された ASCII コードの文字を検索
```scheme
(vl-string-position 97 "abcde")
;; -> 0
(vl-string-position (ascii "c") "abcde")
;; -> 2
```

## 指定された文字を、文字列の末尾から削除
```scheme
(vl-string-right-trim "a" "abcdea")
;; -> "abcde"
(vl-string-right-trim " " " Hello World ")
;; -> " Hello World"
```

## 指定されたパターンを文字列内で検索
```scheme
(vl-string-search "abc" "abcde")
;; -> 0
(vl-string-search "cde" "abcde")
;; -> 2
```

## 文字列内の特定の文字列を他の文字列で置換
```scheme
;; "bbb" を "aaa" に置換
(vl-string-subst "aaa" "bbb" "aaa bbb ccc ddd")
;; ->"aaa aaa ccc ddd"
```

## 文字列内の文字を指定された文字セットで置換
```scheme
(vl-string-translate "abcde" "12345" "a b c d e ABC abc")
;; -> "1 2 3 4 5 ABC 123"
```

## 指定された文字を、文字列の先頭と末尾から削除
```scheme
(vl-string-trim "a" "abcdea")
;; -> "bcde"
(vl-string-trim " " " Hello World ")
;; -> "Hello World"
```

## ワイルドカードを使用して、文字列のパターン マッチングを行う
```scheme
(wcmatch "a1b2c2d4" "a")
;; -> nil
(wcmatch "a1b2c3d4" "a*")
;; -> T
(wcmatch "a1b2c3d4" "b#")
;; -> nil
(wcmatch "a1b2c3d4" "*b#*")
;; -> T
(wcmatch "a1b2c3d4" "3@")
;; -> nil
(wcmatch "a1b2c3d4" "*3@*")
;; -> T
```
開いているファイル セキュリティの警告 このファイルを実行しますか？ このファイル開く前に常に警告する の再表示には Zone.Identifier

本の[売上げスリップ](https://ja.wikipedia.org/wiki/%E5%A3%B2%E4%B8%8A%E3%82%B9%E3%83%AA%E3%83%83%E3%83%97)や帯を捨てられない[^1]人間です。


>![警告表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/8e9fb454-b96e-41e0-b60e-f2040e93663c.jpeg)
>[Windows7：開いているファイル　セキュリティの警告 を非表示にしたい－教えて！HELPDESK](http://office-qa.com/win/win142.htm)

# 再表示方法

<kbd>notepad "解除したファイル:Zone.Identifier"</kbd>
を実行し、新規ファイルを作成して

```
[ZoneTransfer]
ZoneId=3
```
を記述して保存。

ダウンロード時にこのファイルが作成され、警告を解除したときにこのファイルが削除されるようである。
したがって、**警告を解除したファイル一覧の情報がWindows上に溜まるわけではない**…と思われる。

情報量で言うと積極的に解除したほうが減ることになるかしらん。


# 参考情報

* [Windows のゾーン設定](https://12191.diarynote.jp/201303212215404474/)
* [Windows 10 における Zone Identifier の挙動：Web ブラウザによって異なる記録内容 - setodaNote](https://soji256.hatenablog.jp/entry/2018/09/07/071500)
* [アプリケーション実行時の警告の再表示を・・](http://pasokoma.jp/47/lg474193)




***

# 下ろした枕

同様に、ダウンロードしたexeの実行時の警告も外せない人間です。
不可逆作業が苦手なのでいつでもできることは後回しにしているので、通常はいちクリック増えるだけで(面倒ですが)問題ありませんでしたが、バッチ処理やリモートデスクトップなどで作業が止まる問題が起きます。
よって解除することにしましたが、戻す方法があるなら知っておきたかったため調べて記録しておきます。
再度設定することは絶対ないのですが、**可逆である**ことが重要なのです。
(ゾーン以外のURLなどは欠落してもいいかそれもメモなどで残しておくか)



[^1]: この感覚も電子書籍化でなくなるのかもしれないですね
AWS学習　〜EC2(Elastic Compute Cloud)学習メモ〜

##EC2(Elastic Compute Cloud)とは？

AWS上に仮想サーバを作るサービス。AWSに建てるサーバーのOSはWindowsやLinux、機能面ではCPUやメモリ、プロセッサなど要件に合わせて構築できる。（種類が多すぎるので要件をどれだけ搾りこめるのかなど経験や知識が必要になりそう・・・）

EC2はサービス名で自分たちで立てたサーバことを「インスタンス」と呼ぶ。


##EBS(Elastic Block Store)

EC2とセットで使うのが基本らしい・・・。理由がコンソールからEC2の停止ボタンを押下するとデータが消えてしまうため停止させても消去されないようにEBSにデータを保存する


##インスタンスタイプについて

・インスタンスファミリーの数字は世代を表し数字が大きいほど新しい　→　用途
・インスタンスサイズ　→　CPUのスペック


・**凡庸タイプ（A、T、M）**
凡庸インスタンスは、バランスの取れたコンピューティング、メモリ、
ネットワークのリソースを提供し、多様なワークロードに使用できる。


・**コンピューティング最適化タイプ（　C　）**
バッチ処理、メディアトランスコード、高性能ウェブサーバー、専用ゲームサーバー、
広告サーバーエンジン、


・**メモリ最適化タイプ（R、X、ｚ）**
メモリ内の大きいデータセットを処理するワークロードに対して高速なパフォーマンス
を実現するように設計されている。


・**高速コンピューティングタイプ（P、inf、G、F）**
ハードウェアアクセラレーター（プロセッサ）を使用して、浮動小数点計算、
グラフィックス処理、データパターン照合などの機能、CPUで実行中のソフトウェアよりも
効率的に実行する。


・**ストレージ最適化タイプ（I3、I3en、D、H）**
ローカルストレージの大規模データセットに対する高いシーケンシャル読み取りおよび
書き込みアクセスを必要とするワークロード用に設計されている。
ストレージ最適化インスタンスは、数万IOPSもの低レイテンシーなランダムI/Oオペレーションを
アプリケーションに提供するように最適化されている。
Go言語でnewとmakeを使ってみた

##はじめに
Go言語でnewとmakeを使い、違いを備忘のために記します。

##環境
macOS Catalina 10.15.3
go1.13.3 darwin/amd64

##1. makeを使う
以下はmakeを使用して、変数を初期化する例です。コードは一部抜粋します。

```sample.go
s := make([]int, 0)
m := make(map[string]int)
ch := make(chan int)

fmt.Printf("%T\n", s)
fmt.Printf("%T\n", m)
fmt.Printf("%T\n", ch)
```

###[出力結果]
```
[]int
map[string]int
chan int
```

##2. newを使う
以下はnewを使用して、変数を初期化する例です。コードは一部抜粋します。

```sample.go
var p *string = new(string)
var str = new(struct{})

fmt.Printf("%T\n", p)
fmt.Printf("%T\n", str)
```
###[出力結果]
```
*string
*struct{}
```

##結論
newで変数を宣言すると値が返り、makeで変数を宣言するとポインタが返りました。
newとmakeの違いを問われて答えられなかったので、記事書いて頭に刻み込みます:sweat:

以上！
IBM Quantum ExperienceとBlueqatでCCXゲート（トフォリゲート）を体験してみる

量子コンピュータ初心者です。[前回](https://qiita.com/Zensa55/items/245ae9101abe504f0960)に引き続きIBM Quantum ExperienceとBlueqatを使って、$CCX$ゲート（トフォリゲート）を試してみます。

#CCXゲート（トフォリゲート）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/de3361d3-98ec-12e2-724d-c3294214cf8c.png)
$CCX$ゲートは3量子ビットの演算です。$CX$ゲートの拡張版？みたいな感じで、制御ビットが1つ増えて2個あります。トマソ・トフォリによって作られたのでトフォリゲートとも呼ばれます。
2つの制御ビットが共に1になったときに、ターゲットビットを反転します。

#CCXゲートの準備
Circuit Composerで'q' register qubitsを3にして3量子ビットにします。さらに$CCX$ゲートを配置します。慣例に沿って測定のアイコンも入れておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/af4a80f7-98ef-43dd-ce4b-7377a2201d35.png)

Measurement Probabilityの結果を見ると000になっています。まだ何もしていないので当然ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/1dac558a-a9aa-179b-1664-045565cdbd47.png)


#CCXゲートを使ってみる
q[0]とq[1]に$X$ゲートを入れて動作を確認してみます。

##制御ビットの片方だけ1の場合
q[0]に$X$ゲートを適用して片方だけ1の状態にしてみます。当然のことながらターゲットビットは反転されずそのまま出力され、結果は001となります。Circuit Composerでは結果は後→前の順番で出てきますので、q[0]の結果が最後の1にあたります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/4b7239cd-700b-3e2e-75bd-d362cf0e0872.png)

ターゲットビットに$X$ゲートを適用しても、そのまま出力されて結果は101になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/8bb45f85-14b9-85eb-8ce3-b6cf3ecc6a52.png)

##制御ビットが両方1の場合
q[0]とq[1]の両方に$X$ゲートを適用すると、ターゲットビットが反転されます。いまq[2]はもともと0ですので反転されて結果は111になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/397cb242-6a22-dc19-17fd-c84438f7900f.png)

q[2]にも$X$ゲートを適用しておくと、反転されて結果は011になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/3add7f60-8e32-0d81-24f4-3def210d4115.png)

##Blueqatのコード
同じような操作をBlueqatでやってみます。

```python
from blueqat import Circuit
res = []
res.append(Circuit(3).ccx[0,1,2].m[:].run(shots=1))          #000
res.append(Circuit(3).x[2].ccx[0,1,2].m[:].run(shots=1))     #001
res.append(Circuit(3).x[1].ccx[0,1,2].m[:].run(shots=1))     #010
res.append(Circuit(3).x[1,2].ccx[0,1,2].m[:].run(shots=1))   #011
res.append(Circuit(3).x[0].ccx[0,1,2].m[:].run(shots=1))     #100
res.append(Circuit(3).x[0,2].ccx[0,1,2].m[:].run(shots=1))   #101
res.append(Circuit(3).x[0,1].ccx[0,1,2].m[:].run(shots=1))   #110
res.append(Circuit(3).x[:].ccx[0,1,2].m[:].run(shots=1))     #111

for i in res:
  print(i)
```

実行すると2つの制御ビットが共に1のとき（最後の110と111）だけターゲットビットが反転されていることがわかります。なおBlueqatでは量子ビットの順番（q[0],q[1],q[2]）で結果が出てきます。Circuit Composerとは逆なので注意してください。

```python
Counter({'000': 1})
Counter({'001': 1})
Counter({'010': 1})
Counter({'011': 1})
Counter({'100': 1})
Counter({'101': 1})
Counter({'111': 1})
Counter({'110': 1})
```


#参考資料
[Blueqatチュートリアル　トフォリゲート](https://github.com/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/005_basic_toffoli.ipynb)
【UE4】BPに公開している関数の引数に使う構造体にデフォルト引数を使いたい【C++】

#はじめに
開発をしていてBPに公開されている関数に構造体を追加する必要が出たときにこの現象にぶつかりました  
色々調べましたがエラー内容で検索してもドキュメントにも原因が明記されているところは見当たらなかったので解決方法をまとめておきます  
  
#デフォルト引数が使えない
```C++:TestActor.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestActor.generated.h"

USTRUCT(BlueprintType)
struct FActorInfo
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "hoge")
	int32 num;

};


UCLASS()
class SANDBOX_API ATestActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ATestActor();

	UFUNCTION(BlueprintCallable, Category = "TestActor")
	void TestFunc(const FActorInfo& info = FActorInfo());//コンパイル時にエラーが出る

};

```
  
上記のように書くと以下のようなコンパイルエラーが発生します  

```
重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
エラー		C++ Default parameter not parsed: info "FActorInfo()"	Sandbox	C:\UE4_Prj\Sandbox\Source\Sandbox\TestActor.h	30	

```
  
#原因の推察
C++のルール的には記述の問題ではない（UFUNCTIONコメントアウトするとコンパイルが通る）ことから考えてもUE4ならではの状況なのは間違いないです  
ということは,BPとして公開することに原因がありそうです  
BPのデフォルト引数はmetaデータとして埋め込むことが可能であることを考えると構造体のデフォルト値をコンパイル時に取得できていない？  

  
#解決方法
metaデータにデフォルト引数を持たせることで解決できます  
関数の定義を以下のように書き換えましょう  
デフォルト引数が設定されているのでBPでピンを繋げていなくてもエラーは出ません  

```c++:TestActor.h
UFUNCTION(BlueprintCallable, Category = "TestActor", meta = (AutoCreateRefTerm = "info"))
void TestFunc(const FActorInfo& info);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/fb293a07-3132-8509-ff92-6414747c8ee1.png)
  
試しに以下のようにmetaデータを削除してみるとエラーがでることが確認できる  
  
```c++
UFUNCTION(BlueprintCallable, Category = "TestActor")
void TestFunc(const FActorInfo& info);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/3ccbcf5a-452a-a56b-3bb8-0ee775aed44b.png)


#所感
根本の理由はちゃんと追っていないので、詳細な理由がわかる人がいたら教えてください
webpackとは何なのか？

# 概要
Rails 5.1からwebpacker gemで簡単に導入が可能となったwebpack。

では、webpackとはなんなのか？

railsは使っているけれど、webpackは全く知らない。

そんな方に向けた記事となっております。

自分もwebpackについて理解が浅いですが、webpackについて勉強した成果をここでまとめていこうと思います。

間違いなどもあると思いますが、その際はご指摘いただけると大変助かります。。。

###webpackとは何ぞや？

webpackとはNode.jsの中で定義されているモジュールバンドラーツールのこと。

モジュールバンドラーツールとはファイルをまとめるツールを指す。

webpackではrequireなどの依存関係を解決した上でモジュールを一つのファイルにまとめてくれる。

<img width="570" alt="qiita説明画像1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433878/40e5c822-f51f-93a8-b2ec-79276876e3a4.png">

この様にファイルをまとめることがwebpackの主要な役割。

###なぜ、ファイルをまとめる必要があるのか？

ファイルを一つにまとめることでHTTPリクエストの数を減らすことができる（負荷を軽減）

100個のファイルを100回読み込むことと１００個のファイルを一つにまとめたファイルを一回読み込むのでは処理の速度は全然違う



###webpackの設定方法

webpackを使用したいディレクトリに移動後

```
npm init
```

上のコマンドを打ち込むことで現在のディレクトリにpackage.jsonが作成される


```
npm install --save webpack
npm install --save webpack-cli
```

Node.jsのライブラリの一つであるwebpackを


次にpackage.jsonのscriptフィールドにてwebpackを指定する

```package.json
scripts{ "build":"webpack"}
```

scriptフィールドにbuildコマンドでwebpackを使うことを記述

```
npm run build
```
これで上のコマンドを打ち込むことでwebpackを使用できるようになった

**続いて行なうのはwebpack自体の設定**

webpackをインストールした際にwebpack.config.jsというファイルが作られる

webpack.config.jsはwebpackの設定を行なうファイル

此処にエントリーポイントなどの設定を記述していくことでwebpackが動作するようになる


長くなってきたのでwbpack.config.jsの設定については別の記事でまとめようと思います。
スキーマ駆動開発を音楽的に考えてみました。

# 概要

まずお断りしますが、タイトルが匂わせている通りまったく技術的な記事じゃないです。音楽的というのも怪しいしQiitaにこんな記事書いたら怒られないだろうか？と思いつつ、
眠れないある夜の、一人ゆるふわブレインストーミングをまとめました。

webサービスの開発をしてると音楽活動に似てるなぁって事柄とよく遭遇します。
最近、SPA開発にスキーマ駆動開発なる手法が良さそうと聞いて、調べつつどんなものだろうか？と考えた時に、音楽活動の構造に当てはめたら個人的に楽しかったので、そんなお話です。

# 登場人物と作業を整理

それぞれの活動に出てくる登場人物と作業を構造が似てる同士でマッピングしてみます。
あくまでも「雰囲気似てる」です。

## 登場人物をマッピング

on ボーカル デザイナー
on ギター フロントエンドエンジニア
on ベース バックエンドエンジニア
on ドラム インフラエンジニア

4人バンドになりました。
某バンドのようにボーカルが作詞作曲して歌も歌い、他のメンバーがそれぞれ担当のパートをアレンジしていくという事にします。
が、スキーマ駆動開発に主に関わるのはフロントエンドとバックエンドと思われるので、そこを念頭に置いて下さい。

## 主な作業をマッピング

ワイヤー作成 = 曲構成
デザイン作成 = 作詞・作曲
フロントエンド設計・実装 = ギターアレンジ
バックエンド設計・実装 = ベースアレンジ
インフラ設計・構築 = ドラムアレンジ (これしっくりこないな)

なんとなーく、このメンバーと作業でお客さんにお届けできそうな気がします。

# 音楽的スキーマ駆動開発 〜スキーマは編曲だ〜

この4人バンドはボーカルが作詞・作曲・曲構成を作ってメンバーにデモ音源を渡します。

これまでは時間に余裕があったので、新曲ができる度に一緒に音を合わせて、微調整をしながら一曲一曲作り上げてましたが、最近は忙しくなり一緒に合わせられる時間が減ってしまいました。
これではコンスタントに曲を作れないです。

そこで、ボーカルのデモ音源を元にして、それぞれが個別にアレンジを完成させた状態で合わせる事にしたのですが、「ここはこの音を使われちゃ困る」「ここはこのリズムに合わせて弾いてくれ」など、まとまりがありません。
お客さんを喜ばせるクオリティにするには、せっかくそれぞれが作り込んだフレーズも修正する必要が出てきました。

さぁ、この悲しい無駄骨を解消するにはどうしたものか。

一つの解決策が「スキーマ駆動開発」です。つまり音楽的には「曲全体のアレンジを先に決めて、それを元にそれぞれのパートのアレンジに取り掛かる事」です。

ここはこのリズムで、ここはこの音を必ず弾く、ここは誰も弾いちゃダメ、などキメ事をはっきりさせます。
このキメ事はそれぞれの役割毎に事情があるので、ギターアレンジからの視点とベースアレンジからの視点、どちらも合意が取れている必要があります。
逆に言えばキメ事以外はある程度自由によろしくという具合です。

恐らくこのキメ事の設計次第で効率も、仕上がりも変わってくるのではないでしょうか。

# 最後に

もっと細かい事とかも書こうとしてましたが、自分何やってんだろうってふと思った瞬間に眠くなったので、ここまでにさせて頂きました。

共通点や相違点を見つける能力はきっと大事🙄