OmniAICreator/Qiita-1.07M huggingface dataset:
Xojo で Web+DBアプリを作ってみる (SQLite編)

Xojoは、デスクトップアプリと同じようにして、Webアプリが作成できます。

デスクトップアプリとして作成した
「Xojo + SQLite で遊ぶ」
https://qiita.com/nanbuwks/items/507ed3a21e04512d31ce
を元に、Web+DBアプリを作ってみます。

# データベースの用意

先のデスクトップアプリの解説記事でしていたように、SQLiteのデータベース、テーブルを用意しておきます。

# アプリ作成

最初のメニューでWebを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3baa5159-8654-1379-1c73-520c0a23d4ad.png)

App を選び、メニューバーの Insert-Property で Name を db, TypeをSQLitedatabase とします。

もう一度 App を選び、Insert-Event Handler-Open で以下を書く

```

self.db = New SQLiteDatabase
self.db.DatabaseFile = New FolderItem("..\sensordata.sqlite")
Try
  self.db.Connect
Catch error As DatabaseException
  MessageBox("DB open error: " + error.Message)
  Return
End Try
```

WebPage1に移ってText Fieldを２つ、ボタンを１つドラッグドロップします。ボタンをダブルクリックしてActionに以下を書きます。

```
var Record as new DatabaseRow
dim temp as string
temp = tempField.Text
dim hemi as string
hemi = hemiField.Text
try
  app.db.ExecuteSQL("INSERT INTO sensor ( sensor,temp,hemi ) VALUES (1,"+temp+","+hemi+");")
Catch error as DatabaseException
  MessageBox error.Message
end try
```

次に、ボタンをもう一つ置き、ダブルクリックしてActionに以下のコードを書きます。

```

var temp,hemi as double
var rs as RowSet
try
  rs =app.db.SelectSQL("SELECT id,sensor,temp,hemi FROM sensor")
Catch e as DatabaseException
  messagebox e.Message
end try
try
  for each row as databaserow in rs
    temp = val(row.column("temp").stringvalue)
    hemi = val(row.column("hemi").stringvalue)
    Listbox1.AddRow( row.column("id").StringValue,row.column("sensor"),format(temp,"##.#"),format(hemi,"##.#") )
  next
Catch e as DatabaseException
  messagebox e.Message
end try
```

最後に、List Box を WebPage1 に置き、カラム数を４にします。

ラベルをつけたりOKを書き直したりして体裁を整えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/39d398bc-ae2e-58b2-93d2-d6292cdd3e70.png)

# 実行

Playボタンを押すと内蔵Webサーバが起動する。ブラウザが自動で起動してアプリ画面が表示される。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f7d1f92a-9d57-834a-f96c-9338257eda34.png)


# デスクトップアプリと違うところ

- WIndow1 → WebPageとなる
- ListBox という名前は予約されているためListBox1という名前にした
- テキストフィールドを使ったhemiFieldの値： hemiField.Value は  hemiField.Text になる
ABC 151 D - Maze MasterをPythonで解く！

BFSの練習がてら解いてみました。
DFS、BFSの練習にはちょうどいい問題だと思います。

