OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub のActions を使って継続的にMSTest を実行する

# はじめに

VSCode でxunit を使おうと思ったのですが、使い慣れてたMSTest & Visual Studio がやっぱりいいということで、環境を構築してみました。GitHub でサンプルを公開しています。

https://github.com/azarashin/mstest_sample

# ディレクトリ構成


┣ .github/workflows 
┃　┗ workflows
┃　　┗ msbuild.yml (ここにビルド実行やテスト実行のシナリオを記述する)
┗sample
　┣ console （クラスライブラリを使って実行するコンソールアプリケーションのプロジェクト）
　┃　┣ console.csproj
　┃　┣ out (ビルド実行に成功するとサーバ上で生成される) 
　┃　┗ (その他ソースコード)
　┣ core （クラスライブラリのプロジェクト）
　┃　┣ core.csproj 
　┃　┣ out (ビルド実行に成功するとサーバ上で生成される) 
　┃　┗ (その他ソースコード)
　┣ console (クラスライブラリに対して試験を実施するためのプロジェクト)
　┃　┣ test.csproj
　┃　┣ out (ビルド実行に成功するとサーバ上で生成される。テスト結果もここに生成される。) 
　┃　┗ (その他ソースコード)
　┗ sample.sln (ソリューションファイル。)

# .yml ファイルの記述

ツリートップの配下に.github/workflows ディレクトリを作成し、その中に.yml ファイルを作成してツリーに入れておくと、.yml に記述したシナリオが特定のタイミングで実行されます。

## Action 名の記述

```
name: MSBuild
```

としています。

## シナリオを実行するタイミング

```
on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

```

としています。これで以下のタイミングでシナリオが実行されます。

- master ブランチへpush した時
  - master ブランチに対してシナリオ実行される
- 他のブランチからmaster ブランチへpull request を投げた時
  - pull request 元である他のブランチに対してシナリオ実行される

## ジョブの記述

```
jobs:
  build:
    name: MSBuild
    runs-on: windows-latest
```
とします。windows 環境として実行します。

```
    steps:
    - uses: actions/checkout@v1
      with:
        fetch-depth: 1
```

ブランチの中身をチェックアウトしてきます。

```

    - name: Setup MSBuild.exe
      uses: warrenbuckley/Setup-MSBuild@v1

```

MSBuild の環境を取得して準備をします。

```
    - name: Setup VSTest Path
      uses: darenm/Setup-VSTest@v1

```

MSTest の環境を取得して準備します。

```

    - uses: nuget/setup-nuget@v1
      with:
        nuget-api-key: ${{ secrets.NuGetAPIKey }}
        nuget-version: '5.x'

```

NuGet でパッケージを取得するために記述します。

```
    - name: MSBuild
      run: |
        nuget restore sample.sln
        msbuild sample.sln -p:OutDir="out/"
      working-directory: ./sample
      shell: cmd

```

作業ディレクトリを指定しておきます(./sample)。
sample.sln を参照してNuGet パッケージを再取得します。
続いてmsbuild を実行し、sample.sln をビルドします。
-p:OutDir="out/" とすることで、各プロジェクトディレクトリの下にout ディレクトリが作成され、実行に必要なファイルが格納されます。
テスト用の環境は./sample/test/out 以下に生成されます。

```
 - name: MSTest
      run: |
        vstest.console test.dll /logger:trx /Diag:lot.txt"
      working-directory: ./sample/test/out
      shell: cmd
```
MSTest を実行します。
作業ディレクトリ./sample/test/out 以下にテスト結果が生成されます。

```

    - name: Upload artifact core
      uses: actions/upload-artifact@v1
      with:
        name: build-result-core
        path: ./sample/core/out/

    - name: Upload artifact test
      uses: actions/upload-artifact@v1
      with:
        name: build-result-test
        path: ./sample/test/out/

    - name: Upload artifact console
      uses: actions/upload-artifact@v1
      with:
        name: build-result-console
        path: ./sample/console/out/
```

クラスライブラリ・アプリケーション・試験結果をそれぞれアップロードします。
シナリオ実行に成功していれば、GitHub のActions からクラスライブラリのDLL やアプリケーション・試験結果を取得することができるようになります。
ビルド・試験に失敗した場合はその結果をGitHub のActions から確認することができます。

# 終わりに

ビルド（msbuild)や試験(vstest.console)の実行の際にはプラットフォームの指定のようなパラメータ設定をもっと追加した方が良いかも。

# おまけ

PlantUML を GitHub Actionsで使っているサンプルを公開されている方がいらっしゃるようです。
これも便利そうです。

https://github.com/grassedge/generate-plantuml-action
ABC170

AtCorder Beginner Contest 170 に参加しました。 
ABCの3問ACでした。 
Python3を使用しています。

# A問題
入力をリストに入れ、0が何番目か(インデックス)を求めます。

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    A = list(map(int,input().split()))
    print(A.index(0) + 1)

    
if __name__ == "__main__":
    main()
```

# B問題
つるかめ算です。 
全ての動物が鶴だと仮定し、残った足の本数を鶴と亀の足の数の差(4 - 2 = 2)で割ります。 
ただしつるかめ算はすべての場合で成立しないので例外を考えます。
1　足の数が多すぎる/少なすぎる 
2　組み合わせとして成り立たない足の数(奇数など)

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    X, Y = map(int,input().split())
    a = Y - 2 * X
    if a >= 0 and a % 2 == 0 and a / 2 <= X:
        print('Yes')
    else:
        print('No')

    
if __name__ == "__main__":
    main()
```

# C問題
入力値pと整数Xの差を求め、新しいリストp_newを作ります。 
0 → ±1 → ±2 とリストの中をwhile文で繰り返しながら探し、見つからなくなったときが求める答えです。 
ただし、複数存在する場合は小さい方を答えることから、絶対値numを引いた値を答えます。

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    X, N = map(int,input().split())
    p = list(map(int,input().split()))
    p_new = [i - X for i in p]
    num = 0
    while num in p_new and -num in p_new:
        num += 1
    if X - num in p:
        print(X + num)
    else:
        print(X - num)

    
if __name__ == "__main__":
    main()
```
HTML入門

メモとして

#HTML
コードは入れ子構造となっている。そのため、タグの間に入れるタグなどに制限があるようだ。

開始タグ内には属性を持たせることが可能。属性はそのタグ特有の情報を表す

HTML文書は開始行に必ず、このファイルがHTML文書ということを表す**<!DOCTYPE html>**という文言のタグを記述する。
また、その文言はバージョンによって異なる。HTMLの最新バージョンであるHTML5は上の文言である

- HTMLタグはこのタグに囲まれた部分はHTMLコードであることを表すタグ。基本的に表示されない
- HEADタグはそのウェブページの情報を書く部分で
 - フォントの読み込み設定
 - 検索エンジンやブラウザがそのページを理解するための情報
 - CSSファイルの読み込み設定
 - 例の一つでTitleタグはウェブページのタイトル情報が記載する場所である、検索エンジンに表示される内容らしい
- Bodyタグは実際にウェブページに表示される内容を指す
 - Pタグ(段落)やh1~h6(見出し)タグなどがある
 - 画像を表示するimgタグ(jpg,png,gif,svgのみ) 
 - ul,liタグやol,liタグは箇条書きのタグ
 - 「--!～--」でコメントアウト
 - classやidタグは開始タグにつけることでそのタグをユニークに識別できる。これはCSSで管理名を指定してそのタグ部だけデザインを変更するときに利用できる。使用する際の注意は日本語はおすすめしない。先頭に数字を利用できない。
 また、classとidの違いはclassが同一の名前を再利用可能であり、idは同一のHTML文書ないで重複は許されない
 - divとspanタグはタグのまとまりをつくる。これもクラスタグを使ってまとめてデザインを設定したいときに利用できる
MaixCubeでジェスチャー認識する

# はじめに

[前回](https://qiita.com/fukuebiz/items/deed17d64da48fabf6e6)MaixCubeでTensorFlow Lite for Microcontrollersが動作したので、MaixCubeに内蔵の加速度センサーMSA301を利用して、ジェスチャー認識してみました

# 参考

基本的にはTensorFlow Lite for Microcontrollersに含まれているサンプルの通りで、サンプルに含まれているモデルを使用します。こちらの、[M5Stack＋TensorFlow Liteでジェスチャ認識 ](https://blog.boochow.com/article/m5stack-tflite-magic-wand.html)が大変参考になりました。ありがとうございます。M5Stackで動作している動画も見ることができます。

# コード

MaixCube用のコードは[こちら](https://github.com/fukuen/maixcube-tflite-magic-wand)

# 最後に

何度か試したところ、Wはほぼ認識しますが、Slopeはちょっと難しく、Ringは認識させることができませんでした。

加速度センターの読み取りをやっつけで作ったので、まだ不具合があるかもしれません。しきい値を調整すると改善しそうです。
PythonAnywhereとtime zone設定

<h1>はじめに</h1>
本記事はボートレース予測Webサイトを立ち上げた際に発覚した事象です。
[きょう、ていの良い予想はあたるだろうか](https://youhaveniceboat.pythonanywhere.com)

そういえば、datetimeをどの地域で取得するかって、今まで意識したことなかったなあと思い記事にしました。


<h1>結論</h1>
何気なく使用するtimeやdatetimeですが、指定せずにpythonanywhere上にて実行するとUTC時刻が取得されてしまいます。（日本にいる前提だと9時間前の時刻が取得されてしまう。）

以下のように設定すれば大丈夫です。

```python:app.py(抜粋)
import os
import time

