OmniAICreator/Qiita-1.07M huggingface dataset:
C++11 で float, double 型だけ取るテンプレートとかつくりたい

## 背景

ベクトルとか行列のクラスや関数を作っている.

template で取りうる型を `float`, `double` や, optional で `half(fp16)` だけを取るように制限したい.

`std::is_floating_point` だと `long double` が含まれてしまうし, カスタムでの fp16 型などは別途対応が必要になる.

`std::common_type` だと implicit cast 可能なのも含まれてしまう.

`std::is_same` の組み合わせや, `static_assert` で型制限というのもあるが...

## TODO

ワンライナーな感じでなんかうまくやる方法を探す. 

```
using FPType = either<float, double, half>::type;
```

みたいな.
配列の中のnullの要素を排除する方法


```php

<?php
 
function valuecomp($var){
    // null以外の値を返す
    return($var <> null);
}
 
$value_array = [100, 200, null, 400, null];
 
//array_filterを使用してコールバック関数に配列を渡す
$value = array_filter($value_array, 'valuecomp');

var_dump($value);

?>

```

```php
実行結果
array(3) { [0]=> int(100) [1]=> int(200) [3]=> int(400) }
```

```php
//配列の番号を詰める場合は、これ

array_values($value);
var_dump($value);

```
```php
実行結果
array(3) { [0]=> int(100) [1]=> int(200) [2]=> int(400) }
```
UE4 Editor上のBlueprintでテクスチャアセットを自動生成する

UE4.25.4のEditor上のBlueprintでSceneCaptureComponentで撮影した画像をテクスチャアセットとして保存してみたのでそのやり方をメモしておきます。

以下のような512x512のテクスチャを自動で生成していきます。
背景部分は透明になるようにしています。
![capIcons.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/0d0e3f19-4e64-ac26-923d-acbf19ea0c27.png)

# 撮影用のアクタ


以下のような撮影用のアクタを作成し、マップに配置しています。

![capActor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/bda6857f-0ebc-8223-f15e-c6eee7e1b9a0.png)

 * StaticMesh：撮影対象
 * CaptureImageComponent2D：イメージの撮影用SceneCaptureComponent2D
 * ![capimagecapture2d.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/30e11f83-80ac-b40a-8c8f-f33f4f8dda7f.png)
 * CaptureDepthComponent2D：ScneneDepth撮影用(デプスによって背景を透明にする)のSceneCaptureComponent2D
 * ![capdepthcapture2d.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/f88451c7-285e-3830-8c38-3e89e8e0f9df.png)

## アルファ値を取得する別の方法

