OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity] ユニティちゃんSunnySideUp(URP版)付属のシェーダーをUnity2020.2以上で動かす

# 問題
ユニティちゃんSunnySideUp(URP版)をUnity2020.3.6f1で動かしてみようとしたところ、正常に表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482453/251bc54b-01a5-3df5-ae85-aee54cb3fb00.png)
コンソールを見ると、
Shader error in 'Universal Render Pipeline/Toon': 'InitializeStandardLitSurfaceDataUTS': output parameter 'outSurfaceData' not completely initialized at /Users/hogehoge/Documents/Unity/UnityChanSSU_URP/Packages/UnityChanToonShaderVer2_Project-release-urp-2.2/Runtime/Shaders/UniversalToonBody.hlsl(199) (on d3d11)
なるエラーが出ています。

調べてみると、どうやらUnity2020.2からURPの新機能が追加され、その影響で動かなくなっている模様。

エラーメッセージを読むと、outSuffaceDataがUniversalToonBody.hlslの
inline void InitializeStandardLitSurfaceDataUTS(float2 uv, out SurfaceData outSurfaceData)
で完全に初期化されていないようです。

SurfaceDataについて調べてみると、下記のような構造になっています。
https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl

```
struct SurfaceData
{
    half3 albedo;
    half3 specular;
    half  metallic;
    half  smoothness;
    half3 normalTS;
    half3 emission;
    half  occlusion;
    half  alpha;
    half  clearCoatMask;
    half  clearCoatSmoothness;
};
```

InitializeStandardLitSurfaceDataUTS()のコードを見ると、clearCoatMask、clearCoatSmoothnessに値がセットされていません。

#解決方法
とりあえず、下記のコードをInitializeStandardLitSurfaceDataUTS()の最後に追加することで、正常に表示されるようになりました。

```
                outSurfaceData.clearCoatMask = 0.0h;
                outSurfaceData.clearCoatSmoothness = 0.0h;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482453/fede48e1-5253-ef78-4c82-6b48a74ce4f3.png)

#補足
UnityChanToonShaderVer2_Projectは下記でリリースが続けられており、こちらで最新のUnityへの対応がされているようです。
https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project/releases
こちらでは下記のコードをInitializeStandardLitSurfaceDataUTS()の先頭に追加する形で修正されていました。

```
                outSurfaceData = (SurfaceData)0;
```

![imageLicenseLogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482453/fe223e83-a323-35e5-d321-7d181799d71a.png)
この記事は[ユニティちゃんライセンス条項](https://unity-chan.com/contents/license_jp/)の元に提供されています。
Oracle APEXでフォーム付き対話モードレポートに文書ファイルダウンロードリンクを出現させる

本記事は下記の記事の続きの内容になっています。

https://qiita.com/ketsuji1/items/d6c2eebae291c5d47e1d

この記事では、フォーム付き対話モードレポートのフォームのプロパティにBLOB関連ファイルを入力することで、編集フォームから文書をダウンロードできるようになりました。
今回はレポートにダウンロードリンクを出現させてダウンロードする方法になります。

# サマリ
今回ははまりポイントがあるので、まずははまる例から説明します

0.はまりポイントの説明
手順の説明
1. レポートのソースをSQL問合せに変更する
2. BLOBダウンロード列の列プロパティの設定をする

## はまりポイントの説明
前回作った下記状態の画面のName列の右に文書ファイルのダウンロードリンクの列を入れることを考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/95666cfb-9d12-27b4-236c-1db817aee169.png)

そのために、まずはこの画面のページデザイナに移動します。
画面は下記のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/a8c25009-db08-d787-6de1-10a4ccbe7a54.png)

直観的には、列のところに、BLOB列であるDOC列を列の同期化で表示（列の文字列の上で右クリック→列の同期化を選択）させ、プロパティの識別でタイプをBLOBのダウンロードにし、BLOB属性をそれぞれ指定すれば、うまくいきそうな雰囲気がします。

実際にやってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/7a6955bf-4110-454f-b63d-35b6c542d610.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/3155359b-3182-7a80-438d-a874ff4ab34d.png)

ここまで実施して実行ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/a93decd3-9eb9-70e9-c81c-3333b65f900f.png)

すると、下記エラーのみ表示されて表にデータが何もでてこない状態になってしまいます。

**ORA-06502: PL/SQL: 数値または値のエラー: 文字から数値への変換エラー。が発生しました**

BLOB列を直接レポート列として扱おうとするとこのエラーが発生してしまいます。これを回避するには、BLOB列の代わりに、`DBMS_LOB.GETLENGTH(DOC)`(DOCはBLOB列)のような列を指定します。

## 手順詳細
### レポートのソースをSQL問合せに変更する
`DBMS_LOB.GETLENGTH(DOC)`列を選択するためにレポートのソースをSQL問合せに変更し、DOCの代わりに`DBMS_LOB.GETLENGTH(DOC)`をSELECT文に含めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/96d9ccd7-312b-0b7e-00d5-3f004de2ce3b.png)

### BLOBダウンロード列の列プロパティの設定をする

列の同期化で列の一覧を更新すると、先ほどSELECTに含めた列であるDOWNLOADが出てきます。後は、この列の識別タイプをBLOBのダウンロードを選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/96b24797-6485-4119-5f76-aa31dcf2f346.png)

BLOB属性をそれぞれ入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/c231b975-454c-3717-ec80-8140e7a2e22f.png)

また、ダウンロードリンクをファイル名にするため外観を`#DOC_FILENAME#`にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/916bfb02-c01a-4fb7-a337-2525ced61753.png)

ここで保存して実行すると、text.xlsxというファイル名のダウンロードリンクが出現しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/130b87ac-2fff-1fa1-e294-45a736f6d2b8.png)

