OmniAICreator/Qiita-1.07M huggingface dataset:
Chrome76アップデート PWAのデスクトップ版インストールについて

## 概要
Googleが7月30日（現地時間）、「Chrome 76」をリリースした模様です。
表題通りPWAのデスクトップインストールについて、どのような挙動になったかご紹介します。

## 手順

1. アドレスバーに+ボタンが表示されるようになった
![プラスボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271161/d65944c6-8fb9-8030-b580-143fede79db6.png)


2. そこをクリックすると「アプリをインストールしますか？」という表示
![pc_pwa_インストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271161/ac208035-59d9-daae-78ee-e509e83a7124.png)

3. デスクトップのアイコンに追加される
4. クリックして起ち上げるとPCページが表示されました。
![pc_pwa_起ち上げ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271161/9b7f38f0-60e3-8ee9-3d6c-7c0bf811b459.png)



## manifest.jsonのstart_urlのパラメーターは維持される
manifest.jsonにはspページのURLに解析用のパラメーターをつけたものを設定していました。
開いたページはPCのURLにパラメーターがついているものだったので、SPからPCページにリダイレクトされ、かつパラメーターを維持していることがわかりました。
また、サービスワーカーも引き継がれています。

```json:manifest.json
{
  "name": "H.I.S.",
  "short_name": "H.I.S.",
  "theme_color": "#004098",
  "background_color": "#004098",
  "display": "minimal-ui",
  "scope": "/",
  "start_url": "kanto_sp.html?debug=pwa&cid=top_homescreen&utm_source=top_homescreen&utm_medium=homescreen&utm_campaign=top_homescreen",
  "icons": [
    {
      "src": "/cmn/icon/pwa/icon-72x72.png",
      "sizes": "72x72",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-96x96.png",
      "sizes": "96x96",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-128x128.png",
      "sizes": "128x128",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-144x144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-152x152.png",
      "sizes": "152x152",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-384x384.png",
      "sizes": "384x384",
      "type": "image/png"
    },
    {
      "src": "/cmn/icon/pwa/icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "splash_pages": null
}
```