os.environ["TZ"] = "Asia/Tokyo"
time.tzset()
tday=datetime.date.today()
```

公式でもかかれておりました。
https://help.pythonanywhere.com/pages/SettingTheTimezone/

<h1>できごと</h1>

日付が変わったタイミングでWebページ上の日付が変わることを期待していたら変わらず..上記の対応で解決しました。

<img width="910" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/d8c4545b-79fd-158e-b2a6-f8fbe1faa1d7.png">
gdalツールで画像をGeoTiffに変換してみる。

GeoTiffは位置情報を埋め込んだ画像ファイル。GISツールで開くと地図上に任意の画像を重ね合わせることができる。gdal ツールを使って、任意の画像フォーマットからGeoTiffを生成してみる。



## gdal_translate 

任意の画像から GeoTiff フォーマット画像を生成するには gdal_translate を使う。

一番簡単に生成するオプションは以下の通り。

```
% gdal_translate -of "GTiff" -a_ullr [画像左上のX座標] [画像左上のY座標] [画像右下のX座標] [画像右下のY座標] [入力ファイル] [出力ファイル]
```

例えば、以下のページの画像をローカルに保存し、

http://www.pref.hokkaido.lg.jp/overview/access.htm

ゴニョゴニョと gdal_translate にオプションを指定。

```
$ gdal_translate -of "GTiff" -a_ullr 15466969.20119360 5902003.38968361 16292581.57870004 5024790.2385830 dounai-map1.png output.tif
```

これで生成された output.tif ファイルを、QGISのラスタレイヤーに読み込んでみる。

背景に OpenStreetMap も指定。こんな地図が出来上がる。

![スクリーンショット 2020-06-15 21.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18599/0e785b10-573a-eee2-228d-f86067f97b91.png)


GeoTiffに変換するのに選ぶ画像次第で、個性的な地図なども作ることができそうだ。
Dronecode Devマニュアル抜粋&翻訳-Dronecode Platform Overview

#この記事は
前回の [PX4 Architectural Overview](https://qiita.com/sakaeda11/items/7c9c429164b59fe27595) に引き続き、
Dronecode本家サイトの[Dronecode Platform Overview](https://dev.px4.io/master/en/concept/dronecode_architecture.html)ページの抜粋・翻訳です。

主に自分の理解用に書いています。

# PX4 Platform Hardware/Software Architecture
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124098/7ca62958-e250-b7a2-27d4-53e834e5d7b4.jpeg width=70%></img>

**本文より**

- 図の左側のフライトコントローラと、右側のPerception ComputerはRTPS(リアルタイムパブサブ)インターフェイスで接続しています。
- perception computerは映像からの制御や衝突回避機能などを提供します
- 右側のSOFTWAREの列はおおよそ左側のHARDWAREと対応するように記載しています。

**図から読み取れること**

- フライトコントローラにはIMU(角速度と加速度センサ)、Baro(気圧センサ)、GPS、Distance(距離センサ)、Avoidance(不明、そういう回避専用のモジュールがある？）から情報を受取、モータをPWMやCAN信号で操作します。
- フライトコントローラはGCS(Ground Control System)と無線通信します
【Rails】acts-as-taggable-onでマイグレーションエラーが起きたときの解決方法

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 事象

`$ rails db:migrate`やCapistranoでのデプロイ時に、
下記の様に`acts-as-taggable-on`のマイグレーションファイルでエラーが起きる。

```terminal:ターミナル
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Cannot drop index 'index_taggings_on_tag_id': needed in a foreign key constraint: DROP INDEX `index_taggings_on_tag_id` ON `taggings`

20200525095250/db/migrate/20200516111153_add_missing_unique_indices.acts_as_taggable_on_engine.rb:11:in `up'
```

# 原因

Gem作成者が単純にサボっているというのが原因らしい。
要するに、Gem作成者がこのエラーが出ない様にGemそのものを修正しないと一生このエラーは出続ける。

# 解決方法

`acts-as-taggable-on`導入時に作成したマイグレーションファイルの、
不必要なコードをコメントアウトする。

**※ファイル名に注意！**

```ruby:20200516111153_add_missing_unique_indices.acts_as_taggable_on_engine.rb
# This migration comes from acts_as_taggable_on_engine (originally 2)
if ActiveRecord.gem_version >= Gem::Version.new('5.0')
  class AddMissingUniqueIndices < ActiveRecord::Migration[4.2]; end
else
  class AddMissingUniqueIndices < ActiveRecord::Migration; end
end
AddMissingUniqueIndices.class_eval do
  def self.up
    # add_index ActsAsTaggableOn.tags_table, :name, unique: true

    # remove_index ActsAsTaggableOn.taggings_table, :tag_id if index_exists?(ActsAsTaggableOn.taggings_table, :tag_id)
    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_taggable_context_idx'
    # add_index ActsAsTaggableOn.taggings_table,
    #           [:tag_id, :taggable_id, :taggable_type, :context, :tagger_id, :tagger_type],
    #           unique: true, name: 'taggings_idx'
  end

  def self.down
    # remove_index ActsAsTaggableOn.tags_table, :name

    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_idx'

    # add_index ActsAsTaggableOn.taggings_table, :tag_id unless index_exists?(ActsAsTaggableOn.taggings_table, :tag_id)
    # add_index ActsAsTaggableOn.taggings_table, [:taggable_id, :taggable_type, :context], name: 'taggings_taggable_context_idx'
  end
end
```

```ruby:20200516111155_add_missing_taggable_index.acts_as_taggable_on_engine.rb
# This migration comes from acts_as_taggable_on_engine (originally 4)
if ActiveRecord.gem_version >= Gem::Version.new('5.0')
  class AddMissingTaggableIndex < ActiveRecord::Migration[4.2]; end
else
  class AddMissingTaggableIndex < ActiveRecord::Migration; end
end
AddMissingTaggableIndex.class_eval do
  def self.up
    # add_index ActsAsTaggableOn.taggings_table, [:taggable_id, :taggable_type, :context], name: 'taggings_taggable_context_idx'
  end

  def self.down
    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_taggable_context_idx'
  end
end
```
News API, New York Times API, Wikipediaのgem等を使用して記事を取得する方法

現在、英語のニュース及びWikipediaの英語のページを、ユーザーが検索するキーワードに応じて収集して保存するアプリを製作しています。日本語での記事が少なかったので、この記事で説明してみようと思います。現在プログラミングを勉強中で、Qiitaに記事を投稿するのも初めてなので、間違いがありましたら、ご指摘いただければと思います。

## 使用したAPI
こちらの記事を参考に、各ページを訪問して使いやすそうなAPIを選定しました。日系の新聞のAPIも探しましたが、見つかりませんでした。ただし最後に紹介するNews APIでは国を指定することができ、日本語の記事を取得可能です。
https://en.wikipedia.org/wiki/List_of_news_media_APIs

・The New York Times
https://developer.nytimes.com/

・Financial Times
https://developer.ft.com/portal

・The Guardian
https://open-platform.theguardian.com/

・News API
https://newsapi.org/

また、ニュースとは別にWikipediaの情報も取得したいと考えました。私はRubyを使用しているため、こちらのgemを使用しました。このgemは英語での記事タイトルを正確に入力しないとWikipediaのページを取得できない難点があるので注意が必要です。

https://github.com/kenpratt/wikipedia-client

## The New York Times APIの使用方法
最初に共有したWikipediaのリンクからわかる通り、世界のニュースサイトの中でもAPIの機能が非常に充実したものの一つです。

以下のGet startedの手順を追って行けば、すぐにAPIキーが手に入ります。

https://developer.nytimes.com/get-started

