OmniAICreator/Qiita-1.07M huggingface dataset:
golangのチュートリアルのメモ


### Goのチュートリアルの内容を箇条書き
1 大文字で始まる名前は、外部参照可能。小文字で始まるものは外部からアクセスできない
2 関数の引数の変数名の後ろに型名を書く

```xxx.go
func test(x int, y int) int {
// この同じ形の場合下記もOK
// func test(x, y int) int {
	return x + y
}
```
3 複数の戻り値の場合

```xxx.go
func test(x int, y int) (int, int) {
	return x + y
}
```
4 複数の戻り値の場合（戻り値に変数名を設定）

```xxx.go
func test(sum int) (a, b int) {
        a = sum * 4 / 9
        b = sum - x
        // 戻り値に変数名を設定した場合returnに何も書かずに戻すことができる
        return
}
```
5 変数の宣言

```xxx.go
// 変数の宣言
var i int
//初期化も同時に行う
var i, j int = 1, 2
//暗黙的な宣言
i := 3
// 関数の外では、varが必要で暗黙的な宣言は利用できない

//型を定義しない場合
i := 42           // int
f := 3.142        // float64
g := 0.867 + 0.5i // complex128

//定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみ
//定数は := を使って宣言できない
const Pi = 3.14
```

6 初期値がない場合、0値がセットされる

```
数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))
```

7 型変換
Goでの型変換は明示的な変換が必要

## ポインタを使う場合
ポインタを考えて引数や戻値を設定する必要がある

```main.go
func main() {
    i := 0
    test(i)
    fmt.Println(i) // 0
}

func test(i int) {
    i = 10
}
```

上記はmain()のiにも反映させる場合

```main.go
func main() {
    i := 0
    test(&i) //&を付ける
    fmt.Println(i) // 0
}

func test(i *int) { //*を付ける
    i = 10
}
```

## sliceが引数の場合
array指定すると下記のように記述しないとエラーになる

```
func main() {
    sampleArray := [3]int{}   // arrayを定義
    testSlice(sampleArray)    // これはエラー
    testSlice(sampleArray[:]) // これは正常 ← 戻り値はsliceになるから正常
}

func takeSlice(s []int) {}
```




