OmniAICreator/Qiita-1.07M huggingface dataset:
Backlog API で取得したプロジェクト一覧を、kintoneにCSV読み込みしてプロジェクトマスタを作成する

プロジェクト管理ツール[Backlog](https://backlog.com/ja/)のプロジェクト一覧を[Backlog API](https://developer.nulab.com/ja/docs/backlog/)を使ってプロジェクトの一覧を取得して見ます。
さらに、出力されたJSONデータを[jq](https://stedolan.github.io/jq/)で整形してCSVに出力し、それをプロジェクトマスタとしてkintoneに読み込みます。
最終的にはBacklogの課題の実績時間をプロジェクト毎に集計したいと思います。

# 対象

* Backlogユーザー
* プロジェクトマネジメントに関わる方

# システム構成

* Backlog
* kintone

# Backlog API でプロジェクトの一覧を取得する

## プロジェクト一覧の取得

* [/api/v2/projects](https://developer.nulab.com/ja/docs/backlog/api/2/get-project-list/)

[cURL](https://curl.haxx.se/)を使います。
`$BACKLOG_URL`にはBacklogのURL,`$APIKEY`にはBacklogのAPIKeyをセットして渡します。

```bash
curl -s $BACKLOG_URL/api/v2/projects\?apiKey=$APIKEY
```

結果

```
$ bash project-sample.bash 
[{"id":19547,"projectKey":"PROG","name":"プログラミング開発","chartEnabled":false,"subtaskingEnabled":false,"projectLeaderCanEditProjectLeader":false,"useWikiTreeView":true,"textFormattingRule":"markdown","archived":false,"displayOrder":2147483646}]
```

`jq`で整形します。

`curl -s $BACKLOG_URL/api/v2/projects\?apiKey=$APIKEY | jq -r '.'`

```json
[
  {
    "id": 19547,
    "projectKey": "PROG",
    "name": "プログラミング開発",
    "chartEnabled": false,
    "subtaskingEnabled": false,
    "projectLeaderCanEditProjectLeader": false,
    "useWikiTreeView": true,
    "textFormattingRule": "markdown",
    "archived": false,
    "displayOrder": 2147483646
  }
]
```


"ID","プロジェクトKey","プロジェクト名"のみ取り出してCSVで出力します。
適当な名前でCSVファイルにしておきます。


`curl -s $BACKLOG_URL/api/v2/projects\?apiKey=$APIKEY\&archived=false | jq -r '.[] | [.id, .projectKey, .name] | @csv'`

```
19547,"PROG","プログラミング開発"
```

# プロジェクトマスタ kintoneアプリ

kintoneアプリを作ります。

<img width="884" alt="スクリーンショット 2020-04-23 9.11.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/73588523-ad6e-a8ec-58f1-e88fd6b0202a.png">

予定工数は後ほど数値を手入力します。

出力したCSVを読み込みます。

<img width="982" alt="スクリーンショット 2020-04-23 9.14.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/2e6b2cbd-cd0a-59c6-72a7-632352a8cf03.png">



まずはここまで。

# 次やること

1. Backlog API で取得したプロジェクト一覧を、kintoneにCSV読み込みしてプロジェクトマスタを作成する（済）
2. Backlogのタスク登録→kintoneのタスク管理アプリにレコード登録する
3. タスク管理アプリとプロジェクトマスタからプロジェクト毎の予定時間と実績時間の集計をする

2.は外部API連携サービス([Zapier](https://zapier.com/)や[Power Automate](https://flow.microsoft.com/ja-jp/)、[Integromat](https://www.integromat.com/))を利用するかもです。
3.は集計用のkintoneアプリを作って、集計処理をJSでゴリゴリ書こうかな。
Github ローカルリポジトリをリモートリポジトリと紐づける

## 目的

- 実施するたびに毎回検索している気がするのでまとめる

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Git バージョン | 2.25.1 | Homwbrewを用いて導入 |

## 前提環境

- Githubにはすでにリモートリポジトリは作成済み。
- ローカルリポジトリは`$ git init`コマンドを用いてすでに作成済み。

## 実施方法概要

1. リモートリポジトリ(Github)のリポジトリアドレスのコピー
1. ローカルリポジトリとリモートリポジトリを紐づけ

## 実施方法詳細

1. リモートリポジトリ(Github)のリポジトリアドレスのコピー
    1. リモートリポジトリの「Clone or Download」をクリックする。

        <img width="506" alt="miriwo0104_todo_for_laravel_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/082f23de-e137-a096-b2b7-6c04975e70a9.png">

    1. 矢印が指している部分をクリックしてリンクをコピーする。

        <img width="480" alt="miriwo0104_todo_for_laravel_2-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4a11d5c8-251f-b381-f209-65ef121f4c09.png">

1. ローカルリポジトリとリモートリポジトリを紐づけ
    1. ターミナルにて`$git init`を実行したディレクトリに移動する。
    1. 下記コマンドを実行して紐付けを行う。

        ```terminal
        $ git remote add origin コピーしたリポジトリアドレス
        ```
    1. 下記コマンドを実行して紐づいているリモートリポジトリアドレスを確認する。

        ```terminal
        $ git remote -v
        >origin  コピーしたリポジトリアドレス (fetch)
        >origin  コピーしたリポジトリアドレス (push)
        ```
家でもできるぞ！無料でうけれるセミナーまとめ（ITエンジニア向け）

# こんな時期だから
家で一気にスキルアップをしよう！いろんなセミナーが無料解放してくれている！
# 誰向け？
新入社員やこれからデータ系エンジニアを目指す方に特におすすめします。

# データ分析
###### データサイエンスにこれから手を出すということなら統計検定２級レベルはとりたい
- データサイエンススクール（総務省統計局）   http://www.stat.go.jp/dss/
- データサイエンスオンライン講座（総務省統計局） https://www.stat.go.jp/dss/online.html

###### tableau
- tableauが90日間e-ラーニングを無料解放中。アクセスコードは “ 2020elearning “
https://www.tableau.com/learn/training/elearning?fbclid=IwAR2bRx45cBMsZc9545iuA-SMDtiGdMruYQfZSYi6UeP3c6pYNl1I0iJdGgs

- データがないよっていうのなら、publicでオープンデータを使って表を描いてみよう。
 - Tableau Public無償版  https://public.tableau.com/ja-jp/s/download 
 - 今ならコロナ関係のデータセットを利用して、色々作ってみると勉強になるかもしれません

###### キカガクでMLの基礎を身につけよう！
- https://www.kikagaku.ai

###### AWS認定試験やAWSのMLハンズオン等
- https://www.aws.training/LearningLibrary?&search=&tab=digital_courses 
- AWSって？ってからだったらここから
    - AWS Cloud Practitioner Essentials
        - https://www.aws.training/Details/Curriculum?sc_channel=em&sc_campaign=Seminar202004&sc_medium=em_239991&sc_content=REG_webinar_strat&sc_geo=japn&sc_country=jp&sc_outcome=reg&trk=em_239991&campaign-id=AWS_EM&id=34408&mkt_tok=eyJpIjoiWmpJNE16QmlaRFEzTUdWbSIsInQiOiJkUTZySld3bDNyRkFxXC9DRE1HSHpEMGdpS0dEU2JucXlDWnJmeGd2SXlaKzVcL2E3YzM1N3dsU3RGZWJDVHdIeXdxMDMwT1dXUHd3dHA5eGFQOTh5WU9ORFwvckhQZVdJMlA5Z2tcL2VoMW85S1wvWGd6aXg4YitEOWRvXC9EZVQzVHJRbm9RYTN4XC9ybytGWWtINTRpQUQzNk1nPT0ifQ%3D%3D
    - AWS Well-Architected Training (Japanese) (AWS による優れた設計トレーニング)
        - https://www.aws.training/Details/Curriculum?sc_channel=em&sc_campaign=Seminar202004&sc_medium=em_239991&sc_content=REG_webinar_strat&sc_geo=japn&sc_country=jp&sc_outcome=reg&trk=em_239991&campaign-id=AWS_EM&id=12033&mkt_tok=eyJpIjoiWmpJNE16QmlaRFEzTUdWbSIsInQiOiJkUTZySld3bDNyRkFxXC9DRE1HSHpEMGdpS0dEU2JucXlDWnJmeGd2SXlaKzVcL2E3YzM1N3dsU3RGZWJDVHdIeXdxMDMwT1dXUHd3dHA5eGFQOTh5WU9ORFwvckhQZVdJMlA5Z2tcL2VoMW85S1wvWGd6aXg4YitEOWRvXC9EZVQzVHJRbm9RYTN4XC9ybytGWWtINTRpQUQzNk1nPT0ifQ%3D%3D

###### AWS Innovate セミナー　https://aws.amazon.com/jp/about-aws/events/aws-innovate/
- このあたりのハンズオンもおすすめ
 - [AI/ML][Level 100] Amazon Forecast / Amazon Personalize ハンズオン
 - [Serverless][Level 100] サーバーレスアーキテクチャで翻訳 Web API を構築しよう！



# 業務知識
###### マーケティング系
- もう島袋さんが一気にまとめていてくれたのでこちら！！！このG-calender 入れれば完了。
https://note.com/simako/n/n143f7312b5f3?fbclid=IwAR0Yxl5TE4GgAwFH3yiMPitCkM7Q4W7DREDVu6OwRcY4kj8fsth0GhSoVhc
chisel

#chiselで、仕事のverilog生成を楽にできないか考えて取り組み中

なんとか形になった気がするので、一応公開してみます。
必要箇所だけ抜粋したので、elaborateエラーが出るかもしれません。
出たら教えてください。

このconfigを読み込ますと、各信号を
io.apb_core.elements("ssp")(0).PRDATA :
のように指示できるので、for文なので、APBSELを作れるはず。


```ruby:qiita.scala
package gcd
import chisel3._
import chisel3.experimental.ChiselEnum
import chisel3.experimental.{DataMirror, requireIsChiselType}
import chisel3.testers.BasicTester
import chisel3.util._
import scala.collection.immutable.ListMap
class APBSEL[Conf <: RVConfig] (conf:Conf) extends Module {
  val io = IO(new Bundle {
    val apb_master = new APBSlaveChannel
    val apb_core = new APBSlaveChannelCustom3(conf)
  })
}
class APBSlaveChannel extends Bundle {
  val  PADDR = Input(UInt(32.W))
  val  PWDATA = Input(UInt(32.W))
  val  PRDATA = Output(UInt(32.W))
  val  PSEL = Input(Bool())
  val  PENABLE = Input(Bool())
  val  PWRITE = Input(Bool())
  val  PREADY = Input(Bool())
  val  PREADYOUT = Output(Bool())
}
class APBSlaveChannelCustom3[Conf <: RVConfig](conf:Conf) extends Record {
  println(conf.insts_info)
  var elts = Array(("",0));  //OK
  conf.insts_info.foreach{ case (key,array) =>
    elts = elts :+ (key,array(0))
  }
  println(elts)
  val elements = ListMap( elts map { case (inst,num) =>
    s"$inst" -> Vec(num,Flipped((new APBSlaveChannel)))
  }:_*)
  def apply: Data = elements("APBSlaveChannel")
  override def cloneType: this.type = (new APBSlaveChannelCustom).asInstanceOf[this.type]
}

abstract class RVConfig()
{
  val ADDR_MAX_TOP = 0x40226fff
  val ADDR_MAX_TOP = 0x40226000
  val insts_info = scala.collection.mutable.LinkedHashMap[String, Array[Int]]()
  insts_info += ("uart" -> Array(4,0x40))
  insts_info += ("ssp" -> Array(4,0x40))
}
case class RV64ISynth() extends RVConfig
{
}

```
Libvirt on ubuntuでAppArmorを黙らせる

libvirtで怪しい実験をしようとすると、すぐにAppArmorが文句を言ってPermission deniedになるのを黙らせる方法。

## 一時的にdomainのAppArmorをdisable/complainモードにする

aa-complainコマンド (apparmor-utilsパッケージ) を使って、実験しようとするdomainのAppArmorをcomplainモードにする方法は、以下の通り。

```
# virsh domuuid GUEST
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
# aa-complain /etc/apparmor.d/libvirt/libvirt-`virsh domuuid GUEST`
Setting /etc/apparmor.d/libvirt/libvirt-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX to complain mode.
```

disableモードにするには、aa-complainコマンドの代わりにaa-disableコマンドを使う。また、実験が終わってAppArmorを効かせたい場合は、aa-complainの代わりにaa-enforceを使う。

なお、この方法はdomain実行前など、`/etc/apparmor.d/libvirt`に対応するAppArmorプロファイルがないと使えない (と思う)。

## domainの設定でAppArmorを使わないようにする

domainのXMLでAppArmorを使わない設定にすることができる。

```
# virsh edit GUEST
```

`domain`要素の直下に`seclabel`を追加。

```
<domain>
  <seclabel type='none'/>
  ...
```
Mu のインストール

#MuをWindows PCにインストールしてみました。
pythonを勉強しようと思い、ノートPCにインストールしてみました。
検索して、サイトからファイルをダウンロードして、ダウンロードしたインストーラー(.exeファイル）をダブルクリックするだけです。とっても簡単でした。

##Mu のサイト
Google の検索窓では、　mu python　で探します。
見つかった中から、　Code with Mu　（https://codewith.mu/）　
にジャンプします。

##Mu のインストールで注意する点
特に困ったことはないのですが、私がハマったのは、Windowsの設定でした。
### Windows10 のセキュリティ設定
Windowsのデフォルトの設定では、安易にアプリをインストールできないようになっています。
MicroSoft Store からダウンロードしたものはインストールできるのですが、そのほかのアプリをインストールするには、モードを設定変更する必要があります。
これは、MacOSでも一緒ですね。
###アプリを入手する場所の選択
Muをインストールする際に、メッセージが表示されるので、それに従って変更すればいいのですが、初めてだとわかりにくいですね。
アプリを入手する場所の選択で、
**Microsoft Store　のみ（推奨）**　となっているので、　これを、 **入手元を制限しないが、Microsoft Store以外からのアプリをインストールする前に警告を表示する**　に変更します。
(または、　**場所を選ばない**　　にします。 *インストールが済んだら元に戻しておきましょう。*)

スタート(ウィンドウズボタン)> 設定（⚙）　>　アプリ > アプリと機能　の順で見つかります。
pythonでhtmlソースの文字列から、任意のURLを抜き出したい

pythonで以下のような文字列から、【https://・・・・・.png】などの
URLを抜き出したいです。
正規表現でやればいいのかなと思うも実際の方法が不明です。

meta content="https://qiita.com/drafts/47fed79616455c085f91/edit" property="og:url" /><meta content="https://cdn.qiita.com/assets/qiita-fb-fe28c64039d925349e620ba55091e078.png" property="og:image" 

よろしくお願い致します。
リモートワークでの作業意識

コロナ影響でテレワーク・リモートワークになった人が多く、
自分の友人からさぼってしまうとか話とかよく聞きます。

僕もサボりそうだなこいつといかにも思われそうなタイプですし実際言われます。
趣味がネトゲをするタイプで、集中すると丸2日とかほとんど寝ずに同じ狩場で狩りしてて数度BOTと間違われたりするくらい。
なので本当に仕事してるの？とかどうやってやってるのとかよく聞かれることも多いです。
とはいえもともとベトナムでずっと仕事もしており、
実質そのときに日本とリモートみたいな感じだったので、その時に慣れてしまったのかもしれないですね。

今メインでやらせていただいているお仕事も、
一年以上リモートでやっているので、こんな感じで自己管理してますをまとめます。

#生活編
- 朝 
　リモートだからといってぎりぎりまで寝ない。
　アラームを毎日同じ時間に。
　9時から一応契約として作業開始してますが、7:00頃起きて朝活したり外を散歩したりしてます。 
　この時間に買った本とか読んだり。
　散歩するので服は着替えますが雨の日でも、絶対服は着替える。
　祝日とかパジャマでいるとだらだらになりますよね。気持ちの切り替えのために必須。

- 昼
　この時間に夕食の材料買いに行ったり。
　基本的には前日の残りを食べることが多い。
　部屋の中掃除するのも大体この時間かも。
　たまにさっとシャワー浴びるときもあります。

- 夜
　おそくても１- 2時には寝る。6時間は寝たい。
　18- 19時にはだいたい仕事終えます。
　家だとどうしてもずるずる作業しちゃうので、よっぽどでない限りは20時には絶対終わるように。
　そこからは料理して食べて、寝るまでは酒飲みながらゲームしたり趣味コーディングしたりしてます。

#意識編
- 飲み物
　お酒は絶対仕事中は飲まない。
　絶対してるでしょとかよく言われますがしないですね。信用に関わることですし。
　飲んだらコーディング捗るタイプなんですが一応大人なので・・
　コーヒーだけでなく、紅茶にしたり無糖の炭酸水とか気分によって変更。

- 食べ物
　あまりお菓子は食べない。
　これも状況によってガムだったり、糖分足りないなーと思ったら袋入りのチョコを数個食べるくらい。

- ずっと椅子に座らないようにする。
　大体1時間毎に身体を少し動かす。
　腕立てとかスクワットとか身体をほぐしてます。
　このタイミングでちょっとベランダに出て外の空気吸ったり日を浴びたりしつつ、
　軽く通知チェックとか。　

- 疲れてもベッドには横にならない
　寝ちゃうから。

- テレビはつけない。
　音楽と違って僕の場合は人の会話だと集中力が途切れる。
　とくにドラマとかはだめですね。 Youtubeも実況系はNG。
 
- 作業する内容によって音楽を変える
　コーディングがんがんしたいときはテンション高い戦闘系とか。
　僕は歌系よりは大体ゲーム音楽とかでのほうが集中できるっぽい・8bitシリーズが結構好き。

- ソシャゲはやらない 
　当たり前なんですけどね・・
　大体イベントとか周回するとさぼるようになってしまう。自制。
　通勤していたときは通勤時間とかやっていましたが、
　その時間がなくなったせいかあまり進まなくなりました・・

- スマホ
　家とはいえなるべくマナーモードにしてます。
　電話の場合は何かしら理由あるはずなので、これは音はON。
　LINEとか通知系はそんな急ぎの用事じゃないのでオフ。
　ぴこぴこ通知くると集中できないタイプゆえ・・
　
- 1日の作業の目標を立てる
　緊急のトラブル対応がある場合は別として。
　確実に終われるものを１•2個用意。大きくなる場合は内容を細分化。
　これもできればいいなと思うものを1個。
　一応これが少しずつでも進捗になる。
　早く終わるようなら次のタスク候補をこなしたりその準備とか。

- 仕事用PC
　客先から借りているPCは仕事に関係ないことは使わないようにして、
　PC自体も綺麗にしておく。定期的に拭いたり掃除はする。
　
- 作業机の上
　漫画とかは置かない。ただ作業がリラックスできるようなものはいいんじゃないかな。
　　
# まとめ
基本的に生活が自堕落なんですが、それでもこれだけは最低限意識してる感じですね。
もちろんオフィス行って顔合わせながらが捗る場面の作業もあったりしますが。
それでも通勤往復の無駄な時間や電車遅延や満員電車のストレス、
オフィスにかかってくる電話などの音や話し声の騒音など気にならないのは大きいですね。
リモートで仕事をするということは個人の信用なので、
そこを意識して自己管理することができるかどうかだと思います。
自分なりの気分転換や集中の方法を見つけてみてくださいませ。
Youtubeに動画を初めてアップロード・限定公開するまで

本記事では，Youtubeに動画を初めてアップロードして，限定公開（URLで公開）するまでのスクリーンショットをまとめた．

# 1) Youtube画面右上の「動画をアップロード」をクリック

（先にGoogleアカウントにログインしておく必要があると思います）

<img width="960" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/2b66426f-d656-b23a-2c33-0d8ead036d3e.png">

# 2) ダイアログが表示されるので「スキップ」をクリック

<img width="668" alt="図2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/cf06b82e-a1c6-a6f6-e813-b155e2e35900.png">

# 3) チャンネルやプロフィール情報を求められれますが下にスクロールして「SET UP LATER」をクリック

<img width="716" alt="図3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/9591a4de-59c4-433b-659e-f7b80f523268.png">

# 4) 「動画をアップロード」をクリック

<img width="924" alt="図4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/cbb914e1-2010-8be6-432d-e64cafec7318.png">

# 5) 「ファイルを選択」またはドラッグ＆ドロップで動画ファイルをアップロード

<img width="924" alt="図5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/d64d5c8f-1850-84e7-e0bd-277691f0551d.png">

# 6) タイトルを入力して[次へ]をクリック

<img width="924" alt="図6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/39762a06-246f-6917-b19b-5b6bac24b154.png">

# 7) 「いいえ，子供向けではありません」を選択して[次へ]をクリック
<img width="924" alt="図7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/84b01aec-c790-075f-7c96-a78f3c782d47.png">

# 8) [次へ]をクリック

<img width="924" alt="図8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/0d6cd33f-2bb4-9b9c-9528-e50d705f14a2.png">

# 9) 「限定公開」を選択する
<img width="924" alt="図9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/15206232-b8f1-97a5-9892-4cba41f722dc.png">

!! Youtubeに「ダウンロード禁止」のような明確な設定はありません．
すべてダウンロード禁止です．

# 10) [次へ]をクリック
<img width="924" alt="図10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/32a1f408-e650-efe2-43cf-94c54e51fc3c.png">

# 11) URLをコピーして「閉じる」をクリック
<img width="924" alt="図11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/e0364f76-66f4-7d87-5d96-10cceff00909.png">

# 12) 完了
<img width="924" alt="図12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/1670502d-aea2-bfb2-3a7d-bedc6f623488.png">

あとはコピーしておいたURLをシェアしましょう．
PHPの実行＿VScode版

VScodeでPHP実行するにはターミナル呼び出して

php main.php
などと打たないとだめなのですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620350/a7949468-b418-3621-b24b-ba1656266140.png)
Box APIで、外部ユーザーを取得するやりかた


## Boxで外部のユーザーを取るやり方（box-node-sdkの場合）

box-node-sdkをつかって、外部ユーザーを取得するやりかたがわからなかったので調べました。
他のSDKでも考え方は同じはず。

以下やり方。

```js
const boxSDK = require("box-node-sdk");
const config = require("./config"); // config.json

const main = async () => {
  const sdk = boxSDK.getPreconfiguredInstance(config);
  const saClient = await sdk.getAppAuthClient("enterprise");

  const anExternalUser = await saClient.enterprise.getUsers({
    filter_term: "taro.yamada@example.com",
    user_type: "external",
  });
  console.log(anExternalUser);
};

main();

```

ポイントは、`filter_term`に`name`もしくは`login`を完全な形で入れることと、`user_type`に`external`を指定することみたいです。
外部ユーザーの取得は、1レコードずつしか取れないようですね。

1レコードずつしか取れないのはいいとして、そもそも、名前とかLoginをどうやって取得するんだって話もあります・・・。
コラボレーションとかから引っ張ってくる感じなのかなと想像しますが、今度調べときます。
[Unity初級]キャラの斜め移動を滑らかにする

#概要
上下左右への移動距離を１とすると、工夫をしなければ斜め方向は「右に１上に１」でルート２（つまり１．４７ぐらい）になる。それを１にできたら少しスムーズになる
#本文
```cs

    private Vector2 moveInput;
    //public bool toggle;
    void Update()
    {
        moveInput.x = Input.GetAxisRaw("Horizontal");
        moveInput.y = Input.GetAxisRaw("Vertical");

        //if (toggle == true){
            moveInput.Normalize();
        //}
        //Debug.Log(moveInput.x);

        character.velocity = moveInput;
    }
```
.Normalize()をすることで斜め方向が自然な移動量に調整されます（上が１右が１なら斜めも１）
#本文
もし興味があるなら、コメントアウトしてある4行を解除してInspectorのtoggleチェックボックスをON/OFFしてみてください。Consoleに流れる数字が変化するので.Normalize()の作用を確認できます。
Raspberry Pi に ipv6 で ssh 接続

2020-02-13-raspbian-buster に Arch Linux から ipv6 で ssh 接続をしてみました。

```bash
ssh uchida@fe80::9ffc:15a6:7a30:24d3%wlp2s0
```

結果は

```text
$ ssh uchida@fe80::9ffc:15a6:7a30:24d3%wlp2s0
Linux violet 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Apr 22 23:59:34 2020 from fe80::1acf:5eff:fe91:c348%wlan0

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
``text

```

who で様子をみると

```text
$ who
uchida   pts/0        2020-04-23 00:00 (fe80::1acf:5eff:fe91:c348%wlan0)
```
キーボードが壊れたので手元のラップトップをキーボードにする

# いきさつ

キーボードに紅茶をこぼしてしまい、完全に壊れました。

数万円するキーボードが壊れるのは精神的に辛いものがありますが。

しかし、それ以上に重大な問題があります。手元に予備のキーボードが無いことです。つまり、PC での作業が一切できません。

# 手元のラップトップをキーボードに

キーボードの予備はありませんが、幸いにして手元にラップトップはありました。しかし、仕事の環境がデスクトップに最適化され、このデバイスでは満足に仕事はできません。

しかし、このデバイスをキーボードとして使うことができれば、キーボードの質はおちるものの、ある程度仕事になりそうです

## ChromeRemoteDesktop

Chrome には Chrome Remote Desktop というアプリケーションがあります。これは、他の PC から遠隔操作できる機能です。

Chrome Remote Desktop の特徴として、ホスト側と完全同期するというものがあります。つまり、クライアントでマウスを動かせば、ホスト側の PC のマウスポインタも同時に動きます。クライアント側だけで表示されることはなく、画面はつねに完全に同期します。

正直なところ、今までこれは余計な機能だと思っていました。外から操作するとき、家にいる人にとっては勝手に PC が動いているように見えるからです。

しかし、今回はその機能に助けられました。

また、ホスト側での操作も可能です。つまり、ホスト側でマウスをつかい、クライアントでキーボードを使うことができるのです。

この機能をつかうことで、普段どおりデスクトップを使い、キーボードだけラップトップから操作することが可能になります。

## ラグについて

体感ではラグはほぼありません。普通にキーボードを使っているときと同じ感覚で使用できます。また、キーボードとしてのみ使うなら、画面や音のラグは気にする必要がありません。

## 注意点

## 音が両方から出る

Chrome Remote Desktop では、音もクライアント側とホスト側で両方出力されます。ラップトップをキーボードとして使うなら、クライアント側の音量はゼロにしましょう。

## 画面が邪魔

当然のことながら、リモートデスクトップでは画面も共有されます。このときラップトップ側の画面は単に邪魔なので、消してしまうのが良いでしょう。

## 最後に

不測の事態というのはいつでも起こるものです。選択肢は多く持っておいたほうがいいでしょう。また、問題が起こったときに、手持ちのカードでなんとか対処できないか考えるのも大切です。
CSSでフェードイン

#前提
下記のようなアニメーションをつけたい時。

https://i.gyazo.com/65da0add99ff6e0581e91924fa1d9e38.mp4


#本題
ScrollRevealを使用します。
※公式サイト
https://scrollrevealjs.org/

まずは読み込みするために下記の記述を行います。
ライブラリをscriptタグで読み込み、対象の要素にクラスを与えてJavaScriptからアニメーションを指定するだけです。

```●●.html
<script src="https://unpkg.com/scrollreveal"></script>
```

npm でインストールする場合は下記コマンドを実行してインストールして下さい。

```
$ npm install scrollreveal --save
```

実際に実装してみます。

```●●.html
<div class="page">
  <div class="target text1">scroll</div>
</div>
<div class="page">
  <div class="target text2">hello</div>
</div>
<div class="page">
  <div class="target text3">left</div>
</div>
<div class="page">
  <div class="target text4">right</div>
</div>
<div class="page">
  <div class="target text5">top</div>
</div>
<div class="page">
  <div class="target text6">animation</div>
</div>
<div class="page">
  <img class="target image1" src="https://liginc.co.jp/wp-content/uploads/2017/10/150691334095133300_52.png">
</div>
```

続いて、CSS。

```css
@mixin positionCenter() {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

body {
  background-color: #757575;
  font-family: Arial;
  color: #79BD9A;
}

.page {
  position: relative;
  height: 100vh;
}

.target {
  @include positionCenter();
  font-size: 50px;
  font-weight: bold;
}

img {
  width: 300px;
}
```

最後にjs。

```●●.js
ScrollReveal().reveal('.text2', { 
  duration: 1600, 
  scale: 4,
  reset: true
});

ScrollReveal().reveal('.text3', { 
  duration: 1600, 
  origin: 'left', 
  distance: '50px',
  reset: true   
});

ScrollReveal().reveal('.text4', { 
  duration: 1600, 
  origin: 'right', 
  distance: '50px',
  reset: true   
});

ScrollReveal().reveal('.text5', { 
  duration: 1600, 
  origin: 'top', 
  distance: '50px',
  reset: true   
});

ScrollReveal().reveal('.text6', { 
  duration: 1600, 
  scale: 0.1,
  reset: true
});

ScrollReveal().reveal('.image1', { 
  duration: 1600,
  reset: true   
});
```

以上でふわっと文字や画像を出現させることができます。
Ansible で QNAP の QPKG を入れる

QNAPにAnsibleできるようになったところで、まずはQPKGを入れてみる。

# どうやって入れるか
qpkg_cli を使う。

```
# qpkg_cli -s パッケージ名
```
で入っているかどうかをチェックして、

```
# qpkg_cli -a パッケージ名
```
で入れる

なお、キューに入れてすぐ終了してしまうので、

```
# qpkg_cli -s パッケージ名
```
でインストール済みになるまで待つ。

## -sオプションの返り値
```
[CLI] QPKG XXX not found
```
未インストール

```
[CLI] QPKG XXX download YY%
[CLI] QPKG XXX is in installation stage Y
```
インストール中

```
[CLI] QPKG XXX is installed
```
インストール終了

```
[CLI] QPKG XXX opcode 5 status code 4
```
削除中



# Ansibleで実現する
shellなどを組み合わせていろいろ考えるより、モジュールを作ってしまった方が早い。
自分で使うだけなのでいい加減なモジュール。もちろんテストもしてない。

```python:qpkg.py
#!/usr/bin/python

import time

ANSIBLE_METADATA = {
    'metadata_version': '1.1',
    'status': ['preview'],
    'supported_by': 'iwatam'
}

DOCUMENTATION = '''
'''

EXAMPLES = '''
'''

RETURN = '''
'''

from ansible.module_utils.basic import AnsibleModule

def check_status(module,name):
    while True:
        rc, out, err=module.run_command(['qpkg_cli','-s',name])
        if name+' is installed' in out:
            return 'present'
        elif name+' not found' in out:
            return 'absent'
        time.sleep(1)

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(type='str',required=True),
            state=dict(type='str',
                       choices=['absent','present'],
                       default='present',
                       required=False),
            volume=dict(type='int',required=False)
        ),
        supports_check_mode=False
    )
    name=module.params['name']
    state=module.params['state']
    volume=module.params['volume']

    changed=False
    if check_status(module,name) != state:
        if state=='present':
            cmd=['qpkg_cli','-a',name]
        else:
            cmd=['qpkg_cli','-R',name]
        if volume is not None:
            cmd+=['-I',str(volume)]
        module.run_command(cmd)
        if check_status(module,name) != state:
            module.fail_json(msg='Install/Uninstall failed')
            return
        changed=True
    module.exit_json(changed=changed,
                     msg='QPKG '+name+' is '+state)

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

こうやって使う。

```yaml
- name: install MusicStation
  qpkg:
    name: MusicStation
```
【 SCSS / Sass 】calc で変数を使用する方法

使い方を時々忘れるのでメモ。

[Sassの公式リファレンス - calc(), element(), progid:...(), and expression()](https://sass-lang.com/documentation/syntax/special-functions#calc-element-progid-and-expression)に使い方が記載されている。

## OKパターン

`#{変数}`のように括る。

```scss
// SCSS
$sidenav-width: 100px;
.bl_sidenav {
  width: $sidenav-width;
}
.bl_main {
  width: calc(100% - #{$sidenav-width});
}
```

```sass
// Sass
$sidenav-width: 100px;
.bl_main
  width: $sidenav-width;
.bl_sidenav
  width: calc(100% - #{$sidenav-width});
```

## NGパターン

`calc(100% - $sidenav-width)`のように記述すると、`$sidenav-width`→100pxの変換がされず、widthのスタイルが適用されないので注意。

```scss
// SCSS
$sidenav-width: 100px;
.bl_sidenav {
  width: $sidenav-width;
}
.bl_main {
  width: calc(100% - $sidenav-width);
}
```

```sass
// Sass
$sidenav-width: 100px;
.bl_main
  width: $sidenav-width;
.bl_sidenav
  width: calc(100% - $sidenav-width);
```
【Laradock】Mysqlへの接続

備忘録用でlaradockでmysqlに接続する流れです。

##laradockでmysqlに接続する方法

laradockフォルダにて

```
$ docker-compose exec mysql bash
```

##laradockのmysqlにデータベースを作成する方法

```php:laradock/mysql/docker-entrypoint-initdb.d/createdb.sql

CREATE DATABASE IF NOT EXISTS `データベース名` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `データベース名`.* TO 'default'@'%' ;

FLUSH PRIVILEGES ;

```

###mysqlにログインして実行

```
$ docker-compose exec mysql bash
$ mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql
```

とりあえず以上です。
SwiftでのGeometry Proxyを使う方法

# SwiftでのGeometry Proxyを使う方法(Xcode11.4.1)

初めての投稿です。
現在、Swift UIでアプリケーションからAirDropで共有をするためのActivity Viewを制作しています。
その中で、子Viewを親Viewへ引き渡すためのGeometry Proxyを記述しているのですが、
以下のコードだと、シミュレータ・実機(iOSバージョン13.4.1)で実行できても、次に示す行でThread 1: signal SIGABRTエラーが出てしまいます。

// 以下ソース
struct RectangleGetter: View {
    @Binding var rect: CGRect
    
    var body: some View {
        GeometryReader { geometry in
            self.createView(proxy: geometry)
        }
    }
    
    func createView(proxy: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = proxy.frame(in: .global)  // この行でThread 1: signal SIGABRTエラー
        }
        return Rectangle().fill(Color.clear)
    }
}
// ソースここまで

ちなみに、Xcode11.3.1, iOS13.3.1までは普通に実機でも実行できていました。
その後、コードを変更したことはありません。

この間にコードの記述方法が変わったのでしょうか？
それともiOS側のバグか何かでしょうか？

ご教授ください。よろしくお願いいたします。
Borgespedia 2

　DesignPattern@GoFは，「Designについての」pattern(s)とliterallyに捉えるべし．
　[behavioral, structural, creational]について，私は長年以下のように考えていた．「creationalは別として，[behavioral, structural]はどちらも構造ではないのか?」．
　ふと http://www-kasm.nii.ac.jp/~takeda/lecture13/design-theory-2.pdf を 一読した．
　attr.strという配置が触媒のように効いた．また，component(s)のterm(s)がstructureだと読み解けた．
　behavioral: Setは，communication，structural: Setは，term(s)を扱っている．これらはtoggleではなくradar chartで表現可能だと考えている．
　「creationalは別として，[behavioral, structural]はどちらも構造ではないのか?」は，DesignPattern@Gofを構造のcatalogと私が独りでに捉えていたために遭遇したparadoxだったのだ．

　長年，designという階上を見落としていた．
【初心者向け】Google ColaboratoryでDataFrameにExcel・CSVファイルを読み込む

どうも[CEさぼ](https://ce-sabo.com/)です。

Qiita初投稿です。


Pythonを使ってデータ分析をしたい。

そんな時、初心者が最初につまづくのが「データの読み込み」です。
（僕も最初はつまづきました。）

分析したいデータがテーブルデータ（ExcelのデータやCSVデータ等）の場合はどうすればよいでしょうか。

今回は最もよく使うであろうExcelファイル（.xlsx）やCSVファイル(.csv)の読み込みを簡単に説明していきます。

実質のコードはたった**2行**です。
サクッと終わらせてデータ分析の世界に進みましょう。


#開発環境

・Google Colaboratory

Googleアカウントさえあれば誰でもできるGoogle Colaboratoryを使います。


#まずは必要なライブラリのインポート

※事前にGoogle Colaboratoryで適当に新規作成してください。

Pythonにはデータ分析に使える数多くのライブラリが備わっています。

これを使うと比較的簡単に実装することができます。

今回は「pandas」のみでOK。


```python
#pandasをインポート
import pandas as pd
```

importしたものに「as ~」とすることで任意の文字列で使用することができます。

一般的にpandasはpdと略されます。


#ファイルをGoogle Colaboratoryにアップロード

読み込みたいファイルをGoogle Colaboratoryにアップしましょう。
他に
①コードを書く方法や
②ローカルのファイルを読み込む方法
③GoogleDriveをマウントして読み込む方法（個人的にオススメ）があるみたいですが、今回は一番簡単な方法を紹介します。

手順

①一番左端にあるファイルのアイコンをクリック
②アップロード（画像の赤枠）をクリックして読み込みたいファイルを選ぶorドラッグ&ドロップでもOK

<img width="919" alt="google colab.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624407/47d15c30-a122-f2cb-9bf3-67280f72a589.png">

よほどのデータ量じゃなければすぐ終わるのでこれで準備完了です。



#データの読み込みはpd.read_excel、pd.read_csvを使う

では早速やってみましょう。
コードは1行です。

pandasの関数read_excel、read_csvというものを使います。

使い方は
Excelファイルの場合pd.read_excel(ファイルのパス)
CSVファイルの場合pd.read_csv(ファイルのパス)
です。
※pdはインポートした際の名前ですね。

今回はDataFrameにExcel・CSVを読み込むということなので、df、df2と適当に名前を付けて読み込んでみましょう。

僕は今回Google Colaboratoryに2020年の日付データdate_2020.xlsxとdate_2020.csvというファイルをアップしたので、パスはファイル名だけで読み込めます。

前述した①②③の方法ではもう少し長くなります。


```python

#Excel・CSVファイルをDataFrameに読み込む

df = pd.read_excel("date_2020.xlsx")

df2 = pd.read_csv("date_2020.csv")

```


#head()で実際読み込めたか表示してみる

え？こんなので読み込めたかどうか不安？

エラーがなければ読み込めてると思いますが、念のため確認してみましょう。

定義したDataFrame.head()とすることで先頭の5行を表示することができます。

```python
#先頭行を表示
df.head()

```


出力結果↓

<img width="93" alt="df.head.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624407/5a4adfdd-0c91-ad1d-a14b-0ba77bfc9736.png">

しっかり読み込めたみたいですね。



####参考

詳細や応用的な使い方も学べます↓

1)[pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)
2)[pandasでExcelファイル（xlsx, xls）の読み込み（read_excel）](https://note.nkmk.me/python-pandas-read-excel/)
3)[Pandasのread_excelでExcelファイルを読み込む方法](https://yolo.love/pandas/read-excel/)
Metal がサポートされているかを判定する方法

備忘録的に。

Metal の存在有無は，コマンドラインから `system_profiler SPDisplaysDataType` を実行して，実行結果に `Metal: Supported` という文字列があれば，Metal がサポートされているということだろうと思います。

iMac Pro (2017) での実行結果:

```bash
$ system_profiler SPDisplaysDataType
Graphics/Displays:

    Radeon Pro Vega 64:

      Chipset Model: Radeon Pro Vega 64
      Type: GPU
      Bus: PCIe
      PCIe Lane Width: x16
      VRAM (Total): 16 GB
      Vendor: AMD (0x1002)
      Device ID: 0x6860
      Revision ID: 0x0000
      ROM Revision: 113-D0500D-114
      VBIOS Version: 113-D05001A1XT-018
      Option ROM Version: 113-D05001A1XT-018
      EFI Driver Version: 01.01.114
      Metal: Supported, feature set macOS GPUFamily2 v1
      Displays:
        iMac:
          Display Type: Built-In Retina LCD
          Resolution: 5120 x 2880 Retina
          Framebuffer Depth: 30-Bit Color (ARGB2101010)
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: No
```

追記: Big Sur から`Metal Family: Supported` という感じになりました。

```bash
$ system_profiler SPDisplaysDataType
Graphics/Displays:

    Radeon Pro Vega 64:

      Chipset Model: Radeon Pro Vega 64
      Type: GPU
      Bus: PCIe
      PCIe Lane Width: x16
      VRAM (Total): 16 GB
      Vendor: AMD (0x1002)
      Device ID: 0x6860
      Revision ID: 0x0000
      ROM Revision: 113-D0500D-114
      VBIOS Version: 113-D05001A1XT-018
      Option ROM Version: 113-D05001A1XT-018
      EFI Driver Version: 01.01.114
      Metal Family: Supported, Metal GPUFamily macOS 2
      Displays:
        iMac:
          Display Type: Built-In Retina LCD
          Resolution: 5120 x 2880 Retina
          Framebuffer Depth: 30-Bit Color (ARGB2101010)
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Automatically Adjust Brightness: Yes
          Connection Type: Internal
```

ちなみにM1で実行すると次のようになります。

```bash
$ system_profiler SPDisplaysDataType

Graphics/Displays:

    Apple M1:

      Chipset Model: Apple M1
      Type: GPU
      Bus: Built-In
      Total Number of Cores: 8
      Vendor: Apple (0x106b)
      Metal Family: Supported, Metal GPUFamily Apple 7
      Displays:
        PL2875UH:
          Resolution: 3008 x 1692
          UI Looks like: 1504 x 846 @ 60.00Hz
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: Yes
```
初心者によるプログラミング学習ログ 297日目

#100日チャレンジの297日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
297日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>297日目　2h<br>・xdデザインカンプからのサイト模写<br>・ハンバーガーメニュー作成<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/1253051345013100544?ref_src=twsrc%5Etfw">April 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Amazon Polly を使用した日本語テキスト読み上げの最適化（前編）

#はじめに
Amazon から発売されている Alexa のように、精密な発音をする音声の読み上げの機能について
AWS はどのようにして最適化を行っているのか、について記事があったのでご紹介いたします。
![2020-04-22_21h08_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/bd3225e0-93a4-ab74-f44a-57714e8f398c.png)

#Amazon Polly とは
- 高度な深層学習テクノロジーを使用して、29 の言語および 61 の音声を使える
- 人間のように聞こえる音声を合成するテキスト読み上げ（ TTS ）を提供するクラウドサービス
- 自動コンタクトセンター、言語学習プラットフォーム、翻訳アプリ、および記事の読み上げ。
　幅広い用途に対応する音声合成を使用するデジタル製品の開発に役立つ


Amazon Polly は現在、2 つの日本語音声を提供しています。
日本語は書記体系が複雑であるため、TTS システムに多くの課題をもたらします。

##日本語は TTS にとって課題が多い言語
日本語の書記体系は、主に 3 つの書記法（漢字、平仮名、片仮名）で構成されています。
多くの場合、書記法は互換できます。

`例：『ロウソク』を表す単語は、漢字『蝋燭』、平仮名『ろうそく』、片仮名『ロウソク』`
と書くことができる。

- 漢字の読み方には音読みと訓読みがあり、さらに熟語の読みは、当て字の場合など、構成文字の読みから予想されるものとは異なる場合がある
- 人名の場合に特に顕著であり、文字列からその名前の発音を常に予測できるとは限らない

##TTS システムを最適化するには
###文を単語に分割する
英語の場合、単語はスペースで分かれているため、この作業は簡単ですが、日本語の場合は一筋縄にはいきません。

- 日本語は、間にスペースを入れずに単語をつなぎ合わせるため、単語と単語の境界を予測するモデルが必要になる
- 英語で、『Applesonatable』 などの文字列を個々の単語に分解する場面では、
言語的な知識を用いると、“Apple son at able” ではなく “Apples on a table” であり
これを自動的に行うにはモデルを学習する必要がある

###日本語の単語の発音は、周囲の文脈に大きく依存
同じ漢字の連なりの単語であっても、発音が異なり、文脈に応じて異なる意味を有することがあります （同形異義語）

###例：１
![2020-04-23_04h38_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/153ed059-f4ef-8b27-4a0e-115aa7eebdfa.png)
###例：２
![2020-04-23_04h51_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/580f00c5-1f38-0eb8-d2ce-6bbd95c2e696.png)


「東京都に行った」⇒「東京/都/に/行った」と分割でき、この場合は「とうきょうとにいった」と読みます。
「東/京都/に/行った」⇒「ひがしきょうとにいった」と読みます。

これらの両方の場合に、「行った」は「いった」と読みますが、
「東京都に行った事業の報告をする」という文脈では、2 番目の意味『何かを実行したこと』となり、
「いった」ではなく「おこなった」と読みます。
###日本語は高低アクセント言語
アクセントの違いによって単語の意味に違いが生じる可能性があります。
`例：雨（頭高型アクセント）と飴（平板型アクセント）`
平仮名で書くと両方とも「あめ」ですが、アクセントの表記がありません。
##Amazon Polly のソリューション
- Amazon Polly は日本語のTTS システムで機械学習（ML）モデルを採用。
- ML モデルは、周囲の単語およびその構文（文法）および形態（単語構造）情報に関する情報を使用して、単語の発音または高低アクセントおよび抑揚を予測
- モデルは、言語のパターンを一般化するのに役立ち、合成されたことのない文の発音および抑揚を予測できる

##正確な発音をさせるのは難しい
人は、書かれた文脈が不十分でも、より広い文化的または状況的知識から文脈情報を推測し、筆記された文を理解できます。
現在の TTS モデルでは、利用可能な情報はあってもモデルがそれを使って正確な予測を行うことができないこともあります。

母国語話者でさえ、背景知識がないために正しい発音を予測するのに苦労する場合があります。
人名や地名で特によくあることで、
`例：「愛」という名前は、「あい」、「めぐみ」、「まなみ」、「まな」`
このように少なくとも 28 通りの読み方があります。

この問題を回避するために、日本語テキストの発音をコントロールする方法がいくつかありますので、後編でご紹介していきます。
#公式サイトリング
[Amazon Polly](https://aws.amazon.com/jp/polly/)
認証Authenticationと認可Authorizationをこじつけで見分ける


##日本語もわからんし、英語はなおわからん。

苦労して、認証、認可の違いはわかったけれども
実際、英語でみたときAuthentication？、Authorization？あれ？どっちがどっち？
ってなったときのこじつけの見分け方です。
***

そもそもの認証、認可の違いについては
こちらの都元さんの記事が最高にわかりやすいです！！

>https://dev.classmethod.jp/articles/authentication-and-authorization/#return-note-184783-1

本記事ではAuthentication、Authorizationのどっちが認証でどっちが認可についてなんとかして覚える。それだけを書いていきます。
***
さて
AuthenticationとAuthorization似ていて全然わけわからん吐きそうで、なんとかこじつけでもいいから覚えたいと思っていた僕です。

ポイントは
Authen TIC ation　
Autho RIZ ation

この
ticとriz にあると僕はみました。

いったんはじめのauthと最後のtionは忘れて
このtic と rizの違いから
Authen **tic** ation(認証）　Autho **riz** ation(認可）についてみていこうと思います。



#認証Authentication

-tic 形容詞化
なんとかticって形容詞、それってどんなの？ってときに使われることが多い気するんですね

ロマンチックな人
乙女チックな人
システマチックな人

-tic は形容詞！！
形容詞
だれですかー？
あなたどんな人ですかー？
そう！本人確認！！
<br>

**ポイント**
**tic は形容詞。だれですか？**



#認可 Authorization

逆になんとか-rize - izeって動詞化　~しちゃうぞ！ってときに使われることが多い気するんですよねー

-ize 動詞化
アメリカナイズ　　　アメリカみたいにしちゃうぞ
パーソナライズ　　　個人に合わせちゃうぞ
オーガナイズ　　　　企画しちゃうよー

-rize は動詞！
動詞
その動きできますかー？
許可ありますかー？
<br>
**ポイント**
**rizは動詞。できますか？　だれかは聞いてないです。それはできるんですか？許可ありますか？**

<br>
##まとめ
Authen **tic** ation(認証）　形容詞っぽい　本人確認
Autho **riz** ation(認可)　　動詞っぽい　　許可確認



#参考文献
よくわかる認証と認可 | Developers.IO
https://dev.classmethod.jp/articles/authentication-and-authorization/#return-note-184783-1
LinuxでNTP設定メモ

#CentOS 7でNTPの設定をしてみた

今回、NTPの設定をしてみたので、備忘録兼ねてメモで記載します。
他にも記載されている方もいらっしゃるかとは思いますが、悪しからず。。

まず、初めにおおまかな流れから。

1. NTPサービスをインストール
2. ntp.confファイルの設定値を入れる
3. ntpupdateコマンドで時刻を合わせる
4. ntpdサービスの開始

では、実際にそれぞれの詳細を記載します。

###1.NTPサービスをインストール
※実行する際はrootユーザーです
以下のコマンドでNTPサービスをインストールします。
```yum install ntp```

###2.ntp.confファイルの設定値を入れる
ntp.confの設定ファイルは下記にあります。
/etc/ntp.conf

2-1.
まず、ntp.confのバックアップをとります。
```cp -p /etc/ntp.conf /etc/バックアップファイル名（任意）.conf```

2-2.
次にntp.confファイルの編集をします。
```vi /etc/ntp.conf```

ntp.confのファイルの中身に以下の内容が記載されているので、「＃｣でコメントアウトします。
その上で設定したいNTPサーバの情報を記載します。
※今回は例としてNICT（http://jjy.nict.go.jp/ntp/）
のNTPサーバとMULTIFEED（https://www.mfeed.ad.jp/ntp/overview.html）
のNTPサーバを記載します。
>server 0.centos.pool.ntp.org iburst
>server 1.centos.pool.ntp.org iburst
>server 2.centos.pool.ntp.org iburst
>server 3.centos.pool.ntp.org iburst

↓↓↓
>  server ntp.nict.jp
>  server ntp1.jst.mfeed.ad.jp
>  #server 0.centos.pool.ntp.org iburst
>  #server 1.centos.pool.ntp.org iburst
>  #server 2.centos.pool.ntp.org iburst
>  #server 3.centos.pool.ntp.org iburst

###3.ntpupdateコマンドで時刻を合わせる
※時刻がズレているとうまく同期ができないので本手順を実施します。
以下のコマンドを実施します。
```date```
```ntpupdate NTPサーバ```
```date```
1回目のdateではずれている可能性がありますが、ntpupdateを実施したあとの2回目のdateでは時刻があっています。

###4.ntpdサービスの開始
以下のコマンドを実施しNTPサービスをを再起動します。
```service ntpd restart```

NTPサービスがrunningになっていることを確認します。
```service ntpd status```
【コンフリクト】git push origin ~~の失敗(non-fast-forward)、コンフリクト解消、プッシュに至るまで

#問題
 masterから切ったブランチでの作業が終わり、プッシュしようとすると、

```shell

$ git push origin ブランチ名
To bitbucket.org:〜〜〜.git
 ! [rejected]        ブランチ名 -> ブランチ名 (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:〜〜〜.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
　

#原因
こちらの記事から、
「 [git pushがreject（拒否）されたときの対処法](https://qiita.com/President_Taka/items/5e563d5ea61d2829e497)」
リモートとローカルの最新情報が異なっている事が原因であるとわかる。


#解決へ向けて、、

>$ git pull origin 〇〇

を行う。
すると、

```shell

From bitbucket.org:〜〜〜/アプリ名
 * branch            ブランチ名     -> FETCH_HEAD
Auto-merging spec/spec_helper.rb
CONFLICT (content): Merge conflict in spec/spec_helper.rb
CONFLICT (add/add): Merge conflict in 
　（中略）
Auto-merging Gemfile.lock
Auto-merging Gemfile
CONFLICT (content): Merge conflict in Gemfile
Auto-merging .gitignore
CONFLICT (content): Merge conflict in .gitignore
Automatic merge failed; fix conflicts and then commit the result.
```


と、人生初のコンフリクト発生。

「 [Git コンフリクト解消手順](https://qiita.com/crarrry/items/c5964512e21e383b73da)」

こちらの記事を参考に、git status で状況を確認。

```shell

$git status
On branch ブランチ名
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)
Unmerged paths:
  (use "git add <file>..." to mark resolution)

 >   ※ここにコンフリクトが発生したファイルが一覧で表示される。
```


VScodeを確認すると、該当のファイルのコンフリクトが起きている箇所に、ローカルとリモートどちらの変更を適用するか選択するボタンが表示されている為、順番に確認しながらコンフリクトを解消していく。

ちなみに、コンフリクトした状態を一旦もとに戻したい場合は、
>$ git merge --abort


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

ホストOS上にDockerイメージを作成し、minikube仮想環境上にPodを作成しようとした際に ErrImageNeverPull が発生した問題の原因と解決方法をまとめました。

# 環境/再現方法
macOS上にDocker,minikubeをインストール



|アプリケーション| バージョン|
|:---|:---|
|Docker(Client,Server)|19.03.8 |
|minikube| v1.9.2|
|kubectl(Client)|v1.18.2|
|kubectl(Server)|v1.18.2|


- ホストOS上にイメージを作成

```
$ docker image build -t test .
```

- イメージ作成結果

```
docker image ls | grep -B1 test
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
test                                 latest              c73609119b74        55 minutes ago      282MB
```
- 利用したマニュフェストファイル

~~~yaml:pod.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: testpod
  namespace: default
  labels:
    app: hoge
    env: fuga
spec:
  containers:
  - name: testpod
    image: test
    imagePullPolicy: Never # hostOS上のイメージを取得する
~~~

- マニュフェストファイルの適用

```
$ kubectl apply -f pod.yml
pod/testpod created
```


# 現象

- 作成したpodのlog確認

```
$ kubectl get po
NAME      READY   STATUS              RESTARTS   AGE
testpod   0/1     ErrImageNeverPull   0          2m43s

$ kubectl logs testpod
Error from server (BadRequest): container "test" in pod "testpod" is waiting to start: ErrImageNeverPull
```
イメージの取得に失敗している。

# 原因
ホストOS上にDockerイメージ作成したがマニュフェストファイルからはminikubeにて作成された仮想環境上に存在するDockerイメージを取得しようとしたためImagePullエラーが発生。

# 期待される状態
local上のDockerイメージからPodを作成する。

# 解決方法
- 作成失敗したPodを削除

```
$ kubectl delete -f pod.yml
```

- DockerHub上にlocalにて作成したイメージファイルをPush

```
$ docker login
$ docker push <user名>/<image名>:<tag名> 
```


- マニュフェストファイル内のimagePullPolicyをAlwaysかIfNotPresentに修正

imagePullPolicyの各設定値の挙動は以下の通り

`imagePullPolicy: Never` 
localからイメージを取得

`imagePullPolicy: Always`
Pod作成時常時イメージをPull

`imagePullPolicy: IfNotPresent`　
ローカルでイメージが見つからない場合にのみイメージをPull

- 再度マニュフェストファイルを適用

```
$ kubectl apply -f pod.yml
pod/testpod created
$ kubectl get po
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          22s
```
STATUSがRunningとなり正常にPodが作成できました。
やや強引ではありますが擬似的にlocal上のイメージファイルから作成したPodと同等のPodをminikube上に作成することができました。

# 追記
Podのspec.volumeMountsもminikube上を見に行くので同様の原因でエラーとなりました。
こちらはminikube環境にssh接続して環境操作する方法にて解決できました。
（参考資料）
[stackoverflow](https://stackoverflow.com/questions/38870277/how-do-i-ssh-into-the-vm-for-minikube)
HerokuでPostgreSQLにリモートログインをするためのメモ書き

# 概要
[Heroku Postgres](https://jp.heroku.com/postgres)にターミナルから接続する際のメモ書きを書いてみました。

あくまで、メモ書きなので説明不足・内部的に何が行われているかは本家の文献や他の方の記事をお読みください。
特に[このあたり](https://devcenter.heroku.com/categories/reference)をお読みください

# 前提
以下が前提になっています。

- 著者が試しているPCは `Mac OS 10.14.6`
- PC（Mac）上に `psql` が設定済み
- Herokuのアプリケーションが作成済み、HerokuのPostgreSQLが設定ずみ
- サーバプログラムからHerokuのPostgreデータベースにテーブル・データが追加済み

# コマンド
今回はHerokuアプリの設定を以下を想定して説明をおこなう。

- アプリケーション名を `testapp`
- リモートブランチ名を `stg`
- Herokuで紐づけているデータベースの名前を `testdb`
- データベース内に存在するテーブルは1個で `testtable`

## Herokuのアプリケーションのディレクトリに移動
```shell
cd /path/to/testapp
```

## Heroku Postgresに接続（--remote指定も行えます）
```shell
heroku ps:psql --remote stg
```

### こんな質問が聞かれるので、yで返す
```shell
 ›   Warning: ps:psql is not a heroku command.
Did you mean pg:psql? [y/n]:y
```

### shellがこんな感じの表示になっていたらOK（~~は環境ごとに異なる）
```shell
--> Connecting to postgresql-~~
psql (~~)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

testdb::DATABASE=>
```

## Postgreのコマンドを試す
### テーブル一覧を出力する（\t）
```shell
testdb::DATABASE=> \t
```

### テーブル内のデータを全て出力する（select * from ~）
```shell
testdb::DATABASE=> select * from "testtable";
```

### Heroku Postgres との接続を切る（\q）
```shell
testdb::DATABASE=> \q
```

# 参考文献
[Heroku](https://jp.heroku.com/)
[Heroku Postgres](https://jp.heroku.com/postgres)
[Heroku Dev Center Documentation](https://devcenter.heroku.com/categories/reference)
[【PostgreSQL チュートリアル】Macへのインストール方法と基本コマンド](https://daiki-sekiguchi.com/2018/08/24/postgresql-tutorial/)
[[PostgreSQL] よく使うコマンドまとめ](https://dev.classmethod.jp/articles/postgresql-organize-command/)
[Swift Vapor + Heroku で 本番環境やステージング環境を分けて用意できるようになる](https://qiita.com/falcon0328/items/9b711b3176b0605a1e90)
Unix環境でのtimestamp取得コマンド

# コマンド
dateコマンドに引数を与えると取得可能

```bash
date +%s

# 1587575774
```

bashスクリプトに埋め込んで、動的に生成する場合のイメージ

```bash
echo "Now timestamp is `date +%s`"

# Now timestamp is 1587575856
```
【Swift・Objective-C】UIWebView・WKWebViewでのURLとローカルHTMLの表示

#URL
##UIWebViewでのURLの読み込み
以下のコードを見ると、URLを読み込む関数は**loadRequest**とSwiftもObjective-Cも同一です。

```swift
//Swift
func load(url: URL) {
 let request = URLRequest(url: url)
 uiWebView.loadRequest(request)
}
```
```objective_c

//Objective-C
- (void)loadWithURL:(NSURL *)url {
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.uiWebView loadRequest:request];
}
```
##WKWebViewでのURLの読み込み
以下のコードを見るとSwiftではURLの読み込みに**load**という関数を使用しており、Objective-CではloadRequestと関数が異なります。
またObjective-Cでは**import <WebKit/WebKit.h>でWebKitをインポートしないと、WKWebViewが使用できないので注意が必要です。

```swift

//Swift
func load(url: URL) {
    let request = URLRequest(url: url)
    wkWebView.load(request)
}
```
```objective_c

//Objective-C

#import <WebKit/WebKit.h>

- (void)loadWithURL:(NSURL *)url {
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.wkWebView loadRequest:request];
}
```

#ローカルHTML
##UIWebViewでのURLの読み込み
以下のコードを見ると、loadHTMLStringとSwiftもObjective-Cも同一の関数を使用していることがわかります。

```swift
// Swift版
uiWebView.loadHTMLString(html, baseURL: baseURL)
```
```objective_c

// Objective-C版
[self.uiWebView loadHTMLString:html
                       baseURL:baseURL];
```
##WKWebViewでのURLの読み込み
WKWebViewでもどちらもloadHTMLStringを使用しています。

```swift

// Swift版
_ = wkWebView.loadHTMLString(html, baseURL: baseURL)
```
```objective_c

// Objective-C版
[self.wkWebView loadHTMLString:html
                       baseURL:baseURL]
```

参考リンク
https://www.techgaku.com/archives/54
PostgreSQL12レプリケーション周りの変更点

# はじめに
PostgreSQL バージョン12で変更となった、レプリケーションの設定方法を備忘録として記載しておく。
今回の記事では、単純なレプリケーション構成に使われるパラメータのみスコープとしている。

# 変更点
これまでレプリケーションの設定を記載していたrecovery.confが廃止され、パラメータはpostgresql.confへ統合された。

## 変更されたパラメータ

|パラメータ名|備考|
|:-----------------|-----------|
| standby_mode|廃止|
| primary_conninfo|postgresql.confへ統合|
| pprimary_slot_name|postgresql.confへ統合|
| promote_trigger_file|postgresql.confへ統合<br>旧バージョンでの名称はtrigger_file|

## 変更後のpostgresql.conf

```postgresql.conf
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
...
# - Standby Servers -

# These settings are ignored on a master server.

#primary_conninfo = ''                  # connection string to sending server
                                        # (change requires restart)
#primary_slot_name = ''                 # replication slot on sending server
                                        # (change requires restart)
#promote_trigger_file = ''              # file name whose presence ends recovery
```


# 注意点
## pg_basebackupのオプション
これまでpg_basebackupコマンドでスタンバイサーバの構築を行う際、オプション -Rを指定することでrecovery.confファイルを生成していた。
recovery.conf廃止に伴い、今後はこのオプションが必要無くなるのかと思いきやそうではない。
バージョン12からは、-Rオプションを指定するとstandby.signalというシグナルファイルが生成される。（touchコマンドで後から生成することも可能。）
このシグナルファイルが存在することよりスタンバイサーバとして起動する。
シグナルファイルが存在しない場合、プライマリサーバとして起動してしまうため注意が必要。

## recovery.conf存在時のエラー
バージョン12からは、recovery.confファイルが存在すると下記エラーが発生し、起動自体出来なくなるので注意が必要。

```
$ pg_ctl start
...
LOG:  database system was shut down at 2020-03-15 05:47:55 JST
FATAL:  using recovery command file "recovery.conf" is not supported
LOG:  startup process (PID 30440) exited with exit code 1
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down
...
```
Grape / Rails / Swagger UI   でAPIサーバーを構築する②

####※前回：Grape / Rails / Swagger UI でAPIサーバーを構築する①
https://qiita.com/tksh8/items/2e258a853d92130970dd


前回でAPIを作成できたので、
今回はそのAPIをSwagger UIで
簡単に操作できるようにします。



## gemをGemfileに追加します。

```ruby:Gemfile
gem 'grape-swagger'
```

`bundle install`
で実行します

#### root.rbに`add_swagger_documentation`を追加

```ruby:/api/v1/root.rb
module V1
  class Root < Grape::API
    version :v1
    format :json

    mount V1::Users
    add_swagger_documentation(
      doc_version: '1.0.0',
      info: {
        title: 'テストAPI',
        description: 'APIドキュメントです'
      }
    )
  end
end
```

これで
http://localhost:3000/v1/swagger_doc

にアクセスすると

<img width="1105" alt="スクリーンショット 2020-04-23 0.30.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/fff43fe7-af22-31de-5893-87b323b99db1.png">
Swagger 用の JSON が返却されます！！！！


### 次にこれを Swagger UI で見れるようにします


Gemfile に以下を追記する。

```ruby:Gemfile
gem 'swagger_ui_engine'
```

`bundle install`
で実行します


#### `config/routes.rb` を修正してルーティングを追加します。

`config/initializers`に以下のような`swagger_ui_engine.rb`を作成します。

```ruby:config/initializers/swagger_ui_engine.rb
SwaggerUiEngine.configure do |config|
  config.swagger_url = {
    v1: '/v1/swagger_doc'
  }
end
```


`routes.rb`に`mount SwaggerUiEngine::Engine, at: '/v1/docs'`を追加します

```ruby:config/routes.rb
Rails.application.routes.draw do
  

  mount SwaggerUiEngine::Engine, at: '/v1/docs'
end
```




再起動し
下にアクセスすると、
http://localhost:3000/v1/docs

今度は
Swagger UI が表示されるはずです！！！

<img width="1014" alt="スクリーンショット 2020-04-23 1.30.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/928436dc-2501-edaa-d332-ba45f9587cc3.png">

簡単〜！！！！！！！！！！！！
JavaScriptにおけるvarとletの違い

JSにおいて変数を宣言する上で必要なvarとletですが、正しく使用するためにそれぞれの違いをまとめます。

##1 varで宣言
単純な宣言であると

```js
var 変数名;
var 変数名 = hoge;
```
となります。
varによる変数の宣言はどこでもできますが、同じ変数名での宣言は複数できません。（スコープが違えば可能）
基本的にプログラミングでは上から下に処理が実行されるので、変数を使用する処理より上にその変数を定義しておかなければなりませんが、
JSの場合は**varの巻き上げ**と言って処理を開始する前にvarを探し出し変数の宣言を先に行うことができます。
なので変数を使う処理の下にその処理に使う変数を宣言してもエラーにはなりませんが、undifindが表示されます。

##2 letで宣言

こちらも

```js
let 変数名;
let 変数名 = hoge;
```

のように宣言します。
letも巻き上げはありますが、varと違い、巻き上げた上でエラーを発生させます。
なので、変数の宣言より上でその変数を使った処理を行うとエラーが出ます。
これもvarとletの一つの違いです。

##3 varとletの違い

二つの違いは変数の使える範囲（スコープ）です。

varは関数スコープを持っており、関数内で使用した場合、その関数の中でしか使用できません。
逆に言うと関数内で使用している変数は関数外であれば同じ名前で別物の変数として使用することができます。

letはブロックスコープを持っており、if文などの{}の中でしかアクセスできません。


##4 まとめ
それぞれ使える範囲による違いや、巻き上げの仕方の違いなどがあり、
変数を宣言する上で必要なvarとletですが、その違いをしっかり認識する必要があると感じました。