OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelにSassを3分で導入する

わい「css直打ちとかレガシーやし<b>死んでも直接打ちたくない</b>んじゃ」

わい「いつもみたいにSassでぐるぐる回したくないんか？はよ導入じゃい！」（山形弁）

なるほどたしかに。初心者なので、一番簡単な方法でお願いします。

##Composerの設定ファイルにSassを追加する

まず、Laravelのcomposer.jsonファイルですよね。

わい「composer.jsonとは、依存するパッケージを定義するためのファイルじゃ」


![スクリーンショット 2019-11-21 15.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/88ff5b3d-19fc-5e00-31f6-93e533ce7dfa.png)


こんな記述がありますね。

```
"require-dev": {
    "filp/whoops": "~2.0",
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "~1.0",
    "phpunit/phpunit": "~6.0",
    "symfony/thanks": "^1.0"
},
```

わい「このrequire-devちゅうんは、まあ簡単に言えば`本番環境で必要のない開発環境用のパッケージを記述`しとるんやな。」

わい「この部分をこうしてや。」

```
"require-dev": {
    "filp/whoops": "~2.0",
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "~1.0",
    "phpunit/phpunit": "~6.0",
    "symfony/thanks": "^1.0",
    "panique/laravel-sass": "dev-master"
},
```

追加したのはこのパッケージだけですね。

```
"panique/laravel-sass": "dev-master"
```

##SCSSをCSSに変換する処理を追加


わい「以下のファイルの最終行に下記を追加したってや。」

```
public
   |_index.php
```

```php

SassCompiler::run("scss/", "css/");
```

なるほど、scssディレクトリのファイルをcssディレクトリにコンパイルするということはわかります。
##Sassファイルを格納するディレクトリを追加する

わい「public以下にscssディレクトリ（フォルダ）を作成してやー。」

![スクリーンショット 2019-11-21 16.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/3b2b3004-3300-a2c5-f6f0-644d2e795386.png)


##composerからSassのインストールを実行

わい「以下のコマンドを実行！！」

```
$ composer update
```

わい「これで全ての準備が整ったな。


わい「必要なパッケージもcomposer updateで入ったし、あとは簡単や。」

##SCSSファイルの作成

いくつか確認のためにscssファイル作りますか。

![スクリーンショット 2019-11-21 15.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/ae76bc9d-cd26-060b-d7be-e981cc6e6874.png)

##CSS読み込み

わい「そしたら、先回りして`コンパイルされるであろうcssの読み込み`しておこうな。」

わい「Laravelでは`secure_asset`と`asset`ちゅう二種類のpublicディレクトリまでのパスを返す`ヘルパー関数`があるやろ？」

わい「今回はローカル開発でSSHちゃうから、asset使っていくで。」

こんな感じですね。

```php

<link href="{{ asset('css/sign_up.css') }}" rel="stylesheet">
<link href="{{ asset('css/sign_in.css') }}" rel="stylesheet">
```

わい「各自読み込みたいbladeテンプレートで書いてくれな。」

わい「そしたら実際にそのページにアクセスしてみるんや。」

![スクリーンショット 2019-11-21 16.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/9d4baa1f-1336-88e9-0f7a-4f61341689e1.png)


わい「アクセスと同時にコンパイルされるから、見た目に反映されとるな？」
わい「cssディレクトリ内にcssがコンパイルされてたら成功やで！」

わい「お疲れさん😼！！」

お疲れ様でした😌
Pythonの正規表現で全角ダブルクォーテーションを扱うメモ

# 概要

* 正規表現で全角ダブルクォーテーションを扱うのにはまった
* 結論は全角のダブルクォーテーションは文字コード上<b>2つ</b>存在しているので、それぞれを指定する

# 目的

* 全角ダブルクォーテーションで囲まれた範囲の文字列を抜き出したい

```
例) 彼は “Hello World!” と言った
```

から

```
Hello World!
```
を抜き出す


# 正規表現

下記を参考に構築