## 参考
[A Tour of Go](https://go-tour-jp.appspot.com/list)
ESLint v5.13.0

前 [v5.12.0] | 次 [v5.14.0]

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v5.13.0 has been released: <a href="https://t.co/3MpPSP5Cva">https://t.co/3MpPSP5Cva</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1091394925210619904?ref_src=twsrc%5Etfw">February 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 5.13.0 がリリースされました。
小さな機能追加とバグ修正が行われました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

## [#11338]: `globals` の設定で文字列定数を使えるようになりました。

`globals` の設定で文字列定数を使えるようになりました。従来は `true` で読み書き可能、`false` で読み取り専用を意味していましたが、これが分かりにくかったためです。

```json-doc:.eslintrc.json_(従来)
{
    "globals": {
        "window": false, //← false は読み取り専用な変数である事を表す
        "onclick": true  //← true  は書き込み可能な変数である事を表す
    }
}
```

```json-doc:.eslintrc.json_(新)
{
    "globals": {
        "window": "readable",  //← readable  は読み取り専用な変数である事を表す
        "onclick": "writeable" //← writeable は書き込み可能な変数である事を表す
    }
}
```

また、共有設定など、上流で定義された変数を無効化する方法が追加されました。

```json-doc:.eslintrc.json
{
    "globals": {
        "Object": "off" //← off は上流で定義された変数を無効にする
    }
}
```



# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

特になし。

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

特になし。

[v5.12.0]: http://qiita.com/mysticatea/items/a9a43583c7877853712a
[v5.14.0]: http://qiita.com/mysticatea/items/79df343e19f8608f620a
[#9999]: https://github.com/eslint/eslint/issues/9999
[#11338]: https://github.com/eslint/eslint/issues/11338
[xxxx]: http://eslint.org/docs/rules/xxxx

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
レジストリでキー配列変更

- http://bigbuddha.hatenablog.jp/entry/2017/01/04/072943
- http://yanor.net/wiki/?Windows%2FTIPS%2F%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%A6CAPSLOCK%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E5%A4%89%E6%9B%B4

1.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
2.「新規」「バイナリ値」を作成「Scancode Map」
3.Scancode Map
<pre>
0000 0000 0000 0000
0200 0000 5ce0 7000
0000 0000
</pre>
Win（右）キーの機能をカナキーに割り当てる。リトルエンディアンのため、スキャンコードが逆になる。

スキャンコード一覧
--
<pre>
Alt(右)           E038
Alt(左)           38
Ctrl(右)          E01D
Ctrl(左)          1D
Shift(右)         36
Shift(左)         2A
Win(右)           E05C
Win(左)           E05B
Application       E05D
NumLock           45
PrintScreen       E037
ScrollLock        E046
Pause             E045
CapsLock          3A
ESC               01
半角/全角         29
変換              79
無変換            7B
カタカナ/ひらがな 70
Insert            E052
Delete            E053
`(~チルダ)        29
F1                3B
F2                3C
F3                3D
F4                3E
F5                3F
F6                40
F7                41
F8                42
F9                43
F10               44
F11               57
F12               58
</pre>
Ubuntu ISOからレポジトリ作成

##背景
Ubuntuでサーバを構築する必要があるが、社内環境のためインターネットに接続することができない。
そのためISOイメージファイルを使用してローカルレポジトリを作成する。

そもそもUbuntuのインストールは初めて。いつもはRHEL/CentOSがほとんど。

インストール後、IPを設定してSSHログインしようとしたができない。。(PINGは通る)
どうやらSSHサーバが入っていない。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/14feacfa-1a7a-691c-59cf-ccc17631c5e7.png)


なのでとりま、ローカルレポジトリを作成してOpenSSH-Serverをインストールする！！

##環境
- 仮想マシン(ハイパーバイザー：KVM)
- OS：Ubuntu 16.04

##いざ実施
###1.とりあえずやってみる

ググってやってみる	
	参考：http://d.hatena.ne.jp/elsal/20080620/1213973085
	
####① ISOイメージを接続	
KVMからisoファイルをVMに接続します。
	
####②/etc/fstabを編集	
末尾に以下エントリーを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/835da54d-6b77-cfad-9351-1a98a2ba8312.png)

※/mnt/isoディレクトリは事前に作成しておく
	
####③apt-cdromコマンドでレポジトリに登録	
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/27c8ee52-339f-b9e2-20d1-c5ea02ba5724.png)

エラーはでていないので、成功してるっぽい？？
	
####④openssh-serverをインストールしてみる	
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/0c9dfcb7-3eb1-ab34-0acb-1c7ec417a5a4.png)
あ？？？
参考元によると/cdromを/mnt/isoのシンボリックリンクにするとイケると書かれているので試してみる
	
####⑤/cdromのシンボリックリンクを作成して、再トライ	
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/62cdf720-adaa-f6de-c840-31b281b86f4f.png)

そしてopenssh-serverのインストールを再実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/73764d18-cdd3-0201-a83f-a9d7eaf54ddd.png)
きぇ～～～～～あかんやん。。。。。
	
apt-get updateでレポジトリを最新化しても変化なく。。。

###2.違う方法を調べて実行してみる

参考:https://askubuntu.com/questions/4694/how-to-use-a-iso-image-as-a-cd-rom-repository
	
####①/etc/apt/sources.listを編集	
/mnt/isoはマウントしたままで、以下のエントリーを/etc/apt/sources.listに追記(これ以外の行はすべてコメントアウト)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/69c3ad83-e659-b8c8-a944-6842a38cf503.png)

####②apt-get updateを実行	
エラー。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/09ed5ac7-a980-5110-8b8d-9f31ea6df607.png)

/mnt/iso/dists/wheezy/main/binary-amd64/Packagesがないというエラー。。。
実際に該当ディレクトリを見てみるとPackages.gzってあるけど。。。なぜ認識してくれないかな。。。

####<font color="Red">そもそもISOが違う????</font>
<font color="Red">Ubuntuに慣れていない私はそもそもUbuntuのインストールメディアにはdesktopエディションとserverエディションの2種類あることを知らなかった。。desktopは20種類くらいしかパッケージがないとのこと(参考：https://www.hiroom2.com/2016/08/12/ubuntu-16-04-install-package-from-dvd/)</font>

ではServerエディションを利用して上記の手順を行えばうまくいけるんでね？？

###3.ServerエディションのISOファイルをダウンロードして再トライ

####①メディアをダウンロード
ubuntu-16.04.5-server-amd64.isoをダウンロード

####②ダウンロードしたファイルを使用して[1]の①～④を再トライ
できたー！！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/a0e574a9-6f66-da60-27b5-9b73630dc793.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/11019bcf-dded-55a0-85d5-bf745812487d.png)

##まとめ

こんなカスみたいなオチでごめんなさい。。。
無知な自分が恥ずかしい

<font color="Red">Ubuntuのserverエディションとdesktopエディションの違いにはご注意を！！</font>

はー疲れた。。
x-mouse on Windows

#概要
Xのウィンドウマネージャみたいにマウスカーソルを合わせたウィンドウを全面に出さずにフォーカスを当てる。

##設定方法
1.regedit　を起動
2.HKEY_CURRENT_USER\Control Panel\Desktop
3.UserPreferenceMask をダブルクリック
<code>9f 3e 07 80 12 00 00 00</code>
4.編集(E)、新規(N)、DWORD(32ビット)値
<code>ActiveWndTrkTimeout=0x1f4(500)</code>

##注意
- ActiveWndTrackTimeout という項目が既にあるがこちらを変更しても反映されない。ActiveWndTrkTimeoutを新規に作ってセットする。
- この待機時間は長めにセットしておくほうが何かと使いやすい。
[Flutter] BackdropFilter 使ってみて少し分かったこと。

BackdropFilterを使うとアプリがもっとかっこよくなります。

基本Material -> Container -> Image で
BackdropFilter -> Material -> Container にやってみですが、
BackdropFilterの効果がなかったです。

で、次にMaterial -> BackdropFilter -> Container にやってみですが、
これもBackdropFilterの効果がなかったです。

後　最後に、Material  -> Container　->　BackdropFilterになると、
BackdropFilterの効果がありました。



```dart:main.dart
child: Container(
    height: 320.0,
    width: double.infinity,
    decoration: BoxDecoration(
      color: Colors.grey.shade200.withOpacity(0.5),
      borderRadius: BorderRadius.circular(16.0),
      image: DecorationImage(
        fit: BoxFit.cover,
        image: NetworkImage(
            "https://cdn.pixabay.com/photo/2015/11/07/12/02/business-1031754_960_720.jpg"),
      ),
    ),
    child: BackdropFilter(
      filter: ImageFilter.blur(sigmaX: 8.0, sigmaY: 8.0),
      child: Container(
        decoration:
            BoxDecoration(color: Colors.black.withOpacity(0.2)),
      ),
    ),
  ),
```


BackdropFilter -> Containerだと思ってましたが、そうでもなかったです。
3000円から始められるスタンディングテーブルのすゝめ

# 概要

　昨年(2018)夏ごろに日頃の運動不足の影響もあって膝が痛くなってきたので、思い切ってスタンディングテーブルを自費で導入しました。それまでスタンディングテーブルほしいと言っていた方々も賛同して個々人が工夫を凝らしたスタンディングテーブルを導入し始めた。今では会社が業務上の必需品として社費で導入してくれるようになりました。
　エンジニアと言えども身体が資本なので、日々の運動不足の解消のためにも案外手軽に導入できるスタンディングテーブルの紹介とメリット、デメリットについて紹介したいと思います。
　ちなみに一日のスタンディング時間は平均3～4時間で、膝も痛くなくなりました！

# スタンディングテーブルの紹介

導入のしやすさを5段階評価で紹介していきます

★★★★★・・・無料ですぐに導入できる
★★★★☆・・・少額（10,000円未満）の出費で導入できる
★★★☆☆・・・それなりの出費（10,000～30,000円未満）で導入できる
★★☆☆☆・・・高額出費（30,000円以上）で導入できる
★☆☆☆☆・・・高額出費（30,000円以上）と設置困難な状況



## 手軽さ★★★★☆

- 3,000～4,000円のモニターアーム
- 段ボール
- 木材
- 包装紙（木目調）

　実費としては[モニターアーム](https://www.amazon.co.jp/gp/product/B00HQP3RSE/ref=ppx_yo_dt_b_asin_title_o00__o00_s00?ie=UTF8&psc=1)のみで、もっとも気軽にスタンディングできるスタイル
ただ、モニターは上向きになるので、若干下を見下ろすような感じになります
台は段ボール、包装紙、木材で完全自作なので、実費はほぼ**ゼロ円！** でもやる気は**Priceless！**
ただの段ボールだと不安定なので、中は小さい段ボールで補強してあります
お金に余裕がある場合は、[強化段ボール](http://e-takamura.co.jp/sales/sheet/)で自作してみるのもよいかと思います

![dsBuffer.png](https://qiita-image-store.s3.amazonaws.com/0/30522/fdd26776-65d2-c99d-e8ec-d61864503e5b.png)

## 手軽さ★★☆☆☆

- [折り畳み式スタンディングテーブル](https://direct.sanwa.co.jp/ItemPage/100-MR119)(30,000円～)

最大のネックは実費として3万以上かかることです。ちなみに私は腹をくくってココから入りましたが、たぶん膝が痛くなっていなかったら、未だにスタンディングしていなかっただろう・・・
モニター2つが載るサイズとなるとこの値段になりますが、1つのみ場合はもう少し安くなるかと思います
ついでにスマホスタンディングもできるので、結構便利ｗ

![IMG_6565.png](https://qiita-image-store.s3.amazonaws.com/0/30522/747bc2ff-9162-4521-2806-c0e1c0cc5e6a.png)


## 手軽さ★☆☆☆☆

- [電動昇降式テーブル](https://www.office-com.jp/products/detail.php?product_id=231729)（40,000円～）

　こちらは会社が購入したスタンディングテーブルになります。電動タイプなのでボタンひとつで好みの高さに調節できる。一人一人の身長に合わせて設定できるのでかなりいいです！また、スタンディングのみならず座ったときの机の高さも変えられるので高身長の人も助かるのではないかと思います。
　手軽さはもっとも低い理由としては既存の業務デスクと交換するため、会社の理解がないと手が付けられない代物です。幸い弊社では前述の通りスタンディングテーブルの有用性を理解して頂いたので、社費で部分導入し始めたところです！

![standing.jpg](https://qiita-image-store.s3.amazonaws.com/0/30522/9459cde1-4534-7af9-7e72-20edbb6f064f.jpeg)

## スタンディングテーブルを導入してからメリットとデメリット

# メリット

- 膝が痛くなくなった
- 立っている間は集中力が増す
- 足腰が強くなった
- 眠気が減った
- メリハリがつくようになった
- 移動が楽（立ったままなので、スッと移動ができる）

# デメリット

- 目の前の人がスタンディングしていると気分を害する人がいる（らしい）
- 姿勢が悪い人は逆にどこかが痛くなる（人によって合う合わないがある）
- 立った後に座ると急に眠くなる
- 立ちたい病になるｗ（立たないと落ち着かなくなることがある）
- 注目の的になる（最初は）

# まとめ

　今回は私個人席で折り畳みのスタンディングテーブルを導入したことから広がったが、各社の働き方改革で同様にスタンディングテーブルを試験導入する際は、共有席での導入は避けたほうがいいと思います。共有席に導入すると多分そんなに使う人がいないんじゃないかと思います。もともと共有席で作業する文化があるなら別ですが、そうではない場合は、そもそも共有席に行くことからハードルが生じるので本来のスタンディングテーブルの実証に繋がらないと思います。~~現に弊社でも共有席にもスタンディングテーブルを導入していますが、ほぼ誰も使っていないのが現状です~~
　共有のスタンディングテーブルにPCが設置されたことで利用者が増えるようになりました
　スタンディングテーブルに興味がある方は低コストから実現できるので会社の理解待つよりも自分から始めてみるものいいではないでしょうか？
抹殺世界　paiza　D問題「荒れ果てた警察署」のテストコード

# paizaエンジニア抹殺世界
https://paiza.jp/botchi/home

# 問題文要約。
>0から9の数字を3つ入力すると開く扉があるとする
鍵の番号は左から 2 つまで判明しており、3つ目は以下の法則で決まる

>・判明している二つを足して10で割ったときの余り

>2つ目までの数字を与えるので3つ目を求める

## テストコードの大枠を作る
```spec/paiza_lebelD_spec.rb
require 'spec_helper'

RSpec.describe Lebel_D do
    
end
```
class名だけ作る

```lib/lpaiza_lebelD.rb
class Lebel_D
    
end
```

```
$ bundle exec rspec
0 examples, 0 failures
```

##　テストコード

判明している二つの数字を引数にする(num_1,num_2)
期待する結果は2なのでイコールの右には2を置く

```spec/paiza_lebelD_spec.rb
RSpec.describe Lebel_D do
  it '荒れ果てた警察署' do
    result = Lebel_D.new.key(num_1: 4, num_2: 8)
    expect(result).to eq 2
  end
end
```

```
$ bundle exec rspec
undefined method `key' for #<Lebel_D:0x00007fc72591ae08>
```

## メソッドを作る
```lib/lpaiza_lebelD.rb
class Lebel_D
    def key(num_1:, num_2:)
    end
end
```
keyメソッドに二つの引数を渡す

```
$ bundle exec rspec
  1) Lebel_D 荒れ果てた警察署
     Failure/Error: expect(result).to eq 2

       expected: 2
            got: nil
```
エラーメッセージが変わりました

期待していた「2」ではなく「nil」が帰ってきた

## メソッドの中身を書く

```lib/lpaiza_lebelD.rb
class Lebel_D
    def key(num_1:, num_2:)
      add = num_1 + num_2   //与えられた数字すべてを足して
      remainder = add % 10  //10で割ったときの余りを戻り値として返す
    end
end
```

```
$ bundle exec rspec
1 example, 0 failures
```
オールグリーン

## リファクタリング
意味なし最終コード

```lib/lpaiza_lebelD.rb
class Lebel_D

  def initialize(num_1:, num_2:)
    @add = num_1 + num_2
  end
  
  def key
    remainder = @add % 10
  end
end
```

```spec/paiza_lebelD_spec.rb
require 'spec_helper'

RSpec.describe Lebel_D do
  let(:number) { Lebel_D.new(num_1: 4, num_2: 8) }
  it '荒れ果てた警察署' do
    expect(number.key).to eq 2
  end
end
```
rspec入門はこちらから
https://qiita.com/jnchito/items/42193d066bd61c740612

見てくれてありがとう！
ラズパイ起動時にスクリプトを実行したい

毎日定期的にラズパイを再起動させ、起動時に動かしたいシェルスクリプトがあったとする。

シェルスクリプトの中身はこんな感じ

```sh:bot.sh
echo "スタート"

node /home/pi/dev/bot.js
```

## 方法1. Cron

Crontabで再起動後にスクリプトを起動するよう設定する。

### cronを設定

`crontab -e`

### 起動日時を指定

毎日9時に実行する書き方

```
00 9 * * * sh /home/pi/bot.sh
```

### cronの確認

`crontab -l`

### 動作確認
cronのログをみたときに
`vim /var/log/cron.log`
起動してるようだが、rootユーザーで動作してないようで、正常にスクリプトが動作しなかった。

**crontabではrootユーザーでは動かせない？**

## 方法2. rc.local

### スクリプトを/usr/local/bin/へ移動

`bot.sh`というスクリプトを `/usr/local/bin/` へ移動させる。

```
$ sudo mv ./bot.sh /usr/local/bin/
```

### /etc/rc.localに起動したいスクリプトを指定

/etc/rc.local をvimで開く
`sudo vim /etc/rc.local`

`exit 0`の前に`bot.sh`を追加した。
（パスは書かなくても動いた）

```/etc/rc.local
bot.sh

exit 0
```
### 動作確認
結果はOK

ラズパイ再起動させて起動を待った結果、無事にスクリプトが動いていました。

## 参考にしたリンク

### Cron
* crontabを設定しても実行されない時の確認ポイント https://gist.github.com/koudaiii/49ac3f8b7c207f0da31f
* Cron Builder - GUI で簡単に cron 書式を記述 http://cronbuilder.otchy.net/

### rc.local
* Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説 http://hendigi.karaage.xyz/2016/11/auto-boot/
ADのグループメンバーをPowerShellで管理する。

#特定のグループに対してのコマンド

### メンバー一覧を出力

```powershell
$group = '{グループ名}'
Get-ADGroupMember -Identity $group | select name
```

###メンバーを追加

```powershell
$group = '{グループ名}'
$member= '{ユーザー名}'
Add-ADGroupMember -Identity $group -Member $member
```

###メンバーを削除

```powershell
$group = '{グループ名}'
$member= '{ユーザー名}'
Remove-ADGroupMember -Identity $group -Member $member

```

###全てのメンバーを一括削除

```powershell
$group = '{グループ名}'
Get-ADGroupMember -Identity $group | ForEach-Object {Remove-ADGroupMember -Identity $group   -Member $_.name }

```
初心者Macユーザーが陥りがちな「npm installの壁」を突破する

#はじめに
最近、Node.jsをはじめようと思い、「Node.js超入門（第２弾）」という本を購入した。
そこで、見習いエンジニアの筆者は初めてnpmを使用することになり、EJSというテンプレートエンジンをインストールしようとしているところである。

**この記事は、rootユーザーが未設定な人（あれ？rootってあんまり使った覚えないなw）って人向けです。**

##ターミナルで「npm install -g ejs」と打った時の挙動

```tarminal
$ npm install -g ejs
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
...
```
とりあえず、エラーになった。
このエラー内容を見てみると「missing write access to...」ということで権限関連のエラーであることがわかる。

で、思いついた私の考えは、、、

**「root権限でインストールすればいいかも。」**（初心者なので、「そんなの当たり前だろ！」とか言わないでw）


##root権限にログインして、インストールする
```tarminal
$ su -
Password:
su: Sorry
```

**ここで、突破すんなり入れた方は、安心して```npm install -g ejs```を打てば良いだけ！！**（お疲れ様です！）

ですが、この画面を見てもらえばわかるように、私はパスワードを忘れたのか！？（でも、rootのパスワード設定した覚えない。。）

そこで、解決方法を探った。すると出てきた答えは、「まず、root自体の設定をしてないのかも。。」

##rootユーザーを有効にして、パスワード設定を行う！

１：Apple メニュー () >「システム環境設定」の順に選択し、「ユーザとグループ」(または「アカウント」) をクリックします。

２：鍵のアイコン をクリックして、管理者の名前とパスワードを入力します。

３：「ログインオプション」をクリックします。

４：「接続」(または「編集」) をクリックします。

５：「ディレクトリユーティリティを開く」をクリックします。

６：「ディレクトリユーティリティ」ウインドウの 鍵のアイコン をクリックして、管理者の名前とパスワードを入力します。

７：ディレクトリユーティリティのメニューバーから、以下のように選択します。

８：「編集」>「ルートユーザを有効にする」

###詳細方法
１：「ユーザーとグループをクリック」
<img width="803" alt="スクリーンショット 2019-02-04 12.38.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/583249a4-2bb0-7fd4-a1d8-83f1d48c3f47.png">

２：鍵マーク（赤く囲んであるところ）クリックしてパスワード入力（おそらく、数分Macを触らなかった時に入力するパスでいいはず）
<img width="767" alt="スクリーンショット 2019-02-04 12.39.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/fd051ce2-804a-c42b-8e85-7561f6250dc6.png">

3:ログインオプションをクリックして、「接続」をクリック。その後、「ディレクトリユーティリティを開く...」をクリック
<img width="689" alt="スクリーンショット 2019-02-04 12.47.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/c003b6e9-ebb3-6059-094d-52c6062e137c.png">
<img width="716" alt="スクリーンショット 2019-02-04 12.48.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/d3083bb3-bbd2-c0b3-59a1-e0b5805aee74.png">

４：ここまでくると、先ほどと同様に鍵を外して、「編集」から「ルートユーザを有効にする」
<img width="589" alt="スクリーンショット 2019-02-04 12.52.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/cc6b171f-f272-a389-0ead-e3adf2d0e66b.png">

**しかし、ここで詰まる人がいるかもしれない！**
「あれ、「編集」はどこだ！？」

実は、ここなんですねw
　　　　　　　　　　↓
<img width="892" alt="スクリーンショット 2019-02-04 12.53.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/4f20a829-ade0-a85a-588b-dfc590a1b792.png">

メニューバーはその部分なのかぁぁ！（初心者発言申し訳ないです。。）

５：あとは、「編集」をクリックすると「ルートユーザを有効にする」があるので、そこでパスワード設定！



###設定後の挙動

```
$ su -
Password:
# npm install -g ejs 
+ ejs@2.6.1
added 1 package from 2 contributors in 0.937s
```
プロンプトが「＄」　→「#」になるとroot権限状態である証明

って感じで、成功した！！！

これから、微々たる一歩を積み重ねてゆきます。
FlutterでFlareアニメーションを制御する

表示するまでのサンプルはあるのですが、
Controllerを作成して制御するまでの方法が見当たらなかったので、雑にまとめておきます。

# 前提
- flareアニメーションファイル  
※なかったら[Explore](https://www.2dimensions.com/explore/popular/trending/all)からダウンロードしてきましょう。

# Flareの設定
1. プロジェクトルートのassetsフォルダにflrファイルを配置する
2. pubspecにプラグインと使用するファイルを追記する

```pubspec.yaml
dependencies:
  flare_flutter:

flutter:
  assets:
    - assets/sample.flr
```

3. パッケージを取得する

```
$ flutter packages get
```

# Flareの表示

1. 　Widgetとして適当な箇所に表示する

```dart
FlareActor(
  'assets/sample.flr',
  alignment: Alignment.center,
  fit: BoxFit.contain,
  controller: this,
)
```

# Flareの制御

1. 表示するStateに`FlareController`を実装する

```dart
import 'package:flare_dart/math/mat2d.dart';
import 'package:flare_flutter/flare.dart';
import 'package:flare_flutter/flare_controller.dart';
import 'package:flare_flutter/flare_actor.dart';

class _SamplePageState extends State<SamplePage> implements FlareController {
  @override
  void initialize(FlutterActorArtboard artboard) {}

  @override
  void setViewTransform(Mat2D viewTransform) {}

  @override
  bool advance(FlutterActorArtboard artboard, double elapsed) {
    return true;
  }
}
```

または、FlareContrlsを継承したクラスを別途用意し、
FlareActorのcontrollerに設定する方法もあります。

```dart
import 'package:flare_flutter/flare.dart';
import 'package:flare_dart/math/mat2d.dart';
import 'package:flare_dart/math/vec2d.dart';
import 'package:flare_flutter/flare_controls.dart';

class SampleController extends FlareControls {
  @override
  void initialize(FlutterActorArtboard artboard) {
    super.initialize(artboard);
  }

  @override
  bool advance(FlutterActorArtboard artboard, double elapsed) {
    super.advance(artboard, elapsed);
    return true;
  }

  @override
  void setViewTransform(Mat2D viewTransform) {}
}
```

2. アニメーションを制御する

```dart
// initialize
ActorAnimation _anim = artboard.getAnimation('Untitled'); // 任意のアニメーション名を指定

// advence
_anim.apply(elapsed, artboard, 1);// elapsedに経過時間を入れれば、アニメーションを制御できます。
```

# 参考

https://github.com/2d-inc/Flare-Flutter/tree/master/example
ask init時に失敗!Alexaスキルを作る際に詰まった所と解決法

## スキルがリクエストに正しく応答できませんでした
- Lambda側にエラーがある
- Cloud Watch ログで確認すること
    - CloudWatch ログで確認出来ない時（ロググループに該当の物が無ければ）は、IAMでCloudWatchとCloudWatch Logsの権限があるあか確認する事
    - それでも行ってなければ、lambdaを作り直すとうまく行くことも

## ask-cliでvendor IDが取得出来ない



```
Call list-vendors error.
Error code: 401
{
  "message": "You are not authorized to access this operation."
}
```

- nodejsのバージョン？
    - https://takulog.info/alexa-skill-kit-sdk-2-failure-of-beginners/

- 登録情報が不十分？
    - https://forums.developer.amazon.com/articles/190093/ask-cli-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E3%83%92%E3%83%B3%E3%83%88.html
    - 今回はamazon developer側のアカウントを別の変えたら上記エラーが出なくなったので、amazon developer側の情報が不充分だったみたい
    - amazon developer側の認定の所でエラーが出てたらそれを潰したら完了出来ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142130/4c1dff67-63f8-3dff-938e-2b11b5b2492a.png)
obniz 3進数ピンメモリ：外部サービスレスでobnizの複数プログラム間の情報共有を実現

##はじめに
obnizの複数プログラム間で簡単に少量の情報を交換する方法です。外部ファイルサービス等を使えばできることなのですが、obnizのプログラミングが簡単すぎるが故に、逆に外部ファイルサービス等のプログラミングはハードルが高いと感じることもあるかと思います。そこで、obnizの機能のみで簡単に複数プログラム間で少量の情報を交換する方法を紹介します。obnizのピンの出力電圧を利用するという少し裏技的な感じの方法です。

##■概要
**ioX.output(true/false)**でXピンに電圧を出力し、**adX.getWait()**でXピンの電圧を読み取ることでXピンを介して情報共有します。また、**ioX.drive("3v/5v")**で電圧を切替できることを利用して、**1ピン当たり3値(0v/3v/5v→0/1/2)**を共有できます。例えば、**3ピン使えば、3進数^3ピンで27種の値を共有**できます。2進より多くの情報量を扱うことができます。
尚、obniz.close()が発行された場合や、closeが発行されなくてもプログラムが終了して30秒後にピンの状態が自動リセットされるので、情報共有したいすべてのプログラムで**obniz.resetOnDisconnect(false)**を発行して、この**リセットを無効**にしておく必要がありますので***注意***してください。

##■共有できる情報量　(10進数)
**・1ピン利用時 → 3**
**・2ピン利用時 → 9**
**・3ピン利用時 → 27**
**・4ピン利用時 → 81**
(以下省略)

##■共有情報の書込方法
**・共有値【0】の書込 → obniz.ioX.output(false);**
**・共有値【1】の書込 → obniz.ioX.drive("3v") ; obniz.ioX.output(true);**
**・共有値【2】の書込 → obniz.ioX.drive("5v") ; obniz.ioX.output(true);**

##■共有情報の参照方法
**・vol=await obniz.adX.getWait() ;**
**　　vol≒0 → 共有値【0】と判断**
**　　vol≒3 → 共有値【1】と判断**
**　　vol≒5 → 共有値【2】と判断**
(volは微変動します)

##■終了でピンをリセットさせないための設定
**・obniz.resetOnDisconnect(false)**

##■サンプルプログラムのデモ動画
3ピン利用例、左のスマホでWrite　→　右のスマホでRead
https://youtu.be/tGgVftaALEM
以上
JuliaをJupyterから使えるようにセットアップ (Mac・Anaconda)

計算が速いという噂の[Julia](https://julialang.org/)。

とりあえずJupyterから使えるようにセットアップしてみたので備忘録。

環境は以下の通り。
- Mac OSX Mojave
- conda 4.6.2
- julia version 1.0.3

### 1. condaコマンドでJuliaをインストール

こちらを参考に。
https://anaconda.org/conda-forge/julia

```
$ conda install -c conda-forge julia
```

Anacondaを使っていると、これだけでOKなのはラクですね。

### 2. パッケージのインストール

まず、ターミナルからJuliaを立ち上げます。

```
$ julia

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3
 _/ |\__'_|_|_|\__'_|  |  conda-forge-julia release
|__/                   |

julia>
```

ここで`]`と押すと以下のように

```
(v1.0) pkg> 
```

モードが切り替わります。ここで、`add (パッケージ名）`と入力して実行すればOK。

試しにPyPlotパッケージをインストール。

```
(v1.0) pkg> add PyPlot

  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed LaTeXStrings ────── v1.0.3
 Installed Reexport ────────── v0.2.0
 Installed FixedPointNumbers ─ v0.5.3
 Installed ColorTypes ──────── v0.7.5
 Installed PyPlot ──────────── v2.7.0
 Installed Colors ──────────── v0.9.5
  Updating `~/.julia/environments/v1.0/Project.toml`
  [d330b81b] + PyPlot v2.7.0
  Updating `~/.julia/environments/v1.0/Manifest.toml`
  [3da002f7] + ColorTypes v0.7.5
  [5ae59095] + Colors v0.9.5
  [53c48c17] + FixedPointNumbers v0.5.3
  [b964fa9f] + LaTeXStrings v1.0.3
  [d330b81b] + PyPlot v2.7.0
  [189a3867] + Reexport v0.2.0
```

簡単ですね。

`Control+C`で元のモードに戻ります。

Juliaから抜けるには`exit()`で`Enter`。

### 3. JupyterでJuliaを使えるようにする

こちらを参考に。
https://ystt.hatenablog.com/entry/2018/08/11/141132

Juliaで以下のパッケージをインストール。

```
(v1.0) pkg> add Conda#master
(v1.0) pkg> add IJulia
```

元のサイトによると`#master`は付けなくてもよくなったそうですが、今回は付けちゃったのでそのままで。

これでJupyterを立ち上げると

```
$ jupyter notebook
```

新しくノートブックを作成時にJuliaを選べるようになっているはずです。

### 4. Juliaの使い方の参考になりそうなページ

以下に詳しいドキュメントがあります。

英語版：https://docs.julialang.org/en/v1/
一部日本語版：https://hshindo.github.io/julia-doc-ja-v0.6/index.html

ぼちぼち読んでいきたい。

追記：
こちらも参考に。

超入門：http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/basic/
Juliaのススメ：https://qiita.com/antimon2/items/a370ed6e91d0f2764e80
高速でJuliaを学ぶ入門チュートリアル：https://github.com/bicycle1885/Julia-Tutorial


### 追記(2019/2/5)

Jupyter notebookでJuliaを使っていて気づいたのですが、Pythonのときのように`Tab`でコマンドを補完したり、`Shift+Tab`で関数のヘルプを見たり、というのはデフォルトではできないみたいです。結構不便、、、

やり方をご存知の方がいらっしゃったら、ぜひ教えてください(> <)
開発環境作り STEP2: GitHubでどこからでも開発を進められるようにする

#目的
Gitでバージョン管理して開発する環境を作る。
休日に自宅で＆昼休みに会社で、開発を進めてく事を想定しています。
開発ツールにVisualStudioCodeを選んだ理由は、無料＆色んな言語に対応してる＆Gitクライアントになる、から。
※自分の備忘録の意味合いが強いです

#前提条件
●OS: Windows10 for 64bit
●ブラウザ: Chrome
●各種バージョン: 
→VisualStudioCode1.30.2
→Git2.20.1
●実施済み: 
→[開発環境作り STEP1](https://qiita.com/mnhsmntk/items/0b2af271e06e5d557a77)

#GitHubでリモートリポジトリを作成
●`https://github.com/`でアカウントを作成
※英語表記ですが特記すべき事はありません、正しい情報を入力してけばOKです
※ただ、usernameは他のユーザに公開される情報なのでちゃんと考えて付けるのが良いと思います
●トップ画面のボタン`New repository`を押下して、リモートリポジトリを作成
※アカウント作成同様に特記すべき事はありません
※敢えて言うなら、Public（無償だが全ユーザに公開される）かPrivate（有償だが非公開）か選ぶ点ですかね、、、今回はPublicを選択しています
<img width="535" alt="GitHub1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341680/be803772-6d81-89b7-9b1e-16a656e59e18.png">

#Gitの初期設定
●`VisualStudioCode`を起動し、`Ctrl+@`を押下し、タブで`ターミナル`を展開
●以下のコマンドを実行して、バージョン管理の際に使用されるユーザー名を指定

```powershell:コマンド
git config --global user.name "＜ユーザ名＞"
```

●以下のコマンドを実行して、バージョン管理の際に使用されるメールアドレスを指定

```powershell:コマンド
git config --global user.email "＜メールアドレス＞"
```

●以下のコマンドを実行して、Gitの出力をカラーリングをONに指定
※例えば、`git status`実行時のファイル名等が配色された文字列で表現されるようになります

```powershell:コマンド
git config --global color.ui auto
```

●おまけで以下のコマンドを実行して、Gitのデフォルトエディタを指定
※`code`を実行して`VisualStudioCode`が起動する事が前提
※[STEP1](http://...)でGitのインストール時に指定してるので不要だと思うけど、一応

```powershell:コマンド
git config --global core.editor "code --wait"
```

#Gitローカルリポジトリを作成
●`VisualStudioCode`を起動し、`Ctrl+@`を押下し、タブで`ターミナル`を展開
※以降、GitやDocker等のコマンドを実行する際はこのターミナルを使用する

●以下のコマンドを実行して、作業ディレクトリを作成
※今回は、デスクトップの直下にフォルダを作成します

```powershell:コマンド
mkdir ＜フォルダ名＞
```

```powershell:結果
    ディレクトリ: C:\Users\desktop

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/01/13     21:34                ＜フォルダ名＞
```

●以下のコマンドを実行して、ワークツリーを指定
※以降、何か作業をする対象のディレクトリを指定する際はこのコマンドを使用する

```powershell:コマンド
cd ＜ワークツリーのディレクトリパス＞
```

●以下のコマンドを実行して、ワークツリーをローカルリポジトリに設定

```powershell:コマンド
git init
```

```powershell:結果
Initialized empty Git repository in C:/Users/desktop/＜フォルダ名＞/.git/
```

#Gitリモートリポジトリを登録
●`VisualStudioCode`を起動し、`Ctrl+@`を押下し、タブで`ターミナル`を展開

●コマンドを実行して、ワークツリーを指定

●以下のコマンドを実行して、リモートリポジトリを登録
※プッシュやプルは実行時にリモートリポジトリ名を省略するとoriginという名前のリモートリポジトリを使用する為、リモートリポジトリにはoriginという名前を付けるのが一般的だそうです

```powershell:コマンド
git remote add ＜リモートリポジトリ名＞ ＜リモートリポジトリのClone with HTTPSURL＞
```

#メモ
●ここまではあくまで下準備段階です。（次のSTEPからGitフローについて言及します）
【自分用メモ】フロントエンドのテストについて考える

## 目的
フロントエンドにおいて何をどこまでテストすべきか考察する。

## 何のためにテストするのか？
テストコード：記述したテストケースが間違いなく動作することを保証するもの
テストケースが表現するもの：プログラムが仕様通りに動作するかどうか（正当性）。

テストの文脈で正当性は一般的にプログラミングの品質を意味し、品質向上がテストの目的となる。

## どこまでテストするべきか？
仕様といってもソフトウェア開発では様々な粒度の仕様があるので、どのスコープの仕様に対するテストをするかを決めておかないとテスト設計が出来ない。
例）ユニットテスト（コンポーネントやクラスといった部品単位）、UIテスト（画面内のユースケース）

直近の開発では、自作のutil関数のみテストを書いていた。
CompoenntはメジャーなOSSライブラリを使っていたため動作が保証されていると信じた。
UIテストはTDDで頑張っても時間がかかって労力に見合わないと判断した。

## フロントエンドにおけるテスト優先順位
個人情報に関わるコンポーネントはテストの優先度は高い（最優先）。
追加/更新/削除に関わるFormのテストはDBに関わるので優先度が高い。
工数と見返りを考慮して表示系のコンポーネント/Utilのテストを行う。
【ルーティング設計】1つのアクションで複数のビューを切り替えて表示する方法

## 背景（今回の実装内容）
今回実装していたのは、DBに登録したユーザーや商品の情報を編集する機能です。
編集画面が複数に分かれている場合(住所、メール/パスワード、支払い方法など)、
複数のビューをeditアクション1つで管理するルーティング設計についてまとめておきます。

## ルーティングはできるだけ7つのアクションにまとめましょう
Ruby on Railsでは、むやみやたらとactionやcontorollerを作成するのはよくありません。
生成するルーティングが多いと、それだけアプリへ負荷がかかります。
そのため、resourcesで生成される7つのアクションにまとめるのが基本です。

## 問題： 1つのアクションに複数のビューを収めるにはどうしたら…
この原則に則って、1つのルーティングにつき、1つのアクション、1つのビューという形をとっていましたが、編集画面が複数ある場合はeditアクション1つにまとめるなんてことができるのでしょうか…？

## 答え： paramsと部分テンプレートを使いましょう！
大まかな流れとしては以下の通りです。

1. ビュー(部分テンプレート)ファイルを用意する
2. パスにparamsのキーを設定する
3. リクエスト送信時にparamsの値(`ここでは部分テンプレートのファイル名`)を一緒に送る
4. コントローラーでparamsの値を受け取り、renderで部分テンプレートを表示させる。

ビュー(部分テンプレート)を用意して、まずはルーティングから見ていきましょう！

## ルーティング（Before）
最初は途方に暮れてアクションをズラーッと追加していました。

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

  resource :users, only: [:show] do
    member do
      # 商品情報の編集
      get :listing
      get :in_progress
      get :completed
      #ユーザー情報の編集 
      get :profile 
      get :deliver_address 
      get :card 
      get :email_password 
      get :identification 
      get :sms_confirmation 
      get :logout 
    end 
  end

end

```


## ルーティング（After）
なんとeditアクション1つに収めることができます！

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

    get 'users/:name', controller: 'users', action: 'edit'

end
```

`users/:name`の部分で、paramsのキーを設定しています。
リクエスト送信時に`表示させたいビュー（部分テンプレート）のファイル名`を値としてparamsに渡します。

```
parameters: { "name" => "部分テンプレートのファイル名" }
```

## リクエストの送信
プロフィールのリンクをクリックした際に、第2引数のパスへリクエストを送信します。
第2引数では`usersコントローラーのeditアクションを動かして!`というリクエストと一緒に
`ビュー（部分テンプレート）のファイル名`を`params[:name]`に代入して送信します！

```ruby:views/users/show.haml
= link_to "プロフィール", {controller: "users", action: "edit", name: "profile"}, class: "side-nav__list__content"
```

## コントローラー
リクエストによって呼び出されたeditアクションでは、送られてきた`params[:name] ＝ ビュー（部分テンプレート）のファイル名`をrenderメソッドの引数のパスで利用します。
これで1つのアクションで、リクエストの際に送るparamsの値によってビューを切り替えて表示することができます！

```ruby:controllers/users_controller
  def edit
    render "users/#{params[:name]}", locals: {user: current_user }
  end
```

## 処理の流れまとめ
**今回のプロフィール編集画面を呼び出す場合**

リンクで`"users/profile"`のリクエストが送信される
↓
usersコントローラーのeditアクションが呼び出される
↓
renderメソッドで`views/users/profile.haml`の部分テンプレートを表示させる

## 最後に
わかりづらい部分や間違っているところ、気になるところがありましたら、ぜひぜひご指摘いただけると幸いです。
Homebrew でインストールした Readline をバージョンアップしてしまって phpbrew が動かなくなったら

考えなしな Homebrew の `brew upgrade` で、Readline のバージョンが7系から8系に更新してしまいました。
Homebrew でインストールしていたパッケージは依存関係が管理されているので問題ないはずですが、自前でコンパイルしていた依存関係のあるソフトウェアでは **Library not loaded** が発生するかと思います。
自分の環境では phpbrew と、phpbrew でインストールしていた PHP が動かなくなってしまいました。

正確に言えば、PHP を動かしたいなら `brew switch readline 7.0.5` を、Homebrew でインストールした tig や hh を動かすときは `brew switch readline 8.0.0` を、……いちいち切り替えないと動かないので面倒です。

この切り替えを上手いことして、Readline 7 でコンパイルした PHP を消去して Readline 8 でコンパイルし直せば解決するはずですが、phpbrew の動作には PHP が必要なので、ちょっと順番で手間取りました。

一応解決できた手順は以下の順序だったはず。

- **Readline** のバージョンを 7 系に `brew switch readline 7.0.5`
- **phpbrew** でインストールしていた **PHP** を全て `phpbrew remove`
- **Readline** のバージョンを 8 系に `brew switch readline 8.0.0`
- **~/.bashrc** で **phpbrew** を無効に（`~/.phpbrew/bashrc` のロードをコメントアウト）
- **Homebrew** で `brew install php`（PHP 7.3.1 が入った)
- **~/.bashrc** で **phpbrew** を有効化
- 必要なバージョンの **PHP** を **phpbrew** でインストール

ただ、そもそも phpbrew には Mac にインストールした PHP へ戻す仕組みがあるようなので、このコマンドを使っていればもっと簡単に解決できたのかもしれません。

> COMMANDS
>                 off    Temporarily go back to the system php
>          switch-off    Definitely go back to the system php
Windows 10 Pro + Python3 + OpenPyXL でワークシートのデータを取得する

# 目的
※以下はPython 3.13.0 でも動作を確認
ワークシートからデータを取得するとき ExcelVBAだと以下を使用することが多い
・Range.End(xlDown).Row：下へ
・Range.End(xlUp).Row：上へ
・Range.End(xlToLeft).Row：左へ
・Range.End(xlToRight).Row：右へ

```vb
Worksheets("Sheet1").Range("B3:P8") 'にデータが存在する場合
With ThisWorkbook.Worksheets("Sheet1")
    Debug.Print .Range("B1").End(xlDown).Row
    Debug.Print .Range("B" & Rows.count).End(xlUp).Row
    Debug.Print .Range("A3").End(xlToLeft).Column
    Debug.Print .Range("B3").End(xlToRight).Column
End With
```
OpenPyXLでワークシートの場合
※ワークシート上で、データが存在するCellの最小／最大の位置
※TODO VBA like な Range 指定
<pre>
max_column
    The maximum column index containing data (1-based)
    Type:	int
max_row
    The maximum row index containing data (1-based)
    Type:	int
min_column
    The minimum column index containing data (1-based)
    Type:	int
min_row
    The minimium row index containing data (1-based)
    Type:	int
</pre>

```python
ws = wb["Sheet1"]
print(ws.min_row)
print(ws.max_row)
print(ws.max_column)
print(ws.min_column)
```
対象データは[郵便番号検索](http://www.post.japanpost.jp/zipcode/)の17ISHIKA.CSV をワークシートに取込んだもの
[Windows 10 Pro + Python3 + OpenPyXL で CSVファイルを書き込んでみる](https://qiita.com/tabizou/items/3bc827eda11f58db42e6)

## パッケージの追加
<pre>
PS C:\> pip3 install openpyxl
</pre>

## サンプルコード
```python
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# coding:utf-8
# pip3 install openpyxl (-U)

import openpyxl

xlfile = "samp.xlsx"
wksheet = "KENCODE"

wb = openpyxl.load_workbook(xlfile)

# ワークシート名のリストを取得する
lst = wb.sheetnames

# ワークシートが存在しない場合終了する
if lst.count(wksheet) == 0:
    wb.close()
    exit()

# データが存在する範囲 row column の取得
ws = wb[wksheet]
print(ws.min_row)
print(ws.min_column)
print(ws.max_row)
print(ws.max_column)

#第１案---------------------------------------------
for row in range(ws.min_row, ws.max_row + 1):
    for col in range(ws.min_column, ws.max_column + 1):
        print(row, col, wb[wksheet].cell(column=col, row=row).value)
#---------------------------------------------------

#第２案---------------------------------------------
for row in range(ws.min_row, ws.max_row + 1):
    for col in ws[row]:
        print(row, col.value)
#---------------------------------------------------
wb.close()
```
# 参考にしたのは以下のサイト
[openpyxl.worksheet.cell_range module](https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.cell_range.html)
[openpyxl.worksheet.worksheet module](https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html)
MyFirstRails #1 Hello World!

# MyFirstRails #1 Hello World!
## 概要
RailsでのHello World サンプルです。
実際に作成したものは[こちら](https://github.com/S-H-GAMELINKS/MyFirstRails/tree/master/helloworld)

## チュートリアル

`hello world`と表示させるためのアプリをターミナルから`rails new helloworld`で作成します
次に、`cd helloworld`にて作成したアプリのディレクトリへと移動します

```shell
rails new helloworld
cd helloworld
```

Railsでは`rails new` コマンドを実行することで最低限必要なファイルを自動的に生成してくれます
そのため`rails s`コマンドをターミナルで実行すると、PC内でRailsアプリのローカルサーバが起動します

```shell
rails s
```

`rails s`をターミナルで実行した後に、ブラウザ(Google ChormeやFireFox、Microsoft Edgeなど)のアドレスバーに`localhost:3000`と入力すると以下の画面が表示されます

![root_path.png](https://qiita-image-store.s3.amazonaws.com/0/191521/5e6f56e8-35a6-7fac-6db8-617d7e2ed342.png)


一旦、ローカルサーバは終了します(`Ctrl+C`にて終了)

次に、`rails g controller web hello`を実行して`Hello World`を表示させるためのコントローラーとビューを作成します

```shell
rails g controller web hello
```

Railsでは`rails g controller XXX`といったコマンドを使うことで簡単にひな型を作成することができます
また、作成するコントローラー名などを間違えてしまった場合は、`rails d controller XX`で簡単に削除できます

こういった簡単にコマンドでひな型を作成できる点がRailsの生産性の高さに寄与していると思いますね


先ほどの`rails g controller web hello`で作成した
`app/controllers/web_controller.rb`と`app/views/hello.html.erb`を以下のように編集します

```ruby:app/controllers/web_controller.rb
class WebController < ApplicationController
  def hello
    @message = "Hello World! Welcome to Ruby on Rails!"
  end
end
```

```erb:app/views/hello.html.erb
<p><%= @message %></p>
```

`app/controllers/web_controller.rb`では`index`アクション内でインスタンス変数`@message`を作成しています

```ruby
@message = "Hello World! Welcome to Ruby on Rails!"
```

`app/views/hello.html.erb`ではコントローラーの`index`から受け取った`@message`を展開しています
埋め込みHTMLで変数の中身を表示する際には`<%= @message %>`のように記述します

```erb
<p><%= @message %></p>
```

ここまでの作業で`localhost:3000/web/hello`にブラウザからアクセスすると以下の画面が表示されます
早速、ローカルサーバを起動して確認してみましょう

```shell
rails s
```

![web_hello_path.png](https://qiita-image-store.s3.amazonaws.com/0/191521/609053ea-4a98-7a79-5a94-9af0cf4adb07.png)


画面に`Hello World! Welcome to Ruby on Rails`と表示されていれば大丈夫です！
赤いエラー画面が表示されている場合は、`app/controllers/web_controller.rb`と`app/views/hello.html.erb`のどちらかでコードを書き間違えている可能性があります
再度、確認してみてください

ここまでで`Hello World`と表示させることができました！
しかし、毎回`localhost:3000/web/hello`にアクセスするのは面倒くさいですね

そこで、Railsのルーティングを編集することで`localhost:3000`にアクセスした際にも`Hello World`と表示できるようにします
`config/routes.rb`を以下のように編集して`localhost:3000`へのルーティングを設定します

```ruby:config/routes.rb
Rails.application.routes.draw do
  root 'web#hello'
  get 'web/hello'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```
変更した個所は`root 'web#hello'`の部分になります

```ruby
root 'web#hello'
```

とすることで`localhost:3000`にアクセスした際に`Hello Wrold`と表示されるようになります
再度、ブラウザから`localhost:3000`にアクセスして、以下の画面が表示されていればOKです

![fix_root_path.png](https://qiita-image-store.s3.amazonaws.com/0/191521/8b62ee66-0f79-4ea7-99fa-56daf545156c.png)

## ライセンス
[MITライセンス](https://github.com/S-H-GAMELINKS/MyFirstRails/blob/master/LICENSE)
catboostとOptunaでハイパーパラメータ自動最適化

# ハイパーパラメータ自動最適化
　前回、catboostを使って回帰分析を行った。
　https://qiita.com/shin_mura/items/3d9ce25a60bdd25a3333

　今回はより精度を高めるために、Optunaを使用したハイパーパラメータ
　自動最適化を実施してみる。

## Optunaとは？
　ハイパーパラメータを最適化するフレームワークの一つ。
　国内企業の Preferred Networksが開発を進めている。
　Pythonベースのオープンソースで誰でも使用できる。

　githubでも公開されており、xgboostやlightGBMで行う際の
　サンプルコードも提供されている。
　https://github.com/pfnet/optuna

　catboostでは未だ掲載されていなかったため、試してみる。

## 実装
### データセット
　catboostではサンプルデータとして、Titanicやamazonのデータが活用できる。
　今回はkaggleにアップされているコールセンターに関するデータセットを利用する。これは契約を解約するユーザの属性がまとまっている。
　https://www.kaggle.com/blastchar/telco-customer-churn

### データの読み込み
```
import gc
import pandas as pd

data = pd.read_csv("../inputs/WA_Fn-UseC_-Telco-Customer-Churn.csv")

# strで読み込まれてしまうので、floatに変換
data.TotalCharges = data.TotalCharges.convert_objects(convert_numeric=True)

# 文字列を数値に変換
data.Churn = data.Churn.apply(lambda x : int(0) if x == "No" else int(1))
```

#### 目的変数と説明変数の分割
```
import numpy as np

X = data.drop(['customerID', 'Churn'], axis=1)
y = data.Churn
categorical_features_indices = np.where(X.dtypes != np.float)[0]
```

#### Optunaの自動パラメータ最適化関数作成
```
from sklearn.model_selection import train_test_split
from catboost import Pool
import sklearn.metrics
def objective(trial):
    # トレーニングデータとテストデータを分割
    train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.2)
    train_pool = Pool(train_x, train_y, cat_features=categorical_features_indices)
    test_pool = Pool(test_x, test_y, cat_features=categorical_features_indices)

    # パラメータの指定
    params = {
        'iterations' : trial.suggest_int('iterations', 50, 300),                         
        'depth' : trial.suggest_int('depth', 4, 10),                                       
        'learning_rate' : trial.suggest_loguniform('learning_rate', 0.01, 0.3),               
        'random_strength' :trial.suggest_int('random_strength', 0, 100),                       
        'bagging_temperature' :trial.suggest_loguniform('bagging_temperature', 0.01, 100.00), 
        'od_type': trial.suggest_categorical('od_type', ['IncToDec', 'Iter']),
        'od_wait' :trial.suggest_int('od_wait', 10, 50)
    }
    
    # 学習
    model = CatBoostClassifier(**params)
    model.fit(train_pool)
    # 予測
    preds = model.predict(test_pool)
    pred_labels = np.rint(preds)
    # 精度の計算
    accuracy = sklearn.metrics.accuracy_score(test_y, pred_labels)
    return 1.0 - accuracy
```
　※ OptunaではmseやRMSEなど、低いほうが良いとみなされる指標を
　　 基に実行されます。よって、Accuracyの工夫が必要です。
　※ use_best_modelなどの、検証データを用いなければ設定できない
　　 パラメータは除外しています。

#### Optunaの実行
```
import optuna
if __name__ == '__main__':
    study = optuna.create_study()
    study.optimize(objective, n_trials=100)
    print(study.best_trial)```
```

## 各指標の確認
#### ベストスコアの確認
```
study.best_value
 0.17743080198722494
```

#### 最適なパラメータの確認
```
study.best_params
 {'iterations': 282,
  'depth': 4,
  'learning_rate': 0.17741698174722237,
  'random_strength': 92,
  'bagging_temperature': 15,
  'od_type': 'Iter',
  'od_wait': 18
}
```

## まとめ
　手動パラメータチューニング・グリッドサーチを行うよりも、
　かなり精度が高まった。catboost使用時はOptunaで楽に精度を
　高めることが必須ですね。
コマンドラインからVSCodeで2つのファイルのdiffをとる

以下のコマンドで起動できる。

```bash
code -d file1 file2
```

## 補足1
VSCodeのコマンドパレットからも同様なことができる。
`compare`と入力すると対応するコマンド一覧が表示される。

## 補足2
vimも同じオプションでdiffを表示できる。
合わせて覚えておくといいかも

```bash
vim -d file1 file2
```
curlでOracle JDK 8 rpm をダウンロードする方法

参考：
~~https://gist.github.com/P7h/9741922~~
https://gist.github.com/hgomez/4697585
https://gist.github.com/sdmcraft/2c5abbdeccf37e1642e5

## JDK 8 コマンド

```bash

 curl -L -b "oraclelicense=a" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm -O

```

## おまけ：環境設定

```bash
sudo yum install jdk-8u131-linux-x64.rpm -y
echo "export JAVA_HOME=/usr/java/jdk1.8.0_131/" >> ~/.bash_profile
echo "export JRE_HOME=//usr/java/jdk1.8.0_131/jre" >> ~/.bash_profile
echo "export PATH=$PATH:/usr/java/jdk1.8.0_131/bin:/usr/java/jdk1.8.0_131/jre/bin" >> ~/.bash_profile
```

```bash

echo "export JAVA_HOME=/usr/jdk64/jdk1.8.0_112" >> ~/.bash_profile
echo "export JRE_HOME=/usr/jdk64/jdk1.8.0_112/jre" >> ~/.bash_profile
echo "export PATH=$PATH:/usr/jdk64/jdk1.8.0_112/bin:/usr/jdk64/jdk1.8.0_112/jre/bin" >> ~/.bash_profile

```
[2019年版] Qtでパソコンソフトを作ろう（MinGW使用/VisualStudio不要）【その２：Hello, World編】

![qt_creator_12.png](https://qiita-image-store.s3.amazonaws.com/0/36751/e8ff0c1e-eabe-fd1d-8e53-2b85a00aea13.png)
**[【その１：インストール編】](https://qiita.com/yasumodev/items/399ec89b7205e3c0bab1)に続き、今回は実際にソフトを作ってみます。「hello world」と書かれた画面があるだけの、入門ではお決まりのものです。**

# ![](//goo.gl/78mjX8) Qt Creator を起動 ～ プロジェクト作成

Qtを `C:\Qt` 配下にインストールした場合、Qt Creator の場所は、
`C:\Qt\Tools\QtCreator\bin\qtcreator.exe`
にありますので、これを起動します。

そして「＋新しいプロジェクト」ボタンを押します。
![qt_creator_1.png](https://qiita-image-store.s3.amazonaws.com/0/36751/67ee2778-7160-e6e1-61dd-af9d9e6fdd14.png)

テンプレートは「`アプリケーション` ＞ `Qtウィジェットアプリケーション`」を選択します。
![qt_creator_2.png](https://qiita-image-store.s3.amazonaws.com/0/36751/5de0d8de-b065-6908-9cca-0f36cc489fb3.png)

プロジェクト名は「HelloWorld」とし、保存先を指定します。保存先のフォルダパスにも<font color="#f00">日本語が含まれないよう注意</font>して下さい。
![qt_creator_3.png](https://qiita-image-store.s3.amazonaws.com/0/36751/5370ec11-ec04-f3e7-456d-d783bb973ded.png)

キットの選択では、そのまま「次へ」ボタン。
![qt_creator_4.png](https://qiita-image-store.s3.amazonaws.com/0/36751/7ff0f17c-196d-bc9a-ad3f-23e4e6462aef.png)

クラス情報でもそのまま「次へ」ボタン。
![qt_creator_5.png](https://qiita-image-store.s3.amazonaws.com/0/36751/3042e372-7123-b547-4b67-bdfdf0ff1ab5.png)

「完了」ボタンを押すと「HelloWorld」プロジェクトが作成されます。
![qt_creator_6.png](https://qiita-image-store.s3.amazonaws.com/0/36751/b2771a84-5bd3-c52a-b8d5-00d5d9156a73.png)


# ![](//goo.gl/78mjX8) 実際にソフトを作っていく

これが「Qt Creator」の画面です。
![qt_creator_7.png](https://qiita-image-store.s3.amazonaws.com/0/36751/658eb9ed-2404-70b5-051c-768fa44162ad.png)

左のソースツリーから「`Forms` ＞ `mainwindow.ui`」をダブルクリックすると、画面編集モードになります。
![qt_creator_8.png](https://qiita-image-store.s3.amazonaws.com/0/36751/910ba8da-6ef1-1a85-b41f-f61a312bb8fd.png)

左のコントロール一覧には「Push Button」や「Check Box」など、画面を構成する部品があります。
![qt_creator_9.png](https://qiita-image-store.s3.amazonaws.com/0/36751/af1b0c87-d6f3-3ae8-8771-5b0eaa137c70.png)

コントロール一覧の下のほうに「Label」があるので、それをドラッグ＆ドラップで、画面上に配置します。
![qt_creator_10.png](https://qiita-image-store.s3.amazonaws.com/0/36751/fd8fecde-6d27-ce07-7181-1f91878f8edb.png)

「TextLabel」の部分をダブルクリックして「hello world」と入力します。
![qt_creator_11.png](https://qiita-image-store.s3.amazonaws.com/0/36751/41d1f66e-c28b-7ee8-eebb-323f06ee2242.png)

キーボード「Ctrl＋S」でいったん保存し、「Ctrl＋R」で実行します。
自動的にビルドが始まります。最初は少し時間が掛かります。

しばらくすると、「hello world」ソフトが起動します！やったね:smiley:
![qt_creator_12.png](https://qiita-image-store.s3.amazonaws.com/0/36751/e8ff0c1e-eabe-fd1d-8e53-2b85a00aea13.png)

次は【その３：ソフト配布編】に続く予定‥。

(･o･ゞ いじょー。
remmina 不具合

remmina 不具合　よく起こるので備忘メモ

現時点では、windows 7 updateの影響でだめになっている。windows 10 は大丈夫 

2019/02/04 現在
windows 7 での不調 要レジストリ変更
http://minoru.okinawa/archives/1825
Fusion 360 初心者を卒業する方法その２

# いきなりその２から書きますが・・

「コンストラクトメニューを使えるようになること」です。

（その１は「Fusion 360の操作の作法を身に着ける」です。特にパワポのようなイメージを作成するソフトの習慣がついている場合に混乱するので、パワポとside-by-sideで比べた記事を書く予定です）。

<img src='https://qiita-image-store.s3.amazonaws.com/0/103139/194d0aa1-bf55-88c9-cd56-218a1f8b7c2f.png' width='325' />

（英語のメニュー設定なので対応する日本語は分かりません。言語設定を変えればわかるんですが、そのまま英語でやります）

# 初心者が先に進めない理由

一言で表すと、既存の３面（つまりXY面、XZ面、YZ面）と既存の3軸（XとYとZ）でしか使えない状態です。この状態から脱して、自由に空間に面や軸を配置できるようにならないと、先に進めません。

私（初心者）にとって、Fusion 360を使い始めて割と簡単にSketchをExtrudeして簡単な立体構造を作れるようになります。XY面や、XZ面などにいろんなSketchを書いて、Extrudeだけで、立体構造をより複雑なものに出来ます。でも、これだと作れるものに限界があるし、かなり面倒な操作で求めているイメージの構造を作ることになります。私もそうやっていくつかプロジェクトを作りましたが、今思うとかなり非効率的なことをやってたと思います。

ここから脱することが大切で、この記事ではその点について解説します。

# イメージする練習

面や軸を空間に自由に配置できるようになる方法として、ひとつひとつのメニューに練習として使ってみて「操作した結果、どうなったか」を考えながらパターンを理解していく方法があります。それもいいんですが、時間が係ります。私もこの週末やりました。

で、おおよそ理解できたので、今ここではまって抜けられない人に役に立つように「やりたいことのイメージ」をスタートにして、その結果を得るには「どの操作を使えばいいのか」という流れで解説していきたいと思います。全ての操作のイメージを解説することは出来ませんが、いくつか簡単な例を上げてみます。イメージは人それぞれなので、操作を学ぶ時により具体的なイメージを思いつくようにしてみると、思い出しやすいし忘れにくくなると思います。

## イメージ１　- ２階建てバスを作る

<img src='https://qiita-image-store.s3.amazonaws.com/0/103139/ad2971dc-50b5-69d2-deb6-1725556d2f96.png' width='815' />

１階建てのバスがありますね。では２階建てにしたいとします。その時にまず必要になるのは「２階の床」です。これは一番直感的に理解しやすいと思います。

操作は Offset Plane （一番上のメニュー）です。１階を面を指定してやるだけです。1階の面は例えばすでにあるボディーの上面などです。指定するとExtrudeと同じやりかたで「上への距離」を指定できます。そうすることで、オレンジ色の「面」が新たに出来ます。この新しい「面」を選んで、新規Sketchにすれば、この面上にSketchが描かれます。

初めて、既存の面以外の面でSketchを描けたと思います。これが一番よく使うCONSTRUCTのメニューじゃないかな。

なおこのイメージは「1階から2階」という上方向だけでなく、「1枚の壁から隣の壁」のように横方向も全く同じように出来ます。イメージとしてはマンガ喫茶の個室の壁を横方向にどんどん増やしていく感じかな。

## イメージ２ - 食堂の机の端にトレーを置いて、傾けてみる

<img src='https://qiita-image-store.s3.amazonaws.com/0/103139/2599dcd6-7697-94a9-b342-19773bad8eb4.png' width='764' />

食堂でなくてもいいですが、机があったとします。椅子に腰かけてトレーを机の端に、半分ぐらい出た状態で持ちます。トレーのバランスによってはトレーが傾いて落ちそうになりますよね。そういう感じで置いたトレーで「机の上面とは角度がちょっと異なる面」を作ることができます。

メニューは２番目のPlane at angleです。

これで作った面にを「１階の床」と見立てれば、斜め方向の空間にどんどん進んで行けます。角度を選べるようになったことで、かなり自由度が高くなったと思います。

## イメージ３ - バームクーヘンの一切れを２等分する

<img src='https://qiita-image-store.s3.amazonaws.com/0/103139/5bd6a184-49f4-27ee-1f9a-2e687236a0a7.png' width='626' />


バームクーヘンは輪切りではなくて「扇の形」をしてるとします（バームクーヘンがよくイメージ出来ない人は「扇もしくは扇子を真ん中から真っ二つに切る」というイメージでもいいです。

バームクーヘンには切り口が二つありますよね。その両面から等しい距離、すなわち真ん中で、ちょうど２等分するように切る。実際には切らないで、その２等分の位置にあたらしい面を作るのです。

操作は上から４番目の Midplane です（３番目はスキップしました）。

Midplane のアイコンは長方形の立方体を２等分しているイメージですが、それはバームクーヘンではなく羊羹の一切れだった場合です。どちらも「切り口が二つ」なので同じそうさで出来ます。

これで、２つの面に挟まれた空間に何か立方体かそれを利用したCutを作ることが出来るようになりました。さらに自由になった感じになりませんか？

## イメージ４ - サンドイッチを３角形に切る

<img src='https://qiita-image-store.s3.amazonaws.com/0/103139/1efd08a5-690d-9c2f-3a59-de4c37697161.png' width='657' />

これは、ほぼ正方形のサンドイッチを、きれいに２等分するイメージで、包丁が角をきれいに切っていくようすです。サンドイッチを重ねた状態で、角を上下の線と見立てて、２つの線を指定してあげます。

この操作は Plane Through Two Edges です。

ちなみに、エッジ（線が）同じ面にないもの（湾曲しないと繋がらないような２つのエッジ）は選ぶことが出来ません。

# まとめ

「面」に関してのいくつかのイメージを解説しましたが、これ以外に「軸」と「点」があります。メニューを見ると「軸関連の操作」が２番目のグループで、「点関連の操作」が３番目ですが、学習する順番としては「点関連の操作」を先にした方がいいと思います。というのも、「点」は「面」や面の一部である「エッジ」を元に作成することが出来るので順番としてはそちらの方が自然です。さらに「軸」は「点」を使う操作がいくつかあるので、空間に点を自由に置けるようになってからの方がいいと思います。
SQL Server 2008 R2 でテーブル構造を取得


SQL Server 2008 R2 でのデータベースのテーブル構造を取得します。

# 環境
- Microsoft SQL Server 2008 R2
- Windows 2003 Foundation

# 付属の SQL Server Management Studio での操作方法

GUIのオブジェクトエクスプローラーから該当データベースを右クリック→タスク→スクリプトの生成

- 「データベース オブジェクトのスクリプトを作成します。」で「次へ」
- 「スクリプトを作成するデータベース オブジェクトを選択します。」で「特定のデータベース オブジェクトの選択」を選ぶ
- 必要なテーブルにチェックを付けて「次へ」
- ファイル名などを指定して「次へ」
- 内容を確認して「次へ」をすると出力されます
OpenCVでエッジ検出

[前回](https://qiita.com/int_main_Nick/items/cf8a45bb3c08a31c38a9)の続き, 今回はSobel, Laplacian, Canny法を用いたエッジ検出を行う. 
今回は, 用意するものなどは割愛する.

# ソースコード
```cpp:Main.cpp
#include<opencv2/opencv.hpp>

int main()
{
	//グレースケールで画像を読み込む
	cv::Mat img = cv::imread("sample.jpg", 0);
	cv::Mat img_c, img_l, img_s_x, img_s_y, img_s;
	//Canny法を用いてエッジ検出
	//閾値は0 ~ 255で任意で決める
	//第１引数が入力, 第2引数が出力
	cv::Canny(img, img_c, 125, 255);

	//Laplacianでエッジ検出
	//第3引数は検出範囲
	cv::Laplacian(img, img_l, 3);
	cv::convertScaleAbs(img_l, img_l, 1, 0);
	//2値化
	cv::threshold(img_l, img_l, 0, 255, cv::THRESH_BINARY|cv::THRESH_OTSU);
	
	//Sobelでエッジ検出
	//x, y方向の微分
	cv::Sobel(img, img_s_x, CV_8UC1, 1, 0, 3);
	cv::Sobel(img, img_s_y, CV_8UC1, 0, 1, 3);
	//x, y方向に微分をした画像を合成
	img_s = abs(img_s_x) + abs(img_s_y);
	cv::convertScaleAbs(img_s, img_s, 1, 0);
	//2値化
	cv::threshold(img_s, img_s, 0, 255, cv::THRESH_BINARY|cv::THRESH_OTSU);

	//画像の保存と出力
	cv::imwrite("canny.jpg", img_c);
	cv::imwrite("laplace.jpg", img_l);
	cv::imwrite("sobel.jpg", img_s);
	cv::imshow("Canny", img_c);
	cv::imshow("Laplace", img_l);
	cv::imshow("Sobel", img_s);
	cv::waitKey(0);

	return 0;
}

```

入力画像
![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/3a84fa0b-504f-04f3-80f0-6661ba5e333b.jpeg)
出力画像
Canny法
![out.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/0913bf85-1397-bb8c-6f6e-2e98f36e83c4.jpeg)

Laplacian
![laplace.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/69e80614-17ac-4367-fef5-fd2cac1cf157.jpeg)

Sobel
![sobel.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/ec3469fc-dfa5-5b99-5c41-16de6b301ac1.jpeg)