OmniAICreator/Qiita-1.07M huggingface dataset:
ServiceNowアップデートセットのベストプラクティス

バージョン：Orlando, Paris

#アップデートセットとは（ServiceNowでは「更新セット」を訳されている）
アップデートセットとはServiceNowインスタンスで変更した内容を別インスタンスにコピーする機能である。スクリプトやシステム設定などはコピーされるが、データは含まれないので別途に複写する必要がある。
基本の流れは次の通りである：
1. アップデートセットを作成
2. インスタンスを変更する（フォーム、レポート、スクリプトの作成など）
3. アップデートセットをエクスポートする
4. 別のServiceNowインスタンスにアップデートセットをインポートする

#オーランドからの新機能
オーランドより前のServiceNowバージョンではインスタンスをクローンする前に処理中アップデートセットをのスタータスを「完了」にした。オーランドからは処理中のアップデートセットもクローンできるようになりました。
1. アプリケーションナビゲータから「システムクローン」を検索
![update_set_best_practices_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/613d029a-c013-22ba-9b09-e0ace799de62.png)
2.システムクローン下の「クローンの要求」を選択
3.表示されるページの右下の「＞」をクリック
4.項目「進行中の更新セットを保存」を「過去90日間」を選択
![update_set_best_practices_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/23d0daf8-a6be-e84c-b407-e372b2207e85.png)

#ベストプラクティス
次は米ServiceNowフォーラムに挙げられているベストプラクティスを集めたものである。実際の開発現場により内容が異なる場合もあります。
<dl>
<dt>開発手順を明確にする</dt>
  <dd>アップデートセットをどのように作成し、どのような内容を含めるかを開発者全員に明確にする</dd>
  <dd>多くのアップデータセットを適用する場合はServiceNowのアップデートセットバッチ機能を利用する</dd>
<dt>ユーザストーリ毎にアップデートセットを作成する</dt>
  <dd>機能毎にインポートしてテスト及び本番インスタンスへの導入をできるようにする</dd>
<dt>変更内容が多い場合はアップデートセットを分ける</dt>
  <dd>アップデートセットを修正する必要がある場合もあります。アップデートセットが大きいと修正に時間が掛かり、失敗する可能性も高くなる</dd>
<dt>他の人とアップデートセットを共有しない</dt>
  <dd>原則として一つのアップデートセットは一人の開発者が作成する</dd>
  <dd>数人で一つのアップデートセットを作成すると内容の整合性が取れなくなる場合もある</dd>
  <dd>アップデートセットの責任者を明確にする</dd>
<dt>同じバージョンのインスタンス間でアップデートセットをインポート／エクスポートする</dt>
  <dd>ServiceNowの異なるバージョンは100%互換性がないため、バージョンが異なるとインポートに失敗する可能がある</dd>
<dt>アップデートセットを結合しない</dt>
  <dd>アップデートセットの大きさを小さくするために結合せず、アップデートセットの適用順を明確にする</dd>
<dt>アップデータセット用の命名ルールを作成する</dt>
  <dd>インポートする順番を分かりやすくするためにアップデートセット名に連番を含める</dd>
  <dd>アップデートセットを修正する場合は、リビジョン番号を名前に含める</dd>
  <dd>アップデートセットを作成したインスタンスが分かるようにする</dd>
  <dd>スプリントが分かるようにする</dd>
  <dd>開発者が分かるようにする</dd>
<dt>説明を記述する</dt>
  <dd>アップデートセットの説明に変更内容やインポート後に行う作業手順を記述する</dd>
  <dd>バッグフィックスなどの場合は関連するインシデント番号なども記述する</dd>
<dt>アップデートセットに含めるフロー及びワークフローは公開しておく</dt>
  <dd>公開されていないフロー及びワークフローはアップデートセットに含まれない</dd>
  <dd>別インスタンスにインポートする前に公開するのを忘れたことに気が付いた場合は、アップデートセットのステータスを「処理中」に戻して、当該フロー及びワークフローを公開する。この場合はアップデートセットのリビジョンを上げる</dd>
<dt>アップデートセットの内容を確認する</dt>
  <dd>プレビューして内容を確認する</dd>
  <dd>他顧客情報が含まれていないことを確認する。</dd>
  <dd>テスト用に作成されたフォームなど不要な要素はアップデートセットから削除する</dd>
  <dd>デバッグ内容が含まれていないか確認する（例：gs.info）</dd>
  <dd>sys_idがハードコードされていないことを確認する。データは別途にインポートされるので異なるsys_idが振られる場合がある</dd>
<dt>更新内容を削除しない</dt>
  <dd>不要の変更は削除せず、デフォルトアップデートセットに移動する</dd>
<dt>週末や祭日などServiceNowが使われてなく、時間の余裕がある時間帯にアップデートセットをインポートする</dt>
  <dd>インポートに失敗する場合もあります。また、十分にテストする時間を設ける</dd>
<dt>アップデートセットもバックアップする</dt>
  <dd>アップデータセットを直接修正する場合もあります。フォームなどを同じようにアップデートセットもリビジョン管理とバックアップをとり、履歴が残るようにする</dd>
<dt>アップデートセットに含めるデータは最小限するする</dt>
  <dd>テーブルレコードに属性「update_synch=true」を設定するとそのレコードはアップデートセットに含まれる</dd>
  <dd>アップデートセットの大きさを小さくするために出来る限りデータはデータエクスポート／インポート機能を利用してアップデートセットには含めない</dd>
</dl>
多変量ノンパラメトリック回帰と視覚化

```{r}

#ARCH　p.142

data("AirPassengers")

t=length(AirPassengers)

p=4

Y=AirPassengers

f=function(param){

cost=0  
  
val=rep(0,length(param))

for(j in 1:(t-p+1)){  

y=c(1,Y[j:(j+p-1)]^2)

sig=sum(y*param)

cost=cost+log(sig)+Y[j+p-1]^2/(sig)

#for(k in 1:length(param)){

#if(k==1){
  
#val[k]=val[k]+1/param[k]+Y[j+p-1]^2/sig  
  
#}else{
  
#val[k]=val[k]+Y[j+k-1]^2+(Y[j+p-1]*Y[j+k-1])^2/sig  
  
#}

#}

}

return(cost)

}

ite=10^3

eta=10^(-5)

h=0.001

params=rep(1,p+1)

df_pre=rep(1,length(params))

for(l in 1:ite){
  
df=c()  
  
for(j in 1:length(params)){
  
vec=params;vec[j]=vec[j]+h  

df=c(df,(f(vec)-f(params))/h)
  
params[j]=params[j]-eta*(f(vec)-f(params))/h

}  
  
eta=1/(sum(df^2)+l)

df_pre=df
  
print(f(params))  
  
}

predict=c()

for(j in 1:(t-p+1)){  

y=c(1,Y[j:(j+p-1)]^2)

sig=sum(y*params)

predict=c(predict,sqrt(sig))

}

Ys=Y[(p):length(Y)]

plot(c(1:length(Ys)),Ys,xlim=c(1,length(Ys)),ylim=c(min(c(Ys,predict)),max(c(Ys,predict))),col=2,type="p",ylab="ARCH")

par(new=T)

plot(c(1:length(Ys)),predict,xlim=c(1,length(Ys)),ylim=c(min(c(Ys,predict)),max(c(Ys,predict))),col=3,type="p",ylab="ARCH")

```
【MATLAB】カーソルを追いかけるプロットの作り方


# はじめに

あるロゴに対して目がぎょろぎょろ動くように加工された画像も少し前に流行りましたが、それに関連して作ったコードをここで供養しておきます。

![mouseMotionExample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/8f259c85-0647-f4ee-0dfd-91887ee3af76.gif)

## 関連記事

コールバック関数を使用した例としては以下の記事もありますのでぜひ参照ください。