[正規表現：括弧の中身だけをマッチする表現](http://www-creators.com/archives/5462)

``` python
re.search(r"(?<=\“).*?(?=\”)", sentence)
```

# 留意
当初pythonの全角半角変換パッケージである```jaconv```を使って半角のダブルクォーテーションに統一しようとしたが、それはうまくいかなかった

jaconv.normalizeは以下のように全角ダブルクォーテーションを取り扱うためである

```
'”'=> '"'
'“' => '``'
```
[jaconv 0.2.4 -PyPI](https://pypi.org/project/jaconv/)

# まとめ
ダブルクォーテーションは見た目に全角か半角か、またどちらの文字コードのなのか分かりづらいので気を付けましょう。

<b>全角ダブルクォーテーションは悪い文明!</b>

# 参考
* [Shift_JIS 文字コード表](https://www.seiai.ed.jp/sys/text/java/shiftjis_table.html)
accessのvbaでテーブルのデータを扱う際のメモ

accessのvbaで特定ﾃｰﾌﾞﾙの参照の方法

基本は、DAOオブジェクトを準備して、レコード内容を取扱う。

オブジェクト XXX を作成。

```vb
Dim XXX As DAO.Recordset
```

テーブル　T_XXX　の内容をオブジェクト XXX へｾｯﾄ。

```vb
Set XXX = CurrentDb.OpenRecordset("T_XXX", dbOpenTable)　 
```

※そもそもテーブル T_XXX で特定年度を指定するなどの処置を
  しておきたい場合は、SQL操作を記述し、それを引数とする。（下記例）

```vb
SQL = "SELECT * FROM T_XXX"
SQL = SQL & " WHERE 年度 = '2019'"
SQL = SQL & " ORDER BY 年度, 性別, 識別番号;"

Set XXX = CurrentDb.OpenRecordset(SQL)
```

予めレコードセットオブジェクト XXX が空（レコードなし）か
どうか記録する変数を準備し、

```vb
Dim XXX空判定 As Boolean
```

（対象のテーブルにPrimaryKeyを設定しているとき）
テーブル内容を主キーで並び替え（＝index）してやる。

```vb
　XXX.Index = "PrimaryKey"
```

※上記ＳＱＬによって予め目的の並びに整える場合は、不要。


EOF（EndOfFileプロパティ）を用い、
レコードセットオブジェクト XXX が最初期の段階で
「カレント レコードの位置が
Recordset オブジェクトの最後のレコードより後にあるかどうか」
を取得することで、そもそも XXX はレコードを含むのか否か＝空の判定　を判断する。
空でないのなら、MoveFirstによって、レコードの現在位置（ポインター）を
オブジェクトの一番初めのレコード位置　にセットしておく。

```vb
If XXX.EOF Then
        XXX空判定 = True
    Else
        XXX空判定 = False
        XXX.MoveFirst
    End If
```

対象テーブルの現在参照中レコードが持つ項目値を取得利用するには

```vb
XXX!目的の項目名
```

でＯＫ。

※Recordset.MoveFirst メソッド (DAO)　について
　　https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/recordset-movefirst-method-dao
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　

そもそも1つのレコードしか保持していないようなテーブルが
参照先（システムの設定値など）の場合は、

```vb
DFirst("出力設定１", "T_基本設定")
```

などとすれば、上記のような手順を記述せずとも、
対象テーブルの値を取得することが可能である。

以上
GitHubの草をiPhoneの通知センターでも確認できるようにしてみた

[GitHubの草をMacのメニューバーで確認できるようにしてみた](https://qiita.com/Kyome/items/39fcd379e3ee98eb0d3c)ところ、意外と反響があったので、懲りずに今度はiPhoneの通知センターでもGitHubの草を確認できるようにしてみました。

こんな感じ．
![gitgrass_ios.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/9c84721c-f097-28b1-7c11-0ddac51ac2ab.png)

前記事に載せたものと同じレポジトリにソースコードあげてます．→[GitGrass](https://github.com/Kyome22/GitGrass)

# 実装面
基本的にはメニューバーの`NSStatusBarButton`から`Today Extension`に描画対象を変えただけです。
草の表示方法の細かい変更点としては、`NSStatusBarButton`には諸々理由があってその場で生成した画像を表示しているのですが、今回はカスタムビューを使って`UIBezerPath`で直接描いています。

実装上難しいことは何もなかったのですが、XcodeでRunするTargetを収容アプリの方にしたままToday Extensionのデバッグをしていて、標準出力やエラーコードが何も表示されずに数十分立ち往生していました。トホホ。あと、Asset Catalogを用いる場合はExtensionの方にもtargetのチェックが入っているかを確認しましょう。

# 参考文献
- [Today Extensionについて](https://qiita.com/CatDust/items/cef89380c001529fc267)
- [Widgets(Today Extension)のまとめ](https://qiita.com/shoheiyokoyama/items/16593eb170860acd7344)
- [【swift3】userDefautlsを使ってwidgetとアプリ間のデータの受け渡しの方法](http://ghosthug.hatenablog.com/entry/2017/03/11/195328)
BacklogAPIを用いたデータの取得メモ

BacklogにはAPIが用意されているが、
https://developer.nulab.com/ja/docs/backlog/#backlog-api-%E3%81%A8%E3%81%AF

何でもできる、ってのはわかるのだが、ちょっとしたツールを暇だったので作ってみた。その際にDataFrameを用いたデータ取得を使ったのだが、あまりDataFrameに慣れていなかったので、若干試行錯誤した。

https://developer.nulab.com/ja/docs/backlog/api/2/get-issue/#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%9C%E3%83%87%E3%82%A3

	r = requests.get(url, params=params, proxies=proxy_dict)
	if r.status_code == requests.codes.ok:
		data = r.json()

としたときに、どのようにデータを取るかについて、慣れれば簡単なのだが、私はPython初心者なのでメモ。

    "projectId": 1, 
を取りたければ、`data["projectId"]`

    "status": { 
        "id": 1,
を取りたいのであれば、`data["status"]["id"]`

stars配下の

    "url": "https://xx.backlog.jp/view/BLG-1",

を取りたいのであれば、`data["stars"][0]["url"]`
Golang - How to Get Private Repository Module

# 410 Gone Problem

```
$ go get -u gitlab.com/johnny/logger

go: finding gitlab.com/johnny/logger latest

go: downloading gitlab.com/johnny/logger v0.0.0-20190921175342-61a76c096369

verifying gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369

reading https://sum.golang.org/lookup/gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369: 410 Gone
```

# Solution

```
$ go env -w GOPRIVATE=gitlab.com/johnny
```

https://medium.com/mabar/today-i-learned-fix-go-get-private-repository-return-error-reading-sum-golang-org-lookup-93058a058dd8

https://stackoverflow.com/questions/58305567/how-to-set-goprivate-environment-variable

https://golang.org/doc/go1.13#modules
GoogleMapsAPI v3でマーカーにSVGのパスを指定するとクソ重い件

StackOverFlowのこの記事が参考になりました。
[Optimizing SVG markers in Google Maps](https://stackoverflow.com/questions/21780466/optimizing-svg-markers-in-google-maps)

~~但し記事の通りだとIE11では不具合が出るのでBase64に変換するとよいです。~~
↑関係ありませんでした。こちらを参考にしました。

[SVG data URI in IMG tag isn't showing on IE11](https://stackoverflow.com/questions/53151796/svg-data-uri-in-img-tag-isnt-showing-on-ie11)

(追記:2019/12/19)
こちらの記事が原因を大変詳しく解説されています。参考になります。
[Google Maps でマーカーが多いと重くなるときの対処方法](http://var.blog.jp/archives/80104525.html)


## 解決方法

### Before
```js
const houseIcon = 'M19,9.3V4h-3v2.6L12,3L2,12h3v8h5v-6h4v6h5v-8h3L19,9.3z M10,10c0-1.1,0.9-2,2-2s2,0.9,2,2H10z'

const marker = new google.maps.Marker({
    map: map,
    position: new google.maps.LatLng(0, 0),
    icon: {
        fillColor: '#FFFFFF',
        path: houseIcon,
    },
})
```

### After
```js
const houseIcon = 'M19,9.3V4h-3v2.6L12,3L2,12h3v8h5v-6h4v6h5v-8h3L19,9.3z M10,10c0-1.1,0.9-2,2-2s2,0.9,2,2H10z'

const svgToBase64DataURL = (size, color, path) => {
        const svg = `<svg width="${size}px" height="${size}px" viewBox="0 0 ${size} ${size}" xmlns="http://www.w3.org/2000/svg" version="1.1"><path d="${path}" fill="${color}"/></svg>`
        return {url: `data:image/svg+xml,${encodeURIComponent(svg)}`, scaledSize: new google.maps.Size(size, size)}
}

const marker = new google.maps.Marker({
    map: map,
    optimized: false,
    position: new google.maps.LatLng(0, 0),
    icon: svgToBase64DataURL(22, '#F00', houseIcon)
})
```

Data URLとして渡してあげればよい。

## まとめ

パスを直接指定すると500個くらいでカクカクになりますが、DataURLで渡すと1万件でも大丈夫そうです。
VCRのmatch_requests_onを変更する

# 背景

[VCR](https://github.com/vcr/vcr)というHTTPリクエストをモックするGemがあります。Rubyのテストコードで使います。

VCRでは設定ファイルに、HTTPリクエストとそれに対応するレスポンスの組合せを記述し、モックを作成します。VCRを有効にしてテストコードを実行すると、VCRは、次のように動きます

1. テスト実行中に送信されるHTTPリクエストを監視します
2. HTTPリクエストの送信を見つけると、設定ファイル内のHTTPメソッドとURIが一致する、HTTPリクエストを探します
3. HTTPリクエストが見つかれば、そこに記述されたHTTPレスポンスを返します。

また、設定ファイル中に一致するHTTPリクエストが見つからなかった場合は例外を上げます。
意図していないHTTPリクエストを送信したことが検出できます。

他のWeb APIに依存したRubyアプリケーションを開発するときに重宝します。

# 問題
デフォルトのHTTPリクエストの一致条件は、HTTPリクエストのメソッド名とURI文字列です。

GETリクエストの場合、メソッドとURIで一致を判定すれば、十分です。
POSTリクエストの場合、一致条件に「HTTPリクエスト Bodyの内容」を追加したいことがあります。

Bodyを一致条件に追加すれば、POSTリクエストの送信内容が期待通りの情報が入っているかどうか確認できます。
ソースコード修正時に、意図せずに送信するHTTPリクエストのBody変更しても、テストで検出できるようになります。

# 方法

[Request matching - Cassettes - Vcr - VCR - Relish](https://relishapp.com/vcr/vcr/v/1-6-0/docs/cassettes/request-matching) によれば
> You can customize how VCR matches requests using the :match_requests_on option.

翻訳すると

> ：match_requests_onオプションを使用して、VCRがリクエストを照合する方法をカスタマイズできます。

## use_cassette メソッドの引数で指定

https://relishapp.com/vcr/vcr/v/5-0-0/docs/request-matching/matching-on-body に次の例があります。

```rb
VCR.use_cassette('example', :match_requests_on => [:body]) do
  puts "Response for body2: " + response_body_for(:put, "http://example.com/", "body2")
end
```

VCRでは`use_cassette`メソッドで、テスト時に使用する設定ファイルを指定します。
同時に、 引数`:match_requests_on`でリクエストの一致条件を指定できます。

## グローバルに設定する方法

https://relishapp.com/vcr/vcr/v/5-0-0/docs/configuration/default-cassette-options

```rb
  VCR.configure do |config|
    config.default_cassette_options = {:record=>:once, :match_requests_on=>[:method, :uri, :body], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
  end
```

が参考になります。
一度この設定をすれば、それ以降のすべての`VCR.use_cassette`では、設定したリクエスト一致条件が
使われます。

## パラメーター

```rb
config.default_cassette_options = { match_requests_on: [:body] }
```

と、指定すると、一致条件からメソッドとURIはなくなり、ボディだけになります。
メソッドとURIを残したい場合は次のように指定します。

```rb
config.default_cassette_options = { match_requests_on: [:method, :uri, :body] }
```


# 参考文献
- [VCRでWeb APIのモックを楽しよう！ - アクトインディ開発者ブログ](https://tech.actindi.net/2019/06/07/093705)
- [VCRを使うとRSpecのWebmockの作成が超絶楽になった！ | 酒と涙とRubyとRailsと](https://morizyun.github.io/blog/webmock-vcr-gem-rails/)
API作成で役に立った記事まとめ

- 記事を書いた動機
  - APIを使用しないWebアプリケーションを開発していた会社から、バックエンドとフロントエンドで使用しているフレームワークが違っている会社に転職した際に、自分に基礎知識が無さ過ぎるせいでコードレビューで何度も返って来てレビュワーに申し訳ない気持ちになった為

----

- 仕様書の書き方
  - [［API］ API仕様書の書き方](https://qiita.com/sunstripe2011/items/9230396febfab2eae2c2)
  
- GETにするかPOSTにするか
  - [GETとPOSTの違いについて](https://qiita.com/kanataxa/items/522efb74421255f0e0a1)
- axiosの使い方
  - [axiosのパラメータ指定方法まとめ](https://qiita.com/taroc/items/f22f7dd5d6d5443c72a4)

- 色々網羅的に書かれた記事
  - [翻訳: WebAPI 設計のベストプラクティス](https://qiita.com/mserizawa/items/b833e407d89abd21ee72)
UnityからAndroidビルドまで(2019.11)

## 前置き
UnityでAndroidにアプリをビルドする必要があったので、
いろいろ調べながらやりました。

## 環境
・Unity2018.3.14f1
・Android Build Supportはなし
・Unity Hub 2.1.3

##必要なもの
・Android Build Support
・Android SDK,JDK,NDK

##Android Build Support
まずこれが必要。
Unityをインストールするときにチェックを入れていればインストールされている。

確認方法はFile>Build Settings>Platform>Androidでこのような画面が出ればOK。
ない場合はNo Android module loaded.と表示され
Open Download Pageというボタンが表示されているはず。

Unity HubでUnityをインストールした人は
インストール>「︙」>モジュールを加える>
Android Build Supportにチェックを入れる>実行
でインストールできる。


## Android SDK,JDK,NDK

SDK,JDK,NDKを設定する画面は
UnityのEdit>Preferences>External Tools>Android で確認できる。
Android Build Supportがインストールされていないと、ここに設定画面が表示されない。

《SDK》
SDKのDownloadボタンから開いたページで
「Android Studio」をダウンロードしてインストール。
Android StudioのConfigure>SDK Manager>Android SDK Locationに表示されている
パスをコピーして、Unityの方のSDKのボックスにペースト。

《JDK》
Use embedded JDKというチェックがあるので、もしかしたらそれをチェックすれば
ダウンロード不要かも。
今回は下記のサイト[1],[3]を参考にしたので
Java Development Kit(jdk-8u-231)をダウンロード・インストールした。
自分でインストールした場合は同じようにインストールした場所のパスをコピペする。

《NDK》
必須ではないが「IL2CPP」を利用するためには必要らしい。[2]
NDKのボックスの横のDownloadを押すとzipファイルがダウンロードされる。
サイズが大きいので解凍には結構時間がかかる。
同様に解凍したフォルダの場所のパスをコピペする。


ここまで出来たら
File>Build Settings>Platform>Androidで「Switch Platform」を押す。
「Player Settings」を押すとInspectorで設定ができる。
Other SettingsのPackage Nameでプロジェクト名を変更したり、
Scripting BackendをIL2CPPに変更したりする。
（下記のサイトを参考にそのまま変更しました）

ここまで出来たらBuildで好きな名前を付けて保存。


## 困ったこと

・最近(2019.04.16)変更があったようでJava Development Kitのダウンロードには
　Oracleのアカウントが必要になったらしい。[4]
　もしUse embedded JDKで出来るなら、JDKをダウンロード・インストールする必要はないのかも。


・Android Build Supportを追加したのにPlatformに「No Android module loaded」と表示されることがあった。原因は不明。Unity Hubから一度アンインストールしてAndroid Build Supportと一緒にインストールしたり、Unityの別のバージョンをインストールしたりすると解決した。同じような症状で困っている人がいたら試してもいいかもしれない。



## 参考にさせていただいたサイト
[1]UnityからAndroid実機ビルド手順(2017.08版)
https://qiita.com/relzx/items/7f8e7817c9edd11c5023
[2]Unity開発するにあたって知っておきたいコンパイラのすゝめ(Part2～IL2CPP編～)
https://qiita.com/4_mio_11/items/d5d7b4e879a8341595cd
[3]Unity2018インストールからAndroidビルドするまでの手順
https://qiita.com/taroyan/items/2ff7f6aadd640221bde5
[4]学生のためのJDK8インストーラーのダウンロード
https://qiita.com/Ninjaky/items/becaa5623eb7607210b4
タスク機能を使って休みの申請をするロボットつくってみた

# 概要
UiPathに新たに増えたタスク機能とOrchestratorのアプリを使って、遊んでみました。
[GitHubにファイルをあげました](https://github.com/odm-cckte0122/UiPath_TaskForm)

# タスク機能(Human In The Loop)って？
簡単に言うと、ロボットの処理に人による確認、承認のステップを組み込む機能です。
UiPathのシナリオ内でフォームを作成し、作成したフォームをOrchestratorへ「タスク」としてぶん投げます。
ユーザーはそのタスクを確認し、承認したり場合によっては内容の修正をしたり拒否することで、ロボットの動作に介入できるそう。
[参考(公式サイト)：UiPath Apps](https://www.uipath.com/ja/product/rpa-management-apps)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/47629d13-4395-69e9-654a-698b0668949e.png)

# どんなことに使えるのか
  デモや概要を見る限り、こんな処理に使うといいのかな～と思いました

- 承認権限が必要な処理  
  →ロボットに承認処理をさせると、予期せぬ動作をしたときの責任の所在が曖昧になるため
- 精度が100%ではない処理  
  →OCRの読み取りなど、たまに誤字の可能性がある処理は最終的に人間の目によるチェックが必要になるのかなぁと

# とある日のこと…
朝起きたらなんだかお腹が痛かったごじゃむーさん。
仕事をお休みできないか、上司にネゴることにしました。

スマホからOrchestratorを開き、ジョブの画面からロボットを実行します。
引数に「自分の名前」「休む理由」を記載し、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/bdbabe0f-d7a9-bc65-9fb7-0548c0a0dc1d.png)

すると、上司のスマホにこんな通知が…通知をタップしてみると、ごじゃむーさんの実行したタスクの割り当て通知が来たようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/311c2fee-92fd-d2bd-d00d-a9fe4140518e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/08299b2e-e02b-9f09-98e1-c5a75fbbb6a6.png)


「まぁ、お腹が痛いのなら仕方ないか…」そう思った優しい上司は「許可」ボタンを押してタスクを完了しました。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/a1132f01-1bd8-79f0-a1ff-bcf135b5521a.png)


すると、ごじゃむーさんのグループメンバー宛に一通のメールが！
どうやらごじゃむーがお休みする旨の連絡をロボットが実行してくれたようです。めでたしめでたし♪  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/fe7f5087-8e92-1be1-a4c0-aefe23349f08.png)



## 番外編
また別の日の朝、なんだかサボりたくなったごじゃむーさん。
同じロボットを使って上司にネゴりました。

嘘がつけないごじゃむーさん。休む理由は素直に書きます。

通知に気づきタスクを確認した上司さん。休む理由に激おこです！
承認者コメントにコメントを記載し、今日は「拒否」ボタンを押してタスクを完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/8b9fdffc-0c5b-ae83-3fca-82dc0d142a53.png)

すると、ごじゃむーさんのもとに一通のメールが…  
そこにはお休み申請失敗の連絡が…  休暇チャレンジ失敗です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/feed9fe0-67f8-4d21-606f-cbc1c1575242.png)

#触ってみた感想
思っている以上に簡単にフォームが作成でき、スマホアプリを使用すればロボットに詳しくない人でも簡単にタスクの処理ができるので、使い方によってはかなり万能な機能になりそうだなぁと思いました。
ただし、タスクをユーザーに割り当てる、タスクを処理したユーザーを把握する方法など、もう少しこういう機能があると嬉しいという部分が見えたので、今後の動向を注視していきたいと思います:sunny:

#最後に
このロボットを作るにあたり、タスク機能のほかにもいろんな機能や設定を使用しています。
興味がある方は、ぜひGitHubやアプリストアからダウンロードして遊んでみてください。

- UiPath Orchestratorアプリ  
→スマホからジョブの実行や監視、タスクの確認や処理が可能  
　[iOS版](https://apps.apple.com/jp/app/uipath-orchestrator/id1448283884)  
　[Android版](https://play.google.com/store/apps/details?id=com.uipath.orchestrator&hl=ja)
- Orchestrator API  
→タスクフォームの作成後、APIを使用してタスクの割り当てユーザーを指定することが可能  
　 (逆に言うとAPIを使用しないと自動割り当てできない)  
　https://platform.uipath.com/[AccountLogicalName]/[ServerName]/swagger/  
　で使用できるAPIの命令が確認できます(UiPath Robotに設定するOrchestrator URLに"/swagger/"をつける)
- ロボットの権限設定  
→APIを用いて各種処理を行う場合、その処理を行うための権限設定が必要
【Python3 / ElementTree】 XPath形式で上手くアクセスできない時はXMLの階層をよく確認しましょう…(自戒)

~~ネット上のチュートリアルを調べてもなんとも上手くいかなかったので備忘として投稿します。~~
【2019/11/22追記】
お恥ずかしい限りなのですが、本件は私の勘違いが原因だったようで最初に提示していた問題はそもそも起こらないものでした。。。
自戒の意味も合わせて「.//」周りの挙動は多少参考にもなると思われるため、記事は残します。

# 事の起こり
python3でXML(文字コードはEUC-JP)を扱う機会があり、その対応をしていたところ

```xml:test.xml(本来扱っていたファイルはタグ数もこれより多く、属性値等も多数ある状況でした)
<root><tag>
    <hoge>
        <hogehoge>aaa</hogehoge>
    </hoge>
    <fuga>bbb</fuga>
    <fugo>ccc</fugo>
　・
（中略）
　・
</tag>
<tag2>
　・
（中略）
　・
</tag2>
</root>
```
要素へのアクセス方法としては下記が挙げられますが

```python:test.py
import xml.etree.ElementTree as Et


def test():
    # ElementTree.parse()はunicodeにしか対応していないそうなので
    # 一旦ファイルをopenしてreadから文字列を取得している
    with open(r'HogePath/FugaPath/test.xml', 'r', encoding='euc_jp') as f:
        root: Et.Element = Et.fromstring(f.read())

    # hogehogeのテキスト「aaa」を取得する場合
    print(root[0][0][0].text)


if __name__=='__main__':
    test()
```
XMLが複雑になってくるとXPathで取りたくなってきたので、ネットの情報を参考に

```python:そもそも間違っていたことにやっと気が付きました(自戒)
    print(root.findall('./hoge/hogehoge')[0].text)
```
と書いてみたものの上手く動かず「IndexError: list index out of range」が出ました。
そもそも下記の結果自体が空になっている…~~つまりは正しく取れていない模様。~~**←ここが間違い！！**

```python
    print(root.findall('./hoge/hogehoge'))
```

**<font color="Red">例ではあまりにもシンプルで分かりやすい状況ですが、このとき私は「tag」を見落としていたんです。。。</font>
下記はこの見落としをした状態で半ば無理矢理に解決した方法になります。**

# (誤った)解決(自体は一応できる)方法
XPathのルート周りの指定方法に問題があったようで

```python
    print(root.findall('.//hoge/hogehoge')[0].text)
```
のように頭の部分を「.//」とすれば解決しました。**←無理矢理に解決したような状態です**
URL等と同じだと覚えればいいのかな…こうなる原理までは辿っていないので~~どなたかご教示頂けますと嬉しいです。~~

【2019/11/22更新】
コメントにて@LOZTPX様にご教示頂いた内容によると
> //は起点となるノードの子孫すべての集合を表し、ノードパスを省略するものです。

なるほど！ だから上記の見落としていた状態でも「tag」を意識しないうちに拾えていたんですね…これは勉強になりました。

# 反省
扱うXMLファイルの中身はちゃんと見よう()
branchを切ってからmergeするまで

#branchを切ってmergeするにはどうしたらよいか？

##そもそもbranchを切るのはなぜか？
branchを切ると、masterブランチになんの影響も及ぼさずに開発を進めることができるから

もしうまくいったらmasterブランチにmergeをすることで、切ったブランチとmasterブランチを統合することができ、masterブランチにも切ったブランチで変更した内容が反映される

##branchの切り方
現在、masterブランチの一本のみ存在している状態の場合、このようになります

```
$ git branch
* master
```

git branchコマンドを入力すると、現在存在しているローカルブランチを表示させることができます。上の例で、masterと書いてある左に「＊」マークがついてますが、これが現在作業しているブランチになります。

次に、branchを切るには

```
$ git branch 新しいブランチ名
```

と入力することでできます。

例えばdevelopブランチを切るには、

```
$ git branch develop
```

と入力することで、developブランチを作成することができます
実際にgit branchで現在存在するブランチを確認してみると、

```
$ git branch
* master
  develop
```

という感じで表示されているかと思います

作業するブランチを変更するには、

```
$ git checkout develop
$ git branch
  master
* develop
```

というように、「git checkout 移動したいブランチ名」と入力すればできます。＊の位置がmasterからdevelopに移っていることが確認できます。

ローカルではgit branchで確認した時に、masterとdevelopの２つのブランチが存在することが確認できました。しかし、リモートでブランチは、masterのみしか表示されていないことが分かります。ローカルと同じようにdevelopも表示させるには、developにpushする必要があります

```
$ git push origin develop
```

これを実行した後に、リモートのブランチを確認するとmasterとdevelopが存在していることが分かるかと思います。

##pull requestとmergeの方法
pull requestを出すことによって、レビュワーに「mergeしてください」とリクエストすることができます。レビュワーはcommitした内容が正しければmergeし、間違っていればmergeしない、ということをすることで安全に開発を進めることができます。

###GitHubでpull requestを出すには
Pull requestsを押すと、緑色の「New pull request」と書いてあるボタンがあります。これを押して、mergeするbranchを選択し、説明にそって入力していくとpull requestを出すことができます

###GitHubでmergeするには
pull requestが出された後、Pull requestsの欄に「Merge pull request」という緑色のボタンが存在しているかと思います。これを押すことで、mergeすることができます
Rails model作成

#Model 作成メモ

### 開発環境
- pc:macOS Catalina 10.5.1
- ruby:2.6.3
- rails:6.0.1

### migarat fileの作成

**コマンド**
`rails g model モデル名（単数形） カラム名1：データ型 カラム名2：データ型2.....`

**migrate fileの確認**
Path:`root/db/migrate/...`

```ruby
class CreateBoards < ActiveRecord::Migration[6.0]
  def change
    create_table :boards do |t|  
      t.string :name
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
```

### migrate fileの実行
**コマンド**
`rails db:migrate`

### migrate fileのキャンセル（roll back）
**コマンド**
`rails db:rollback`
migrateの実行前の状態に戻る。

**もう一度**`rails db:migrate` **を実行すると再度レコードの作成が実行される。**
new interface

接口可以通过直接new来实例化？先说结论：

接口、抽象类，不可以被new！
接口、抽象类可以理解成是模糊不定的东西，要使用它的特质必须要实例化，实例化不能直接通过new，而是通过实现接口方法、继承抽象类等。
上面的代码，与Object A = new Object(); 不同，因为还忽略了一个重要的地方：大括号！！！

new__接口__大括号{ 。。。};

后面加花括号这种写法，实际是new了一个实现接口的匿名类，开发人员需要在匿名类内部（花括号内）实现你那个接口。
SwiftUIでNavigationViewの背景をColorで設定したい

#困った点
swiftUIでNavigationViewの背景色を変えたいと思って
.backgroundとかでいじってみても反応してくれなくて、ボエェェってなったので解決方法を書いておきます


#解決方法
**NavigationView内でZStackを使う**
これで解決できました。

イメージとしては
ZStackを使って
・カラーレイヤー
・UIパーツレイヤー
を重ねてやればいいっぽい。

まだNavigationViewのAPIが完成していないっていうことなのか、仕様なのか?

ちなみにUIColorでは無く、Colorで色を指定しているので注意

```swift

import SwiftUI

struct Welcome_view: View {
    var body: some View {
        NavigationView {
            ZStack {
                self.backGroundColor().edgesIgnoringSafeArea(.all)
                VStack (spacing: 80){
                    Text("welcome to pomboo!")
                        .font(.title)
                        .foregroundColor(Color.white)

                    VStack (spacing: 10) {
                        NavigationLink(destination: Login_view()) {
                            Text("Login")
                                .font(.headline)
                            .frame(width: 200.0, height: 50)
                            .background(/*@START_MENU_TOKEN@*/Color.white/*@END_MENU_TOKEN@*/)
                            .cornerRadius(20.0)
                            .shadow(radius: 20)
                        }

                        Text("or")
                            .foregroundColor(Color.white)
                        
                        NavigationLink(destination: SignUp_view()) {
                            Text("Sign Up")
                                .font(.headline)
                                .foregroundColor(Color.white)
                            .frame(width: 200.0, height: 50)
                            .cornerRadius(20.0)
                            .overlay(
                                RoundedRectangle(cornerRadius: 20)
                                    .stroke(Color.white, lineWidth: 2)
                            )
                        }
                    }
                }
            }
        }
    }
    
    private func backGroundColor() -> LinearGradient {
        let start = UnitPoint.init(x: 0.0, y: 0.0)
        let end = UnitPoint.init(x: 1.0, y: 1.0)

        // convert UIColor to Color
        let colors = Gradient(colors: [Color.blue, Color(UIColor.blue)])
        let gradientColor = LinearGradient(gradient: colors, startPoint: start, endPoint: end)

        return gradientColor
    }
}

struct Welcome_view_Previews: PreviewProvider {
    static var previews: some View {
        Welcome_view()
    }
}

```


#感想
swiftUIとっても便利なんですけど
どうもネストが深くなりがちで。。。

なんか良い方法無いかな？
NuxtのプロジェクトにLogRocketを追加してすぐに幸せになる方法 

# TL;DR

LogRocketのアカウントを作成して、数行足せばフロントのログ管理がすごい楽になる。

※このお話はゆめみ様の[Yumemi.vue #3](https://yumemi.connpass.com/event/153347/)のLTで話した内容です。

---

# 自己紹介

- いーふとイチオカ(@redshoga)
- Vue, Nuxt使って1年ぐらい
- Nuxt.js, Nest.js使って仕事してます
- `npx redshoga`叩くと自己紹介カードがでます

--- 

# LogRocketとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/ad76bfa6-06f9-b175-69b8-c7021eed6623.png)

数行コードを足せば、ユーザー行動を動画で記録できるようになるSaaS

---

# サンプル

ユーザー一覧画面

<img width="944" alt="Screen Shot 2019-11-21 at 17.01.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/56158be0-4a3e-c71c-819b-6adbc833c17a.png">

ユーザーの行動の画面

<img width="905" alt="Screen Shot 2019-11-21 at 17.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/f824fc22-ea65-1cb3-a28b-da2ef2480616.png">

---

# 導入方法

以下の設定まんま

- [nuxt-community/nuxt-logrocket: LogRocket module for Nuxt.js](https://github.com/nuxt-community/nuxt-logrocket)


```bash
npm install nuxt-logrocket --save
```

```nuxt.config.js
{
  modules: [
    'nuxt-logrocket',
  ],

  logRocket: {
    logRocketId: 'YOUR_LOGROKCET_ID', // LogRocketのページから取れるID
    devModeAllowed: false, // 開発モードでも取得するか
  }
}
```

これだけでログが取れるようになります。（Vuexのログもとってくれます）

---

# その他TIPS

`this.$logRocket`でLogRocketのモジュールにアクセスできるようになります。

これでいろいろ設定できます。

例えば以下のようにするとLogRocketのユーザ一覧に**名前**が表示されるようになります。

```javascript
...

loggedInHandler((userInfo) => {
  this.$logRocket.identify(userInfo.name)
})
```

---

# 注意(?)

`nuxt-logrocket`が依存している`logrocket-vuex`で、以下の報告がされています。

詳しくは見ていないので要検討

<img width="770" alt="Screen Shot 2019-11-21 at 17.06.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/86a8635d-4afa-276c-adcf-f1dab84dad11.png">

---

# 参考

- [nuxt-community/nuxt-logrocket: LogRocket module for Nuxt.js](https://github.com/nuxt-community/nuxt-logrocket)
treeコマンドで除外する条件を複数指定したい

事前に、

```
brew install tree
```

でtreeコマンドをインストールしておく必要があります。(macにはtreeコマンドはインストールされていないので)



# コマンド

```
tree -I "*.html|*.png|*.jpg"
```

こういった形で、

```
"条件式|条件式|条件式"
```

という形でパイプでつないであげるといけます。

幸せいっぱいですね。
他クラスの関数ってどうやって使う？？namespaceとは？インスタンス化とは？virtualとは？mapboxで実践しながらまとめます【Unity】【C#】【mapbox】

#はじめに
テクロスというゲーム会社で学生バイトとしてゲームを作ってる駆け出しプログラマーです。現在[mapbox](https://www.mapbox.com/)を用いたゲームの製作を行なっています。
mapboxはいいぞって話は他の人に任せます。
この記事は多分初心者向けです。ここでつまずかない人は中級以上や、、

#問題発生
[Unity で地図が表示可能な mapbox を触ってみた（初級編）](http://korechipostit.hatenablog.com/entry/2019/05/21/174900)等を見ながら設定すれば容易くmapを表示させることができました。
![スクリーンショット 2019-11-21 15.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290141/70929b2d-dfb1-03bb-5095-4dd6ee2d4029.png)
でもこれスクリプトからどうやって動かすんだ？？って思って調べてたらインスタンス化やvirtualについてよく分かっておらずつまずきまくったのでまとめておきます。

#状況確認
上の画像に載ってるように、どうやらAbstractMapというscriptでマップ表示を制御してるみたい。なのでまずはそれを見てみます。

```c#:AbstractMap.cs
using Mapbox.Platform.Cache;
...

namespace Mapbox.Unity.Map
{
	using hogehoge;

	public class AbstractMap : MonoBehaviour, IMap
	{
		hogehoge...
        public virtual void UpdateMap(Vector2d latLon, float zoom)
		{
           hogehoge...
```

長かったので要点だけまとめて抜粋しました。名前的にUpdateMap関数ってのを呼び出せばマップ表示いじれそう！(単純)(でも分かりやすい命名ほんと助かる)

#namespaceとは
さっきのコードでクラスの前にnamespace Mapbox.Unity.Mapってなってますね。これはなんなのか。
簡単に言うとフォルダとしてまとめてるってだけです。
**上のコードのUpdateMap関数を使いたい！**ってときは
**Mapbox.Unity.Mapフォルダの中にある、AbstractMapフォルダの中にあるUpdateMap関数を使いたい！**
と指定しないといけません。

namespace内のclassを呼び出すのは簡単です。

```C#
public class hogehoge: MonoBehaviour{
    Mapbox.Unity.Map.AbstractMap
}
```

みたいにピリオドで繋いでやればいいだけですね。毎回Mapbox.Unity.Map.AbstractMapって打つのが鬱になる人は

```C#
using Mapbox.Unity.Map

public class hogehoge: MonoBehaviour{
    AbstractMap
}
```

usingで宣言しちゃえばいいです。簡単ですよね。
今度はAbstractMapからUpdateMapを呼び出したいですね。でもクラスから呼び出すのはまたちょっと違います。インスタンス化というのをしてやる必要があります。

#インスタンス化
インスタンス化というのは簡単にいうと、クラスという抽象的なものから具体的なものを生成するってことです。
この辺はオブジェクト指向の話なんですが、勉強したい人は[ドラゴンボールで学ぶオブジェクト指向　改](https://ryoasai.hatenadiary.org/entry/20110317/1300380540)とか面白くてよかったですよ。

まあそんなの知らなくても動かせます。具体的には

```C#
AbstractMap abstractMap = GameObject.Find("Map").GetComponent<AbstractMap>();
```

と書くとインスタンス化できちゃいます。これは簡単にいうと**AbstractMapクラス**の**abstractMapインスタンス**を生成しますってコードですね。これで！

```C#
abstractMap.Update(latLon: latLon, zoom: zoom);
```

って感じでクラス内の関数を利用することができます！

#まとめ
以上まとめて、スクリプトからmapboxの"Latitude Longitude"をいじりたいときは以下のように書けばオッケーです。

```C#:GameManager.cs
using Mapbox.Unity.Map;
using Mapbox.Utils;

public class GameManager : MonoBehaviour{

 //初期位置とzoomレベル
 Vector2d latLon = new Vector2d(37.784179f, -122.401583f);
 float zoom = 15.0f;
 
 void Start(){
  Map_Setup();
 }
 
 public void Map_Setup(){
  AbstractMap abstractMap = GameObject.Find("Map").GetComponent<AbstractMap>();
  abstractMap.UpdateMap(latLon, zoom);
 }
}
```

ちょっとした罠なんですが、UpdateMapの引数はVector2じゃなくてVector2dです。これを使うためには二行目のusingが必要です。僕はこれに30秒くらいハマりました。

#そういえばvirtualとは
実はpublic virtual void UpdateMap()ってなってたの気付いてましたか。これが付いてればoverrideといって、その関数の定義を書き直すことができるんです。興味あったら調べてみてくだしあ。

#おわりに
mapboxのマップ表示ってスクリプトからどうやっていじれるんだろうと思って調べてみたので記事書いてみたんですが、なんか主旨がずれた記事になってしまった。でも応用きくので誰かの助けとならんことを、、
僕自身すごく初心者なのでなにか間違ってたら教えてください！
BigQuery入門

# 概要

BigQueryをサービスに組み込みことになりそう...!
ということで、まずはBigQueryと仲良くなります。

スタートガイドをなぞって進めて行きます。
参考：[GCP Console のウェブ UI を使用したクイックスタート](https://cloud.google.com/bigquery/docs/quickstarts/quickstart-web-ui?hl=ja)

# 事前準備
> 1. GCP プロジェクトを選択または作成します。

今回は、アカウント作成時に、作られた「My First Project」を利用します。


> 2. 新しいプロジェクトでは、BigQuery が自動的に有効になります。 

念の為、ドキュメントのリンクから有効化を押してみたところすでに有効とのこと。
<img width="340" alt="スクリーンショット 2019-11-21 16.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/726ce9a3-22d9-69ac-ceb4-9558fe0f9f6f.png">

# 一般公開のデータセットでクエリ実行

以下のURLから一般公開のデータセットにアクセス
https://console.cloud.google.com/bigquery?p=bigquery-public-data&page=project

シンプルなサンプルクエリを実行します。

```
SELECT
  name, gender,
  SUM(number) AS total
FROM
  `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY
  name, gender
ORDER BY
  total DESC
LIMIT
  10
```
おや...エラーが...
`Access Denied: Project garnet-251305: User does not have bigquery.jobs.create permission in project garnet-251305.`
![スクリーンショット 2019-11-20 15.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/650eb3bb-feca-5f95-a237-b29d85cccb06.png)


どうやらアカウント切り替えなどで、プロジェクトが選択できていなかった様子
プロジェクトを選択して以下のように実行できました。
![スクリーンショット 2019-11-20 15.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/a3461351-b3c5-d00f-1006-15c9694422e3.png)


# データセットの作成・テーブルの作成
こちらも手順通りに実施します。

ご丁寧にサンプルのデータセットが用意されているので、ダウンロードして解凍（赤ちゃん名前に関するデータですね。）

プロジェクト配下に、データセットを新規作成、続いてテーブルも作成します。

ガイドの中では、特に特別な設定などはしません。

あっというまにデータがインポートされてプレビューできる状態に！
![スクリーンショット 2019-11-20 15.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/78c7ffbe-3c04-9838-4e8e-4bd5f62d97e9.png)

続いてクエリを実行します。

```
SELECT
  name,
  count
FROM
  `babynames.names_2014`
WHERE
  gender = 'M'
ORDER BY
  count DESC
LIMIT
  5
```
![スクリーンショット 2019-11-20 15.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/61b097c9-840a-3d0e-52e3-ed47f4a051d0.png)

こちらも簡単に実行できました。

# クリーンアップ
GUIからの動作は試せたので、お片付けです。
プロジェクト内の最上位の単位であるデータセットをまるごと削除します。
データセットの設定から「データセットの削除」を選択
![スクリーンショット 2019-11-20 15.45.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519804/97066dd6-6717-0d95-4899-61a92e0a0d83.png)

確認のためデータセット名を入力して削除完了！

お片付けまで簡単ですね。
異なるスプレッドシートにあるFunctionを呼び出した際の、グローバル変数の扱い

###
####呼び出し元と呼び出し先の両方に同じグローバル変数がある場合
↓呼び出し元

```js:Spreadsheet1_sheet1

var t1 = "TEST1";
var t2 = "TEST2";
var t3 = "TEST3";

function test_new(){
  test()
}
```

↓呼び出し先

```js:Spreadsheet2_sheet2

var t1 = "TEST4";
var t2 = "TEST5";
var t3 = "TEST6";

function test(){
  sheet.getRange(4, 9).setValue(t1);
  sheet.getRange(4, 10).setValue(t2);
  sheet.getRange(4, 11).setValue(t3);
}
```

#####結果
```
TEST1, TEST2, TEST3
```
=呼び出し元のグローバル変数が優先される


####呼び出し元にのみグローバル変数がある場合
↓呼び出し元

```js:Spreadsheet1_sheet1

var t1 = "TEST1";
var t2 = "TEST2";
var t3 = "TEST3";

function test_new(){
  test()
}
```

↓呼び出し先

```js:Spreadsheet2_sheet2
/*
var t1 = "TEST4";
var t2 = "TEST5";
var t3 = "TEST6";
*/
function test(){
  sheet.getRange(4, 9).setValue(t1);
  sheet.getRange(4, 10).setValue(t2);
  sheet.getRange(4, 11).setValue(t3);
}
```

#####結果
```
TEST1, TEST2, TEST3
```
=呼び出し元のグローバル変数が出力される


####呼び出し先にのみグローバル変数がある場合
↓呼び出し元

```js:Spreadsheet1_sheet1
/*
var t1 = "TEST1";
var t2 = "TEST2";
var t3 = "TEST3";
*/
function test_new(){
  test()
}
```

↓呼び出し先

```js:Spreadsheet2_sheet2

var t1 = "TEST4";
var t2 = "TEST5";
var t3 = "TEST6";

function test(){
  sheet.getRange(4, 9).setValue(t1);
  sheet.getRange(4, 10).setValue(t2);
  sheet.getRange(4, 11).setValue(t3);
}
```

#####結果
```
TEST4, TEST5, TEST6
```
=呼び出し先のグローバル変数が出力される
CheckBoxでUbuntuのハードウェアをOSからチェックする

#はじめに
Ubuntu OS上でハードウェアをチェックするツールである[CheckBox](https://checkbox.readthedocs.io/en/latest/index.html)のインストールと使い方です

# インストール方法
下記を実行するだけです
`$ sudo snap install checkbox-snappy --devmode`

#使用方法
以下のコマンドを実行して起動します
`$ sudo checkbox-snappy.test-runner`

「All automated QA tests for Snappy Ubuntu Core Service」を選択して「スペース」キーを押下します。そのあとに「Enter」キーを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47012/6c56dfcf-ec9c-1d76-0c91-e0f68fdaf7ba.png)

テスト項目が表示されるので、実行したくないものを選んで「スペース」キーを押下します。
テストを実行しても良い状態になったら「T」キーを押下してテストを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47012/551cabe9-39ca-2853-05ee-d5bdc1d6ee92.png)

テストが完了すると、「Do you want to submit 'upload to certification' report?」とメッセージが表示されるので「n」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47012/48e5e49b-9c4f-f012-3180-c28a73734eb6.png)

結果のレポートファイルが出力されます。場所とファイル名は上記の画面に記載されています。
※今回の場合は

```
file:///root/snap/checkbox-snappy/2012/.local/share/checkbox-ng/submission_2019-11-21T07.45.21.754636.html
file:///root/snap/checkbox-snappy/2012/.local/share/checkbox-ng/submission_2019-11-21T07.45.21.754636.junit.xml
file:///root/snap/checkbox-snappy/2012/.local/share/checkbox-ng/submission_2019-11-21T07.45.21.754636.tar.xz
file:///root/snap/checkbox-snappy/2012/.local/share/checkbox-ng/submission_2019-11-21T07.45.21.754636.xlsx
```

仕組み上/root配下にファイルが出力されてしまいます。
ユーザディレクトリにコピーするなどした上でダウンロードしてください。
EXCELやWebページでのレポートがあり、結構重宝しています。
Node.js: CLIでユーザの入力をインタラクティブに読み取る3行ぽっきりの実装

Node.jsでCLIアプリケーションを作る際に、インタラクティブなプロンプトを出して、ユーザのテキスト入力を受け取る実装を紹介する。

この実装は3行で済み、外部ライブラリを必要としない。

## デモ

こんな感じで、ターミナルにタイプした文字をNode.jsで受け取るものを実装する。

![2019-11-21 16-35-56.2019-11-21 16_36_49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/c5bf6e6f-7a56-175a-f93f-6553ac3d8d70.gif)

## 実装

上でのデモの完全な実装は次のコードになる:

```javascript
function readText() {
	process.stdin.resume()
	return new Promise(r => process.stdin.once('data', r))
		.finally(() => process.stdin.pause())
}

(async function main () {
	process.stdout.write('> ')
	process.stdout.write('< ' + await readText())
	process.stdout.write('> ')
	process.stdout.write('< ' + await readText())
})()
```

このうち、ユーザ入力を受け取るコアの部分は次の3行:

```javascript
process.stdin.resume()
new Promise(r => process.stdin.once('data', r))
	.finally(() => process.stdin.pause())
```

* 1行目の`resume`で標準入力の受付を再開する。
    * どこかの処理ですでに`pause`していた場合に再開しないと2行目が動かないため。
* 2行目で標準入力を1回だけ受け取る。
* 3行目の`pause`で標準入力の受け付けを停止する。
    * ずっと受け付けっぱなしなると、CLIのプロセスが終了しないため。
ローバーのROS化（簡易版）

# テーマ記事へのリンク

以下の記事には今回のテーマを設定した目的や関連記事がまとめてあります。自分が見たい項目がある場合は利用してください。
[自作ロボット（ローバー）のROS対応](https://qiita.com/Naotaka_K/items/122c18f163f608bf299e)

# 目次

1. [準備するもの](#準備するもの)
2. [ROS化の定義]("ROS化の定義")
3. [システムの構成](#システムの構成)
4. [ソースコードのダウンロード＆コンパイル](#ソースコードのダウンロードコンパイル)
   <br> 4-1. [自分のロボットを使いたい場合](#自分のロボットを使いたい場合)
5. [実行](#実行)
6. [ArduinoのROS化を行わなかった理由](#arduinoのros化を行わなかった理由)
7. [今後の改善](#今後の改善)

# 準備するもの

1. Ubuntu 16.04
2. Arduino IDE
3. [3WD48mmオムニホイールモバイルロボット]( https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&cPath=895&products_id=5156 )（以下ローバー）

# ROS化の定義

ROS対応ロボットには[TurtleBot]( https://www.turtlebot.com/ )や[HSR]( https://www.toyota.co.jp/jpn/tech/partner_robot/robot/#link02 )などが挙げられる。しかし、ROS対応と書かれていなければROSが使えないわけではなく、最近では[プリメイドロボット]( https://media.dmm-make.com/item/2955/ )が有志によってROS化が進んでいる。なのでサーボやカメラなどのハードに制約があるわけではない（もちろんメモリや相性などの関係はある）。やっていることはROSメッセージを使ってセンサやサーボの値をやり取りしているだけである。

つまりROSメッセージを使ってセンサから取得した値をPublishしたり、値をSubscribeしてサーボを動かせればそれはROS対応ということになる。

そこで本記事で定義する自作ロボットのROS化とは、**Pub・Sub通信を用いてデータのやり取りを行い、ROSの既存のパッケージを利用可能にすること**を指す。

# システムの構成

システムの構成を以下の図に示す。

<img width="400" alt="構成図.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/4f57284d-ddaa-5334-ec71-8f419c50db6f.png">

"〇"で書かれたものがROSノードである。Arduinoの部分はROS化を行っておらず、シリアル通信を通して通信を行う。

本記事では以下の流れでローバーの操作を行っている。

1. キーボードの入力を読み込み、中継ノードにキーに対応したデータを送信
2. 中継ノードが送られてきたデータを読み込み、シリアル通信を介してArduinoに送信

# ソースコードのダウンロード＆コンパイル

以下のフォルダをROSのワーキングディレクトリにダウンロードし、コンパイルする。

```shell
$ cd ~/catkin_ws/src
$ git clone https://github.com/NaotakaKawata/rover
$ chmod +x rover/src/teleop_serial.py
$ cd ..
$ catkin_make
```



その後、ローバーにArduino IDEを使ってarduino_scripts/arduino_serial.inoを書き込む。

## 自分のロボットを使いたい場合
もしローバー以外のArduinoで制御しているロボットを使いたい場合は自分のロボットに合わせたスケッチを使ってください。Arduinoの部分はROS化していないため既存のプログラムが使えるはずです。
ROS側から送られてくるのは"r"や"f"などの文字列なので、文字列を受け取った時の処理の部分に任意の制御を書けば好きに動かせるようになります。


# 実行

ローバーにシリアルケーブルが刺さった状態で以下のコマンドを実行。別の窓が開くため、そこにキー入力を行うことでローバーを操作することが可能になる。

```shell
$ roslaunch rover rover_serial.launch
```



# ArduinoのROS化を行わなかった理由

[rosserial]( http://wiki.ros.org/ja/rosserial )を使うことでArduinoの部分もROSノードのように見せることができ、Pub・Sub通信を行うことが出来る。~~この実装を行わなかった理由ですが、今回使ったマイコンである[ATmega328P]( http://akizukidenshi.com/catalog/g/gI-03142/ )（Arduino UNOに乗っているものと同じ）にrosserialを用いて実装を行った結果、モーターは回るが制御不能になるという現象が起きたからである。オシロスコープがあればはっきりするがなぜこの事象が起きるかが分からなかったので、Arduino側でのROS化を断念した。~~自分で1から書いたら動きました

またrosを使うだけでSRAM2000byteの内の1000byte以上が使われてしまうので、Arduinoのようなマイコンを使う場合にはROS化を行う際は工夫しないとメモリが足りなくなってしまう。

ただしこのメモリに関しての問題については、ros.hで定義されているトピックの上限や送信するデータの上限を書き換えたり、[mROS]( https://github.com/tlk-emb/mROS )を使えば解決できると思う。

# 今後の改善

本記事が「自作ロボットのROS対応」というテーマの最後になる予定だった。しかしArduinoの部分をROS化していないため、モーター制御の部分にROSの資産を使えていない。このままではSLAMやPlanningなどの[Navigation Stack]( http://wiki.ros.org/navigation )が実行できない。

そのため中継ノードから送られてくるデータをそのまま使い、Arduinoによるモーター制御ができるよう改良し、ROSの資産を有効に活用できるようにする。

なので「自作ロボットのROS対応」テーマでもう少しだけ続きます。
抄訳 RFC7493 I-JSON

社用のAPIのガイドラインを整備したいと思っていたところ、I-JSONというものがあることを教わったので見てみました。

概要
----------------------------------------------------------------------

- I-JSON = Internet JSON
    - Web上で複数のシステム間が互いにJSONデータを扱いやすいようにするための、その記述(およびパーサの実装)についてのガイドライン

- `RFC7493` で規定されている
    - IETFが2015年に作成し、IESGが承認している
    - `RFC7159` におけるJSONの定義をベースとしている

参照
------------------------------------------------------------
- [IETF - RFC7493](https://tools.ietf.org/html/rfc7493): I-JSON
- [IETF - RFC7159](https://tools.ietf.org/html/rfc7159): JSON


I-JSONのルールまとめ
------------------------------------------------------------
### エンコード
- __(MUST)__ エンコードは `UTF-8` を使うこと
- __(MUST NOT)__ オブジェクトのkey/valueおよび配列内の文字列にサロゲートペア(4バイト文字)やUnicode外の文字を含めてはいけない

### 数値
- __(SHOULD NOT)__ `IEEE754` で定義された倍精度小数点より大きな(桁数の)数を数値としてJSONに含めるべきではない
- __(SHOULD NOT)__ `2^53` より大きい/小さい整数を数値としてJSONに含めるべきではない
    - __(RECOMMEND)__ これらを扱いたい場合は文字列で表現するのが望ましい

### 日付と時刻
- __(RECOMMEND)__ 日付と時刻は `RFC3339` / `ISO8601` で定められた文字列形式で表現することが望ましい
- __(RECOMMEND)__ 期間を指定する場合も同様に `RFC3339` に準ずることが望ましい

>加えて以下を満たすことが推奨される:
>
>- アルファベットは大文字を使うこと
>- タイムゾーンがデフォルトであっても明示されること
>- 秒が00であっても明示されること

### バイナリ
- __(RECOMMEND)__バイナリを含める場合は `base64url` によってエンコードすることが望ましい

### オブジェクト
- __(MUST NOT)__ オブジェクト内に重複するキーがあってはならない
- __(MAY)__ I-JSONにおいて、オブジェクト内のキーの順序のみが異なるメッセージは等価とみなせる
    - つまりオブジェクト内のキーの順序は保証されない

### バリデーション
- JSONメッセージがI-JSONのフォーマットに準拠していない場合、受信者は受信を拒否することができる

- __(SHOULD NOT)__ オブジェクトと配列以外をトップレベルに使うべきでない
    - 古いJSONの仕様(`RFC4627`)による実装との互換性を確保するため

- __(MUST NOT)__ 受信者が認識できない要素が出現しても、その事実をエラーとして扱ってはいけない
    - これはフォーマットではなくデータ構造の話(例えば知らないキーがオブジェクトに含まれてるとか)
    - __Must-Ignoreポリシ__  = 理解できない要素は無視する
tecsmergeの使い方


[TECS](https://www.toppers.jp/tecs.html)で開発を始めた際に最初に引っかかった、「**tecsmerge**」の簡単な使い方についてまとめました．
## 対象
TECSで開発をはじめたての方
## tecsmeregeとは？
TECS + Merge = **tecsmerge**
セルタイプごとに必要なセルタイプコードを作成する時に使用します．  
主に以下の２つのシチュエーションで使用します．
1. 初版セルタイプコードをジェネレータが作成したテンプレートコードから作成する
1. CDLコードでの変更を既存のセルタイプコードに反映させる

それぞれについてみていきます．

## 準備

まず、開発対象に合わせて[こちら](https://www.toppers.jp/tecs.html)からいずれかをダウンロードしている前提です．
**tecsmerge** はrubyで実装されています．  
**場所**：/tecsgen/tecsgen/tecsmerge.rb（tecegenはダウンロードしたフォルダ内にあります）

    % ruby tecsmerge.rb

でtecemergeを実行します．
ですので事前にパスを通すようにしてください．

## 1. 初版セルタイプコードをジェネレータが作成したテンプレートコードから作成する
TECS CDLを作成し  

    % make tecs

を行うとgenフォルダ下にセルタイプコードのテンプレートコード「tCelltype_templ.c」 が作成されます．これが初版のコードとなります．

    % ruby tecsmerge.ruby gen/tCelltype_templ.c ディレクトリ名

で指定したディレクトリにセルタイプコード「tCelltype.c」が作成されます．
このファイルを編集していってください．

※ tCelltypeはセルタイプの名前によってかえてください．

## 2. CDLコードでの変更を既存のセルタイプコードに反映させる
上記で初版のセルタイプコードを作成した後、編集していった状態です． 
この時  
- 受け口関数の引数を増やしたい
- 他の関数を追加したい
- 変数や属性を追加したい

等になった際にCDLファイルを編集すると思います．その変更をtecsmergeで既存のセルタイプコードに反映させることができます．

    % ruby tecsmerge.ruby gen/tCelltype_templ.c tCelltype.c
もしくは  

    % ruby tecsmerge.ruby gen/tCelltype_templ.c tCelltype.cがあるディレクトリ名

これによりCDLでの変更がセルタイプコードにも反映されています．

※ 変数などの小さい変更はわざわざmergeしなくても問題はないです．

## 注意点
セルタイプコード中の

      /* ここに処理本体を記述します #_TEFB_# */

などの記述には必ずしたがってください．tecsmergeがうまく動作しません．

## 参考
[tecsmerge コマンドリファレンス](http://dev.toppers.jp/trac_user/tecs/wiki/tecsmerge)
git log を使って履歴を検索したい

適宜追加する

# 対象ファイルに関して検索する
```
git log -- path/of/the/file
```
もしくは

```
git log -p path/of/the/file
```
コンパクトに

```
git log --word-diff -p path/of/the/file
```
authorでフィルタ

```
git log --word-diff --author tanaka -p path/of/the/file
```

### 対象ディレクトリでもOK
```
git log -- path/of/the/directory/
```
【Unity】Scene上からもInspector上からも、Transformを操作できなくする。

# 概要
エディター上の操作で、オブジェクトのTransform（Position・Rotation・Scale）を一切変更できなくできる。

#使用Unityバージョン
Unity 2019.2.11f1 Personal
C#使用

# シーンビューでのTransform操作ツールを非表示にし、マウスでの操作を無効にする
```c#:EditorConfiguration.cs
using UnityEngine;
using UnityEditor;

public class EditorConfiguration
{
    public static void NotEditableOnScene()
    {
        Tools.hidden = true;
    }
}
```
NotEditableOnScene()を呼び出せば、Scene上のTransform操作ツール表示（矢印とかのこと）が消えるため、操作できなくできる。
### 適用前　操作可能
従来の挙動だね。
![004.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504100/632f8c44-2855-df7e-7ce1-4d91b753078d.gif)

### 適用後　操作不可
Hand Tool（手のマーク）のみ使える。
Transformの変更はできないね。
![005.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504100/965f8765-2039-bfe1-71c2-e4f45ebf7681.gif)



# インスペクタービューでのTransformを編集不可にする
```cpp:TransformNotEditable.cs
using UnityEngine;
using UnityEditor;

public class TransformNotEditable : MonoBehaviour
{
    void OnEnable()
    {
        GetCompornent<Transform>().hideFlags = HideFlags.NotEditable;
    }
}
```
Inspector上のTransformの項目が、グレーアウトし編集ができなくなります。
呼び出す関数はなんでもいいです。この場合はオブジェクト生成時にアタッチして呼び出される形にしています。
![003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504100/9fb0a7d5-4e10-a2a7-6774-a88b2b76816e.gif)
#Ruby で n個の配列の中からランダムにx個の要素を取り出す例


 ```rb
[*1..100].shuffle.sample(3)

# => [23, 56, 1]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Tips]AthenaをPythonで扱う

# はじめに
この記事はAthenaへクエリーを投げて、その結果をpandasで分析したい人のための記事です。
特にJupyter notebookで分析をしているときに便利だと思います。

# インストール
[PyAthena](https://pypi.org/project/PyAthena/)をインストールします。

```python
pip install PyAthena 
```

# 使い方

connect関数を利用します。AWSのキーとAthenaでクエリーを実行した結果を吐き出すS3のpathを指定します。
pd.read_sqlという関数を利用して、実行すると実行結果がpandasの形でゲットできます。

```python
from pyathena import connect
import pandas as pd
aws_access_key_id = 'Your aws access key id'
aws_secret_access_key = 'Your aws secret access key'

conn = connect(aws_access_key_id=aws_access_key_id,
                 aws_secret_access_key=aws_secret_access_key,
                 s3_staging_dir='Your s3 path',
                 region_name='ap-northeast-1')

df = pd.read_sql("SELECT * FROM sample", conn)
```
Robloxで回転する足場をつくる

# 概要
- 回転する足場
- マリオとかにありますよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/2756a8e3-68af-54a5-a023-df974fa4eb69.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/302f8faa-ab50-5afe-e693-b7a9567c323e.png)

# 作成手順
## 下部分のPartをつくる（名前はBasePartとか）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/b062fafb-774e-1709-c913-b12fdfdce5cf.png)
## 落ちないようにAnchorしておく
### Modelの中のAnchorを押すと、その座標に固定される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/568f51ab-5c7c-b682-4ae3-81ff2d77ef10.png)
## 上部分のPartをつくる（名前はTurnPartとか）
### ぐるぐる回すので、Anchorはしなくていい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/53859f13-6cc7-f051-f269-462207028b58.png)
## 上部分と下部分をくっつける
### Modelの中のConstaraintsの中の小さい矢印の中の、Hingeを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/e7a10024-2aea-09e7-3b60-2a0d4cf271ee.png)
### まず下部分のPartに、Attachmentの片側をつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/0661bfaa-dc99-f2b2-0327-9e13841687dc.png)
### 上部分のPartに、Attachmentの反対側をつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/fbae0e8f-8f9c-cba1-cf8c-902572c00bbd.png)
### Explorerビューをみて、このようになっているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/a84b809b-0b9d-5f59-cfb8-3ace4cf29c6d.png)
## 上部分のPartをまわす
### HingeConstraitをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/ebb04ba8-5482-ad70-5d66-f1747a2798cf.png)
### ActuatorTypeをさがす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/abf25580-c392-af3a-2c3b-c2a90fb2bae4.png)

### ActuatorTypeをMotor（モーター）にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/45c0b52c-130a-3ab7-708a-81f73d04be92.png)

### Motorのパワーや速度を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/b9086f33-9604-964b-499b-0b5cbc09b598.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/3e6ad4d3-c1da-4d1e-735b-a5dbf5599ee1.png)
## 完成！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/a56516d7-6551-c8b7-5b78-96a197ac6230.png)
数値のキーボード入力について質問です

以下のコードの文字入力部分をBufferedReaderにすると正常に入力できないのですがなぜでしょうか
Scannerだと正常に動きます
```

		BufferedReader br = new 
                BufferedReader(newInputStreamReader(System.in));

		double max = Double.NEGATIVE_INFINITY;
		double min = Double.POSITIVE_INFINITY;
		double dat = 0;

		System.out.println(max + " " + min);

		for(int i = 0;i < 4;i++) {

			System.out.println("数値入力");

			dat = br.read();　//ここ

			if(dat > max) {
				max = dat;
			}
			if(dat < min) {
				min = dat;
			}

		}
		System.out.println("最大値:" + max + " " + " 最小値:" +min);

	}
```

BufferedReaderを使用した場合の実行結果↓

-Infinity Infinity
数値入力
1
数値入力
数値入力
数値入力
2
最大値:50.0  最小値:10.0