# 参考
[日日是Oracle APEX:簡単な文書管理アプリケーションを作成する](http://apexugj.blogspot.com/2020/08/simple-doc-mgmt.html)
こちらのサイトでは、直リンクによるダウンロードや全文検索の追加の手順などまで記載されています。
seeeduino xiao で circuit python 遊び 備忘録

#1.link

[seeed xiao wiki](https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/)
[adafruit circuitpython ライブラリ](https://circuitpython.org/libraries)

i2cアドレススキャン

```python
>>> import board
>>> i2c = board.I2C()
>>> i2c.try_lock()
True
>>> print([hex(i) for i in i2c.scan()])
['0x3c', '0x51']
```

print文は内包表記
平で書くと

```python
>>> for i in i2c.scan():
...     print(hex(i))
...
0x3c
0x51
v
```

標準モジュール確認

```python
>>> help("modules")
__main__          digitalio         pulseio           supervisor
analogio          gc                pwmio             sys
array             math              random            time
board             microcontroller   rotaryio          touchio
builtins          micropython       rtc               usb_hid
busio             neopixel_write    storage           usb_midi
collections       os                struct
Plus any modules on the filesystem
>>>

```

#2.拡張ボード
[拡張ボードseeed shop](https://jp.seeedstudio.com/Seeeduino-XIAO-Expansion-board-p-4746.html)

##2-1.OLEDディスプレイ
xiaoのlibフォルダにadafruit_ssd1306.mpy、adafruit_framebuf.mpy、adafruit_bus_deviceを保存。
xiaoの直下フォルダにmain.py、font5x8.binを保存

main.pyは以下の通り

```python
import board
import adafruit_ssd1306
import busio
i2c = busio.I2C(board.SCL,board.SDA)

display = adafruit_ssd1306.SSD1306_I2C(128,64,i2c)

display.fill(0)
display.text("hello world",0,0,1)
display.show()
```

原因不明だけどboard⇒busio⇒adafruit_ssd1306もしくはbusio⇒board⇒adafruit_ssd1306の順にimportすると動かない。謎。


display.pixel(0,0,1) #(x座標0-127 ,y座標0-31,0:黒 1:白)
PyTorchで勾配降下法

PyTorchで勾配降下法をするコードを書いてみました。

# 最適化したい関数


```python
def rosenbrock(x0, x1):
    y = 10 * (x1 - x0 ** 2) ** 2 + (x0 - 1) ** 2
    return y
```

# 関数を可視化する


```python
import numpy as np

h = 0.01
x_min = -2
y_min = -3
x_max = 2
y_max = 5

X = np.arange(x_min, x_max, h)
Y = np.arange(y_min, y_max, h)

xx, yy = np.meshgrid(X, Y)
```

最小値はこのへんですね


```python
matrix = rosenbrock(xx, yy)
minimum = None
min_x = None
min_y = None
for i in range(matrix.shape[0]):
    for j in range(matrix.shape[1]):
        if minimum is None or minimum > matrix[i][j]:
            minimum = matrix[i][j]
            min_y = Y[i]
            min_x = X[j]

print(min_x, min_y, minimum)
```

    1.0000000000000027 0.9999999999999147 8.208018832734106e-26


ドットが描かれた場所が最小値になります。


```python
import matplotlib.pyplot as plt
plt.contourf(xx, yy, np.sqrt(rosenbrock(xx, yy)), alpha=0.5)
plt.scatter(min_x, min_y, c="k")
plt.colorbar()
plt.grid()
plt.show()
```

![PyTorchで勾配降下法_7_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/564e200f-63e3-239d-1a73-f43327fd5863.png)

   
    


# 勾配降下法


```python
import numpy as np
import torch

x0 = torch.tensor(0.0, requires_grad=True)
x1 = torch.tensor(4.0, requires_grad=True)

lr = 0.001
iters = 10000

history = []
for i in range(iters):
    history.append(np.array([np.array(x0.data), np.array(x1.data)]).flatten())
    y = rosenbrock(x0, x1)
    y.backward()

    with torch.no_grad():
        x0.data -= lr * x0.grad
        x1.data -= lr * x1.grad

        x0.grad.zero_()
        x1.grad.zero_()
```

結果表示


```python
import matplotlib.pyplot as plt
plt.contourf(xx, yy, np.sqrt(rosenbrock(xx, yy)), alpha=0.5)
plt.scatter([p[0] for p in history], [p[1] for p in history])
plt.scatter(min_x, min_y, c="k")
plt.colorbar()
plt.grid()
plt.show()
```

![PyTorchで勾配降下法_11_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/4d7f3f8c-1029-7b91-eae8-d090a4db580c.png)

    

    


# 複数箇所からスタート


```python
import numpy as np
import torch

x0 = torch.tensor([0.0, -0.5, -1.5, 1.5], requires_grad=True)
x1 = torch.tensor([4.0, 4.0, -1.0, -2], requires_grad=True)

lr = 0.001
iters = 10000

history = []
for i in range(iters):
    history.append([x0.detach().clone(), x1.detach().clone()])
    y = rosenbrock(x0, x1)
    #y.backward()
    s = torch.sum(y)
    s.backward()

    with torch.no_grad():
        x0.data -= lr * x0.grad
        x1.data -= lr * x1.grad

        x0.grad.zero_()
        x1.grad.zero_()
```

結果表示


```python
import matplotlib.pyplot as plt
plt.contourf(xx, yy, np.sqrt(rosenbrock(xx, yy)), alpha=0.5)
for i in range(4):
    plt.scatter([p[0][i] for p in history], [p[1][i] for p in history])
plt.colorbar()
plt.scatter(min_x, min_y, c="k")
plt.grid()
plt.show()
```

![PyTorchで勾配降下法_15_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/7e3846d8-35a5-3d77-2519-a447bd1ba164.png)
エラーハンドリング throws try do catch Swift

#■エラーハンドリング
エラーが出る可能性がある処理を行う時に使う
これエラーやでってなったらエラーの処理を返す
エラーじゃなかったらそのまま処理される。

■エラーの例: こんな時に使う！！
割り算で引数n2が0の場合エラーになる。
割り算は0で割れないから

``` swift
//n2が0ならprint("0以外を入力してね")
//n2が0以外ならreturn n1 / n2
func div2(n1: Int,n2:Int)  -> Int? {
    guard n2 != 0 else {
        print("0以外を入力してね")
        return nil
    }
    return n1 / n2
}
```

正直上記の書き方でもできるがそれをぱっと見だけで
エラー処理しとるんやなって分かるように書くのがthrows try do catchとかを使ったやつ！！


#■throws

まず書き方

``` swift
//enumでまずエラー出た時の処理を書く Errorプロトコルを継承してる
enum CalculationError: Error {
    case divisionBYZero
    case unknown
}

func div(n1: Int,n2:Int) throws -> Int {
    guard n2 != 0 else {
        throw CalculationError.divisionBYZero
    }
    return n1 / n2
}

/* 見比べたら何が違うのか結構分かりやすい！
func div2(n1: Int,n2:Int)  -> Int? {
    guard n2 != 0 else {
        print("0以外を入力してね")
        return nil
    }
    return n1 / n2
}
```
メソッドの返り値の矢印の左側に throwsと書く
エラー処理にまずthorowと書きその右にenumで作ったエラー処理を書く returnがいらない
後は最初に例で紹介したやつと同じ感じ。
最初の例と見比べたらこう書くのねってのが分かってくると思います！

#■do catchで処理しよう！
下記は不適切なメソッドの処理
tryつけなエラー
try!クラッシュする
try?nilを返すどんなエラーかわからない...

``` swift
div(n1: 3, n2: 0) //tryつけないとエラー
try! div(n1: 3, n2: 0) //エラーでたらクラッシュさせる
try？ div(n1: 3, n2: 0)　//エラーならnil
```

■そこでdo　Catchの出番！！
基本これ使って処理する。

catch let error as CalculationErrorで定数errorにenumで作ったエラー処理が入る。
それをswitch文で分ける。
どちらでもないエラーには print("other")を用意しとく。

``` swift
do {
    let r3 = try div(n1: 10, n2: 0)
    print(r3)
} catch let error as CalculationError {
    switch error {
    case .divisionBYZero:
        print("divisionBYZero")
    case .unknown:
        print("unknown")
    }
}catch {
    print("other")
}

//結果　divisionBYZeroがプリントされる。
//divisionBYZeroは0が入力されている時のエラーの言葉みたいなもの
```

エラー処理をユーザーに伝えたい時などに使う。
【Unity】Unity HubからUnityをインストールしようとするとエラーで止まる現象の解決法

#現象
Unity HubからUnityをインストールするときに不完全または破損したダウンロードファイルと表示され」、インストールに失敗する現象が起こりました。
既に別バージョンのUnityはインストールしてあり、それらのインストールの時には何もエラーが起きず、解決に困ったので、メモ程度にはなりますが残しておきます。

#筆者の環境

* MacBookPro2020(Intel版)
* MacOS Catalina 10.15,7
* UnityHub 2.4.3
* Unity 2019.4.21f1 及び 2019.4.0f1 インストール済

#解決法
結果的に、Mac側の設定を変更してハードディスクをスリープさせないようにしたら解決できました。（しょうもない結果ですみません）

#解決までの流れ
まず検索して出てきたこちらの記事内容を見て、解決できないのではと思いつつ色々試しました。

https://qiita.com/riekure/items/4719b4fc7d3509fdc29c

まず、デバイス及びソフトの再起動。
次に、使用しているセキュリティソフトのESETでUnity Hubを検査対象から除外しました。

しかしどちらも解決せず。

よく考えるとインストールの進捗のためにMacを触った時に失敗していることが多いように思い、Mac側の設定を見直すことにしました。

システム環境設定→省エネルギーから、赤丸の部分を変更しました。
すると無事インストールに成功しました。

![スクリーンショット 2021-05-12 17.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303271/759a69b4-8096-bf16-b9fa-a3cb8ff1dee9.png)

おそらく「可能な限りはハードディスクをスリープさせる」の方だけで良いと思いますが、一応両方実行して直したので両方記載しておきます。

#参考文献
https://qiita.com/riekure/items/4719b4fc7d3509fdc29c

https://helpdesk.unity3d.co.jp/hc/ja/articles/219377968-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88
[python3] EUC-JPなのにShift-JISの機種依存文字が入っててUTF-8にできなかったときの対策

表題の通りです。
先人が機種依存文字対策に苦心した痕跡がちらりほらり…
※ はしご高とかそういうタイプの機種依存文字はこの記事では扱いません。

# 環境
Windows 10
Python 3.8.5
スクレイピング：requests

# 状況（読まなくても良い）
最近 [seesaawiki](https://wiki.seesaa.jp/) の記事の自サイトへの移植をごそごそとしているのですが。

seesaawikiからスクレイピングでHTMLソースを取得すると、
`<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">`
とあって確かに **EUC-JP** のはずなのに、wikiソース内で「**①**」のような **Shift-JIS** の機種依存文字が使えるせいでたまにこれが紛れてくるんです。
で普通に

```python:
res = requests.get(url)
text = res.html
```

みたいに結果を取得しようとすると、なにやら`REPLACEMENT CHARACTER`なる特殊文字に変化している文字がある…
こまった……

という感じのことになってたいへん苦心したので、対策法を一応記事にしておきます。
誰かの役に立ったらうれしい！

# 対策
**文字コード`euc_jis_2004`**を使って`bytes`をデコードする。
他の言語ではそれっぽい用途に`EUC-JP-MS` `eucJP-win` `CP51932`なる文字コードが使えるらしいのですが、pythonだと全部対応してない…。

```python:decode_test.py
def decode_test():
    original_string = '①②③ ⅠⅡⅢ ㍉㎜㊤㍾'  # 適当に機種依存文字
    before_decode = b'\xad\xa1\xad\xa2\xad\xa3 \xad\xb5\xad\xb6\xad\xb7 \xad\xc0\xad\xd0\xad\xe5\xad\xed'

    trying_encoding_list = ["euc_jp", "euc_jis_2004", "euc_jisx0213"]

    for enc in trying_encoding_list:
        try:
            decoded = before_decode.decode(encoding=enc)
            if decoded == original_string:
                print(enc + ": success!!")
        except UnicodeDecodeError as e:
            print(enc + ": decode failed...")
```
```out
euc_jp: decode failed...
euc_jis_2004: success!!
euc_jisx0213: success!!
```
`euc_jis_2004`と`euc_jisx0213`の違いは正直なところ全くわからないのですが、どっちも動くっぽいのでとりあえず2004の方を使いました。

そもそも`EUC-JP`の範囲外の文字を含んでるなら最初から`charset`に対応する文字コードを書いて欲しい…と思ったけど、一般公開するには一般的なコード名じゃないとダメなんでしょうか。

# 参考になったサイト
[シフトJIS / EUC-JPとUnicodeとの妥当な変換表](https://www.nslabs.jp/round-trip.rhtml)
（なんかいろいろ大変だったらしい…という勉強になりました）

[pythonで丁寧な文字コード変換](https://yosshi71jp.hatenadiary.org/entry/20090915/1253034464)
（このブログ記事のおかげで解決に至りました。超感謝です）
LaravelのDocker環境でDBを二つ立ち上げて、アプリケーション用DBとユニットテスト用DBを切り替える方法

アプリケーション用DBとユニットテスト用のDBを分けたいときがあると思います
よく見かける手法がユニットテストをインメモリDBとして立ち上げてそこでデータを投入する方法です
今回は、インメモリDBではなく、通常使用するようなDB(オンディスクDBと呼ばれるらしい)でユニットテストの時だけ切り替える方式です

## 前提
Doker環境で二つのmysqlを立ち上げます
二つどうやって立ち上げるかわかない方はこちらの記事を参照してください

https://qiita.com/_miyagi_/items/f36fcf9ea4ce07a8e203

## 結論
1. テストDB用のドライバーを設定
1. ユニットテスト実行時に、そのドライバーを指定

## 設定方法詳細

### テストDB接続用のドライバーを設定する

LaravelがテストDBに接続できるようにドライバーを設定します

```config/database.php
'test_mysql' => [
    'driver' => 'mysql',
    'host' => 'test_mysql',
    'port' => '3306',//ここが3307だと繋がらない。なんで？
    'database' => 'your_test_db',
    'username' => 'user',
    'password' => 'password',
    'unix_socket' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => false,
    'engine' => 'InnoDB',
    'options' => array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]),
],
```

### phpunitの実行時のDBドライバーを変更
ユニットテストを実行したときだけテストDBを読み込むようにドライバーを指定します

```phpunit.xml
//before
//<server name="DB_CONNECTION" value="mysql"/>

//after
<server name="DB_CONNECTION" value="test_mysql"/>
```

## 疑問
config/database.phpでportをデフォルト3306にしないと接続できないのはなぜなんだろう。。。
dockerでテスト用DBは3307にしていて、phpmyadminでは3307で接続できているのに
誰か知っていたらコメントなどで教えてください

##　宣伝
ツイッターもやってます
技術や製品開発に関する事などを呟いてますので、フォローお願いします
https://twitter.com/wkyIghw8MlLpyJE
[Django]ManyToManyの有無でフィルタリングしたい

# 動機
Django(3.1)で、ManyToManyField(多対多のrelation)を持つmodelを考えます。
このとき、**対象のFieldにレコードがセットされているか否か**でフィルタリングをしたい場合があります。
例えば以下のようなmodelを考えます。一つの記事に複数のタグがついている想定です。

```python:models.py
from django.db import models

# タグ
class Tag(models.Model):
    name=models.CharField(verbose_name="名前",max_length=32)


# 記事
class Article(models.Model):
    title=models.CharField(verbose_name="タイトル",max_length=32)
    text=models.TextField(verbose_name="本文")
    tags=models.ManyToManyField(Tag,verbose_name="タグ",related_name="articles")
```

ここで、タグが一つでもついている記事の一覧を引っ張りたいとします。まず思いつくのは以下の書き方です。

```python:views.py
from django.views.generic import ListView
from .models import *

class ArticleWithTagsListView(ListView):
    model=Article
    template_name="article_with_tags.html"

    def get_queryset(self):
        # tags__isnull=Falseで、タグが少なくとも一個ついているレコードだけ引っ張る
        queryset=Article.objects.filter(tags__isnull=False)
        return queryset

```
しかしこの方法はうまくいきません。**紐づいているTag数に応じてレコードが重複してしまいます。**

かといって

```python:views.py
queryset=Article.objects.all()
filtered_queryset=[q for q in queryset if q.tags.count()>0]
```

なんてしようものならループの度にクエリが走って、実行時間がえらいことになります。

# distinct()を使おう
最後にdistinct()を絡めれば、isnullフィルターを有効活用できます。

```python:views.py
queryset=Article.objects.filter(tags__isnull=False).distinct()
```

# annotate()を使おう
**annotate()を使って各レコードのtag数を算出→countが0より大きいものをフィルタリング**という方法をとってもOKです。

```python:views.py
from django.db.models import Count

queryset=Article.objects.annotate(tag_count=Count('tag')).filter(tag_count__gt=0)
```

分解すると、まず下記の操作で"tag_count"という値に各レコードのtagの数を格納しています。

```python:views.py
queryset=Article.objects.annotate(tag_count=Count('tag'))

#例 : 最初のレコードのtag数が3のとき
q=queryset.first()
print(q.tag_count) # 3

```

次に、"tag_count"が0より大きいレコードだけを抽出しています。

```python:views.py
queryset=Article.objects.annotate(tag_count=Count('tag'))
queryset=queryset.filter(tag_count__gt=0) #追加
```
Let's Encrypt 構築＋自動更新 

# 概要
> 今更な情報だけど、載せておく。
> Let's Encrypt の SSL 証明書の発行と更新
> `CentOS 6` と `CentOS 7` で手順が異なる事に注意する。

---

# CentOS 6
> Let's Encrypt のコマンド（certbot-auto）は Python 2.7 のインストールが必要。

```shell-session:コマンド（パッケージインストール）
yum install centos-release-SCL
yum update
yum install scl-utils python27 python27-scldevel
scl enable python27 bash
python -V
```
```shell-session:コマンド（Certbot-autoインストール）
curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
chmod 700 /usr/bin/certbot-auto
```
```shell-session:コマンド（Python2.7の自動有効化設定）
vi /etc/profile.d/python27.sh
source /etc/profile
python --version
```
```sh:/etc/profile.d/python27.sh
#!/bin/bash
source /opt/rh/python27/enable
export X_SCLS="`scl enable python27 'echo $X_SCLS'`"
```
```conf:/etc/letsencrypt/renewal/＜ドメイン＞.conf
[renewalparams]
authenticator = webroot
[[webroot_map]]
＜ドメイン＞ = /var/www/html
```
```shell-session:コマンド（証明書発行）
certbot-auto certonly --webroot -w /var/www/html -d ＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
certbot-auto certonly --webroot -w /var/www/html -d www.＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
certbot-auto certonly --webroot -w /var/www/html -d mail.＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
```
```shell-session:コマンド（更新）
scl enable python27 "/usr/bin/certbot-auto renew"
```
```conf:Cron設定
#-- Crats Let's Encrypt Settings
PATH=/opt/rh/python27/root/usr/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
00	01	*	*	*	scl enable python27 "/usr/bin/certbot-auto renew --quiet --no-self-upgrade --post-hook \"service httpd restart; service postfix restart; service dovecot restart;\"" 
```

---

# CentOS 7
```shell-session:コマンド（パッケージインストール）
yum install mod_ssl
yum install epel-release
yum install certbot
```
```shell-session:コマンド（証明書発行）
certbot certonly --webroot -w /var/www/html -d ＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
certbot certonly --webroot -w /var/www/html -d www.＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
certbot certonly --webroot -w /var/www/html -d mail.＜ドメイン＞ --email mainte@domain.co.jp -n --agree-tos
```
```shell-session:コマンド（更新）
/bin/certbot renew
```
```conf:Cron設定
#-- Crats Let's Encrypt Settings
00	01	*	*	*	/bin/certbot renew --post-hook "systemctl restart httpd.service; systemctl restart postfix.service; systemctl restart dovecot.service"
```

---
SSL証明書でよく見るPKIってなに？

## 勉強前イメージ

SSL証明書置く時に、よくPKIって出てくるけどなんのことなんだろう・・・
公開鍵暗号のこと？

## 調査

### PKIとは

Public Key Infrastructure の略で公開鍵暗号基盤の意味になります。
`公開鍵暗号技術` と `電子署名` を使用して、安全な通信を行うことが出来るようにするための環境のことです。
盗聴や改ざん、なりすましを防ぎます。

### PKIを使用するメリット

- 暗号化

データを暗号化し、第三者からの盗聴を防ぎます

- 署名

電子データの作成者を特定できる署名を付与し、改ざんがないことを確認します

- 認証

受信側にとって、送信側が正しいかどうか認証を行います

### それぞれのキーワードの説明

- 公開鍵暗号技術

暗号化と復号化で一対の異なる鍵を利用する方法で、
片方の鍵で暗号化された情報はそれと対になっているもう一方の鍵でなければ復号できません。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/434b31af3fe89b3c5f8f) をごらんください。

- 電子署名

上位の認証局が証明書に署名を行い、この証明書が正しいことを証明を行います。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/35941e2389b8f62625ad) をごらんください。

### SSL証明書とPKIの関係性

PKIは公開鍵暗号基盤で、他にも色んな場面で使用されています。
そのうちの1つがSSL証明書になります。

## 勉強後イメージ

基盤という大きいくくりのPKIと
それを使ったのがSSL証明書ってことか。

## 参考

- [PKIと公開鍵暗号方式とは](https://jp.globalsign.com/ssl-pki-info/pki/aboutpki.html)
- [PKIとは](https://www.einspki.jp/support/whatspki/)
【備忘録】BigQueryのEXPORT DATAでGCSに出力する設定で変なところで詰まった話

# 概要

GoogleAnalyticsからBigQueryに連携しているデータを定期的に集計してGCSに出力しようとした。

スケジュールされたクエリでEXPORT DATAするだけで簡単かと思いきや、変なところで詰まったので備忘録的に残す。

# 結論だけ先に

①EXPORT DATAではmeta tablesにアクセスできない（＝_TABLE_SUFFIXが使えない）のでジョブを分割する

https://stackoverflow.com/questions/67397911/export-data-in-standard-sql-bigquery-export-data-statement-cannot-reference-me

②（2021/05/12現在）EXPORT DATAクエリをスケジュールされたクエリに設定する際は、クエリのタブを新規作成してSQLを貼り付けしてから設定する。

バグっぽい挙動なのでそのうち修正されると思われる。

# ①EXPORT DATAではmeta tablesにアクセスできない

EXPORT DATAにて_TABLE_SUFFIXを使ったクエリを流すとエラーになる。
GoogleAnalyticsとBigQueryを連携している場合、よく書くクエリだと思われる。

```
SELECT *
FROM `project-name.dataset_name.event_*`
WHERE
_TABLE_SUFFIX = （日付条件）
```

エラー内容を読むと、meta tablesにアクセスできないとのこと。
_TABLE_SUFFIXが使えないことになる。

```
"EXPORT DATA statement cannot reference meta tables in the queries." 
```

解決方法としては、ジョブを分割する方法があるようだ。
1つ目のジョブで、_TABLE_SUFFIXを利用して集計してBigQueryのテーブルに書き出す。
2つ目のジョブで、EXPORT DATAで当該テーブルを書き出す。

自分のケースではジョブの実行時間が将来に渡ってある程度推測できるものだったので、2つのジョブを時間差で実行すれば良かった。
厳密に1つ目のジョブが完了してから2つ目を実行するのは、現状のBigQueryのスケジュールされたクエリ機能では難しそう。

（参考文献）
https://stackoverflow.com/questions/67397911/export-data-in-standard-sql-bigquery-export-data-statement-cannot-reference-me

# ②現状のWEB UIではEXPORT DATAクエリを正しくスケジュールされたクエリに設定できないケースがある

EXPORT DATAクエリを書く際にSELECT句をまずテストしてから書く、というのはよくあるフローだと思う。
しかし、その状態でスケジュールされたクエリに設定しようとすると、クエリ結果の書き込み先を聞かれる。
これは必須項目で、入力しないと設定が完了しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140830/84ff6ead-bddb-a91e-3f72-aa9c30691ef9.png)

これを設定してスケジュールされたクエリが実行されるとエラーになる。
「EXPORT DATAクエリではクエリ結果の書き込み先を設定できないよ」と読める。
先程必須入力させたのに。。

```
Error code 3 : Query error: Cannot set destination table in jobs with EXPORT statement;
```

どうやらBigQueryのWEB UIの不具合のようで、EXPORT DATAクエリか判定するタイミングが不完全ののようだ。
新規にクエリタブを作成してまっさらなエディタにEXPORT DATA句を貼り付けるとクエリ結果の書き込み先を聞かれなくなり、うまく設定できる。

# 終わりに

とてもニッチだし細かいことだが同じことで困っている人がいればと思いぱぱっと書きました。
多分、すぐに修正されると思われます。
AndroidStudio4.2でSystemアプリをビルドするときのメモ

## 起きたこと
Android Studio4.2にしたらSystemAppのビルドができなくなった

## 解決法

### AS4.2未満
プロジェクトルートのbuild.gradleに

```build.gradle
allprojects {
// その他のコードがこの上に入る
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app/framework/framework.jar')
//          ここのPathはそれぞれframework.jarをおいている環境に合わせる
        }
    }
}
```

### AS4.2以上
プロジェクトルートのbuild.gradleに

```build.gradle
allprojects {
// その他のコードがこの上に入る
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            Set<File> fileSet = options.bootstrapClasspath.getFiles()
            List<File> newFileList =  new ArrayList<>();
            newFileList.add(new File("./app/framework/framework.jar"))
//          ここのPathはそれぞれframework.jarをおいている環境に合わせる
            newFileList.addAll(fileSet)
            options.bootstrapClasspath = files(
                    newFileList.toArray()
            )
        }
    }
}
```
【解決】WindowsでChromeがスリープ/画面オフ復帰後にフリーズする

# 現象
Windowsがスリープ/画面オフ状態から復帰した後、Chromeのタブがフリーズする。
ただ、フリーズと言ってもグラフィックが止まっているだけで、バックグラウンドでスクリプトは動いている模様。
ウインドウのサイズを変更すると直った。

## 筆者の環境
- Windows 10
- Google Chrome 90


# 解決方法
## 注意
- この方法は将来的に使えなくなる可能性があります。
- MacやChromium Edgeの方は、この記事の方法では解決しません。

## 方法

1. ChromeのURLバーに`chrome://flags`を入力して、アクセスする。
1. 検索ボックスに`occlusion`と入力する。
1. `Calculate window occlusion on Windows`の項目を、`Default`から`Disabled`に変更
1. 画面下の「Relaunch」をクリックしてChromeを再起動

**Chromeを再起動することになるので、未送信のフォームは最初からやり直しになります。この操作を行う前に送信を済ませてください。**

画面はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1172197/30e9f13e-da02-86e2-2acd-496c65f98668.png)


## 参考

https://www.windows10forums.com/threads/chrome-freezes-after-sleep-or-after-inactivity.7081/


# 解説
`Calculate window occlusion on Windows`と`chrome://flags`について解説します。

`Calculate window occlusion on Windows`をざっくりいうと、「表示されていないタブのグラフィックをやめて、パソコンのCPUなどを節約する」という機能です。

例えば、YouTubeを別のタブで再生していた場合、動画は目に見えないので、裏でグラフィックを行わず、音を鳴らしたり、自動再生で次の動画に進んだりすることにChromeが専念したほうが、パソコンのCPUなどを節約できます。

よって、上記の解決法を行った場合、Chromeのタブをたくさん開くと、よりバッテリーの減りが早くなったり、動作が重くなったりする可能性があります。
デスクトップならそこまで気にする必要はありませんが、ノートパソコンの方は注意が必要です。

一方で、`chrome://flags`は、「Chromeの試験的な機能を有効にしたり無効にしたりできる裏設定」です。将来的にChromeに搭載される予定の機能や、Chromeに追加したもののまだ不具合が起きる可能性がある機能が並んでいます。
つまり、`Calculate window occlusion on Windows`は不具合が起きる可能性があるため、ユーザーが無効にできるようになっているのです。
もちろん、不具合が解消されれば、`chrome://flags`から削除されます。

ちなみに、Edgeは既にこの問題を修正しています。また、Macはハイスペックなので、そもそも`Calculate window occlusion on Windows`自体がChromeに存在しません。Chromebookは...分からん！

# 終わりに
周囲の同じような現象で悩まれている方に、この記事を教えていただければ幸いです。
Python Tips

###配列の中に含まれるかどうか

```hoge.py
        #domain_listが配列 target_domainが変数
        result=target_domain in domain_list

        #配列内にあればTrue
        if result:
            continue
```

###メインプログラムの書き出し
「`if __name__ == '__main__':`」の呪文をつけておくと、外部ファイルからhoge.pyファイルを読み込まれたときに、勝手に実行されない。

```hoge.py
if __name__ == '__main__':
```


###乱数を発生する

```py
import random

#0-100の乱数を発生させる
i=random.uniform(0, 100)

#整数化（注意点あり）
seisu=int(i)
```

###フォルダ内のファイル名を取得する

```py
#フォルダ内のファイルパスをすべて取得する
import glob
import os

files = glob.glob("./images/*")

for file in files:
    print(os.path.split(file)[1])
```

###csvの扱い

```hoge.py
import csv

#読み込み
with open('data/src/sample.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

#書き込み
with open('data/temp/sample_writer_row.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow([0, 1, 2])
    writer.writerow(['a', 'b', 'c'])

#追記
with open('data/temp/sample_writer_row.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(['X', 'Y', 'Z'])

```
[Python]　OpenCVのインストール方法　(mac)

#OpenCVとは
OpenCVとは `Open Source Computer Vision Library` の略です。
画像処理や画像解析や機械学習の難しい機能を、誰でも簡単に使えるようにまとめて整えたプログラムの集まりで、誰でも無料で使える機能です。


#インストール方法
homebrewを使ってopenCVをインストールします。
以下のコマンドを実行します。（インストールが終わるまで１０分ほどかかります。）

```
$ brew install opencv
```

次に以下のコマンドを実行して、pipで対応するモジュールをインストールします。

```
$ pip3 install opencv-python
```

#インストールできたのかを確認する

```
$ python3
```

実行して以下のように表示されれば成功です。

```
Python 3.9.5 (default, May  4 2021, 03:36:27) 
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

```


（`>>>` の後に `exit()` を実行すると戻ります。）
絶対使いたくなる！MacCatalystのメリットを紹介！

#Macへの移植が簡単
「MacCatalyst」では、iPadアプリのソースコードを流用できるのはもちろん、UIのデザインをMac向けに最適化してくれたり、キーボード&マウス操作に対応してくれたりと、何かと自動でやってくれるので、簡単にMac移植ができます。
対応OSが増えれば必然的にユーザー数も増えるので、簡単にMac対応ができる「MacCatalyst」は効率が良くて便利です。

#アプリの管理が楽
対応OSが増えると、アプリの管理の手間もどんどん増えていきます。
ですが、「MacCatalyst」を使えば、アプリの修正や機能追加などが簡単になります。
というのも、iPad版とMac版で同じソースを共有しているため、アプリに変更を加えたい場合は1つのソースに変更を加えるだけで良いからです。
これで面倒なソース管理も楽にできちゃいます。

#iOSアプリと同じ感覚でMacアプリを作れる
iOSアプリとMacアプリでは、作成するのに使うAPIが違います。
そのため、同じアプリを開発する場合でも勝手が違うのですが、「MacCatalyst」なら、iPadアプリのソースからMacアプリが作れるので、iOSアプリの作り方さえ覚えればMacも作れるようになれます。iOSアプリの作り方がわからない方もこの機会に一度触れてみてはいかがでしょうか。
　
　
MacCatalystのメリットをご紹介しました。
まとめると、アプリのMac版の作成と管理が楽になる、といった感じです。
次回はMacCatalystで作られているアプリをご紹介します。
Line notifyトーク生成方法



#LINEnotifyについて
LinenotifyとはWebサービスからの通知を、LINEで受信することが出来るサービスのことであり
githubやgasなどと連携したりpythonなどの言語から呼び出すこともできます。
###LINEnotify使用方法
####LINEのマイページよりnotifyを登録
https://notify-bot.line.me/ja/
にアクセスし、LINEアカウントにてログインします。
ログイン後、マイページにて「アクセストークンを発行」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245919/fb7beb81-0db7-9431-918c-06e3a601c751.png)

####トークンの生成
トークン名と通知を送信するトークルームを選択します。


![コンポーネント 5 – 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245919/36fd1ce2-ef6b-8dac-23a1-05b9710e174a.png)

発行するをクリックすると
トークンが表示されます
このトークンを使用することでウェブサービスから呼び出せます。
※一度閉じるとトークンが表示されなくなるため必ずメモしておいてください！

![コンポーネント 6 – 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245919/fa9660f1-6ce1-4724-37f1-62695af1d53a.png)

以上がLINE notifyのトークンの生成方法です。
お疲れ様でした。
Discord.pyで翻訳Botを作る

## 前置き
今回はPythonと**googletrans**というGoogle翻訳のAPIを使用して、メッセージを翻訳してくれるDiscordBotを作ります

## 環境 / インストールするもの

#### 環境
- MacOS 11.2.3
- VisualStudioCode
- Python 3.9.4

#### インストールするもの
- discord.py
    - [公式ドキュメント](https://discordpy.readthedocs.io/ja/latest/index.html)
    - [わかりやすい記事](https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f)
- googletrans
    - [ドキュメント(PyPI)](https://pypi.org/project/googletrans/)

## 流れ

```
① ユーザーがメッセージを送信
② そのメッセージをbotが取得
③ googletransを使用して翻訳
④ 翻訳したものをメッセージとして送信
```

## コード
```py
import discord
from googletrans import Translator

token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

client = discord.Client()
translator = Translator()

@client.event
async def on_ready():
    print("run")

@client.event
async def on_message(message):
    # botの発言には反応しない
    if message.author.bot:
        return

    # メッセージの言語判別
    lang = translator.detect(message.content).lang

    # 言語が日本語だったら
    if lang == "ja":
        trans_text = translator.translate(message.content, src = lang, dest = "en").text
        await message.channel.send(trans_text)

    # 言語が英語だったら
    elif lang == "en":
        trans_text = translator.translate(message.content, src = lang, dest = "ja").text
        await message.channel.send(trans_text)

client.run(token)
```
コードはこれだけです

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359403/3d15f01b-aca7-228b-0f27-6da0dc4029db.png)

いい感じ、毎日お肉食べたい




## 戦ったエラー達
もし同じエラーになった人がいたらすぐに解決できるようざっと書いておきます

#### AttributeError: 'NoneType' object has no attribute 'group'
このエラーはgoogletrans側の問題のようで下記のバージョンをインストールしたら解決しました
> pip install googletrans==4.0.0-rc1

参考
https://qiita.com/maboy/items/9a1336ece11db4630858


#### TypeError: Object of type Message is not JSON serializable
これに関しては自分の問題で、言語判別の記述を

```diff
- lang = translator.detect(message).lang
+ lang = translator.detect(message.content).lang
```

こう書いてしまっていました
これだとtranslator.detectの引数をstr型で渡せていないのでそれが原因です、恥ずかしい

## 最後に

流石にスラングなどの精度が微妙ではあるので、今度は普段お世話になっているDeepL翻訳のAPIを使ってみて記事も上げようと思います
Xcodeでマウスポインタがシミュレーターから出られなくなった時の対処法

![スクリーンショット 2021-04-24 13.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408875/08f6bebf-0a15-bf30-f660-2e7e5320d7ba.png)
iPadのシミュレーターにおけるこのツールバーの
![スクリーンショット 2021-04-24 13.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408875/6b9ef38b-8461-210e-817e-0c7031a38727.png)
ここをうっかり押してしまうとマウスポインタがシミュレーター外に出ることができず、焦ります。押してしまった時の対処法が見つからなかったので書きました。
不備や思い違いがありましたらご指摘ください。

本来iPadなどの指の挙動をトラックパッドで代わりにすることができるようになるcapture pointerのアイコンです。

## 1.Escapeキーを押す
だいたいこれでなんとかなります。
## 2.強制終了
電源ボタン長押ししましょう。
私はMBPのタッチバー全て反応しなくなりました。
esc物理キーが良いですね。
こまめにcommitしていて良かったです。

### 参考
https://www.wwdcnotes.com/notes/wwdc20/10647/
【Flutter】.configについて

初めて投稿します。
恥ずかしながらどハマリしてしまったので、記事にしておこうかと思います。
（いないと思いますが）同じような方がいた場合の参考になれば幸いです。

以前より気になっていたFlutterをやっと使ってみようとFlutterのサイト（https://flutter.dev/docs/get-started/install/macos）
から意気揚々にインストール…までは良かったのですが、AndroidStudioは問題なくインストールでき、

SDKのダウンロード
対象ディレクトリに格納…

```
vi ~/.bash_profile
```

でPATHを追加して…

```
source ~/.bash_profile
```

で、さぁ

```
flutter
```

で実行！
と思いきや、
![スクリーンショット 2021-05-12 16.24.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/cedfab26-b08e-62aa-a694-330f5a2a673c.jpeg)

`Flutter failed to create a directory at "/Users/ユーザー名/.config/flutter". The flutter tool cannot access the file or directory.`

んん？
.configにアクセスできません的な内容のエラーが永遠に吐き出され、flutterのコマンドを受け付けてくれません。

しかし`.config`なんてよくわからない。。。

ネットを調べまくってもなかなかピンポイントな回答が出てこないので、とりあえずFinderから調べたところ…ありました。
隠しファイルになっているので、表示させる場合は以下の通り。

```
command + shift + .（ピリオド）
```

![スクリーンショット 2021-05-12 15.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/75ca411a-2edb-4cc0-a50a-b8cc131dcf81.png)

何か一時停止のマークが付いてる。。。
なんだコレ？

情報を見ると、システムとeveryoneのみで自分はいません。
![スクリーンショット 2021-05-12 16.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/3b314a7f-f526-7199-f0d2-ce2f4d423572.png)

とりあえず、鍵マークを外して自分を追加してみます。
![config3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/ae875396-341e-021d-dee6-3164a1706df5.png)
自分を選択して追加します。
![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/3527f30d-96b8-c2e2-f8d4-fc87d3f2db93.png)
追加されました。
![config_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/71fb810b-7a97-b23d-eb86-29255f9d689a.png)

で、再度flutterコマンドを実行します。
![スクリーンショット 2021-05-12 16.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544302/7abf2362-ad4a-b388-1508-8abc61a7584e.png)

できました♪

恐らく知っている人からすれば、”全然悩むところじゃねー！！！”と思われるかと思いますが、
自分は普段あまり開発を行わないので、ものすごい悩んでしまいましたｗ

ということで、初心者による初心者のために何か残せればと思い書きましたので、
よろしければ参考にして下さい。
Android, iOSで文字の幅を取得する方法

# Android

```test.kt
val paint = TextPaint().also {
    it.textSize = 10
    if (!isInEditMode) {
        it.typeface = ResourcesCompat.getFont(context, R.font.your_font)
    }
}
paint.measureText("hoge")
```

# iOS

```UIFont+.swift
import UIKit

extension UIFont {
    /// テキストのwidthを取得する
    func measureText(text: String) -> CGFloat {
        let str = NSString(string: text)
        return str.size(withAttributes: [.font: self]).width
    }
}
```

```test.swift
let font = UIFont(name:"your_font", size: 10.0)
font.measureText("hoge")
```
ガチャ沼と確率に出現するネイピア数e

### SSR率1%のガチャを100回引いたらどれぐらいの確率で引けるんだろう・・・？
ある人は100％！　と言う


<font color="Red">このマヌケが！</font>


箱の中の賞品が有限個なら引くたびに当たりの確率は上がり
全て引き切るまで試行すればもちろん100％の確率となるが

### ソシャゲのガチャは違う
天井付きのガチャシステムならまだしも、それがないゲームならいくら引いても単発当たりの確率は固定だ



## 実際に数学的に計算しよう
排出率1%のSSRを引いた時を当たりとするのであれば、単発で当たりを引かない確率は99%だ
今回考えるべき結果は、100回引いて<b>少なくとも1回当たりを引く</b>確率である。

この少なくとも1回以上という条件がなかなか曲者なのだが、中学でちゃんと数学の授業を聞いていた人なら簡単にわかるだろう
このような確率は、余事象を考えるとたやすく算出できる。


少なくとも1回以上当たりを出す確率は、<b>100回引いて1回も当たりを引けない確率の余事象</b>であると考えられる。

単発で当たりを引けない確率が99％なので、それが100回連続して起こる確率は$0.99^{100}$となる
これの余事象を考えればよいので、$1 - 0.99^{100}$ が今回ほしい確率である。
これを計算すると、$0.63396765872...$となり
確率に直すと約63.4%だと言える


さて、今回はSSR排出率1%(1/100)のガチャを100回試行した時にSSRを引ける確率を考えたが、他の数値についても知りたくなった。

## 一般化してみる

確率1/nの事象をn回試行して、少なくとも1回は事象が起こる確率は、n回連続外れる確率の余事象なので
$$1 - (1 - \frac{1}{n})^n $$
となる
このnをどんどん大きくして、限りなく∞に近づけたときどうなるだろうか？つまり
$$\lim_{n \to \infty}1 - (1 - \frac{1}{n})^n$$
を考えてみる

$\lim_{n \to \infty}(1 - \frac{1}{n})^n$  この部分、見覚えないだろうか

おそらく高校時代理系だったキミなら思い当たる節があるハズ
ネイピア数$e$の定義の形に似ている
$$\lim_{n \to \infty}(1 + \frac{1}{n})^n = e$$
$$ e = 2.718281828459...$$

せっかくならこの式を使いたいので、先ほどの $\lim_{n \to \infty}(1 - \frac{1}{n})^n$ をなんとかして変形する。

$1 - \frac{1}{n} \quad$  を  $\quad1 + \frac{1}{(-n)}\quad$  としてみると
$$\lim_{n \to \infty}(1 + \frac{1}{(-n)})^n$$
さらに次数のnを無理やり
$$\lim_{n \to \infty}(1 + \frac{1}{(-n)})^{-(-n)}$$
とすることもできる
$-n = N \quad$とおくと
$$\lim_{n \to \infty}(1 + \frac{1}{N})^{-N}$$
となり、これは結局$\quad\frac{1}{e}\quad$となることがわかる

なので今回求めたい確率は
$$\quad1 - \frac{1}{e} = 0.63212055882...$$
ということで、約63.2%となる

この確率が示すものは一体何か。

ざっくり言うと、限りなく確率が0に近い事象を、果てしなく永遠に試行した時に起こる確率である。
nが増えれば増えるほど、$\frac{1}{n}$の値は小さくなる。
単発でSSRを引く確率がこれにあたるので、nを∞に近づけた時、その確率は0に収束していく。

さらに簡単に言ってしまうと、起こりえないことを無限にやった時、約63.2%の確率で1回は起こるよ。
と言った感じ

## nがいくつでもあまり確率は変わらない？
nが100の場合だと約63.4％、nが限りなく大きい場合は約63.2%

となるとこの$\quad f(x) = 1 - (1 - \frac{1}{x})^x\quad$という関数は収束が早そう

### というわけでグラフ化

```python:numplot.py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 101, 0.1)
y = 1 - (1 - (1/x)) ** x

plt.ylim([0.5, 1])

plt.title('$f(x) = 1-(1-\\frac{1}{x})^x$')
plt.xlabel('x')
plt.ylabel('f(x)', rotation=0)

plt.minorticks_on()
plt.grid(which="major", color="black", alpha=0.5)
plt.grid(which="minor", color="gray", linestyle=":")
plt.plot(x, y, c='red')
plt.show()
```

とりあえず$\quad x=101\quad$までプロット

![numplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545378/b8484383-01bf-6a11-5b12-3b62b0bc817d.png)

### グラフを見るに案の定収束が早い！
$x = 20\quad$の段階ですでに$0.64$ちょいに到達している

なので、$\frac{1}{n}$の確率の事象をn回試行した時に起こる確率は、だいたい<b>63%くらい</b>と言い切ってよさそう。
ギャンブルとかに使えそうだ
MySQL ログインと同時にDBを指定する 個人メモ

# 目的

- ターミナルからMySQLにログインする時にDBを指定する方法をメモ的にまとめる

# 方法

- 下記コマンドを実行することでログインと同時にDBを指定する事ができる。

    ```terminal
    $ mysql -u ユーザー名 -p DB名
    ```

- ターミナルログにMySQLのパスワードが残るので推奨されていないが下記のコマンドを実行することで、実行後すぐにログインできる。（`-p`とパスワードの間は開けない。）

    ```terminal
    $ mysql -u ユーザー名 -pパスワード DB名
    ```
ECSから rails db:migrate:reset するときに発生するエラー(〇〇 is being accessed by other users)を解消する

## 注意
ポートフォリオ用に作成したサイトの本番環境を直接操作しています。
適切な対処法でないかもしれないので、とりあえずエラーを直したいという方はどうぞ。

# 背景

## railsコンテナで `rails db:migrate:reset` ができない
あるときseedファイルを変更したので、一度RDSの中をリセットしようと思いrailsコンテナから上記のコマンドを打つと、タイトルのエラーが発生しました。他のユーザー（というかコンテナ）が接続しており、実行できないとのことです。

## 使用技術
・ECS：EC2タイプ
・RDS：PostgresQL(11.11)

上記のインスタンスの作成は割愛します。

## やったこと
### EC2にpsqlコマンドをインストールしてRDSに接続
railsコンテナからRDSにアクセスしようとしたのですが、肝心のpsqlコマンドをインストールしていませんでした。
そこで応急処置として、EC2にpsqlコマンドを入れて接続しました。

以下、その手順です。
（現在、amazon-linux-extrasはpostgresql11までしかインストールできません。12,13をインストールする場合は[こちらの記事](https://zatoima.github.io/postgresql-ec2-insatll.html)が参考になります。）

```
# ご使用のバージョンに合わせてインストールしてください
$ sudo amazon-linux-extras postgresql11

# バージョンの確認
$ psql --version
psql (PostgreSQL) 11.5

# DBアクセス用のuserがいない場合は作成してください
$ sudo adduser <ユーザー名>
$ su - <ユーザー名>

# postgresサーバーに接続
$ psql \
> --host=<RDSのエンドポイント> \
> --username=<ユーザー名>
> --password \
> --port=5432 \
> --dbname=<RDSのインスタンス名>
```

これで接続は完了です。
(接続できないときは、RDSのセキュリティグループのインバウンドを確認してみてください)

### RDSにアクセスしているプロセスを削除
接続できれば、あとは接続中のプロセスをみつけて削除するだけです。

```
# すべてのプロセスを表示
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();

# 表示例
1234
1235

# プロセスを削除
SELECT pg_terminate_backend(1234);
SELECT pg_terminate_backend(1235);

# psqlの終了
\q
```

```
# コンテナに入ったのち、下記のコマンドを実行
$ bundle exec rake db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

以上になります。

## まとめ
私は開発環境でPostgresQLをコンテナ化していたので、エラーが出た時はDBコンテナを壊して再構築していました。そのため、本番環境の対処がわからず戸惑いました。何も考えずに作業すると良くないですね:sweat_smile:勉強します。
AWS認定 SysOpsアドミニストレイターに合格した

#受験動機

* 一昨年にSAAを取得していたので、アソシエイトの三冠をとりあえず目指す


#使用した機材について

* AWS認定アソシエイト3資格対策(対策本)
    * 内容はソリューションアーキテクト寄りで、SOA/DVA用としては深度が足りない
    * 奥付みると初版が2019/6なので、対策本も今ならもっと良いのがあるかも
* AWS WEB問題集で学習しよう(オンラインサービス)
    * 結局こればっかりやってた
    * SAA取得の時に比べると「本試験モード」みたいなメニューが増えている（本番と同じく2時間で65問回答する）
    * 出題の範囲、問題の深度は本試験に近く、とても実用的
    * 日本語の言い回しが微妙で解釈しづらい問題（問われている技術については理解出来ているけど、選択でどちらを選ぶべきか？が分かりづらい）があるが、これも本番に近い仕様なのであえてそう書いている…と思い、イライラせずに進めるべき
    * 出題文を読んで回答を導き出す思考パターンに慣れておくこと（試験慣れ）
    * 40番以降は難易度が上がる感じがあるので、後半だけ繰り返しておくのもイイかも
    * 本試験モードで満点が取れるぐらいまでやり込めば確実に合格できる


#受験まで

2020/02~

* ホントは昨年(2020)にSOA資格取りたくて対策本を買ったのだけど、業務形態の変化や諸々で取り掛かれなかった
* 2月中旬に「そろそろやるか」と思い立って「AWS WEB問題集」のサービスを申し込んだ

2020/03~

* 以前SAAの勉強した時は通勤時間を勉強に充てていたけど、リモートワークの現状況だと自宅で「勉強モード」に入るのが結構難しい
* 自宅だと中々スイッチを切り替えるのができない、すぐに誘惑に負ける
* これは自分でも認識してたので、以前はあえて外出して（長時間OKな喫茶店とか）自主的にモードを切り替えてたけど、このご時世だと外出もリスクがある
* 仕事を終えたあとそのまま勉強モードに入るパターンだとわりとやりやすいので「業務後1時間は勉強」のルーチンを作る

2020/04~

* 業務後の勉強も慣れてきたので、勉強時間を1日約2時間に増やす
* 問題集をとりあえず一周したところで模擬試験を受ける
* 95点とか思わぬ好成績だったので「もう本試験受けようかな」とか一瞬考えるが、やっぱり思い直す
* 問題集を二周したところで出題範囲と傾向はそれなりに把握できたので、本試験の日程を決める
* 試験前日は問題集を全通しでやっておく

#受験当日

* SAAと同じCBTS歌舞伎座テストセンターで受験、コロナ対策で窓が開いていたせいでちょっと騒音が気になった
* 受験時間よりすこし前に来ても自由に始められるのはよい
* SAAと同じでとにかくイージーミスは絶対に避けるべきなので、問題の二度読みと選択肢の全項目読みを徹底した
* フラグ立てつつ65問回答までで約1時間、その後フラグ問題の検討で20分、見直し2回で20分ぐらいの時間消費

#受験結果

* 無事合格(スコア918)
* 本試験では特に「日本語の言い回しによる解釈を悩む」ような問題はなかった（たまたまかも）

#要点

* CloudFormationは出来れば実際にテストコードを書いた方が理解が早い（自分はこれまでノータッチだったのでわりと苦労した）
* SAAよりも出題範囲は狭いが、その分サービスへの理解度はやや深いレベルが要求される
* 自分の印象ではSAAよりもスコープを絞れるのは良いが、その分覚えるサービス項目も細かくなるので難易度はそんなに変わらない？と思う
* 実際に触ってた経験があっても試験の時正確なパラメータを思い出せるとは限らないので、アーキテクチャの仕様をきちんと頭に入れておくことは重要（現場なら公式から情報を引き出してそこで判断ができれば問題ないけど、試験ではそうはいかない）
* 試験テクニック（消去法での正解抽出）は変わらず必須


#今後

* 次はDVAを目指します
* アプリケーション系はこれまで関わってこなかったので、苦戦しそうな予感…
Kaggle初心者が入門書から学んだこと

# はじめに
[『実践Data Scienceシリーズ PythonではじめるKaggleスタートブック (KS情報科学専門書)』](https://www.amazon.co.jp/dp/4065190061/ref=cm_sw_r_tw_dp_U_x_n61yEb2G3Q0BJ)を読了したので、そこから学んだことなどをまとめます。

# 学んだこと
- Kaggle のコンペの参加の方法からどうやって攻略していくか
- Titanic を使った分析/予測のやり方
- 実際のコンペで使われるアルゴリズムや小技
- トップランカーのコンペの攻略法

# おわりに
[チュートリアル](https://github.com/upura/python-kaggle-start-book)が配布されているので、一通り動かしてみるだけでも勉強になります。
また、この方々のTwitterも勉強になるので、おすすめです。
https://twitter.com/currypurin
https://twitter.com/upura0
motion.divを使ってReactのコンポーネントの出し消しを滑らかにする

## コンポーネントの出現を滑らかにする

motion.divコンポーネントを使用する。
- `initial` propでアニメーションの初期状態を設定(透明から出現させたい時は`opacity:0`を設定)。
- `animate` propでアニメーションの最終状態(出現する直前の状態)を設定。

## コンポーネントの消滅を滑らかにする

motion.divコンポーネントをAnimatePresenceコンポーネントでラッピングする。
- 上記に加え、motion.divコンポーネントの`exit` propで、アニメーションの最終状態(消える直前の状態)を定義。


なお、**AnimationPresenceコンポーネントの**`initial` propをfalseに設定すると、最初のレンダリング時にはコンポーネントの出現時にアニメーションが効かなくなる。

## その他

variantsをhashとして定義し、これをmotion.divコンポーネントのvariants propsに突っ込むことで、`initial`, `animate`, `exit`propをこのhashのキーとして設定すると、hashのvalueがそれぞれのpropとして解釈される。

```js
const variants: Variants = {
  initial: {
    opacity: 0,
  },
  animate: {
    opacity: 1,
    transition={duration: 2}
  },
  exit: {
    opacity: 0,
    transition={duration: 2}
  }
};

<AnimatePresence>
  {isVisible && (
    <motion.div
      variants={variants}
      initial="initial"
      animate="animate"
      exit="exit"
    >
      <MyComponent/>    // このcomponentの入出現時にアニメーションがかかる
    </motion.div>
  )}
</AnimatePresence>

```


## おまけのサンプルコード

職場の先輩にかいてもらったやつ。


```jsx

import { useState } from "react";
import { AnimatePresence, motion, Variants } from "framer-motion";
import "./styles.css";

const variants: Variants = {
  initial: {
    opacity: 0,
    y: -16
  },
  animate: {
    opacity: 1,
    y: 0
  },
  exit: {
    opacity: 0,
    y: -16
  }
};

export default function App() {
  const [isVisible1, setIsVisible1] = useState(false);
  const [isVisible2, setIsVisible2] = useState(false);
  return (
    <div className="App">
      <div>
        <button type="button" onClick={() => setIsVisible1((v) => !v)}>
          Toggle
        </button>
        <AnimatePresence>
          {isVisible1 && (
            <motion.div
              variants={variants}
              initial="initial"
              animate="animate"
              exit="exit"
              style={{
                display: "block",
                padding: "8px",
                backgroundColor: "rgba(0, 0, 0, 0.06)",
                borderRadius: "4px"
              }}
            >
              initial="initial"
            </motion.div>
          )}
        </AnimatePresence>
      </div>
      <div style={{ marginTop: "32px" }}>
        <button type="button" onClick={() => setIsVisible2((v) => !v)}>
          Toggle
        </button>
        <AnimatePresence>
          {isVisible2 && (
            <motion.div
              variants={variants}
              initial={false}
              animate="animate"
              exit="exit"
              style={{
                display: "block",
                padding: "8px",
                marginTop: "32px",
                backgroundColor: "rgba(0, 0, 0, 0.06)",
                borderRadius: "4px"
              }}
            >
              initial=false
            </motion.div>
          )}
        </AnimatePresence>
      </div>
    </div>
  );
}

```



## Ref

- https://www.framer.com/api/motion/animate-presence/
基本情報で出てくる用語を五文字で説明した辞書　第二巻

#この記事はシリーズものです
https://qiita.com/LaO/items/03fdd8551bc85718afc3

###プログラムレジスタ
<details><summary>五文字化</summary>次アド記憶</details>
###フェールソフト(fail soft=柔軟の意)
<details><summary>五文字化</summary>縮退運転</details>
###クラウド
<details><summary>五文字化</summary>情報外部に</details>
###PaaS(Platform as a service)
<details><summary>五文字化</summary>サーバ借</details>
###IaaS(Infra as a service)
<details><summary>五文字化</summary>インフラ借</details>
###SaaS(Soft as a service)
<details><summary>五文字化</summary>ソフト借</details>
###冗長性
<details><summary>五文字化</summary>無駄多い</details>
###稼働率
<details><summary>五文字化</summary>故障しなさ</details>
###オンプレミス
<details><summary>五文字化</summary>自主運用</details>
###フールプループ
<details><summary>五文字化</summary>バカも使用可</details>
###フェールセーフ(fail safe)
<details><summary>五文字化</summary>安全優先</details>
###フォールトトレラント
<details><summary>五文字化</summary>継続優先</details>
###デュプレックスシステム
<details><summary>五文字化</summary>片方予備</details>
###デュアルシステム
<details><summary>五文字化</summary>両輪</details>
###telnet
<details><summary>五文字化</summary>遠隔操作</details>
###SSH
<details><summary>五文字化</summary>新てるね(てるねは、telnetの略。暗号化機能が追加されたよん)</details>
###SI
<details><summary>五文字化</summary>全部面倒見</details>
###内部割込み
<details><summary>五文字化</summary>原因CPU</details>
###外部割込み
<details><summary>五文字化</summary>CPU以外</details>
###フラグメンテーション
<details><summary>五文字化</summary>ばらまき</details>
###メモリリーク
<details><summary>五文字化</summary>解放忘れ</details>
###主記憶
<details><summary>五文字化</summary>メモリ</details>
###フェッチ
<details><summary>五文字化</summary>メモリから</details>
###キャパシティプランニング
<details><summary>五文字化</summary>維持調査</details>

###プロトコル
通信ルール

###ドメイン
人向け

###IPアドレス
機械向け

###DNS
管理・変換

###URL
HP住所

###http
HP用

###スキーム
手段

###非同期処理
別スレ

###スレッド
一処理

###静的
最初から

###動的
途中から
JavaScriptでサブクラス可能なFunctionクラスを作る

JavaScript に於いて，関数は特殊なオブジェクトのため，普通にサブクラスすることはできません．そこで，普通に関数を作成して，その関数に対して必要な定義を行うこととなります．ここで，工夫して定義を行うと，普通のサブクラス可能な関数コンストラクタを定義することができることを発見いたしました．以下にそのコードを示します．

## コード

なお，このコードは Apache 2.0 ライセンスで利用可能なものとします．

```javascript
{
    let _;
    const ExtensibleFunction = function ExtensibleFunction(){return _(new.target)};
    Reflect.setPrototypeOf(ExtensibleFunction, Function);
    ExtensibleFunction.CALL = Symbol('[[Call]]');
    ExtensibleFunction.CONSTRUCT = Symbol('[[Construct]]');
    ExtensibleFunction.prototype = Object.create(Function.prototype);
    ExtensibleFunction.prototype.constructor = ExtensibleFunction;
    ExtensibleFunction.prototype.toString = function(){return"function anonymous() {\n    [native code]\n}"};
    ExtensibleFunction.prototype[Symbol.toStringTag] = 'ExtensibleFunction';
    ExtensibleFunction.prototype[ExtensibleFunction.CALL] = function(thisArgument, argumentsList){};
    ExtensibleFunction.toString = function(){return"function ExtensibleFunction() {\n    [native code]\n}"};
    _ = function (newTarget) {
        let _;
        const _this = function(...a){return _(this, a, new.target)};
        delete _this.length;
        delete _this.name;
        Reflect.setPrototypeOf(_this, newTarget.prototype);
        _ = function (thisArgument, argumentsList, newTarget) {
            if ('undefined' == typeof newTarget) {
                return _this[ExtensibleFunction.CALL](thisArgument, argumentsList);
            } else if ('function' == typeof _this[ExtensibleFunction.CONSTRUCT]) {
                return _this[ExtensibleFunction.CONSTRUCT](argumentsList, newTarget);
            } else {
                throw new TypeError('Not a constructor');
            }
        }
        return _this;
    };
    globalThis.ExtensibleFunction = ExtensibleFunction;
}
```

https://gist.github.com/metastable-void/19a6a982bb5216f69050c89d62dca2ca

## 使い方

### クラスを作る

```javascript
class MyClass extends ExtensibleFunction {
    constructor(n) {
        super();
        this.prototype.number = +n;
    }

    [ExtensibleFunction.CALL]() {
        throw new TypeError("class constructors must be invoked with 'new'");
    }

    [ExtensibleFunction.CONSTRUCT]() {
        return {
            _id: 'foo',
        };
    }

    [Symbol.hasInstance](obj) {
        return obj && obj._id === 'foo';
    }
}

const myClass42 = new MyClass(42);
console.log((new myClass42) instanceof myClass42); // true
console.log((new myClass42).number); // 42
```

### 関数を作る

```javascript
class MyFunction extends ExtensibleFunction {
    constructor(value) {
        super();
        this.value = value;
    }

    [ExtensibleFunction.CALL]() {
        return this.value;
    }
}

const myFunction42 = new MyFunction(42);
console.log(myFunction42()); // 42
new myFunction42; // TypeError
```

## 総括

この様にして，自由自在に関数オブジェクトを動的に作ることができましょう．ご意見等 お待ちしております．