OmniAICreator/Qiita-1.07M huggingface dataset:
resource resourcesって何が違うの？？


## Railsルーターの目的
そもそもルーティングは何をしてるんや。という話。
Railsのルーターは受け取ったURLを認識し、適切なコントローラ内アクションやRackアプリケーションに割り当てます。ルーターは、ビューでこれらのパスやURLを直接ハードコードすることを避けるためにパスやURLを生成することもできます。

つまり受け取ったURLを捌いて指示を出す、司令塔ですよってこと。

## resources　と　resource　の違い
①URLにidを必要とするかしないのか
②resourceの場合単数なので、一覧みたいな概念はなく、indexが作られない

## resources　複数
リソースをいくつも定義しなければならない場合は、以下のように簡単にわかりやすくできる。get,new,create,edit,update,destroy,showがresourcesでまとめられる！(only、exceptで限定することも可能)

    resources :photos, :books, :videos
上の記法は以下と完全に同一です。

    resources :photos
    resources :books
    resources :videos

ポイントとしては、リソース名がbooks、photosのような複数形になっていることにも注意
リソースが複数なのでidを持たないと識別できない

## resource　単数
>ユーザーがページを表示する際にidを一切参照しないリソースが使われることがあります。たとえば、/profileでは常に「現在ログインしているユーザー自身」のプロファイルを表示し、他のユーザーidを参照する必要がないとします。このような場合には、単数形リソース (singular resource) を使ってshowアクションに (/profile/:idではなく) /profileを割り当てることができます。

    get 'profile', to: 'users#show'

## 結局どういうこと？

### ①URLにidを必要とするかしないのか
下記のようにresourcesが複数だとidが必要
resourceが単数だとidは要らない。

    /mobile/posts/:id(.:format) 　←postは何個も存在するためidが必要 
    /mobile/profile/edit(.:format) ←profileは一つしか存在しないため、idがいらない


### ②resourceの場合単数なので、一覧みたいな概念はなく、indexが作られない

```routes.eb
resource :users
```

生成されるルーティング

``` 
 new_users GET    /users/new(.:format)  users#new
edit_users GET    /users/edit(.:format) users#edit
     users GET    /users(.:format)      users#show
           PATCH  /users(.:format)      users#update
           PUT    /users(.:format)      users#update
           DELETE /users(.:format)      users#destroy
           POST   /users(.:format)      users#create
```

## 参考文献
https://railsguides.jp/routing.html#%E5%8D%98%E6%95%B0%E5%BD%A2%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9

https://qiita.com/ryuuuuuuuuuu/items/e5960c7fecad4ef1301b
Oracle 直近で実行したSQLの処理時間を調べる

#はじめに
Oracleで運用しているとどのSQLがCPUを喰っているか知りたいことが良くあります。
そこでツールを使わずSQLだけで直近のSQLの実行状況を調べる時の手順を書いてみます。

#概要
実行状況はv$SQLを参照しています。
ある時点でのv$SQLのスナップショットを別テーブルに記録し、そこからの差分を表示します。
※ここで言うスナップショットはオラクルの機能名では無く、その瞬間の記録と言う意味で
　使っています。実態は単なるテーブルです。