APIの機能は多くありますが、参考までに記事の検索について説明します。Example callに
https://api.nytimes.com/svc/search/v2/articlesearch.json?q=election&api-key=yourkey
とある通り、非常にオーソドックスなAPIの使い方です。q={query}なので、ここをユーザーに入力するようにすれば、お気に入りの記事情報が取得できます。jsonファイルが返ってくるので、例えば["lead_paragraph"]をeachで繰り返し処理すれば、各記事の第一段落を得ることができます。

https://developer.nytimes.com/docs/articlesearch-product/1/overview

## Financial Times APIの使用方法
経済情報に強いイギリスの新聞です。2015年に日経新聞が買収したことでも有名ですね。

こちらは、デベロッパー用のアカウントを作成した後、同社にメールしてAPIキーを取得するというややトリッキーな方法ですが、私がキーを取得した際は、同社からすぐにメールが返ってきて何も問題なく手続きが終わりました。

https://developer.ft.com/portal/docs-start-obtain-an-api-key

こちらで面白いのはnotificationsの機能で、ユーザーが指定した日時から最新の記事までの情報を得ることができます。

https://developer.ft.com/portal/docs-start-push-notifications-with-pull-requests

## The Guardian APIの使用方法
こちらもイギリスの有名な新聞です。Guardianはネットワークが広い印象なので、海外の政治動向等をチェックするときにたまに読んでいます。以下のフォームを入力すれば、簡単にAPIキーが手に入ります。

https://bonobo.capi.gutools.co.uk/register/developer

同社のAPIドキュメンテーションは読みやすくしっかりしているのですが、例えばNew York Timesのように段落を取得するなど、記事の内容を取得することができないので、あまり使い勝手がよくない印象です。
https://open-platform.theguardian.com/documentation/

## News APIの使用方法
News APIは、3万を超える世界中のニュースサイトから情報を集めており、言語やキーワードなど多数のオプションで記事情報の検索が可能です。こちらに関しては日本語での紹介記事も多くあり、ニュースの情報収集機能をアプリに加えたことのある方なら、すでにご存じかと思います。

https://blog.api.rakuten.net/api-tutorial-news-api-jp/

ニュースのAPIの中では、非常に有名で評判も高いようです。使い勝手も非常に良さそうなので、欠点を上げるとすれば、例えばNew York Timesが対象に含まれていないことでしょうか・・・

https://towardsdatascience.com/scraping-web-articles-using-newsapi-in-python-a0e97fbab8ed

この記事も同様に二つのAPIを比較しています。

##まとめ
海外のニュースサイトのAPI使用について簡単にまとめました。現在は文字の情報を取得するのに精いっぱいなのですが、今後はBloombergなどより経済に強いニュースサイトのAPIを利用して、リアルタイムでの株価情報等をグラフで表示させるような機能をいつか実装したいと考えています。ご質問やご指摘等ございましたら、コメントいただけると幸いです。
ヘイヘイバリデーションってモデルとマイグレーションファイルどっちに書けば良いんだyo

本日2記事目ですね。
もうビール飲みたいけどまだ飲まないんだから！！
(飲みながら記事書いて、誤字脱字多かったら絶望なため):frowning2:

さーて今回はバリデーションを書く場所について。:cop:

張り切っていくわよ〜〜〜〜！！

#1 モデルへのバリデーション

```ruby:user.rb
  validates :email,           presence: true
  validates :first_name,      presence: true
  validates :last_name,       presence: true, length: { maximum: 15 }
```

こんな感じで書くと思うんですよ。
説明すると

【email】 空で値を保存できない
【first_name】 空で値を保存できない
【last_name】 空で値を保存できない、15文字以内じゃないと保存できない。

って感じのバリデーションを書きます。
じゃあこれで問題なしだね！！って思うでshow。:santa:

###これだとmysql(DB)に直接打ち込む時にバリデーションかからないよ！！

そうなんです。
モデルへのバリデーションはRails側(MVC)の判定だけで、mysqlとかDBには反映されないんです。

#2 それならマイグレーションファイルにバリデーションだっ！

```ruby:migrate/create_users.rb
      t.string :first_name,         null:false
      t.string :last_name,          null:false
      t.string :email,              null:false
```

こっちではカラムに空の値では保存できない様バリデーションをかけています。

###じゃあマイグレーションファイルだけにバリデーションかければよくね？

と思われるかもしれません。
ですがDBにバリデーションチェックをしてもらうと、わかりづらいエラーが返ってきたり、
もしくはモデルにちゃんとバリデーションを書いているとエラーメッセージを出せたりと色々汎用性があるのです。

#3 結果　両方に書いた方が良い

結果これなんです。
めんどくさいかもしれないんですが、両方に書くのが安全なんです。:family_wwb:

こんなメリットがあるよ！こんな危険性があるよ！
とか補足情報がありましたらご教示頂けたら幸いです。

読んで頂きありがとうございました！:ok_hand_tone1:
Quit chanでgoroutineリークを回避する

# Avoid goroutines leaks with quit chan
```go
func broadcastMsg(msg string, addrs []string) error {
    errc := make(chan error)
    quit := make(chan struct{})

    defer close(quit)

    for _, addr := range addrs {
        go func(addr string) {
            select {
            case errc <- sendMsg(msg, addr):
                fmt.Println("done")
            case <-quit:
                fmt.Println("quit")
            }
        }(addr)
    }

    for _ = range addrs {
        if err := <-errc; err != nil {
            return err
        }
    }
    return nil
}
```
【Golang】サードパーティー semaphore

#【Golang】サードパーティー semaphore
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main 
/*
Semaphore

並列処理

インストール 済
https://godoc.org/golang.org/x/sync/semaphore
go get "golang.org/x/sync/semaphore"
*/

import (
	"context"
	"fmt"
	"time"

	"golang.org/x/sync/semaphore"
)

//2
//ここがセマフォ
//semaphoreで同時に走らせる数指定　==　1 開始する数
var s *semaphore.Weighted = semaphore.NewWeighted(1)


//3
func longProcess(ctx context.Context) {
	//3-2 キャンセル
	//goroutinを検証
	//1つならTrue
	//2つならFalse
	isAcquire := s.TryAcquire(1)
	
	//待っているgoroutinがあったら、キャンセル
	//2つ以上走っていたら、キャンセルする
	if !isAcquire {
		//ロックされていない
		fmt.Println("ロックされていない")
		return 
	}

	//3-1 ロック 待つ
	/*
		//errがnilでなければ
		//err := s.Acquire(ctx, 1); でロックする
		//このプロセスが終わったらリリースする。この間、他のgoroutinは待っている
		//一つずつしか走らせることができない
		if err := s.Acquire(ctx, 1); err != nil{
		    //出力して終了する
			fmt.Println(err)
			return
		}
	*/

	//1つずつ処理
	defer s.Release(1)
	fmt.Println("Wait...")
	time.Sleep(1 * time.Second)
	fmt.Println("Done")
}

func main() {
    //処理未定義 TODO部に設定できる事はまた調査する
	ctx := context.TODO()
	
	//並列処理
	//3つのgoroutin
	go longProcess(ctx)
	go longProcess(ctx)
	go longProcess(ctx)
	
	time.Sleep(5 * time.Second)

}
```
null許容型で躓いた

#背景
例の鬼教官の課題は続いている。
C#の課題プログラムの中でnull許容型について触れることがあったので
備忘録として残す。

#課題
消費税(10%)商品と軽減税率対象商品の値段の出力プログラム

#躓き
なんでmainの軽減税率計算はnull許容型(★1)でコンパイル通るのに
Book2クラスはnull許容型(★2)で書くと怒られるの～～～？(´;ω;｀)

プログラム抜粋

```
class Program
{
	static void Main(string[] args)
	{
		//軽減税率商品の表示
		if(book0.軽減税率.HasValue)
		{
			double? x = book2.price * book2.軽減税率; //★1
			Console.WriteLine(x);
		}
		else
		{
			Console.WriteLine(book2.price);
		}
	}
}
class Book2
{
	public double 軽減税率get()
	{
		if(軽減税率.HasValue)
		{
			double x = _price * 軽減税率.Value; //★2 double? xにするとエラー
			return x ;
		}
		else
		{
			return _price * 消費税;
		}
	}
}