### 展望
- アドレスバーの+ボタンは見つけにくい！
  - beforeinstallpromptイベントでホーム画面追加ボタンの発火を制御し、ページ内に別のボタンを設置すればデスクトップからのアクセスを増やすこともできそうですね。（→[こちらの記事](https://qiita.com/yhrym/items/b3aff766a46e15cb7154)に書きました。）


ありがとうございました。

## 参考
- [New in Chrome 76](https://developers.google.com/web/updates/2019/07/nic76)
- [What's New In DevTools (Chrome 76)](https://developers.google.com/web/updates/2019/05/devtools#settings)
githubのプルリクエスト上で[Viewed]の閲覧管理が便利

2019/7/1からgithubのプルリクエスト上で、
閲覧したかどうかを判別できる「Viewed」ボタンの機能が追加されました。
これが地味に便利で
Pull Request（以降、プルリク）をレビューしている時に
変更点が多すぎるとFileChangedが大量にあり、どのコードを読んでどこまでがOKか判別が手間な時があります。
そういう際に閲覧したかどうかの履歴として使用できるのでレビュアーには
痒い所に手が届く嬉しい機能です。

○○/○○の形式でどれだけ閲覧済みか進行状況が表示されます。

<img width="316" alt="スクリーンショット 2019-08-07 18.56.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/41d62bdb-32dd-3157-5251-ee2e36ff7de4.png">

ツールチップにはこう表示されます。
> Marking files as viewed can help keep track of your progress, 
but will not affect your submitted review

<img width="314" alt="スクリーンショット 2019-08-07 18.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/1780c9c6-8bfe-29e7-b37b-a853a2c25e87.png">

ちなみに公式側の使って欲しい意図と合っているかは分かりませんが、
ブログを読む限り大きく外れてはなさそうです。

以下に、githubのブログがあります。

https://github.blog/

正直、公式なのか？どうかは知らなかったのですが、
コピーライトに`© 2019 GitHub, Inc`こうあるのできっと公式なのでしょう。

参照：https://github.blog/2019-07-01-mark-files-as-viewed/
【統計力学】3つのエネルギー分布関数をPythonで描画してみた！

#概要
今回は，半導体などを扱うとすると必ず出てくるフェルミ・ディラック分布関数をはじめとする
さまざまなエネルギー分布関数をPythonを使って描画してみようと思います．

#動作環境
- Windows10(64bit)
- Python 3.7.2

# エネルギー分布関数
熱平衡状態において，ある特定のエネルギーを持つ粒子数と量子数(状態数)との割合を与えるものがエネルギー分布則であるが，エネルギー分布則は以下の3つに大別できる．

- マクスウェル-ボルツマン分布則

→ 一つの量子状態に何個の粒子が入ってもよく，しかもそれぞれの粒子は互いに区別できる．

```math
f(E)=\exp(\frac{E_F-E}{k_B T})
```

- ボーズ-アインシュタイン分布則

→ 一つの量子状態に何個の粒子が入ってもよいが，それぞれの粒子は互いに区別できない．

```math
f(E)=\frac{1}{\exp(\frac{E-E_F}{k_B T})-1}
```

- フェルミ-ディラック分布則

→ 一つの量子状態には1個の粒子しか入ることが許されず，しかも粒子が互いに区別できない．

```math
f(E)=\frac{1}{\exp(\frac{E-E_F}{k_B T})+1}
```

上記の導出など細かい部分はさておき，今回は上記の分布をPythonで描画していこうと思います．

#コード
では，早速実装していきましょう．そんなに難しくはないです．
簡単のため，パラメータは0や1にしておきました．
また，ボーズ-アインシュタイン分布では，$E=E_F$で発散してしまうため，一工夫してあります．

```EDF.py
"""エネルギー分布関数を描画するプログラム"""
import numpy as np
import matplotlib.pyplot as plt

k = 1       # ボルツマン定数
Ef = 0      # フェルミ順位     
T = 1       # 温度

# マクスウェル-ボルツマン分布
def Maxwell(E):
    return np.exp((Ef-E)/(k*T)) 

# ボーズ-アインシュタイン分布
def Bose(E):
    return 1 / (np.exp((E-Ef)/(k*T)) - 1 )

# フェルミ-ディラック分布
def Fermi(E):
    return 1 / (np.exp((E-Ef)/(k*T)) + 1 )

E = np.linspace(-3, 3, 100)
E_ = np.linspace(0, 3, 100)
y1 = Maxwell(E)
y2 = Bose(E_)
y3 = Fermi(E)

fig = plt.figure()
ax = fig.add_subplot(111) 

c1,c2,c3 = "blue","green","red"
l1,l2,l3 = "Maxwell","Bose","Fermi"

ax.set_xlabel(r'$\frac{\epsilon-\mu}{k_BT}$')
ax.set_ylabel(r'$f(\epsilon)$')
ax.set_title("Energy Distirbution Function") 
ax.grid()
ax.set_xlim([-3, 3])
ax.set_ylim([0, 4])
ax.plot(E, y1, color=c1, label=l1)
ax.plot(E_, y2, color=c2, label=l2)
ax.plot(E, y3, color=c3, label=l3)
ax.legend(loc=0)
plt.show()
```

# 実行結果

![EDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/02e0f976-b6e6-24c4-6cbd-be9621556a14.png)


#まとめ
いかがだったでしょうか？今回は3つのエネルギー分布を描画してみました．
古典極限においては，3つの分布関数がほぼ一致することが確認できましたね．
今回のコードに関して何か改善点などあればコメントいただけると助かります．
番号を振る・振りなおす Excelマクロ（多階層版）

###これは
私がExcelで資料を作成するときに使っている、ちょっとしたマクロです。
番号を振ったり振りなおしたりすることができます。

基本的な動作は、[過去に作ったもの](https://qiita.com/jinoji/items/6e9a7e169d87a8a7bcdb) と同じです。
違いは、多階層に対応したことです。

つまり、セルの列をずらして多階層の見出しを書いておいて、マクロ一発で
　1.
　　1-1.
　　　1-1-1. 
　　　1-1-2. 
　　1-2.
　　　1-2-1. 
　　　1-2-2. 

のように番号が振れるようにしたかったのです。

###コード
```vb
Sub リナンバリング()
    'Microsoft VBScript RegularExpressions 5.5
    'Microsoft Scripting Runtime

    Dim Reg As New VBScript_RegExp_55.RegExp
    Reg.Pattern = "^[0-9\-\. ]+"

    Dim c As Range
    For Each c In ActiveWindow.RangeSelection
        If Not IsEmpty(c) Then
            Dim cVal As String, cCol As Long, oCol As Long
            cVal = c.Value
            cCol = c.Column
    
            Dim colDic As New Dictionary, lv As Long
            If Not colDic.Exists(cCol) Then colDic.Add cCol, colDic.Count
            lv = colDic(cCol)
    
            Dim lvNum As New Dictionary
            lvNum(lv) = IIf(oCol < cCol, 1, lvNum(lv) + 1)
    
            Dim num As Variant
            num = lvNum.Items
            ReDim Preserve num(lv)
            num = Join(num, "-") & ". "
    
            c.Value = IIf(Reg.Test(cVal), Reg.Replace(cVal, num), num & cVal)
    
            oCol = cCol
        End If
        DoEvents
    Next
End Sub

```
Android Jetpackのリリース前のバージョンを使う方法

# 概要
先日RoomのFlow対応がマージされていたりして、いち早く新しいバージョンを使いたいことと思っていました。
https://android-review.googlesource.com/c/platform/frameworks/support/+/944458

2.2.0-alpha02.txtというファイルをいじっているので、2.2.0-alpha02にてリリースされそうだなと思いみていたら面白そうなリポジトリを発見しました。
https://android.googlesource.com/platform/prebuilts/androidx/internal/+/refs/heads/androidx-master-dev
ここを見ていくとここに最新バージョン(リリース前)のaarが上がっているようです。
(internalになっていますが、apache licenseのファイルおいてあるので大丈夫なはず。。)
これを使ってみようと思います。

# 手順

androidx-master-devブランチの最新のコミットのみとってきたいので以下のように取得します。

```
git clone --depth 1 -b androidx-master-dev https://android.googlesource.com/platform/prebuilts/androidx/internal
```

そしてpom.xmlの中でのversion指定が`<version>[1.1.0-alpha02]</version>`のように`[]`で囲まれてしまっているのでそれを外します

```
cd internal
find . -name "*.pom"|xargs sed -i -e "s/<version>\[\(.*\)\]<\/version>/<version>\1<\/version>/"
```


使いたいAndroidプロジェクトのbuild.gradleで、そしてクローンしたリポジトリのパスをrepositoriesで指定します。(buildScriptの方と、それぞれのプロジェクトの方両方で行います)

```groovy
    repositories {
        maven {
            url "/Users/takahirom/git/internal" // コピペではなく自分のパスへ
        }
```

そしてMatching repositories to dependenciesの機能を使って、このinternalリポジトリに含まれるものをGoogleのリポジトリから取得しないようにします。

```groovy
        google().content{
            excludeGroupByRegex("androidx\\.(?!databinding)(?!constraintlayout).*")
        }
```

これでdependencyブロックにて使いたいバージョンの依存関係を使うことができました！

(`androidx.room:room-ktx:2.2.0-alpha02`RoomのFlow対応も使えました！ :tada: )
(Roomで自動生成されたコード)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/dce1fe00-1b9f-ead1-22e2-0637b63951e9.png)
個人的メモ　Slimの使い方(Rails + slim)

# slimの文法

slimを使い始めたものの、初めての使用で読み解くのが大変だったのでメモを残しておきます


## タグとクラスの書き方

```html
<div class= hogehoge> </div>
───────

```

をslimで表現すると

```slim
div.hogehoge
```

となります。


### リンク用ボタンの実装
ボタンの大きさ、形はCSS側で対応させています。

```slim
li = link_to users_estimates_entries_path, class: 'site-header-my_page_button'
```

なお、文字の横にDBから引っ張ってきた画像をアイコンをボタン上で表示させたいときは、
（以下の例はリンク用ボタンのcurrent_userモデルのimage_urlカラム内にユーザーの画像URLがあり、画像の大きさや形などはCSS側書いています）

```slim

li = link_to users_estimates_entries_path, class: 'site-header-my_page_button'
  = image_tag current_user.image_url ,class:'button_img'
  = I18n.t('views.header_nav.mypage')
```
のように書きます。

## rails用erbのslim上での書き方

### ・`<% %>`を使いたいとき

先頭にハイフンをいれ、下の行にインデントを入れ

```slim

 - if user_signed_in?
  li = link_to users_estimates_entries_path
```
などのように書く



`<%= %>`を使いたいとき
先頭に`=`を入れ


```erb
<%= paginate @posters %>
= paginate @posters
```
となる
【Rails】 paramsを毎回表示するのが面倒になったので自動化した

#結論
メソッドが動く前にparamsの値を表示する。
application_controller.rbの中に下記のコードを記載すると動きます。
※今回は+αでsessionも表示しています。

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :check_controller_action
  def check_controller_action
    puts("\e[35msession:#{session}\e[0m")
    puts("\e[35mparams:#{params}\e[0m")
  end
end
```

#解説
before_filter　→　各アクションの前に処理を行う
\e[35m　→　文字色を紫に変更
\e[0m 　→　文字色を初期状態に変更

before_filterをafter_filterに変更すると、
各アクションの後にparamsを表示してくれます。

#経緯
テストをする際にparamsを確認をするのが面倒に感じました。
なら、メソッドが動くたびに自動表示すれば良いのではとなったのがきっかけです。

もし改良案などあれば、ぜひコメントお願いします。
Eloquentから取得したint型データがstring型になる

# 経緯
LaravelでAPIサーバを開発中です。AWSのcodebuildでテストを走らせるためにテストのDBをMariaDBからSQLite3に変更しました。すると今まで通ってたテストが...失敗する...

Eloquentから取得したデータをJSON形式に整形して付き合わせしてるテストがことごとく失敗しています。どうやらint型が勝手にString型に変換されて返ってきてるようです。

## 現象

テストコード

```php

// HogeModelのデータをHogeService経由で取得する場合のテストコード
public function testHoge()
{
    $service = app(HogeService::class);
    $ret = $service->getHogeData(1);
    $ret = json_encode($ret, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
    $expected = trim(file_get_contents(__DIR__ . '/expect_05.json'));
    $this->assertEquals($expected, $ret);
}
```

テスト結果のactual/expecteのDiff

```shell-session

@@ @@ 
     "hoges": [\n 
         {\n 
             "id": 1,\n 
-            "other_id": 1,\n 
+            "other_id": "1",\n 
             "label": "yes",\n 
```


# 対応

## 調査1

- [PHPのjson_encode()で数値が文字列扱いになる場合](https://www.codelab.jp/blog/?p=1178)

記事の通り手元の環境で`JSON_NUMERIC_CHECK `オプションをつけて実行してもやはりテストが完全に通らず。なおったりなおらなかったりってフワッとしてますね。

## 調査2

下記は、MariaDBでこういう現象が発生しなかったのはなぜだろうと調べて行き着いた記事です。

- [Laravel で DBの数値型カラムが文字列型で返ってくる場合の対処法](https://pgmemo.tokyo/data/archives/1508.html)

手元の環境で確認したところ

- `mysqlnd`が入っている
- `PDO::ATTR_EMULATE_PREPARES`は`true`

ですので、mysql_pdoで自動型変換が抑制されていたようです。

## 対応策

DBによらず返す型は統一したいと考え、型キャストすることにしました。Laravelの`$casts`プロパティを使ってHogeModelに下記コードを追加しました。

```php

protected $casts = [
    'id'       => 'int',
    'other_id' => 'int',
];
```

テスト通った！


# まとめ

LaravelはほんとCoolだけど、PHPはまだちょっと好きになるには時間がかかりそう(オブラート)。少なくとも初心者がやるなら少なくともPHP以外をオススメするなあ...
GCP アップデート (8/2-8/8 2019)


### Dataflow: [Aug 2, 2019](https://cloud.google.com/dataflow/docs/resources/release-notes-service#august_2_2019)
- dataflowでKMSを使えるのがベータになったよ。
  - ワーカノードのPersistent Disk専用。
  - HSMも可。

### BigQuery: [Aug 5, 2019](https://cloud.google.com/bigquery/docs/release-notes#august_5_2019)
- BigQuery Storage APIがArrowを扱えるようになったよ。
  - Storage APIはまだベータ。

### Spanner: [Aug 7, 2019](https://cloud.google.com/spanner/docs/release-notes#2019-08-07)
- Spanner用のJDBCドライバをオープンソースで公開したよ。
  - 一部制約あるので[ここ](https://cloud.google.com/spanner/docs/open-source-jdbc)参照。

### Bigquery: [Aug 7, 2019](https://cloud.google.com/bigquery/docs/release-notes#aug_7_2019)
- BigQueryからCloud SQLのテーブルへクエリできるfederated queryがベータになったよ。
  - Mysql(2nd gen)とPostgreSQLが対象。
  - [制約いろいろある](https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries)ので注意。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
webarenaでubuntu その4

#概要

webarenaでubuntu18.04やってみた。
コンソールに、コピペできないので、sendkyeしてみた。

#サンプルコード


```
Dim sh
Set sh = WScript.CreateObject("WScript.Shell")
Dim b
b = false
b = sh.AppActivate("WebARENA", True)
If b Then
	sh.SendKeys "pwd"
Else
	MsgBox "ウィンドウが見つかりません。" 
End If
Set sh = Nothing
```

以上。
【Unity】PUN2実装時に念頭に置いておくことのメモ

# はじめに
Photonで実装やってみたブログみたいな参考文献たくさんあるし、簡単に導入できるでしょ！
と思っていたらボコボコにされたので。自分へのメモ書き兼ねて。
なお、基本的な流れはPUNの実装について書いてあるブログでいけます。
ここでは、PUN実装やってみたブログを見ながら進めていたらつまづいたことをフォローする感じです。
Qiita初投稿なのでお手柔らかに。。。

##PUN2(2019/8/8時点で最新バージョン）を使おうと思うとデカい罠がある
罠１．PUN"**2**"に関するブログが少ない。
罠２．PUN→PUN2アプデ時に名前空間やら諸々が一新されている。ので、PUNについて解説してあるブログが役に立たないことがある。

###作業環境
Unity2018.3.10.f1
PUN2.13
###導入方法
導入に関しては、PUN導入ブログで普通にいけました。
適当にググってわかりやすそうなブログを見てください。
見なくても問題なく導入できるかもしれません。

**以下、つまずいたことと解決策。**

##Photon.PunBehaviourが無い
「**MonoBehaviourPunCallbacks**」で置き換えられます。
「Photon.MonoBehaviour」は「MonoBehaviourPun」にすることで、おそらく大抵が片付きます。

##PhotonNetwork.ConnectUsingSettings()の引数が指定できない
ロビー分けられんのかと泣きそうになりましたが、分けられます。
分ける必要が無ければ「**PhotonNetwork.ConnectUsingSettings()**」（引数なし）で終わりです。

ロビーを複数作る感じの仕様なら、まず
> PhotonNetwork.GameVersion = "3";
> PhotonNetwork.ConnectUsingSettings();

これでいけます。ただ、もう少しやることがあります。

> //ConnectUsingSettings()関数内
> GameVersion = PhotonServerSettings.AppSettings.AppVersion;

これをコメントアウトしましょう。別の数字で上書きされてしまうので。
ダメなのかもしれないですけど。
（たぶん本当はPhotonServerSettings.AppSettings.AppVersionの値を指定するのが良い気がします。）
他にこうしたほうが良いみたいなのがあったら教えてください。

#RPC関連

##Targets.AllとかPhotonTargets.Allが無い
RpcTarget.Allになってます。

##PhotonViewが重要
Transformが無いオブジェクト（UIとか。）にアタッチしても動作しない（ちょっとつまづいた）。
空のオブジェクトとかにアタッチして使うのが良さそう。
**参考**
[Unityのネットワーク対戦で相手にデータを送信する最も単純で簡単な方法](https://qiita.com/_-_-_-_-_/items/5a24b1a3202a140ea9ad)

#最後に
自分用メモとか言いつつ、PUN2の文献が少なすぎて困っている方のお力になれたら本望です！
「あのへんはどう解決した？」みたいな質問も受け付けます（解決できるとは言ってない）。
初投稿なため、見にくい部分もあると思いますが、そのあたりは何なりとお申し付けください！
また、「こっちのほうが良いよ！」という解決策などございましたら、ご教授いただけますと幸いです。
C++ Builder 10.1 Berlin (Windows10 64bit) リンクエラー(LME288)回避方法

C++ Builderで古くからあるリンクエラー(LME288)ですが、「PCを再起動したら直る」「3GBスイッチをONにすると直る」（32bit OS環境限定？）などありますが、それでは直らず悩んでいたところ、以下の方法で解決しましたので記録しておきます。

「C++ Builderを管理者権限で実行する」

プロジェクトファイルをダブルクリックで起動、が使えなくなるので痛いのですが、参考までに。Delphiでも有効らしいです。

ちなみに私の環境はWindows10(Pro) 64bit バージョン1903です。

（2019/8/19追記）
単に「スタートメニューからC++ Builderを起動する」でもLME288が出なくなっていることを確認しました。プロジェクトファイルをダブルクリックしたらダメみたい。
改めて知ったlink_toの使い方。

どうも！！！
チャンクノです。
三日前からついにチーム開発が始まりました。
一応スクラムマスターをやっております。

チーム開発でlink_toを使っていて今まで知らなかった使い方があったので備忘録として書いておきます。
すごい初歩的な話でお恥ずかしいですが🙈

### クラスを指定したつもりがurlとして認識されている
link_toタグにクラスを指定しているのに全然cssが効かないことがありました。
その時のコードは以下のような感じです。

```
=link_to "~", class: "~"
```
このように書いた場合、クラスがurlとして認識されてcssを当てても効かなくなりました。
デベロッパーツールで見てたら発見しました。
ありがとうGoogle、ありがとうデベロッパーツール。
これの解決策は

```
=link_to "~", root_path, class: "~"
```
このようにパスを指定してあげるとcssが効くようになります！！！
簡単ですね。

###font-awsomeや画像をリンク化したい時
これはやり方がわからなくてチームの人に教えてもらいました！！！

```
=link_to '' do
  = icon 'far', 'search'
```
こうやってネストさせるとアイコンや画像がリンク化されます！
チームで開発してるとこういう細かい知識がちょっとづつ増えていきます。
それがチーム開発のいいところだなと思っています。

今回は以上です。
小さなことでも自分の成長につながるのでこれからもチーム開発頑張っていきます！
自分もメンバーに何かしら与えられる存在にならねば、、、
次は時間があるときに"font-awsome"について書こうかなと思っています。
なかなか大切なことをメンターさんに教えてもらったので忘れないうちに残さねば！！！
ではまた次の記事で🙋‍♂️
sessionとbefore_actionのまとめ


#session
###sessionとは
主にログイン機能を実装するときに使う。ページを移動しても、ログイン状況を維持することができるもの。

###なぜsessionが必要なのか？
sessionがないと、ページ移動すると情報を引き継ぐことができないから。

インターネットを支えているプロトコルであるHTTPは、ステートレス（状態を記憶しておらず、ただリクエストに対するレスポンスだけで処理する）なもの。
HTTPは、同じリクエストに対しては、常に同じレスポンスを返すというのが、基本的な動作。
今ではステートレスなサイトの方が珍しく、ユーザーに合わせた動きをするのが、一般的。

「アクセスした人が過去に行った操作履歴」を「状態」として保持し、それに合わせてレスポンスを返すステートフルな動きを実現するためのしくみの1つがセッション。 

###sessionの使い方
・セッションにデータを入力するとき
`session[:キー名]　= 値`

・値を取り出すとき
`値　= session[:キー名]`

#before_action

###before_actionとは
該当するクラス内の全てのアクション直前に実行されるメソッド。
各コントローラの全アクションで共通する処理がある場合に使うと便利。
（例）ログイン認証のあるアプリケーション

###before_actionの使い方
コントローラにbefore_actionとして処理したいメソッドを定義して、class定義の下に書く。

`class SampleController < ApplicationController
　　before_action :メソッド名
　　・・・
　　def メソッド名
　　・・・
　　end
end`
備忘録: 多分こういうことかな、reduxのthis.propsバケツリレー回避

**下記の記事にバケツリレーについて言及している部分があります。**
(Mentioning fragment about 'Bucket Relay' at bottom article.)
**そこを自分なりに書いてみました。**
(I wrote it so that I could easily understand for me.)
**stateをどのコンポーネントからも参照できる利点が少し分かった気がします。**
(I feel like a little understand about merit of can reference state from any component.)
https://programmagick.com/chapter?course=react_tutorial&slug=react_basis_props_state#prop_drilling

### 書いたコード(Wrote code)
**中身の`reducers/isLoggedIn.js`のstateを変えることで見た目が一気に変わります。**
(Appearance will change by `state` in `reducers/isLoggedIn.js`.)
https://codesandbox.io/s/reactredux-ke1f1?fontsize=14

※因みにログインボタンは動きません。
Azure IoT Centralアプリケーションでデバイス構成やダッシュボードなどをコピーして使う方法

Azure IoT Centralアプリケーションを使っていて、同じようなデバイス構成やダッシュボード表現で良いが、別なシステムなので別アプリケーションにしたいと思ったときにちょっと迷ったので、そのやり方を共有。

#やりたかったこと
Azure IoT Centralアプリケーションで、デバイステンプレートやダッシュボードの設定を０ベースで毎回作るのが手間なので、何かベースのモノを用意して、それをコピーして使いたい

#やり方
Microsoft公式で紹介されている「アプリケーションテンプレートを使用する」。これがまさにやりたいことでした。
https://docs.microsoft.com/ja-jp/azure/iot-central/howto-use-app-templates

#嵌りどころ
### [管理] 画面の日本語の説明が見切れてる！

今回やりたかったような機能はもともと実装されているかなと思って、まずは実際の管理画面を見たりして探してたのですが、なかなか見つからなくて。それでかなり必死になって調べたのですが、実はちゃんと見るとあったという。ただし、見切れている場合があるので注意しましょう。まずは、ここでちゃんと気が付ければよかったのですが（エク...で止まってるし。。。）
![manage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/eebc095b-f8ac-0be6-e864-e59cd3bcba34.png)

### ダッシュボードが空っぽ

公式の説明を見るとちゃんと書いてあるのですが、特定のデバイスに紐づいた情報を表示するようにしたタイルは以下のように表示されます。

![noResource.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/0656d748-1120-c225-2eed-0a0c93874369.jpeg)

ただ、タイルの編集から「デバイステンプレート」「デバイスのインスタンス」を選択すれば正しく表示されるし、そもそも別システムで使う＝実デバイスは別ものなので、これはこれで正しいと思います。なので、アプリケーションテンプレートはシミュレーションデータを表示するタイルでダッシュボードを作っておくほうが良いと思います。設定しなおせば、タイルに設定してある情報もちゃんと引き継がれていました。

![graph.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/0ed3e0bc-3374-29b9-0b5e-d1169940c8d4.jpeg)

#今後の懸念事項
今回はあるアプリケーションテンプレートから１つの別アプリケーションを作ったので良かったのですが、この手の運用で多くのアプリケーションを作っていくと、どこかのタイミングでおおもとのアプリケーションテンプレートを修正したくなるはずで、その場合、コピーで作った各々のアプリケーションに上手く適応される機能があったらいいのにと思います。ただ、例えば既に実デバイスを紐づけて運用している場合は、コピー元が修正されたからと言って勝手に修正されるのもそれはそれで怖いので、この辺りは地道に管理するしかないのかなと思います。
php-master-changes 2019-08-07

今日は atime / mtime がずれるバグ修正の 7.2 系以降へのバックポート、Win32 用のビルドシステムの修正、pdo_pgsql のテスト修正とビルド修正があった！

# 2019-08-07
## cmb69: Fix [#78282](https://bugs.php.net/bug.php?id=78282): atime and mtime mismatch
- https://github.com/php/php-src/commit/954543cec629c3c5d42c2d62228dd68604bb6b19
- [7.2~]
- [先日の atime / mtime がずれる問題の修正](https://qiita.com/sj-i/items/c25b45bf3fdb90972821#cmb69-fix-78282-atime-and-mtime-mismatch)の 7.2 系以降へのバックポート

## cmb69: Make extension compatibility check more liberal
- https://github.com/php/php-src/commit/886be260cb5236cdef69bb3a1125d5e6860ffe1e
- [7.4~]
- Win32 用のビルドシステムで、ツールのバージョンチェックが不要に厳しかったのをゆるめた

## cmb69: Skip test if ext/json is not available
- https://github.com/php/php-src/commit/ae91f8572e84431aec4856f14c727f5ef8b33eb3
- [7.4~]
- ext/pdo_pgsql で、あるテストの ext/json 無し時のスキップ指定が抜けていたのを修正

## cmb69: Fix detection of pg_config.h
- https://github.com/php/php-src/commit/be794894ef30764e54a8a52fa6c085f3c4a88b14
- [7.4~]
- ext/pdo_pgsql で、Windows でpg_config.h の検出に失敗するケースがあったのを修正
R言語でSQLite


#Rで.dbを吐き出す必要があるときに。
RからSQLiteで

```R
library("RSQLite")

con = dbConnect(SQLite(), "pp.db", synchronous="off")
#指定した名前の.dbにつなぐ。なければ作る。

dbSendQuery(con, "create table hoge(hinmei text, nedan int)")
#テーブルをつくる。なければはじかれる

dbListTables(con)
dbListFields(con, "hoge")
#テーブルがあることを確認。デーブルの定義がされていることを確認。

dbSendQuery(con, "insert into hoge values('りんご', 500)")
dbSendQuery(con, "insert into hoge values('みかん', 300)")
dbGetQuery(con, "select * from hoge")
#送ったものが入っているか確認
dbSendQuery(con, "update hoge set nedan=200 where hinmei='みかん'")
#中の値をupdateしてみる
dbGetQuery(con, "select * from hoge")
dbReadTable(con, "hoge")
#中にはいっているか確認
```

一行ずつ送るのでなく、Rで作成したデータフレームをそのままテーブルに入れる

```R
#一気にデータをテーブルにいれてしまう
dbWriteTable(con, "arrests", USArrests)
dbReadTable(con, "arrests")
#確認
dbGetQuery(con, "select * from arrests limit 3")

```


```R
dbListTables(con)
dbDisconnect(con)
#接続終了
```

#以上
ドキュメントはこちら

```R
#https://www.rdocumentation.org/packages/RSQLite/versions/0.11.4/topics/dbSendQuery-methods
```
CentOS7 + Supersetインストールでハマったポイント

#インストール時参考にしたサイト
https://qiita.com/LowSE01/items/ead0c011e3e1a5eacc0a

#自分の知識前提
情弱。
英語は読める。
サーバー命令？よく分からんがきっとgoogle先生が何とかしてくれる

#ハマりポイント
###(0こ目：普通はハマらない
自分のPythonバージョンとかMySQLのバージョンとか知らなきゃダメなのね
＠初期設定のMySQL develインストール
何も考えずに最新入れちゃった。
(MySQL入れてない人は↓のサイトからDLするかデフォのまま突き進む
https://dev.mysql.com/downloads/mysql/
))

###1つ目はfabmanager。

```
fabmanager create-admin --app superset --username admin --firstname admin --lastname user --email admin@fab.org --password admin
```
で

```
Was unable to import superset Error: cannot import name '_maybe_box_datetimelike'
```
とか言われた。ググったら英語サイトでpandasのバージョン下げろという指示もあったが
より良さげな解決策も書かれていたのでメモ。

インストール先のsuperset/dataframe.pyの中に、2個ある
_maybe_box_datetimelikeをmaybe_box_datetimelikeに書き換える
※先頭のアンダースコアを消すだけの簡単なお仕事

で、fabmanager~の下りを再実行

###２つ目は、joinエラー

```
superset db upgrade
```
が途中で止まる。

```
    "Can't determine which FROM clause to join "
sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Try adding an explicit ON clause to help resolve the ambiguity.
```

ググったら英語のサイトが大量にヒット。
どうやらsqlalchemyのバージョンを下げる必要があり、これは不可避・・

pip自体からインストールする場合1行目から、
pipがもう入ってる(pip -Vでちゃんとバージョンらしきものが表示される)人は2行目から

```
curl -kL https://bootstrap.pypa.io/get-pip.py | python
pip uninstall sqlalchemy
pip install sqlalchemy==1.2.18
pip show sqlalchemy
```
最後のshowでちゃんとsqlalchemyの欄に1.2.18が表示されてることを確認する。
ダメなら2行目から再開。

###3つ目　bz2が読めないエラー
どこでだったかは忘れた
専用develをimportしてpyenv上のpythonを作り直した。

```
yum install bzip2-devel
pyenv uninstall 3.x.x 
pyenv install  3.x.x
```
以上。

ちょっと自宅のMac OS　Mojave10.14.6でインストールして同現象が起きるか試した。
1つ目と2つ目、あと4つ目になる、Flaskのバージョン問題が起きた。

```
ERROR: flask-jwt-extended 3.xx.x has requirement Flask>=1.0, but you'll have flask 0.12.4 which is incompatible.
```

これは↓で回避。

```
pip install Flask-JWT-Extended==3.20.0
```

本当は↓のコマンドで最初から全パッケージのバージョンを全部いい感じにInstall出きたらしい。
なぜ公式のInstallation&Configurationに乗ってないのか・・酷い。


```
pip install -r requirements.txt
```

#成果
・centos7上でsuperset動かせるようになったよ

#野望と所感
・マニュアル読みながらお触りするよ
・Kibanaとの使用感の違いをレポしたいよ
・最近海外でメジャーなデータマイニングツールを見たくなってきたよ

・Elasticsearchに放り込まなくて済む時点でredashやsupersetが好きだ
　Yellowfinは無料枠作ってくださいお願いします。
　情弱クラスタに使用感が30日でなんて分かるわけ無いっす繋ぐだけで終わるっす。
　細々と個人で試してみて良いジャーン仕事で使いたいジャーンとなったら乗り換えるの
　で、良くある機能制限プランのみ無償、unlimitedプラン有償とかにしてほしい。
・RapidminorやOrangeが気になる
・re:dashよりGUI易しいらしい。ぱっと見Kibanaと同レベル・・？

2020年3月追記：未検証情報
Google認証とリンクできるらしい
https://medium.com/@aungmt/superset-with-google-oauth-3ba7a1c1f459
API使える環境ならこうやって値を設定？
https://stackoverflow.com/questions/15547019/how-do-i-find-the-googles-oauth-2-0-client-secret-key-for-developing-chrome-ext
API使えないならannonymousを設定？
https://stackoverflow.com/questions/4705988/how-to-get-consumer-key-and-and-consumer-secret-for-gmail-api
ng-contentで複数の要素を出し分けるselectディレクティブ

##Angularのng-content
AngularでコンポートネントがHTML要素を引数として受け取りたい時、`ng-content`要素をりようします。

```
<div>
  <ng-content></ng-content>
</div>
```

##複数の要素を受け取りたい場合
複数の要素を受け取りたい場合、`select=h2`のように、slectディレクティブにcssセレクターを付与することで`ng-content`の要素を出し分けることができます。

```example.component.html
<div>
  <ng-content select="header"></ng-content>
</div>
<div>
  <ng-content select="footer"></ng-content>
</div>
```

利用例

```html
<example-component>
　 <header>タイトル</header>
　 <footer>フッター</footer>
</example-component>

```

結果


```html
<div>
   <header>タイトル</header>
</div>
<div>
　 <footer>フッター</footer>
</div>　 
```


##参考
https://medium.com/@IMM9O/angular-content-projection-the-complete-guide-45d3bc1692f2
Android で Email アドレスの判定をしてみた件

## 方法

[`android.util.Patterns#EMAIL_ADDRESS`](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/util/Patterns.java) の正規表現を用いて判定します :e-mail:

```kotlin
fun isEmailAddress(address: String) =
            if (address.isEmpty()) false
            else android.util.Patterns.EMAIL_ADDRESS.matcher(address).matches()
```

## 使用例

```kotlin
isEmailAddress("xxx@gmail.com") // true
isEmailAddress("090-0000-0000") // false
```
サーバーレスサービス3社使ってみた感想(GCF,ICF,AWSL)

https://gist.github.com/taroyanaka/297f5e34d23f5ad6f36e7a823a532544

結論:今から始めるならAWS Lamdaは本当にやめとけnpmパッケージ使うならgoogle cloud functionsで使わないならIBM cloud functions一択
※azure functionsは使ったことないから知らないけどもしかしたらめっちゃ良いかもしれない。使ったことあるひといたら所感教えて

理由:
GCFのアドバンテージ
node.jsのnpmパッケージが簡単にスクリプトに添付できる
GCFのディスアドバンテージ
GCFは有料で従量課金で利用料で設定で利用料でアラートが飛ぶ設定にできるけど不安が残るし安いといえば安いが無茶な使い方してアラート取りこぼすと終わる(puppeteer使いまくるとか)。個人的にハラスメントの騒動があってgoogleのプロダクトをできるならボイコットしたいという気持ちがある

ICFのアドバンテージ
無料。ただの無料じゃなくてクレジットカードの登録不要。メールアドレスと名前の登録だけでいける。本当に感動した。あとデプロイが爆速。GCFが1分くらいかかるけどICFは10秒くらい。
ICFのディスアドバンテージ
GCFとは逆にnpmパッケージの添付が手間。不可能ではないけどCLIでツール入れたりzipに固めたりする必要がある

AWS lamdaのアドバンテージ
使ってるひとが多いので安心感がある(安心感があるだけ)。rubyが使える
AWS lamdaのディスアドバンテージ
UIが悪い。Web APIのデプロイがダルい。ダルいどころか上2つで3分でできることが1時間くらいかかる。AWS lamdaを使うにはAWS lamdaのスキルが必要という完全に本末転倒な終わってるサービス(既に使ってるひとは気分悪いだろうけどまじでAWS lamdaはしょうもないサービスだったしEC2の課金でn万円請求されたことは一生根に持っていきたい
Arduinoとraspberrypiでシリアル通信（USB)

#環境
- arduino UNO
-  raspberrypi 3B
-  SSH、または直接コマンドラインが触れるところまでセットアップ済みの前提です。
-  python3

#準備
```bash
sudo raspi-config
```
を実行します。

```
Inter facing options > Serial
```

に行き、シリアル通信を有効にします。

```
<Finish>
```
で終了して

```
sudo reboot
```
で再起動してください。

その後、

```
sudo apt install python-pip
pip3 install serial
```
を実行してください。

#プログラム(ラズパイ側）

基本

```python

import serial
import time

def main():
    ser = serial.Serial('/dev/ttyACM0', 9600)
    time.sleep(2)
    t0 = time.time()

    while True:
        ser.write("114514")
        str = ser.readline()
        val = (str.decode())
        print(val)


if __name__ == '__main__':
    main()


```

これでArduinoからシリアルモニターに出力される内容が受け取れます。また、arduino側に114514と送信しています。
#arduino側

##serialのオプション
```
Serial.read()
```
 送られてきたデーターを１文字分読み込みます。

```
Serial.readline()
```

送られてきたデーターを1行分受け取ります。

```
Serial.write()
```
ASCII文字としてではなくデーターを送ります。

```
Serial.print()
```

 データを1文字送ります。

```
Serial.println()
```
データーを1行分送信します。（改行コード\nまで）


###例

``` 
(略)
if(Serial.available() > 0){ 

                rea = Serial.read();

                else if(rea == 'a'){   
                       //処理
                }
                else if(rea == 'b')
                {   
                       //処理
                }
        }   
(略)
```
この場合はaが送られてきたか、bが送られてきたか確認しています。

#あとがき
調べた限りや知ってる限りで書きましたが、多分まだまだ色々あると思います。

#お疲れ様でした！
ABC136参戦記(A問題~D問題)

先日行われたABC136に参加したのでコンテスト中のあれこれをメモしておこうかと思います。使用言語はpython3、結果は7ペナ、ABCD4完で2236位(順位表情報)でした。コンテストへのリンクはこちら→https://atcoder.jp/contests/abc136

#A - Transfer
容器2から$C$ミリリットル全て容器1に移せる時は$0$を出力、そうでない時は容器1が満杯になるまで水を移せるため$C-(A-B)$を出力すれば良さそうです。提出コードは次のようになりました。

```python:ABC136-A.py
A,B,C = map(int, input().split())
if A-B < C:
    print(C-(A-B))
else:
    print(0)
```

#B - Uneven Numbers
[公式の解説](https://img.atcoder.jp/abc136/editorial.pdf)にあるように愚直にやって間に合うようですがコンテスト中に思いつけず、$N$の桁数が($N\le10^5$のため)$1,2,...,6$のいずれかになることを利用してひたすら場合分けして通しました。が、各場合での処理の仕方や、そもそも場合分けの仕方でミスをしたことが響きWAを6つもいただくことになってしまいました...最終的に通ったコードは次のコードです。

```python:ABC136-B.py
N = str(input())
m = len(N)
ans = int(N) 
if m == 2:
    ans = 9
elif m == 3:
    ans -= 90
elif m == 4:
    ans = 909
elif m == 5:
    ans -= 10000
    ans += 1
    ans += 909
elif m == 6:
    ans = 90909
print(ans)
```

#C - Build Stairs
各マスの高さは1しか減らすことができないため、$H_i$と$H_{i+1},H_{i+2},...H_N$の大きさを比べて$H_i$が２以上大きくなるようなことがあればNo,なければYesを出力すれば良さそうです。しかし、これをそのまま実装すると計算量のオーダーが$O(N^2)$となってTLEしそうです。そこで、$i$までの$H$の最大値を保持し、それと$H_{i+1}$の値を比較して見れば$O(N)$くらいに計算量が落とせそうだと言うことに気づきます。提出したコードは次になります。

```python:ABC136-C.py
N = int(input())
H = list(map(int, input().split()))
a = H[0]
for i in range(1,N-1):
    a = max(H[i], a)
    b = H[i+1]
    if a - b >= 2:
        print("No")
        exit()
print("Yes")
```

#D - Gathering Children
$10^{100}$回の移動という文字列から一見難しそうですが、サンプルを見てみるとRLの部分に子供が集中しそうだなと言うことがわかります。そこで2つ目のサンプルの場合について少し実験してみます。
<img width="538" alt="ABC136-D解説.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478399/6175f1dd-1b2e-3e24-bad5-85e9a20a4880.png">
このような感じで遷移していきそうです(わかりづらくて申し訳ないです...)。RLのところでは各回ごとに子供が交換されていきます。偶奇性に注目してみるとRL付近のR,Lが偶数個離れているか奇数個離れているかによって最終状態での位置が確定しそうです。具体的には

* "RL"の"R"から左に偶数番目のRと"RL"の"L＂から右に奇数番目のLの子供は、最後"RL"の"R"のところにいる。
* "RL"の"R"から左に奇数番目のRと"RL"の"L＂から右に偶数番目のLの子供は、最後"RL"の"L"のところにいる。

となります(大分わかりづらい表現になってしまいました...)。このように考えて実装して通ったコードが次です。

```python:ABC136-D.py
S = str(input())
n = int(len(S))
ans = [str(0) for i in range(n)]
cntLo = 0
cntRo = 0
cntLe = 0
cntRe = 0
for i in range(n-1):
    if S[i] == "R" and S[i+1] == "L":
        j = 1
        k = 1
        while i-j >= 0 and S[i-j] == "R":
            if j % 2 == 0:
                cntRe += 1
            else:
                cntRo += 1
            j += 1
        while i+1+k <= n-1 and S[i+1+k] == "L":
            if k % 2 == 0:
                cntLe += 1
            else:
                cntLo += 1
            k += 1
        ans[i] = str(cntRe + cntLo+1)
        ans[i+1] = str(cntRo + cntLe+1)
        cntLo = 0
        cntRo = 0
        cntLe = 0
        cntRe = 0
print(" ".join(ans))
```
(実は最初提出したときkと打つべきところを一箇所jと打ってしまいTLEをもらいました...)

#反省
今回はD問題まで通すことができました。時間配分は大体A-5分、B-25分、C-10分、D-50分という感じでした。とにかくB問題のミスが痛かったですね...最近はABを10~15分くらいで通せていたので予想外に時間とペナルティを取られて焦りました...冷静に問題を見ていきたいです...EFに関しては勉強不足でよくわからないのでこれから精進していきたい所存です。
今回が初投稿なので至らないところも多かったかと思われますが、読んでいただきありがとうございました!何か改善点などありましたらご指摘いただけると幸いです。
PostgreSQLでテーブル間でUPSERTを行う

# 【PostgreSQL】テーブル間でUPSERT

在庫マスタ ( 商品コード, 在庫数 ) <- 商品コードが主キー

のようなテーブルを

入庫 ( 商品コード, 入庫数 )

のテーブルのデータで 更新したい場合の話です。
試したのがPostgreSQL 11.2

Oracle, DB2, SQL ServerはMERGE文をお使いください。
細かいところで記述の仕方が異なるところ、動作の違いがそれぞれありますが。

## 【結論】

```

INSERT INTO 在庫マスタ
    SELECT * FROM 入庫
    ON CONFFLICT( 商品コード ) DO UPDATE
        SET 在庫数 = 在庫マスタ.在庫数 + EXCLUDED.在庫数

```
## 注意点

PostgreSQLの場合、UPDATEのSETの左辺についてはテーブル修飾は不可です。
（ SQL規格上UPDATE文はそのように規定されている ）

```
SET 在庫マスタ.在庫数 = 在庫マスタ.在庫数 + EXCLUDED.在庫数
```

とは記述できません。
他方

```
SET 在庫数 = 在庫数 + EXCLUDED.在庫数
```

もエラーになります。

あと、
EXCLUDED.在庫数
は
EXCLUDED.入庫数

ではないのに注意。
（最初MERGE文からの類推でうまく動かずはまりました）

## MySQLの場合

```
INSERT INTO 在庫マスタ
    SELECT * FROM 入庫
    ON DUPLICATE KEY
        UPDATE 在庫数 = 在庫数 + 入庫.入庫数
```

で行けるようです。
似てながら微妙に違う。
VSCodeのタスクでAnaconda仮想環境を使う（Windows）

WindowsにおけるVSCodeでAnaconda(Miniconda)の仮想環境を使うときのちょっとしたTipsです．ここでは Miniconda3 を `C:/Miniconda3` にインストールしたものとして説明しています．

Pythonの開発環境であれば，インタープリターとしてAnacondaの仮想環境を選択することができるので問題はないのですが，Pythonを使わないで Anaconda の仮想環境を使おうとすると，少し設定が必要です．AnacondaはPython以外でも仮想環境として便利なので，VSCodeのタスクと連携させて効率化出来たらいいなと思っています．また，環境変数`PATH`に登録するのは手軽ではありますが，しないことを前提にしています．

VSCodeのターミナルにおいてAnaconda (Miniconda) の仮想環境を使うときは `terminal.integrated.shell.windows` と `terminal.integrated.shellArgs.windows` に以下のように設定する方法がよく見つかります．

```
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe",
"terminal.integrated.shellArgs.windows": ["/K", 
  "C:\\Miniconda3\\Scripts\\activate.bat", 
  "C:\\Miniconda3"],
```

これでターミナルを開くと仮想環境が `base` になっている状態になります．

![2019-08-08_01h05_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133092/55a1cccf-1015-da3e-b4ef-4ac5f02f3fe6.png)

しかし，この設定をするとVSCodeのタスクを実行すると引数が合っていなくて動作しなくなることがあります．例えば，タスクの種類が `npm` でスクリプトが `install` の場合，実行すると

![2019-08-08_01h05_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133092/f911a817-2a0c-43bf-12ba-1a51185bfaf5.png)

これは，実際には

```
C:\Miniconda3\Scripts\activate.bat C:\Miniconda3 /d /c npm install
```

が実行されていて，`activate.bat` の引数が不正になってしまっています．
そこで，次のようなバッチファイルを使って対応します．適当な場所に例えば `C:\Miniconda3\vscode_conda.bat` というファイルを作成します．そのファイルの中身は次のようにします．


```
@echo off
call C:\Miniconda3\Scripts\activate.bat C:\Miniconda3
setlocal enableDelayedExpansion
set command=
:loop
if "%1"=="/d" goto :next
if "%1"=="/c" goto :next
if "%1"=="" goto :confirm
if "!command!"=="" (
    set command=%1
) else (
    set command=!command! %1
)
:next
shift
goto :loop
:confirm
if not "!command!"=="" !command!
endlocal
```

簡単に説明すると，まずAnacondaの仮想環境を有効にしてから，引数の `/d /c` 以降をコマンドとして再実行しています．
そのため，このやり方だと `/d /c` オプションが無視されます．

これを `terminal.integrated.shellArgs.windows` に設定します．

```
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe",
"terminal.integrated.shellArgs.windows": ["/K", "C:\\Miniconda3\\vscode_conda.bat"];
```

これで，ターミナルを開いても，タスクを実行してもAnacondaの仮想環境上で動作するようになります．

この方法以外にもっとスマートなやり方がありましたら，教えてもらえると助かります．
nodemonとrufoでRubyスクリプトを効率的に開発するための設定

メモです。

`nodemon`でRubyスクリプトをホットリロードしつつ、
`rufo`で綺麗にフォーマットかけながら開発するための設定について記載しています。

## nodemonのインストール

nodemonをインストールするためには、npmが必要になります。
npmは[Node.js](https://nodejs.org/ja/)をインストールすると使えるようになります。

```
npm install -g nodemon
```

## rufoのインストール

自動フォーマットのために`rufo`をインストールする。
Ruby2.4.5以上が必要だったのでバージョン確認しておきます。

```
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]

$ gem install rufo
```

## VSCodeにExtensionをインストール

VSCodeにMarketplaceから[Rufo - Ruby formatter](https://marketplace.visualstudio.com/items?itemName=jnbt.vscode-rufo)をインストールします。

## 動作確認

```
# スクリプトの変更をnodemonで監視実行できるように起動しておく。
# ふつうにruby index.rbでもよい。
$ nodemon index.rb
```

以下のように汚い感じでスクリプトをつくります。

```index.rb
def world
puts "hello"
  end


        world
    world
world
```

上の状態で保存すると、綺麗にフォーマットされます。

```index.rb
def world
  puts "hello"
end

world
world
world
```

このときのnodemonを立ち上げているコンソールは以下のようになっています。
エディタで保存するたびに、再実行されます。

```
[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `ruby test.rb`
hello
hello
hello
```

おわり。
Go言語のアプリケーション設定・環境変数をStructにまとめる



# Go言語で環境変数を読み出す

Go言語では標準パッケージから簡単に環境変数を読み出すことができます。

```go
fmt.Println(os.Getenv("HOME"))
```

しかし、往々にして環境変数がないときのデフォルトを設定する事があります。
その場合はこのように書きますが、これを環境変数分用意するのはなかなか骨が折れます。

```go
home := os.Getenv("HOME")
if home == "" {
  home = "/home/default/place"
}
fmt.Println(home)
```


# caarlos0/envを使ってStructに読み出す

そこで活躍するのが [env](https://github.com/caarlos0/env) というライブラリです。
環境変数から読み出したい情報はStructにまとめておき、tagに情報を付与することで
デフォルト値の設定や必須設定等を行えます。

また、読み出し先のStructを定義しているだけなので、
定義するStructに他のアプリケーション設定を足したり、
メソッドを生やしたりすることも勿論できます。

```go

package main

import (
    "fmt"

    "github.com/caarlos0/env"
)

type Config struct {
    Home         string   `env:"HOME"`
    Port         int      `env:"PORT" envDefault:"3000"` // デフォルト値の設定
    IsProduction bool     `env:"PRODUCTION"`
    Hosts        []string `env:"HOSTS" envSeparator:":"` // 配列も読める
    SecretKey    string   `env:"SECRET_KEY,required"` // 必須設定も可
    Notag        string   // タグ無しにすれば環境変数のない設定も同居できる
}

func main() {
    cfg := Config{}
    env.Parse(&cfg) // パースすると環境変数から値が読み出される
    fmt.Println(cfg)
}
```

多分実用する段階であればmainパッケージに置くことはないと思うので、
configパッケージにシングルトンでConfigオブジェクトを保有しておくなり、
ロード関数を作って毎回読み出すなり色々工夫してみて下さい。
TravisCI タグをプッシュした時だけ動くビルドステージの設定


tagを作ったときだけデプロイを走らせたい!!って時の設定をメモっときます。

特に↓にひっそりいる `tag IS present` が分からなくて詰まった。。
https://docs.travis-ci.com/user/conditions-v1
> Predicates:
>
> > tag IS present
> > tag IS blank

設定例は下の方に書いときます。

# 設定のポイント

## ビルドステージを実行するかの設定
```
if: tag IS present
```

https://docs.travis-ci.com/user/conditions-v1

- ビルド、ステージ、ジョブをif条件で実行しないようにできる
- `tag` には現在のタグ名が入る
    - `present`を指定することでタグがある場合だけ動く
    - `blank`にすればタグが無いときに動く
- 他にも色々条件があるみたいなので必要ならドキュメントを漁る


## デプロイのステップを実行するかの設定
```
on:
  tags: true
```

https://docs.travis-ci.com/user/deployment
ドキュメントを読んでみた

- `tags: true`の場合
    - `$TRAVIS_TAG`が設定されている場合だけ動く
    - deploy前に`$TRAVIS_TAG`を明示的に指定すれば動くっぽい（試してない）
    - `tags: true`で`$TRAVIS_TAG`が設定されている場合は`branch`の条件は指定されていても無視される
- `tags: false`の場合
    - `$TRAVIS_TAG`が空の場合 **のみ** 動く
    - `branch`の条件は指定されていても無視される
- `tags`未設定 or `true/false`以外
    - `$TRAVIS_TAG`の値は無視される
    - `branch`の条件は指定されていればその条件を使う

## scriptのスキップ設定
```
script: skip
```

何かビルド前に実行したいスクリプトがある場合は`skip`は不要だが
特に何もやることがない場合は`skip`を設定しないと以下のようなエラーがでた

```console
$ make test
make: *** No rule to make target 'test'.  Stop.
The command "make test" exited with 2.
```

# 設定例
```yaml
stages:
  - test
  - deploy

jobs:
  include:
    - stage: test
      name: Test
      script:
        - echo 'test stage'

    - stage: deploy
      name: Deploy
      ### ビルドステージを実行するかの設定がココ
      if: tag IS present
      script: skip
      deploy:
        provider: s3
        ### デプロイのステップを実行するかの設定がココ
        on:
          tags: true
      before_deploy:
        - echo 'before deploy'
```

↑では`jobs`に書いたけど`stages`に書くこともできる

```yaml
stages:
  - test
  - name: deploy
    if: tag IS present
```
Nuxt.js で medium-editor を使う方法（SSR 対応など）

## 概要
Nuxt は基本 SSR しているためブラウザの`document`オブジェクトなどが読み込めず、一部ライブラリが使えない。

例えば [medium-editor](https://github.com/yabwe/medium-editor) は`document`オブジェクトを参照しているため、なんとかして使えるようにする必要がある。

この記事ではその方法を解説する。

## 解説

`.vue`ファイル内の script タグ内で、`process.browser`を呼び出すとブラウザ環境かどうか bool 値で返ってくる。

これが true のときに、`document`オブジェクトを呼び出すようなライブラリを呼び出す。

例：

```js
const MediumEditor = process.browser ? require('medium-editor') : ''
```

その後、Vueインスタンスがマウントした後のタイミングなどで読み込んだライブラリを実行する。

例：

```html
<template>
  <div ref="editable" />
</template>

<script>
const MediumEditor = process.browser ? require('medium-editor') : ''

export default {
  // 省略
  mounted() {
    this.initEditor()
  },
  methods: {
    initEditor() {
      const elements = this.$refs.editable
      new MediumEditor(elements, {
        spellcheck: false
      })
    }
  }
}
</script>
```

## 参考

- [ripe-thumb](https://glitch.com/edit/#!/ripe-thumb)の VueEditor.vue
slackbot備忘録 ~基本編１~

# はじめに
初投稿です！

pythonを使ってslackbotを作成した備忘録
Botユーザー作成~簡単なやり取りについて記載

# 作業開始！

### slack側
1. メニュー ⇒ その他の管理 ⇒ app管理で「appディレクトリ」に飛ぶ
![pic1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/a37edb8d-72e0-c25e-f22e-8fa544275e90.png)
2. ヘッダーの「App ディレクトリを検索」に"Bots"と入力し、ロボットアイコンをクリック
![pic2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/10aaed66-d63f-36c9-2fd7-4de766fe9b62.png)
3. 「設定を追加ボタン」を押し、ボットユーザー名を入力して「ボットインテグレーションを追加する」ボタンを押す
4. 無事作成されたら、APIトークンをメモ（任意で「アイコン」「氏名」「個のボットの機能」を編集）
![pic3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/bded26fd-72b0-eeaa-767d-1fba6d8139fd.png)

### python側
slackbotパッケージインストールする

```
pip install slackbot
```
下記のようなディレクトリ構造にする

```
slackbot
　－ run.py               # slackbot起動用ファイル
　－ slackbot_settings.py # slackbot設定用ファイル
　－ plugins
　  　 － __init__.py     # モジュールを示すファイル（中身は空）
　  　 － my_mention.py   # slackbot機能用ファイル
```

```python:run.py
# coding:utf-8
from slackbot.bot import Bot

def main():
	bot = Bot()
	bot.run()

if __name__ == "__main__":
	print('start slackbot')
	main()
```

```python:slackbot_settings.py
# coding:utf-8

# botアカウントのトークン指定
API_TOKEN = '先ほどメモしたトークンを入力'

# どの対応にも当てはまらない場合の対応
DEFAULT_REPLY = '何を言っているかわかりません。'

# プラグインスクリプト
PLUGINS = ['plugins']
```

cmdでrun.pyを起動
![pic4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/66f29e90-762a-b224-416f-1eb3bd49b8f2.png)

slackでbotにダイレクトメッセージ，channnel内でメンションするとbotが反応
現時点ではデフォルトメッセージしか返ってこない

* ダイレクトメッセージ

![pic6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/b37f3bfe-8e75-53db-fb17-52a403d275a7.png)

* channelメンション

![pic7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/5077f23a-f9c2-3ce3-bdbf-95a190f0724a.png)

my_mention.pyでいろいろ試してみる

```python:my_mention.py
# coding:utf-8

from slackbot.bot import respond_to     # @botname　又は ダイレクトメッセージで反応
from slackbot.bot import listen_to      # チャネル内発言で反応
from slackbot.bot import default_reply  # 該当する応答がない場合に反応するデコーダ

# @respond_to('sample')  bot宛に「sample」を送ったとき
# @listen_to('sample')   botが所属するchannel内で「sample」を送ったとき
# @default_reply()       slackbot_settings.pyで設定したDEFAULT_REPLYと同じ動き
#                        どちらも入力がある場合、基本的にはこちらが優先される

# message.reply('message') @発信者名: message とメッセージを送信する
# message.send('message')  message とメッセージを送信する
# message.react('emoji')   発言者のメッセージにリアクションする
#                          ':'は使わない

@respond_to('こんにちは')
def respond_func(message):
	message.reply('こんにちは！')

@respond_to('おやすみ')
def respond_func(message):
	message.react('x')
	message.reply('まだ夜じゃないよ！')

@listen_to('お腹すいた')
def listen_func(message):
	message.send('一緒にラーメン食べにいく？:ramen::ramen:')
```

こんな感じになった
![pic8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/b8cb477c-759d-5569-d4ac-b6d21040bc22.png)

respond_toなどの中のトリガー文字は含まれていれば（部分一致であれば）発動するみたい
次回はもう少し細かい設定をしていく( ˘ω˘ )
Redmine 初期設定 の 方法 ～WindowsでRedmineを建てよう②～

# 目的
Redmineを立てた後の初期設定を記載する。  
※本手順で立てたRedmineのテーマのプラグインを入れる方法は[こちら](https://qiita.com/miriwo/items/3ca8078af11de937b9c7)
※簡単なRedmineの立て方は[こちら](https://qiita.com/miriwo/items/0c687d1893bbc1e8f820)
※筆者が参考にしたサイトは[こちら](http://redmine.jp/tech_note/first-step/admin/)
※本記事は足りない内容が多いです。どんどん追記する予定です。

# この記事のターゲット
- Redmineを立てたが何をしたらいいか分からない方
- 構築が完了し早くRedmineを使用したい方

# 基本的な初期設定項目の説明
※Redmineの設定はすこし独特なところがあります。今は理解できなくても運用していけば自然と分かってきます。完全に理解しようとしなくてOKです。
※下記の内容は初期設定する項目を筆者の主観でまとめた物です。わかりにくい文言がありますがスルーしちゃってください。
※詳しく知りたい方は前述した[筆者が参考にしたサイト](http://redmine.jp/tech_note/first-step/admin/)を閲覧してください。

1. ステータスの追加
    - Redmineで管理する作業(チケット)の状態を示すもの
    - 未着手、実施中、保留、完了、キャンセルなど
1. トラッカーの追加
    - トラッカーは設定の保存を行うもの
    - トラッカーごとに新規チケットのフォーマットを設定できたり、独自のステータスを追加したりできる
    - トラッカーの作成意義はタスク別でカスタム新規チケットフォーマットを使用したいときやタスク別で独自ステータスを追加したいときなど
    - トラッカーが少ない方が管理が楽になる
1. ロールの追加
    - ロールはユーザにわり当てる権限を設定する
    - デフォルトだと管理者、開発者、報告者、非メンバー、匿名ユーザーが設定されている
    - ロールに対して権限を設定しユーザがどのロールに属するかによって間接的にユーザの権限を設定している
1. ワークフローの設定
    - チケットの作成から完了までの流れを決める機能
    - ステータスをどの様に変更するか、どの項目を必須入力とするかなどをロールとトラッカーの組み合わせ毎に設定できる
    - ワークフローの設定にはロール、トラッカー、ステータスの設定が完了していないとできない
    - Redmine全体の設定のため、すべてのプロジェクトに影響する
    - 管理者権限をもつユーザのみ操作可能
    - ロール数×トラッカー数存在する
    - どの指定されたステータスからのステータス変更を設定できる(例えば作業者は未着手ステータスは一気に完了ステータスに変更できない様にするとか)
1. ユーザの追加
    - Redmineを使用するユーザを設定する
    - 設定方法は「管理」 → 「ユーザー」 → 「新しいユーザー」 → 「必要事項を入力」 → 「作成」 
1. プロジェクトの追加
    - 設定方法は「管理」 → 「プロジェクト」 → 「新しいプロジェクト」 → 「必要事項を入力」 → 「作成」
1. プロジェクトメンバの追加
    - 作成したプロジェクトにユーザを追加する  
    - 設定方法は「管理」 → 「プロジェクト」 → 「プロジェクト名をクリック」 → 「メンバータブ」 → 「新しいメンバー」 → 「追加する人を選択」 → 「どのロールで追加するか選択」 → 「追加」  
    ※ロール毎の追加が必要

# 運用するためのおすすめ設定
1. 全世界への情報公開をやめる
    - 管理 → 設定 → 認証の認証が必要の部分のステータスを「はい」 → 画面下の「保存」をクリック  
    - 管理 → 設定 → プロジェクトの「デフォルトで新しいプロジェクトは公開にする」のチェックを外す → 画面下の「保存」をクリック  

1. メールアドレスの複数追加を禁止する
    - 管理 → 設定 → ユーザーの追加メールアドレス数の上限を「1」 → 画面下の「保存」をクリック  

1. ユーザーによるアカウント削除を許可しない
    - 管理 → 認証 → ユーザーの「ユーザーによるアカウント削除の許可」のチェックを外す → 画面下の「保存」をクリック

1. 言語を日本語にする
    - 管理 → 設定 → 表示 → 「デフォルトの言語」を「Japanese(日本語)」 → 画面下の「保存」をクリック
    - 管理 → 設定 → 表示 → 「ユーザー名の表示形式」を「姓 名」となっているものを選択 → 画面下の「保存」をクリック

1. 添付ファイルとリポジトリのエンコーディング(文字バケ対策)
    - 管理 → 設定 → ファイル → 「添付ファイルとリポジトリのエンコーディング」に`UTF-8,CP932,EUC-JP`と記載 → 画面下の「保存」をクリック

1. チケットの記載方法の設定
    - 管理 → 設定 → 全般 →「テキスト形式」を「Markdown」→ 画面下の「保存」をクリック  
    ※運用開始前に変更しないと利用者が混乱する

1. チケット添付ファイルのサムネイル表示
    - 管理 → 設定 → 表示 → 「添付ファイルのサムネイル画像を表示」のチェックを入れる → 画面下の「保存」をクリック

1. 新規チケット発行時の有効になる項目で必要ないものはチェックを外す  
    - 管理 → 設定 → 表示 → 必要ない項目のチェックを外す → 画面下の「保存」をクリック

1. チケット番号のみで関連付けができるようにする  
    - 管理 → 設定 → リポジトリ → コミットメッセージ内でのチケットの参照/修正の中の「参照用キーワード」を`refs,refersnces,IssueID,*`に書き換える → 画面下の「保存」をクリック  
`#チケット番号`とするだけで関連づけすることができる。

1. Redmineの見た目のデザインの変更  
    - 管理 → 設定 → 表示 → 「テーマ」をお好みのものに設定 → 画面下の「保存」をクリック  
    ※保存しないと反映されない  
    ※運用開始前に変更しないと利用者が混乱する可能性あり
helmで選択中の項目をコピー(kill-ringに追加)したい

# はじめに

helmを使っていて、helm bufferに表示される候補一覧をコピー(kill-ringに追加)できないことで、偶にイラッとすることがありました。

M-xして表示されたコマンドをコピーして"describe-function"で調べたり、
helm-gtagsで表示されるファイル名と行数をコピーしてメモに残したり、
したいのにやり方が分からなかったので調べました。

# 環境
環境は以下です。

- Windows10
- Emacs26.1
  [Emacs for Windows](http://cha.la.coocan.jp/doc/NTEmacs.html)で公開されている「簡易IME対応(2)版(ファイルサイズ削減・tif画像表示対応・TLS対応)」を使用
- helm               20190527.1253
- helm-core          20190806.1437

# helm-yank-selectionとhelm-kill-selection-and-quit

"helm.el"に以下の2つのコマンドを見つけました。

```lisp:helm.el
    (define-key map (kbd "C-c C-y")    'helm-yank-selection)
    (define-key map (kbd "C-c C-k")    'helm-kill-selection-and-quit)
```


"helm-yank-selection"はhelmで選択中の名前を入力欄に貼り付けてくれる。
"helm-kill-selection-and-quit"はhelmで選択中の名前をkill-ringに追加してhelmを終了する。
helmの正しい用語を知らないので、大雑把な説明で申し訳ない…

# init.elの修正

とりあえず、上の2つのコマンドがわかったのでそのまま使用するでもOKなのですが
キーバインドが2アクションなのでinit.elには以下の2行を追加しました。

```lisp:init.el
(define-key helm-map (kbd "C-<tab>") 'helm-yank-selection)
(define-key helm-map (kbd "M-w") 'helm-kill-selection-and-quit)
```

# おわりに

追加したキーバインドにちょっと違和感もありますが
とりあえずはこれで試して見ようと思います。
そもそも根本的なことを勘違いしている様な気もしているのでご指摘があればお願いします。

# 参考リンク
https://abicky.net/2014/01/04/170448/
http://garin.jp/2017/09/08/2017-09-08-220346.html
rbenv install --list を更新する

## 方法１: homebrewを使っている場合

```
$ brew update && brew upgrade ruby-build
```

## 方法２: rbenv pluginとして使っている場合

```
$ cd "$(rbenv root)"/plugins/ruby-build && git pull
```

---

あまり意識していなかったですが、rbenvのプラグインとして、[ruby-build](https://github.com/rbenv/ruby-build)といういものを使っていたようで、方法１で更新できずになぜだろう？と思っていたところ、このリポジトリを見つけ、解決に至った次第です。

（リポジトリのREADMEを読むと、上記の内容が把握できます）
【非推奨】ずぼらな人間のwindows10シャットダウンの方法紹介【あくまで非推奨】

※タイトルにもある通り非推奨なので、真似するときは自己責任でお願いします。
※特にOSのシャットダウンというデリケートな内容ですので、慎重にやったほうがいいとは思います。

#序文（言い訳）
<<これは初投稿です。>>

Qiita(読み方はわからない)の、とある記事に高評価をつけたいがためにQiitaのアカウントを作成した。せっかくなので何か書いてみようと思った次第である。記事の最初に言い訳から入るのはプレゼンテーションでは一番よくないことではあるが、さすがにそうせざるを得ないくらいの知識、動機しかないのでご了承ください。


#Windows10のシャットダウンについて
まとめだけ見たい人は⇒[まとめ](#まとめ)
##目的

普通にシャットダウンすると、手順が面倒なので、どうにかワンクリックくらいでシャットダウンをしたい。

##一般的な方法

* [スタートメニュー]⇒[電源マーク]クリック⇒[シャットダウン]クリック
* デスクトップにフォーカスを当てる⇒[Alt+F4]入力⇒シャットダウン選択して[OK]クリック

##今回試した方法（時系列）
###バッチファイル作成 ⇒ 失敗

```bat:shutdown.bat
shutdown /s /t 0
```

上記のbatファイルを作って実行させた。

結果：失敗です。なんかぁ、コマンドプロンプトが開かさってぇ、shutdownコマンド投げてるんすけどぁ、シャットダウンできなくてぇ、またshutdownこまんどなげてぇ、の繰り返しになっちゃってぇ、結局 [Ctrl+C] でキルするしかなかったんすよねぇ。理由は不明っすねぇ。

###PowerShellで実行 ⇒ 成功
batファイルのみではできなかった。正直これだけでできると思ってたのに、期待を裏切られたショックで変な口調になってしまった。しかも北海道弁が出てしまっている。
多分batファイルのみでもできる方法はあるとは思うけど、調べるのがめんどくさかったのでps1ファイルを作ってそっちで実行することにした。

```ps1:shutdown.ps1
shutdown /s /t 0
```
上記のフォルダをデスクトップに置いて実行。

このファイルはきちんとシャットダウンをしてくれることが分かった。
しかし、ps1ファイルをダブルクリックしてもエディタが開いてしまう。

こういう時、これを読んでいる人はどうするんですかね？なんか設定で変えられるんでしょうか？私はbatから呼び出すのが一番簡単だと思っているのですがどうなんだろう。。。

```bat:shutdown.bat
powershell ./shutdown.ps1
```

上記のファイルを作成し、shutdown.ps1とおなじデスクトップに置く。

あとは、このbatファイルをダブルクリック。
するとどうでしょう。シャットダウンが成功したではないですか！

よしこれからはシャットダウンの時間が短縮されるぞっと。

##後からWEBで見た情報
ショートカット作れるらしいですね、コマンドって！


[https://pc-karuma.net/windows-10-shortcut-shutdown/](https://pc-karuma.net/windows-10-shortcut-shutdown/)

上の記事を見ました。「ああ、なるほど」と思いました。

#今後の展望
上記紹介した情報は、あまりにも雑なシャットダウン方法なので（一般的なネットカフェのパソコンの電源ボタンを押したときの挙動と同じ）せめて開いてるウインドウを閉じてからシャットダウンしたい。

#まとめ
<div id="matome"></div>
windows10のをシャットダウンを楽にやりたい、という動機で、bat、ps1ファイルを作りました。

```ps1:shutdown.ps1
shutdown /s /t 0
```

```bat:shutdown.bat
powershell ./shutdown.ps1
```

上記の2ファイルを作り、デスクトップに配置。そして、shutdown.**bat**のほうをダブルクリック。そうするとシャットダウンできます。

#終わりに
ページ内リンク動作してるか心配です。
mblock3： avrdude: stk500_recv(): programmer is not responding

## mblockでのarduinoへのアップロードエラー

stk500_rev()の下記エラーが出てアップロードできない場合の解決方法の１つを記載。

```
C:\Program Files (x86)\mBlock\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\mBlock\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM6 -b57600 -D -Uflash:w:C:\Users\tsuyo\AppData\Local\Temp\build7167667021832597049.tmp/project_Demo_Avoid_Obstacle7_4.cpp.hex:i 

avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\mBlock\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM6
         Using Programmer              : arduino
         Overriding Baud Rate          : 57600
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xa6
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xa6
avrdude: stk500_recv(): programmer is not responding
```

##原因
arduinoのアップロード速度の違い
 旧arduino nano: 57600 bps
 新arduino nano: 115200 bps

##対策
下記ファイル内のupload.speed(146行目)を57600から115200に変更
\Program Files (x86)\mBlock\Arduino\hardware\arduino\avr\boards.txt

Arduino Nano w/ATmega328(140行目以降)

修正前
nano.menu.cpu.atmega328.upload.speed=57600

修正後
nano.menu.cpu.atmega328.upload.speed=115200