OmniAICreator/Qiita-1.07M huggingface dataset:
Slackから全員分のプロフィール画像（アイコン）をダウンロードする

[決算パーティー用に一人を選ぶルーレットを作るため](https://qiita.com/umihico/items/7878dbaca57b21d2bfc0)、社員全員の顔写真をSlackから取りました。

APIでユーザーのアイコンのURLを取得しましょう。
`https://slack.com/api/users.list?token=xoxb-12345678-12345679-thairoo1airi6om7Ahga`
このような形で、ユーザー全員の情報をjsonで取るために有効なtokenを発行している必要があります。

トークンがない場合は、[https://api.slack.com/apps/](https://api.slack.com/apps/)にいき、
「Create New App」、名前をつけて作成したら「Permission」を選択肢、「User Token Scopes
」で`users.read`を設定。
インストールを押すと`xoxb`から始まるトークンが発行されます。[こちらが画像つきで詳しかったです。](https://qiita.com/kon1127/items/21338b193e6cb3947fe9)

有効なtokenの用意ができたら以下のpythonスクリプトでダウンロードができます。[レポジトリ（gist）はこちらです。](https://gist.github.com/umihico/e275f1a2963b8387075279fe5cb92424)

```python:download-slack-profile-pictures.py
import requests
import time

TOKEN = "xoxb-12345678-12345679-thairoo1airi6om7Ahga"


def main():
    url = "https://slack.com/api/users.list?token=" + TOKEN
    response = requests.get(url)
    response.raise_for_status()
    for i, member in enumerate(response.json()['members']):
        image512px_url = member['profile']['image_512']
        print(i + 1, image512px_url)
        response = requests.get(image512px_url)
        response.raise_for_status()
        filename = f"./{member['team_id']}-{member['id']}-{member['name']}.jpg"
        with open(filename, 'wb') as f:
            f.write(response.content)
        time.sleep(1)


if __name__ == '__main__':
    main()

```
Mac(OSX)からUbuntu(Pop!OS)へのリモートデスクトップ接続

いまいちしっくりこないので、しっくりこない部分を記録しておく。

- 動作環境
    - ホスト側
        - Max OSX 10.15.5、外部4Kモニタ
    - リモート側
        - 4KモニタでNVIDIAなNotebookPCに Pop!OS 18を導入
    - ネットワーク
        - 同一の有線LAN

## 素の状態では　か　な　り　使いにくい

- 参考のリンク先の情報通りにUbuntu(Pop!OS)を設定すればリモートにはサクッとつながる
    - vnc://your-remote-host-ip:5900
- だがしかし、Macと接続先のUbuntuマシン(リモート)双方が4K画面で、Ubuntuのデスクトップ200%で表示していると、Mac側でデスクトップの（左上）一部しか表示されず使いにくい。
    - リモートを100%にすれば若干改善（ただし、字がとっても小さい）
    - だがしかし、フルスクリーンにしても全体が表示されない
        - どちらもリモートデスクトップの1/4が表示される状態を死守（おかしい？）
- ちなみにリモート先がMac(画面解像度は4K以下)だと
    - 画面サイズを小さくするとちゃんとサイドバーが表示される
        - Ubuntuの場合、なぜか引き伸ばされる。解像度は同じなので、拡大縮小的なプレイ
    - リモートの解像度(画面サイズ)を変える追従する
- なにかが原因だと思うが、調べてない。
- 速度は、同一ネットワークなので遅くもなく速くもなく、テキスト操作は普通に使える
    -  NXにすれば速くなる模様

## 改善策 1、リモート接続用に、別途MateデスクトップなVNCサーバーを上げてを使う

- メリット
    - 軽いMateを裏で使う。
        - 引き続き表(LCD表示の)のDesktopにも触れるけど上記状態です
    - ひとまず安定して稼働しているので満足
- デメリット、副作用
    - DefaultのデスクトップがMateになるが調子悪いことがあるかもしれない（実際あった）のでAutologinはOffにしておく
        - 実機Loginの際にMateかそれ以外かは選べる
    - CTRLキーがAの横でないと気持ち悪い人はもう少し設定必要（これはOSXの性）
- Ubuntu側の基本設定
    - sudo apt-get install vnc4server ubuntu-mate-desktop vim
    - vncserver :1
    - vncserver -kill :1
    - vim ~/.vnc/xstartup
       - unset SESSION_MANAGER
       - unset DBUS_SESSION_BUS_ADDRESS
       - exec /usr/bin/mate-session &
    - vncserver :2 -geometry 1920x1200 -depth 24 
- Ubuntu側のおまけ、KB設定
    - 状態
        - MacでCapslockをCommandに割当
        - RemoteのUbuntuではCapslockはControl（実質的にはCommandがControl）
    - 設定
        - Mac側
        - Ubuntu側(xmodmap)
        - Alt_L Control_L 
        - xev
            - 64, ALt_L
        - xmodmap -pke
            - keycode 64  = ALt_L Meta_L 
        - in .Xmodmap
            -  add control = Control_L Control_R Alt_L
- Ubuntu側のおまけ、LCD閉じてもSleepしないようにしておく
    - sudo vim /etc/systemd/logind.conf
        - HandleLidSwitch=ignore
    - systemctl restart systemd-logind.service
- OSX側
    - vnc://your-remote-host-ip:5902
    
## 改善策 2

別に良い方法をないなか？

## 参考

- MacからUbuntu18.04LTSにリモートデスクトップ接続
    - https://usado.jp/spdsk/2018/12/08/post-4850/
- Windows10もしくはMacOSからUbuntu 18.04 LTSにリモート接続（リモートデスクトップ）してみた
    - http://imamachi-n.hatenablog.com/entry/2018/04/28/211147
- Mac から Ubuntuへリモートデスクトップ接続する
    - https://qiita.com/forestsignal/items/e0876ffb19daec88aeba
- 【Ubuntu18.04】VNC Serverを構築してMacからリモートアクセスしよう
    - https://www.sejuku.net/blog/85064
- デスクトップ環境 : VNCサーバーの設定
    - https://www.server-world.info/query?os=Ubuntu_18.04&p=desktop&f=6
- キーバインドの変更 Xmodmapの基本的な設定方法
    - https://qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7
- How to Change Lid Close Action in Ubuntu 18.04 LTS
    - https://tipsonubuntu.com/2018/04/28/change-lid-close-action-ubuntu-18-04-lts/
SQLの実行結果をメールするだけのシェルスクリプト

掲題の通り。
昼休みにちょっと書いてみた。

# 環境
Azure VMインスタンスの PostgreSQL を使用。

```sh
$ cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)

$ psql -V
psql (PostgreSQL) 9.2.23
```

# コード
本当は Python で書きたかったけども、現行モジュール構成では環境を弄らなければならなかった。
本番システムなのでそれは断念し、シェルスクリプト（bash）と標準コマンドのみで作成した。

```sh:bash
#!/bin/bash
YESTERDAY=`date --date '1 day ago' "+%Y%m%d"`
SQL_FILE=/tmp/dakoku.sql
MAIL_TEXT=/tmp/mail.txt

# SQL文を /tmp に作成
cat << EOL > $SQL_FILE
SELECT d.syaincd as 従業員番号, e.syainmei as 従業員名, d.torokudt as 打刻日時,
CASE dakokusyubetucd
  WHEN '1' THEN '出勤'
  WHEN '2' THEN '退勤'
  ELSE '不明'
END as 種別
FROM dakoku_table d
LEFT JOIN employee_table e ON d.syaincd = e.syaincd
WHERE dakokuymd = '$YESTERDAY'
ORDER by d.torokudt, d.syaincd;
EOL

# メールヘッダ等を /tmp に作成
cat << EOL > $MAIL_TEXT
To: foo@example.co.jp
Cc: bar@example.co.jp
Subject: DAILY TIME RECORD ($YESTERDAY)

本メールはシステムから自動送信しています。
勤怠打刻ログをお知らせします。

EOL

# SQLの実行結果をメール本文に追加
su - postgres -c "psql KINTAI_DB < $SQL_FILE" >> $MAIL_TEXT

# メールを送信
/sbin/sendmail -t < $MAIL_TEXT
```

```:送信されるメール
本メールはシステムから自動送信しています。
勤怠打刻ログをお知らせします。

 従業員番号 |   従業員名   |        打刻日時         | 種別
------------+--------------+-------------------------+------
     539258 | 山田　太郎   | 2020-07-17 07:47:05.314 | 出勤
     265167 | 鈴木　花子   | 2020-07-17 07:52:18.736 | 出勤
     329665 | 田中　一郎   | 2020-07-17 08:03:57.356 | 出勤
```

root の`crontab`に登録し、午前0時05分に自動実行。前日の勤怠打刻漏れを人事総務部がチェックできるようにした。
しょうもないコードだけど、誰かの参考になれば！
RasPi ZeroでNode-RedをDockerで実行する

#Node-RedをDockerで実行する
https://nodered.jp/docs/getting-started/docker


##関連パッケージのインストール
|パッケージ名    |説明|
|-----|-----|
|apt-transport-https|aptでhttpsを使えるようにする。|
|ca-certificates||
|software-properties-common||
```
$ sudo apt remove docker docker-engine docker.io
$ sudo dpkg -l docker*
$ sudo dpkg -P docker-ce docer-ce-cli
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

##Dockerのインストール
<B>Raspberry pi 4 MODEL B(raspbian buster)でも同様の手順でOK</b> 

```
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh 
```

##Dockerを一般ユーザで実行する
```
$ sudo usermod -aG docker $USER
```
##Dockerの動作確認
```
$ docker --version
Docker version 19.03.13, build 4484c46


$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4ee5c797bcd7: Pull complete 
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```


##Node-Redの実行
https://hub.docker.com/r/nodered/node-red/
```
$ docker run -it -p 1880:1880  -v node_red_user_data:/data --name mynodered nodered/node-red:1.0.1-10-minimal-arm32v6
```

###ターミナルに再接続する(ログを確認する)ためには、以下を実行します:

```
$ docker attach mynodered
```
##OTG Ether net 
```
$ nmcli c add type ethernet con-name raspi-usb ifname enp0s20f0u9
$ nmcli c modify raspi-usb ipv4.method shared
$ nmcli c up raspi-usb
$ nmcli d show raspi-usb
```

#dockerのubuntu18.04にNodeRedをインストールする
##nodeのインストール
```
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
```

##NodeRedのインストール
```
sudo npm install -g --unsafe-perm node-red
```
##NodeRes ROS

https://flows.nodered.org/node/node-red-contrib-ros
```
npm install -g --unsafe-perm node-red-admin

```
競プロで使うための GO 入門 ～ソート～

# Index
- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力]
- [変数・定数]
- [型変換]
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート](https://qiita.com/CamouflageSix/items/dbc2017504571e5a65aa)
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)
- [ASCII変換](https://qiita.com/CamouflageSix/items/283655027e6581a79b4b)

# ソート

sortパッケージをインポートする

```GO:
package main

import (
    "fmt"
    "sort" // sortパッケージ
)

func main() {

}
```

## シンプルなソート

```GO:
    s := []string{"e", "d", "c", "b", "a"}

    // 昇順
    sort.Sort(sort.StringSlice(s))

    fmt.Println(s) // ->[a b c d e]

    // 降順
    sort.Sort(sort.Reverse(sort.StringSlice(s)))

    fmt.Println(s) // ->[e d c b a]
```

## 構造体のソート
構造体をソートするためには、インターフェイスを実装する必要がある

```GO:
package main

import (
	"fmt"
	"sort"
)

// 構造体
type Person struct {
	name string
	age  int
}

// 構造体のスライス
type People []Person

// sortインタフェース実装
func (p People) Len() int           { return len(p) }
func (p People) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p People) Less(i, j int) bool { return p[i].age < p[j].age }

func main() {
    var people People = []Person{{"A", 25}, {"B", 19}, {"C", 22}}
    sort.Sort(people)
    fmt.Println(people) // -> [{B 19} {C 22} {A 25}]
}
```
Pythonのopenpyxlを使って画像をエクセルファイルに張り付ける

##画像をデフォルトのセルサイズに合わせて張り付ける
画像をA1～G10の範囲に張り付ける。

```python
import openpyxl


workbook = openpyxl.load_workbook('insert.xlsx')
sheet = workbook['Sheet1']
img = openpyxl.drawing.image.Image('img.png')
img.width = 72 * 7
img.height = 25 * 10
sheet.add_image(img, 'A1')
workbook.save('insert.xlsx')
```

画像をK3～T15の範囲に張り付ける。

```python
workbook = openpyxl.load_workbook('insert.xlsx')
sheet = workbook['Sheet1']
img = openpyxl.drawing.image.Image('img.png')
img.width = 72 * 10
img.height = 25 * 13
sheet.add_image(img, 'K3')
workbook.save('insert.xlsx')
```

画像をC13～D21の範囲に張り付ける。

```python
workbook = openpyxl.load_workbook('insert.xlsx')
sheet = workbook['Sheet1']
img = openpyxl.drawing.image.Image('img.png')
img.width = 72 * 2
img.height = 25 * 9
sheet.add_image(img, 'C13')
workbook.save('insert.xlsx')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/fe5d2662-9c92-3100-cbc9-c3364b7c7f83.png)

##参考URL
https://allabout.co.jp/gm/gc/297706/
https://qiita.com/HirotakaKikushima/items/a42e3e94273247199b9a
Blenderについて追記しながらまとめていく

#Blenderが中々上達しない、使いこなせない自分が少しずつインプットして便利だなって思ったことをまとめる。

**結果的にはそうなってるけど解釈が違うよってなってることあったらごめんなさい！**

##ショートカット

・**Gで移動**　

xyzを押せばその（軸）方向限定で移動
Shiftおしながら方向指定すればその座標（軸）以外で移動
例：Shift　+　z　ならZ軸以外で移動

・ **テンキーじゃない方の　【１．頂点　２．辺　３．面】**　

編集モードの切り替え

・ Ctrl+任意の数字 （これもテンキーじゃない方）　
サブディビジョンサーフェス適用（数字はビューポートをどれくらいにするか）

・**視点切り替え（テンキー）**

1:正面　3:右から　7:上から　9:その時の逆（正面状態なら後ろから）

・**Ctrl + 【+】 （テンキーのプラス）**

連続で押すと、なんか近いところバババって選んでくれる。つい最近（昨日）動画で知った！！

他は気づいたら随時追記します。
--

**ショートカットじゃないかもしれないけど便利だって思ったやつ**
・ナイフツールで切った時にスペースキーで確定（いつもエンターでやってた・・）





#使ってるアドオン

**TexTools**
UV展開するときに良い感じになるやつ

**LoopTools** 
なんか繋げてくれるやつ　例：足の指を別で作った時に繋げるときとか

**Screencast Keys** 
左下に自分の推したボタン表示してくれる
※これ入れるときに気付いたのがgithubからDLするときリリースってタブあったらそのzipファイル事Blenderのアドオンのインストールのところで選択すればすんなり入れれる。

余談
--
Blenderと関係ないけど、ら抜き言葉って気にする人いる？？？

個人的にはら抜き言葉を気にする人が気になります。

感じ方は人それぞれだし怒ったりとかはないけどｗ
Fujitsu:SystemWalker Operatin Manager のコマンドメモ

昔のprojectで使用。緊急時のメモとして。
SystelWalker Sectric Manager と SystemWalker Operation Manager を勘違いしていたので訂正。
× SystelWalker Sectric Manager
○ SystemWalker Operation Manager


[~~製品マニュアル(Sentric Manager)~~]
(https://www.fujitsu.com/jp/products/software/resources/technical/systemwalker/centricmgr/manual/)
[~~製品マニュアル(Operatin Manager)~~](https://www.fujitsu.com/jp/products/software/resources/technical/systemwalker/operationmgr/)
リンクが切れていたので再設定
[製品マニュアル(Systemwalker Operation Manager Enterprise Edition V16.0.0)](https://software.fujitsu.com/jp/manual/manualindex/p18000010.html)



# MSG操作
## [ＭＳＧ事象の発行](https://software.fujitsu.com/jp/manual/manualfiles/m180004/j2x18098/02z200/j8098-00-04-18-00.html)
 
jobschmsgevent MSG:PROJECT/NET

```
jobschmsgevent  メッセージ事象名[:プロジェクト名[/ジョブネット名]] 
                [-h ホスト名] [-p param [-c suffix]] 
                [-sys {all|サブシステム番号}] (注) 

※特定のＰＲＪ内に対してのみ、特定のジョブネットに対してのみ、ＭＳＧ事象を発行 
jobschmsgevent  メッセージ事象名[:プロジェクト名[/ジョブネット名]] 
```

## [ＭＳＧ事象の無効化](https://software.fujitsu.com/jp/manual/manualfiles/m180004/j2x18098/02z200/j8098-00-04-17-00.html)
jobschmsgclear -net PROJECT/NET

```
jobschmsgclear -net PROJECT/NET 
jobschmsgclear -all [プロジェクト名]              [-sys サブシステム番号] 
jobschmsgclear -net [プロジェクト名/]ジョブネット名  [-sys サブシステム番号] 

※指定したＪＮについてのみ、発生済のＭＳＧ事象を無効化 
jobschmsgclear -net [プロジェクト名/]ジョブネット名 
```

# ジョブ

## [ジョブネット制御](https://software.fujitsu.com/jp/manual/manualfiles/m180004/j2x18098/02z200/j8098-00-04-14-00.html)
jobschcontrol PROJECT/NET disable

```
jobschcontrol  [プロジェクト名/]ジョブネット名 control 
               [start用オプション] [rerun用オプション] [-sys サブシステム番号]  (注) 
    control: 
        cancel          強制終了 
        start           起動 
        rerun           前回、異常終了した、強制終了させた、または確認済にしたジョブネットを再起動 
        pause           停止中 
        continue        ”停止”を行う前の状態に 
        disable         無効状態 
        enable          ”無効”を行う前の状態に 
        cope            異常終了したジョブネットを確認済状態に 
        reinstate       終了取消 
        revoke          持越解除 

        rerun [next|top] 
                next    異常終了ジョブの次のジョブから起動。強制終了も異常終了と同様の扱い 
                top     先頭ジョブから再起動 

        start [-p param] 
                可変パラメタを指定 
```

## [ジョブ制御](https://software.fujitsu.com/jp/manual/manualfiles/m180004/j2x18098/02z200/j8098-00-04-13-00.html)
jobschctljob PROJECT/NET/JOB disable 

```
jobschctljob  [プロジェクト名/]ジョブネット名/ジョブ名 control [-sys サブシステム番号]  (注) 
    control: 
        cancel          強制終了 
        rerun           再起動 
        pause           停止中状態に 
        continue        ”停止”を行う前の状態に 
        disable         無効状態に 
        enable          ”無効”を行う前の状態に 
```
Alienware17R4（Win10）で Bluetooth が有効化できなくなった（アクションセンターにもデバイスマネージャーにも BIOS にも出てこない）ので、えぇ…もしかして熱でそこだけ壊れちゃったのかなあ…そんなのあり得るか？でも検索かけたら AW17 の BT 壊れた報告（英語）いくつかあるし、やっぱあり得るのかなあ、無茶苦茶困るなあ、などと思っていたけど、再起動繰り返したら元に戻ったので安心した。

つまりそういうこった。
leafletを鍛える。その26

#概要

leafletを鍛えてみた。
geojsonを表示してみた。
鉄道路線、表示してみた。


#参考にしたページ

https://qiita.com/uedayou/items/b5131b5ca930fe0bef69

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c51fc123-9c92-d658-10c5-4e8a56f7f8e2.png)


#成果物

https://embed.plnkr.co/plunk/PmpFlEQjTRoe0TXU

以上。
Ruby2D で穴掘り迷路を作る

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/bOi0e2bo6Ho/0.jpg)](http://www.youtube.com/watch?v=bOi0e2bo6Ho)
Gem "[Ruby2D](http://www.ruby2d.com/)" を使ってなんとなく「穴掘り迷路」を実装してみました。「道」が段々伸びていくのがリアルタイムで見られるようになっています。上画像は YouTube 動画にリンクされています。

##コード
```ruby:dig_maze.rb
require "ruby2d"

L = 20    #迷路の大きさ
W = L * 2 + 3

Block_w = 10   #ブロック一個の大きさ
set width: W * Block_w, height: W * Block_w, fps_cap: 10

blocks = W.times.map {|y|
  W.times.map {|x|
    Square.new x: x * Block_w, y: y * Block_w,
               size: Block_w, color: "green"
  }
}

field = Array.new(W) {Array.new(W, 1)}
#「番兵」を置く
field[0] = field[-1] = Array.new(W, -1)
(1..W - 2).each {|y| field[y][0] = field[y][-1] = -1}

field.define_singleton_method(:show) do
  each_index do |y|
    self[y].each_index do |x|
      self[y][x].zero? ? blocks[y][x].remove : blocks[y][x].add
    end
  end
end

start = [2, 2]
stack = [start]
show_stack = [start]

dig = ->(now) {
  movable = []
  [[1, 0], [0, -1], [-1, 0], [0, 1]].each do |dx, dy|
    x = now[0] + dx * 2
    y = now[1] + dy * 2
    movable << [x, y] if field[y][x] == 1
  end
  if movable.empty?
    return if stack.empty?
    jump = stack.delete_at(rand(stack.size))
    dig.(jump)
  else
    nxt = movable.sample
    show_stack << [(now[0] + nxt[0]) / 2, (now[1] + nxt[1]) / 2]
    show_stack << nxt
    stack << nxt
  end
}


update do
  now = show_stack.shift
  next unless now
  field[now[1]][now[0]] = 0
  field.show
  dig.(now) if show_stack.empty?
end

show
```

Ruby2D のメソッドを簡単に解説します。

- `set`　ウィンドウの大きさなどを設定します。
- `Square.new`　正方形をあらわすオブジェクトを生成します。オブジェクトは`.add` `.remove`を付けることで表示されたり、非表示になったりします。
- `update`　ブロック内が一定の時間（ふつうは60fps）で更新されます。ここでは 10fps で表示しています。
- `show`　メインループに入ります。

穴掘り自体は簡単な再帰で実装しています。配列変数`field`が迷路をあらわしていて、値が`0`ならば「道」があることを意味しています。周囲には「番兵」を置いていて、その外へ「道」が出ないようにしています。
第１回　今週のRPA関連ニュース　7/13(月)〜7/1７(金)

こんにちは！
Peaceful morning社でインターンをしている川内です。

普段RPA HACKでは、Twitterアカウント(https://twitter.com/NewsRpa)
にて、毎日RPAのニュースを紹介しています！

そこで、これから毎週土曜日に、それらのニュースから川内が気になったニュースを独断で紹介いたします！この記事を見ていただければ、この1週間でおきたRPAの周りでおこった主な出来事がサクッと理解できます！

記事の形式としては、**「記事の題名」「記事のリンク」「記事の要約」**を各曜日で順に書いていきます！

##月曜日　7/13
###Minoriソリューションズ、RPAを利用して業務効率化を支援するシナリオパッケージ3種類を提供

記事URL　(https://news.yahoo.co.jp/articles/4ccd4b3a22806b387843b251ecc5aa519cde5fc8)

株式会社Minoriソリューションズは13日、RPAソフトウェア「MinoRobo（ミノロボ）」を用いた、業務効率化を支援するシナリオパッケージシリーズを提供開始したと発表。①人事業務における煩雑な事務作業　②日々更新される不動産物件情報の収集　③大量メールの送受信による作業　の3業務に対応したものである。

##火曜日　7/14

###不動産業界専門のRPAサービス「RPAらくらくロボシリーズ」、ERA LIXIL不動産ショップ加盟店に提供

記事URL
(https://news.yahoo.co.jp/articles/7855abbb291e4b1c72f5eb0c7dd7ed083897c3c1)


いえらぶGROUPは7月14日、LIXILイーアールエージャパンに、RPAを用いた不動産業務自動化サービス「RPAらくらくロボシリーズ」の提供を開始したと発表。「RPAらくらくロボシリーズ」は物出しや物件のコメント入力など、不動産会社にとって不可欠な業務を自動化したサービス。

いえらぶGROUPについてさらに知りたい方はこちら↓
不動産業界の業務のあり方を変える「RPAらくらくロボシリーズ」とは？
https://rpahack.com/ielove

##水曜日　7/15

###NTTテクノクロスとNTT-AT、RPA統制ソリューションとRPAツールが技術連携

記事URL
(https://active.nikkeibp.co.jp/atcl/r/19/RSP537707_14072020/?n_cid=nbpnxt_pgmn)

NTTテクノクロス株式会社とNTTアドバンステクノロジ株式会社「ACTCenter(R) Secure Automation」とRPAツール「WinActor(R)」の技術連携により、WinActorのシナリオ実行時に認証情報を暗号化して引き渡し、シナリオ内で復号化する機能を安全かつ容易に利用できる仕組みを確立。

##木曜日　7/16

###NTTデータ、自治体向けの共同型RPA・AIサービスを8月よりトライアル提供　“スマート自治体”化を支援

記事URL
(https://cloud.watch.impress.co.jp/docs/news/1265609.html)

株式会社NTTデータは15日、共同型RPA・AIサービス「スマート自治体プラットフォーム NaNaTsu（ななつ）」を8月1日よりトライアル提供開始すると発表した。「スマート自治体プラットフォーム NaNaTsu（ななつ）」は共同型RPA・AIサービスで自治体の各業務に特化した自動化シナリオが用意されており、シナリオの保守からリモートサポートまで含めて利用できる。


##金曜日　7/17

###日清食品、得意先への出荷案内業務をRPAで自動化、年間8000時間の削減を見込む

記事URL
(https://cloud.watch.impress.co.jp/docs/news/1265609.html)

日清食品は、UiPathを使用し、得意先への出荷案内業務をRPA（ロボットによる業務自動化）で自動化し、在宅勤務スタッフの業務を効率化した。業務時間を月間170時間削減できる見込んでいる。


##RPA HACKについて
RPA HACKではRPA・AI・Power Automateに関する記事が100本以上掲載されています！すべて無料でご覧いただけます！

RPAのツールを触ってみたい！という方におすすめ↓
**・UiPath StudioXの基本をマスター！～画面構成/カード/アクション**
https://rpahack.com/uipath_studiox_1


RPAエンジニアとして働いてみたいという方におすすめ↓
**・事務職から転職したRPAエンジニアが語る仕事の2つの魅力**
https://rpahack.com/attraction-of-rpa

Power Automateの使い方を学んで見たい方におすすめ↓
**・Power Automateの便利な使い方をカテゴリーごとに紹介**
https://rpahack.com/powerautomate-2


RPA HACKのtwitterのフォローもよろしくお願いします！
(URL：https://twitter.com/home)
AWS Lambdaで、CloudWatchのイベントログを取得する

#イベントログを取得する方法
①AWS SDK
②AWS CLI

#AWS SDKの使い方

###pythonのSDK
「AWS SDK for Python (Boto3)」です。
https://aws.amazon.com/jp/sdk-for-python/

###どんな関数があるか
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html

###何を使えばイベントログが取れるか
####①filter_log_events
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.filter_log_events
・startTime/endTimeで日時の範囲を指定してデータ抽出が可能。ただし、指定する値がUNIXタイムの”””ミリ秒”””
→私は、UNIXタイムでしょ？秒でしょ？と思いこんでいて長時間はまってました(笑)
・filterPatternで抽出条件の指定が可能
　https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
・１回で取得できるデータは１MBまで。ただし、nextTokenが返却されるから、そのあとそれを使い関数を呼べば続きのデータが取得可能

####②start_query
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.start_query
・cloudwatchlogインサイトを使用することになる。データの抽出集計ができるが、インサイト分の料金もかかる。

###ソースイメージ
★すみません、動かしていません。
　あと、lambdaなのでboto3のパッケージのアップロードしないといけません。

```sample.py
import boto3

def lambda_handler(event, context):

    client = boto3.client("logs")

    response = client.filter_log_events(
        logGroupName="【ロググループ名】",
        filterPattern="【抽出条件】",
        startTime="【開始時間　unixtimeのミリ秒】",
        endTime="【終了時間　unixtimeのミリ秒】"
    )
```
Vimまとめ〜Vimの特徴的機能「モード」〜

### 環境
- OS : Ubuntu 18.04 LTS
- Vim : VIM - 2:8.0.1453-1

## 「モード」とは

Vimには、「モード」という機能があります。この機能を理解していなかった頃の私は、「あれ？文字入力ができない！！」と戸惑うことがありました。
ターミナル上で動作するエディタとして効果的に使えるようにするための機能であるようです。
他にもあるようですが、基本的にはこの4つをおさえておけば大丈夫なようです。

|モード名|主なモード変換キー|機能|
|:---:|:---:|:---:|
|ノーマルモード|ESC|Vimを起動したばかりの状態で表示される基本とされるモード<br>他のモードに移動したいときには、一度ノーマルモードに戻る必要がある。|
|入力モード|i|テキストファイルを編集するためのモード|
|ビジュアルモード|v|入力された文字列を選択するためのモード|
|コマンドモード|:|ファイルの保存やVimの終了などのコマンド入力をするモード|

---

### 参考サイト
- [Qiita:Vimモード入門](https://qiita.com/gorilla0513/items/e8ccb15bfc87e7ed8d5b)


### 本記事目次ページ
- [Qiita:Vimまとめ](https://qiita.com/tsweblabo/items/574a363f52116ff64633)
Xcodeでワイヤレスデバッグをする

# 方法
1. ワイヤレスデバッグしたい端末をLightningケーブルでPC接続し、優先デバッグできるようにしておく
2.  PCと端末を同じwifiに繋ぐ
3.  `Window`メニューを選択 
4.  `Devices and Simulators`
5.  該当の端末を選択
6.  `Connect via network`にチェック

以下のようにWebアイコンが端末の右にLightningケーブル抜いてもデバッグできる。

<img width="802" alt="スクリーンショット 2020-07-18 7.57.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199256/dc20bcd7-ba4b-9b3f-1ba4-eb6584873d68.png">
[Laravel 6] Modelsディレクトリを作る

新規プロジェクトを作成する時に、毎回Modelsディレクトリを作成するので、メモ。（*Laravel6系の構成です）

Laravelを初めて触る人に向けて補足すると、新規プロジェクトを作成すると、Userモデルがapp/に作成されていますが、これは、開発者の意図があります。以下、日本語ドキュメントより。

>Laravelを学習し始めるとき、多くの開発者は models ディレクトリが存在しないことに戸惑います。しかし、意図的にこのディレクトリを用意していません。多くの別々の人達にとって、その意味合いは様々なため、"models"という言葉の定義は曖昧であることに私達は気づきました。ある開発者たちはすべてのビジネスロジックを総称してアプリケーションの「モデル」と呼び、一方で別の人達はリレーショナルデータベースに関連するクラスを「モデル」として参照しています。

>このため、私達はEloquentモデルをデフォルトではappディレクトリ下へ設置することを選択し、開発者自分が選んだどこか別の場所へ設置してもらうことにしました。

[ディレクトリ構造](https://readouble.com/laravel/6.x/ja/structure.html)

これは、初学者にとっては、戸惑うかもしれませんが、Laravelを使っていくうちに、この構成は、プロジェクトによって柔軟に構成が変えられるので、良い考えだと思います。

では、モデルディレクトリの構成変更をしていきましょう。

##app/Modelsフォルダ作成
```terminal
mkdir app/Models
```
##User.phpをModelsディレクトリへ移動

[namespace(名前空間)](https://www.php.net/manual/ja/language.namespaces.rationale.php)も `App\Models`に変更しておきましょう。

```php
<?php
namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
```

##autoloadの参照
まず、オートロードの参照を追記しましょう。
これは、 `composer.json` で制御しているので修正

```php:composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Models\\": "app/Models/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
```

## その他関連ファイルの名前空間を修正

Laravel６.xは以下が修正対象です。

+ /database/factories/UserFactory.php
+ /config/auth.php
+ /app/Http/Controllers/Auth/RegisterController.php

```php:UserFactory.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Models\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;
```

```php:/config/auth.php
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
```

```php:RegisterController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
```

以上！
メモ: css1行入れるだけでキレイになる

## water.css

```html:light版
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css">
```

```html:dark版
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
```

##  transform: rotate(0.05deg);

* IE11でも動作する

```css
* {
    transform: rotate(0.03deg);
}
```


### thunderbird でもこの cssを設定できる。

プロファイルの場所は以下で確認ができる。

* オプション - アカウント - サーバー設定 - メッセージの保存先

プロファイルの場所に chrome というフォルダを作り、以下ファイルにcssを書く。

* userChrome.css
    * ソフト全体の表示
* userContent.css
    * メール画面の表示
2列の複数行の文字数の多い条件でレイアウトがくずれないよう対処

下図のように2列の複数行のレイアウトを実施したかったのですが、

![2列複数行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/0cf18b5e-021b-d7c2-b812-9acd0a17ad3d.png)


文字数が多いときに下記のように左右のレイアウトバランスが悪くなります
![2列複数行_文字数多い場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/e40f3671-5a69-7e4f-6055-58afc02ff954.png)

文字数多いときは省略して、左右のレイアウトが1対1になるのが、やりたいことです。

ちなみにhtmlは下記です

```html

</head>
<body>
    <header>
        <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
        <link rel="stylesheet" type="text/css" href="css/style.css">
    </header>
    
    <h1 id = 'pageTitle'>リクエスト</h1>

    <div class="affAssemble">
        <div class="btnAff">１のボックスaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>
        <div class="btnAff">２のボックス</div>
        <div class="btnAff">３のボックス</div>
        <div class="btnAff">４のボックス</div>
        <div class="btnAff">５のボックス</div>
        <div class="btnAff">６のボックス</div>
    </div>
  </body>
</html>
```

cssは下記でgridを使用しています。

```css

.affAssemble{
    width: 600px;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}

.btnAff{
    background-color: green;
}
```

cssを下記のように変更して概ね対処できました。
(1)上位の要素をgridからflexに変更、それい応じてflex-direction,flex-wrapを設定
(2)対象要素にwidth,margin,white-space,overflowを設定

```css

.affAssemble{
    width: 600px;
    /* flexに変更 */
    display: flex;
    flex-direction: row;
    /* 指定長さで折り返すように変更 */
    flex-wrap: wrap;
}

.btnAff{
    width: 45%; /*widthで指定*/
    background-color: green;
    white-space: nowrap; /*一行にする*/
    overflow: hidden;/*溢れた分は表示しない*/
    margin: 2px;/*gap調整*/
}

```

結果
![2列複数行_文字数多い場合_対応.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/b6706a7c-e7de-f0f5-68da-3d88edcefdeb.png)
SALOMEとは？

この資料はEDFによる「[Welcome to the www.salome-platform.org — SALOME Platform](https://www.salome-platform.org/)」のトップページを日本語に訳したものです。

# SALOMEとは？

SALOMEは、数値シミュレーションのための汎用的なプリ・ポスト処理プラットフォームを提供する**オープンソースのソフトウェア**です。
再利用可能なコンポーネントで構成されたオープンで柔軟なアーキテクチャに基づいています。

SALOMEは**クロスプラットフォーム**のソリューションです。これはGNU LGPLライセンスの条件のもとで配布されています。
このサイトからソースコードと実行ファイルの両方をダウンロードできます。

# SALOMEはどのように使えますか？

SALOMEは、CADモデルの生成、数値計算のための準備、計算結果の後処理のための**スタンドアロンのアプリケーション**として使用できます。

また、SALOMEは、CADモデルのライフサイクル全体を管理するための新しいアプリケーションを作成することができ、外部のサードパーティ製数値計算コードの**統合プラットフォーム**としても使用できます。

# SALOMEの主な機能

* CADモデリングと計算ソフト（CAD-CAEリンク）の相互運用性をサポートします。

* 数値計算の異種構成要素への新規コンポーネントの統合を容易にします。

* 計算ソフトウェア間のマルチフィジックス結合に優先度を設定します。

* 汎用的でユーザーフレンドリーで効率的なユーザーインタフェースを提供し、スタディ実施のコストと遅延の低減に貢献します。

* このプラットフォームに基づくソフトウェアソリューションを学習するためのトレーニング時間を特定の時間に短縮します。

* 統合されたPythonコンソールを介して、すべての機能にアクセスできます。

# SALOMEで何ができるのか？

* CADモデルの作成、修正、インポートおよびエクスポート（IGES、STEP、BREP、...）、修復およびクリーンアップ。

* CADモデルのメッシュ生成、メッシュの編集、メッシュ品質のチェック、メッシュデータのインポートとエクスポート（MED, UNV, DAT, STL, ....）。

* 幾何学的なアイテムにアタッチされた物理プロパティと数量を扱うことができます。

* 1つ以上の外部ソルバー（結合）を使用して計算を実行します。

* 計算結果の表示（スカラー、ベクトルデータ）。

* スタディの管理（作成、保存、再読み込み、...）。
スマホ版Qiitaで新規記事を作成するボタンが分からなかったのでQiitaAPIを使ってどうにかするテスト

久しぶりに新規記事を書こうとしたら、「作成ボタン…どこ？」となりさっぱり見つからなかったので、**QiitaAPI**とShortcutsでなんとかした話。

# 条件
- 使える道具はスマホのみ(PCは使わない)
   - ShortcutsでQiitaAPIを叩く
- 編集・本投稿は投稿後Qiita上で行う
   - 下書き or 限定共有記事を投稿すればおけ
- 個人投稿(QiitaTeamsではない)

# QuitaAPIで記事を投稿する
## QiitaAPIを理解する
[QiitaAPIの[投稿]項目](https://qiita.com/api/v2/docs#投稿)から、上の条件に沿ってサンプルを書き換えると、

```
URL: https://qiita.com/api/v2/items

Method: POST

Header: 
{
  "ContentType": "application/JSON",
  "Authorization": "Bearer {ACCESS_TOKEN}"
}
*{ACCESS_TOKEN}は自分のアクセストークンと置き換えます

Body: 
{
  "body": "適当な文字列",
  "private": true,
  "tags": [
    {
      "name": "テスト投稿"
    }
  ],
  "title": "仮投稿",
  "tweet": false
}

```

こんな感じのリクエストをショートカット側で再現します。

# レッツ再現
![F772FFAD-7974-4439-B0BD-B24CE97BDEFD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/974baa14-6e50-8271-da7f-4557bdeda59b.png)

# 実行結果

```
{
  "body" : "適当な文字列\n",
  "id" : "d8206c0c1a121b4312c9",
  "private" : true,
  "rendered_body" : "<p>適当な文字列<\/p>\n",
  "coediting" : false,
  "created_at" : "2020-07-18T14:08:15+09:00",
  "tags" : [
    {
      "name" : "テスト投稿",
      "versions" : [
      ]
    }
  ],
  "url" : "https:\/\/qiita.com\/Kynako\/private\/d8206c0c1a121b4312c9",
  "title" : "仮投稿",
  "group" : null,
  "updated_at" : "2020-07-18T14:08:15+09:00",
  "reactions_count" : 0,
  "comments_count" : 0,
  "likes_count" : 0,
  "user" : {
    "description" : "SmileBasic -> iOSShortcuts -> JavaScriptとかPython勉強中。ねるねるねるねが大好物",
    "followers_count" : 2,
    "id" : "Kynako",
    "facebook_id" : "",
    "permanent_id" : 561438,
    "github_login_name" : null,
    "twitter_screen_name" : "K_Melodyline",
    "followees_count" : 7,
    "website_url" : "",
    "linkedin_id" : "",
    "profile_image_url" : "https:\/\/qiita-image-store.s3.ap-northeast-1.amazonaws.com\/0\/561438\/profile-images\/1579347110",
    "location" : "",
    "items_count" : 6,
    "team_only" : false,
    "name" : "@Kynako",
    "organization" : ""
  },
  "page_views_count" : null
}
```
![71C5B01C-113A-4271-84AF-E8DEDB8C26FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/e46fa730-37a8-194f-ba2f-65b09de044d0.jpeg)
ちゃんと限定共有記事として投稿されてました。

ちなみにこの記事もショートカットから投稿した記事を編集して公開してます。
競プロで使うための GO 入門 ～Hello World～

# Index

- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力]
- [変数・定数]
- [型変換]
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート](https://qiita.com/CamouflageSix/items/dbc2017504571e5a65aa)
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)
- [ASCII変換](https://qiita.com/CamouflageSix/items/283655027e6581a79b4b)

# Hello World

```Go:
package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}
```
# パッケージ

関数を使用するためには、パッケージをインポートする必要がある。
"fmt"は、標準入出力の関数を含む。

```Go:
import "fmt"
```
または、

```Go:
import(
    "fmt"
)
```

# ブレースの位置

Goはブレースの位置が決まっているため、以下の記述ではエラーになる。

```Go:
func main()
{
	fmt.Println("Hello World")
}

// エラー出力例
// missing function body
// syntax error: unexpected semicolon or newline before {
```
マルチキーマップを標準ライブラリで作る

複数のキーを持つマップが必要な場合、サードパーティー製のライブラリを使う方法もありますが、標準ライブラリの`Map`をネストさせる方法もあります。
ここでは３つのキーを持つマップを例とします。
最初は`get()`です。指定したキーを持つ値が存在しない場合は`null`を返します。

```java
public static <A, B, C, D> D get(Map<A, Map<B, Map<C, D>>> map, A a, B b, C c) {
    return Optional.ofNullable(map.get(a))
        .map(m -> m.get(b))
        .map(m -> m.get(c))
        .orElse(null);
}
```

次は`put()`です。

```java
public static <A, B, C, D> void put(Map<A, Map<B, Map<C, D>>> map, A a, B b, C c, D d) {
    map.computeIfAbsent(a, t -> new HashMap<>())
        .computeIfAbsent(b, t -> new HashMap<>())
        .put(c, d);
}
```

パターンがわかれば４つ以上のキーを持つマップも簡単に作れると思います。
以下はテストコードです。

```java
@Test
public void testMultiKeyMap() {
    Map<Integer, Map<Integer, Map<Integer, Integer>>> map = new HashMap<>();
    for (int a = 0, value = 0; a < 2; ++a)
        for (int b = 0; b < 2; ++b)
            for (int c = 0; c < 2; ++c)
                put(map, a, b, c, value++);
    Map<Integer, Map<Integer, Map<Integer, Integer>>> expected =
        Map.of(0, Map.of(0, Map.of(0, 0,
                                   1, 1),
                         1, Map.of(0, 2,
                                   1, 3)),
               1, Map.of(0, Map.of(0, 4,
                                   1, 5),
                         1, Map.of(0, 6,
                                   1, 7)));
    assertEquals(expected, map);
    for (int a = 0, value = 0; a < 2; ++a)
        for (int b = 0; b < 2; ++b)
            for (int c = 0; c < 2; ++c)
                assertEquals(value++, get(map, a, b, c));
    assertEquals(null, get(map, 2, 2, 2));
}
```

`map.toString()`は以下のようになります。

```
{0={0={0=0, 1=1}, 1={0=2, 1=3}}, 1={0={0=4, 1=5}, 1={0=6, 1=7}}}
```
FreeRTOS理解その３（ボタン押下によるタスク切換えその２）

# 実習その３
[こちら](https://qiita.com/infinite1oop/items/b910173b376620928021)の続き。今回もステキなプログラムではない（改善の余地あり）。
## やること
ボタン押下時のチャタリングを防ぐのが目的。
## 使ったもの
[こちら](https://qiita.com/infinite1oop/items/b910173b376620928021)と同じ、Nucleo-F303RE。

## コード
### タスク関連宣言
```c++
#include <STM32FreeRTOS.h>

const uint8_t Led = LED_BUILTIN;
const uint8_t Btn = USER_BTN;
uint8_t run_task = 1;

TaskHandle_t TaskBlink1_Handler;
TaskHandle_t TaskBlink0_Handler;

void TaskBlink1(void *pvParameters);
void TaskBlink0(void *pvParameters);
```

今回のタスクは2つ。実行中タスクの表す変数「run_task」をもうけた。値が'1'のときはTaskBlink1、'0'のときはTaskBlink0が動く。

### Arduinoのおなじみのところ
```c++
void setup() {
  Serial.begin(9600);  
  while (!Serial) {}

  pinMode(Led, OUTPUT);
  pinMode(Btn, INPUT);

  xTaskCreate(TaskBlink1, "Blink1", 128, NULL, 1, &TaskBlink1_Handler);
  xTaskCreate(TaskBlink0, "Blink0", 128, NULL, 1, &TaskBlink0_Handler);    
  
  attachInterrupt(digitalPinToInterrupt(Btn), interruptHandler, LOW);
  
  vTaskStartScheduler(); 
}  

void loop() {
}

```

今回の特徴は、ボタン押下時の割り込みハンドラがあるところ。attachInterrupt()がそれ。

### 割り込みハンドラ
```c++

void interruptHandler() {
  Serial.println("Button pressed");  
  if (run_task) {
    run_task = 0;
  } else {
    run_task = 1;
  }
}

```

ボタン押下時に、実行中タスク変数「run_task」を入れ替えるのがミソ。

### LEDタスク
```c++
void TaskBlink1(void *pvParameters) {
  (void) pvParameters;

  for (;;) {
    if (run_task) {
      digitalWrite(Led, HIGH);
      delay(500);
      digitalWrite(Led, LOW);
      delay(500);
      Serial.println("Blink1");
    }
    vTaskDelay(1);
  }
}

void TaskBlink0(void *pvParameters) {
  (void) pvParameters;
  
  for (;;) {
    if (!run_task) {
      digitalWrite(Led, HIGH);
      delay(1000);
      digitalWrite(Led, LOW);
      delay(1000);
      Serial.println("Blink0");
    }
    vTaskDelay(1);
  }
}
```
前回と同じ。

## 実験
コンソール上では下記のような感じ。ボタンを押すと切り替わる。
![2ndTry.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/18120da0-2b85-3957-127c-38583abafbc0.png)
ここではボタン押下を確実にとらえてくれる。ただし、この場合でもスイッチを押した後でも動作中のタスクはきりがいいところ（タスクスイッチが行われるところ）まで動作する。そのため、「Button pressed」の表示後にも、直前までのタスクのメッセージが出てしまっている。

LEDという一つの資源を確実に排他で利用するにはセマフォなどの利用が望ましいが、用途によってはこの方式で十分であろう。

## 最後に
そもそも、前回も今回もマルチタスクにする必要性はない。用途に応じて、タスク間通信を行うときに、ミューテックス・セマフォ・キューなどを使い分けるのがよいのであろう。

先人のみなさまの知恵を借りながら、また、考えてみる。
Auth TokenをlocalStorageに入れようが、cookieに入れようがどっちもXSS危険性には無防備（同ドメイン内なら ...）

![greta-farnedi-HAcS36pCiM0-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/0820f549-4a07-7fc3-2062-c87d9287c070.jpeg)


# tokenを保存する場所

- localStorage
- cookie
- cookie (http only)
- メモリ内 (変数)

よく言われるのが **JWT tokenをlocalStorageに入れるべきではない** ということ。
理由としてはJavascriptで簡単に読めてしまうので、XSSがあった場合意図しないスクリプトを動かされてしまい、結果としてtokenが盗まれるというもの。
対応策として **cookie (http only)** を色んな所で推奨してる。

- https://techracho.bpsinc.jp/hachi8833/2019_10_09/80851
- http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
- http://cryto.net/~joepie91/blog/2016/06/19/stop-using-jwt-for-sessions-part-2-why-your-solution-doesnt-work/

# が、cookie (http only)も実は無意味

localStorage vs Cookies for Auth Token Storage - Why httpOnly Cookies are NOT better!
https://www.youtube.com/watch?v=mBd-SMPp3kI

XSSがある場合、とにかくスクリプトを動かされてしまう。「だけど、cookie (http only)はスクリプトから読めないから問題ないじゃないか！」と思うが、攻撃者が自身のサーバーを作って、`fetch`で **credentials: "include"** をしてしまえば、http only cookieを含めた全部を攻撃者のサーバーに送れちゃうよ、という話。

# が、同ドメインな場合のみである

[コメント参照][1]

https://tools.ietf.org/html/rfc6265#section-8.5

> Cookies do not provide isolation by port.  If a cookie is readable by
a service running on one port, the cookie is also readable by a
service running on another port of the same server.  If a cookie is
writable by a service on one port, the cookie is also writable by a
service running on another port of the same server.  For this reason,
servers SHOULD NOT both run mutually distrusting services on
different ports of the same host and use cookies to store security-
sensitive information.

今回このyoutubeでは`localhost`ドメイン内で`3000`、`8000`ポートを使っていたので、すべてのcookieが`credentials: "include"`でダダ漏れっぽく見えていた。

これを`a.domain`から`b.domain`への`credentials: "include"`であった場合は、`a.domain`のcookieは`b.domain`へ漏れない。

youtubeの投稿も現状unlisted状態になって、検索では出てきません。
![localStorage_vs_Cookies_for_Auth_Token_Storage_-_Why_httpOnly_Cookies_are_NOT_better__-_YouTube-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/5c5616d8-b06a-db53-5c00-01f1af8bd2ef.png)





[1]: https://qiita.com/github0013@github/items/e57c452de28f3918bf05#comments
Vue(Nuxt.js)でz-indexが上手く機能しない時の対処法

Vue(Nuxt.js)で、複数のコンポーネントを読み込んで、それぞれz-indexを指定していると重なりが上手く行かないことがあります。(positionプロパティをしっかりと設定していても)
その時の対処法です。

## コンポーネントを読み込む順番を変えてみる

```vue
<template>
  <div>
    <OneComponents />
    <TwoComponents />
    <ThreeComponents />
    <FourComponents />
    <FiveComponents />
  </div>
</template>
```
↓↓↓

```vue
<template>
  <div>
    <OneComponents />
    <TwoComponents />
 　 <FiveComponents />　<!--読み込む位置を変更-->
    <ThreeComponents /> 
    <FourComponents />
  </div>
</template>

```
z-indexの重なりで手前に表示させたいコンポーネントを後で読み込むことで、上手く機能しました。
html親要素より幅を小さくし中央に寄せる

サンプル用HTMLは以下です

```html
<!DOCTYPE html>
<html lang="ja">
<head>

</head>
<body>
    <header>
        <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
        <link rel="stylesheet" type="text/css" href="css/style.css">
    </header>
    
    <div id='pageTitleRow'>
        <h1 id = 'pageTitle'>リクエスト</h1>
    </div>

    <div class="requestContent">作品1</div>
    <div class="requestContent">作品2</div>
    <div class="requestContent">作品3</div>
    <div class="requestContent">作品4</div>
  </body>
</html>
```


1.中央に寄せたい要素にmax-width,margin autoで中央に寄せる

```css
.requestContent{
    max-width: 1200px;
    margin: 0 auto;

    background-color: green;
    width: 100%;
}
```

2.上位要素をflex、centerにするなんてのもあるがトリッキーか？
　(他の要素もwidthの対処したし、、）

```css

body{
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}

#pageTitle{
    width: 100%;
}

.requestContent{
    max-width: 1200px;
    background-color: green;
    width: 100%;
}
```
競プロで使うための GO 入門 ～関数～

# Index
- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力]
- [変数・定数]
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート]  
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)

# 関数定義と呼び出し

```Go:
package main

import(
    "fmt"
)

// 関数
func add(a int, b int) int {
    return a + b
}

// メイン
func main() {
    fmt.Println(add(1, 2)) // ->3
}
```

# 複数の戻り値
```Go:
// 関数
func div(a int, b int) (int, int) {
	return a / b, a % b
}

// メイン
func main() {

	fmt.Println(div(8, 3)) // ->2 2
}
```
nvidiaのGPUの温度を下げる

機械学習をやっているとGPUの温度が８４度まで上がって焦ったので、自分の行った対策のメモである。
行った機械学習は[こちら](https://github.com/AdamByerly/BMCNNwHFCs/tree/master/python)です。

自分が使っているものは`GeForce RTX 2060 SUPER`である。

[こちら](http://leopard-fishing.com/2017/09/25/post-1870/)の記事でgpuの消費電力を抑えると温度が上がりづらくなると知りました。

これで消費電力の最大を80wにしました。

```
sudo nvidia-smi -pl 80
```


このようなエラーが出ました。消費電力は80w~125wにしないといけないらしい。

```
Provided power limit 80.00 W is not a valid power limit which should be between 125.00 W and 184.00 W for GPU 00000000:08:00.0
Terminating early due to previous errors.
```

そこで最大電力を125wにした。

```
sudo nvidia-smi -pl 125
```

機械学習の学習をすると温度が75度で安定しました。
LaravelにVue.jsを導入　~環境構築編~

#LaravelでVue.jsを使うための環境構築
Laravelを学習後、Vue.jsも学んだのにどうやって一緒に使えばいいんだ。。。となったので自分の備忘として残します。
環境構築で出会ったエラーは、別記事で書こうと思っています。


####まずは、ComposerでLaravelをインストール
※ちなみに今回はMAMPを使用しています。

ターミナルでMAMPへ移動して、フォルダを作成します。
LaravelVueというフォルダを作成し、その中でプロジェクトを作成します。

```
$ cd /Application/MAMP/htdocs/
$ mkdir LaravelVue
```


####早速、Laravelをインストール
Appフォルダ内にLaravelプロジェクトを作成します。
`--prefer-dist`と書くことで圧縮版になるので、インストールが早くできます。
※Laravel6.0系を使用


```
$ compose create-project laravel/laravel App --prefer-dist "6.0.*"
```


数分でダァーーーーーーーーっとファイルがインストールされます。
インストールがうまくいっているか確認します。


```
$ ls
$ cd App
```

これで以下のフォルダが確認できると成功です！


```
app  config  readme.md  tests  artisan  database  resources  vendor
bootstrap  package.json  routes  webpack.mix.js   (以下省略)
```


Laravelがインストールできたら、動かしてみましょう。
コマンドを入力し`http://127.0.0.1:8000`をブラウザに入力しましょう！
Laravelと書かれたページが表示されましたか？
ターミナルを操作するためには、Controlキー + C を押して下さい。

```
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000
```


####Vueのスカフォールドをインストールする。
まずは、Composerをインストールします。
またまた、数分ダァーーーーーーーーっとインストール！

```
$ composer require laravel/ui --dev
```


続いてスカフォールドをインストール
またまたまたまた、数分かかります。

```
$ php artisan ui vue
$ npm install
$ npm run dev
```


これでひとまず環境構築だけは終わりました。
Dockerを使用する場合も基本同じなのか？今後やってみようと思います！
間違いがあれば、コメント頂けると助かります！
[Xcode]PUSH_NOTIFICATIONSのエラーが出てビルドできないので解決する。

# 概要
とあるSDKのiOSサンプルを実行しようとすると以下画像のように
`Your development team does not support the Push Notifications capability.`と出た。
そしてビルドができない。

<img width="712" alt="スクリーンショット 2020-07-18 8.12.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199256/32cf2749-b4a0-8bc7-9dac-f19d5a12c198.png">


# 解決
## とりあえず課金
失効していたApple Developer Programを更新した。
現在は年間税込で`12980円`である 
[Apple Developer](https://developer.apple.com/account/)

更新すると、以下のようになる。
<img width="531" alt="スクリーンショット 2020-07-17 21.18.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199256/05e0098f-64f3-cf58-9bb6-6f34934b1018.png">


## Push Notificationを有効化
1. [Apple Developer](https://developer.apple.com/account/)の[Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/certificates/list)をクリック。
2. 左側メニューのIdentifiersをクリック
3. 該当のプロジェクトを探してクリック
4. Push Notificationを有効化する(何かに同意した記憶がある)。


参考画像
![スクリーンショット 2020-07-17 21.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199256/0b499dc8-bfcd-2893-4279-8d6f19fc53c7.png)


# 解決
Projectのページに戻って再度`Signing & Capabilities`を見る。
エラーだったところが、以下になりビルドできた。
<img width="421" alt="スクリーンショット 2020-07-18 8.29.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199256/a1e032c8-9823-934b-1b04-beb6ebc8df2b.png">


Xcode 11.5

以上です。
covid-19 heat map

#概要

plunkerでcovid-19のheat map書いてみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b934a9c5-add8-5bc3-aa4b-1f21d4c2081f.png)

#成果物

https://embed.plnkr.co/plunk/DCeYYJA24FffjzVn

以上。
GitLabからgit cloneをレンタルサーバーで行った手順

参考ページ
https://raingear.jp/blog/programming/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABssh%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6wordpress%E3%82%92%E3%83%87%E3%83%97/

# GitLabにSSH公開鍵を設定する

```
cd ~/.ssh/
ssh-keygen
```

#GitLabにSSH Keys設定
先程生成したid_rsa.pub(公開鍵)の中身を貼り付ける

以上
競プロで使うための GO 入門 ～はじめに～

# Index

- [はじめに](https://qiita.com/CamouflageSix/items/ab004a1078f491bd15ef)
- [Hello World](https://qiita.com/CamouflageSix/items/05e5a0f9616e28d6fca4)
- [標準入出力](https://qiita.com/CamouflageSix/items/f53e047eda80df03548a)
- [変数・定数]
- [型変換](https://qiita.com/CamouflageSix/items/1c52bf9705a3627fa5db)
- [制御構文]
- [配列～](https://qiita.com/CamouflageSix/items/41d901b9b170d5565895)
- [ソート](https://qiita.com/CamouflageSix/items/dbc2017504571e5a65aa)
- [関数](https://qiita.com/CamouflageSix/items/afb42d399a27f5ca3cf8)
- [ASCII変換](https://qiita.com/CamouflageSix/items/283655027e6581a79b4b)
- [math パッケージ](https://qiita.com/CamouflageSix/items/bdfe5440d230d5c18458)

# この記事を書いた理由
競技プログラミングを始めるにあたって、自分のGO学習ノートとして、また競プロのチートシートとして使用するために書く。

# 方針

競プロのチートシートとして使うことを前提としているため、以下の方針で作成する。

- 記法の説明のみに注力し、プログラミングの説明は行わない。
- できる限りシンプルな例を記載する。
- 特に使用頻度の高い機能に絞り、情報量を絞る。

# 競プロでGoを選択した理由
本格的にアルゴリズムを学ぶのであればC/C++がベストな選択だが、競プロはコーディングに掛かった時間が評価されるため、少ないコード量で書ける言語を候補とした。
候補は、Go、Python、Ruby、Javaなど人気ランキング上位のものとしたが、以下の理由でGoとした。

- 速度とメモリ消費量
C++と同等の速度、Pythonより10倍、Javaより80倍速い。
競プロでは、実行速度とメモリ消費量も評価されるため、高速で低メモリ消費量のGoを選択
※ あくまで競技プログラミングでの平均であり、書き方、用途により異なる。

- 個人的理由
プロダクトの作成ではC/C++を使っているが、ツールなどを作るときは時間がかかり過ぎるため、少ないコード量で書ける言語を覚えたかった。
また、単一の言語に拘るとエンジニアとしての幅を狭めるため、複数の言語をそれなりのレベルで使えることを目標としている。
そして、Goは今後の仕事の受注として将来性がありそうと感じた。

#環境
環境構築の手間を省くため、[Paiza.IO](https://paiza.io/)を利用する。
WEB上でビルド実行でき、標準入出力が簡単に行える。
flutterのtestプログラム中で、Providerで共有しているオブジェクトの値を調べたい

## ポイント

testプログラム中では、contextは

```dart
    final context = tester.element(find.byType(Text));
```

で取得できる。

## テストの例

#### 共有するオブジェクト

```dart:example_state.dart
import 'package:flutter/foundation.dart';

class ExampleState with ChangeNotifier {
  String _data = "";

  String get data => _data;

  void setData(String data) {
    _data = data;
    notifyListeners();
  }
}
```

#### ExampleStateを読み書きするWidget

```dart:example_widget.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'example_state.dart';

class ExampleWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          onChanged: (text) {
            context.read<ExampleState>().setData(text);
          },
        ),
        Text('${context.watch<ExampleState>().data}'),
      ],
    );
  }
}
```

#### TextFieldに入力した値をExampleStateに設定するテスト

```dart:input_test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:provider/provider.dart';

import 'package:provider_test/example_state.dart';
import 'package:provider_test/example_widget.dart';

void main() {
  testWidgets('TextInput to State', (WidgetTester tester) async {

    await tester.pumpWidget(
      ChangeNotifierProvider(
        create: (_) => ExampleState(),
        child: MaterialApp(
          home: Scaffold(
            body: ExampleWidget(),
          ),
        ),
      ),
    );

    final textFieldFinder = find.byType(TextField);
    final context = tester.element(textFieldFinder);

    expect(context.read<ExampleState>().data, equals(''));

    await tester.enterText(textFieldFinder, 'Hello!');

    expect(context.read<ExampleState>().data, equals('Hello!'));
  });
}
```

#### ExampleStateの値がTextに表示されるテスト

```dart:output_test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:provider/provider.dart';

import 'package:provider_test/example_state.dart';
import 'package:provider_test/example_widget.dart';

void main() {
  testWidgets('State to Text', (WidgetTester tester) async {

    await tester.pumpWidget(
      ChangeNotifierProvider(
        create: (_) => ExampleState(),
        child: MaterialApp(
          home: Scaffold(
            body: ExampleWidget(),
          ),
        ),
      ),
    );

    final textFinder = find.byType(Text);
    final context = tester.element(textFinder);

    expect(tester.firstWidget<Text>(textFinder).data, equals(''));

    context.read<ExampleState>().setData('Bye!');
    await tester.pump();

    expect(tester.firstWidget<Text>(textFinder).data, equals('Bye!'));
  });
}
```
## リポジトリ
https://github.com/jgoamakf/qiita-ef40d87ee4d0b0c88fd5