```

#解答
★2はreturnを使っている。
つまり、doubleで返さないといけないからdoubleに指定しなければならない。
（基礎って大事ですね。。。）
ちなみにこの例だと、if文で値があれば、軽減税率を算出するようにしているので
★1は★2と同じ書き方にする。

#まとめ
初心者なので基礎を定着させなきゃ～～
WireGuard で LAN内通信は VPN を経由させない

[Quick Start](https://www.wireguard.com/quickstart/)そのままだとすべての通信が WireGuard 経由になるので、同じLANに接続しているローカルデバイスに接続できない。

# `AllowedIPs` をいじる

WireGuard 経由にする設定`AllowedIPs`がすべて（` 0.0.0.0/0`）になっているのが原因。

```:全部WireGuard経由
AllowedIPs = 0.0.0.0/0
```

この設定値をパブリックIPアドレスに絞れば、

 - LANはダイレクトに通信（WireGuard を経由しない）
 - WANは WireGuard 経由

となる。

```:パブリックIPアドレスだけの設定例
AllowedIPs = 0.0.0.0/5,8.0.0.0/7,11.0.0.0/8,12.0.0.0/6,16.0.0.0/4,32.0.0.0/3,64.0.0.0/2,128.0.0.0/3,160.0.0.0/5,168.0.0.0/6,172.0.0.0/12,172.32.0.0/11,172.64.0.0/10,172.128.0.0/9,173.0.0.0/8,174.0.0.0/7,176.0.0.0/4,192.0.0.0/9,192.128.0.0/11,192.160.0.0/13,192.169.0.0/16,192.170.0.0/15,192.172.0.0/14,192.176.0.0/12,192.192.0.0/10,193.0.0.0/8,194.0.0.0/7,196.0.0.0/6,200.0.0.0/5,208.0.0.0/4
```

## 参考

[Can't connect to local devices on Windows 10 · Issue #1709 · trailofbits/algo · GitHub](https://github.com/trailofbits/algo/issues/1709)
Ubuntuを自動ログインでログインループになったときの対処法

#1. ログイン画面でコンソール画面に入る。
```
Ctrl+Alt+F2
```
#2.  grubを編集する。
nanoでgrubを開く。

```
sudo nano /etc/default/grub
```

下記のように変更する。

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
↓
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
```

# 3. grubを更新する

```
sudo update-grub
```

再起動で治る

#参考
http://ubuntuhandbook.org/index.php/2020/01/login-loop-auto-login-enabled-in-ubuntu-19-10-with-nvidia-driver/
正規表現の関数でlastIndexに注意

正規表現の関数でうっかりひっかかりそうなところがあったのでメモ


検索する正規表現は `/\w{3,}/ig` （3文字以上の英数字の単語にマッチする、正規表現）を使う


```
const input = "As I was going to TDL";
const re = /\w{3,}/ig;

console.log(input.match(re)); // ['was', 'going', 'TDL'] (マッチした単語を配列に)

console.log(input.search(re)); // 5 (最初に見つかる単語は5文字目からはじまる)

```

ここまでは、input(文字列)のメソッドで
マッチした文字列、最初に見つかる単語を取得できるということで問題なし

正規表現のメソッドからが少しひっかかった

```
console.log(re.test(input)); // ture

let a = re.exec(input); // execは文字位置を記憶
console.log(a); // [ 'going', index: 9, input: 'As I was going to TDL']
console.log(a[0]); // going
console.log(a[1]); // undefined

console.log(re.exec(input)); // [ 'TDL', index: 18, input: 'As I was going to TDL']
console.log(re.exec(input)); // null (マッチするものがない)

console.log(re.exec());

```

変数`a`のとき、てっきり結果は`was`かと思ってどうして`going`が…と思ったが
正規表現で`g`(グローバルフラグ)が設定されている場合は、`lastIndex`を保持するため、
呼び出した際に、`lastIndex`から検索されることになった

上記のコードではマッチするものがなくなっているため、`lastIndex`は`0`になるが
`lastIndex`が`18`の状態で別の文字列を`re.exec()`でチェックすると
`lastIndex`からの検索となるから注意が必要になる


```
console.log(re.exec(input)); // [ 'TDL', index: 18, input: 'As I was going to TDL']
// console.log(re.exec(input)); // null (マッチするものがない)

console.log(re.exec('I want to play outside freely'));
// [ 'freely', index: 23, input: 'I want to play outside freely']
// freelyのfが18番目になるのでfから検索がスタートする

```

execを使うことはあまりなさそうだが、もし使う時がある場合はハマりそうだと思ったので注意したい
docker-compose上のgoaccessで、アクセスログ解析

**ご注意ください**
dockerも良く理解しておらず、その辺のページをみて色々試した結果なので
間違いもあると思います。ご了承ください。


##この記事を見て、試したかったのが発端です
コマンド一発でウェブサイトのアクセスログをターミナルやウェブブラウザで可視化できる「GoAccess」レビュー
https://gigazine.net/news/20200613-goaccess/


##試した内容

###環境
windows10 home のdockerです


###ディレクトリ構成

好きなディレクトリ（D:\test）にて、下記構成を作った。

```
D:\test\
   goaccess
     config
       goaccess.conf
     html
     logs
       access.log
   docker-compose.yml
```

apacheとかのアクセスログをlogsの中に保存します
多分この名前でないと解析できないかと。（docker-compose.ymlで指定してるし？）


###docker-compose up

docker-compose upで起動して、
http://localhost:7891/
で結果ファイルにアクセスすればグラフなどが表示されました。


###設定ファイルなど

```conf:goaccess.confの末尾に追加
time-format %H:%M:%S
date-format %Y-%m-%d
log-format COMBINED
output /srv/report/index.html
real-time-html true
```

```yml:docker-compose.yml
version: '3'

services:
  goaccess:
    image: allinurl/goaccess
    ports:
      - 7890:7890
    volumes:
      - ./goaccess/config:/srv/config
      - ./goaccess/html:/srv/report
      - ./goaccess/logs:/srv/logs
    command: ["--no-global-config", "--config-file=/srv/config/goaccess.conf", "--log-file=/srv/logs/access.log", -e TZ="Asia/Tokyo", -e "LANG=ja_JP.utf8"]
  nginx:
    image: nginx:1.15-alpine
    volumes:
    - ./goaccess/html:/usr/share/nginx/html
    ports:
    - 7891:80

```
Unboundのビルド方法(1.10.1版)

# 環境
* Ubuntu 20.04
* Python 2.7

# 1, ソースコードを入手する
```bash
wget https://github.com/NLnetLabs/unbound/archive/release-1.10.1.tar.gz
tar -xzvf release-1.10.1.tar.gz
cd release-1.10.1
```
1行目がソースコードを取得し、2行目で解凍し、3行目で解凍したディレクトリに移動します。


# 2, 必要なモジュールをインストールする
```bash
sudo apt install python2.7 python-dev swig libssl libsystemd-dev
sudo ln /usr/bin/python2.7 /usr/bin/python
```
2行目でシンボリックリンクを貼らないと、`configure`でエラーが発生します。


# 3, `configure`を実行する
```bash
./configure --prefix=/usr/ --enable-systemd --enable-cachedb --with-pythonmodule 
```


# 4, `make install`する
```bash
make install
```
少し時間がかかるので、Twitterでも見て待ってましょう。

ビルド完了後、何もエラーが起こらなければ完了です。

# 5, セットアップする
## 5-1, `ld.so.conf`を編集
共有ライブラリを使用可能にするために、`/etc/ld.so.conf`ファイルを編集する必要があります。
`/usr/lib`を`/etc/ld.so.conf`に追加して下さい。

## 5-2, ユーザー・グループを作成
グループ`unbound`と、ユーザー`unbound`を作成します。このユーザーは、Unboundの設定ファイルを読み込んだりする際に使用されます。

```bash
groupadd unbound
useradd -g unbound -d /usr/etc/unbound -s /bin/false unbound
```

## 5-3, 設定ファイルを編集
Unboundの設定ファイルは、`/usr/etc/unbound/unbound.conf`です。
少なくとも、以下の設定は追加しておいたほうがいいかもしれません。
**`chown`は必ず設定しておいて下さい。設定しないと、エラーが発生します。**

```nano:unbound.conf
server:
  verbosity: 1
  chroot: ""
  module-config: "validator iterator"
```

Pythonモジュールを使用する場合は、以下のようにします。

```nano:unbound.conf
server:
  verbosity: 1
  chroot: ""
  module-config: "validator python iterator"
  
python:
  python-script: "/your/script/file.py"
```

## 5-4, 設定ファイルの所有者を変更
現段階で、グループ`unbound`、またはユーザー`unbound`が設定ファイルを読み込めないので、設定ファイルの所有者を変更します。

```bash
chown -R unbound:unbound /usr/etc/unbound/
```

# 6, 起動する
以下のコマンドで起動できます。

```bash
systemctl start unbound
```

# 7, アンインストール
ソースコードをビルドしたディレクトリまで戻り、

```bash
make uninstall
```
と入力するとアンインストールできます。
なお、この操作によって**設定ファイルは削除されない**ので、手動で削除する必要があります。
Goで値オブジェクトを表現する