[問題へのリンク　ABC 151 D - Maze Master](https://atcoder.jp/contests/abc151/tasks/abc151_d)

#やること
最大の移動距離を求めたい。
すべての頂点を始点としてBFSなりで、各頂点への移動距離を求める。
そこから最大となるものを探す。
壁からはスタートできないところに少し注意が必要。

#回答
```python
from collections import deque
import numpy as np

H,W = map(int,input().split())
maze = [input() for _ in range(H)]

ans = 0
for x in range(H):
    for y in range(W):
        #壁からはスタートできない
        if maze[x][y] == "#":
            continue

        #初期化
        distance = [[0]*W for _ in range(H)]
        #start位置
        stack = deque([[x,y]])
        
        while stack:
            h,w = stack.popleft()
            for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:
                new_h, new_w = h+i, w+j
                if new_h < 0 or new_w < 0 or new_h >= H or new_w >= W:
                    continue
                elif maze[new_h][new_w] != "#" and distance[new_h][new_w] == 0:
                    distance[new_h][new_w] = distance[h][w]+1
                    stack.append([new_h, new_w])
        
        #start位置は0で初期化
        distance[x][y] = 0
        ans = max(ans, np.max(distance))

print(ans)
```

##ポイント
ある点から上下左右すべてを調べます。

```python
for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:
    new_h, new_w = h+i, w+j
```
　
調べる点が「#」壁でなく、まだ探索していなければ探索します。
ひとつ前の点から距離を1足してあげて、スタックに追加することで次の探索に移れます。

```python
elif maze[new_h][new_w] != "#" and distance[new_h][new_w] == 0:
    distance[new_h][new_w] = distance[h][w]+1
    stack.append([new_h, new_w])
```
　
2次元配列の最大値は、__numpy__の__max__を使うと簡単にとることができます。

```python
ans = max(ans, np.max(distance))
```

##探索結果の出力
各頂点からの探索終了後に下記コードを追加することで、探索結果を出力しました。

```python
for i in range(H):
    print(distance[i])
print()
```

###入力

```
3 5
...#.
.#.#.
.#...
```
###出力
きれいに各頂点からの移動距離が探索できていることがわかります。

```python
[0, 1, 2, 0, 8]
[1, 0, 3, 0, 7]
[2, 0, 4, 5, 6]

[1, 0, 1, 0, 7]
[2, 0, 2, 0, 6]
[3, 0, 3, 4, 5]

[2, 1, 0, 0, 6]
[3, 0, 1, 0, 5]
[4, 0, 2, 3, 4]

[8, 7, 6, 0, 0]
[9, 0, 5, 0, 1]
[10, 0, 4, 3, 2]

[1, 2, 3, 0, 9]
[0, 0, 4, 0, 8]
[1, 0, 5, 6, 7]

[3, 2, 1, 0, 5]
[4, 0, 0, 0, 4]
[5, 0, 1, 2, 3]

[7, 6, 5, 0, 1]
[8, 0, 4, 0, 0]
[9, 0, 3, 2, 1]

[2, 3, 4, 0, 10]
[1, 0, 5, 0, 9]
[0, 0, 6, 7, 8]

[4, 3, 2, 0, 4]
[5, 0, 1, 0, 3]
[6, 0, 0, 1, 2]

[5, 4, 3, 0, 3]
[6, 0, 2, 0, 2]
[7, 0, 1, 0, 1]

[6, 5, 4, 0, 2]
[7, 0, 3, 0, 1]
[8, 0, 2, 1, 0]
```
jsonnet を C++11 アプリに組み込むメモ

## 背景

* glTF などの JSON フォーマットの管理がめんどい.
  * JSON にちょっとしたプログラミング機能がほしい
    * ノードのインデックスを変数で指定したりとか   
  * 他の JSON ファイルを読み込みたい
  * etc

python で処理するてもあるけど, C++11 アプリで完結させたい.

jsonnet というのがありました.

https://jsonnet.org/

オフィシャルのページにはドキュメントがほとんどありません.

Kubernetesマニフェスト記述言語としてのJsonnet
https://qiita.com/ktateish/items/701a61e2be44ad012596

逆引き Jsonnet
https://qiita.com/ktateish/items/c07d76fb268575f5a8dc

ありがとうございます :pray:

便利そうですので, C++11 アプリに取り込んで使えるようにしてみたいと思います.

## libjsonnet-cpp

libjsonnet のコード自体は, ほぼライブラリ依存関係がなくていいのですが(md5 と nlohmann 先生の json.hpp 程度), 本家の jsonnet repo は CMake がイケてなかったり, std.jsonnet.h を毎回生成しないとかいけなくてめんどいので, 組み込みやすくしたものを作りました.

https://github.com/syoyo/libjsonnet-cpp

Visual Studio にも対応してます.

## C++ API

`#include "libjsonnet++.h"`

して,

`evaluteFile` or `evaluateSnippet` を使います.

だいたいこの API だけで事足ります.

```c++
#include <fstream>
#include <iostream>

#include "libjsonnet++.h"

static std::string readFile(const std::string& filename)
{
    std::ifstream in(filename);
    if (!in.good()){
        std::cerr << "Could not open: " << filename;
        return "";
    }
    return std::string(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
}

int main(int argc, char **argv)
{
  if (argc < 2) {
    std::cout << "Needs input.jsonnet\n";
    return EXIT_FAILURE;
  }

  jsonnet::Jsonnet jsonnet;
  jsonnet.init();

  std::string output;
  //bool ret = jsonnet.evaluateFile(argv[1], &output);
  //if (!ret) {
  //  std::cerr << jsonnet.lastError() << "\n";
  //  return EXIT_FAILURE;
  //}
  const std::string input = readFile(argv[1]);
  bool ret = jsonnet.evaluateSnippet("dummy", input, &output);
  if (!ret) {
    std::cerr << jsonnet.lastError() << "\n";
    return EXIT_FAILURE;
  }

  std::cout << output;

  return EXIT_SUCCESS;
}
```

お手軽でいいですね.

## TODO

* [ ] JSONPath などを試す
* [ ] 複数 JSON 生成を試す
使って学ぶElixir, Phoenixのライブラリ、随時更新

Phoenixの学習中に知った便利ライブラリを随時まとめる。

# ページネーション

[scrivener](https://github.com/drewolson/scrivener)

scrivenerとscrivener_ectoとscrivener_htmlを組み合わせると簡単にページネーションが作れる。

# メーラー

[bamboo](https://github.com/thoughtbot/bamboo)

アダプタを使うことでsmtpなどでも送れる。
bambooのみのインストールで使えるのはsendgrid, mailgun, mandrill。
送信設定はめっちゃ簡単。
ただテンプレートファイル作ったり、メーラー用のファイル作ったりはちょっとめんどい。

[swoosh](https://github.com/swoosh/swoosh)

bambooとできることの大差はない。
ただ、アダプタが本ライブラリで完結している・メンテが継続していることもあり、こっちのほうが個人的に好み。
使い方も簡単。

# パスワードのハッシュ化

[pbkdf2_elixir](https://github.com/riverrun/pbkdf2_elixir)

comeoninの作者が作ったライブラリ。
Programming Phoenixに出てたから使ってる。
テスト用に時間短縮できる設定がある。

# テスト関連

## テストの自動実行

[mix-test.watch](https://github.com/lpil/mix-test.watch)

必須。
mix test.watchしとけば、ファイル変更を検知してテストを自動再実行してくれる。

## テスト結果のデスクトップ通知

[ex_unit_nitifier](https://github.com/navinpeiris/ex_unit_notifier)

デスクトップにテスト結果の通知が出るようになる。
mix-test.watchと使う。
これがあるとREDにならない限りはconsoleを見ないで済むから楽。

## HTMLパーサー

[floki](https://github.com/philss/floki)

Railsのassert_selectみたいなのがPhoenixにはないが、Flokiを使うことで実現できる。

~~~ elixir
parsed_html = Floki.parse_document!(html_response(conn, 200))
assert Floki.find(parsed_html, "h1") |> Floki.text() =~ user.name
assert Floki.find(parsed_html, "h1 img.gravatar")
assert Floki.find(parsed_html, "ol.microposts li") |> Enum.count() == 20
assert Floki.find(parsed_html, "ul.pagination li.active") |> Floki.text() == "1"
~~~

## テスト用データ生成

[faker](https://github.com/elixirs/faker)

日本語データがないので作ればコントリビュートできそう（？）

## インテグレーションテスト

[phoenix_integration](https://github.com/boydm/phoenix_integration)

[scenic](https://github.com/boydm/scenic)の作者が作っているインテグレーションテスト用のライブラリ。

まだ使ったことがないが、パイプラインでつないでいく感じが使いやすそう。

# gitのフック生成

[git_hooks](https://github.com/qgadrian/elixir_git_hooks)

gitのhookで何をするかを設定ファイルに書きだせる。
書き出した設定はmix git_hooks.installするとhookのファイルを生成する。
Processingで初めて0から作ったプログラム【その3】

おはこんばんにちは。
どうも私です。
今回は「Processingで初めて0から作ったプログラム【その3】」ということで書いていきます。
では早速いく～。
[処理で使ったサンプル楽譜][link1]
[link1]:https://drive.google.com/file/d/12CioG8gzdif8xZvsWtCp2JM6hxRL2uPw/view?usp=sharing

#前回のおさらい…
前回の記事：[Processingで初めて0から作ったプログラム【その２】][link1]
[link1]:https://qiita.com/KURIeIGHT/items/41064edae5e7fd4ffc4f

「画像認識による楽譜の読み取りシステム」の手順はこちら！
**1.**楽譜の五線を検出
**2.**音符の検出
**3.**音の出力
（ProcessingとOpenCVを使って開発）
こんな感じですね

前回は、音符の検出をやりましたね。
楽譜の一部を参考に、テンプレートマッチングをして音符を検出しました。
[音符検出実行結果][link1]
[link1]:https://drive.google.com/file/d/1vIqHmL-3ZbmaRO5S7Y-vujLGveN5v9To/view?usp=sharing

ちなみに、配列に格納したX,Y座標は赤い四角の左上の座標になります。

#音の出力
**五線の認識**、**音符の検出**で得たX座標Y座標をもとに音符の位置検
出をしていきます。その位置をもとに、音を当てはめていきます。
※混乱を防ぐため、音階の表記は「ドレミファソラシド」でなく「C D E F G A H」と表記します。

手順
**1.**認識した音符が何の音なのか定義する。
**2.**「C D E F G A H」の音ファイルをその音符と結びつける
**3.**音を鳴らす

######1.認識した音符が何の音なのか定義する。
五線の検出で得たY座標、音符の検出で得たY座標（X座標は順番通りに鳴らすように得た。）で１つ１つ音を定義していきます。

[音階を検出して音符の下に音階名を置いた時の画像][link1]
[link1]:https://drive.google.com/file/d/1aAG4pRwhvhoyq-OiYQVXjkaNrv5ifWGr/view?usp=sharing

```java:Gakuhu.java 

import ddf.minim.*;
//MinimはProcessing1.0以降のバージョンで標準のサウンドライブラリです。
Minim minim;
//ここで各音階の音を定義します。
AudioPlayer C;
AudioPlayer D;
AudioPlayer E;
AudioPlayer F;
AudioPlayer G;
AudioPlayer A;
AudioPlayer H;
AudioPlayer C8;
AudioPlayer D8;
AudioPlayer E8;

//～中略～

  //演奏速度
  int Speed = 1000;

  for (int l=0; l<k; l++) {
  //y[l]　は五線のY座標が格納された配列に。

    //↓1小節目から４小節目まで
    if (y[l]>=170 && y[l]<=174) {
      //H
      H.rewind();
      H.play();
      delay(Speed);
    }
    if (y[l]>=175 && y[l]<=177) {
      //A
      A.rewind();
      A.play();
      delay(Speed);
    }
    if (y[l]>=179 && y[l]<=181) {
      //G
      G.rewind();
      G.play();
      delay(Speed);
    }
    if (y[l]>=182 && y[l]<=184) {
      //F
      F.rewind();
      F.play();
      delay(Speed);
    }
    if (y[l]>=186 && y[l]<=188) {
      //E
      E.rewind();
      E.play();
      delay(Speed);
    }
  }
```
こんな感じで１つ１つ定義していきました…頭悪いですよね…
まだわかりにくいと思うので最初の１小節だけに注目してわかりやすくした画像を置いておきます。
[音階設定説明画像][link1]
[link1]:https://drive.google.com/file/d/1HaUPQyz2Mtp587lU6tO8mzGkBTvgJ_FO/view?usp=sharing

これを続けること４行…
これで完成です！
最後すごく雑になってしまいましたが、説明するより画像を見たほうがわかりやすいのでこういう形にしました。

また、最後にプログラムの全体像を載せたかったのですが、大学のパソコンにしか最新データがなくて載せられません…ごめんなさい。

次回は最終回のまとめになります。
このプログラムを書き終えて、どう感じたのかなどを書いていこうと思います。
次回も見ていただけたら幸いです。
クラスのインスタンス変数のグローバル変数化

クラスのインスタンス変数をグローバル変数と同じように使えるように、PythonのSingletonパターンで作成してみます。
***
```python:singleton01.py
class MySingleton(object):
    __obj = None
    __init_flg = True

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

    def __init__(self):
        if self.__init_flg:
            self._x = 0
            self.__init_flg = False  # ２回目以後初期化されないように

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value


def use_singleton1():
    print('↓--------use_singleton1')
    a1 = MySingleton()
    print('MySingleton(a1) property x = {}'.format(a1.x))
    a1.x = 150
    print('MySingleton(a1) property x = {}'.format(a1.x))
    print(a1)


def use_singleton2():
    print('↓--------use_singleton2')
    b1 = MySingleton()
    print('MySingleton(b1) property x = {}'.format(b1.x))
    b1.x = 250
    print('MySingleton(b1) property x = {}'.format(b1.x))
    print(b1)


use_singleton1()
use_singleton2()
```

実行結果：
↓--------use_singleton1
MySingleton(a1) property x = 0
MySingleton(a1) property x = 150
<__main__.MySingleton object at 0x00000000010C22B0>
↓--------use_singleton2
MySingleton(b1) property x = 150
MySingleton(b1) property x = 250
<__main__.MySingleton object at 0x00000000010C22B0>
***
複数シングルトンパターンクラスを作成するには@デコレータ関数を利用すれば便利かもしれません

```python:singleton02.py
def singleton(cls, *args, **kwargs):
    obj = None

    def wrapper():
        nonlocal obj
        if obj is None:
            obj = cls(*args, **kwargs)
        return obj
    return wrapper

@singleton
class MySingleton(object):
    __init_flg = True

    def __init__(self):
        if self.__init_flg:
            self._x = 0
            self.__init_flg = False  # ２回目以後初期化されないように

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

@singleton
class MySingleton2(object):
    pass


a = MySingleton()
a.x = 11
b = MySingleton()
print('MySingleton(b) property x = {}'.format(b.x))
b.x = 12
print('MySingleton(a) property x = {}'.format(a.x))
print('MySingleton(b) property x = {}'.format(b.x))
print(a)
print(b)
print('----------------------------------------------------------')
a2 = MySingleton2()
b2 = MySingleton2()
print(a2)
print(b2)
```
実行結果：
MySingleton(b) property x = 11
MySingleton(a) property x = 12
MySingleton(b) property x = 12
<__main__.MySingleton object at 0x0000000000B820B8>
<__main__.MySingleton object at 0x0000000000B820B8>
`----------------------------------------------------------`
<__main__.MySingleton2 object at 0x0000000000B821D0>
<__main__.MySingleton2 object at 0x0000000000B821D0>
***

※マルチスレッドの場合、[import threading]で排他制御する必要があります
bash で繰り返し特定コマンドを実行させる


例: 大量のディレクトリ毎に個別に tar.gz に圧縮する

```
#!/bin/sh

# ディレクトリ名のリスト
array=(
"0000"
"0001"
"0002"
)

for i in ${array[@]}; do
    echo "start tar ${i}"
    tar -zcf ${i}.tgz ${i}
done
```
競プロはPyPyとPythonのどっちが良いの？

PythonでTLEになった時PyPyでACを取れたり、逆にPyPyでTLEになった時PythonでACが取れたりします。

# PythonでAC、PyPyでTLEになる例

[AtCoder Typical Contest 001のA問題](https://atcoder.jp/contests/atc001/tasks/dfs_a)では、深さ優先探索の問題があります。

そこで、以下のようなコードを書きました。

```test.py
import sys

sys.setrecursionlimit(500*500)
def dfs(px,py):
	if px < 0 or py < 0 or px > w-1 or py > h-1:
		return False

	if c[py][px] == '#':
		return False
	if c[py][px] == 'g':
		return True

	c[py][px] = '#'

	if dfs(px-1,py):
		return True
	if dfs(px,py-1):
		return True
	if dfs(px+1,py):
		return True
	if dfs(px,py+1):
		return True

	return False

h,w = map(int,input().split())

c = []
for i in range(h):
	s = input()
	x = s.find('s')
	if x != -1:
		start = [x,i]
	c.append(list(s))

sx = int(start[0])
sy = int(start[1])

if dfs(sx,sy):
	print('Yes')
else:
	print('No')

```

深さ優先探索としてはかなり安直な書き方をしていると思います。

これを提出した結果、次のようになりました。

<img width="535" alt="スクリーンショット 2020-03-06 20.45.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/3db9947f-8a3e-68d0-2089-fda752491fb7.png">

Python3ではACを取れているのですが、PyPy3ではTLEになってしまっています。

これは、**PyPyは再帰関数との相性が悪い**らしく、それが原因となっているようです。

再帰関数を使わずに、大人しくスタックを使えばどちらでもACを取ることができます。

# PyPyでAC、PythonでTLEになる例

[AtCoder Beginner Contest 153のE問題](https://atcoder.jp/contests/abc153/tasks/abc153_e)は、動的計画法を用いて解ける問題でした。

そこで、以下のようなコードを書きました。

```test.py
H,N= map(int,input().split())

a = []
b = []

for i in range(N):
  a_dash,b_dash = map(int,input().split())
  a.append(a_dash)
  b.append(b_dash)

#dp[i+1][j] = i番目までの魔法で体力jのモンスターに
#勝つことができる、魔力の最小値
INF = 10**9
dp = [[INF for _ in range(H+1)] for _ in range(N+1)]

#体力0のモンスターは初めからデスしている
for i in range(N+1):
  dp[i][0] = 0

for i in range(N):
  for j in range(H+1):
    if a[i] > j:
      dp[i+1][j] = min(dp[i][j],b[i])
    else:
      dp[i+1][j] = min(dp[i][j],dp[i+1][j-a[i]]+ b[i])

print(dp[N][H])

```

特にこれと言った工夫もせず、単純に個数制限なしナップサック問題と同じようなコードになりました。

こちらを提出すると以下のような結果が返ってきました。

<img width="455" alt="スクリーンショット 2020-03-06 20.40.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/34a4ef1c-5288-116e-e930-e10efb055781.png">

今度はPyPyでAC、Python3でTLEになってしまいました。

もちろん、Pythonで解く方法もあります。

# 結局、どっち使えば良いの？

**どっち使ってもACを取れるような、綺麗な回答を書け**というのが正論なのだと思います。

ですが僕は競プロ初心者なので、**とりあえずPyPyを使って、再帰関数を使うときはPythonにする**というようにすることにします。

ちなみに、PyPyはC言語で書かれた一部のライブラリが使えないというデメリットもあるらしいです。

# 最後に

競プロ初心者なので、上記の内容に不備等ございましたらご指摘ください。
SwaggerをTypeScriptに変換してAPIリクエストで型チェックを有効にする

## APIリクエストにもTSの型補完が欲しい

APIエンドポイントを文字列で指定するせいで型チェックや型補完が効かないというTypeScriptの課題を解決するために開発したのがaspida
※参考記事：[Web APIに型を付与する"Aspida"が結構便利な話](https://qiita.com/kyasbal_1994/items/702396a84de8a2acfed5)

一見便利ですが、エンドポイントの数だけ型定義ファイルを作る必要があります
なので大規模プロジェクトでaspidaを使おうとすると、膨大な数の型定義ファイルを手作業で作らねばならず導入はかなり辛い・・・
そこで、Swagger（とOpenAPI）をaspidaの型定義ファイルに一発変換するnpmモジュールを作ったので解説します

<img src="https://aspida.github.io/aspida/logos/svg/black.svg" width="500" alt="aspida logo" />
https://github.com/aspida/openapi2aspida

## 定番のPetStoreをTypeScriptに変換

Swaggerを知っているなら誰もが最初に見る「[Swagger Petstore](https://petstore.swagger.io/)」を実際に変換して、レスポンスを取得してみます

### 設定ファイル

プロジェクトのディレクトリルートにaspida.config.jsという名前でaspidaの設定ファイルを作成し、swagger.jsonのURLを記述します
[Swagger Petstore](https://petstore.swagger.io/)のサイト上部にあるJSONのURLをコピペしました

　　　　　　　　　　　　　　　　　↓これ
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63528/dc50f496-5259-5431-9e4c-ea71a7a27c07.png)

### 型定義ファイル生成

```bash
$ mkdir sample
$ cd sample
$ npx openapi2aspida -i https://petstore.swagger.io/v2/swagger.json
```

sample/apiディレクトリにファイルが色々生成されます
ローカルのSwagger/OpenAPIファイルを変換したい場合は`-i`オプションにカレントディレクトリからの相対パスを渡してください
json/yaml両方の拡張子に対応してます

### APIリクエスト

--save-dev付けるとか付けないとかあるけどとりあえずまとめてインストール

```bash
$ npm init -y
$ npm install @aspida/axios axios typescript ts-node @types/node
```

petを作成して取得するだけのコードです
エンドポイントを文字列ではなくプロパティとメソッドで組み立てるのでVSCodeの型補完や型チェックの恩恵を受けられます

```ts:index.ts
import axiosClient from '@aspida/axios'
import api from "./api/$api"
import { Pet } from './api/@types'

;(async () => {
  const client = api(axiosClient())
  const petId = 100
  const body: Pet = {
    id: petId,
    name: 'hoge',
    photoUrls: [],
    status: 'available'
  }

  await client.pet.$post({ body }) // petを新規作成
  const pet = await client.pet._petId(petId).$get() // 作成したpetを取得
  console.log(pet)
})()
```

作成したTSファイルを実行するnpmスクリプトを追加

```json:package.json
{
  "scripts": {
    "start": "ts-node index.ts"
  }
}
```

### 実行

```bash
$ npm start
# { id: 100, name: 'hoge', photoUrls: [], tags: [], status: 'available' }
```

実際にswagger.ioのサーバーにリクエストが飛んで自分で作成したペットの情報をGETできました

## まとめ

Swaggerファイルさえ出力できれば、LaravelやRailsのコードからTypeScriptの型定義を自動生成できるイメージが伝わったはずです
これはスゴイ！と感じたらGitHubにスター押してもらえると非常に嬉しいです
バグとか不足機能があれば日本語でいいのでQiitaのコメントかGitHubのIssueに投稿してください

aspida日本語ドキュメント：https://github.com/aspida/aspida/tree/master/packages/aspida/docs/ja
配列の長さを測ろうとしたらオブジェクトだった話

# 本論

「(変数)が空の時だけ表示されるメッセージが、空でないときも表示される」というバグがあった。その判定用の関数を調べてみたところ、

```javascript
return v.length > 0;
```

といった風なコードが書かれていた。しかし同じ`v`を扱っている処理をよく見てみると、

```javascript
Object.keys(v).length
```

のような表記がされていた。なので判定用の関数を同様の表記にしたところ、バグは解消された。

後で気になって、何故エラーを吐かずに`v.length > 0`が`false`になっていたのかを調べてみたところ、どうやら以下のようになっていたらしい。

`v`は配列ではなくオブジェクトで、プロパティ`length`が設定されている訳でもないので、`v.length`は`undefined`になる。その`undefined`に対して大小比較を行うと、必ず`false`になる。

# 結論

扱う変数がオブジェクトか配列かなど、どのような物であるかを把握するのは重要。

# 最後に

このバグを仕込んだのも解決したのも私でした。以後気をつけます。
ファイルの中身を任意の回数、繰り返し表示したい

# 同じデータをコピペしたい
タイトルのとおりです。

```sh:もともとのデータ
cat input.txt
# hoge
# fuga
# ====
```

このデータを任意の回数、繰り返し表示します。

```sh:3回の繰り返し
cat output.txt
# hoge
# fuga
# ====
# hoge
# fuga
# ====
# hoge
# fuga
# ====
```

# Shellscriptのコード

```sh:コード
# input.txtの作成
cat << EOF > input.txt
hoge
fuga
====
EOF

iter=1000000 # 繰り返しの数を指定

awk -v file="input.txt" -v iter=${iter} \
  'BEGIN{for(i=1; i<=iter;i++) print file}' |
xargs cat |
cat > output.txt
```

# 工夫したところ
AWKで下記のようにファイル名を繰り返して表示させます。
これを`xargs cat`で実行することで目的のアウトプットを得ます。
`xargs`で実行することで、`Argument list too long`エラーを防ぐことができます。
MAXScript をどうやって勉強していくか

# 概要
- MAXScriptの学習者がつまづきやすい、リファレンスの検索方法などを説明します。

# 難易度
- 入門

# 閲覧想定ユーザー
- 3dsMaxの操作をある程度行えるデザイナー
- これからMAXScriptを始める方
- プログラミング経験がゼロの方

# 想定所要時間
- 10分

# どうやって読み解いていくか？
**最初は文法を覚えるしかないので、いろいろな機能を、ひたすら試してみるのが良いでしょう。**

しかし、どんな機能があるか分からない場合は、どうすれば良いのでしょうか？

**まずは、公式リファレンスにあるチュートリアルを進めたり、サンプルを試してみるのが良いでしょう。**

# 公式リファレンスのチュートリアル・サンプル

### ボックスの操作
- http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_4C1D639F_0A2C_402D_A078_56D8A8DB4964_htm

### チュートリアル - 役立つサンプル
- http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_25C9AD58_3665_471E_8B4B_54A094C1D5C9_htm


# 公式リファレンスの検索方法
**情報カテゴリから「スクリプトとカスタマイズ」を有効にして、MaxScriptで扱いたい機能をキーワード検索します。**

たとえば「文字列」「グループ」といったキーワードや、モディファイア名、「ヘルパー」「標準マテリアル」といった種類名などです。

http://help.autodesk.com/view/3DSMAX/2018/JPN/?query=%E8%AA%9E&cg=%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A8%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA
 

たとえば、MAXScriptで「ベンド」モディファイヤを扱いたいとします。

 

左列「絞り込み条件」の情報カテゴリから `スクリプトとカスタマイズ` を有効にします。

キーワード検索に `ベンド` と入力して検索します。

![検索方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144790/f74e7d3d-bb3e-5079-dc40-be3d92db2d72.png)


ベンドモディファイヤに関する情報がヒットしました。ページを開いて実装の参考にします。

![検索結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144790/56274f84-b0f9-6b28-3e54-4e4d7ede1a0b.png)


このようにして、公式リファレンスの中を探索することができます。

※AND検索（スペースを空けて複数のワードを入力）には、あまり向いていません。

---

それでも分からない情報は、ググって事例を探した方が早いかもしれません。
SSHでリモートサーバにログイン

IT未経験のスクール生が学んだことをアウトプットします:neutral_face:
初めての投稿です。よろしくお願いします。

##SSHとは
離れた場所にあるサーバ(リモートサーバ)の中で作業したい場合に、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するプロトコル

####SSHのメリット
・通信を盗聴される危険性を回避して、安全に操作ができる
・サーバ上でのファイル操作、設定ファイルの編集ができる

##SSHでログイン
パスワード認証と公開鍵認証の2つの方法でログインできる

SSHを利用するためには、リモートにSSHサーバ、ローカルにSSHクライアントというソフトウェアをインストールする必要があります。しかし、LinuxサーバやMac OSには標準でインストールされているのでインストールする必要はありません。

```
$ ssh [ ログインユーザー名 ]@[ IPアドレス ]
```

初めてログインする場合は、本当に接続するのか確認されるのでyesと入力
次にパスワードの入力が求められるので、パスワードを入力すればログインすることができます

#####Linuxマシン（192.168.2.67）にはじめてsshログインする場合

```
 macmini: ~ user1 $ ssh hinako@192.168.2.67
The authenticity of host '192.168.2.67(192.168.2.67)' can't be established.
RSA key fingerprint is c3 : e3 : 8d :5e ea :58 : 0e :a9 :  e5 : 03 : 34 : 56 : b3 : ca : a3 : 60.
Are you sure you want to continue connecting (yes, no)? yes ←yesを入力
Warning : Permanently added '192.168.2.67'(RSA) to the list of known hosts.
hinako@192.168.2.67's passward:  ←パスワード入力
Last login: Sat Aug 23 18:34:30 2014 from 192.168.2.67 
[hinako@localhost ~]$
```

####秘密鍵と公開鍵
不特定多数の人がサーバに入れるのはセキュリティ上よくありません
***秘密鍵***と***公開鍵***という2つのファイルを作成しサーバに入れる人を制限します
公開鍵はサーバへのSSHを始める時に一緒に送ります。秘密鍵はローカル環境内に保存します。
公開鍵によって暗号が生成され、ローカル環境ではサーバから送られてきた暗号を秘密鍵で解読します
このようにして、サーバーとローカル環境間の情報のやりとりが安全に行われます

##公開鍵でログイン
手順
1.公開鍵と秘密鍵を生成(ローカル環境)
2.公開鍵をサーバ側に設置(ローカル環境→サーバ)
3.公開鍵認証でログインできるか確認

#####1.公開鍵と秘密鍵を生成
```
~ $ cd .ssh # .sshディレクトリへ移動
.ssh $ ssh-keygen -t rsa  # 公開鍵と秘密鍵を作成
```

入力後、以下のように表示され、秘密鍵の保存場所と秘密鍵に設定するパスワードを入力します

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa): [秘密鍵の置き場所]　
Enter passphrase (empty for no passphrase): [パスワード]
Enter same passphrase again: [パスワード]
```

公開鍵は***~/.ssh/id_rsa.pub***、秘密鍵は***~/.ssh/id_rsa***に保存されています
以下のコマンドを入力して、出力結果に以下の2つが含まれていれば作成成功です

```
$ ls
=> [鍵の名前]_key_rsa　[鍵の名前]_key_rsa.pub
```
公開鍵と秘密鍵を作成できたか、catコマンドを使って公開鍵の中身を確認します

```
# 公開鍵の中身を確認
$ cat [公開鍵]_key_rsa.pub

#秘密鍵の中身を確認
$ cat [秘密鍵]_key_rsa
```

コマンドを実行すると、複雑な文字列がターミナル上に表示されます。これが、先ほど作成した公開鍵と秘密鍵の中身になります

#####2.公開鍵をサーバ側に設置

・リモートサーバにローカル環境の公開鍵のファイルをコピー

　公開鍵をリモートにサーバにコピーするにはscpコマンドを使います
　***scpコマンド***　送信先のディレクトを指定してファイルを送ることができるコマンド

```
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@ [IPアドレス]:~/.ssh
```

※AWSの場合

```
$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
```

・ローカル環境の公開鍵のファイルの中身を、リモートサーバの公開鍵のファイルに追記

今までローカル環境では、公開鍵はid_rsa.pubに保存しましたが、リモートサーバでは公開鍵は　~/.ssh/authorized_keysに保存します。

```
# リモートサーバにログイン
$ ssh [ユーザー名]@ [IPアドレス]

# .sshディレクトリへ移動
$ cd ~/.ssh  

# リモートサーバの公開鍵のファイル（~/.ssh/authorized_keys）を作成
touch .ssh/authorized_keys

# 公開鍵の中身を追記
$ cat ~/id_rsa.pub >> authorized_keys
```
最後に.sshディレクトリとauthorized_keysファイルの権限を設定します。 .sshディレクトリには読み・書き・実行のすべての権限、authorized_keysファイルには読み・書きの権限を設定します

```
# .sshディレクトリとauthorized_keysファイルの権限を設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```

#####3.公開鍵認証でログインできるか確認

```
# リモートサーバにログイン
$ ssh [ユーザー名]@ [IPアドレス]
```

コマンドを打った後、下記のような表示がされます。①公開鍵と秘密鍵を生成の# 秘密鍵に設定するパスワードを入力のところで記述したパスワードを入力します。その後[ユーザー名]@ [IPアドレス]%　と表示されていればログイン成功です:v:

```
Enter passphrase for key '~/.ssh/id_rsa': 　←パスワードを入力 
[ユーザー名]@ [IPアドレス]%　　←SSHサーバにログイン成功
```
リレーショナルデータベースに少しだけ詳しく踏み込んでみる。（トランザクションとかロックとか）

今日は、DBについてどのように一貫性を保証しているのか調べて見ました。

# データベースの基本

- データベースの定義は、ある目的の為に体系的に集められたデータの事を言います。
- データのまとまりとしては、ファイルやフォルダも同様ですが、それらとの違いは
    - ファイル・フォルダ：個人でのデータ管理を目的としている
    - データベース：複数人でのデータ管理を目的としてる
        - DBの特徴
            - データの共用：複数人で使えるよ
            - データの一貫性：複数人で使っても不具合がない仕組みだよ
            - データの独立：プログラムと独立しているよ
            
　　　　　　　　　　　　　　な特徴があります。

- DBを利用したシステム（MySQL・PostgresSQL）の事をDMMS（データベース管理システム）と言います。

DBモデルの種類はありますが、一般的に使われるのがリレーショナルデータベースです。
<img width="326" alt="d2c733c3-19a8-4754-895f-e0e04f5337f9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406727/428361de-a358-6e96-0705-64606d4bc497.png">

# リレーショナルデータベースの概要

- リレーションは関連づけという意味で、行と列で表された二次元のデータ構造を複数関連づけているイメージです。
    - 特徴
        - 行を一意に識別するための主キー：PrimalyKeyをもつ
        - データ操作はSQLでRDBMSを介して行う
     
<img width="286" alt="1a1d7984-8e9a-42fd-b07d-457161f404bc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406727/a212f13d-50ca-e09e-68ab-f5846c466589.png">


# データベースの制御
では、どのように一貫性を保つ仕組みがあるのでしょうか？

## トランザクション
トランザクションとは、DB処理に対するいくつかの処理が意味を成す一つのまとまりです。

<img width="284" alt="8b5c9b12-ed52-4dd7-91d1-1ad22f6f4dcb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406727/77ef2bac-9032-4dfb-98e2-4e0f403d8765.png">

例でよく出るのが口座振替です。
これは、出金と入金が両方成立しないと、やばいことになります。
両方成立して初めて意味をなします。

### ここで、疑問が生じました。データの始まりと終わり（意味を成すまとまり）をどこで定義しているのか？


>PostgreSQL では、BEGIN 文または START TRANSACTION 文でトランザクションが開始されます。この後 COMMIT 文を実行するまでは、INSERT/UPDATE/DELETE によるデータ更新は保留され、データベースにはすぐには反映されません。COMMIT 文を実行することで、トランザクションが終了し、データの変更がまとめてデータベースに反映されます。また ROLLBACK 文を実行することでもトランザクションが終了しますが、この場合はトランザクション内でのデータの変更がすべてキャンセルされます。
>>https://oss-db.jp/dojo/dojo_01

基本は一つのSQL文に対して、BEGIN あるいは START TRANSACTION を実行しなくても自動的にトランザクションが開始され、COMMIT 実行が行われているようです。

トランザクションのコマンド
BEGIN・START TRANSACTION:トランザクションの開始します。
COMMIT・END：コミットしてトランザクションの終了します。
ROLLBACK・ABORT：トランザクションを途中停止し処理を最初からすべて取り消します。

仕様によってはトランザクションをOFFにするケースもあります。
デフォルトではAuto CommitはONになっていますが、AUTOCOMMIT変数にonまたはoffを指定すれば、自動コミットの有効・無効を設定できます。

## ロック（同時実行の制御）
ロックとはその名の通り、同時にデータの変更を行おうとした際に、片方の変更を禁じます。

ロックに関しては、こちらの方の記事が参考になります。
[データベースの「ロック」という概念は2種類ある](https://qiita.com/daiching/items/835fa37de22b397eece0)

#####アプリケーション側でのSQLを設定すれば、トランザクションも自由設定できるようですね。


>＜参考＞
>PostgreSQL 7.2.3 チュートリアル
>https://www.postgresql.jp/document/9.4/html/tutorial-transactions.html
[漏洞通告]CVE-2020-2555/Oracle Coherence&WebLogic反序列化远程代码执行漏洞

### 漏洞描述
近日,亚信安全网络攻防实验室监测到1月份被Oracle修复的基于T3协议触发的漏洞(CVE-2020-2555)细节在ZDI被公开.`Oracle Coherence`为Oracle融合中间件中的产品,是业界领先的内存数据网格解决方案,它能为公司和组织提供对常用数据的快速访问。在WebLogic 12c及以上版本中默认集成到WebLogic安装包中.`Oracle Coherence`中的反序列化远程代码执行漏洞允许未经身份验证的攻击者通过精心构造的T3网络协议请求进行攻击.成功利用该漏洞的攻击者可以在目标主机上执行任意OS命令,严重危害服务器安全.

### 漏洞编号
CVE-2020-2555

### 漏洞威胁等级
高危

#影响范围
Oracle Coherence 3.7.1.17
Oracle Coherence&WebLogic 12.1.3.0.0
Oracle Coherence&WebLogic 12.2.1.3.0
Oracle Coherence&WebLogic 12.2.1.4.0
### 漏洞验证
选用WebLogic 12.1.3为靶机进行验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/288dd62b-355b-b589-912d-c89c68db2f3f.png)

### 修复建议
安装更新补丁即可
https://www.oracle.com/security-alerts/cpujan2020.html

### 时间轴
[0] 2020/03/05 Sivathmican Sivakumaran在ZDI公开漏洞细节
[1] 2020/03/06 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告
### 鸣谢
感谢一起研究的以下小伙伴

Qianxin-Lufei/Ntears、
afanti
### Reference
https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server
https://mp.weixin.qq.com/s/nzKDO77tW-WVuPsgy3vrzg
ミスミのアルミフレームをUnityで使う

## はじめに
[ミスミのアルミフレーム](https://jp.misumi-ec.com/vona2/mech/M1500000000/M1501000000/M1501010000/)といえば機械屋さんなら知らない人はいない大変手軽で高精度な構造材です。
こういうやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/32ddc269-8eb9-8d9c-0747-63f7188b5165.png)
この記事ではこのフレームで出来た構造物をUnityに取り込んで表示してみたいと思います。
## アルミフレームを組み合わせて構造物を作る
上の画像を見ていただくとわかるかと思いますが、断面を見ると結構複雑な構造をしています。もちろん、3D CADやモデリングツールでパスを駆使してベベルしてもいいのですが、今回はミスミさんの提供するアルミフレーム筐体設計ソフト[FRAMES](https://jp.misumi-ec.com/special/alumiframe/frames/pr/?bid=bid_MJP-VF19025-TM01-01)という無料で使える神ツールを使ってちゃちゃっと作ってしまいます。
使い方は[ミスミさんのページ](https://jp.misumi-ec.com/special/alumiframe/frames/pr/?bid=bid_MJP-VF19025-TM01-01)を見てくださいませ。

で、出来たものがこちらの枠のような物。
この構造物、コピペと移動を覚えれば3分でできます！さすが神ツール！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/ce3f7380-cfa9-8eed-f7e1-f5b2a0db2aec.png)
あ、そうそう、「FRAMES」を使えば、値段の確認や発注まで出来ちゃいますよ。
これは12,744円ですって。安い！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/99745b6b-c155-ab01-a483-bd38c4351443.png)
## 出来た構造物のモデルを変換する
この図面のデータをUnityに取り込むために、まずは「FRAMES」のメニューから「STL形式でエクスポート」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/4aa1dacd-235b-d01e-8f07-a359baa07dc3.png)
次に、STLファイルをUnityで読み込み可能なファイル形式に変換します。
私はBlenderを使いました。
BlenderではSTLインポート時に、Scaleを0.001、UpをY Upに設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/dc51a585-1d09-206a-a102-1f998d8e9b9a.png)
するとこの画面のように読み込みができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/db2758b1-ab23-65d9-81e4-54c81dfb9d5a.png)
さらにこれを、Unityが読み込み可能な形式、例えばFBXでエクスポートします。
## Unityに読み込んで配置する
いよいよ出来たモデルをUnityに読み込んで配置します。
まず、Unityで何かプロジェクトを作成します。
ここではHigh Definition RPのプロジェクトを使ってみます。
これがプロジェクト作成直後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/8fd8f078-13a6-2989-7004-235893d0e6eb.png)
次に、先ほどBlenderからエクスポートしたFBXファイルをUnityのAssetsにインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/b7b8d388-31f2-38f6-d70b-5e996fbb4b64.png)
さらにそれをシーンにいい感じに配置して完成とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/2d211f49-e857-fa02-58c6-42c0722f2038.png)
マテリアルはBlenderのデフォルトのままでしたが、HDRPのおかげでそこそこ馴染みました(かな?)

以上の要領で「FRAMES」を使って皆さんのオリジナルのフレームを作って、それをUnityに取り込むことで、様々な用途に活用出来るんじゃないかなと思います。
blenderの操作をmetasequiaのように

編集モード時に右ドラッグでカメラ操作を回転したいのですが
keymapではオブジェクトモードしか見当たりません、編集モードでは
無理なのでしょうか？
あと左ドラッグで頂点移動後、右クリックで頂点同士を結合などしたいのですが
可能でしょうか
The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 【ABSTRACT】【論文 ほぼ Google 翻訳 自分用】

この記事は自分用のメモみたいなものです.
ほぼ Google 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks]
(https://arxiv.org/abs/1803.03635)

前: 無し
次: [【1 INTRODUCTION】](https://qiita.com/tomato_/items/74bbbd5cca00908f104a)

# ABSTRACT

### 訳文

ニューラルネットワークの枝刈り技術により, トレーニング済みネットワークのパラメーター数を $90\%$ 以上削減し, ストレージ要件を減らし, 精度を損なうことなく推論の計算パフォーマンスを改善できます. ただし, 現在の経験では, 枝刈りによって生成されるスパースなアーキテクチャを同じようなトレーニングパフォーマンスまで改善するようにスタートからトレーニングするのは困難です.

標準の枝刈り手法では, 初期値により効果的にトレーニングできるサブネットワークが自然に発見されることがわかります. これらの結果に基づいて, 宝くじ仮説を明確にします: 全結合でランダムに初期化されたフィードフォワードネットワークには, サブネットワーク (当選チケット) が含まれ, 単独でトレーニングされた場合, 同じイテレーション数で元のネットワークに匹敵するテスト精度に達します. 私たちが見つけた当選チケットは, 初期値宝くじに当選しました: それらの接続には, トレーニングを特に効果的にする初期重みがあります.

当選チケットを識別するアルゴリズムと, 宝くじ仮説とこれらの偶発的な初期値の重要性をサポートする一連の実験を紹介します. MNIST および CIFAR10 の全結合畳み込みフィードフォワードアーキテクチャのサイズの 10-20% 未満の当選チケットが常に見つかります. このサイズを超えると, 当選したチケットは元のネットワークよりも早く学習し, より高いテスト精度に達します.

### 原文

Neural network pruning techniques can reduce the parameter counts of trained networks by over 90%, decreasing storage requirements and improving computational performance of inference without compromising accuracy. However, contemporary experience is that the sparse architectures produced by pruning are difficult to train
from the start, which would similarly improve training performance.

We find that a standard pruning technique naturally uncovers subnetworks whose initializations made them capable of training effectively. Based on these results, we articulate the lottery ticket hypothesis: dense, randomly-initialized, feed-forward networks contain subnetworks (winning tickets) that—when trained in isolation—reach test accuracy comparable to the original network in a similar number of iterations. The winning tickets we find have won the initialization lottery: their connections have initial weights that make training particularly effective.

We present an algorithm to identify winning tickets and a series of experiments that support the lottery ticket hypothesis and the importance of these fortuitous initializations. We consistently find winning tickets that are less than 10-20% of the size of several fully-connected and convolutional feed-forward architectures for MNIST and CIFAR10. Above this size, the winning tickets that we find learn faster than the original network and reach higher test accuracy.
(補足)Python3で「Tello_Video」を動かす

#はじめに


このページは，

[Tello-Pythonのサンプル「Tello_Video」を動かす](https://qiita.com/hsgucci/items/c9082690c6d0695b722f)

の補足ページです．
本来，Python2用に作られているTello_Pythonを，Python3で動かすためのアレコレです．

#概要
DJI公式のTello用Pythonサンプルプログラム「Tello-Python」のうち，

　[Tello_Video](https://github.com/dji-sdk/Tello-Python)

をPython3で動かす方法を記述します．

Python2のプログラムをPython3に対応させるには，主に以下の作業を行います．

- print文の修正
- responseをstr()でstr型と明示
- try except文のas
- pip系のインストールをpip3でやり直し

既に下記ページで「tello_state.py」「Single_Tello_Test」のやり方を解説してくれています．

　参考URL：[トイドローンTelloをPython3で制御する](https://qiita.com/coffiego/items/54c8bb553394590787f9)


次の課題は，**<font color=red>「Tello_Video」のH.264デコードライブラリ`libh264decoder.so`をPython3用にビルドする</font>**ことです．
ここが解決しないと，OpenCVで画像処理ができません(T_T)

本記事では，邪道な方法ですが既に問題解決された方のgitを利用して動かしてみます．

#Tello-PythonをPython3で動かしたい

Python3で動かしたいというニーズは多く，公式gitにもissueが上がっていました．

　[Tello_Video on Phyton3 is working now. #20](https://github.com/dji-sdk/Tello-Python/issues/20)

ここにあるように，[f41ardu氏の派生版Tello-Python](https://github.com/f41ardu/Tello-Python)をcloneして動かしてみます．

基本的には
https://github.com/f41ardu/Tello-Python/tree/master/PY3_Tello_Videop/h264decoderpi3
に書かれた手順を和訳しただけになります．

#Python3用libh264decoder.soのビルド

筆者の記事を読んでいただいている方であれば，
ホームディレクトリには，既に公式Tello-Pythonがダウンロードされていると思います．

この場合，そのまま当該gitをcloneすると名前が被ってしまいます．
まずは，`python3`ディレクトリを作り，その中で作業しましょう．

```bash:Python3版のためのディレクトリを作る
$ cd ~
$ mkdir python3
$ cd python3/
```
次に，f41ardu氏のTello-Pythonをgitでダウンロードします。

```bash:f41ardu氏のTello-Pythonの導入
$ git clone https://github.com/f41ardu/Tello-Python/
$ cd Tello-Python/
$ ls
LICENSE.md               Tello_Video
PY3_Tello_Videop         Tello_Video_With_Pose_Recognition
README.md                doc
Single_Tello_Test        tello_state.py
TelloPython_FAQ(CH).txt  tello_video_dll(ForWin64).zip
TelloPython_FAQ.txt
```
当該Tello-Pythonには，`PY3_Tello_Videop`という新しいディレクトリがあるので，その中へ入ります．

```bash:Python3版「Tello_Video」へ移動
$ cd PY3_Tello_Videop/
$ ls
LICENSE.md  h264decoderpi3     main.py   tello_control_ui.py
README.md   libh264decoder.so  tello.py
```
`PY3_Tello_Video`ディレクトリには，`h264decoderpi3`という，H.264デコーダをラズパイ３用に作るディレクトリがあります．
これをラズパイ用ではなく，通常のIntel系Linux用にビルドすることになります．

```bash:H.264デコーダのビルドとコピー
$ cd h264decoderpi3/
$ mkdir build
$ cd build/

$ cmake -DPython_ADDITIONAL_VERSIONS=3.5 -DBoost_PYTHON_LIBRARY_RELEASE=/usr/lib/x86_64-linux-gnu/libboost_python-py35.so ..
$ make

$ cp libh264decoder.so ../../
$ cd ../../
```
これで，`libh264decoder.so`が`PY3_Tello_Video`の中にコピーされました．

インストールされているPython3のバージョンが3.7系の時は，

```bash:Python3.7の場合
cmake ../CMakeList.txt -DPython_ADDITIONAL_VERSIONS=3.7 -DBoost_PYTHON_LIBRARY_RELEASE=/usr/lib/usr/lib/arm-linux-gnueabihf/libboost_python37.so ../  
```
この様に`3.7`や`37`と書き換えてcmakeしてください．

#PY3_Tello_Videoの実行

Python3としてmain.pyを実行します．

```bash:Python3でmain.pyを実行
$ python3 main.py
```

後はいつも通りのTello_Videoです．

#おわりに

[2019年10月にやり方を調べていながら](https://qiita.com/hsgucci/items/d1df1122853ee6dd4bf7#comment-d52e9519afdb2c505165)，ずっと放置でした．．．やっと書けた〜！
CircleCI 2.0　ローカルでの実行コマンド

## 概要
ポートフォリオ作成中に初めてCircleCiを触ったのですが、設定ファイルが正しいかを確認する為にはプッシュしてCIを走らせるしか、方法がないと思い無駄に何回もコミット→プッシュしてCIに何十回も失敗していました。

無駄にコミット量が増えるのでよろしくないと思い調べていたら
ターミナルで実行する方法があったので残しておきます。

※前提としてCircleCiの設定ファイル.circleci/config.ymlを作成している事とします。

## circleciのコマンドをインストールする
```
$ curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci
circleci update
```

## 実行コマンド

```
$ circleci build .circleci/config.yml
```

これでいちいちプッシュしてCircleCiのブラウザで確認しなくてもCIを実行できました。
以上です。
【Vue.js 】 フィルタでデータを加工

## フィルタとは

データバインディングの際にフィルタを利用することでデータを加工して表示させることができる。
例えば、数値をカンマや￥をつけて金額表示にしたり、長文テキストを丸めて末尾に「・・・」をつけて省略表示にするときなどに使用する。

## フィルタの書き方

フィルタにはMustacheとv-bindの２つの書き方がある。
どちらの書き方でも共通しているのがフィルタに渡すデータとフィルタを”パイプ”（” | ”）で区切るということ。

#### Mustacheでのフィルタの書き方

基本構文
`{{ フィルタに渡すデータ | フィルタ }}`
< 例 >
- フィルタに渡すデータは1000 
- フィルタオプションの関数は受け取った数値の2倍にして返す


```index.html
{{ 1000 | toDouble }}
```
```filter.js
new Vue ({
  el:'#app',
  // ここからフィルタ
  filters: {
    toDuble: function(val) {
      return val * 2;
    },
  },
})
```
数値1000をtoDouble関数の引数として呼び出し、toDoble関数では1000を2倍にして数値を返す。

#### v-bindでの書き方
基本構文
`<div v-bind:id="フィルタに渡すデータ | フィルタ"></div>`

## フィルタはこんな時に使うと便利
金額に￥をつけてカンマで区切る

```index.html
<ul>
  <li v-for="product in products">
    {{ product.name }} : {{ product.price | formatPrice  }}
  </li>
</ul>
```
```product.js
var products = [
  { name:'おもちゃ',price:500},
  { name:'本',price:1000},
  { name:'リュック',price:3000},
];

new Vue({
  el:'#app',
  data: {
    product: products,
  },
  filters: {
    formatPrice: function(val) {
      return `¥${val.toLocalString()}`;
    }
  },
})
```

##### toLocaleString()メソッドとは
対象のNumberクラスのオブジェクトを文字列に変換して返す。toStringメソッドは数値の文字列表現を返すが、toLocaleStringメソッドは現在のロケール（言語や国・地域の設定のこと）に応じた文字列表現を返す。
Nginxの裏で動くApache ArchivaをSSL化

# Apache Archivaを建てたかった

リポジトリマネージャーを使いたくていろいろ調べてたらSonatype Nexusは私のサーバーのスペックでは動かないことが判明。
動きそうなApache Archiva(以下Archiva)を建てて、どうせならHTTPSでやり取りしたいな～と思って普段通りにSSL化したらうまくいかなかった。

## DR;TL

- スタンドアロンのArchiva(v2.2.3から)をNginxで単純にSSL化だけじゃLoadingと表示されてUIが延々と表示されない
- conf/archiva.xmlのredbackRuntimeConfiguration.configurationProperties.baseUrlにSSL化したURLを書くとうまくいく

## 環境

- AWS Lightsail
    - 2GB RAM
    - 1 vCPU
    - 60 GB SSD
-  Ubuntu Ubuntu 18.04.1 LTS
-  Apache Archiva v2.2.4

## 症状

NginxでSSL化してもUIがロードされない。

## 原因

v2.2.3からリバースプロキシの裏でArchivaを動かすにはArchiva側で設定が必要。

## 解決策

conf/archiva.xmlのredbackRuntimeConfiguration.configurationProperties.baseUrlにSSL化したURLを書く。

```diff:conf/archiva.xml
<redbackRuntimeConfiguration>
  <configurationProperties>
    <rest>
-      <baseUrl></baseUrl><!-- ここを変える -->
+      <baseUrl>https://archiva.example.com</baseUrl>
    </rest> 
  </configurationProperties>
</redbackRuntimeConfiguration>
```
JOINして複数の関連テーブルの条件で絞り込んだ結果をUPDATEするSQL

題名の通り、複数の関連テーブルの条件で絞り込んだものだけをUPDATEしたいときのSQLの書き方メモ。

```SQL
UPDATE tableA
  LEFT OUTER JOIN tableB
    ON tableA.tableB_id = tableB.id
  LEFT OUTER JOIN tableC
    ON tableB.tableC_id = tableC.id
SET column_name_to_update = NULL
WHERE tableC.select_column_name = select_val ;
```

（まだ本当に正しいか検証していない…）

`SET` と `WHERE` の順序に注意。
Rustで"this is an associated function, not a method"のエラーが出たのでメソッドと関連関数について調べてみた

# エラーに遭遇

今日もRustをダラダラ書いていると，

```zsh
error[E0599]: no method named `listen_and_serve` found for struct `servers::Server` in the current scope
  --> inferno-rtmp-engine/src/servers/tests.rs:6:12
   |
6  |     server.listen_and_serve();
   |     -------^^^^^^^^^^^^^^^^
   |     |      |
   |     |      this is an associated function, not a method
   |     help: use associated function syntax instead: `servers::Server::listen_and_serve`
```
というエラーに遭遇してしまいました。
`this is an associated function, not a method`って，僕がいままでメソッドだと思っていたものはメソッドではなかったのでしょうか...

なので，Rustの`メソッド`とこの`associated function`について少し詳しくなるために色々調べてみました。

# Associated Function(関連関数)
この関連関数というのは，名前の通り**型に関連付けられた関数**のことらしいです。

```rust
struct Struct {
    field: i32
}

impl Struct {
    fn new() -> Struct {
        Struct {
            field: 0i32
        }
    }
}

fn main () {
    let _struct = Struct::new();
}
```

# メソッド
メソッドは関数に似ていますが，構造体の文脈(?)で定義されており，**最初の引数が必ず`self`になる**らしく，これはメソッドを呼び出している構造体のインスタンスを示しているらしいです。

```rust
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}
```

ぼんやりとわかったようなわからないような...

# 関連関数とメソッドの差
[ドキュメント](https://doc.rust-lang.org/reference/items/associated-items.html)にはこう書かれています。
> Associated functions whose first parameter is named self are called methods and may be invoked using the method call operator, for example, x.foo(), as well as the usual function call notation.

関連関数の最初の引数が`self`のものは`メソッド`と呼ばれ，`x.foo()`のようにメソッド呼び出し構文で呼び出せるっていってますかね。

違いはほんとにこれだけなのでしょうか？
もう少し調べてみます。

## 好きな方を使ってもよさそう？
[リンク](https://www.reddit.com/r/rust/comments/ahqjyq/how_to_use_method_of_own_object/)をみていた感じでは，メソッド呼び出し構文を使いたい場合は関連関数の第一引数を`self`にして利用できるみたいで，別に必要ないなら関連関数として使っちゃってもいいみたいな感じでしょうか。

# おわり
Rustまだまだよくわからないことだらけですが，ひとつひとつ調べてがんばっていこうと思います！

# 参考リンク
> https://doc.rust-lang.org/reference/items/associated-items.html
> https://doc.rust-jp.rs/book/second-edition/ch05-03-method-syntax.html
> https://www.reddit.com/r/rust/comments/ahqjyq/how_to_use_method_of_own_object/
【PL/pgSQL】SELECT INTOが複合型に適用できないバグとその回避方法【PostgreSQL】

仕様だったらごめんなさい。

#1 バグ

PL/pgSQLでSELECT INTOを複合型に対して適用すると、エラーになってうまくいかない。

例えば`CREATE TYPE T AS (i int, j int);`してから

```sql

DO
$do$
    DECLARE t T := '(1,2)'::T; u T := '(3,4)'::T;
    BEGIN
        RAISE NOTICE '変数自体はちゃんと入ってる→%', t;
        SELECT INTO u t; -- uをtと同じにする;
    END;
$do$;
```
を実行すると...

```
NOTICE:  変数自体はちゃんと入ってる→(1,2)
ERROR:  integerに対する不正な入力構文: "(1,2)"
CONTEXT:  PL/pgSQL 関数 inline_code_block の5行目 - SQL ステートメント
```
のようなエラーが出る。

また
`CREATE TYPE T AS (i numeric, j numeric);`
でやると、

```
NOTICE:  変数自体はちゃんと入ってる→(1,2)
ERROR:  "numeric"型の入力構文が不正です: "(1,2)"
CONTEXT:  PL/pgSQL 関数 inline_code_block の5行目 - SQL ステートメント
```
のようになる。
複合型を`SELECT INTO`しようとすると、そのフィールドのデータ型に代入しようとしていると勘違いされてしまうようだ。
それにしてもフィールドの型によって文言が微妙に異なるのが気になるところ。

#2 回避方法

一時的にtext型にキャストして`SELECT INTO`し、それを、本来の代入先にもう一度キャストして代入すればよい。

```sql
DO
$do$
    DECLARE t T := '(1,2)'::T; u T := '(3,4)'::T; tmptxt text;
    BEGIN
        RAISE NOTICE '変数自体はちゃんと入ってる→%', t;
        SELECT INTO tmptxt t::text;
        u := tmptxt::T;
        RAISE NOTICE '一度textにキャストすればよい→%', u;
    END;
$do$;
```

```
NOTICE:  変数自体はちゃんと入ってる→(1,2)
NOTICE:  一度textにキャストすればよい→(1,2)
DO
```
MAXScriptで実現できる事と、スクリプトの事例

# 概要
- MAXScriptで実現できることに加えて、公開されているスクリプトを紹介します。

# 閲覧想定ユーザー
- 3dsMaxの操作をある程度行えるデザイナー
- これからMAXScriptを始める方

# 想定所要時間
- 10分

# MAXScriptとは何か？
MAXScriptは、3dsMaxで最初から扱えるスクリプト言語です。
ある程度の規則性がある反復作業を、自動化することができます。
デザイナーがMAXScriptを習得することによって、単純作業を効率化できるのがメリットです。

# 何ができるのか？
ざっくりと、以下の処理が行えます（これ以外にも出来ることは多いです）

- モデリング、モディファイヤ、アニメーション、マテリアル、レンダリングなどの操作
- カスタムアトリビュートの操作
- GUIの拡張
- ファイルの書き出し・読み込み
- バッチ処理ツールを構築

具体的には…

- オブジェクトのUVを展開して、特定命名に従ってテクスチャレンダリング。
- テキストファイルに従って、シーンファイルのアニメーションを分割して保存。
- 全てのマテリアルカラーを白にする。ただし、透明なマテリアルは処理しない。
- 複数のシーンファイルに対して処理を実行する。

といった事が可能です。これはほんの一例です。

# 事例紹介
さいごに、公開されているWebサイトやスクリプトの事例をご紹介します。

### Script Spot
- http://www.scriptspot.com/3ds-max/scripts
- 3dsMaxで利用できるスクリプトなどが集められています。欲しいと思ったツールをGoogle検索すると、このサイトですでに公開されていることも多いです。

### Detach Element
- http://www.scriptspot.com/3ds-max/scripts/detach-elements
- ポリゴンを要素毎にオブジェクトへデタッチするスクリプトです。私自身もよく使っていました。

### Fracture Voronoi
- http://www.scriptspot.com/3ds-max/scripts/fracture-voronoi
- ボロノイ分割でオブジェクトを「割る」スクリプトです。
- エフェクト制作などで重宝します。

# 参考
- 公式リファレンス
 - [MAXScriptの紹介](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_F039181A_C072_4469_A329_AE60FF7535E7_htm)
 - [MAXScriptとは](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_41315287_B2FA_4496_BDB6_28F8D38D2213_htm)
【コンフリクト】git rebaseのときに準備しておくメモ

## 準備

```
git checkout master
pitu pull origin master
git reset --hard origin/master
```


## git rebase実行

***トピックブランチへ移動して

```
git pull --rebase origin master
//コンフリクト直したらaddしてcontinue
git add .
git rebase --continue
//全部治ったらpush
git push -f
```

## しくじって最初からやり直すとき
```
git rebase --quit
git checkout feature/トピックブランチ
git reset --hard origin/トピックブランチ
```

## ブランチを行き来してえ
```
//繰り返す
git checkout master
git checkout feature/トピックブランチ
```

## 色々確認してえ
```
git branch
git log
git status
```
## 参考

[プルリクエスト時に競合した時の対処方法](https://qiita.com/hituziando/items/c10b971f58f5c5031b1d)
[[git] rebaseが完了できない現象（"--continue"を飛ばしてしまったため）の解消手順](https://qiita.com/y-some/items/34054024e91da4d7f2b8)

## 備考

- 完全に正しいのにvs codeで赤色エラーが出続けることあるので、完全に正しいと思ってるのにvs codeが赤色エラー出し続けるときは一旦エディタ再起動試すべし

- 何も変更ない状態で`git rebase --continue` できない。そういうときに困ったら空行とか消しつつ無理やり変更を作ってaddしてcontinueするべし
Rails チュートリアル第５章　testエラー

※初めての投稿になりますので何かと不備が
ございますがその際は教えて頂けましたら幸いです。

現在rails チュートリアル第５章の学習を進めてしております。

５.４１：　Userページ用のtest辺りからエラーになり、
苦戦しています。

エラーを見る限り「test/integration/site_layout_test」、「test/controllers/users_controller_test.」それぞれのsign_upが使えていないのが原因かなと感じています。
エラーの内容はこの様になってます。↓

<img width="630" alt="スクリーンショット 2020-03-06 18.23.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597154/1ffac94a-1b7d-3bd9-9e55-1d00f88c75f9.png">

signupルートの部分をコメントアウトして、エラー確認、戻してもエラーになりました。<img width="433" alt="スクリーンショット 2020-03-06 18.31.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597154/2f6b5470-eb9c-c754-360c-3615cf62c576.png">

他のQiitaでも調べましたがお手上げです。
宜しければ解決方法をご教授下さい。
site_layout_test↓
<img width="440" alt="スクリーンショット 2020-03-06 18.36.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597154/075f9161-ee09-2a7c-3c17-17847e5ce5dc.png">


よろしくお願いいたします。
Azure SDK for Python を使ったプログラムを動かす時に”ModuleNotFoundError: No module named 'azure'"が出た

# 記事の内容
タイトルの通りですが、AzureのPython SDKを動かそうとしたら以下のメッセージが出てハマったので対応した内容をメモ

ModuleNotFoundError: No module named 'azure'

# 参考
チュートリアルの仮想環境構築まで実施
[Python 用 Azure ライブラリを使用したクラウド開発の開始](https://docs.microsoft.com/ja-jp/azure/python/python-sdk-azure-get-started)

その後、こちらのプログラムを実行
[Azure Management LibraryでPythonからAzureを操作する](https://news.mynavi.jp/article/zeroazure-24/)

# コード
参考サイトのままですが、一応

~~~ AzureSample.py
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
import Config

# (1) アクセス情報
SUBSCRIPTION_ID = Config.SUBSCRIPTION_ID
TENANT_ID = Config.TENANT_ID
CLIENT_ID = Config.CLIENT_ID
CLIENT_SECRET= Config.CLIENT_SECRET

def main():
    # (2) 資格情報の取得
    creds = ServicePrincipalCredentials(
        client_id = CLIENT_ID,
        secret = CLIENT_SECRET,
        tenant = TENANT_ID)

    # (3) サブスクリプションIDを指定しリソースグループを操作するオブジェクトを取得
    client = ResourceManagementClient(creds, SUBSCRIPTION_ID)

    # (4) リソースグループ一覧の取得
    for rg in client.resource_groups.list():
        print("{} {}".format(rg.name, rg.location))

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

# 対応
1. azure の再インストール(pip uninstall azure → pip install azure)
2. mytestenv を別ディレクトリに一旦移動
3. プログラムを実行
4. mytestenvを元のディレクトリに戻す

イマイチ納得は出来てませんが、これで動くようになりました。
＊実行結果

~~~
fabric2 eastus
MC_fabric2_sample-HLF-AKS_eastus eastus
NetworkWatcherRG japaneast
MC_fabric_sample-HLF-AKS_westus westus
baasTest japanwest
baasTest2 japanwest
blockchain japanwest
fabric japanwest
fabric3 japanwest
cloud-shell-storage-southeastasia southeastasia
~~~