- [MATLABでお絵描きツールを作ってみた （マウス操作イベントに応じたプログラム例）]
(https://qiita.com/sanmojih/items/5ac9ed1510da863d42f2) by @sanmojih さん
- [MATLAB でゲームを作る ～1. コールバック編～](
https://qiita.com/macht/items/5853875dce0381e33c3a) by @macht さん
- [【MATLAB/AppDesigner】波形をマウスドラッグで範囲選択する](https://qiita.com/dokagui_tairan/items/5d6d1302698659d4d9f8) by @dokagui_tairan さん

特に @macht さんの記事はコールバック関数自体の説明も丁寧にまとめられているのでオススメ。

## 環境

- MATLAB R2020a


## 

# コールバック関数

Figure にはマウス操作に関するコールバック関数が 3 つあります[^1]。

[^1]: [MATLABでお絵描きツールを作ってみた （マウス操作イベントに応じたプログラム例）](https://qiita.com/sanmojih/items/5ac9ed1510da863d42f2) から引用

| コールバック関数|概要|
|:-------------------|:-------------------------------------------------|
| WindowButtonDownFcn|マウスをクリックしたときに呼びだされるコールバック関数|
| WindowButtonMotionFcn| マウスを動かしたときに呼びだされるコールバック関数|
| WindowButtonUpFcn|マウスを離したときに呼びだされるコールバック関数|

ここではカーソルの移動を追いかけるだけなので `WindowButtonMotionFcn` を使用します。

```matlab
% コールバック関数を設定
figure('WindowButtonMotionFcn',@myFcn);
```

これでカーソル位置が移動中は `myFcn` (下で定義) が呼び出されることになります。


# 円の描画

ここはサクッと陰関数で描画。`fimplicit` 関数（[ヘルプページ](https://jp.mathworks.com/help/matlab/ref/fimplicit.html?s_eid=PSM_29435)）を使います。

```matlab
fimplicit(@(x,y) x.^2+y.^2-1,[-2,2,-2,2])
```


# カーソル位置取得

これは axes オブジェクトの `CurrentPoint` で取れます。

```matlab
% カーソルの位置取得
cp = ah.CurrentPoint;
```

# mouseMotionExample.m 

以上をまとめると・・以下の通りです。遊んでみてください。

```matlab:mouseMotionExample.m

function mouseMotionExample
    % コールバック関数を設定
    figure('WindowButtonMotionFcn',@myFcn);

    % 円を描画
    ah = axes;
    fimplicit(ah, @(x,y) x.^2+y.^2-1,[-2,2,-2,2])
    axis equal
    hold on

    % 動かす対象の点を作成
    ph = plot(nan,nan,'MarkerSize',10,...
        'Marker','o','MarkerFaceColor','k');
    hold off
    
    function myFcn(src,callbackdata)
        % カーソルの位置取得
        cp = ah.CurrentPoint;
        xMouse = cp(1,1); % x 座標
        yMouse = cp(1,2); % y 座標

        % 円の中心とカーソル位置を結んだ線分上で
        % 中心からの距離が 0.8 のところに点を移動
        r0 = 0.8;
        r = sqrt(xMouse.^2 + yMouse.^2);
        ph.XData = xMouse/r*r0;
        ph.YData = yMouse/r*r0;
    end
end
Pythonでシングルトンパターン

クラスにシングルトンパターンを実装するSingletonMetaメタクラスと、これを適用したMySingletonクラスのコード例。

```ex_meta_singleton.pyt
class SingletonMeta(type):
    def __init__(cls, name, bases, disc, **kwargs):
        cls.__instance = name

    def __call__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__call__(*args, **kwargs)
        return cls.__instance

class MySingleton(metaclass = SingletonMeta):
    pass
```
独習python 第11章オブジェクト指向構文 より引用
pythonのディスクリプター

ディスクリプターとは下記のようなメソッドを備えたクラスのことである。

|メソッド|呼び出しタイミング|
|---|---|
|__get__(self,obj,type)|アトリビュートを取得するとき|
|__set__(self,obj,value)|アトリビュートを設定するとき|
|__delete__(self,obj)|アトリビュートを削除するとき|


__getattr__, __setattr__などの特殊メソッドとは異なるメソッドであるため、ディスクリプターとは区別して認識する必要がある。

・アトリビュート操作に関わる挙動を別クラスに切り出せる(=クラスをまたがるアトリビュート関連の機能を再利用できる。)
・特定のアトリビュートに対してのみ適用される挙動を定義できる。(__getattr__, __setattr__では、そのクラスのすべてのアトリビュートに影響)

な丼メリットがあります。ディスクリプターは、プロパティをはじめ、クラス/静的メソッド、superなどの背後でも利用されています。



```descriptor_basic.py
#ディスクリプターの定義
class LogProp:
    def __init__(self,name): #1
        self.name = name #1

    #アトリビュートを取得するときの処理
    def __get__(self,obj,type): #2
        prin(f'{self.name}:get') #2,6
        return obj.__dict__[self.name] #2,4

    #アトリビュートを設定するときの処理
    def __set__(self,obj,value) #3
        prin(f'{self.name}:set{value}') #3,7
        obj.__dict__[self.name] = value #3,5

class App:
    #ディスクリプターの定義
    title = LogProp('title') #8

if __name__ == '__main__':
    app = App()
    app.title = '独習Python' #9
    print(app.title) #9
````
ディスクリプターの側で定義しているのは、__init__, __get__, __set__です。まず、__init__メソッド(#1)は、ディスクリプターの対象となるアトリビュート名を受け取り、これを保存しています。後で値を受け渡しするためのキーとなる情報です。

そして、__set__(#2), __get__(#3)が値受け渡しのための主となるメソッドです。__get__, __set__は、引数経由で以下の情報を受け取ります。

obj:対象となるインスタンス
type:対象となるクラス
value:渡された値

この例であれば、__dict__を介してインスタンスの値を取得、参照しています。__get__, __set__はインスタンスのアトリビュート操作を肩代わりするので、なんらかの値の取得、保存操作が無い場合アトリビュート値の取得、設定は無効になります。

コード中の#4,5のような記述を最低限とし、取得、設定時の追加的な操作を加えておきましょう。この例であれば、取得、設定の結果をprintで出力しています。

定義済みのディスクリプターをアトリビュートに紐づけるには、#8のようにします。(これはproperty関数でプロパティを定義するのと同じ書き方です。)

コード中の#9のようにtitleを設定・sy津億したタイミングでログが出力されることが確認できます。


独習python 第11章オブジェクト指向構文 より引用
PostgreSQL でデータベースクラスタの場所を調べるには

データベースクラスタは PostgreSQL でデータベースを格納する領域です。その場所が分からないと、PostgreSQL を管理する上で何かと困ります。この記事では、データベースクラスタの場所を調べる方法について説明します。

PostgreSQL のスーパーユーザ `postgres` でデータベースに接続できるなら、`psql` コマンドで接続し、`SHOW` コマンドで `data_directory` パラメータの値を見れば分かります。

```shell-session
$ psql
=# SHOW data_directory;
     data_directory
------------------------
 /var/lib/pgsql/12/data
(1 行)

=# \q
```

PostgreSQL が動作するホストに接続できるなら、接続し、`ps` コマンドで PostgreSQL のマスタプロセスを調べます。

```shell-session
$ ps axf | grep -E "postmaster|postgres"
10405 pts/0    S+     0:00              \_ grep -E postmaster|postgres
 7572 ?        S      0:00 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data
 7574 ?        Ss     0:00  \_ postgres: startup   recovering 000000010000000000000005
 7575 ?        Ss     0:00  \_ postgres: checkpointer
 7576 ?        Ss     0:00  \_ postgres: background writer
 7577 ?        Ss     0:00  \_ postgres: stats collector
 7578 ?        Ss     0:00  \_ postgres: walreceiver   streaming 0/5013C10
```

マスタプロセスは、名前が `postmaster` または `postgres` で、`\_` で表される親子関係の一番上になります。そのコマンドラインに `-D` または `--pgdata` オプションがあれば、その引数を見れば分かります。

オプションがなければ、一番左の PID (上記では `7572`) をもとに環境変数を調べます。それには、プロセスを起動した `postgres` ユーザ、または `root` ユーザの権限が必要です。

```shell-session
$ strings /proc/7572/environ | grep PGDATA
PGDATA=/var/lib/pgsql/12/data
```

環境変数は `/proc/PID/environ` ファイルを見れば分かります。ファイルは `\0` (NULL 文字) で区切られていて、そのままでは見にくいので、`strings` コマンドで変数ごとに 1 行で出力し、その中から `grep` コマンドで環境変数 `PGDATA` を探し、その値を見れば分かります。
[Android] オブジェクトをMockする

単体Test時に、ObjectをMockしたい時があったのでメモ。

```kotlin
class MainViewModel : ViewModel() {
    
    private val _date = MutableLiveData<String>()
    val date: LiveData<String>
        get() = _date

    fun fetchDate() {
        val sdf = SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.JAPAN)
        _date.value = sdf.format(DateObj.getCurrent())
    }

}
```
上記のViewModelをTestするときに、DataObjをMockしてみる。

```kotlin
@Before
fun beforeTests() {
    mockkObject(DateObj)
    every { DateObj.getCurrent() } returns Data()
}
```
pythonでインスタンスを関数的に呼び出す方法

__call__メソッドはオブジェクトが関数の形式の形で呼び出された場合にコールされるメソッドである。　
__call__メソッドの使いどころとして、クラスを生成するためのクラスである「メタクラス」などが挙げられる。


```reserve_call.py

import math

class Coordinate:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    #c(x,y)形式で呼び出せ、距離を求める。
    def __call__(self,o_x,o_y):
        return math.sqrt((o_x - self.x)**2 + (o_y - self.y) **2))

if __name__ == '__main__':
    c = Coordinate(10,20)
    print(c(5,15))  #結果: 7.0710678118654755
```

独習python 第11章オブジェクト指向構文 より引用
__bool__メソッドを用いたオブジェクトの真偽判定条件の実装

```reserve_bool.py

import math

class Coordinate:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __bool__(self):
        print('__bool__')
        return self.x != 0 or self.y != 0
    def __len__(self):
        print('__len__')
        return int(math.sqrt(self.x **2 + self.y **2))

if __name__ == '__main__':
    c = Coordinate(0,0)
    if c:
        print('c is True.')
    else:
        print('c is False.')
```

独習python 第11章オブジェクト指向構文 より引用
【Unity】Animation Riggingを調べてみた




#UnityでIKが実装されたっぽい？

UnityでIKがデフォで使えるよ！って聞いたので、いろいろ調べてみた。

##参考資料
| 題名 | イメージ |
|:-:|:-:|
| [【Unity】Animation Rigging、人型以外のキャラクターにもIKを！](http://tsubakit1.hateblo.jp/entry/2019/05/07/231419)  | <img  width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183234/306667aa-39f6-d987-08c7-a23fdf0c1419.png">  |
| [UnityのAnimation Riggingの使い方とサンプルの作成](https://gametukurikata.com/basic/animationrigging)  | <img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183234/8543054a-3ced-f2a8-3195-f189fde3b864.png">  |


##わかったこと

<details><summary><strong>※Importボタン無いんだが？って人向けのメモ</strong></summary>
         <div>一番最初にインポートしようとしたときに、
<strong>②のimportのボタンないやんけ！！</strong>と思ったけど、
よく見たら①らへん所にInstallボタンっぽいのあって
あほくさってなりました()
<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183234/afe957dc-afcc-a3c1-53cc-51b6525cd534.png"></div>
</details>



###まだ試用版
「まだ不安定だよ」っていうメッセージが飛んできたんで、
まぁそうなんだろうなって。
でも使えるならOKです。

*******************
文章はここで途切れている.....
どうやら力尽きたようだ。
<br><br><br>

<font color="Gray" size=1>
[2020/9/14 01:13]
嘘です。
後でちゃんと調べて書いておきます。
Microsoft 365 WordのVBA覚書き

Microsoft 365 WordのVBAに関する覚書きです。

# チップス

- 配列のFor Each（`For Each A In B()`）でAは`Variant`型固定。`Dim A As B`とすると実行時エラーが発生する。
- Wordの図は行内にある場合は`InlineShape`型。取得する場合も`ActiveDocument.InlineShapes`になる。`Type`は`WdInlineShapeType`型。`Shape`型、`ActiveDocument.Shapes`、`MsoShapeType`ではない。

# 関数

## アクティブな文書に存在するすべての図（行内図）の直後に改行を2個追加するプロシージャ

```vb
'アクティブな文書に存在するすべての図（行内図）の直後に改行を2個追加します。
'実行後は選択範囲がリセットされます。
Sub AddTwoNewLinesAfterAllPictureShapes()
    Dim PictureShapes() As InlineShape
    PictureShapes = FilterInlneShapesTypeOf( _
        ActiveDocument.InlineShapes, wdInlineShapePicture)

    Dim PictureShape As Variant
    For Each PictureShape In PictureShapes
        PictureShape.Select
        Selection.MoveRight wdCharacter, 1
        Selection.TypeParagraph
        Selection.TypeParagraph
    Next
End Sub
```

`FilterInlneShapesTypeOf`を使用します。

## アクティブな文書に存在するすべての図（行内図）の直後に改行とページ区切りを追加するプロシージャ

```vb
'アクティブな文書に存在するすべての図（行内図）の直後に改行とページ区切りを追加します。
'実行後は選択範囲がリセットされます。
Sub AddNewLineAndPageBreakAfterAllPictureShapes()
    Dim PictureShapes() As InlineShape
    PictureShapes = FilterInlneShapesTypeOf( _
        ActiveDocument.InlineShapes, wdInlineShapePicture)

    Dim PictureShape As Variant
    For Each PictureShape In PictureShapes
        PictureShape.Select
        Selection.MoveRight wdCharacter, 1
        Selection.InsertParagraph
        Selection.InsertBreak wdPageBreak
    Next
End Sub
```

`FilterInlneShapesTypeOf`を使用します。

## ShapeのコレクションをShape()型に変換する関数

```vb
'ShapeのコレクションをShape()型に変換します。
'コレクションがShapeに変換できないオブジェクトを含む場合はエラーが発生します。
Public Function ConvInlineShapeCollectionToArray( _
    ByRef Collection As Collection, _
    Optional ByVal StartIndex = 1) As InlineShape()

    Dim Shapes() As InlineShape
    ReDim Shapes(StartIndex To Collection.Count + StartIndex - 1)
    Dim I As Integer
    For I = 1 To Collection.Count
        Set Shapes(StartIndex + I - 1) = Collection(I)
    Next
    ConvInlineShapeCollectionToArray = Shapes
End Function
```

## InlineShapesからある種類のInlineShapeオブジェクトの配列を作成する関数

```vb
'InlineShapesからある種類のInlineShapeオブジェクトの配列を作成します。
Public Function FilterInlneShapesTypeOf( _
    ByRef InlineShapes As InlineShapes, _
    ByVal ShapeType As WdInlineShapeType) As InlineShape()

    Dim Col As Collection
    Set Col = New Collection
    Dim InlineShape As InlineShape
    For Each InlineShape In InlineShapes
        If InlineShape.Type = ShapeType Then
            Col.Add InlineShape
        End If
    Next
    FilterInlneShapesTypeOf = ConvInlineShapeCollectionToArray(Col)
End Function
```

`ConvInlineShapeCollectionToArray`を使用します。
VBA ユニコードに対応したMsgBoxEx関数が64bit版Office2019あたりでも必要らしい

[VBAからUnicode版のWindows API を使う](https://codezine.jp/article/detail/1718)
この文字化け、実は最新版でも起きてしまう。
このためMsgBoxExが必要です。
と、当初肝心のAPIの部分がなかったので追記します。
自分が試したのとAddoinBoxは大体同じでしたが、Wih64は条件分岐編纂命令（Const Directive、条件付きコンパイル）は不要だと思います。
PtrSafeをつけていると基本的に32Bitにも対応できるため、つけなくていいです。
あと、通常のMsgBoxは
`IF msgbox("mmm",vbYesNoCancel+vbInformation,"Title")=vbYes then`
とかできますが、これはfnMsgBoxを使うと可能になります。

```vb:VBA
Option Explicit
' http://addinbox.sakura.ne.jp/Excel_Tips26.htm
' ただし 原サイトのWin64だと32bitにかまないので、それは外す。
' 上記の確認方法　#IF VBA7 AND WIn64 Thn として#Elseの下のMessageboxWにeを付け加える。Office 2013 32bitの場合関数が見つからないというエラーが起きる
' なおvar = MessageBoxWeとするとdllが見つからないというエラーになる
#If VBA7 Then
Private Declare PtrSafe Function MessageBoxW Lib "user32" _
(ByVal hwnd As LongPtr, ByVal lpText As LongPtr, _
ByVal lpCaption As LongPtr, ByVal wType As Long) As Long
Private Declare PtrSafe Function GetFocus Lib "user32" () As LongPtr
#Else
Private Declare Function MessageBoxW Lib "user32" _
(ByVal hwnd As Long, ByVal lpText As Long, _
ByVal lpCaption As Long, ByVal wType As Long) As Long
Private Declare Function GetFocus Lib "user32" () As Long
#End If
Sub MsgBoxEx(Texta As String, strCaption As String, wTypen As Long)
Dim var
'StrPtr()関数で長整数型（Long）にキャスト
'VBA7ではキャプション、内容ともにLongPtr型にキャストする
MessageBoxW GetFocus(), StrPtr(Texta), StrPtr(strCaption), wTypen
End Sub
Function fnMsgBoxEx(Texta As String, strCaption As String, wTypen As Long) As Long
' 通常のMsgBoxのようにvbYesNoCancel、vbYesNo,vbOkCancelをwTypenに指定する。（vbYesNoCancel+vbInformationもできる）
' 返り値 Long
fnMsgBox = MessageBoxW(GetFocus(), StrPtr(Texta), StrPtr(strCaption), wTypen)
End Function
'MsgBoxEx()関数の使用例
Sub Test()
    Dim Texta As String, strCaption As String
    Texta = "千代田区" & ChrW(&H9EB4) & "町"
    strCaption = "Microsoft Excel"
    MsgBox Texta, , strCaption
    MsgBoxEx Texta, strCaption, vbInformation + vbYesNoCancel
    ActiveSheet.Cells(2, 1).Value = Texta
End Sub
```
【CircleCI + Firebase】「Error: No project active, but project aliases are available.」でデプロイに失敗する

はまったのでメモ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422235/3f051531-48bc-e883-f849-23de5ab17cdb.png)

##解消方法
config.ymlで `--project` でプロジェクト名を指定すれば良い。

```yml
      - run:
          name: deploy to Firebase Hosting
          command: ./node_modules/.bin/firebase deploy --token=$FIREBASE_TOKEN
```

↓へ修正

```yml
      - run:
          name: deploy to Firebase Hosting
          command: ./node_modules/.bin/firebase deploy --project hello-world --token=$FIREBASE_TOKEN
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422235/670238b4-cc30-75a0-8a48-87ab31ac05a4.png)
開発ルール選定

#この記事を書いた背景
2week中期インターン（所謂就職するためのインターン）に参加するときに、
チーム内でチーム開発経験が比較的ある方だったので、
テックリードとして開発ルール選定をした時の記事です。
（なので、そのチームで共有する前提の記事です）

~~余力があれば記事を一般化させます~~
#開発ルール選定

開発しながら、
~~ある程度自由にルール選定する予定ですが、代表的な典型的なルールを共有していきます。~~

#ケース
参考記事:
[スネーク？キャメル？なんちゃらケースのまとめ](https://qiita.com/terra_yucco/items/ec437c6005932fd73fb9)

参考記事の
・**アッパーキャメルケース**
・**ロウワーキャメルケース**
・アッパースネークケース
の三つに関してある程度意識してコードを書くと、いい感じになります。

##ロウワーキャメルケース

まず一番よく使う**ロウワーキャメルケース**について、
```getBook```
```takeBookFromBookshelf```
変数名,関数/メソッド名は、単語が二つ以上場合に最初の単語のみ小文字にし、
それ以外の頭文字を大文字にします。
(takeBookFromBookshelfを英文で表すと、 take book from bookshelf　になりますよね。
このように英文で表すと、スペースが入る部分を単語と認識します。bookshelfをbookとshelfで分けて認識したりはしません。)


**変数名**
**関数/メソッド名**
で使います。

##アッパーキャメルケース
次にクラス/ファイル名で使うアッパーキャメルケースです。
ロウワーキャメルケースと比較し、
```getBook```
```takeBookFromBookshelf```
に対して考えると、
```GetBook```
```TakeBookFromBookshelf```
最初の頭文字も、大文字にします。

**クラス名**
**ファイル名**
で使います。

（クラス名というのが、言語の仕様上考えると存在しない、考えづらい場合があるので、
理解が難しい場合はとりあえず、ファイル名のみ考えるで良いです。）

##アッパースネークケース
次に定数名で使うアッパースネークケースです。
ロウワーキャメルケースと比較し、
```getBook```
```takeBookFromBookshelf```
に対して考えると、
```GET_BOOK```
```TAKE_BOOK_FROM_BOOKSHELF```
全ての文字を大文字にし、単語間を"_"で、繋ぎます

**定数名**
で使います。
（言語の仕様上、開発の仕様上使わないケースはありますし、これに関しては、使う場面がそう多くないので、ケースルールを気にしなくても良いかもしれません。）

#ブランチ名
ブランチ名に関しては大規模な開発ではないので、典型ルールを適用しませんが、
典型ルールの一例ですと、
```feature/開発version/課題番号-やった内容を要約```

featureは、fix,feat,taskなど、その業務がどのような目的で行われたかによります。

今回はfeat(新機能追加),開発versionが存在してなく、
課題番号をわざわざ検索して戻るほど保守、運用しないので必要ないかと思われます。
（もし必要ならgithubもissueで番号が生成されると思います）
なので今回は
```対象ファイル/やった内容を要約```
で行いたいと思います。

#アトミックデザイン/コンポーネント指向

参考記事:
[アトミックデザインとは？ コンポーネント単位で創るUIデザイン手法](https://goworkship.com/magazine/atomic_design/)

一応私が大事にしているアトミックデザイン、コンポーネント志向について記載しておきます。
再利用可能なコンポーネント(例えば決定buttonなど)は何度も使われるはずで、何回も作るとなると、
一度の改修でなんども同じ場所を直す必要がありますが、一つのパーツとして作り上げて、それを流用すると、そこの場所のみの改修ですみますし、マージの際の競合が発生しずらくなります。

小規模の場合、ボタンまでのアトミックデザインはそこまで意識しなくて良いと思いますが、
例えばナビゲーションバーなどは独立させて作る方が良い
（複雑な機能をもっているわりに独立させやすい）
のでそのレベルの**コンポーネント指向**は持っとくと良いかもしれません。
今更ながらにＸcodeでアプリを作りたいと思いました。

まず、Ｘcodeをインストールするところから始めます。

・・・・

Mac book air が古すぎて、最新のXcodeをダウンロードできないことが分かりました。

ちょっと良い方法がないのか、探してみます。
古い Mac book air に最新OSをダウンロードするところから
始めてみようかと思います。

🔼投稿日 2020年09月14日


最新OSがインストール可能なレベルのMacbookairを購入しましたので
なんとか、開発を進めることができそうです。

これから、何かしら作ってみたいと思っています。
"HTTPヘッダ"が指すものとは

普段**"HTTPヘッダ"**と呼んでるものについて、仕様上は **"header fields"** と呼ぶらしかったり、自分でも整理できていなかった。

今後もHTTP関連の仕様を読んでいく上でも理解しておきたかったので、この記事では、下記の用語について整理していく

- HTTP field
- header/trailer field
- field line

## HTTP セマンティクス
まず、参照するドキュメントについて簡単に補足します。今回触れる用語は、HTTPセマンティクスの仕様である「[HTTP Semantics](https://www.ietf.org/id/draft-ietf-httpbis-semantics-11.html)(ドラフト版)」で定義されています。


HTTPセマンティクスとは、HTTPメッセージ(HTTPメソッドや、レスポンスコード、フィールド)の意味の定義です。

各HTTP/1.1~HTTP/3の仕様ではこのHTTPメッセージをどのように送るか(例えば、HTTP/2ではストリーム上のフレームで送信する)を定義している。

もともと、HTTPセマンティクスは「[RFC7231 HTTP/1.1: Semantics and Content](https://tools.ietf.org/html/rfc7231)」でHTTP/1.1の仕様の中でフォーマットとあわせて定義されています。しかし、HTTP/1.1の仕様からセマンティクスの定義を抜き出して、HTTP/2~HTTP/3の仕様から参照できるように文書の整理作業が行われている。

それが、先に紹介した「[HTTP Semantics](https://www.ietf.org/id/draft-ietf-httpbis-semantics-11.html)(ドラフト版)」です。

それでは見ていきましょう。

## 用語
### HTTP field
**HTTP field** (フィールド) とはHTTPメッセージやペイロードに関する情報を伝達する、キー/バリューのデータです（HTTPヘッダと言われて思い浮かべるやつです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/f2c30079-424d-41e1-86ce-f13077bb4d78.png)

後述の **header field**と**trailer field**を区別しないときに単にfieldと言います。

またkeyを**field name**, valueを**field value**と呼びます。

### header field, trailer field
HTTPリクエストやHTTPレスポンスといったHTTPメッセージは、下記のような構造を持ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/03acfd71-1726-cc1b-0674-6eed0bd40269.png)

- **header section**: ボディの前に来るfieldが入る領域
- **content**: HTTPボディ。POSTリクエストでアップロードするファイルや、HTTPレスポンスのデータ
- **trailer section**: bodyのあとにfieldが入る領域

header sectionにあるfieldが**header field**である(または単にヘッダと呼ぶ)。trailer sectionにあるfieldが**trailer field**である。

あまり知られていない機能ではあるが、HTTPではcontentを送った後にtrailerとしてfieldを送ることができる。ここにくるfieldは一般語としてのヘッダーではないので、**header field**, **trailer field**と呼び分けることになった。


### filed line
また、field line (フィールドライン)というものもある。

これは、HTTP/1.1のように `:` でname/valueを区切った表記のことをfield lineと呼ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/8c3694c3-9b32-5541-f7cb-72ad772536d7.png)

## 用例
trailerを使うことは多くはないと思うし、**header field**を指して単に"ヘッダ"と呼ぶのは問題なさそう。ただヘッダ名、ヘッダ値という言い方は適切ではないかもしれない。

「[Structured Field Values for HTTP](https://tools.ietf.org/html/draft-ietf-httpbis-header-structure-16)」のように、**header field**に限定されないような仕様はfieldという言い回しが正しい (実際、この仕様は「**Structured Header**」から「**Structured Field**」に改称された)

## 参考
これらの整理には多くの議論がされています。疑問点や混乱がある方は、下記が参考になる。
- [[http-core] Header terminology #111](https://github.com/httpwg/http-core/issues/111)
- [What we call "headers"](https://lists.w3.org/Archives/Public/ietf-http-wg/2020JanMar/0216.html)
ウォーターフォール・モデルがなぜ難しいかを考えてみる

# ウォーターフォール・モデル開発とは

詳細はwiki 参照ください：[wiki : ウォーターフォール・モデル](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB)

開発の各工程をおよそ以下の様に定義し、水が流れる様に上から下の工程を順にこなしていく、という考え方。

1. 要件定義：エンドユーザーの業務のうち、本システムで解決する課題を定義
2. 外部設計：要件定義に従い、どのような機能、UIを持つかの設計
3. 開発：外部設計に従い、プログラムを作成。昔は内部設計があったが開発者が同時に行う事が多い
4. テスト：外部設計書に従い、機能を満たしているか試験

1や2の「何を作るか」を決める工程では、作る物をドキュメント化し、それぞれの工程の終わりでは、前工程の責任者がレビューを行い、期待値通り作られていることを確認、承認し次工程へ進める開発手法だ。


# 次工程に進むには承認が必須だから手戻りしない

この**『前工程の責任者に責任を持って承認してもらう』**事によって**手戻りが発生しない**ことが本手法の最大のメリットだ。

だが少し待ってほしい。資本主義社会においては**『世の中に存在しないものを作らないと新たな価値とならない、つまりは誰も見たことがないものを生み出さねばらなない』**あるいは、業務を効率化しコストを削減するシステムを作るのであれば、**『どこにコストがかかっていて、どのようなユーザーがどのように使うとコストが下がる』**ということを把握していなければならない。
この様な前提の中で**『これでよいです』**と承認できる人間は預言者か異世界から転生したチート能力の持ち主くらいではないだろうか。

外部設計においても同様である。設計者は開発のプロではあるが、顧客の業務についてはシロートなのである。案件毎に１から顧客の業務を覚え正しく要件を理解し、仕様に落とし込むには充分な時間が必要であるが、その時間が与えられることはまずない。同じ案件を長くやっていれば別だが、基本的には案件毎に一夜漬けで覚えた知識を元に試験に望む様な作業が外部設計なのだ。

開発のプロである設計者が、業務アプリケーションの延長としてWebアプリケーション開発を行う際に、Excel画面仕様書でおよその合意を取ると、以下の図の様な深刻な認識の相違が生まれる可能性がある。

**図. 立場が異なれば常識も異なる**
![脳内.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/ebd6a9a4-19b5-9a72-93a6-bba0cf850979.png)

90年代の Windows アプリケーションであれば、Excel画面仕様書はかなりの再現度を誇っていたし、パワポで作ったi-modeの仕様書も充分完成形がイメージできていた。

だが、2020年に作っているのは動的なウェブサイトである。静的な仕様書から『動き』まで想像して承認などできるだろうか。
普通の人であれば<b>『実際動いてるの触らないと分からないっす』</b>と言って機能として過不足ないか確認までできるのが精一杯ではないだろうか。

この認識の齟齬をなくすのであれば、製品コードでそのまま利用できるモックやプロトタイプを作って、それを確認してもらいながら進めるのが現実的かと思われるが、それらも<b>これなら絶対に間違いないですよね？と承認を取ろうとすると</b>莫大な工数がかかってしまい元々の用途からそれてしまうことが懸念される。

ここまで考察してみると、手戻りが発生しないことを保証する<b>『承認行為』</b>は、相当に胆力が必要な行為であり、その規模が大きくなればなる程、難易度が上がる行為であることが推察できると思う。

『承認行為』は当然必要であるが、『不用意に大きな成果物』に対しての『承認行為』が必要になるプロジェクト運営は、リスクが大きくなると言えるのではないだろうか。

# 不完全な承認と手戻り

『不用意に大きな成果物』に対して承認を行うプロジェクト運営を行うと、誤りに気づく機会も損失することになる。
「開発者とテスターが設計者の意図通りに仕様を読み取らなかった問題」の発生と発覚をシーケンス図として以下に示す。

![ウォーターフォール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/88842ce2-275f-ec8c-826b-32567dfc5f97.png)

恐ろしいことに、ウォーターフォール・モデル開発では、実装誤りが納品して顧客の手に渡るまで発覚しないのである。
このクラスの障害が発生すると過去の議事録を大捜索し言った言わないの[水掛け祭り](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%B3%E3%82%AF%E3%83%A9%E3%83%BC%E3%83%B3)が始まるかもしれない。

※QAの質問数と回答数が異なる、各種ドキュメントが更新され続け前工程が完了しないまま次工程に入ってるのは、正しく問題を把握するための作為的な図。[^1]

# まとめ

手戻りは、関係者全員が精神的にも工数的にも大被害を被るので可能な限り避けるべきだと思う。
避けるには<b>『顧客が本当にほしいもの』</b>を理解してこまめに確認が取りながら一緒に『プログラムではなくプロダクト』を作っていくことが望ましく思えた。

[^1]: 高校の時の数学の恩師が図形の問題で三角形を描いていたら「理想的な図を描くと問題を見誤るからいびつに描く方がよい」と教えてくれたので、可能な限りいびつに描いたフィクションです。
Chromeでダウンロード一覧へ移動するショートカット

### はじめに
個人的に結構便利なショートカット。
何かをダウンロードした時に使います。

### コマンドはこちら

| OS | command |
|---|---|
| Windows | Ctrl + J |
| Mac | ⌘ + Shift + J |

### 何の役に立つの？

1. 何かしらのファイル（写真など）を複数ダウンロードする
2. ブラウザの下の方に複数ファイル分のファイル名などが表示される
3. この「ブラウザの下の方に表示された情報」を消したい
4. 右下〜の方の「✕」ボタンを押すのが面倒くさい
5. そんな時に！
6. 「⌘+Shift+J」->「⌘+W」
7. いちいちマウスカーソルを移動しなくても消すことができた。やったー！
  

最後までお読みいただきありがとうございました。
tumo.jp
統合開発環境(IDE) vs. 仮想環境(virtual environment)

## はじめに
ふとあることに気がつきました。

「結局、**環境**って何なんだ？」

調べてみると自分がきちんと理解できていなかったことがわかったので備忘録として残しておくことにしました。

## 環境とは
[わわわIT用語辞典](https://wa3.i-3-i.info/word11028.html)によると、**「何かをする場」**のことである、とのことです。それは多くの場合、コンピュータのハードウェアやハードディスクなどの**ストレージ**上に構築されるものです。多くの場合はOSが実行され、その上にWebブラウザやOffice系、Visual StudioやAnacondaといったアプリケーションが実行されます。

そして、特にソフトウェアやシステムを開発する環境を**開発環境**と呼びます。開発環境には開発するための機材やネットワーク、ソフトウェアが揃っている必要があります。

## 統合開発環境とは
統合開発環境(Integrated Development Environment)とは、**プログラミングするときに必要なソフトウェアを1つにパッケージしたソフトウェア**のことです。つまり、言語やライブラリ等もインストール済みということになります。Visual Studioはそのアプリケーションの1つです。

## 仮想環境とは
仮想環境(virtual environment)とは、インストールしたモジュールやパッケージ、またプログラミング言語の**バージョンごとに分離された開発環境**のことです。
開発したいソフトウェアごとに言語やパッケージのバージョンを切り替えることで、ソフトウェアの矛盾や競合を防ぐことができます。Anaconda上では複数の仮想環境が構築できます。
そして、venvは一つのシステムの中に分離されたPythonの環境を作ることができるソフトウェアです。コマンドで仮想環境を作ったり、仮想環境に出入りすることができます。

## 終わりに
次はvenvコマンドについてまとめたいと思います。

### 参考
https://www.sejuku.net/blog/68423
[医用画像のためのディープラーニング 実践編](https://www.amazon.co.jp/%E5%8C%BB%E7%99%82AI%E3%81%A8%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%A8%99%E6%BA%96-%E5%8C%BB%E7%94%A8%E7%94%BB%E5%83%8F%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E8%97%A4%E7%94%B0-%E5%BA%83%E5%BF%97/dp/4274223639/ref=pd_lpo_14_t_2/358-9421808-3576652?_encoding=UTF8&pd_rd_i=4274223639&pd_rd_r=459de6f3-03ed-4a8c-931d-09b12b17b121&pd_rd_w=YcXE9&pd_rd_wg=nQa1F&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=QJQAFMH3X03KBBP8BGFD&psc=1&refRID=QJQAFMH3X03KBBP8BGFD)
SQLのHAVINGについて②

さて、前回せっかく前振りをしたので、今回はHAVINGを実際に使用した結果について説明したいと思います。
前回同様、説明には以下のテーブルを使用します。

|name|class |
|:-----|:-----|
|鈴木   |Aクラス   |
|田中   |Aクラス   |
|山田   |Bクラス   |
|佐藤   |Bクラス   |
|渡辺   |Bクラス   |
|中村   |Cクラス   |

まずは、GROUP BYとWHEREを一緒に使ってみましょう。

```ruby:SQL
SELECT class, COUNT(class) FROM TABLE1 WHERE name != '佐藤';
```

すると、結果は以下の通りになります。

|class |COUNT(class) |
|:-----|:-----|
|Aクラス |2 |
|Bクラス |2 |
|Cクラス |1 |

nameが「佐藤」のレコードが除外されるので、それ以外のレコードを集計した結果が表示されます。
このように、WHEREはGROUP BYが適用される前の段階の抽出条件を指定します。
次に、GROUP BYとHAVINGを一緒に使ってみましょう。

```ruby:SQL
SELECT class, COUNT(class) AS class_cnt FROM TABLE1 HAVING class_cnt <= 2;
```

すると、結果は以下の通りになります。

|class |class_cnt |
|:-----|:-----|
|Aクラス |2 |
|Cクラス |1 |

HAVINGで指定された抽出条件によって、class_cntが2以下のレコードのみが表示されるので、そのまま集計するとclass_cntが3になってしまうBクラスは表示されなくなります。
これが、一般的なHAVINGの使用方法です。
改定連番が最小のレコードを別のレコードと結合し出力する方法

改定連番が最小のレコードを別のレコードと結合し出力する方法
情報テーブル

|会社コード  |コード1   |区分1  |コード2  |契約連番  |最新契約ステータス  |
|---|---|---|---|---|---|
|01  |0010  |0010  |0010  |1  |0010  |
|01  |0010  |0010  |0010  |2  |0020  |

改定情報テーブル

|会社コード  |コード1   |区分1  |コード2  |契約連番  |改定連番  |最新契約ステータス  |
|---|---|---|---|---|---|---|
|01  |0010  |0010  |0010  |1  |1  |0010  |
|01  |0010  |0010  |0010  |1  |2  |0020  |
|01  |0010  |0010  |0010  |2  |1  |0010  |
|01  |0010  |0010  |0010  |2  |2  |0020  |
|01  |0010  |0010  |0010  |2  |3  |0030  |

▼SQL文

```
SELECT *
FROM	情報 AS B1
LEFT JOIN(
		SELECT A1.会社コード,A1.コード1,A1.区分1,A1.コード2,A1.契約連番,A1.改定連番,A1.契約ステータス区分
		FROM	改定情報 AS A1
		INNER JOIN(
				SELECT 会社コード,コード1,区分1,コード2,契約連番,MIN(改定連番)AS 最小改定連番
				  FROM 改定情報
				  GROUP BY 会社コード,コード1,区分1,コード2,契約連番
				  ) AS A2
		ON A1.会社コード = A2.会社コード
		AND A1.コード1 = A2.コード1
		AND A1.区分1 = A2.区分1
		AND A1.コード2 = A2.コード2
		AND A1.契約連番 = A2.契約連番
		AND A1.改定連番 = A2.最小改定連番
		)AS B2
ON B1.会社コード = B2.会社コード
AND B1.コード1 = B2.コード1
AND B1.区分1 = B2.区分1
AND B1.コード2 = B2.コード2
AND B1.契約連番 = B2.契約連番;
```
Xcodeで突然UIに青い枠線が表示される

突然各UIパーツに青い枠線が付き、解除するのに意外と時間かかったのでメモ。

# バージョン
- MacOS v10.15.6
- Xcode v11.7

# 状況
storyboardでUIパーツを並べていたら、いきなりこんな青い枠線が表示されるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/7bc5caa1-5c1f-a57d-c790-9ec38f914778.png)

# 解決方法

Editor > Canvas > Bounds Rectanglesをオンにしたりオフにしたりする。
![スクリーンショット 2020-09-13 23.53.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/7aaae1e4-c04e-291e-f7db-b1f8c90f9a59.png)
勝手にオンになる関係で、UI上のBounds RectangleのON/OFFと実際の設定が噛み合っていない場合があり、Bounds Rectanglesに✅が入っていない場合にも枠線が表示されることがあるので、ON/OFFを何回か試してみて欲しい。

こうすると以下のように青い枠線が表示されないようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/497363a7-164f-0b93-bdd5-b6bcced5845e.png)

# 原因
結論から言うと、”これだ！！”という原因は分からなかった。

## ショートカット暴発説
何らかのショートカットを行う際に誤って暴発してしまったのではないか、と思い調べてみたがKey Bindingsにショートカットは登録されていなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/6a636b44-156f-19e5-7077-2464b0afbe2a.png)

## UIをいっぱいいじると勝手にトグルされる説
[Stack Overflowの記事](https://stackoverflow.com/questions/35400079/xcode-storyboard-shows-blue-frames-around-ui-elements-how-do-i-turn-this-off)を見てみると、このようなコメントがあった。

>
I have found that this option toggles itself on automatically sometimes, like when you're moving lots of elements around the screen and an operation times out (which seems to happen frequently with just ~20 elements selected).

適当に訳すと、20個程度の要素を動かすと自動的にオンになることがあるらしい(自分の場合、そんなに動かしてないけど)

# 結論
現時点では、表示されたらBounds Rectanglesをオンにしたりオフにしたりするのが良さそう。
ちなみに再起動でも治るらしい。




# 参考文献
- [xcode - UI Elements showing blue border in Interface builder - Stack Overflow](https://stackoverflow.com/questions/34265694/ui-elements-showing-blue-border-in-interface-builder)
- [How to hide Blue line covering views in xib/Storyboard in Xcode 7.2 - Stack Overflow](https://stackoverflow.com/questions/35553526/how-to-hide-blue-line-covering-views-in-xib-storyboard-in-xcode-7-2)
- [ios - Xcode Storyboard Shows Blue Frames Around UI Elements. How do I turn this off? - Stack Overflow](https://stackoverflow.com/questions/35400079/xcode-storyboard-shows-blue-frames-around-ui-elements-how-do-i-turn-this-off)
git flow と github flow のまとめ

# はじめに
Gitの運用方法といえばの2つのワークフローを理解するために他サイトを参考にまとめてみました。

# git flow

git flowと言えばこの図をよくみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/38c2b3ac-f92d-bda3-e2fb-8e09e3a36cd0.png)

[A successful Git branching model » nvie.com](https://nvie.com/posts/a-successful-git-branching-model/)  

master
常にリリース可能な状態

develop
開発中のブランチ

feature
機能を開発したりバグ修正などを行う
developから分岐したブランチになる
developにマージする

release
リリース用に準備を行う
developから分岐したブランチになる
developとmasterにマージする
機能開発したfeatureブランチをいきなりdevelopにマージするのではなく、releaseブランチを経由する

hotfix
緊急時の修正作業を行う
masterから分岐したブランチになる
developとmasterにマージする

## メリット
- Windowsアプリケーションなどのようにリリース作業に数日かかる開発に適している。
- ブランチごとの役割がはっきりしているためブランチの運用ミスを減らせる。

## デメリット
- デプロイ作業が煩雑になる。

# github flow

GitHubの開発で使用されており、git flowを簡略にしたワークフローです。

master
常にデプロイ可能な状態

feature
機能を開発したりバグ修正したり、緊急時の対応をしたりする。
masterから分岐したブランチになる
masterにマージする

git flowのようにブランチが目的ごとに分かれていません。
そのため、基本原則に従って、開発を進めます。

>* masterブランチは **常時デプロイ可能** である
* 機能追加、バグフィックスなどは **説明的な名前のブランチ** をmasterから作成する
      * 機能追加の例： add_user_notice (ユーザーの通知機能追加)
      * バグフィックスの例： fix_user_login_validation_error (ユーザーのログイン認証のVlidation修正)
* 作成したブランチでローカル開発。小さい単位でこまめにコミットし、リモートにもこまめにPush
* フィードバックや助言が欲しい時、ブランチをマージしてもよいと思ったときは、 Pull Request を作成する
    * フィードバックや助言が欲しい時に作成する Pull Request を **WIP Pull Request** という
    * WIP = Work In Progress
    * WIP Pull Request を行う場合は、Pull Request 名の頭に **[WIP]** をつけるのが慣習
* レビューOKになったら、masterへマージ
* masterへpushしたら、即デプロイをする  

[GitHub Flow 図解 - Qiita](https://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)  

## メリット
- Wedアプリケーションなどのように1日に数回デプロイを行う開発に適している。
- git flowより理解しやすい。

## デメリット
- 機能開発や緊急時の修正などブランチが分かれていないため運用ミスが発生する可能性がある。

# 参考文献
[A successful Git branching model » nvie.com](https://nvie.com/posts/a-successful-git-branching-model/)  
[GitHub Flow 図解 - Qiita](https://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)  
[GitFlow vs GithubFlow - Qiita](https://qiita.com/tlta-bkhn/items/fc485a66dbe48ec3b919)  
[git flowとgithub flowとは？その違いは？ - Qiita](https://qiita.com/mint__/items/bfc58589b5b1e0a1856a)  
[【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう：こっそり始めるGit／GitHub超入門（終） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html)
既に作成されてるAWSリソースをterraformのコードに落とし込む

# はじめに
awsのterraformテンプレートをを０から書いていくのはなんとなく面倒だったので、既に作成されているawsリソースから作成できないかと調べていたのですが、`terraform import` と言うコマンドで似たようなことができそうだったのでまとめます。

# 今回のゴール
今回は既存のVPCをterraformのコードに起こしていきます

### ディレクトリ構成
```
.
├── config.tf
├── terraform.tfstate
├── vpc.tf
└── .gitignore
```

#下準備
### 1, 初期設定ファイルを作成

awsの初期設定をするファイル

```:config.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}

provider "aws" {
  version    = "~> 3.0"
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = "ap-northeast-1"
}
```

秘匿情報を代入するファイル

```:terraform.tfvars
aws_access_key = "各種取得したaccess_key"
aws_secret_key = "各自取得したsecret_key"
```

vpcの情報を記入するための空ファイル

```
resource "aws_vpc" "test-tf-vpc" {
  # (resource arguments)
}
```

ignoreファイル

```:.gitignore
#  Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# .tfvars files
*.tfvars
```

### 2, 既存のvpcをimport
`terraform import リソース名.リソースname リソースID`
と言う構文を用いることでデータをimportすることができます
![スクリーンショット 2020-09-14 0.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/cf7cbc7a-febb-11a1-01d1-d371e7e90137.png)


```shell 
$ terraform state show aws_vpc.test-tf-vpc vpc-xxxxxxxx
```

### 3, importした内容を確認
`terraform import リソース名.リソースname`
と言う構文を用いることでimportしたデータを確認することができます

```shell 
$ terraform state show aws_vpc.test-tf-vpc 
resource "aws_vpc" "test-tf-vpc" {
  arn                              = "xxxxxxxxxxxxx"
  assign_generated_ipv6_cidr_block = false
  cidr_block                       = "10.0.0.0/16"
  default_network_acl_id           = "acl-xxxxxxxxxxx"
  default_route_table_id           = "rtb-xxxxxxxxxxx"
  default_security_group_id        = "sg-xxxxxxxxxxx"
  dhcp_options_id                  = "dopt-xxxxxxxxxxx"
  enable_classiclink               = false
  enable_classiclink_dns_support   = false
  enable_dns_hostnames             = true
  enable_dns_support               = true
  id                               = "vpc-xxxxxxxxxxx"
  instance_tenancy                 = "default"
  main_route_table_id              = "rtb-xxxxxxxxxxx"
  owner_id                         = "xxxxxxxxxxxxx"
  tags = {
    "Name" = "test-tf-vpc"
  }
}
```

### vpc.ftにハードコーディング

importを行ったら[公式ドキュメント](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)をみたり、 `terraform plan` を叩いたりしながらtfファイルを完成させていきます

そして最終的に

```shell
$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

aws_vpc.test-tf-vpc: Refreshing state... [id=vpc-xxxxxxxxxxxxx]

------------------------------------------------------------------------

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.
```

と言う文字列が出現すれば完了です

# 最後に
本当は１コマンドだけで全てのリソースをterraformのファイルに落としてきてもらう物があれば一番良かったのですが、それは難しそうだったので今回は割と頑張るタイプのものになってしまいました汗
ただ、1つ自分専用のterraformテンプレートを持っていれば何かと楽できる場面は多いと思うので1つは所持しておくのがいいのではないかと思います。
Flutterでアクションゲーム開発（Flappy Bird）をやってみた



#概要
youtubeで見つけた「FlutterでFlappyBirdというゲームを作る（英語）」をやってみた。
https://youtu.be/vgmVPpFP0fI

#結論
2-3時間くらいでさくっとできる。
ちょっとカスタマイズした。
↓
![ezgif-1-5b7dcc6df5f8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521678/57a5be86-a918-2ebc-9cbb-ed819188b370.gif)

英語ができなくても、コードを追っていけば良いので問題ない。
非常におすすめ。



#感想
- めちゃくちゃ楽しい
- 思ったより簡単にできた
- 意外とソースコードが少なく実現できる
- 英語がわかりやすい
- 重力をリアルに表現することにワクワク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521678/7506e3d1-3191-60c9-d517-5da27df03443.png)


#どんな技術で構成されているか
初心者の総復習的な感じで基礎的な内容で構成されているが、Flutterにおけるアニメーションの基礎が割と理解できると思う。

- 基本的なwidgetの使い方
    - Stateful widget（setStateによる状態管理）
    - Container
    - Column
    - Row
    - Expanded
    - Image.asset
    - GestureDetector
    - AlertDialog
- 基本的なdartの文法
    - 演算
    - メソッド
    - クラス
    - 三項演算子
- Flutterにおけるアニメーションの基礎
    - AnimatedContainer
    - Timer

#おすすめの対象者
Flutterのアニメーションの実装経験が無くてこれからやりたい人

#注意事項
実は動画は途中で終わっており、完全なソースコードは有料（5ドル）である。
しかしながら、画面のベースやflappy（黄色い鳥）がぴょんぴょんジャンプするところまでは動画の範囲で実装できるので、アニメーションの重要な部分などは十分学べる。

ある程度のスキルがあれば、自らで残りを実装しきれるが、初心者には厳しいだろう。
ちなみに僕は５ドル課金した。（自己投資を惜しまない&クリエイターへの尊敬を重視したい派）

#あとがき
これを応用するだけで、結構複雑なゲームも作れる気がする。
改めて、Flutterすごい。
Pythonに関する個人的Tips（文字列、ログまわり）

#文字列まわり

##format、%記法まわり
###formatで使いやすい書き方

```python
'{0}, {1}, {2}...'.format(変数1, 変数2, 変数3….)  #インデックス（添え字）で指定
```

###f文字列
f文字列（f-strings）は文字列リテラルの前にfまたはFを置く（f'xxx', F'xxx'）。文字列中の置換フィールドに変数をそのまま指定できる。
※3.6以降のみ

```python
print(f'{a} and {b}')
# 123 and abc
```

###%記法

```python
print('from %s to %s'(year1, year2))
```


#入出力まわり

##一度止めて分岐させる

コマンドラインからの実行の場合、ここで一度実行が停止し数字の入力が求められる。
数値でないものが入力された場合、そこでプログラムは終了する。

```python
try:
    kai = int(input('実行は何回目?半角数字で入力:'))
except ValueError:
    print('有効な数字ではありません。')
    quit()

if kai == 1:
    hoge
elif kai == 2:
    fuga
```

コマンドラインから実行する際に、ファイル名の後に引数を入れる方法もある。

```python
python hoge.py hoge1 hoge2
```

と実行すると、

```python
import sys 
args = sys.argv
print(args)
#[hoge.py, hoge1, hoge2]
```

##ファイル名を変えると出力物のディレクトリやファイル名も自動で変更

```python
#まずはファイル名を取得
fname = os.path.basename(__file__)

#ファイル名から該当部分を切り取る
yyyy = fname[0:4]
mm = fname[4:6]
dd = fname[6:8]
```

##参考にさせていただいたページ

https://qiita.com/Morio/items/b79ead5f881e6551d9e1
http://programming-study.com/technology/python-format/
スマホでv-data-tableを見たときに表示される謎の空白ヘッダを消したい

#問題点
vuetifyの**v-data-table**にて、全てのヘッダからソートを消した後スマホで表示すると変な空白行がヘッダに残ってる。
色々スタイル等いじって消そうとしたけど中々うまく動いてくれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658979/c25697cb-0db3-d29d-1d71-b6a7e093fe38.png)

#解決策
v-data-tableにヘッダ非表示にするプロパティあったので、それをスマホの時にonにしてやる。

```vue
<!-- :hide-default-header="$vuetify.breakpoint.xs"の部分が追加箇所 -->
<v-data-table
  :headers="headers"
  :items="desserts"
  :hide-default-header="$vuetify.breakpoint.xs"
></v-data-table>
```

わかりづらいけど、ちゃんと消えてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658979/c860bed8-7284-681e-6380-c8d3d7985a32.png)
Unity2020にアップデートしてWebGLにビルドしたら動かなくなった

Unity2020にアップデートしてWebGLのプロジェクトをビルドしてS3に上げたらロードが最後までいかなくなってしまった。

どうやらBuildファイルがデフォルトで圧縮されるようになってしまっていた模様。

BuilSettings>Player Settings>Player>PublishingSettingsのCompression FormatをDisableにしてビルドしたら圧縮されずにファイルが出力された。

それをS3にガボッと入れたら動いた。
Figma デザインデータ作成メモ

#効率的にデザインできる下準備

### グリットの設定を行う

**(1)フレームに全体を覆うフレームを作成しベースとする**
![スクリーンショット 2020-09-14 0.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197635/f0d12304-f9f2-cd6c-45fe-a0a5d82304d1.png)

**(2)ベースのフレームから左右のマージンを引いておく**

**(3)shift+矢印で移動できる距離の設定をしておく**

▼環境設定から選択
![スクリーンショット 2020-09-14 0.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197635/0f493212-c5c6-41b1-c88f-da5848f38329.png)

▼移動する距離のpx数をいれる
![スクリーンショット 2020-09-14 0.13.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197635/5120069c-77f2-f5fa-9dee-44f569ef1a23.png)
git-of-theseus で github の repository を可視化してみる方法

## 方法

```
pip3 install git-of-theseus
git clone git@github.com:boto/boto3.git
cd boto3
git checkout master
git-of-theseus-analyze ./
git-of-theseus-stack-plot cohorts.json
git-of-theseus-survival-plot survival.json
open stack_plot.png
open survival_plot.png 
```

とやると下記のような png ができる。

![stack_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18869/16faa79f-8ee9-cec1-940c-7a00a64562ca.png)


## Appendix

https://github.com/erikbern/git-of-theseus
LeetCode解いた: Valid Palindrome

Palindromeとは回文のことだそうです
https://leetcode.com/problems/valid-palindrome/

問題文：

>Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
>
Note: For the purpose of this problem, we define empty string as valid palindrome.
>
Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true
>
Example 2:
Input: "race a car"
Output: false
 
>
Constraints:
s consists only of printable ASCII characters.

与えられた文が回文になるか調べます。ただし英数字以外はすべて無視します（スペース、ピリオド、記号その他諸々）。空のストリングは回文であるとします。
.
.
.
.
.
.

今回は英数字のみを抽出しなければなりません。
正規表現のライブラリ使えないのでまいったなと思ったけど、isalnumというメソッドがあるのですね。知らなかった...。
解答１：素直にfor文で回してみる。

```solution.py
class Solution:
    def isPalindrome(self, s: str) -> bool:
        
        alphanumeric_filter = filter(str.isalnum, s)
        alphanumeric_string = "".join(alphanumeric_filter).lower()
        
        reverse_text = ""
        for i in range(1,len(alphanumeric_string)+1):
             reverse_text += alphanumeric_string[len(alphanumeric_string)-i]
        
        return alphanumeric_string == reverse_text:
```

解答２：ラムダ式ですっきり。reverseもリスト扱いで一行で処理してすっきり。

```solution.py
class Solution:
    def isPalindrome(self, s: str) -> bool:

        filtered = filter(lambda ch: ch.isalnum(), s)
        lowercase = map(lambda ch: ch.lower(), filtered)

        processed_list = list(lowercase)
        reversed_list = processed_list[::-1]

        return processed_list == reversed_list
```
Google Apps Scriptで取得したhtmlをxmlパースできないときは

表題の件、躓きました。

超力技にて、下記の対策をしました。
１）　Webアプリケーションにする
２）　サーバ側でDOM形式になるように正規表現で抽出する
３）　クライアントでDOMパースして、あとはクライアントで閉じるもよし、サーバに渡して楽しむもよし

36歳男、今更ながらプログラミングの楽しみを再確認しました。
ホビープログラマーとして色々知識を蓄えたいと思います。
Python + MySQL でコネクションプーリング

Python で MySQL とのコネクションプーリングを行う方法と、そのハマりどころについて。

## mysql-connector-python の MySQLConnectionPool の問題
まず、MySQL 公式の Python クライアント mysql-connector-python で単純にコネクションを作成する場合は以下のように書ける。

``` python
import mysql.connector

cnx = mysql.connector.connect(host="...", user="...", password="...", database="...")
```

この mysql-connector-python には MySQLConnectionPool というクラスが用意されており、これを使うと簡単にコネクションプーリングができる。[^MySQLConnectionPool]

[^MySQLConnectionPool]: [MySQL :: MySQL Connector/Python Developer Guide :: 10.3 pooling.MySQLConnectionPool Class](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnectionpool.html)

``` python
from mysql.connector.pooling import MySQLConnectionPool

cnxpool = MySQLConnectionPool(host="...", user="...", password="...", database="...", pool_size=10)

cnx = cnxpool.get_connection()

cnx.close()  # 実際にはコネクションは切断されず、コネクションプールにリリースされる
```

めでたしめでたし・・・**とはいかない。**

試しに以下のコードを実行してみる。

``` python
from mysql.connector.pooling import MySQLConnectionPool

cnxpool = MySQLConnectionPool(host="...", user="...", password="...", database="...", pool_size=3)

cnxpool.get_connection()
cnxpool.get_connection()
cnxpool.get_connection()
cnxpool.get_connection()  #=> PoolError: Failed getting connection; pool exhausted
```

MySQLConnectionPool は**プールのコネクションが枯渇した場合、例外を投げる**仕様となっている。

このシンプルな仕様は嫌いではないのだけど、実際に Web アプリケーションなどで利用する際は「他のコネクションがリリースされるまで待つ」ような挙動であってくれたほうが嬉しいケースが多い。そうでないと、リクエスト処理の並列数が少しでもプールサイズを上回っただけでエラーが発生してしまう。

## SQLAlchemy の QueuePool を使った解決策
この問題は、SQLAlchemy の QueuePool を使うと解決できる。[^QueuePool]

[^QueuePool]: [Connection Pooling — SQLAlchemy 1.3 Documentation](https://docs.sqlalchemy.org/en/13/core/pooling.html)

``` python
from sqlalchemy.pool import QueuePool

cnxpool = QueuePool(lambda: mysql.connector.connect(host="...", user="...", password="...", database="..."), pool_size=10)

cnx = cnxpool.connect()
```

QueuePool の第一引数は「DB API に対応したコネクションオブジェクト」を返す関数ならなんでもいいらしい。汎用的ですごい。

SQLAlchemy というモジュール自体は ORM だが、今回は ORM 部分を全く使わずに QueuePool という仕組みだけを利用している。
Turing Piで遊ぼう(1) 開封の儀

##はじめに
巷にはSBC(Single Board Computer)であるRaspberry Pi(以下RPi)を複数組み合わせてClusterを構成する人々が存在する。Kubernetesが流行っているのも影響しているかもしれない。
その構成もいろいろ。

* Model B(いわゆるラズパイとして知られているシリーズ)を複数接続
* Model Bを親機にZeroを子機として接続
* Compute Moduleを複数接続

またの機会に記事にしますがCluster HATは2番目の方式。
本記事の対象は、3番目の方式であるTuring Pi( https://turingpi.com/ )。
2019年6月ごろに発表されpre-orderが始まり、2020年の春頃に日本からも発注できるようになり6月頭に発注。9/13ようやく届きました。

##開封の儀
シンプルな段ボールの箱に緩衝材としての枠と一緒に入っていました。
![IMG_5278.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/20cb083c-755e-d2d1-118f-e0545fa685c1.jpeg)
ケーブル類やマニュアルなどの同梱物は一切なし。漢らしい仕様です。

##外観
表面
![IMG_5276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/7a9d2db3-24cf-4d45-fd40-35487c3e7e72.jpeg)
写真だとよく見えませんが右手前にTuring Pi V1.1の刻印があります。
RTCC(Real Time Clock and Calendar)用と思われるボタン電池(CR2032)が見えます。
左奥の白いソケットはATX電源。こちらかの給電も可能です。
手前のMicro USB typeB端子はFlashに利用するらしい。Flashについては後の記事で触れます。

裏面
![IMG_5277.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/c4827889-f898-39c7-9c82-a4695bbd44f0.jpeg)
右側に見えるのは各ノードごとのMicroSDカードスロット。Compute Module自身は直接のIO端子は持ちません。

側面(コネクタ側)
![IMG_5281.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/d445dbed-d3d7-7295-beb3-3dfe3c0f279e.jpeg)
左から

* DC12V(Webのドキュメントに記載がないけどセンタープラスと思われます)
* USB2.0 x8
* Gbit Ethernet
* HDMI(Node #1用)
* Audio 3.5 mm(Node #1用)

側面(SDカードスロット側)
![IMG_5282.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/7295c4c6-7b5b-f489-3b79-480d5acf0e95.jpeg)

Compute Moduleと
![IMG_5279.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/2d88bcb3-905c-b542-cf6e-dfae92fc9833.jpeg)
装着するCompute Module 3+(以下CM3+)を7個あらかじめ手に入れました。
Micro SDカードスロットに気づいておらず、入手しやすさから16GB eMMCモデルにしましたがeMMCなしのCM3+ Liteでも良かったかも。(当然そちらの方が安い)

##装着
![IMG_5283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/a951a6ea-2df6-ae05-2d55-bf9985ef344d.jpeg)
とりあえず付けてみました。
コネクタはDDR2 SO-DIMM 200 pinなのでメモリを差す要領です。

##通電
12V-20Vで最大消費電力が40Wらしいのですが、そんなに都合がいいADアダプタは持っていないので、とりあえず転がっていた12V1Aセンタープラスを接続。
ATX12Vと配線のつながりを確認しましたが、逆電圧かけると即死するかもしれないのでビビりつつ。。
![IMG_5292.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26726/785b2655-c125-f957-5422-3bb5c0d03676.jpeg)
光りました！
とりあえず大丈夫そう。
容量の大きいACアダプタは手配するとして、当面負荷かけなければ1Aでも動くといいのですが。
次からはセットアップです。

##免責
記事の内容は個人の見解であり、所属組織を代表するものではありません。
laravelのサブクエリのメモ



# クエリビルダー

単純なクエリ。

```
SELECT * FROM users WHERE user_id=1;
```


```
DB::table('users')
->where('user_id', '=', 1)
->get();
```


サブクエリ１


```
$userSql = DB::table('users')
->where('users.user_id', '=', ':user_id')
->toSql();
```

```
DB::table(DB::raw('('.$userSql.') AS user'))
->leftJoin('address', 'address.id', '=', 'user.address_id')
->setBindings([':user_id'=>$user_id])
->get();
```


サブクエリを使ったinner join(多分

```
select * from users
inner join(
select * from address
) as ADDRESS
on 
users.address_id = ADDRESS.id
```


```
$subSQL = DB::table('address')->toSql();
 
DB::table('users')->JoinSub($subSQL, 'ADDRESS', 'address.id', 'USERS.address_id')->get();
```


サブクエリを使ったleft join


```
$subSQL = DB::table('role')->toSql();
 
DB::table('users')->leftJoinSub($subSQL, 'ROLE', 'users.roleNo', 'ROLE.no')->get();
 
```
【WPF】Button内テキストをButtonサイズに合わせて変更する

#はじめに

WPFでリサイズ可能なウィンドウ内にボタンを置いた時に
ボタンサイズに応じてテキストサイズも変更する方法。
テキストだけでなく、ボタン内ボタンとかでも大丈夫。（めったに無いと思うけど・・）

ViewBoxの存在を知らなかったので
もし同じような人がいたら、ということで。

# 方法

```MainWindow.xaml
<Window ~~~ 省略 ~~~ >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0">
            <Viewbox>
                <TextBlock>可変サイズ</TextBlock>
            </Viewbox>
        </Button>
        <Button Grid.Row="1">
            サイズ固定
        </Button>
    </Grid>
</Window>

```