## はじめに
最近、ドメイン駆動開発設計入門を読み進めているんですが、サンプルコードがC#で書かれているんですね。
個人的にはC#を業務で書いているので、そのまま読み進めればコードは理解できるんですが、どうせなら違う言語で書いてみたいな〜と思い、最近興味をもっているGo言語で書いてみました！！！

## 実装

```go:main.go
package main

import (
	"fmt"

	"github.com/AwataKyosuke/qiita/domain/model/user"
)

func main() {

	// 無効なユーザーの作成
	_, err1 := user.New(0, "sample")
	if err1 != nil {
		fmt.Println(err1)
	}

	// 無効なユーザーの作成
	_, err2 := user.New(1, "")
	if err2 != nil {
		fmt.Println(err2)
	}

	// 有効なユーザーの作成
	user1, err := user.New(1, "sample")
	if err != nil {
		fmt.Println(err)
	}

	// 有効なユーザーの作成
	user2, err := user.New(1, "sample")
	if err != nil {
		fmt.Println(err)
	}

	// ユーザー情報の表示
	fmt.Println(user1.GetID())
	fmt.Println(user1.GetName())
	fmt.Println(user1.Equals(*user2))
}

```

```go:user.go
package user

// 先頭を小文字にすることで外部パッケージから参照できないようにする
type user struct {
	id   id
	name name
}

// ユーザーを作成する場合は、この関数を呼ぶ
// 先頭が大文字なので、外部パッケージから呼び出すことができる
// この関数以外ではユーザーを作成できないようにする
func New(id int, name string) (*user, error) {

	createdID, err := newID(id)
	if err != nil {
		return nil, err
	}

	createdName, err := newName(name)
	if err != nil {
		return nil, err
	}

	user := user{
		id:   *createdID,
		name: *createdName,
	}
	return &user, nil
}

// getterだけを定義することで、外部からの変更を許可しない
func (u user) GetID() id {
	return u.id
}

// getterだけを定義することで、外部からの変更を許可しない
func (u user) GetName() name {
	return u.name
}

func (u user) Equals(target user) bool {
	// 等価チェックで判断する
	return (u.id == target.id && u.name == target.name)
}

```

```go:id.go
package user

import "errors"

// id型を定義
type id int

// idを作成する場合は、この関数を呼ぶ
func newID(value int) (*id, error) {

    // ここにルールを指定することで、不正なデータを作成できないようにする
	if value < 1 {
		return nil, errors.New("idは1以上の整数である必要があります。")
	}
	id := id(value)
	return &id, nil
}
```

```go:name.go
package user

import "errors"

// name型を定義
type name string

// nameを作成する場合は、この関数を呼ぶ
func newName(value string) (*name, error) {

    // ここにルールを指定することで、不正なデータを作成できないようにする
	if len(value) < 1 {
		return nil, errors.New("nameは1文字以上である必要があります。")
	}
	name := name(value)
	return &name, nil
}
```

```bash:実行結果
$ go run main.go 
  idは1以上の整数である必要があります。
  nameは1文字以上である必要があります。
  1
  sample
  true
```

## 終わりに
こうすれば、ユーザーを作成したい場合は、`user.New(1, "sample")`のように、Newを呼ぶ必要があるので、値オブジェクトと同じような振る舞いをするんじゃないかと思って作りました。
DDDもGoも初心者なので、間違っていれば指摘をもらえると嬉しいです！
ちなみに「ドメイン駆動設計入門」ですが、既に買ってよかった感が凄いので、おすすめです！

...これであってるんだろうか

## 参考文献

- https://www.shoeisha.co.jp/book/detail/9784798150727
OriginヘッダによるCSRF対策について