以下のような方法もあるみたいです。
デプスじゃなくてこちらを利用してもいいかもです。
[[UE4]アルファ付きキャプチャー画像の簡単作成｜株式会社ヒストリア](https://historia.co.jp/archives/13380/)

# RenderTargetの設定

撮影用アクタのBeginPlayで以下のようにRenderTargetを設定しています。

![capRenderTarget.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/510cc96c-d176-f915-cc32-804e35bbfc9d.png)

TargetGammaを2.2にしているのは以下の記事を参照しています。
[[UE4]インゲーム画像キャプチャに便利なノード「Export to Disk」の紹介｜株式会社ヒストリア](https://historia.co.jp/archives/16883/)

## デプス用のRenderTargetについて

最初RGBA8にしていたらRにちゃんと値が入っていませんでした。
RGBA32fで正常にデプスが取得できました。

# 背景を透明にする用のマテリアル

イメージとデプスのテクスチャから背景が透明なテクスチャをDrawMaterialtoRenderTargetで生成するための以下のマテリアルを作成します。

![capmaterialSetting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/22bb5985-3f7f-97ed-61b4-b0f923496b09.png)

![capMaterial.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/63fa2cfa-1f28-38b2-db3e-ae07a720a942.png)

# 撮影処理

撮影アクタでの撮影処理のBlueprintは以下のようになります。
StaticMeshを良い感じに設定してこの撮影処理を実行していきます。

![bp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/bbea5c0a-220b-f071-2d3b-9e8793b15aa0.png)

## DrawMateriltoRenderTargetでのアルファ値

DrawMaterialtoRenderTargetについては以下を参照
[ブループリントおよびレンダー ターゲットでテクスチャを作成する方法 | Unreal Engine Documentation](https://docs.unrealengine.com/ja/Engine/Rendering/RenderTargets/BlueprintRenderTargets/HowTo/CreatingTextures/index.html)

DrawMaterialtoRenderTargetを何の気なしに使うとアルファ値を正しく使ってくれずにすべて透明になったりしました。
下記のサイトを参照して以下のようにしています。

* 使用するマテリアルのBlendModeはAlphaCompositeにする
* Opacityは通常と反転させて扱う(1が透明、0が不透明)
* 事前にRenderTargetは(0, 0, 0, 1)でクリアする

[Draw Material To Render Target node has inverted alpha - UE4 AnswerHub](https://answers.unrealengine.com/questions/465100/draw-material-to-render-target-node-has-inverted-a.html)

## RenderTargetCreateStaticTextureEditorOnlyについて

RenderTargetアセットを右クリックしてCreateStaticTextureをするようなことができます。
作成したアセットはSaveしておかないとEditorを再起動すると消えてしまうようです（何回かやらかした）。

NameをIcons/TextureなどとするとContentフォルダ以下にIconsフォルダが作られTextureアセットが中に生成されました。
名前のみだとBlueprintと同じ階層にアセットが生成されるようでした。
すでにアセットが存在するとプレフィックスがついてインクリメントされていきます。
DynamoDB で auto increment のような事をする際のメモ

DynamoDBでMySQLでのオートインクリメントのような事をするには、
数値カウント用のテーブルを作って、そこで一意の数値を採番し、
採番した数値をオートインクリメントの値として使用する。

* カウンタの管理用のテーブルを用意 (テーブル名、カラム名はなんでも良い)
    * テーブル名 : `AtomicCounter`
    * パーティションキー名 : `CountNumber`
* カラム名に `Counter` は使用出来なかった

```python
import boto3

def get_increment_number(counter_key):
    dynamoDB = boto3.resource("dynamodb")
    atom_cnt = dynamoDB.Table("AtomicCounter")
    res = atom_cnt.update_item(
        Key={
            'CounterKey': counter_key
        },
        UpdateExpression='ADD CountNumber :incr',
        ExpressionAttributeValues={
            ':incr': 1
        },
        ReturnValues="UPDATED_NEW"
    )
    return res['Attributes']['CountNumber']
```
memory_limitをmacで編集する方法【エラー：Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52】

ある日にcomposer requireすると、エラーが表示


```
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.% 
```

memoryがいっぱい？
macの容量、メモリ共に空いていますけど？？

調べてみると、

php.iniに記載されている、memory_limitが上限に達したようだ。
デフォルトだと128MBが設定されているので、それを更新させる必要がある。


# php.iniを作成
macには`php.ini.default`というファイルが存在し、これをコピーで複製して、設定を変えて改善させます。

ファイルの場所は`/private/etc/php.ini.default`です。
コマンドで確認したい場合は、

```
php -i | grep php.ini 
```
で確認できます。

なので、これをコピーしてphp.iniを作成しましょう。

```コピーする
sudo cp -p /etc/php.ini.default /etc/php.ini
```
でphp.iniを作成します。

# 容量の変更

現在のメモリーを確認するコマンドを実行しましょう。

```:コマンド
$ php -i | grep memory_limit
memory_limit => 128M => 128M 
```
128Mと分かります。
これを変更したいので、

```
vim /etc/php.ini
```

memory_limitを見つけて変更します

```:容量の上限を上げる
memory_limit = 528M
```

```:容量を無制限にする
memory_limit = -1
```

## 保存時にエラーが発生する

```
［vim］read only
```
と表示されて、`:wq`で保存できません。

そこで、

`:w !sudo tee %`を手入力して実行

画面に変化が現れますので、さらに

vim画面から脱するために

`:q!`で終了します。

# 確認

```
$ php -i | grep memory_limit
memory_limit => -1 => -1
```
これで反映されたことが分かります。

改めてcomposerを実行すると、

```
Package manifest generated successfully.
```
とインストールに成功したことが分かります。
これで解決です

# その他

調べると他の方法もあるようです。


```:コマンド
$ composer update
```
でエラーが出た場合、

```:コマンド
$ php -d memory_limit=512M composer update
```
と`php -d memory_limit=512M`をつけることで実行可能みたいです。

composer requireだと

```
$ php -d memory_limit=-1 composer.phar require ~
```
と記述することで実施可能みたいです。
ECMAScriptでは一つの日付文字列形式しか定義してない

ユーザーが記事を投稿して、それを表示するというシンプルなシステムを作っている時の話。
ある日、IEで記事投稿の時刻表示が出ないと連絡があった。
コードを調べてもIE特有で表示できない部分がぱっと見では分からず、調べてみると`new Date()`にちょっとした落とし穴があったのでまとめ。（どちらかというと落とし穴があったのではなく自分から引っ掛かったが正解かも...）

### 問題点
当初の記事の時刻表示をするコードが以下

```js
var content = '';

var date = new Date(dateString); // APIで取得した日付の文字列をもとにDateインスタンス作成
if (date.toString() !== 'Invalid Date') {
  content += '<li>';
  // APIで受け取った日付を"YY.MM.DD HH:mm:ss"にする
  content += date.getFullYear().toString().slice(-2) + '.' + (date.getMonth() + 1) + '.' + date.getDate() + ' ' + ('00' + date.getHours()).slice(-2) + ':' + ('00' + date.getMinutes()).slice(-2) + ':' + ('00' + date.getSeconds()).slice(-2);
  content += '</li>'; // このリストタグをappendする
  // コードの書き方が古風なのは許して
}
```

結論、何が悪かったかというと、日付文字列のフォーマット。
実はECMAScript公式は、ISO 8601 Extended Formatという`YYYY-MM-DDTHH:mm:ss.sssZ`しか定義していない。
（※詳細はECMAScript公式を見てください。[20.4.1.15 Date Time String Format](https://www.ecma-international.org/ecma-262/#sec-date-time-string-format)）

今回のAPIからもらってくる日付文字列はフォーマットは`YYYY-MM-DD HH:mm`
今回の文字列形式がGoogle chromeなどで正常に動くのはブラウザ依存の動き方で、全てで動くとは保証できない。
結果、IEでは"Invalid Date"になって描画されなかったんですね。
納得。

### 解決法
解決法は、正規表現を使って、もらったフォーマットを、ISO 8601 Extended Formatにすること。

```js
// 今回受け取るフォーマットは'YYYY-MM-DD HH:mm'なので、それから年月日時刻を抜き出す正規表現
function convertToRightFormatString(dateString) {
  const regex = /([0-9]{2,4})-([0-1]?[0-9])-([0-3]?[0-9])(?: ([0-2][0-9]):([0-5][0-9]))/;
  return dateString.replace(regex, function(
    match, year, month, day, hour, minutes
  ){
    return year + '-' + month + '-' + day + 'T' + hour + ':' + minutes + ':00.000Z'
  });
}

var content = '';

var date = new Date(convertToRightFormatString(dateString)); // 文字列を変更
// ...以下略
```

これで公式に乗っ取ったフォーマットになるので、どのブラウザでもInvalid Dateにならないはず！

※ RegexでわかりやすいようにNamed capture groups使おうと思ったらIE非対応だった...。さすがIE。

#### 参考
[ECMAScript® 2020 Language Specification] (https://www.ecma-international.org/ecma-262/#sec-date-time-string-format)
git 自分用

### gitからcloneしてcheckout
```
git clone xxx
git checkout -b ブランチ名
```

### gitをpushするまで
```
git add .
// VSCodeで不要なコミットを取り除く
git commit -m "コメント" -m "コメント2"
git push origin ブランチ名
```

### 他の人のソースを入れる
```
git pull origin develop
```

### 自分のソースをリセットする
```
git checkout HEAD ファイル名
```

### 違うブランチからソースを取り込み新しいブランチにソースを盛り込む

```
git checkout xxx_branch
// 移動する
git pull origin xxx_branch
// 最新のブランチ情報を引っ張ってくる
git checkout -b yyy_branch
// 新しくブランチを作成する

```

### gitでチェックアウトをし、対象のブランチをそのままチェックアウトする。
```
git clone url -b branchName
```
IBMCloud vSRX 古いユーザのセッション設定情報を削除する小技 (Hint&Tips)

# この記事の目的

* 管理対象のvSRXデバイスに、他ユーザのセッションログが残ってしまっている場合に、強制的に削除する手順となります。
* 過去の作業状況も見えず、想定外の設定が反映されてしまうと困るため、セッションをクリアしたい場合に本手順を利用できると思います。

# 実施手順

## 1. 残っているセッション情報の確認

* もし設定が別セッションが残ってしまっている場合、設定モード(configure)に移行した際に<font color="DeepPink">"Users currently editing the configuration:"</font>と表示され、その下にユーザ名やプロセスID番号などが表示されます。

```
{primary:node0}
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0> configure
warning: Clustering enabled; using private edit
warning: uncommitted changes will be discarded on exit
Entering configuration mode
Users currently editing the configuration:
  admin terminal pts/0 (pid 54944) on since 2020-11-19 02:16:46 UTC, idle 00:35:18
      private [edit]
```

* 上記の例では、<font color="DeepPink">pid=54944</font>が残ってしまっている旨のメッセージが出ています。

## 2. 古いセッション(pid=54944)の削除

* 削除するためには、"request system logout pid (pid-number)"コマンドを実行します。(10秒〜20秒程度かかります）

```
{primary:node0}
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0> request system logout pid 54944

{primary:node0}
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0>
```
* 作業は以上で完了です。

## 3. 事後確認

* 1の手順で見えていたセッション情報が無事消えていることが確認できます。

```
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0> configure
warning: Clustering enabled; using private edit
warning: uncommitted changes will be discarded on exit
Entering configuration mode

{primary:node0}[edit]
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0#
```


## 4. 削除された側のセッションはどうなっているか確認 (参考)

* 参考までに、テスト用に事前ログインしていたセッションが2の手順を実行したときの結果を添付します。
* 強制的にログアウトされていることが確認できます。

```
{primary:node0}[edit]
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0#

{primary:node0}[edit]
admin@tok04-vsrx-gateway02-vsrx-vSRX-Node0#
error: remote side unexpectedly closed connection
Connection to 10.192.94.137 closed.

Naoki-MacBook-Pro ~ %
```

* 以上、ご参考になれば幸いです。
Google recruit problem (exp and prime)



# 概要

ネイピア数 e の連続する 10 桁の数のうち、最初の素数を Ruby で求める

ただし、e は 200 桁まででよい

    2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190

ref: 

-   <https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07>
-   <https://www.cnet.com/news/google-recruits-eggheads-with-mystery-billboard/>

(Ruby 勉強中)


# コード

```ruby
 1  def is_prime(num)
 2    warden = true
 3    for i in Range.new(2, Math::sqrt(num - 1))
 4      if num % i == 0
 5        warden = false
 6        break
 7      end
 8    end
 9    return warden
10  end
11  
12  exp = gets.chomp
13  exp = exp.delete('.')
14  
15  for i in Range.new(0, exp.length - 10)
16    ten_digits = exp.slice(i .. i + 9).to_i
17    if is_prime(ten_digits)
18      puts ten_digits
19      break
20    end
21  end
```

line1~10:

-   素数かどうかを判定する method を作成する

ine12~13:

-   以下のテキストファイルを読み込む

ファイル:

    2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190

-   小数点を取り除く

line15~21:

-   ループを回して、前から順に連続する10桁の数字が素数かどうかを判定する
-   素数が見つかれば終了し、見つかった素数を出力する

結果は以下の通り

    7427466391



------
 - **source** ~/doc/lecture/multi-scale/grad_members_20f/members/yukiue/docs/google_recruit.org
sshfsで公開鍵を使った認証につまった話

# 概要
sshを使った認証とsshfsを使った認証で少し使い方が違ったため、つまづいたことを載せます。

# sshによる公開鍵認証
公開鍵の作成手順とサーバ側での認証方法の設定(公開鍵がないと接続できないとか)は省略します。

認証コマンド

```
$ ssh -p ポート番号 -i ~/.ssh/id_rsa [リモートユーザー]@[リモートサーバーのホスト名]
```

- `-i`オプションは認証で使うファイルを指定
- `-p`オプションはポート番号を指定

# sshfhによる認証
`sshfs`とはsshを経由して他のサーバのディレクトリをマウントすることができます。
インストールが必要なので適宜行なってください。

今回はローカルの`~/mountpoint`ディレクトリにマウントさせたいと思います。

## 公開鍵なし(パスワード認証)接続
認証コマンド

```
$ sshfs -p ポート番号 [リモートユーザー]@[リモートサーバーのホスト名]:[リモートサーバーのマウントしたいディレクトリ] [ローカルのマウント先ディレクトリ]
```

## 公開鍵認証での接続
つまづいた方法

```
$ sshfs -p ポート番号 [リモートユーザー]@[リモートサーバーのホスト名]:[リモートサーバーのマウントしたいディレクトリ] [ローカルのマウント先ディレクトリ] -i ~/.ssh/id_rsa
```

ssh接続と同じように`-i`オプションで秘密鍵の指定ができると思ってました。しかしそうじゃなかった。。。

正しい方法
1. sshfsのオプションで鍵を指定

```
$ sshfs -p ポート番号 [リモートユーザー]@[リモートサーバーのホスト名]:[リモートサーバーのマウントしたいディレクトリ] [ローカルのマウント先ディレクトリ] -o IdentityFile=~/.ssh/id_rsa
```

`-o IdentityFile`オプションで秘密鍵を指定することで接続できました。

2. sshfsでsshのコマンドを使用する

```
sshfs -p ポート番号 [リモートユーザー]@[リモートサーバーのホスト名]:[リモートサーバーのマウントしたいディレクトリ] [ローカルのマウント先ディレクトリ] -o ssh_command='ssh -i ~/.ssh/id_rsa'
```

このように`-o ssh_command`でsshで秘密鍵を指定する方法を加えることで接続できました。
【Java】拡張for文の使い方

#プログラミング勉強日記
2020年11月19日
Javaの拡張for文の使い方をまとめる。

#拡張for文とは
　配列やコレクションといった複数の要素を持っているものからすべての要素に含まれる値を順番に取り出して処理するために使われる。
　値を順番に取り出したい配列やコレクションと、取り出した値を格納する変数を`:`(コロン)で区切って記述する。繰り返される回数は配列やコレクションに含まれている値の数なので条件式と変化式は必要ない。

##for文との違い
　for文は指定した条件で繰り返し処理を実行するときに使い、繰り返す処理の内容を指定できる。
　拡張for文はコレクションのすべての要素に対して繰り返し処理をするときに使用できて、for文をより簡単に書ける。

```java:基本的な書き方
for (データ型 変数名: コレクション){
  実行する文1;
  実行する文2;
}
```

#配列でのfor文と拡張for文

```java:for文
public class Main {
    public static void main (String[] args){
        int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
        for (int index = 0; index < numbers.length; index ++) {
            System.out.println(numbers[index]);
        }
    }
}
```

```java:拡張for文
public class Main {
    public static void main (String[] args){
        int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int number : numbers) {
            System.out.println(number);
        }
    }
}
```

```:実行結果
1
2
3
4
5
6
7
8
9
10
```

#コレクションの拡張for文

```java:拡張for文
import java.util.ArrayList;
import java.util.List;
public class EnhancedForCollection {
    public static void main (String[] args){
        List<Integer> numbers = new ArrayList<Integer>();
        for (int number = 1; number <= 10; number++) {
            numbers.add(number);
        }
        for (int number : numbers) {
            System.out.println(number);
        }
   }
}
```

```:実行結果
1
2
3
4
5
6
7
8
9
10
```


#参考文献
[【Java入門】なるほど納得！for文と拡張for文の違い](https://www.internetacademy.jp/it/programming/javascript/difference-between-for-statement-and-extended-for-statement.html)
[拡張for文(for-each文)](https://www.javadrive.jp/start/for/index8.html)
[【初心者でもすぐわかる】Javaの拡張for文の使い方まとめ
](https://eng-entrance.com/java-for-expand)
Ruby で文字列を置換する方法　gsub

# Rubyで文字列を置換:Stringクラスのgsub
Ruby初学者である自分のための、Ruby 2.7.0についての記事です。

文字列の一部を特定の文字列に置き換える方法です。

- 基本的な使い方　gsub(pattern, replace)

例えば、"def"を"!!"に置き換えたい場合

```Ruby
# 公式ドキュメントより
'abcdefg'.gsub(/def/, '!!')  # => "abc!!g"

# 変数を使う場合（自分の解釈）
S = "abcdefg" # 文字列を変数Sに代入します
puts S.gsub(/def/, '!!') # => abc!!g

```

一番簡単な部分だけ抜粋しています。詳細は公式ドキュメントを確認します。
https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html
Tensorflow-GPUってTF2.0以降なら一緒になってるらしい？

 ここもhtmlとか使って書くものなのか？無知なのでよくわかりませんが　

　Autokerasを走らせてるときに、もしやGPU使われてないのでは？
と思っていたら、本当に使われていなかった。


　今までGPUなんて勝手に使ってくれるもんだと思ってたんですねえ。でも、
CPU性能はそこまで低くないから、別に遅くは無くて何とも思ってなかった。
いや、何と比べてやねんって話やが。


　で、Tensorflow-gpuというのがいるんだ！と思って頑張って入れてみて、
CUDAやらCuDNNのバージョンもぴったし合わせないといけない、みたいで
一応動いたけど、どうやらAutokerasは余裕でTF2.3とか要求してくるから
なんやねんって思った。

それで結局Autokerasは動かせんかったけど、よくよく調べてみたら
TF2.0以降なら一緒になっているらしい。確かにTF1.15以下は個別になっている
とかいうのを見たが、ちょっと意味が分からんくて無視してた。アホ。

tensorflow-gpuを入れたらtensorflowが上書きされるとかいうのを見たけど、
それはその当時の話なんだなと。

まだ試してないけど、とりあえずTF2.3が動くように環境構築してみる。
あと、自分が使うバージョンの記事かどうかは確認します。
めちゃくちゃ時間無駄にしたけど勉強になりました。完
【Instance Segmentation】MaskRCNN : Instance Segmentationの基礎

<h1>概要</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ee80063d-6682-638e-8904-ad549cda123b.png)

Semantic Segmentationは知ってるけど、Instance Segmentationの仕組みがわからない。どうやって物体毎に分類するんじゃ？
てことでMaskRCNNをもう一度調べてみた。

使ったコードのリンク貼っておきます
https://github.com/yokosyun/instance-segmentation

semantic segmentaionについて知りたい方はこちら
https://qiita.com/minh33/items/6e42041dd5108d5fc2f0
https://qiita.com/minh33/items/d800394f480b2d6eef33


<h1>Instance Segmentation(MaskRCNNの場合)</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/fa6cf4e4-e5aa-6ebe-e3ee-285030995913.png)

RPNで推定されたBoundingBoxのエリアに対してのみsemantic segmentationする
＝Instance Segmentation

めっちゃシンプル！


<h2>結果</h2>

personとしてsegmentationされているpixelがBoundingBoxの中にしか無いのが分かる。(実際はこのBBoxは補正された後のBBox)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e96a0bb3-35db-0edc-ac60-75d7992bfb69.png)

<h2>結論</h2>
RPNで推定されたBBoxのエリア内にてSemantic Segmentationをする。



<h1>参考文献</h1>
Mask R-CNN
https://arxiv.org/pdf/1703.06870.pdf
https://github.com/Okery/PyTorch-Simple-MaskRCNN
Mask R-CNN
https://www.slideshare.net/windmdk/mask-rcnn
Redash で Group の Permissions を変える方法

RedashのGroupは権限(Permissions)を保持しており、所属するユーザに対して間接的に権限を付与することができる。
所謂ロールとしての機能である。

しかし、作成したGroupは常に以下の権限を保持しており、WebUI上からは変更することができない。
CLIから変更できるのでその方法を記載する。

**権限**

- create_dashboard
- create_query
- edit_dashboard
- edit_query
- view_query
- view_source
- execute_query
- list_users
- schedule_query
- list_dashboards
- list_alerts
- list_data_sources

FYI: https://github.com/getredash/redash/blob/004bc7a2ac0de041907ab0b9b560151ea7057332/redash/models/users.py#L260


# 環境
Redash 8.0.0+b32245 (a16f551e)

# やりかた
Redash の `manage.py` を使う。
以下のコマンドを実行することで実現できる。
引数で渡された権限をグループが保持する権限にまるごと置き換える。

```bash:/opt/redash
# 変更対象のGroupのID
export GROUP_ID=3
# カンマ区切りで複数付与
docker-compose exec server ./manage.py groups change_permissions --permissions 'super_admin,admin' $GROUP_ID
# 全ての権限を消す
docker-compose exec server ./manage.py groups change_permissions --permissions '' $GROUP_ID
```
＃1  【python3】変数を利用した簡単な計算

#はじめに
この記事はプログラミングを勉強し始めて２ヶ月ほどの駆け出しエンジニアがアウトプット目的に書いている記事です。
ruby、jsをかじったのちトレンドであるpythonに興味を持ったので学習を始めました。

「こんなこといちいち書かんでもわかるわ！」という声もありそうですが、初投稿になりますので練習も兼ねて書いていこうと思います。
拙い記事になるりますが、気になる点があればご指摘いただけるとありがたいです！
なお本記事は、macOSにpython3およびanacondaの導入をしていることが前提となっております。

#1 簡単な計算してみる
ターミナルにてpythonを起動します。

```
$python
```
簡単ですね。　ちなみにanacondaを導入していない場合は

```
$python3
```
で起動するみたいです。

起動完了したら、簡単な演算を実行してみます。

①**足し算**

```
>>> 1 + 1 
2
```

②**引き算**

```
>>> 1 - 1
0
```

③**掛け算**

```
>>> 2 * 2
4
```

④**割り算**

```
>>> 4 / 2
2.0
```
　

⑤**あまり算**

```
>>> 4 % 3
1
```
小学生の算数をじゃあるまいしこのくらいなら簡単に理解できますね。

#2 変数を使った演算
pythonでは変数宣言は必要なく、また型指定もないみたいです。
覚えることが少なくていいですね！

早速、変数hogeに値を代入してみます。

```
>>>hoge = 2 * 3
>>>hoge
6
```

1行目でhogeに2*3を代入して2行目でhogeを出力しています。
では次にhogeの値を更新してみましょう。

```
>>>hoge = 2 * 3
>>>hoge
6
>>>hoge = 2 * 20
>>>hoge
40
```
変数の値は簡単に変更することができます。
では今度は複数の変数を利用して計算をしてみましょう。

```
>>>hoge = 2 * 3
>>>mage = 2 * 20
>>>hoge * mage
240
```
さらには変数に変数を代入することも可能です。

```
>>>hoge = 2 * 3
>>>mage = 2 * 20
>>>koge = hoge * mage
>>>koge
240
```




# 終わりに

今回の記事はこれで終了です。
今後の記事はより見やすくわかりやすい記事にしていきたいです。

次の記事→https://qiita.com/shin12032123/items/543a25bd5777d6e18128
R tips 時間データを取得するライブラリ  lubridate (年～秒まで)

# <font color="DarkSlateBlue">記事の目的</font>
この記事では、時間のデータから、年、月、曜日、日、時間、分、秒のデータを取得する関数を紹介します。

# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td><font color="DarkslateBlue">No.<td><font color="DarkslateBlue">目次
<tr><td><font color="DarkslateBlue">1</font><td><a href="#1-使用するライブラリとデータ">使用するライブラリとデータ</a>
<tr><td><font color="DarkslateBlue">2<td><a href="#2-時間データの取得">時間データの取得</a>
<tr><td><font color="DarkslateBlue">3<td><a href="#3-完成データ">完成データ</a>
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">使用するライブラリとデータ</font>
```R:
library(lubridate)
time <- seq(as.POSIXct("2020-10-29"), as.POSIXct("2020-11-03"), by="day")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/3f084dc4-015a-3ac6-2f9c-be8104c707f3.png)



# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">時間データの取得</font>
```R:
#年を取得
year <- year(time)
#月を取得
month <- month(time)
#曜日を数字で(1-7,日-土)取得
week1 <- wday(time)
#曜日を取得
week2 <- weekdays(time)
#日にちを取得
date <- mday(time)
#時間を取得
hour <- hour(time)
#分を取得
minute <- minute(time)
#秒を取得
second <- second(time)
```

# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">完成データ</font>
```R:
data.frame(time, year, month, week1, week2, date, hour, minute, second)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/422edf42-28d1-01ce-a07b-f3cbb46e3417.png)

◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
YouTube Data API v3 クォータ制限について その2

<h1>APIのクォータ制限にまた達した・・・</h1>
[前回の記事](https://qiita.com/shimizu6660/items/6552589f5bc49c99bce2)のその直後すぐにクォータ制限の上限まで達してしまった。

![スクリーンショット 2020-11-19 11.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683204/51a199cf-7a4b-f157-29fd-63c729c7193b.png)

前回でコードを見直しAPIの使用を減らしたはず・・・
原因を探しているうちに、これかな？っていう問題が見つかった。

<h2>1.原因</h2>
前回のコード見直しの後、Youtube Data API v3を使用するためにgoogleで新しくプロジェクトを作成した。APIkeyを取得して、初めのうちは調子良く動いていた。
しかし、1時間後APIダッシュボードでクォータの使用量を確認しに行ったら上限の10,000ギリギリ・・・
離席していた1時間APIは何も使用していなかったのに・・・

いろいろ考えたり確認していたらGithubに登録していたメールに英語のメールが届いていた。
![スクリーンショット 2020-11-19 11.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683204/062a403f-2b95-8c77-2426-7e1f77b0eaec.png)
恥ずかしながら英語のメールはスルーしてしまっていた・・・
Githubにコミットした直後にメールが届いていたようだったので、よくよく確認してみると
![スクリーンショット 2020-11-19 12.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683204/9826a492-e21f-b830-1c68-caafa1e7b12a.png)
GitGuardian・・・？
Googleキーを検出・・・？
APIkeyのことか！？

GitGuardianはGithubにコミットされたコードから重要な情報が記載されていないか確認してくれるというものらしい。すごい・・・

自分でコミットしたコード内にAPIkeyが誰でも見れる状態になっているよ、と教えてくれた。

おそらく、Github上でAPIkeyを気づかずに公開してしまっていたことで、自身が取得したAPIkeyが誰でも使えてしまっていたことが原因でクォータ数がすぐに上限に達してしまっていたのではないだろうか・・・

<h2>2.対策</h2>
単純にAPIkeyをGithubにコミットするときに一時的にコードから削除し、コミットできたらコードを戻すという原始的な方法を試してみた。
すると、翌日になってもクォータ数が勝手に上限まで達成することがなくなり、自身が利用した分だけの使用量が表示された。

なんとか対応できた様子・・・

しかし、Githubにコミットする際にもっと効率の良い方法があるはずなので探していこうと思います。
個人的なかわいいCSSのfont-familyランキングを発表

## はじめに
個人的にかわいいと思うCSSのfont-familyの日本語のランキングを発表します！
自作のwebサイトを作るにあたって文字をかわいくしたかったため調べてみました。

## font-familyとは
- フォントを指定するプロパティのこと。
- 指定したフォントはブラウザが動作している環境にインストールされているものが使用されるため、指定したフォントが必ず使用できるとは限らない。
- フォントは複数指定することができる。フォントを複数指定した場合、ユーザ環境に存在するフォントが適用される。その際、前方にあるフォントが優先される。

## 記述例
### HTMLファイル

```HTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="sample.css" type="text/css">
  </head>
  <body>
    <p class="sample">ここに文章を表示</p>
  </body>
</html>

```
### CSSファイル (ファイル名：sample.css)

```CSS

.sample { 
     font-family: -apple-system, "Segoe UI", "Helvetica Neue", "Hiragino Kaku Gothic ProN", メイリオ, meiryo, sans-serif;
}

```

※Qiitaではこのようなfont-familyが設定されていました。


## かわいいランキング
### 1位　Hannotate SC
![スクリーンショット 2020-11-18 21.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/fe1c0c5d-4fb2-bc48-aadb-a425e9316fc6.png)
特徴：こちらが１位に輝きました！！手書きで書いたかのような文字がゆるくてかわいいです！
　　　かわいくありつつもちょっと味のあるWebページにしたい時に使えそう:point_up_tone1:

### 2位　TsukuARdGothic-Regular
![スクリーンショット 2020-11-18 20.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/d916eb9b-4e64-0b82-ba3c-d1b6124dbbd6.png)

特徴：文字の角がなくへにゃって感じが特徴。文字に少し癖のある感じがかわいいです！
　　　シンプルな感じのWebサイトに使えそう:point_up_tone1:

### 3位　HanziPen SC
![スクリーンショット 2020-11-18 21.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/9b8d8662-4e12-73be-fc92-025dbb901aae.png)
特徴：THE手書きって感じの文字です。中学生の時とかこんな感じの字を書いている子がいたような気がします:joy:
　　　手書き風にしたい！！というWebサイトに使えそう:point_up_tone1:

### 4位　ヒラギノ丸ゴ Pro
![スクリーンショット 2020-11-18 20.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/85db2615-1e3d-085b-0eb5-1e8e2a65b6bd.png)

特徴：とにかく文字が丸っこくて角なんてひとつも存在しません！
　　　ポップな感じのWebサイトに使えそう:point_up_tone1:

### 5位　Wawati SC
![スクリーンショット 2020-11-18 21.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/49b069aa-2db9-c5b5-f434-17a156565b2f.png)

特徴：ちょっと癖のあるポップな感じの文字です。「こ」の下の部分の曲がり具合の感じの癖がかわいいですね！
　　こちらもポップな感じのWebサイトに使えそう:point_up_tone1:

※いずれもOS：Mac、ブラウザ：Chromeでは動作することは確認できています。

## まとめ
個人的には丸っこい文字が好きなのでこのようなランキングになりました！！
ブラウザやOSの違いによっては読み込めない可能性もありますが、かわいい文字の参考にしてみてください！

## 参考サイト
https://saruwakakun.com/font-family
Reactを学ぶXII〜React Hooksその3 第二引数を使う〜

## ■ はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ Reactの基礎知識が増える
・ useEffectの第二引数を使った流れ

## ■ 前回まで

前回、useEffectメソッドを使ってライフサイクルの動きをいいねボタンで実演してきました

```react:LikeButton.jsx
// 中略

    useEffect(() => {
        document.getElementById("counter").addEventListener("click", countUp);
        if (count >= 10) {
            counter(0)
        }
        return() => {document.getElementById("counter"}.removeEventListener("click", countUp);
    }):

// 中略
```

## ■ 例

今度は番外編として、第二引数を使った動きを見るので、まずは空の配列を渡します

```react:LikeButton.jsx
// 中略

    useEffect(() => {
        document.getElementById("counter").addEventListener("click", countUp);
        if (count >= 10) {
            counter(0)
        }
        return() => {document.getElementById("counter"}.removeEventListener("click", countUp);
    }, []): // 空の配列を渡す

// 中略
```

最初のマウント時にしかイベントリスナーが設定されないので、ボタンを連打してもカウントが増えません

![からの配列を渡す.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/adbf2224-8db4-5802-965c-9f9652e1c86f.gif)

一度クリックをする　→　次のレンダーになる　→　次のレンダーになるとクリーンアップ関数が呼ばれてイベントリスナーが解除される　→　<font color="red">第二引数が空なので次のレンダーの時にはイベントリスナーが呼ばれないのでいいねが一度しかできない</font>

いいねを何回もしたいと思った時、[前回記事](https://qiita.com/s79ns/items/45bffa478c612110445e)のパターン④で紹介をしました`limit`を使います

```react:LikeButton.jsx
// 中略

const LikeButton = () => {
  const [count, counter] = useState(0);
  const [limit, release] = useState(true); // limitというstateを初期値trueで作ります

    useEffect(() => {
        document.getElementById("counter").addEventListener("click", countUp);
        if (count >= 10) {
            counter(0)
        }
        return() => {document.getElementById("counter"}.removeEventListener("click", countUp);
    }, [limit]): // 第二引数の配列にlimitを指定

// 中略
```

この状態でボタンをクリックしても、いいね数は1回しか増えません。
`limit`の値が変わらず、前回と今回を比較しても同じなので、クリーンアップ変数を2回目以降は
呼ばれなくても良いと判断されてしまいます

```react:LikeButton.jsx
// 中略

const LikeButton = () => {
  const [count, counter] = useState(0);
  const [limit, release] = useState(true);

    useEffect(() => {
        document.getElementById("counter").addEventListener("click", countUp);
        if (count >= 10) {
            counter(0)
        }
        return() => {document.getElementById("counter"}.removeEventListener("click", countUp);
    }, [limit]):

    return (
      <>
        <button id={"counter"}>いいね数： {count}</button>
        <button onClick={() => release(false)}>更に追加でいいねする</button> // limitを解除するボタン
      </>
    );
};

// 中略
```
`limit`を解除するボタンを作ります（onClickイベントでuseState宣言したrelease関数を実行し、渡す引数の内容は状態をfalseにする）

![更にいいね.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/321fca10-857b-25b0-b7a1-7c818473c91e.gif)

もっといいねボタンを押すと、releaseメソッドによって、trueの状態からfalseに変わっていいね数が増えるようになりました
falseの状態なので2回目以降は数は増えませんが、もっと増やしたい場合は

```react:LikeButton.jsx
// 中略

    return (
      <>
        <button id={"counter"}>いいね数： {count}</button>
        <button onClick={() => release(!limit)}>更に追加でいいねする</button>
      </>
    );
};

// 中略
```

releaseの処理をlimitの現在の値を反転させるようにすると

![反転したら.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/b5305144-34e3-fd26-e08a-ac3cf32b7aa8.gif)

いいね数が増えるようになります
AWSを勉強する - ELB

# ELB（Elastic Load Balancing）
リリースしたサービスが人気で、負荷がかかって来た時、単純にスケールアップすることでも対応できるが、インスタンスタイプには限界がある。
また、単一のインスタンスで運用していると、そのインスタンスが停止したときにサービス全体が停止してしまう。（単一障害点）
そのため、ロードバランサーを使って負荷を分散させ、高負荷にも対応するスケールアウトを行う必要がある。
ELBは、ロードバランサーのマネージドサービス。


#ELBのタイプ

- CLB（Classic Load Balancer）：L4/L7レイヤーでの負荷分散を行う
- ALB（Application Load Balancer）：L7レイヤーでの負荷分散を行う

WebSocketやHTTP/2に対応している。
ALBはパスルーティングによりCLBより容易にバランシング構成が可能。
ALBは一つのバランサーでより複雑な構成に対応できる。

- NLB（Network Load Balancer）：L4レイヤーでの負荷分散を行う。HTTP(S)以外のプロトコル通信の負荷分散をしたいときに利用する。

ロードバランサー自体が固定のIPアドレスを持っている。
超低遅延で高スループットを維持しながら秒間何百万リクエストを捌くように設計された新しいロードバランサー。


#ELBの特徴

##ヘルスチェック
設定された間隔で配下にあるEC2にリクエストを送り、各インスタンスが正常に動作しているかを確認する機能
もし異常なインスタンスが見つかった時は自動的に切り離し、その後正常になったタイミングで改めてインスタンスをELBに紐付ける。

###ヘルスチェックの設定値

- 対象のファイル
- ヘルスチェックの間隔
- 何回連続でリスエストが失敗したらインスタンスを切り離すか
- 何回連続でリクエストが成功したらインスタンスを紐付けるか

##Auto Scaling
システムの利用状況に応じて自動的にELBに紐づくインスタンスの台数を増減させる機能。
###Auto Scaling設定項目

- 最小のインスタンス数
- 最大のインスタンス数
- インスタンスの数を増やす条件と増やす数
- インスタンスの数を減らす条件と減らす数

Auto Scalingを利用することで、繁忙期やピーク時間はインスタンス数を増やし、閑散期や夜間のリクエストが少ない時は、インスタンス数を減らすといったことができる。
EC2の利用状況に応じて自動的にインスタンスの台数を増減させることて、リソースの最適化、耐障害性の向上を図れる。

###ターミネーションポリシー
需要減に基づくスケールインの際にどのインスタンスから終了するかを設定。

- OldestInstance / NewesInstance：最も古いインスタンスや新しい起動時刻のインスタンスなどの順から終了
- OldestLaunch Configuration：最も古い起動設定により起動しているインスタンスから終了
- ClosestToNextInstanceHoure：次の課金が始まるタイミングが最も近いインスタンスから終了
- デフォルト設定：OldestLaunch Configuration、ClosestToNextInstanceHoureの順に適用する。その後、複数インスタンスが残った場合はランダムに終了する。

###Auto Scalingの設定プロセス

1. ALBの作成
2. ターゲットグループの作成
3. 起動するインスタンス設定
4. Auto Scalingグループ作成
5. Auto Scalingポリシー作成 or スケジュール設定

#ELBとAuto Scalingの設計ポイント

サーバーをステートレスに、つまり状態を保持しないように設計すること。
AZをまたがってインスタンスを配置する設計にすべき。

以下に単一障害点をなくすか、部分の障害は起こり得ることを前提として設計する。




#用語まとめ

###スケールアップ
インスタンスタイプを上げる。垂直にスペックを上げる。メモリやCPUの追加・増強

###スケールダウン
インスタンスタイプを下げる。垂直にスペックを下げる。メモリやCPUの削減・低性能化

###単一障害点（Single Point Of Failure、SPOF）
ある特定の部分が止まると全体が止まってしまう箇所のこと。

###スケールアウト
EC２インスタンスを水平に並べる。EC２インスタンスを複数並べ、その前段にロードバランサーを配置してリクエストを各インスタンスに分散させる。
処理する機器・サーバー台数を増加する。

###スケールイン
処理する機器・サーバー台数を低減する。

###スパイク
急激な負担増。

#参考
- [AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト (日本語) 単行本](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X)
- Udemy
API Gatewayのリソースポリシーでホワイトリスト設定を行う

特定のIPアドレスからのみ接続を許可する設定をしたく、API Gatewayのリソースポリシーを利用して、ホワイトリスト設定を試したのでその際のメモを残しました。


### 設定手順
1.API Gateway ＞ APIを選択　＞　リソースポリシーを選択
2.リソースポリシー欄に以下を記載

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "< リソース>リソースを選択>メソッドリクエストに記載のARNをコピーして貼り付ける>",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<ここに許可したいIPアドレスを記載>"
                }
            }
        }
    ]
}
```
3.保存ボタンをクリック
4. リソース ＞ アクション ＞ APIのデプロイ ＞　デプロイされるステージを選択 ＞ デプロイ
Redashのダッシュボード変更権限を付与

Redashのダッシュボードやクエリは、adminや所有者以外に変更することができません。
これは、同じグループに所属していようが変わりません。

個別のユーザに変更権限を付与することはできるので、その方法を記載します。

# 環境
Redash 8.0.0+b32245 (a16f551e)

# 仕組み
Redash の `access_permissions` テーブルにレコードを追加することで実現できます。
PostgreSQLを直接触るのは嫌なので、 `AccessPermission.grant` を使うことでレコードを追加します。

# ここでやること

あるユーザ(old_user)が保持するダッシュボードの変更権限を別のユーザ(new_user)へ付与する。

# やりかた
Redash で shell を開く。

```shell:/opt/redash
docker-compose exec server ./manage.py shell
```

以下をコピペする。

```python
#
# ./manage.py shell
#
from redash.models.users import AccessPermission, User
from redash.models.base import db
from redash.models import Dashboard
from redash import permissions

from contextlib import contextmanager

old_user = User.get_by_id(5)
new_user = User.get_by_id(2)

def grant_dashboards():
    all_dashboards = Dashboard.all(
        old_user.org,
        old_user.group_ids,
        old_user.id,
    )
    not_exists_dashboards = not_exists_obj(all_dashboards)
    grant(not_exists_dashboards)

def not_exists_obj(objects):
    return [
        obj for obj in objects
        if not AccessPermission.exists(obj, permissions.ACCESS_TYPE_MODIFY, new_user)
    ]

@contextmanager
def grant(objects):
    try:
        for obj in objects:
            # !!! grantee == grantor
            AccessPermission.grant(obj, permissions.ACCESS_TYPE_MODIFY, new_user, new_user)
        db.session.commit()
    except Exception:
        db.session.rollback()
        raise

grant_dashboards()
```

grantorをnew_userにしているが深い意味はない。
https://github.com/getredash/redash/blob/004bc7a2ac0de041907ab0b9b560151ea7057332/redash/models/users.py#L332


# ちなみに
クエリも前述したものと同等のことで実現することができる。
また、設定(`/settings/organization`)より`Enable experimental multiple owners support`を有効にすることで、クエリの編集画面よりユーザに権限付与することができる。
【npx webpack】No valid exports main found for　でエラー

#【原因】Node.jsのバージョンが古い
Node.jsのバージョンが古い事が原因

僕の場合は```v13.5.0``` でした。

そこでまずは、[こちら](https://phoenixnap.com/kb/update-node-js-version)の記事のオプション2を参考にnpmを使用して更新しました。

①まずnpmキャッシュをクリアします

```
npm cache clean -f
```

②続いて、バージョンマネージャーのnをインストール

```
npm install -g n
```

③最新の安定バージョンをインストールします。

```
n stable
```

④ここで、Nodeのバージョンを確認してみます。

```
node -v

v14.15.1
```

これで、バージョンが変わっていればOKなのですが、僕の場合はバージョンに変化なしでした。

#【原因】リンク先
続いては、[こちら](https://mebee.info/2019/10/12/post-1793/)の記事を参考に

リンク先を変更してみました。

```
ln -snf /usr/local/bin/node /usr/bin/node

.....Operation not permitted
```

とエラー。

今度はこちらを解決していきます。

#【原因】SIP（System Integrity Protection）によって、操作の制限がされている
細かい手順は、[こちら](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)の記事がわかりやすかったので参考にしていただければと思います。

```
node -v
v14.15.1
```

これで解決です。

#参考
[How To Update Node.Js To Latest Version {Linux, Windows, And MacOS}
Posted January 29, 2020  WINDOWS LINUX MAC NODEJS NPM](https://phoenixnap.com/kb/update-node-js-version)

[nコマンドを使用してnode.jsをバージョンアップする](http://yucatio.hatenablog.com/entry/2019/12/06/081900)
VSCodeでGitHubの認証ダイアログが毎回出るようになった

VSCodeとGitHubを繋げていたら、何故か突然認証ダイアログが毎回出るようになってしまった。
ターミナルから以下のコマンドを打ったら解決した。

```shell
git config credential.helper store
```

(Windows10環境)



↓ こっちでも良いっぽい

```shell
git config --global credential.helper wincred
```
can't connect to local mysql server through socket '/tmp/mysql.sock' (2) への対処



##docker-compose上でrailsとmysqlを使ったwebアプリケーションをherokuを利用してデプロイする時にはまったエラーへのアプローチを忘れないための備忘録。##

なお、heroku　はターミナル からの操作ではなく、heroku のwebサイト上で操作する。

エラーではsocketである'/tmp/mysql.sock'が見つからないと言われているが、明らかに存在しているし、gitignoreにも入ってはいない。

念のため、rails側でのデータベースの設定として、これが必須かは分からないが、下記のsocket:の部分を追記した。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost
  socket: /tmp/mysql.sock ←ここ

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

##だとしたら、heroku側での設定が間違えていると思いdbと接続するのに必要なherokuの環境変数をいじってみることにする。##
これにいいヒントをくれたのが
https://xyk.hatenablog.com/entry/2014/09/29/184727
の記事である。

ただし、今回はターミナル上からではなく、herokuのwebサイト上から操作する必要がある。ターミナルからの操作もやってしまってめちゃくちゃになってしまったので、ここで闇雲に記事通りに進めればいいということでもないと学んだ、、、

###まず、herokuのwebサイト上からそもそもcleardbのダウンロード、インストールをしなければいけない。###
これは、herokuのサイト上のResourcesのadd-onsから探してあげれば良い。

![4E2D0806-FF15-4940-8164-409484F0A3F6_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675858/6c04eee7-005d-22dd-71de-c3e82bde01b3.jpeg)

次に上記画像のcleardb_database_url と database_url(多分最初はないから作る)　の部分をそれぞれ自分の場合 mysql2　を使用しているのでそのように変更する。valuesの部分はcleardb_database_urlの場合はadd-onでインストールした時に自動的にできている。database_urlの場合はcleardb_database_urlのものをコピペしてあげれば良い。


これでできた。
gitconfigのsystemにデフォルトで設定されているalias

小ネタというかただのメモ。ちなみにMacだと `/usr/local/git/etc/gitconfig` にsystemのgitconfigがあります。

## git config --syetem --list で出るalias部分
Gitをサイトからダウンロードしたときに設定されているalias。パッケージマネージャ経由だと設定されていない？ようなので`[alias]`の部分だけメモ。結構便利でよく使っている。

```sh
[alias]
	s = status
	a = !git add . && git status
	au = !git add -u . && git status
	aa = !git add . && git add -u . && git status
	c = commit
	cm = commit -m
	ca = commit --amend # careful
	ac = !git add . && git commit
	acm = !git add . && git commit -m
	l = log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'
	ll = log --stat --abbrev-commit
	lg = log --color --graph --pretty=format:'%C(bold white)%h%Creset -%C(bold green)%d%Creset %s %C(bold green)(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
	llg = log --color --graph --pretty=format:'%C(bold white)%H %d%Creset%n%s%n%+b%C(bold blue)%an <%ae>%Creset %C(bold green)%cr (%ci)' --abbrev-commit
	d = diff
	master = checkout master
	spull = svn rebase
	spush = svn dcommit
	alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort
```

`git alias`で設定されているalias(systemだけでなくglobalやlocalの設定も含む)が表示されるので便利です。あとはgit log系も色付けされていたりツリー表示されていたりとよく使います。

全体はこれ

```sh

[core]
	excludesfile = ~/.gitignore
	legacyheaders = false # >git 1.5
	quotepath = false

[user]
#	name = your name
#	email = your@name

[mergetool]
	keepBackup = true

[push]
	default = simple # [ matching | simple ]

[color]
	ui = auto
	interactive = auto

[repack]
	usedeltabaseoffset = true # >git 1.5

[alias]
	s = status
	a = !git add . && git status
	au = !git add -u . && git status
	aa = !git add . && git add -u . && git status
	c = commit
	cm = commit -m
	ca = commit --amend # careful
	ac = !git add . && git commit
	acm = !git add . && git commit -m
	l = log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'
	ll = log --stat --abbrev-commit
	lg = log --color --graph --pretty=format:'%C(bold white)%h%Creset -%C(bold green)%d%Creset %s %C(bold green)(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
	llg = log --color --graph --pretty=format:'%C(bold white)%H %d%Creset%n%s%n%+b%C(bold blue)%an <%ae>%Creset %C(bold green)%cr (%ci)' --abbrev-commit
	d = diff
	master = checkout master
	spull = svn rebase
	spush = svn dcommit
	alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort

[include]	# as of 1.7.10 https://github.com/git/git/commit/9b25a0b52e09400719366f0a33d0d0da98bbf7b0
	path = ~/.gitcinclude
	path = .githubconfig
	path = .gitcredential

#[github]
#	user =
#	token =

[diff]
	# git does copy/rename *detection*. if you want it to track copies/renames:
	# http://stackoverflow.com/questions/1043388/record-file-copy-operation-with-git
	# renames = copies

[diff "exif"]
	textconv = exif
[credential]
	helper = osxkeychain
```
You need to resolve your index first

git branchマージがエラーとなって、他のブランチに切り替えたい時、こんなエラーメッセージが出ます。

「You need to resolve your index first.」

もしchangesファイルcommitしない時、
commit必要があれば、commitをクリックして、
逆に、全てのファイルはDiscard changeを行います。

続きまして、Terminalを開いて、コマンドします。
まずは自分のプロジェクトの格納場所を探して開いて

```
cd gitProject
git checkout gitBranch
git reset --merge
```

そうしたらば、Switch branchできます。

以上です。備忘録として書きます。
SQLデータ取得応用編

# SQLデータ取得の応用

## 記事の概要
+ テーブル同士を結合する際の方法について学習した内容をまとめた。
+ 集計関数やグループ化についても簡単にまとめている。

###  複数のテーブルを結合する方法
+ 基本的な結合方法はSELECT,FROM,JOIN,ONを次のように記述して結合する。
+ ON句で結合条件はテーブルXの外部キーとテーブルYのIDを使って指定するのが一般的。
+ 
` テーブルX.外部キー(ID) = テーブルY.ID`

```sql:terminal
SERECT <'列名'>
FROM <'テーブル名X'>
JOIN <'テーブル名Y'>
  ON <'テーブルXとYの結合条件'>;
```

### テーブルの左外部結合(JOIN)
+ 結合するための対象データが存在していない時に使われるJOINの記法。
+ テーブルYに参照先のデータがない時は`NULL`として表示される。

```sql:terminal
SELECT <'列名'>
FROM <'左 テーブル名 X'>
LEFT OUTER JOIN <'右 テーブル名 Y'>
  ON <'テーブルXとテーブルYの結合条件'>;
```
### テーブルの右外部結合(JOIN)
+ 左外部結合と似た方法で、指定した右テーブルの全行を出力する。
+ 左外部結合の記法と異なるのは`LEFT OUTER JOIN`が`RIGHT OUTER JOIN`に変わっている点だけ。

```sql:terminal
SELECT <'列名'>
FROM <'左 テーブル名 A'>
RIGHT OUTER JOIN <'右 テーブル名 B'>
   ON <'テーブルAとテーブルBの結合条件'>;
```
### テーブルの内部結合(INNER JOIN)
+ どちらかのテーブルにデータが存在していないときは対象のレコードを表示させない方法。
+ 内部結合の記法はJOIN句の前にINNERをつけるだけ。

```sql:terminal
SELECT <'列名'>
FROM <'左 テーブル名 X'>
INNER JOIN <'右 テーブル名 Y'>
   ON <'テーブルXとテーブルYの結合条件'>;
```

### 出力対象を集計する`集計関数`
+ SQLの機能である`関数`を使って取得するデータを加工する方法である。
+ 代表的な集計関数一覧↓ <br>
`SUM` → 列の合計値を求める。<br>
`MAX` → 列の最大値を求める。<br>
`MIN` → 列の最小値を求める。<br>
`AVG` → 列の平均値を求める。<br>
`COUNT` → 個数を求める。

### 行のグループ化(GROUP BY)
+ 特定のグループごとに集計してデータをまとめたいときに使う方法。
+ GROUP BYという構文を使ってグループに基づく集計結果を取得することが可能。

```sql:terminal
SELECT <'列名'> FROM <'テーブル名'> WHERE <'絞り込む条件'> GROUP BY <'グループ化する列名'>;
```
#### グループ化したデータをさらに限定するHAVING
+ 集計関数で取得した結果に他してさらに絞り込むための条件を追加する方法。

```sql:terminal
HAVING <'集計関数での結果に対する条件'>;
```

### まとめ
+ テーブル同士を結合することによったやや応用的なデータ取得方法について具体的な記法を交えて記載した。
+ SQLに用意されている集計関数を使うことで、様々な便利な機能が使える。
+ 行をグループ化することによって、特定のグループごとに集計して、結果を求めることができる。
ソートの関数を使わずに配列を並び替える「バブルソートアルゴリズム」

#課題
下のようなGETポストが渡ってきたと仮定し、それをソート関数を使わずに小さい順に並び替えるという機能をPHPで作る学習で試行錯誤したのでその跡を残しておきたく。

```
http://localhost:10080/index.php?array=3,2,1,4,15,18,13,99,77,66,1,100,0
```

バブルソートというアルゴリズムでこれが実現できます。バブルソートとは、一つのループの中にもう一つループを作り、内側のループで隣り合う数字の大小を比較して並び替えていくことで、配列全体を並び替えます。[Wikipediaの説明](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)がわかりやすいです。

#実装

```PHP
<?php
$array = explode(',', $_GET['array']); //explode()はExcelの「区切り」みたいなもの

$count = count($array);
for ($i = 0; $i < $count; $i++) {
  for ($n = 1; $n < $count; $n++) {
    if($array[$n-1] > $array[$n]) {
      $temp = $array[$n]; //右隣の方が大きかったらその右の数字を$tempに逃がす
      $array[$n] = $array[$n-1]; //左側を右側に代入
      $array[$n-1] = $temp; //逃がしていた右側を左側に代入
    }
  }
}
print_r($array);
?>
````
アルゴリズムとは関係のない、PHPの復習ですが、[`$_GET`](https://www.php.net/manual/ja/reserved.variables.get.php)はPHPの定義済みの変数で、URLで渡されたパラメータ（クエリストリング、クエリ文字列と同義）を受け取ります。参考→[URLパラメータ](http://e-words.jp/w/URL%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF.html)
$_GETにはPHPの関数[`urldecode()`](https://www.php.net/manual/ja/function.urldecode.php)が処理してから値が渡されるようです。

###結果
この通り並び替えられています↓
![スクリーンショット 2020-08-22 18.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/bc333a25-70c5-c681-cd84-1cb69bf78bc4.png)

#改善
`$n-1`が何回も出てくるのが気になったので、こうしてみました↓
きちんと同じ結果が得られます。

```PHP
$count = count($array);
for ($i = 0; $i < $count; $i++) {
  for ($b = 1; $b < $count; $b++) { //右隣の数字を$bとする
    $a = $b-1; //←左隣の数字を$aとする
    if($array[$a] > $array[$b]) {
      $temp = $array[$b];
      $array[$b] = $array[$a];
      $array[$a] = $temp;
    }
  }
}
```

#余談
試行錯誤の跡として、こちらが最初にトライしたコーディングです。配列の中から一番小さい値を探して別の変数に代入し、その値を元の配列から削除するというものです。これだと同じ数が複数個あった場合（今回だと1が2回ある）、その数は1個しか取り出せませんでした。
`http://localhost:10080/php-pre-challenge2/index.php?array=3,2,1,4,15,18,13,99,77,66,1,100,0`

```PHP
<?php
$array = explode(',', $_GET['array']);

$sorted_array = [];
$count = 0;
while ($count < count($array)) {
  $tmp = null;
  foreach ($array as $key => $value) {
    if (in_array($value, $sorted_array)) continue;
    if ($tmp === null) {
      $tmp = $value;
    } else {
      $tmp = min($tmp, $value);
    }
  }
  $sorted_array[] = $tmp;
  $count++;
}

print_r($sorted_array);

?>
```
結果↓　ご覧の通り`1`が一つしか取り出せていません。
![スクリーンショット 2020-08-22 18.16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/80bff7a8-5c05-612b-7ca2-50a509ce9fcd.png)

ご指摘などあれば、コメントにてお願いします！
goのjson.Marshalで空のオブジェクトが返ってくる時の解決法

# 空のオブジェクトが入るとき
``` golang
func A() string {
	type ResponseData struct {
        //先頭が小文字なので公開されてない
		name  string
		value int64
	}
	var rd []ResponseData
    rd = append(rd,ResponseData{
        name:"aaa",
        value:1
   })
	resRaw, _ := json.Marshal(rd)
	resultJSON := string(resRaw)
	return resultJSON
}

```
ResponseDataのフィールドが公開されていません。
これをすると、resultJSONに[{}]←こんなんが入ります。

# OKなやつ
``` golang
func A() string {
	type ResponseData struct {
        //先頭が大文字なので公開されている
		Name  string
		Value int64
	}
	var rd []ResponseData
    rd = append(rd,ResponseData{
        Name:"aaa",
        Value:1
   })
	resRaw, _ := json.Marshal(rd)
	resultJSON := string(resRaw)
	return resultJSON
}

```

こうするとResponseDataのフィールドがエクスポートされているので、結果的にresultJSONにちゃんと値が入ります。
MYSQL_データベース作り直す手順

肥大化問題
--
1.　データベースのバックアップを取得
　　E:\MySQL\bin\mysqldump.exe -u root -prootpw my_db > E:\dumps\dump.sql

2.　MySQLサービスの停止
3.　my.iniファイルの設定（保存場所：E:\MySQL\my.ini）
　　my.iniを開き、[mysqld]の下に下記の設定を追加
　　********************************************
　　# File-Per-Table モードの有効化
　　innodb_file_per_table=1
　　#ibdata1ファイルの上限を1Gに設定
　　innodb_data_file_path = ibdata1:1G
　　********************************************
　　この設定により、データベースの保存はibdata1への共有保存からテーブルごとの保存に変更されます。
　　すでに変更された場合は、手順3をスキップしてください。       
            
4.　ibdata1、ib_logfile0、ib_logfile1を削除（保存場所：E:\MySQL\data\ibdata1）
5.　MySQLサービスの再開
6.　バックアップからのリストア
　  E:\MySQL\bin\mysql.exe -u root -prootpw my_db < "E:\dumps\dump.sql"

DB保存場所をCドライブからEドライブに変更
--
1.　MySQLサービスの停止
2.　my.iniファイルの設定（保存場所：E:\MySQL\my.ini）
　　my.iniを開き、[mysqld]の下に下記の設定を変更
　　******************************************** 
　　#Path to the database root
　　#datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
　　datadir="E:/MySQL/Data/"
　　********************************************
4.　"C:/ProgramData/MySQL/MySQL Server 5.5/Data/"のデータをすべて"E:/MySQL/Data/"にコピー 
5.　MySQLサービスの再開
高位合成言語アセンブラを作る。 その11

#概要

高位合成言語アセンブラを作る。
全加算器を作った。
nビット加算器メーカーを作った。

#閃き

generateでつくれるんじゃね。

#成果物

https://embed.plnkr.co/plunk/1lDOTjt6BXnfAsrc

#iverilog実行結果


```

   x +    x =   x
  12 +  100 = 112
 127 +  127 = 254
 180 +   50 = 230
 255 +    1 =   0
  10 +   10 =  20


```

以上。
MacbookをBig Surにしたら印刷で文字のみ抜け落ちるようになった


## 症状

- 英字、日本語問わず抜ける
- PDF, Excel, Wordなど関係なしに全ての印刷で同じ症状
- 文字以外の印刷やレイアウトは正常
- Big Surにアップデート後に今まで正常だったプリンターから問題が発生

## 解決

### 施策1

[ここが参考になりました](https://developer.apple.com/forums/thread/659591)
システム環境設定→プリンタとスキャナ→右クリックして「プリンタシステムをリセット」を押す
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256466/6b55b4e6-c297-3f5e-3e15-c4cc9e5e9b29.png)

リセットするとプリンタが消失するようで、再度追加が必要となる

### 施策2

登録時のプロトコルが正しいか、複数試して検証する（IPP, LPD等）

### 施策3

Canon謹製のソフトウェアをインストール
https://cweb.canon.jp/drv-upd/lasershot/lslxmacosx9.html
Windows版ですとそのままプリンタを探索して追加までやってくれるのですが、Mac版は追加の仕方が分からない状態のまま、IP直打ちで追加し解決してしまいました。

複数の施策を同時に行ってしまい、決定打が何かは未確定です。誰かのご参考になれば。
DockerでPythonにてGDALを利用する

# 概要

geotiffを利用する際に、少しハマったので、備忘録。

結論から言うと、Pyhonにおける「GDAL」ライブラリと「libgdal-dev」のバージョン対応が間違っていたことが原因でした。
**apt標準リポジトリにおいて管理される安定版「libgdal-dev」はv2.4.0です（2020年11月19日現在）。これにより、pipにて単純に「pip install GDAL」とするとv3.2.0がダウンロードされますが、v3.2.0に対応する「libgdal-dev」はv3.2.0以上必要です**。~~そのため、インストールする際は「**pip install GDAL==2.4.4**」とし、バージョン指定する必要があります~~。「no module named _gdal_array」が出たため、修正。「**pip install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="-I/usr/include/gdal"**」としないと、gdal_arrayが上手く入らない様子。
この辺りを踏まえたdockerfileなどを以下に記載します。


# 前提条件

ここでは、以下のことを考えています。

- dockerを利用し、環境を使いまわせるようにする。
- あまりanacondaは好きじゃない
- Pythonを利用するのは、学習コストが低いため
- docker-composeはあくまで動作テスト用に記載
- コード変更がきくようにボリュームを設定
- 特にこだわらないので、ベースイメージは「python:3.8」（多分OSはDebian）

# 構造

```
/
|-/app
| |-/image # tifファイルを入れる
| |-test.py # テストコード
| '-Dockerfile
'-docker-compose.yaml 
```


# Dockerfile/docker-compose.yaml

```dockerfile:Dockerfile
FROM python:3.8

ENV APP_HOME /app
WORKDIR $APP_HOME

RUN apt-get update && apt-get install -y tzdata \
    libgdal-dev

RUN pip install --upgrade pip
RUN pip install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="-I/usr/include/gdal"

CMD ["python", "/app/test.py"]

```

```yaml:docker-compose.yaml
version: "2"
services:
  test:
    container_name: "test"
    build:
      context: ./app
    volumes:
      - ./app:/app
```


# テスト

テストコードは以下の通り。

```python:test.py
from osgeo import gdal, gdalconst

if __name__ == "__main__":
    print("gdal version", gdal.VersionInfo())
    file_name = '/app/image/1_index_ndvi.tif'
    src = gdal.Open(file_name,
                    gdalconst.GA_ReadOnly)  # tifの読み込み (read only)
    print(type(src))  # "osgeo.gdal.Dataset"

```

実行は、docker-composeを使用しているので、以下の通り。

```shell
docker-compose up
```

# おわりに

結構こういうことってよくありますね。ライブラリの最新バージョンを利用する場合は、debianだとパッケージがなかったりするので、ubuntuで環境構築する必要があったりしますし（ubuntuだとリポジトリ登録すればtestバージョン利用できることが多いイメージ）。基本的にある程度データが読める状態にさえなってくれれば、あとは自分で数値処理した方が早いので、stable版で十分だと思います。

# 参考

- Import error: no module named _gdal_array：[https://gis.stackexchange.com/questions/153199/import-error-no-module-named-gdal-array](https://gis.stackexchange.com/questions/153199/import-error-no-module-named-gdal-array)