#実行手順
- 管理者権限(SYS,SYSTEM）でログインします。
- スナップショットを作成します。

```SQL
-- 既存スナップショットを削除（1回目は存在しないのでエラーとなる）
drop table execbase; 
-- スナップショット作成
create table execbase as 
select cpu_time,elapsed_time,executions,sql_id,child_number,sysdate dt from v$sql;
```
- 差分取得

```SQL
--スナップショット取得時からの実行状況の差分表示
--CPU使用時間の多い順に表示
select
trunc((v.cpu_time-nvl(b.cpu_time,0))/1000) "cpu_dif(ms)",
trunc((v.elapsed_time-nvl(b.elapsed_time,0))/1000) "elapsed_dif(ms)",
v.executions-nvl(b.executions,0) exec_dif,
trunc(v.cpu_time/v.executions/1000) "cpu_per(ms)",
trunc((sysdate-b.dt)*86400) "keika(s)",
v.module,
u.username,
v.sql_fulltext
from execbase b,v$sql v,dba_users u
where v.sql_id=b.sql_id(+)
and v.child_number=b.child_number(+)
and v.executions > 0
and v.cpu_time > nvl(b.cpu_time,0)
and v.parsing_user_id=u.user_id
order by 1 desc;
```
#出力項目の見方
|項目名|内容|単位|
|-----|----|----|
|cpu_dif(ms)|CPUの消費量合計|ミリ秒|
|elapsed_dif(ms)|経過時間合計|ミリ秒|
|exec_dif|実行回数|回|
|cpu_per(ms)|1回当たりのCPU消費量|ミリ秒|
|keika|スナップショットを取得してからの経過時間|秒|
|module|SQLを実行したプログラム名|-|
|user_name|SQLを実行したID|-|
|sql_fulltext|SQL文|-|

#アレンジ
- order by 句を変えると1回当たりのCPU消費量準、実行回数順など変更できます。
- and v.executions > 0 の値を変えるとxx回以上実行したSQLを抽出できます。
- その他目的に合わせて色々アレンジしてください。
[スキーマチェックに関する質問]xsdによってxmlを検証し、複数エラーメッセージを返却値として受け取りたい

# はじめに
初めまして、エンジニア歴1年目で最近C#を触り始めたものです。
早速ですが、1週間ほど悩んで解決できないことがあるので質問させていただきます。

# 使用環境及び言語
Microsoft Visual Studio 2019でC#を使用しております。

# 実現したいこと
実現したいこととしましては下記になります。

1.xsdによるxmlの検証(これはおそらくできている)
2.エラーが出た場合、エラーメッセージをArrayList型に設定し、返却値として渡す（すべてのエラーを設定したい）

# 現在の状況
xsdによってxmlを検証し、コンソールにエラーメッセージを出すところまでは調べれば出てきたのですが、
・複数のエラーが起きた時に最初のエラーのみが表示される点
・実際にはコンソールに表示するのではなく、エラーメッセージをArrayList型に設定し返却値とする点
以上の二点が現在実装できていない状況です。

以下、現在のソースコードです。（xmlファイル、xsdファイルについては適当なものをローカルに保存し、ファイルパスを渡しています）

```cs


        private ArrayList xmlCheck(string xmlFilePath, string xsdFilePath)
        {
            //xsdファイルパスから型変換
            XmlTextReader reader = new XmlTextReader(xsdFilePath);
            XmlSchema xmlschema = XmlSchema.Read(reader, ValidationCallback);
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            schemaSet.Add(xmlschema);

            // XMLファイルとXSDファイルを設定する。
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Schemas.Add(schemaSet);
            xmlDocument.Load(xmlFilePath);
            try{
                //スキーマチェック
                xmlDocument.Validate(ValidationEventHandler);
                
                //仮の返却値
                return null;
            
            //xsd等の規約に対する例外？（そもそも必要？）
            }catch(XmlSchemaValidationException ex)
            {
                 //エラーあり（true）を返却
                return ex;
            }
        }

        private void ValidationCallback(object sender, ValidationEventArgs e)
            {
                switch (e.Severity)
                {
                    case XmlSeverityType.Error:
                        Console.WriteLine("Error:" + e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning:" + e.Message);
                        break;
                }
            }

        private void ValidationEventHandler(object sender, ValidationEventArgs e)
            {
                switch(e.Severity)
                {
                    case XmlSeverityType.Error:
                        //errorInfoList.Add(e.Message);

                        Console.WriteLine("Error:" + e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning:" + e.Message);
                        break;
                }                   
            }
```
        
    

# 終わりに
以上が私の質問になります。解答だけでなく分かりにくい点や、もっと情報が欲しい場合等も対応したいと思うので、そういった指摘でもございましたら是非よろしくお願いします。

***2020/07/01追記　上記解決しました　コード自体は問題なくイベントハンドラの理解不足でListに格納する度に初期化してました***
raspberrypiとESP32を使った自分でIoTプラットホーム作成(その2)~ESP32設定編Lチカ

#ESP32の設定
家に転がっていたESP32の動作確認をしました。
Arduino-IDE ver1.8.10を使ってESP32ボードを認識させて下記コードを実行します。
LEDが点滅したら成功です。LEDの+と接続するpinの場所は任意です。

ちなみにLEDが壊れていて2回目で成功しました。

```
void setup() {
  // put your setup code here, to run once:
  pinMode(33,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(33,HIGH);
  delay(500);
  digitalWrite(33,LOW);
  delay(500);
}
```
PowerShellメモ

#基本知識

```Infomation
$hoge.document
#オブジェクト.プロパティ(情報)

$hoge.getElementById
#オブジェクト.メソッド(操作)
```

#困ったこと①
###".getElementById"が使えない！
"getElementById"はC言語で言うライブラリ関数のようなもので、デフォルトで使えるわけではない。

【原因】
getElementByIdを使用する場合は「管理者権限で実行する」必要がある。

【解決法】
.ps1ファイルを実行するbatファイルを作成すればよい

```AutoLogin.bat
@echo off
powershell -File (.ps1ファイルの絶対パス) -verb runas
exit
```
powersehllの演算子

# powershellで置換をする
unixでsed -e "s/aa/bb" xx.txtをpowershellでやる。

#答え
<pre>
 (cat xx.txt) -replace "aa","bb"
</pre>
まあこんな方法で可能。

このreplaceは正規表現も受け付けるので
<pre>
 "abcde" -replace ".+(\w\w)(\w\w)$","\`$2\`$1"
</pre>
結果="debc"
というような、ことも可能である。
$の前にエスケープ文字「\`」をつけるというのがミソですね。もちろん’’を
使えば、エスケープ文字「`」はいらない。

#その他
　-eq,-gt等のpowershell演算子はなじめないが
 -contains,in,like,match,split,joinとかもあって、ちょっと面白い
 使いこなせば、便利じゃないかと思った。

#参考 
[演算子](https://blog.shibata.tech/entry/2015/12/03/000000)
Node.jsを使ってHTTPサーバを作ってみる

#はじめに
この記事はなんとなくJSとかを勉強している学生がメモ代わりに書いているものです。内容は期待しないでください。

#1.仮想環境を構築する
今回はUbuntuで行うのでiTerm2で仮想環境を起動する。

起動したところで
1.Virtual Box(バーチャルボックス)
2.Vagrant（ベイグラント）
という2つのソフトウェアを使った仮想環境でUbuntuを使用します。
cd ~/vagrant/ubuntu
vagrant up
vagrant ssh

Ubuntuがインストールされたディレクトリに移動。vagrant upは仮想的なPCにインストールされたUbuntuを起動するコマンドで,vagrant sshはVagrantの仮想マシンがセットされている状態でSSHに接続します。

#2.プログラムのひな形(テンプレート)を用意する
ディレクトリ内に以下を記述します。
```yarn init
echo "'use strict';" > ファイル名
```

１行目はyarnで新しいプロジェクトを始める際に記述するものです。

#3.プログラムを書く
先ほど記述したファイルに以下を記述します。
```'use strict';
const http = require('http');
const server = http.createServer((request, response) => {
  response.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  });
  response.write(request.headers['なんでもいい']);
  response.end();
});
server.listen(8000, () => {
  console.log('Listening on 8000' );
});
```

１行目はJSをstrictモードで利用するための記述です。

２行目はhttpモジュールを引数httpに代入しています。

3~9行目はサーバに関する記述です。
引数に代入したhttpモジュールを使ってサーバを構築しています。記述方法は以下参照。
```http.createServer( サーバー側の処理 )
```
今回はサーバ側の処理でアロー関数を使用しており,引数の一つ目にはリクエストが二つ目にはレスポンスが代入されています。
```res.writeHead(200, {
  'Content-Type': 'text/plain; charset=utf-8'
});
```
このコードは200という成功を示すステータスコードと共に、サーバが扱う情報の設定をレスポンスヘッダを書き込んでいます。
７行目はwrite関数を使用してリクエストのヘッダーに文字列を表示しています。表示したい内容によっては以下のように書くこともできます。
``` res.write(
    '<!DOCTYPE html><html lang="ja"><body><h1>文字列</h1></body></html>'
  );
```
８行目はサーバの書き出しが終わったことを示しています。

10行目以降はサーバ起動するポートを8000としてlisten関数で特定のポートからリクエストがないかを永続的に調べています。今回はリクエストがあり次第コンソールで文字列を表示しています。

#4.サーバを起動してみる
以下を記述してREPLで動作を確認します。
```node　ファイル名
```
先ほどのコンソールの文字列が表示されたら成功です。お疲れ様でした!!

##yarnとは
yarnはnodeをインストールすると自動でインストールされるnpmと役割は同様のパッケージマネージャー(https://yarnpkg.com/en/)。　
並行処理でのインストールによってnpmよりも高速にパッケージをインストールできる。

##httpモジュールとは
「httpモジュール」はHTTPサーバーやHTTPクライアントとしての機能を構築するために使われます。自分のwebサイトをネット上に公開したり、フォームなどからデータを送受信できます。もちろん、静的なWebサイトだけでなくTwitterのような大きなWebサービスを構築することも可能になります。

##ポートとは(参照：https://www.nic.ad.jp/ja/basics/terms/port-number.html)
TCP/IP通信においては,IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが,該当コンピュータのどのプログラムに通信パケットを届けるかは,IPアドレスだけでは決定できません。どのプログラムに通信パケットを渡すのかを決定するために,ポート番号を使用します。
DjangoのMiddlewareでサイト攻撃を防ぐ処理を作成してみた

以下のコマンドでDjangoプロジェクトを作成

```
django-admin startproject MyObj01
cd MyObj01
python manage.py startapp App
```
作成したファイル構成ファイルは以下の通りです。

```
MyObj01
├── App
│   ├── migrations
│   │   └── __init__.py
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── MyObj01
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
```
MyObj01\Appの下、urls.pyを新規作成

```python:urls.py
from django.urls import path
from App import views

urlpatterns = {
    path('home', views.home, name='home'),

}
```
MyObj01\MyObj01中のurls.pyに以下のように追加

```python
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include(('App.urls', 'app'), namespace='app')),  # 追加
]

```
MyObj01\App中のviews.pyに以下のように追加

```python:views.py
from django.http import HttpResponse


def home(request):
    return HttpResponse('Home test')
```
MyObj01\Appの下、MyMiddle.pyを新規作成

```python:MyMiddle.py
import time
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.core.cache import cache  # Djangoのキャッシュ機能


class AppMiddle(MiddlewareMixin):
    def process_request(self, request):
        black_ip_list = cache.get('black_ip_list', [])
        ip = request.META.get('REMOTE_ADDR')
        if ip in black_ip_list:
            return HttpResponse('使用中止')

        ip_time_list = cache.get(ip, [])
        time_temp = time.time()
        # 60秒前の更新記録を削除
        while ip_time_list and (time_temp - ip_time_list[-1]) > 60:
            ip_time_list.pop()
        ip_time_list.insert(0, time_temp)
        cache.set(ip, ip_time_list, timeout=60)
        if len(ip_time_list) > 20:
            black_ip_list.append(ip)
            # 該当IPで一週間内使用不可とする
            cache.set('black_ip_list', black_ip_list, timeout=60 * 60 * 24 * 7)
        if len(ip_time_list) > 10:
            return HttpResponse('頻繫に更新しないでください')
```
MyObj01\MyObj01下のsettings.pyに以下のように追加

```python:settings.py
......

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App',  # 追加
]

MIDDLEWARE = [
    'App.MyMiddle.AppMiddle', # 追加 (一番最初に実行するように先頭に追加)
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

......

```
サーバーを起動(python manage.py runserver 127.0.0.1:8000)して、
60秒内、10回以上「http://127.0.0.1:8000/app/home」更新すると「頻繫に更新しないでください」というページが表示されます、
また、６０秒内、20回以上更新すると「使用中止」というページが表示されます。
#docker sync start ( unison ) がエラーで動かない ( MacOS Catallina 10.15.3  )( Error getting mapped port, exit code 0 )

# 解決

```
gem uninstall docker-sync
gem install docker-sync
docker-sync clean

( rm ~/.docker-sync-global.yml )

docker-sync start
```

https://github.com/EugenMayer/docker-sync/issues/540#issuecomment-372992379

# Error

```
$ docker-sync start
$ docker-sync start
          ok  Stopping sync container foo-bar-app
          ok  Starting unison for sync foo-bar-app
          ok  foo-bar-app container not running
          ok  starting foo-bar-app container
     command  docker start foo-bar-app && docker exec foo-bar-app supervisorctl restart unison
          ok  starting initial sync of foo-bar-app
     command  docker inspect --format='' foo-bar-app
     command  docker inspect --format='' foo-bar-app
       error  Error getting mapped port, exit code 0
     message  Template parsing error: template: :1:3: executing "" at <index (index .NetworkSettings.Ports "5000/tcp") 0>: error calling index: index of untyped nil
     command  unison -testserver /app_sync "socket://127.0.0.1:"

```

# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
docker sync の unison と rsync の違いは？ unison は双方向の同期で、rsync は ホストからゲストへの送信のみ。

のようです。


[Docker for Mac で遅いファイルマウントを何とかする - Qiita](https://qiita.com/Jason/items/a76df7cc7e7db16d90f7)

rsync で ゲストからホストにファイルを送るには、単純に docker cp すれば良いようです。

```
# Docker内のschema.rbをPC側に持ってくる
$ docker cp コンテナ:/var/www/db/schema.rb ./db/schema.rb
```

[Docker for Macが遅い問題をdocker-syncで解決する | Cluex Developers Blog](https://www.wantedly.com/companies/clueit/post_articles/43582?auto_login_flag=true#_=_)


# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[devise]値を配列の形で保存する

# 背景
deviseを使っている上で、配列の形でデータを送りたいと考えたが、なかなかやり方が見つからず苦労してやっと実装出来たので、備忘録や他の人の役に立てればと思い書きました。

## 実装方法
deviseのデフォルトで設定されたカラム以外を保存する際に以下のコードを書いてあげるが、
配列を渡す時は「:category_ids => []」のように空の配列を一緒に付けてあげればうまく保存されます。


```application_controller.rb

#中略
  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :self_introduction, :sex, :img_name, :category_ids => []])

    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :self_introduction, :sex, :img_name, :category_ids => []])
  end
#中略

```

すごく時間がかかりましたが以外と簡単だったことに驚きました。。
deviseはやはり便利な分難しいですね
【JavaScript本格入門】グローバル変数とローカル変数

こちらの技術書のスコープについてのまとめです。

- [改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%AE%E5%BF%9C%E7%94%A8%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/477418411X)

## グローバル変数とローカル変数の違い
- 関数の外で宣言した変数 → グローバル変数
- 関数の中で宣言した変数 → ローカル変数

```javascript:scope.js
var scope = 'Global Variable'; //グローバル変数

function getValue() {
  var scope = 'Local Variable'; //ローカル変数
  return scope;
}

console.log(getValue()); //結果: Local Variable
console.log(scope);      //結果: Global Variable
```

`getValue`という関数を入力するとその関数内で定義した`scope`という変数が、`scope`という変数そのものを入力するとグローバルで定義した変数`scope`が返される。

つまり、スコープが異なる場合、それぞれの変数は同名であっても別物として認識されている。

### 変数宣言にvar命令が必須な理由
```javascript
scope = 'Global Variable'

function getValue() {
  scope = 'Local Variable';
  return scope;
}

console.log(getValue()); //結果: Local Variable
console.log(scope);  //結果: Local Variable
```
また、**JavaScriptではvar命令を使わずに宣言された変数はすべてグローバル変数と見なす**。

そのため、ローカル変数として定義したつもりである`Local Variable`がグローバル変数とみなされてしまう。

上の例では最初にグローバル変数として定義した`scope`が関数内で定義した`scope`に上書きされる。

そのため、先ほどの例では`Global Variable`を返した`console.log(scope);`は関数内で定義されているはずの`Local Variable`を返す。

なのでローカル変数を定義する時には、必ずvar命令(もしくはlet, const)を使用する。

## ローカル変数の有効範囲
```javascript:scope.js
var scope = 'Global Variable';

function getValue() {
  console.log(scope); //結果: undefined
  var scope = 'Local Variable';
  return scope;
}
```

さっきとほぼ同じだが、ローカル変数定義前に関数内で変数`scope`を受け取ろうとすると、`undefined`となる。

理由として**JavaScriptのローカル変数は関数全体で有効であるため**、`console.log(scope);`時にはローカル変数を返そうとしてくれる。

しかし、ローカル変数が定義されているのは出力を試みた後なので、何も返されず、未定義として扱われる。

なのでローカル変数は関数の先頭で宣言する。

## ブロックスコープ
JavaScriptでは下記のようなものでも値を返せてしまう。

```javascript
if(true) {
  var i = 5;
}

console.log(i); //結果: 5
```

しかし、プログラミングの一般的なルールで「スコープは出来る限り限定すべき」というものがある。

そこでES2015から導入された`let`ではブロックスコープに対応できるようになった。

```javascript
if(true) {
  let i = 5;
}

console.log(i); //結果: エラー
```

同じく`const`もブロックスコープを持つ。

## まとめ
- スコープは出来る限り限定すべき。
- グローバル変数は出来るだけ使わない。(デバッグが困難になる)
- ローカル変数は関数の先頭で宣言する。
- if文やswitch文ではできるだけ`let`を利用する。
スマホでGASウェブアプリが縮小表示されてしまうときの対応

Google Apps Script とスプレッドシートを組み合わせた自分用の簡単なアプリを作った際に軽くハマったのでメモ。

## 現象

「ウェブアプリケーションとして導入」で作成した、
HTMLを返すアプリにスマホでアクセスした際に文字、要素が小さく表示され、閲覧、操作に支障が出た。

## 原因

`<meta name="viewport">` がないため、画面とコンテンツ幅があっていない。

## 解決

`addMetaTag()` でメタタグを設定する。

```CODE.gs
function doGet() {
  return HtmlService
    .createTemplateFromFile('Index')
    .evaluate()
    .addMetaTag('viewport', 'width=device-width, initial-scale=1');
}
```

ルートのHTMLに `<meta name="viewport" content="width=device-width, initial-scale=1">` が追加されてスマホでもウインドウ幅にあった表示がされた。

### 試したこと

HTML 側に直接 meta タグを書いても効果なかった

```Index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
```

## 参考

[Class HtmlOutput  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/html/html-output#addMetaTag(String,String))
raspberrypiとESP32を使った自分でIoTプラットホーム作成(その1)

#raspberrypiとESP32でIoTシステム
GWで時間があるので結構ハードル高いですが作ってみます。下記がゴールになります。
センサーやESP32はあるものを使います。
すべてローカルネットワークでのアクセルを考えています。

1.ESP32を使ってセンサー制御し、raspberrypiへwifiで測定値転送
2.raspberrypiをWebサーバーとデータベースサーバー作成
3.クライアントPCからrasberrypiへアクセスし異常値やグラフなどBIツールで可視化
【credentials.yml.enc】CircleCIに環境変数を登録する


#credentials.yml.encとは
`config/master.key`を使用して暗号化・複合される、アカウント名やパスワードといった環境変数を管理するファイル。

`master.key`は`Rails new`した際に`credentials.yml.enc`と一緒に生成される。





config/master.keyはgitignoreに最初から追加されているので設定する必要はありません。

#credentials.yml.encへの環境変数の登録
ターミナルで、

```shell
$ EDITOR=vim bin/rails credentials:edit
```

を行うと、このような内容がターミナルに表示される。

<img width="469" alt="スクリーンショット 2020-04-25 23.01.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/aa10dea7-37fa-d999-fb56-a2520992643f.png">

ここに、追加で登録

```shell:（例）
my_app
  api_key: a1b2c3~~~
  api_secret: 4d5e6g~~~
```

すこし慣れてきたが、最初はこのvimの操作にかなり癖を感じる。

-  **i**を押して挿入モード、追加入力
-  **esc**でノーマルモードに戻す
-  ノーマルモード時に**:wq**で保存して終了
-  ノーマルモード時に**dd**で1行削除
-  **$**で末尾に移動
などなど、、

##rails consoleで確認
`Rails.application.credentials.my_app[:api_key]`
等で登録が確認できる。


#CircleCIへの登録

><img width="102" alt="スクリーンショット 2020-04-26 0.24.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/2155c932-2747-dc29-d1cf-42cbf8b97bbf.png">
>この左側のJOBSをクリック



><img width="373" alt="スクリーンショット 2020-04-26 0.24.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/442f09d5-0454-7ebf-6851-5e03ea2f92e6.png">
>この歯車をクリック



><img width="375" alt="スクリーンショット 2020-04-26 0.29.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/1369c276-d347-dc58-3f62-36c9700b1729.png">
このEnvironment Variablesをクリック


><img width="375" alt="スクリーンショット 2020-04-26 0.29.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/8a02d387-cb17-015d-062a-c5690e1cbdc5.png">
Add Variableをクリック
NameにRAILS_MASTER_KEY
Valueに`config/master.key`の文字列


このRAILS_MASTER_KEYをCircleCIに登録すると、

```ruby
API_KEY = Rails.application.credentials.my_app[:api_key]
```

このような記述があれば、credentials.ymlをRAILS_MASTER_KEYで復号化して読んでくれる。







 
 
 
    
  


今までbash_profileに登録していましたが、これがあるとローカル環境でも`config/credentials.yml.enc`を作成して書いておくと、それを見て同じ動きをしてくれるので、必要ないですね。
##終わりに。

転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございます。
[Kotlin]data class

## はじめに
Kotlin勉強中の時にわからない単語などを調べてまとめていく

## 内容
data classがかなり便利そうなのでまとめる

値を持たせると自動で色々とやってくれるらしい。

1. equals, hashCode, toStringを自動で実装してくれる
2. componentNの並び順を自然にしてくれる

[引用](https://dev.classmethod.jp/articles/kotlin-everyday-7/)

``` data.kt
data class Person(val name: String, val age: Int)

  val person = Person("kamedon", 30)
  println(Person("kamedon", 30) == Person("kamedon", 30))
  println(Person("kamedon", 30) == person)
  println(Person("kamedon", 30) === Person("kamedon", 30))
  println(Person("kamedon", 30) === person)
```

``` notdata.kt
class Person(val name: String, val age: Int)

  val person = Person("kamedon", 30)
  println(Person("kamedon", 30) == Person("kamedon", 30))
  println(Person("kamedon", 30) == person)
  println(Person("kamedon", 30) === Person("kamedon", 30))
  println(Person("kamedon", 30) === person)
```

classではよしなにやってくれないからインスタンスにメンバーの値や参照元が同じかなどは判別してくれない。そのため、classの時は全部falseになる。

compornent1の時にインスタンスの1番目を返してくれるようになる
TortoiseSVNを完全にアンインストール

Windows環境でSVNを使う時によく利用されるTortoiseSVN。
通常通りにアンインストールしても情報がいろいろと残っているので
それらの残っている情報も消す方法を記載します。

環境はWindows10でTortoiseSVNのバージョンは1.13.1です。

# 手順
* アンインストール
* 再起動
* レジストリ削除
* ファイル削除

## アンインストール
Windowsのコントロールパネルから
__アプリ__ を開き、 __TortoiseSVN__ を選択し、アンインストールします。

## 再起動
アンインストーラが動きTortoiseSVNが削除されます。
ここでいったんOS再起動をしましょう。

## レジストリ削除
アンインストーラで削除したにもかかわらず、
レジストリにごみが残っています。
`Winキー + R` で __ファイルを指定して実行__ を開き `regedit` と入力して
__レジストリエディタ__ を開きます。

以下のキーが残っているので、このキー以下のサブキーも含めて削除します

```
コンピューター\HKEY_CURRENT_USER\Software\TortoiseSVN
```

## ファイル削除
エクスプローラを開き、以下のディレクトリが残っているので
ディレクトリごと削除します。

```
%APPDATA%\TortoiseSVN
%APPDATA%\Subversion
```

これでTortoiseSVNのアンインストールが完了です。
お疲れ様でした！

# おわりに

調べた限りでは消すべき対象はこれらなのですが、
もし他にもご存じでしたらコメントいただければ幸いです。
[kotlin]演算子のオーバーロード

## はじめに
Kotlin勉強中の時にわからない単語などを調べてまとめていく

## 内容
Kotlinは演算子をオーバーロードできる。

```sample1.kt
a + b 

-> a.plus(b)

operator fun plus(other: MyValue): MyValue {
  return MyValue(value + other.value)
}
```
`operator`修飾子をつけることで、演算子をオーバーロードできる

``` koans.kt
import TimeInterval.*

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)

enum class TimeInterval { DAY, WEEK, YEAR }

operator fun MyDate.plus(timeInterval: TimeInterval): MyDate = addTimeIntervals(timeInterval, 1)

class RepeatedTimeInterval (val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)
operator fun MyDate.plus(timeInterval: RepeatedTimeInterval) = addTimeIntervals(timeInterval.timeInterval, timeInterval.number)

fun task1(today: MyDate): MyDate {
    return today + YEAR + WEEK
}

fun task2(today: MyDate): MyDate {
    return today + YEAR * 2 + WEEK * 3 + DAY * 5
}
```

[参考](https://mahata.wordpress.com/2018/01/15/kotlin-%E3%81%AE%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AD%E3%83%BC%E3%83%89/)
2.1.5 動画 画像処理・解析のワークフロー：ストリーミング処理

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABによる動画処理のワークフローについて紹介します。




動画を逐次読み込みながらストリーミング処理が実現できます。


# 初期化
```matlab:code
clear; clc; close all; imtool close all
```
# 動画の読み出し、表示、書き出し用オブジェクト


動画の読込み・表示・書出し 用のシステムオブジェクトを定義します。


```matlab:code
% 動画の読み込み
vidReader = vision.VideoFileReader('tilted_face.avi', 'VideoOutputDataType','uint8'); 

% 表示
vidPlayer = vision.DeployableVideoPlayer;

% 書き出し (FileFormatでMJ2000やMPEG4も選択可能)
vidWriter = vision.VideoFileWriter('tmp_myFile.avi');
```
# 顔検出器を定義
```matlab:code
faceDetector = vision.CascadeObjectDetector();
```
# 1フレームずつ順に処理
```matlab:code
while ~isDone(vidReader)
   I = step(vidReader);       % 1フレーム 読込み
   
   %
   % ここに各種画像処理･解析 のコードを挿入 −−−−−−−−−
   %
   % 顔検出
   bbox = step(faceDetector, I);
   % 画像に追加
   Iout = insertObjectAnnotation(I,'rectangle',bbox,'Face');
   
   step(vidPlayer, Iout);        % 1フレーム 表示
   step(vidWriter, Iout);        % 1フレーム 書出し

end
```
# 生成したシステムオブジェクトをリリース
```matlab:code
release(vidReader);
release(vidPlayer);
release(vidWriter);
```
# 外部プログラムで動画の表示
```matlab:code
winopen('tmp_myFile.avi')
```



![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/8391379b-8440-ee08-4189-34565465d705.png)


# まとめ


MATLABによる動画処理のワークフローをご紹介しました。




基本的に1枚ずつ画像を読み出して処理するので静止画の処理と大きくは変わりません。


# 参考

   -  [シーン内の顔の追跡](https://jp.mathworks.com/help/vision/ug/track-a-face.html) 
   -  [KLT アルゴリズムを使用した顔の検出と追跡](https://jp.mathworks.com/help/vision/examples/face-detection-and-tracking-using-the-klt-algorithm.html) 


# 謝辞


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。



# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
Iteratorって何

## はじめに
Kotlin勉強中の時にわからない単語などを調べてまとめていく

## 内容
日本語訳
Iterator : 繰り返す

next(), hasNext()を実装する必要がある

next: 繰り返し処理で次の要素を返す
hasNext: 次の要素があるとtrue, ないとfalseを返す

``` sample.kt
class DateRange(val start: MyDate, val end: MyDate): Iterable<MyDate>{
	override fun iterator() : Iterator<MyDate> = DateIterator(this)
}

class DateIterator(val dateRange: DateRange) : Iterator<MyDate>{
    var current :MyDate = dateRange.start
    override fun next(): MyDate {
        val result = current
        current = current.nextDay()
        return result
    }
    override fun hasNext(): Boolean = current <= dateRange.end
}


fun iterateOverDateRange(firstDate: MyDate, secondDate: MyDate, handler: (MyDate) -> Unit) {
    for (date in firstDate..secondDate) {
        handler(date)
    }
}
```
Vue.js + NestJSデスクトップアプリ

Excel帳票を出力するツールを作る必要があったため、この機会にJavaScript (TypeScript) のみでデスクトップアプリを実装できないか検討した。

ネイティブアプリを作るのであれば定番はElectronだが、将来的にWebアプリ化することも考えて、Vue.js（フロントエンド）+ NestJS（バックエンド）という構成とし、nexeでパッケージ化している。

![システム構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186068/6ff25266-2349-52a7-415a-e07908993c43.png)

構成の検証目的のため、実装した機能はExcelファイルのエクスポート機能のみだが、GitHubにソースコードを載せている。

https://github.com/unhurried/vue-nest-desktop-app
ミスでテロをしないためのSelect文作成注意点

Select文は利用頻度が高いうえに、気を配るところが多い非常に難儀するものだと思います。
ここでは、パフォーマンスとかそういった話ではなく、ミスをへらすための私なりの注意点の中から３コを取り上げます。

##最後までLIMIT句を外さない
なにはともあれ、Limit句は必ず最初に記述してつけます。
これは最後に確認が済むまで外しませんし、テーブルサイズや設計状態によっては全件取得を断念して分割取得してローカル上でマージすることも大いにあります。

##取得するフィールドの記述はテーブル結合の条件が完成してから
フィールドの記述がなければクエリはエラーになるのでうっかりミスの暴発が激減します。
結合条件がすっぽ抜けたクエリの暴発はとにかく危険なので、このような開発体制をとっています。

##結合条件はONを使う
結合条件をWHERE内に書いても同じ結果セットになるでしょうが、あえてONを使って分別します。
WHERE内に書くとコードを追う際に目線が上下をさまよって視認性が悪くなり、かつ絞り込み条件と混ざりこんでしまうため混乱を生み可読性が悪くなるからです。
【Unity】iOSでテクスチャがガビガビに汚くなる問題の対処方法

Unityのデフォルト設定だと、Androidにて正常に表示されるテクスチャがiOSでは画質が劣化する場合があります。
私はインディーズゲームをよくプレイしますが、この状態になってる作品を結構見かけます。
左：Android　右：iPhone
![and00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/1315b41f-33cd-dc2c-f4cb-1d481eed89ee.jpeg) ![ip01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/a871e615-a60b-0d77-407f-83af62350056.jpeg)

これを防ぐにはテクスチャの圧縮方式を変更する必要があります。
ただし[公式に対応している](https://docs.unity3d.com/ja/2018.4/Manual/class-TextureImporterOverride.html)方式でも、画像によっては劣化が激しく実用に耐えない場合もあるので、忘れず個別に確認しましょう。

なお一番手っ取り早く劣化を防げるのは、圧縮を「無効」にする事です（容量は増えるでしょうが…）
私の場合とりあえず無効に設定し、画質とパフォーマンス・容量を秤にかけながら必要に応じて圧縮形式を指定しています。

以下、設定変更の方法です。
該当のテクスチャを選択しInspectorの下の方にある Default で Override for iOS をチェックします。
![Unity04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/b0703065-31dd-3312-617d-7c73bc3492a7.png)
![Unity05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/82119353-21f8-70f7-20ee-2324a90dc62a.png)

その後、Formatを変更します。
無圧縮なら RGBA 16 bit か RGBA 32 bit に変更すればOKです。
アイコンのような色数の少ない画像なら16bitでも大丈夫ですが、グラデーションするような画像（スカイボックス等）は32bitにした方が良いでしょう。
Azure SQLへ接続できない、転送が遅いなどでのNW許可について


## 概要

PCあるいはオンプレサーバから、Azure SQLにつながらない場合やデータ転送が遅い場合のポイントです。

### 参考

[接続のアーキテクチャ](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-connectivity-architecture#connectivity-from-within-azure)

## 前提知識

Azure外からのAzure SQLへの接続の際、AzureのGWに対しての接続は以下の2方式のいずれかで実施されます。

### Redirect

Azure SQLのPort 1433 + 11000～11999に対して送信接続します。
この際、GWへの接続確立後は直接Azure SQLと接続してデータをやりとりするため、高速となります。
Azure内からの接続は既定でこちらの方式です。

### Proxy

Azure SQLのPort 1433に対して送信接続します。
全てのデータはGWを介してやりとりされるため、Redirectに比べて低速です。
Azure外からの接続は既定でこちらの方式です。

## 接続できない場合

### 現状接続できるかを確認するには

そもそも接続できるかがわからない場合は、下記のコマンドで確認ができます。この場合、宛先は東日本のAzure SQLが利用するGWのIPです。他リージョンについては[参考リンク](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/connectivity-architecture#gateway-ip-addresses)に記載があります。

ちなみに一部現在はつながらないGWのIP(13.78.106.224)が記載されています。GW側の事情もあるので、どれかで接続ができれば確認としてはOKです。※2020/4月時点


```powershell:powershell

Test-NetConnection 13.78.61.196 -port 1433  #東日本
Test-NetConnection 40.79.184.8 -port 1433  #東日本
Test-NetConnection 191.237.240.43 -port 1433  #東日本
Test-NetConnection 40.79.192.5 -port 1433  #東日本
Test-NetConnection 13.78.106.224 -port 1433  #東日本

```

### 開通させるには

企業によっては送信規則を一部制限しており、SQLとの接続ができない場合があります。
そのため、クライアント側のファイアウォールで送信許可を設定します。

ドメインネームで送信許可が可能な場合には*.database.windows.net が利用可能です。
IP範囲での設定を行う場合、上記のようなリージョン内のGWのIPのすべてにおけるPort1433に対する送信許可を設定します。

また、Redirectで接続させたい場合はAzure SQLがとるIP範囲におけるPort11000～11999に対する送信許可を設定する必要があります。
ただし、基本的に更新はないGWのIPに対して、Azure SQLがとるIP範囲は更新されていくので注意


[Azure SQLのIP範囲のダウンロードリンク](https://www.microsoft.com/en-us/download/details.aspx?id=56519)


## 転送が遅い場合

接続ポリシーの違いにより、Azure上と外側とではデータ転送のスピードが異なります。
この場合、Azure SQL側の接続ポリシーを変更することで、Azure外からもRedirect方式で接続され、転送が高速化する可能性があります。
ただし、Azure SQLがとるIP範囲(or *.database.windows.net)のPort11000～11999に対する送信許可がされていない場合Redirect方式で接続できないため、Proxy方式の接続となります。

### 変更方法

Azure Portalから変更可能になっています。Connection Policyを変更しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f98d45d2-b7d1-5f85-47b2-17bd109760b0.png)
緯度・経度を自動生成してGoogleMapを開く

#目的
ランダムに緯度・経度情報を作成したい。

##緯度・経度の定義について
(株式会社パスコHPより引用：https://www.pasco.co.jp/recommend/word/word026/)

>緯度
緯度とは、赤道を０°とし、南北へそれぞれ９０°まで表します。北緯９０°，南緯９０°はそれぞれ北極，南極です。この角度は、その点に接する線と北極と南極を結ぶ地軸（青い線）との成す角を表します。

>経度
経度とは、旧グリニッジ天文台跡（ロンドン）を通る南北の線（茶色の線）を０°とし、東西へそれぞれ１８０°まで表します。東経１８０°と西経１８０°は同じ場所を示します。 （南北に通る線を子午線といい、旧グリニッジ天文台跡を通る基準となる子午線を本初子午線といいます。） この角度は、その点を通る子午線と本初子午線との角度を表します。

##取りうる値
上記定義の通りで
緯度：-90～90
経度：-180～180

それに加えて、小数点以下の度・分・秒データを
0~999999と定義した

(※本来は)
>分，秒は時間と同じように60進法になっています。
>ただし、秒に小数点以下の数値をつける場合は秒の後ろに10進法で表します。

が正しいようなので、修正予定。

##PowerShellで実装する

緯度と経度は取りうる値が異なるだけで同じロジックとなるのだが、
意味を持つ単位で関数分けする目的で、緯度生成関数と経度生成関数に分けた。
※一括りにしても別に可能だったが、関数の目的はシンプルであるように意図。

```PowerShell
#緯度のランダム生成処理
$latitude = createLatitude
#経度のランダム生成処理
$longitude = createLongitude
```


```PowerShell
#緯度情報を自動生成する関数
function createLatitude {
    $latitudeint=Get-Random -Maximum 90 -Minimum 0
    $minussign_lat = ''
    $signseed_lat=Get-Random
    #緯度・経度の符号を決定する
    minusSignDecide $signseed_lat $minussign_lat
    $latradix = Get-Random -Maximum 999999 -Minimum 0
    #緯度の値を文字列連結で実現する
    $latitude = $minussign_lat + [string]$latitudeint + '.' + [string]$latradix

    Write-Output($latitude)
}
```

```PowerShell
#経度を自動生成する関数
function createLongitude{
    $longitudeint=Get-Random -Maximum 180 -Minimum 0
    $minussign_lon = ''
    $signseed_lon=Get-Random
    #緯度・経度の符号を決定する
    minusSignDecide $signseed_lon $minussign_lon
    $lonradix = Get-Random -Maximum 999999 -Minimum 0
    #緯度の値を文字列連結で実現する
    $longitude = $minussign_lon + [string]$longitudeint + '.' + [string]$lonradix

    Write-Output($longitude)
}
```

PowerShellのGet-Randomコマンドレットが大変便利。
以下のオプションをつけるところがポイントになる。

* -Maximumに最大値を指定
* -Minimumに最小値を指定

これによって、一行で緯度・経度の整数値部分が作れる。
[Get-Randomコマンドレットのヘルプ](https://forsenergy.com/ja-jp/windowspowershellhelp/html/fa69dbbd-8511-495d-8456-345c377d869f.htm)

整数部につく符号もランダムにしたかったので、
以下の関数でランダムに決定するようにした。

```PowerShell
#緯度・経度に付随する符号をランダムに決定する関数
function minusSignDecide($signseed,$signstr){
    $signseed_calced = $signseed % 2
    if($signseed_calced -eq 1){
        $signstr = '-'
    } else{
        $signstr = ''
    }
    #戻り値を返す
    Write-Output($signstr)
}
```

##実行結果
ランダムに生成した緯度・経度を表示すると以下のようになる。

```PowerShell
latitude = 30.608347
longitude = 7.299758
```

##Google Mapで表示させると

<img width="1072" alt="#1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580452/c08262b7-e14b-da4e-1069-a70997b69b11.png">


以上。
【Unity】Build Target AndroidPlayer is not supported エラーを防止する方法

Unityを起動した時たまに以下のエラーが出て来て、終了するかWindowsにSwitchTargetしろとか無茶を言いやがります。
>Build Target AndroidPlayer is not supported. Switch to WindowsStandaloneSupport or exit Unity?
![Unity00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/c185b1ef-9a1d-b0e7-1d4d-ea37e4b7f470.png)

これの防ぎ方ですが、起動時にLearnタブを一回クリックしておくと良いようです。
理由は分かりませんが…
![Unity01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/04ecccb4-7112-6ea4-8988-0462a5fb6aed.png)

この方法はフォーラムで紹介されてました
https://forum.unity.com/threads/build-target-android-is-not-supported-switch-to-windows-or-exit-unity.625336/
Atcoderのレート分布を可視化

# はじめに
Pythonによるスクレイピングの練習を兼ねて、AtCoder(競技プログラミング)に参加している人のレート分布を可視化してみました。

# おおまかな内容
1. AtCoderの年齢層
2. 参加回数に対するレートの分布
3. 年齢とレートの関係
4. 終わりに

# 1. AtCoderの年齢層
まずはAtcoderに参加している年齢層を、スクレイピングして集計しました。尚、プロフィールで年齢を入力していない人はカウントしておりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/f0a7d4be-d35c-2c35-89a6-321f3f98376d.png)

やはりイメージ通りで若い人、特に大学生が多いですね。


# 2. 参加回数に対するレートの分布
### 平均値と標準偏差での可視化
当然ですが、コンテスト参加回数とレートには相関性があると思われます。ちなみに、AtCoderのレーティングシステムの仕様では参加回数が10回以下のうちは、レートが実力よりも大幅に低い値がつく可能性があるそうです。
[AtCoderコンテストのレーティングについて](https://qiita.com/drken/items/8a6f139158cde8a61dce)

これまでのコンテストへの参加回数ごとに、アクティブユーザのレートを平均値と標準偏差で可視化してみました。平均値が青色の点で、平均値±標準偏差を黄色の帯で表しています。上記のレーティングシステムの仕様のため参加回数10回までとそれ以降で、参加回数とレート間で異なる傾きとなっていますが、基本的に参加回数とレートに線形に近い正の相関があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/e0194fc1-afe1-7f84-9f20-bce45f05906a.png)


例として、これまでに5回コンテストに参加した人の人数とレートのヒストグラムを以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/3dd740b9-8fca-ef87-5faa-f8d72f355366.png)



### 中央値とパーセンタイルでの可視化
平均値による可視化ですと競技プログラミングの経験者（最初から異常にパフォーマンスが高い）などの外れ値の影響を強く受けてしまうので、中央値とパーセンタイルによる可視化をしてみることにしました。中央値が青色の点で、上位25%～下位25%を黄色の帯で表しています。中央値は、平均値と比べ全体的に少しスコアが低いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/952cdaff-8a8a-8bbc-f964-09004b455f15.png)


# 3. 年齢とレートの関係
年齢層とレート分布の関係で可視化しました。尚、上記した通りAtCoderのレーティングシステムの仕様上、参加回数が10回以下のうちは、レートが実力よりも大幅に低い値がつくそうなので、参加回数が10回以上の人に限定し、さらに外れ値の影響がでにくいように中央値で可視化しました。結果を見ると、どうやら年齢とレーティングに相関はほとんどないような気がします。40代に関してはデータ少なく、結果にバラつきがあるので参考程度です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/7858dee7-9fb0-0a68-728e-1b4dc628ac38.png)


# 4. 終わりに
今回はPythonによるスクレイピングで、Atcoderユーザ情報を可視化しました。
最後まで見て頂きありがとうございました。
標準化正規分布グラフでシグマの範囲を見る

##  シグマの範囲
```r
standard_inSigma <- {
  curve(dnorm, -4, 4, type="l")

  xs <- seq(-1, 1, length=n)
  ys <- dnorm(xs)
  polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="red")
}
```
![](https://i.imgur.com/ZI8Z42B.png)


##  シグマの外の範囲
```r
standard_outSigma <- {
  curve(dnorm, -4, 4, type="l")
  
  xs <- seq(-4, -1, length=n)
  ys <- dnorm(xs)
  polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="blue")
  
  xs <- seq(1, 4, length=n)
  ys <- dnorm(xs)
  polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="blue")
}
```
![](https://i.imgur.com/n2oY3LK.png)
Stripeでバンクコードを取得する方法『2020』

## やりたいこと

Stripe コネクトで小アカウント （販売者）が収益を受け取るために銀行口座情報を自分のアカウントへ登録するために、銀行tokensを取得しないといけない。

## 実装

結論、これでいけます

```
% curl https://api.stripe.com/v1/tokens \
-u sk_live_KAEAG◉◉◉◉◉◉◉◉◉◉◉◉: \
-d "bank_account[country]"=JP \
-d "bank_account[currency]"=jpy \
-d "bank_account[account_holder_name]"=◉◉◉ リョウスケ" \
-d "bank_account[account_holder_type]"=individual \
-d "bank_account[routing_number]"=◉◉◉ \ #銀行コード+支店コード
-d "bank_account[account_number]"=◉◉◉   #口座番号

{
  "id": "btok_1GdOv◉◉◉◉◉◉◉◉◉",
  "object": "token",
  "bank_account": {
    "id": "ba_1GdO◉◉◉◉◉◉◉◉◉◉◉◉◉◉◉",
    "object": "bank_account",
    "account_holder_name": "◉◉◉ リョウスケ",
    "account_holder_type": "individual",
    "bank_name": "◉◉◉銀行",
    "country": "JP",
    "currency": "jpy",
    "fingerprint": "◉◉◉7267Z32be",
    "last4": "◉◉◉7",
    "routing_number": "◉◉◉04",
    "status": "new"
  },
  "client_ip": "◉◉◉.109",
  "created": ◉◉◉1380,
  "livemode": true,
  "type": "bank_account",
  "used": false
}

```

## 公式リファレンス

[Create a bank account token](https://stripe.com/docs/api/tokens/create_bank_account?lang=curl)
Heroku Postgres じぶんまとめ

# プランアップする
## 1.まずは追加
新しいDatabaseをリソースから追加する。追加するときに、採用したいプランを選ぶ。
HEROKU_POSTGRESQL_CYAN のように追加される。PINKとか色の名前が割り当てられている模様。

## 2.copy 
Database を追加した後、追加された HEROKU_POSTGRESQL_CYAN へコピーする。

```
heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_CYAN --app myapp
```

## 3. DATABASE 削除
古い方を削除。DATABASEがない状態になる。
フロントとめておくためにはメンテナンスモードにする。

## 4. attachment 
同じ app に attach すると、DATABASEに割り当てられる。
その後、CYAN を削除する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141741/9c16589e-8181-3b06-d869-486a7e3cf779.png)

## cf.
アップグレードの手順の中に、 copy の説明がある。

Upgrading the Version of a Heroku Postgres Database
https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases

CLIから指定するのはこちらに。
Sharing Heroku Postgres between applications
https://devcenter.heroku.com/articles/heroku-postgresql#sharing-heroku-postgres-between-applications
初心者によるプログラミング学習ログ 303日目

#100日チャレンジの303日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
303日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>303日目　2h<br>・xdデザインカンプからのサイト模写<br>・レスポンシブ化<br>・全体的に細かいところ調整<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1255591905301196800?ref_src=twsrc%5Etfw">April 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
DotNetCoreCLI@2でprojectsに指定した値と違うプロジェクトがpublishされる

Azure DevOpsのPipelinesでDotNetCoreCLI@2で指定したつもりのソリューションがpublishされず、かなり時間を浪費したため、状況をまとめます。

# 全く違うプロジェクトがビルドされていた

こんな風にGitリポジトリには複数プロジェクトが存在し、共通のクラスライブラリを見ています。
AのslnファイルにはCoreとAだけ、BのslnファイルにはCoreとBだけが含まれている状態です。

```:フォルダ構成
├ HogeHoge.Core (.Net Coreクラスライブラリ)
│  └ HogeHoge.Core.csproj
├ HogeHoge.A.Functions (Azure FunctionsプロジェクトA)
│  └ HogeHoge.A.Functions.csproj
├ HogeHoge.B.Functions (Azure FunctionsプロジェクトB)
│  └ HogeHoge.B.Functions.csproj
├ HogeHoge.A.Functions.sln
├ HogeHoge.B.Functions.sln
```

PipelineのYMLでは最初はこんな風に指定していました。（変数の指定については割愛）

```yml:最初に作ったYML
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        projects: '**/HogeHoge.B.Functions.sln'
        arguments: '--configuration $(buildConfiguration) -r $(buildPlatform) --output $(Build.ArtifactStagingDirectory)'
        zipAfterPublish: true
```

Publishは成功しているのですが、何故かAのFunctionsがPublishされています。
Pipelineのログを見ると、何故かAプロジェクトが直接参照されています。
何故projectsの指定が無視されるのか・・・

```
==============================================================================
Task         : .NET Core
Description  : Build, test, package, or publish a dotnet application, or run a custom dotnet command
Version      : 2.167.1
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/dotnet-core-cli
==============================================================================
C:\windows\system32\chcp.com 65001
Active code page: 65001
C:\hostedtoolcache\windows\dotnet\dotnet.exe publish d:\a\1\s\HogeHoge.A.Functions\HogeHoge.A.Functions.csproj --configuration Release -r win-x64 --output d:\a\1\a\HogeHoge.A.Functions
```

# その1：Projectsの記法が異なる

まず、projectsの指定方法が間違っていました。こんな風に書かないと認識されません。

```yml
        projects: |
         **/HogeHoge.B.Functions.sln
```

# その2: publishWebProjectsが必要

publishWebProjectsをfalseであっても指定しないとprojectsの指定は無視されるようです。
projectsの指定がない場合、勝手に適当なプロジェクトを探しに行ってしまうらしい。だったらエラーを吐いてほしい・・・

```yml
        publishWebProjects: false # このパラメータが無いとprojectsの指定が無視される
```

# 結果

こんなYMLに変更することで、ちゃんとpublishされるようになりました。

```yml
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: false
        projects: |
         **/HogeHoge.B.Functions.sln
        arguments: '--configuration $(buildConfiguration) -r $(buildPlatform) --output $(Build.ArtifactStagingDirectory)'
        zipAfterPublish: true
```

# 参考

DotNetCoreCLI@2 ignores projects on publish
https://developercommunity.visualstudio.com/content/problem/826169/dotnetcorecli-3.html
Excluding projects when executing the DotNetCoreCLI@2 task
https://stackoverflow.com/questions/58975756/excluding-projects-when-executing-the-dotnetcorecli2-task
バイナリファイル（画像ファイルなど）のdiffをとる

テキストファイルの差分をとるにはdiffですが
画像ファイルなどのバイナリファイルに差がないかを調べるには
`cmp`を使えばよいようです。

```console
cmp a.jpg  b.jpg 
a.jpg b.jpg 異なります: バイト 23、行 1
```
【HTML・JavaScript】画面表示までの処理順序

## 概要
HTMLファイルを読み込んでからブラウザに表示されるまでのJavaScriptの処理の流れをまとめました。  


## 用語の確認

- [オブジェクト・プロパティ](https://qiita.com/hirotatsu/items/1e56186dd24e55d0bcac)

- [DOM(Document Object Model)](https://qiita.com/bocc/items/5d7213431e5a5e3a67e9)

## JavaScriptの処理順序

1. windowオブジェクトの生成
1. Documentオブジェクトの生成  
1. HTMLを記述順に構文解析(パース)  
1. `<script>`要素を構文解析(パース), エラーがなければコードを同期実行  
1. HTMLパース完了
1. 外部リソース読み込み
1. ユーザー定義イベントなどのイベント発生  

### 1. windowオブジェクトの生成

Q. windowオブジェクトとは？
A. 簡単に言えば、DOMを構築するDocumentオブジェクトをプロパティにもつオブジェクトのこと。詳しいことは[MDNのWindowの説明](https://developer.mozilla.org/ja/docs/Web/API/Window)を参考のこと。

下図の赤い着色部分にあたります。

![browserObject-Page-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517043/6e99ee9c-b887-51c0-293b-1223290b9e8e.png)



### 2. Documentオブジェクトの生成

HTMLの中身を解釈してDOMツリーの構築を開始します。

下図の赤い着色部分にあたります。

![browserObject-Page-1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517043/a449fd28-1cd6-856d-b180-31e5801b96c8.png)

Documentオブジェクトが他にどのようなプロパティをもっているか気になる方は[MDNのDocumentインターフェイスのプロパティ一覧](https://developer.mozilla.org/ja/docs/Web/API/Document)を参考のこと。

### 3. HTMLを記述順に構文解析(パース)

要素オブジェクト(`<head>`, `<div>`, ...), テキストノード(文字列, 改行, ...)を順に追加する。
簡単に言えば、以下のような木を作成する処理。

![browserObject-Page-3 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517043/83e223d0-6049-f645-2cf7-e2c8547acaad.png)

### 4. `<script>`要素を構文解析(パース), エラーがなければコードを同期実行

srcにJavaScriptファイルが指定されている場合、JavaScriptが実行されるまで, HTMLパースは一時停止します。
[順序3](#3-htmlを記述順に構文解析パース)の図で言えば、いま、`<body>`までパースが終わっており、`<script>`に差し掛かったとします。
`<script>`内のJavaScriptファイルを見つけた場合、JavaScriptファイルが実行されるまでは次の`<h2>`や`<p>`はパースされないということです。

### 5. HTMLパース完了
DOMツリーの構築が完了すれば、HTMLのパースは完了です。
このとき、[DOMContentLoaded](https://ja.javascript.info/onload-ondomcontentloaded#ref-321)というイベントが発生します。
この時点でレンダリング(画面の表示)が開始されますが、画像やCSSなどのスタイルシートといった、外部リソースはまだ読み込まれていない可能性があります。

### 6. 外部リソース読み込み
順序5までで読み込まれなかった外部リソースの読み込みを行います。
すべての依存リソースが読み込まれるとloadというイベントが発生します。

### 7. ユーザー定義イベントなどのイベント発生
ボタンのclickなどのイベントの発生です。


## 参考・参照
・https://kde.hateblo.jp/entry/2017/05/20/212928
[JavaScriptの処理順序](#javascriptの処理順序)について、非常に参考になりました。
・https://www.webdesignleaves.com/wp/jquery/1631/
本記事で利用されている図はこちらで作られていた物を再編したものです。
Next.jsをExpressカスタムサーバ + TypeScriptで動かす設定


## プロジェクトの作成

```bash
npx create-next-app [project-name]
cd [project-name]
```

```bash
# Nextjsで利用するファイル
mkdir src
mv pages src/
mv src/index.js src/index.tsx

# NextjsをTypeScriptでコーディングするために必要なパッケージをインストール
yarn add -D typescript @types/react @types/node

# カスタムサーバとして利用するExpressのパッケージをインストール
yarn add express 
yarn add -D @types/express ts-node

# カスタムサーバで利用するファイルを作成
mkdir server
touch server/index.ts
touch tsconfig.server.json
```

## `server/index.ts`の編集

Expressをカスタムサーバとして利用する。
以下のように編集する。

```ts
import express, { Request, Response } from "express";
import next from "next";

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();
const port = process.env.PORT || 3001;

async function main() {
  try {
    await app.prepare();
    const server = express();
    server.all("*", (req: Request, res: Response) => {
      return handle(req, res);
    });
    server.listen(port, (err?: any) => {
      if (err) throw err;
      console.log(`> Ready on localhost:${port} - env ${process.env.NODE_ENV}`);
    });
  } catch (e) {
    console.error(e);
    process.exit(1);
  }
}

main();
```

## `tsconfig.server.json`

```json
{
  "extends": "./tsconfig.json", // tsconfig.jsonの設定を継承する
  "compilerOptions": {
    "module": "commonjs", // Next.jsとExpressの両方を連携させるために、commmonjsを利用する
    "outDir": "dist", // ビルドファイルの出力先
    "noEmit": false // Next.jsはBebelを使用してTypeScriptをコンパイルするので、TSコンパイラはjsを出力しない。設定を上書きする。
  },
  "include": ["server"] // TSコンパイラにserverディレクトリのみをコンパイル対象として認識させる。
}
```

## `package.json`の編集

`scripts`を以下のように編集する。

```json
  "scripts": {
    "dev": "ts-node --project tsconfig.server.json server/index.ts",
    "build:next": "next build",
    "build:server": "tsc --project tsconfig.server.json",
    "start": "NODE_ENV=production node dist/index.js"
  },
```

## 開発モードで起動

```
yarn dev
```

## ビルド & 本番起動

```
yarn build:next
yarn build:server

yarn start
```
【Laravel】Laravel DB設定

#①MAMPを起動

アプリケーションからMAMPを開き、「サーバを起動」を押下する。

#②phpMyAdminにアクセス

[phpMyAdmin](http://localhost:8888/phpMyAdmin/?lang=ja)にアクセスする。

#③データベース作成

▪︎新規作成
左側のメニューから「新規作成」を押下する。

▪︎データベース名入力
フォームに作成したいデータベース名を入力する。

▪︎文字コード設定
プルダウンから文字コード「utf8_general_ci」を選択する。

▪︎作成
「作成」ボタンを押下する。

#④特権の設定

▪︎データベースの選択
左側のメニューから特権を設定したいデータベースを選択する。
今回は先ほど③で作成したデータベースを選択する。

▪︎特権タブを開く
上部から「特権タブ」を開く。

▪︎ユーザアカウント追加
「ユーザアカウントを追加する」を押下する。

▪︎ログイン情報フォーム入力
ユーザ名、パスワード、再入力を入力する。
他の設定は変えない。

▪︎ユーザアカウント専用データベース設定
チェックボックスから「データベース laravel_task への全ての特権を与える。」を選択し、チェックを入れる。

▪︎グローバル特権設定
チェックボックスから「すべてチェックする」を選択し、チェックを入れる。

▪︎SSL設定
ラジオボタンから「REQUIRE NONE」を選択しする。

▪︎実行
「実行」ボタンを押下する。

#⑤.envファイルのデータベース設定

.envファイルを開き、下記の通りデータベースを設定する。

```
公文）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=【③で作成したデータベース名】
DB_USERNAME=【④で作成したユーザ名】
DB_PASSWORD=【④で設定したパスワード】
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

例）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=laravel_task
DB_USERNAME=laravel_user
DB_PASSWORD=password123
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
```

#⑥DBマイグレート

▪︎ディレクトリ移動

```
公文）
$ cd /Applications/MAMP/htdocs/プロジェクト名
例）
$ cd /Applications/MAMP/htdocs/laravel_test
```

▪︎DBマイグレート

```
$ php artisan migrate
```
【HTML5】コンテンツ・モデル

<p>私の備忘録シリーズでございます。<br>
コンテンツ・モデルはHTML5からの要素に関する新たな概念です。<br>
要素は下記のコンテンツが組み合わさって作られた文書構造だと考えて良い。</p>
<table>
 <tr><td><b>№</b></td><td><b>コンテンツ名</b></td>
 <tr><td>1</td><td>フロー・コンテンツ</td>
 <tr><td>2</td><td>インタラクティブ・コンテンツ</td>
 <tr><td>3</td><td>メタデータ・コンテンツ</td>
 <tr><td>4</td><td>フレーシング・コンテンツ</td>
 <tr><td>5</td><td>エンベッディッド・コンテンツ</td>
 <tr><td>6</td><td>ヘッティング・コンテンツ</td>
 <tr><td>7</td><td>セクショニング・コンテンツ</td>
</table>
<h1>フロー・コンテンツ</h1><br>
 <p>HTMLドキュメント文書全体に関わる。<br>属する主なタグは下記。
    ※後述するコンテンツに属するタグはほぼ全てフロー・コンテンツにも属する。
 </p>
<h1>インタラクティブ・コンテンツ</h1><br>
 <p>ユーザ操作が可能なコンテンツ。<br>属する主なタグは下記。
    &lt;button&gt;、&lt;input&gt;、&lt;textarea&gt;など
 </p>
<h1>メタデータ・コンテンツ</h1><br>
 <p>文書情報や別文書などを定義するコンテンツ。<br>&lt;head&gt;要素内で使用できる要素が、このカテゴリーで使用できます。<br>属する主なタグは下記。
    &lt;link&gt;、&lt;meta&gt;、&lt;title&gt;など
 </p>
<h1>フレーシング・コンテンツ</h1><br>
 <p>段落内で使用するコンテンツ。<br>属する主なタグは下記。
    &lt;code&gt;、&lt;datalist&gt;、&lt;em&gt;など
 </p>
<h1>エンベッディッド・コンテンツ</h1><br>
 <p>文書内に埋め込みするコンテンツ。<br>属する主なタグは下記。
    &lt;audio&gt;、&lt;canvas&gt;、&lt;video&gt;など
 </p>
<h1>ヘッティング・コンテンツ</h1><br>
 <p>見出しを表すコンテンツ。<br>属する主なタグは下記。
    &lt;h1&gt;～&lt;h6&gt;
 </p>
<h1>セクショニング・コンテンツ</h1><br>
 <p>セクションの範囲を定義するコンテンツ。<br>属する主なタグは下記。
    &lt;article&gt;、&lt;aside&gt;、&lt;nav&gt;、&lt;section&gt;
 </p>
<h2>まとめ</h2>
 <p>これらは円上の図で表される。<br>詳細は「コンテンツ・モデル」でググってみてね！</p>