CSRF対策はトークン埋め込み(+CookieのSameSite属性)が定番だが、[Originヘッダを用いた対策](https://qiita.com/mpyw/items/0595f07736cfa5b1f50c#origin-%E3%83%98%E3%83%83%E3%83%80%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-%E8%BF%BD%E8%A8%98)もあると知ったため、試してみた。

## 結論
IE, Edge等で防御できないので、Originヘッダだけの対策は不十分。
トークン埋め込み、SameSiteの設定など、他の対策も取るべき。
※[SameSite属性はIEで非対応](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite)のようで、またログイン不要サイトでもSameSiteでは対策できないため、泥臭いがトークンが一番確実
※追記 [Can I use](https://caniuse.com/#feat=same-site-cookie-attribute)より、SameSite属性はIE11のwin10の2017 Fall Creators Update以降は有効とのこと。それ以前やWin7等は非対応。


## 試した結果
| ブラウザ       |       対策可否 |    備考    |
|:-----------------|------------------:|:------------------:|
| Chrome | ○ | 同一ドメインでもorigin飛ぶ |
| FireFox | ○ | 同一ドメインでもorigin飛ぶ|
| Edge (非chromium版) | × |       別ドメインでもorigin飛ばない |
| IE11 | × | 別ドメインでもorigin飛ばない |

※いずれも2020/6/15時点の最新版

意外なことに、Edgeが対応してないが、[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Origin)を見ると、POSTでは送られないバグがあるとのこと。はやくchromium版になって欲しい。
> \* Not sent with POST requests, see bug 10482384.

IEについてはMDNには対応とあるが、送られている気配が無く、よくわからない。
Edgeが漏れる時点でこの対策だけを取る解は無いので、真面目に調べてない。

また試していないが、MDN曰くAndroid版FireFoxも明示的に有効にしないと送られないらしい。
なかなか足並みがそろっておらず、この対策だけでは厳しい。

## 調査方法
ごく普通のhtml fromの送信先を同一ドメイン、別ドメインと変えて、POSTリクエストのヘッダを見ただけ。
JavaScriptからの送信は確かめていないが、この試験の時点で適当な罠サイトでボタン押されたらアウトだということは分かる。
web開発で遭遇したIE関係のエラーを随時追加していきます。

### 自分用のメモにweb開発でIEで対応していなかった機能を書いていきます。
#### NodeList.foreachが対応していなかった。
解決策：NodeListを配列にしてからforeachする。
参考
https://qiita.com/snjssk/items/8d179566b023703c0663
https://developer.mozilla.org/ja/docs/Web/API/NodeList

***
#### Button要素の中にaタグを入れるとaタグが押せない。
解決策：別にbuttonじゃなくても特に問題なかったためdivに変更した。

参考
https://qiita.com/khsk/items/c026b4a21ac27b2cea71

このページの許可されている親要素を参照
https://developer.mozilla.org/ja/docs/Web/HTML/Element/

mozilla↑を見やすくされているサイト
https://yoshikawaweb.com/element/
***
#### SELECTボックスで標準の奴が消えない。
### 擬似要素での指定が必要。
解決策：

```
::-ms-expand {
  display: none;
}
```
***
#### バッククォートが使えない。
バッククォートを使った変数展開ができなかった。
解決策：
+での文字列結合で対応。

***
#### width:initialが使えない。
width:initialが効かなかった。
IE11では非対応らしい。
解決策：

```
width:auto
width:initial
```
autoの後にinitialを設定することで対応するブラウザのみinitialが設定するようにする。
雑多な論文のメモ 2

# Disentangling by Factorising
Hyunjik Kim, Andriy Mnih 
https://arxiv.org/pdf/1802.05983.pdf

Deep Mind によるFactor VAEの論文。
- disentanglement と reconstraction を両立
- 普通のVAEの横にdiscriminator を置いて、latent space がfactorize されるようにする。
- VAEの目的関数に、Total Correlationを入れる。これは複数の確率変数が独立であるかどうかの指標。
- Total Correlation は普通にやると計算が大変なので、q(z)と$\overline q$(z)をサンプルしてKLを計算する。
- q(z)はxをユニフォームにたくさんサンプリングすれば得られる。
- $\overline q$(z) は、q(z)を作って、そのうちの1つの次元だけ取り出す(よくわからない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/86461ca7-c773-ca16-7fd1-25f52bd942f2.png)

あたらしいdisentanglementの指標も提案している。従来の手法だと全然reconstract できないものも満点になってしまうとか。よくわからないが、Higginsらの手法に割にマイナーな修正を加えたものに思える。コントロールされたデータが必要。

# Understanding and Improving Interpolation in Autoencoders via an Adversarial Regularizer

David Berthelot, Colin Raffel, Aurko Roy, Ian Goodfellow
https://arxiv.org/pdf/1807.07543.pdf

Autoencoder の生成する中間画像がよくなるように敵対学習を使う。

ACAIという名前らしい。
 Adversarially Constrained Autoencoder Interpolation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/f1ed37fb-4f6e-0205-67da-f529e74835dd.png)

- 2つの画像の中間表現をある比率αで内挿したものをデコードし、その結果からαを予測する。
- criticはαを予測しようとする。autoencoderはαが0だと思わせようとする。つまり下のパスから来たものだと思わせようとする？
- つまり混ぜたものかどうか識別できないように頑張るということか。

- 4章ではダウンストリームタスクの性能を評価している。つまり教師なし学習で得られたrepresentationで別のタスクを実行。いずれも性能が上がったと主張。
 - single layer でのクラス分類
 - クラスタリング



# Better Mixing via Deep Representations
Yoshua Bengio, Gregoire Mesnil, Yann Dauphin and Salah Rifai

https://arxiv.org/pdf/1207.4404.pdf

3つの仮説を提唱

- 深いネットワークを使うと、できた表現上でのマルコフチェインが早く混合される。
- 深いネットワークを使うと、表現がよりよくdisentangleされる。
- disentanbleされた空間では、
  - 元のデータ空間で混んでいた部分のマニフォールドが広く展開され、
  - マニフォールド近辺の高確率な部分の占める空間の相対的サイズが拡大する

DBNでテストしているな。2012年だからなあ。。


# Isolation Forest

https://en.wikipedia.org/wiki/Isolation_forest

決定木ベースのAnomaly Detection 手法。ランダムに特徴量を選択し、ランダムに分割点を選んで空間を分割していく。個々の要素が他の要素から分離されるのに要した分割数で、「稀さ」を定義する。つまり木構造のパスが長くなった部分が稀であり、したがってanomaly である。
PHPで簡易ログイン機能を実装する

#概要

PHP初心者・非エンジニアさん向け。
ログイン機能を実装したい！でもDBを使うほどではないし工数を削減したい…という場合です。
以下の記事を参照しながら、PHP初心者の引っかかったポイントやメモをまとめます。

**【PHPで簡易ログイン機能】DBを使わず固定文字列で取り敢えずログイン機能の実装**
http://crought.com/blog/%E3%80%90php%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A9%9F%E8%83%BD%E3%80%91db%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E5%9B%BA%E5%AE%9A%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E5%8F%96%E3%82%8A%E6%95%A2-82/#html

**PHPのheader関数でリダイレクト処理を行う方法【初心者向け】**
https://techacademy.jp/magazine/11609

#やっていきましょう
入力情報としてパスワードだけを必要としたため、元記事よりもやや簡易な実装になっています。

- `login.php` … ログインするための画面
- `member-index.php` … ログインしたメンバーのみがアクセスできる初期画面
- `index.php` … ログインしていない人向け画面

<br />ログイン画面

~~~php:login.php
<?php
session_start(); // セッション開始宣言

// ログイン済みかを確認
if (isset($_SESSION['USER'])) {
    header('Location: member-index.php'); // ログインしていればmember-index.phpへリダイレクトする
    exit; // 処理終了
}
// ログイン機能
$error_message = '';
if(isset($_POST['login'])) { // name="login"と対応している
    if($_POST['password'] == 'qwerty123') { // パスワード
        $_SESSION['USER'] = 'user'; // 
        header('Location: member-index.php');
        exit;
    } else {
        $error_message = 'パスワードが違うみたいです';
    }
}
?>
<!doctype html>
<html>
  <body>
    <!-- 中略 -->
    <div>
      <p style="color:red;"><?php echo $error_message ?></p>
      <form id="memberLogin" method="post" action="login.php">
        <p>パスワードを入力してください。</p>
        <p>
          <input type="password" id="password" name="password" size="20" />
        </p>
        <p>
          <input type="checkbox" id="password-check" name="" value="" />
          <label for="password-check" onclick="">パスワードを表示する</label>
        </p>
        <p>
          <button type="button" onclick="history.back()">もどる</button>
          <button type="submit" name="login" size="" value="">送信</button>
        </p>
      </form>
    </div>
  </body>
</html>
~~~

<br />ログイン後初期画面（ログアウト機能つき）

~~~php:member-index.php
<?php 
session_start();

//ログイン済みかを確認
if (!isset($_SESSION['USER'])) {
    header('Location: login.php');
    exit;
}

//ログアウト機能
if(isset($_POST['logout'])){
    $_SESSION = [];
    session_destroy(); // セッションを完全に破棄
    header('Location: index.php'); // ログインしていない人向け画面に遷移
    exit;
}
?>
<!doctype html>
<html>
  <body>
    <!-- 中略 -->
    <div>
      <form method="post" action="member-index.php">
        <input type="submit" name="logout" value="ログアウト"><br>
        <p class="button-nav">一般ページに戻ります</p>
      </form>
    </div>
  </body>
</html>
~~~

#留意点
###PHP初心者向けメモ
- `form action=""` の向き先
当たり前のことを…と思うかもしれませんが、html内でform action=""に指定するのは自画面のURLで、いったん自画面のphp処理を走らせてリダイレクトさせるのが正しい流れです（最初PHPの処理の流れがピンとこず別画面のURLを指定してしまっていた）。

- `$_POST['login']`
[]内は受け取りたいフォームのname属性と対応している。
パスワード以外のものをGETメソッドで受け取りたいときは`$_GET['hoge']`を使用する。

- `$_SESSION['USER']`
必ずセッション開始宣言 `session_start();` を行ってから使用する。
ここでは固定文字列を突っ込んでいますが、もちろん入力されたusernameなどを代入して応用するのもあり。

- `header('Location: member-index.php');`
リダイレクト処理ができるいわゆる「header関数」。Locationに続けて絶対パスを指定する。

###セキュリティ面（2023/6追記）
当然ながら、パスワードを平文で載っけている超簡易的な方法なので実装の際は十分セキュリティに配慮してください。
Kintoneでレコード編集画面を開いた時にルックアップ項目を自動取得する

レコード編集画面を開いたときに全てのルックアップ項目を更新します。
JSファイルを作って以下をコピーして読み込ませる。

```allLookupUpdate.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    var record = event.record;
    for (var key in record) {
      if ("SINGLE_LINE_TEXT" === record[key]["type"]) {
        record[key].lookup = true;
      }
    }
    return event;
  });
})();
```



以上
フリーランスとは法的にどのような立場にあるのか　Part1

#はじめに
僕はプログラミングの勉強を始めて3ヶ月のペーペーです。
技術的なことを書けるほどの知識もないので、僕が大学で専攻している法律のことに関して
今回は書いていきたいと思います。

尚、これから書く内容は、主に労働法の観点からフリーランスという働き方について述べる
ものになりますが、僕自身現場経験もないため、実情とそぐわない内容かもしれません。
その点についてはご容赦ください。

#労働者とは
まずはじめに
労働法が規定する**労働者**とはどのように定義されているのかということについて
述べたいと思います。

労働基準法（以下、労基法と記す）9条には
「この法律で「労働者」とは、①*職業の種類を問わず*、②*事業または事務所に*、③*使用される者*で、④*賃金を支払われる者*をいう」
と記載されています。（番号は説明の便宜上ふったものであり、実際の条文にありません）

また、この基準に適合する人にはもれなく
1,労働基準法、労働契約法、最低賃金法などの適用が受けられる
2,職務遂行中の事故・疫病について、労災保険法による災害補償等が受けられる
という特典がついてきます。

逆にいうと、1,2のような特典をもらうためには、労基法9条の定める「労働者」に該当する必要があるわけです。

#労働者に該当するためのポイント
労基法9条のいう「労働者」に該当するためには、上記した①〜④の全ての項目を満たす必要があります。そこで、①〜④に該当するためのポイントについてみていきましょう。

①について
「*職業の種類を問わず*」とは
肉体労働であるか、精神活動であるか、アルバイトであるか、パートタイマーであるかといったことを問わないということになります。
つまり、どんな人でも、働いてさえいれば①の基準はパスすることができます。
よって、働いてさえいれば、①の基準について考慮する必要はありません。

②について
「*事業または事業所に*」については
「工場、鉱山、事務所、店舗等の如く一定の場所において相関連する組織のもとに業として継続的に行われる作業の一体をいう」と難しい説明がなわれていますが、これに関しても①同様、働いている人であればこの基準はパスされます。ここも考慮する必要はありません。

③について
ここが、今回の肝となる基準です。労基法9条のいう「労働者」に該当するかどうかは、この基準をパスできるかどうかにかかっています。詳しくは後ほど説明します。

④について
「賃金を支払われる者」とは
労基法11条の「賃金」を支払われるものをいいます。
賃金については労基法11条にて
「この法律で賃金とは、賃金、給料、手当、賞与その他名称の如何を問わず、労働の対象として使用者が労働者に支払うすべてのものをいう」とされています。
つまり、ボランティアでなく、お金が支払われてさえいれば、④の基準はパスです。

したがって、多くの働く人は①、②、④の基準はクリアしていて、労基法9条の「労働者」に該当するか否かについては③に基準について考慮する必要があるのです。

#使用される者とは
③の基準である「使用される者」に該当するためには
「労働者が使用者の**指揮命令に服して**労働すること」
つまり、**使用従属関係**が成り立っている必要があります。

この、「**指揮命令に服して**」という文言は今回とても重要になります。
というのも、働く人と使用者が結ぶ契約には、主に*労働契約*と*請負契約*がありますが、
労働契約は、**結果を重視するのではなく、プロセスについて重視した契約**であるのに対し
請負契約は、**プロセスではなく、結果を重視した契約**であるからです。
つまり、プロセスについて重視した労働契約は、勤務形態、勤務態度が重視され、自ずから使用従属関係が発生するのに対し、結果を重視する請負契約は、結果さえ出してくれればそれまでの過程はどうでもいい、ということになり使用従属関係は発生しません。

したがって、労働契約を結んでいる働く人は「使用される者」に適合し、「労働者」に該当するのに対し
請負契約を結んでいる働く人は「使用される者」に適合せず、「労働者」に該当しないということになります。

つまり、この考えに即して考えると、フリーランサーは「労働者」に該当せず
上記した1,2の特典はもらえないということになるのです。

しかし、あくまでこれは条文の解釈による定義であり、実務では契約類型ではなく、具体的実態に基づいて③の基準が考慮されます。そのため、請負契約であっても、「労働者」に該当するケースもあります。

長くなりそうなので今回はここで終わりにします。
次回の内容で、実際にどのように③の解釈がなされるかについて書きたいと思います。
最後までみていただきありがとうございます。
DAX 関連記事まとめ

## 概要
DAX関連記事のリンク集です。

## リンク集

[DAX Studio利用ガイド](https://qiita.com/ryoma-nagata/items/0a8c5327f51284aced44)


[Power BI パフォーマンスアナライザーでDAX Queryを作成する簡単な方法](https://qiita.com/ryoma-nagata/items/f140e8f01975553ca5cd)

[まだDAX Queryの作成に消耗してるの？DAX StudioのQuery Builder機能の紹介](https://qiita.com/ryoma-nagata/items/6a8eb88990466e382265)



[Power BI Desktop上のテーブルのデータをテキストファイル（CSV、TSV）にエクスポートする方法](https://qiita.com/ryoma-nagata/items/26a9d678a7531c85cfbc)
RubyMineでブレークポイントが白くなって止まらなくなったときの対応

# デバッグしたいのに止まらないブレークポイント

ブレークポイント設定しても止まらない。
しかもなんだか白い。赤くない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/0c048630-ad1a-232b-08c2-ec08d9448045.png)

# ミュートしてました

Øの部分を押してしまい、ミュートになったぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/9b0527b4-2adb-f9b3-0e6c-67c2d8625174.png)
VBに関しての質問

Private Sub Form1_Load()
Label1.Text = "秒数を入力してください。"
Label2.Text = "秒は、"
Label3.Text = "時間と"
Label4.Text = "分、"
Label5.Text = "秒です。"
End Sub

Private Sub Button1_Click()

Dim Byo, Fun As Integer
Dim Hour, Minute, Second As Integer

Byo = Val(Textbox1.Text)
Fun = Byo \ 60

Hour = Fun \ 60
Minute = Fun Mod 60
Second = Byo Mod 60

Textbox2.Text = Hour
Textbox3.Text = Minute
Textbox4.Text = Second

End sub

Textbox2〜4の答えが分からなくて、困っています。
【Python】ChromeのWebdriverエラーを解消する

これで何度目か分かりませんが、またSeleniumでスクレイピングしようとするとエラーになりました。
エラー内容はおなじみのやつ。

```
session not created: This version of ChromeDriver only supports Chrome version 80
```
Google翻訳してみます。
***「セッションが作成されていません：このバージョンのChromeDriverはChromeバージョン80のみをサポートしています」***

前も出ました。コチラ↓
[【Python】Seleniumでエラー、スクレイピングできなくなったが、、](https://qiita.com/pytomo/items/93e6b628ce09eb16c9bb)

急にエラーになるのホントやめてほしいです。

##環境を確認してみる
まずはGoogle Chrome。
![a02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/f467de3b-d685-e585-b5e4-b0f80e8e8962.png)

続いてchromedriver-binary
![a01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/a1d1e56d-3d77-ac37-5534-e1efdd9d0125.png)

| | |
|---|---|
|GoogleChromeのバージョン |83.0.4103.97 |
|chromedriver-binaryのバージョン |80.0.3987.106.0 |

GoogleChromeは自動でバージョンアップされているので、chromedriver-binaryのバージョンを合わせれば良いんですね。

## GoogleChromeのバージョンに合わせてドライバーを再インストールする
まずは旧バージョンを削除します。

```
pip uninstall chromedriver-binary
```
確認します。

```
pip show chromedriver-binary
```
![a03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/e487f30e-7c1f-6e89-7f27-f163184fb8a4.png)
ちゃんと削除されています。
続いて、GoogleChromeのバージョンに合わせたchromedriver-binaryをインストールします。
あらかじめ、GoogleChromeのファイルが格納されているパスを調べておいてください。
私のパソコンでは「C:\Program Files (x86)\Google\Chrome\Application」にありました。

```:コマンドプロンプト
for /f "tokens=1" %V in ('dir /B /O-N "C:\Program Files (x86)\Google\Chrome\Application" ^|findstr "^[0-9].*" ') do pip install chromedriver-binary^<^=%V
```

ちゃんとインストールされているか確認します。
![a04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/97d99ae9-6c3a-a9f8-6ede-4d972b2543fa.png)
バージョン「83.0.4103.39.0」がインストールされています。

SeleniumでのWebスクレイピングもエラーなく処理されました。
めでたし、めでたし。
Azure アプリケーションのJVM にタイムゾーンを設定する


Tomcat に設定をするのではなくて、アプリケーションの設定で可能。

[Configuration] - [Application Settings] にて [+ New Application setting] として
WEBSITE_TIME_ZONE = Tokyo Standard Time
を設定する。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/7d37982f-f150-6fb9-5940-3f896228a438.png)


値は以下と同じものを設定できるのかな？と思います。
https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values


以上。
scriptタグで書いたReactで外部ファイルのコンポーネントをimportしたい

#はじめに
公式Reactチュートリアルの「既存のウェブサイトにReactを追加する」というのがあります。
JavaScriptをscriptタグから読み込んで使うというReactの最もシンプルな使い方とあります。
このとき読み込まれるJavaScriptに使うコンポーネントを別ファイルから読み込ませたかったのですが、うまくいかなかったので、私の行った解決策をここにまとめたいと思います。

>[既存のウェブサイトにReactを追加する](https://ja.reactjs.org/docs/add-react-to-a-website.html)

#解決策
手順を追って説明します。

##1. scriptタグのtype属性にmoduleと書く
```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>

    <div id="root"></div>

    <!-- CDNでReactを読み込む -->
    <script
      src="https://unpkg.com/react@16/umd/react.development.js"
      crossorigin
    ></script>
    <script
      src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
      crossorigin
    ></script>
    
    <!-- JSXをコンパイルしていない場合babelも読み込む必要があります -->




    <!-- ココです -->
    <script type="module" src="js/event-list.js"></script>

  </body>
</html>
```

##2. コンポーネントのファイル
クラスを別ファイルに書き、エクスポートします。

```react:LikeButton.js

class LikeButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = { liked: false };
  }

  render() {
    if (this.state.liked) {
      return "You liked this.";
    }

    return (
      <button
        onClick={() => {
          this.setState({ liked: true });
        }}
      >
        Like
      </button>
    );
  }
}

// クラスをexport
export default LikeButton;

```

##3. importする
create-react-appで作ったReactアプリではimportするときの読み込み先のファイル名の拡張子「js」を省略できますが、この場合拡張子を省略してしまうと動きません。理由はよくわかりませんでしたが以下のようにすると動きました。

```react:like-button.js

import LikeButton from "./LikeButton.js"; //読み込み元のファイル名の拡張子を省略しない

ReactDOM.render(
  <LikeButton />,
  document.getElementById("event-list-container")
);


```

#おわりに
要するに、
「scriptタグのtype属性をmoduleとする」
「importするとき拡張子を省略しない」
ということです。
初心者が試行錯誤したやり方ですので、よりよい方法などありましたら教えていただけると嬉しいです。
間違い等もご指摘ください。
読んでいただきありがとうございました。
SciPy.linalg系関数に関するメモ

# SciPy.linalgでやりがちな（というか自分の踏んだ）ケアレスミスのメモ

### 逆行列 (Matrix inverse)
To obtain the matrix inverse, use ```linalg.pinv()``` instead of ```linalg.inv()```

linalg.pinv の docs: 
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.pinv.html
linalg.inv の docs: 
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html
その他 Ref: 
https://www.quora.com/What-is-the-difference-between-pinv-and-inv#:~:text=What%20is%20the%20difference%20between%20pinv%20and%20inv%3F,-ad%20b&text=pinv()%20function%20in%20OCTAVE,be%20an%20m*n%20matrix.

------

### linalg.eig関数について
- linalg.eig関数でeigenvectorは行列として縦方向に返ってくる
- Docs: https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig.html

When using ```eigval, eigvec = scipy.linalg.eig()```, the returned eigenvectors are in the **columns** of ```eigvec```.
Supposing we want the first eigenvalue & eigenvector pair of a matrix ```my_matrix```, 

```Python
import scipy.linalg as la
eigval, eigvec = la.eig(my_matrix)
```

then we need

```Python
eigval_pair1 = eigval[0]
eigvec_pair1 = eigvec[:,0]
```

and **NOT**

```Python
eigvec_pair1 = eigvec[0]
```
『Gatsby.jsでReactで作ったものを高速化しよう』が勘違いだった件

# ターゲット
『うおーーー。Gatsby.jsすげーーー。SUGEEEE。こりゃ使うっきゃないでしょ！』
で、何がすごいの？何が出来るの？って人
メリットを書いている人が多いので使ってみようと思ったら、Gatsby.jsを勝手に勘違いしてしまったのでまとめてみました。

# 『Gatsby.jsでReactで作ったものを高速化しよう』ではない
初期表示をGatsby.jsのSUGEEEEパワーで爆速にした後にデータ取得も含めて普通にReactアプリを作っていけば良いのかと思っていたがそんなことなかった。

『[Gatsby.jsはSSR的な静的HTML生成に加えて、それと連動する通常のReactアプリも生成します。](https://qiita.com/uehaj/items/1b7f0a86596353587466#gatsby%E3%81%AE%E7%89%B9%E5%BE%B4%E3%81%A8%E5%8B%95%E4%BD%9C)』を見て安直に捉えてしまった。

データ取得はビルド時にのみ行われ、ビルド時に形成されたGarphQL DBの全体は必要ないので、「クエリの結果」のみをJSONとして合わせてデプロイし、ブラウザ内ではGraphQL DBクエリ結果取得の代りにJSON値を使う。
CF. [When building with Gatsby, you access your data through a query language named GraphQL.](https://www.gatsbyjs.org/docs/graphql/)

なので、毎回データ取得して表示させるようなサイトにはむいてないかもしれない。
Ajaxとかで普通にデータ取得すればええやんって話しですが、だったらGatsby.jsな必要がないかもしれない。

# ビルド後にAPIからデータ取得できる訳ではない
データ取得はビルド時のみなので、ビルド後にAPIから取得ではなくビルド時のデータ取得が楽ちんですよってことでした。
CF. [gatsby-source-apiserver（A gatsby source plugin for pulling in third party api data.）](https://www.gatsbyjs.org/packages/gatsby-source-apiserver/)

# ビルド後に非同期でデータ取得できる訳ではない
データ取得はビルド時のみなので、ビルド後にAPIから取得ではなくビルド時のデータ取得が非同期で出来ますよってことでした。
CF. [Gatsby Node APIs（Gatsby gives plugins and site builders many APIs for controlling your site’s data in the GraphQL data layer.）](https://www.gatsbyjs.org/docs/node-apis/#sourceNodes)

# ビルド後にrestAPIからでデータ取得できる訳ではない
データ取得はビルド時のみなので、ビルド後にAPIから取得ではなくビルド時のデータ取得がRestful APIから出来ますよってことでした。
CF. [GatsbyJS getting data from Restful API](https://stackoverflow.com/questions/49299309/gatsbyjs-getting-data-from-restful-api)

# データを自動更新できる訳ではない
データが自動更新さえれると勘違いしたが、デプロイが自動ってことでした。実際はビルドすることによってGarphQL DBが更新されるのでデータは更新されているが、変更の監視や都度のデプロイは想定と違った。
CF. [自動更新できる「Youtube検索を利用した静的サイト」を無料で作る](https://qiita.com/hide2018/items/70a33d0d26645205db0a)

# まとめ
### ・データ取得はビルド時のみ
### ・AjaxやAxios使うならGatsby.jsを使う必要はないかも
### ・毎回データ取得して表示させるようなサイトにはむいてないかも、ってかGatsby.jsな必要がないかも
### ・Gatsby.jsが向いているのはブログやコーポレートサイトなどのHTMLで問題なく作れちゃうサイト
### ・Gatsby.jsの使い所が分からない
## Wordpressをフルスクラッチで作るならGatsby.jsの方がいいかも
※ テーマ反映出来ないので移行はめんどくさそう
CF. [GatsbyJS + NetlifyでWordPressを記事管理システムにしちゃう方法](https://haniwaman.com/gatsby/#Gatsby)
Androidの全アプリのパッケージ名を取得する

端末にインストールされてるアプリのパッケージ名をアプリ内のコードで取得する。

## 公式ドキュメント
https://developer.android.com/reference/android/content/pm/PackageManager#getInstalledPackages(int)

`PackageManager#getInstalledPackages`を使えばいいらしい。

## コード


```kotlin
val flag: Int = PackageManager.GET_META_DATA // ここに条件を指定するフラグを設定
// 全パッケージ取得（システムアプリ含む）
val packages: List<PackageInfo> = context.packageManager.getInstalledPackages(flag)
// パッケージ名だけに絞る
val packageNames: List<String> = packages.map { it.packageName }
// 取得したらあとはご自由に
packageNames.forEach { Log.d("PackageRepository", it) }
```

## 備考

割と簡単だった。
エミュレータだと163個くらいの数だった。

`packageManager.getInstalledApplications`もあるけど、どっちでもいいか
Firebase App Distribution で配布したアプリが一覧に出てこない問題

# 問題

Test apps の一覧に配布したアプリが表示されない

[Firebase Console](https://console.firebase.google.com/)上では以下のように承認済みになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/a706ab61-cb6f-6de7-4b54-921d2126ea11.png)


# 解決方法

[Firebase Console](https://console.firebase.google.com/)にログインしてテスター一覧から一度削除して、再び追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/ccdff995-d758-b44e-a340-f069302efae0.png)

全てのテスターを表示のところから削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/21e4e9fb-db51-3083-cf0f-7d864f14daf5.png)

その後、**対象の配布アプリにもう一度テスターを追加する**とメールが届き、リンクをタップすると以下のような承認の画面がもう一度出てくるので承認すると無事一覧に出てくるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/f281579e-5ff0-78c1-b2b5-c5534a9e8fd1.png)

サインアウトしたり、キャッシュを消したり様々やったのですが解決できず上記をやったところ正しく表示されるようになったので共有しておきます。

ハマりました。
ゼロから始めるLeetCode Day57 「35. Search Insert Position」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day56 「1480. Running Sum of 1d Array」](https://qiita.com/KueharX/items/483a52cc3b44f52bbe3a)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。


# 問題
[35. Search Insert Position](https://leetcode.com/problems/search-insert-position/)

難易度はEasy。

とあるアルゴリズムを学ぶのに良い問題だと思ったので記事を書きました。

問題としては、ソートされた配列とターゲットの値が与えられたます。
ターゲットが見つかった場合はそのインデックスを返します。見つからなかった場合は、それが順番に挿入された場合のインデックスを返すような、アルゴリズムを設計してください、というものです。

なお、配列内に重複がないと仮定しても構いません。

>Example 1:

>Input: [1,3,5,6], 5
Output: 2
Example 2:

>Input: [1,3,5,6], 2
Output: 1
Example 3:

>Input: [1,3,5,6], 7
Output: 4
Example 4:

>Input: [1,3,5,6], 0
Output: 0




# 解法

```Python
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        low = 0
        high = len(nums) -1
        while low <= high:
            mid = (low + high) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                low = mid + 1
            else:
                high = mid - 1
        return low
# Runtime: 56 ms, faster than 49.71% of Python3 online submissions for Search Insert Position.
# Memory Usage: 14.6 MB, less than 16.72% of Python3 online submissions for Search Insert Position.
```

知っている人が見たらわかると思いますが二分探索の問題です！

Pythonではライブラリに`bisect`があるのでそちらを使って簡単に書くこともできるのですが、原理原則を知ってかける能力が大事だと思うので書いてみました。

知っておくとどこかで助かるかも・・・？

今回はここまで。
お疲れ様でした。