OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトメンバー全員のPCに仮想サーバ入れたい


## 目次

* 仮想環境と近年の発展
* メンバーへの配布
* メリット
* あらゆる争いごとが消失し世界が平和になる

----

## 仮想環境とは

仮想化技術を使って、擬似的な環境（サーバ等）を構築する。
今回は自身のPC上のみで構築する「ローカル仮想環境」の発表をします。

----

## 仮想化ソフトウェアの紹介

<img src="https://qiita-image-store.s3.amazonaws.com/0/151078/ea34f269-5bb9-6f42-ce56-28d2295b56a1.png" height="100"> 

Oracle VirtualBox ※ おすすめ

<img src="https://qiita-image-store.s3.amazonaws.com/0/151078/76cae98c-473f-16ec-f2ec-09cd30534932.png" height="80">

VMWare Player ※ 商用利用は有料

----

## 過去の仮想環境構築（2012年頃）

ハードルが高かった

* ディスクからOSインストール
* ネットワーク周りの難しさ
* パッケージや変更の配布などが大変

----

## 仮想環境マネージャ

<img src="https://qiita-image-store.s3.amazonaws.com/0/151078/10bf2e7a-9f91-c377-c8bb-f1646c84567f.png" height="160">

Vagrant ※ ホスト型

<img src="https://qiita-image-store.s3.amazonaws.com/0/151078/fd75ccb3-1956-6163-e581-0c7c60d6452c.png" height="100">

Docker ※ コンテナ型 今回は出番なし

----

## Vagrant の利点

VirtualBox や VMWare とその環境を管理する

* 各OSイメージが公式ページで配布されている
* 構築情報をテキストファイルとして保管
    * メンバーへの配布が楽
    * ソース管理ができる

----

## Vagrantを利用すれば 全メンバーへの仮想環境の導入も可能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151078/4cb0253e-ad80-7ada-6b8f-a4c2f48a0b81.png)

----

## 仮想環境構築って難しくない？

Q. 仮想環境構築って難しそう

A. ツールの発展で難易度が劇的に下がった。
コマンドひとつで仮想サーバの構築、起動ができます。

----

## 各自が仮想環境を導入する効果

全メンバーが専用の「サーバサイドアプリ」を持つことができる。

* 他者の作業との衝突を避けられる
* アップデート、メンテの際のコミュニケーションコストが減る

----

## 職種ごとの利用メリット

* クライアントエンジニア
    * 他者との作業衝突が発生しない
    * サーバ上のパラメータ変更などが容易
* プランナー
    * ゲームバランス調整作業の効率化
    * プレイヤーの強化などが可能

----

## 職種ごとのメリット

* デザイナー
    * 画像リソースの修正確認などの効率化

* 運営
    * サーバ時刻を変更することでスケジューリングされた動作の確認
    * クリア済みデータなどの作成が可能
   
----

# まとめ

--- 

# プロジェクトメンバー全員のPCに仮想サーバ入れたい

----

# <img src="https://qiita-image-store.s3.amazonaws.com/0/151078/55f3bcf4-ab50-06ed-8f02-2dfb3c5ffaf9.png" height="190"><br>エゴだよ それは！

----

## 世界平和に向けて

課題

* 標準以上のスペックのPCが必要
* 学習コストがかかる
* 仮想環境にトラブルはつきもの
    * しかも面倒くさい

----

## 最後に

仮想環境構築、楽しいので一度やってみてください。
変数を外部のファイルにまとめておいて、読み込みたい。

複数のスクリプトファイルに分かれてくると、トークンとか、IDとか、変数の定義の場所がバラバラになったりするの嫌ですので、settings.py的なやつにまとめてみました。

暗号化するものとかはまだ自分にはハードルが高いので、さくっとできるもの。


試しに2つのファイルを用意します。

```val_settings.py
# -*- coding: utf-8 -*-

AAA = "String message"

BBB = ['aaaa', 'bbbb', 'cccc']

CCC = {
        'ID':1,
        'name': 'pypy',
        'value': '5',
        }
```

```main.py
# -*- coding: utf-8 -*-
from val_settings import * #変数のインポート


print("AAA : {}".format(AAA))
print("BBB : {}".format(BBB))
print("CCC : {}".format(CCC))
print("CCC['ID'] : {}".format(CCC['ID']))
```

これで`main.py`を実行したときに、`val_settings.py`の変数が展開できる。

## 実行例

```sh
ajitama@ajitama-sv:~/python-practice$ python3 main.py 
AAA : String message
BBB : ['aaaa', 'bbbb', 'cccc']
CCC : {'ID': 1, 'name': 'pypy', 'value': '5'}
CCC['ID'] : 1
ajitama@ajitama-sv:~/python-practice$ 
```
toggle function


toggleClass is executed immediately and so you don't need a callback for toggleClass, just place the alert('a') in the next line which will alert after toggleClass is executed.

Edit: Looks like you want jQuery UI Effects - toggleClass which unfortunately doesn't have a callback function.

Probably you should write your own toggle function. See below for fadeIn/fadeOut toggle,

```ruby:qiita.rb

var $loader = $("#loader");
if ($loader.is(':visible')) {
  $loader.fadeOut(100, function () {
      alert('fade out complete');
  });
} else {
  $loader.fadeIn(100, function () {
      alert('fadeIn complete');
  });
}
```
how to make the shopify theme?

slate theme

1. 쇼피 테마 만드는것을 알게됨
2. yarn 으로 git 에서 스타터 테마 다운로드
3. mskert 다운로드
4. yarn start
5. 테마 upload 동기화돼서 개발 가능함

그전에 shop partner 에 가입하고 저장소를 만들어야함
app 에서 프라이빗앱도 만들고 api 비밀번호도 입력해야함


2018.1218
slate theme 로 만들다가 themekit 으로 전환
1.themekit폴더생성 -> 
2.theme.exe를 다운로드하여 themekit 폴더안에 복사하여 넣는다
3.theme configure --password=[your-api-password] --store=[your-store.myshopify.com] --themeid=[your-theme-id]
4.theme download 
5.연동확인
Nuxtモジュールのaxiosでレスポンスヘッダが取得できない

Nuxtでaxiosを利用するときは、標準のものではなく、[nuxt-community/axios-module](https://github.com/nuxt-community/axios-module)を使うことが多いと思う。axiosをラップしているので、より使いやすくなってはいるが、その反面、あまり融通が効かない。

今回、ハマったのがレスポンスの取得である。

以下のコードを見て欲しい。

```js:レスポンス取得
this.$axios.$post(`/login`,formData)
  .then(response => {
    console.log(response)
  })
  .catch(e => {
    console.log(e)
  })
```


さて、上記のリクエストを行ったときのログはどのように出力されるか。
ちなみにサーバからはレスポンスデータ（ボディ）は空を返す。

オリジナルのaxiosでは、公式サイトにも記載されているとおり、以下のようにレスポンスに対してアクセスが可能。

```js:axios公式から抜粋
axios.get('/user/12345')
  .then(function (response) {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
  });
```


では、nuxt-module版axiosの場合は、空文字が出力される。つまり、何も出力されない。
~~挙動が違うのはなぜか。~~

~~これは[ここのソース](https://github.com/nuxt-community/axios-module/blob/dev/lib/plugin.template.js)の39行目に注目してほしい。~~

```js:plugin.template.js
axiosExtra['$' + method] = function () { return this[method].apply(this, arguments).then(res => res && res.data) }
```

~~特に```res => res && res.data```の部分。~~

~~これは、レスポンスのデータだけを返すことを意味する。~~
~~つまり、nuxt-module版のaxiosではデータ以外は取得できない。~~

~~ただし、onResponseハンドラでは取得が可能。~~

~~どうしても、ヘッダなどデータ以外を取得したい場合は、オリジナルのaxiosを使うか、nuxt-modules版のソースをいじるかになる。ソースをいじった場合は以下のようになる。~~

```js:plugin.template.js（修正版）
axiosExtra['$' + method] = function () { return this[method].apply(this, arguments).then(res => res) }
```


上記のような対応を行わなくても、以下のような対応で取得が可能になる。

```js
// HTTPメソッド部分の$をはずす
this.$axios.post(`/login`,formData)
  .then(response => {
    console.log(response)
  })
  .catch(e => {
    console.log(e)
  })
```
SQLServerでのデータベース？使用率をパーセンテージ表示してみる

##### はじめに
SQLServerのことはほとんど分かってません。初心者なので。

なんやかんやでSQLServerを触ることになってタイトルの通りの処理をしないといけないことに。
まだ完全に完成してないので、後で弄るとき困るといけないのでメモ書き程度に置いておきます。

---

##### 容量の確認
- とりあえず確認用に作ったデータベース「testdb」に適当に詰め込み容量を確認する。

```kakunin.sql
use testdb
go
EXEC sp_spaceused
go
```

```実行結果.txt
database_name                                                                                                                    database_size      unallocated space
-------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------
testdb                                                                                                                           9232.00 MB         780.26 MB
reserved      data          index_size    unused
------------- ------------- ------------- -------------
61176 KB      59248 KB      1304 KB       624 KB
```

database_nameやdatabase_sizeは分かるけどそれ以外はなんて書いてあるのか分からない（英語力皆無）
ということで調べていく。
見るところはやっぱり[Microsoft Docs](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-spaceused-transact-sql?view=sql-server-2017)

| 列名　　　         | 説明    　　　    |
|:------------------|-----------------------:|
| database_name     | 現在のDB名|
| database_size     | DBサイズ（データ+ログ）|
| unallocated space | 未割当の領域|
| reserved          | DB内で割り当てられた領域|
| data              | データ使用領域の合計|
| index_size        | インデックスの使用領域の合計|
| unused            | DB内でオブジェクト用に予約されているが使用されていない領域の合計|

・・・なるほど？少しだけ分かった気がする。

---
##### 使用率を調べるには

ここから使用率を調べるために資料を漁っていると
`FILEPROPERTY ( file_name , property )`　というものを発見。

SpaceUsedというプロパティがあり指定したファイルで使用されている容量を確認できるらしい。

---

##### 組んでみた

- ということで~~組んでみた~~組んでもらった

```usedspace.sql
use testdb
go
select
name,
size * 8/1024 AS [ファイルサイズ（MB）] ,
FILEPROPERTY(file_name(fileid),'SpaceUsed')*8192.0/power(1024.0,2) AS [使用領域(MB)] ,
FLOOR((FILEPROPERTY(file_name(fileid),'SpaceUsed')*8192.0/power(1024.0,2))
/(convert(numeric(20),size) * 8192/1024/1024) * 100 ) as [データ使用率(%)]
from dbo.sysfiles
go
```

```実行結果.txt
name                                                                                                                             ファイルサイズ（MB） 使 用領域(MB)                                 使用率(%)
-------------------------------------------------------------------------------------------------------------------------------- ----------- ---------------------------------------- ----------------------------------------
testdb                                                                                                                                   840                60.1250000000000000000000                                7.1577381
testdb_log                                                                                                                              8392                 9.7109375000000000000000                                 .1157166
```
---

##### おわり

ちゃんと動いてる・・・けどdatabase_size単体での使用率は出せないのかな？そこはよくわかりません。

そこより気になるのが小数点以下の0が多いことだけど、切り上げ、切り捨て、四捨五入にはFLOORやCEILINGやROUNDというものがあるらしい。
ここはまた今度調べてみたいところ。

とりあえず使用率の表示はできたからここからバッチファイルかPowershellで使用率を取り出して云々しないといけないから頑張ろう。
curlで証明書エラーが出る場合の対処法


## 症状
linuxbrewでインストールしたcurlコマンドを実行する際に下記のエラーがでる

```sh
curl: (77) error setting certificate verify locations:
  CAfile: /home/user_name/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/user_name/.linuxbrew/etc/openssl/certs
```

## 対処法
証明書をダウンロードして該当ディレクトリに保存する

```sh
$ wget http://curl.haxx.se/ca/cacert.pem
$ cp cacert.pem /home/user_name/.linuxbrew/etc/openssl/cert.pem
```
Mozillaの証明書のようです。
https://curl.haxx.se/docs/caextract.html
【備忘録】Progate PHP 道場コースⅡ まとめ

今回はPrpgateの学習コースPHPⅡで出た基礎知識をまとめていきます。

##クラスとインスタンス
クラスとは要素を入れる箱で、次のように記述します。

```
<?php 
  class Menu{
  ----
  }
//classの名前は大文字で始める
?>
```

インスタンスとはクラスの中にある要素のことで、以下のように記述します。

```
<?php
  $curry = new Menu();
  $pasta = new Menu();
?>
```

##プロパティ
プロパティとはクラス内に定義するインスタンスのデータのことで、以下のように記述します。

```
<?php 
  class Menu{
  public $name;
  }
///プロパティを定義するには主にpublic,private,protectedと3つの修飾詞があります。
?>
```

またこれらのこれらのプロパティにアクセスし表示するためには以下のような記述をします。

```
<?php
  $curry -> name = 'CURRY';
　　　　$pasta -> name = 'PASTA';
　　　　echo $curry -> name;
  echo '<br>';
  echo $pasta -> name;
?>

結果：
CURRY
PASTA
```

##メソッド
メソッドとはオブジェクトに対して指定する動作のことで、以下のように記述します。

```
<?php
class Menu {
  public $name;
  public function hello(){
    echo '私はMenuクラスのインスタンスです';
  }
  ///ここでメソッドを定義します
}

$curry = new Menu();
$pasta = new Menu();
$curry->name = 'CURRY';
$pasta->name = 'PASTA';

$curry -> hello();
echo '<br>';
$pasta -> hello();
///クラス内にあるインスタンスからメソッドを呼び出します

?>

結果：
私はMenuクラスのインスタンスです
私はMenuクラスのインスタンスです
```

##$this
メソッドの中で$thisという変数を使うことでそのメソッドを呼び出しているインスタンスと置き換えることができます。

```
<?php
class Menu {
  public $name;
  public function hello() {
  echo '私は'.$this->name.'です';
  }
}

$curry = new Menu();
$pasta = new Menu();
$curry->name = 'CURRY';
$pasta->name = 'PASTA';
$curry->hello();
echo '<br>';
$pasta->hello();

?>

結果：
私はCURRYです
私はPASTAです
```
AndroidStudio旧バージョンのソース管理

旧バージョンのソースがandroid studioのバージョンアップアップしてビルドできなくなる場合の為にソースのバックアップと旧バージョンのandroid studioアプリケーションの保存又は、旧バージョンのandroid studioの再セットアップ時の注意点を、体験を元にレポートします。
16進数のカラーコードをRGBA形式に変換する

ユーザーが設定した色（16進数）を要素の背景色として利用しているのですが、デザインの関係でその色を透過しなくてはならない。
opacityでやれば当然、その背景色が指定されている小要素すべてが透過されてしまうのでRGBA形式で背景色を指定してやる必要がある。

いままではJQueryで書き換えてましたが、RAILS側で出来た方がスマートだろ？と思いゴニョゴニョした結果が以下。


```ruby:sample_helper.rb
  def hex_to_rgba(hex="デフォルトにしたいカラーコード", alpha="1.0")
    "Hello #{hex}"
    color_hex = 【＃の付いたカラーコード変数】.sub(/#/, '')
    color_rgb = color_hex.each_char.each_slice(2).map{|a| a.join.to_i(16)}
    color_rgba = "rgba(#{color_rgb[0]}, #{color_rgb[1]}, #{color_rgb[2]}, #{alpha})"
  end
```

```html:sample.haml
:scss
  .test{
    width: 100px;
    height: 100px;
    background-color: #{hex_to_rgba('#FF0000', '0.8')};
  }
.test
  80%に透過された赤色の矩形
```
react-native linkで、Android側で重複してインストールされてしまう件

いつからなのか、`react-native link`(パッケージ指定なし)を実行したら、既存パッケージが重複して追加されてしまいました。

例えば`settings.gradle`に以下のように重複。Applicationクラスなども同様。

```
include ':react-native-splash-screen'
project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android')

include ':react-native-splash-screen'
project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android')
```

app/build.gradle

```gradle
dependencies {
    compile project(':react-native-splash-screen')
    implementation project(':react-native-splash-screen')
}
```


カスタムフォントを追加するための記事を見ると`react-native link`を打てと書いてあるし、
調べてみても具体的な解決策がなく途方にくれていたのですが、、、

簡単に解決できました。

私の場合、**原因はapp/build.gradleにありました**。

もともとbuild.gradle内では

```gradle
dependencies {
    compile project(':react-native-splash-screen')
}
```

のように記載していたのですが、AndroidStudioのログを見ていると

```
Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
```

つまり`compile`じゃなくて`implementation`か`api`を使えとあり、ちょっと調べたら`implementation`を使っている例が多かったので、

```gradle
dependencies {
    implementation project(':react-native-splash-screen')
}
```

としたんですね。
これで警告が出なくなったしメデタシメデタシと思っていたのですが。。。

どうやら`react-native link`で重複されるようになったのは、
この**implementationが原因**だった模様。

implementation => compile　に戻したら重複しなくなりました。

でも、あの警告には

```
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
```

**compileは2018年末に削除される**と書いてあるし。。
この点はどうすれば良いのでしょうか。

ご存知の方がいらっしゃったら教えてください！

なお、環境は以下です。

```
"react-native-cli": 2.0.1
"react": "16.4.1",
"react-native": "0.56.0",
```

react-nativeは0.57.8にしてもダメでした。。。
Robo3TでMongoDBに接続しようとしたら弾かれた件

# 事象
`Robo3T v1.2.1`というGUIからmongoDBに接続を試みた際、ssh tunnelで`id_rsa`にて認証を行おうとした時に以下のようなエラーで弾かれた。

Error: Resource temporarily unavailable. Authentication by key failed (Error -16). (Error #35)

`id_rsa`は`ssh-keygen`で作成。
サーバーには`id_rsa.pub`を設置済み。
ターミナルではsshコマンドでDBServerに接続できるが、GUIで接続をしようとすると上記エラーで弾かれる状況。

# 原因
`$ ssh-keygen`にて生成した`id_rsa`に問題があった？

###### 経緯
`$ ssh-keygen`で作成した`id_rsa`を使用して接続できる人と接続できない人がおり、
接続できる人は`MacOSX High Sierra`で、接続できなかった自分は`MacOSX Mojave`だった。
どちらもGUIは`Robo3T v1.2.1`で同じバージョンを使用していた。

接続できる人に接続できなかった自分の`id_rsa`を渡して接続を試してもらったところ、
接続できなかったため、自分の`id_rsa`が問題であることがわかった。

OSなのかlinuxのバージョンなのか`ssh-keygen`で生成される`id_rsa`が異なるのかも。

# 解決
以下のSOから解決
https://github.com/Studio3T/robomongo/issues/1189

まんまですが、まず、opensslにて秘密鍵(.pem)を生成

    $ openssl genpkey -algorithm RSA -out private.pem

次にssh-keygenで秘密鍵を参照して公開鍵を生成

    $ ssh-keygen -y -f private.pem

公開鍵が表示されるので、`private.pem.pub`としてとりあえず保存。
公開鍵の文字列をサーバーに設定し、Robo3TのPrivate Keyに`private.pem`を設定したら接続に成功した。

何故かまでは掘り下げて検証はしていない....
同じform内にsubmitボタンが複数ある際のdisable_withの使い方

# disable_withについて
disable_withはsubmitボタンを押した際に二重送信を防いでくれる上にボタン上の文言も「送信中..」などに変更してくれる便利なメソッドです。

```
= f.submit "投稿する", class: "btn", data: { disable_with: "投稿中..." }
```

こんな感じで使用します。

#ボタンが複数ある場合

ボタンが複数ある場合に困りました。例えば下記のように２つボタンを用意していた場合、どちらを押してもどちらも「投稿中...」「編集中...」となってしまいます。

```
= f.submit "投稿する", class: "btn", data: { disable_with: "投稿中..." }
= f.submit "編集する", class: "btn", data: { disable_with: "編集中..." }
```

処理自体は正常に処理されるのですが、ユーザー側から見た場合困惑してしまいます。

#対応

JSでsubmitをイベントにして、押したボタン以外のdata-disable-withを削除するという方法で対応しました。

```
$(document).on('click', '.new-ticket-confirm :submit', function () {
    var buttons = $('.new-ticket-confirm :submit').not($(this));
    buttons.removeAttr('data-disable-with');
    buttons.attr('disabled', true);
});
```

#参考

https://stackoverflow.com/questions/17898079/rails-form-disable-with-option-with-2-submit-buttons-start-disabling-other-butto
npzの作り方

# npzを作り方
以前、 https://www.python-izm.com/data_analysis/numerical/numpy/ndarray_filerw/ を参考に作成方法を学んだ。[^1]
https://qiita.com/Rikiya_Ota/items/6977cd7831a008ff35bd
こちらのサイトもnumpy自体の理解をするのに参考にさせていただいた
[^1]: 補足ではあるがこちらのサイトは興味があったので、リンクさせていただきました(https://teratail.com/questions/113349)

けど、えっ、あっ、もとファイルをいちいち作成しないとだめ？
CSVとか、Excelから読み込んで生成してくれないかな？

はい、調べてみましょう。

## CSVや、Excelからnpzを作る
はい！
https://qiita.com/tanakadaichi_1989/items/c655d93a1fae56f2be07
やはりどなたかすでに実践されている方がいらっしゃいましたね。
しかも、**ワイン**‼
いやー、こんなおしゃれなテーマでDeepLearningを検討してみたい、、、私はマニマニマニーですｗ

こちらのサイトは非常にわかりやすい‼

```
#CSVファイルの読み込み
wine_data_set = pd.read_csv("winequality-red.csv",sep=";",header=0)`

#説明変数(ワインに含まれる成分)
x = DataFrame(wine_data_set.drop("quality",axis=1))

#目的変数(各ワインの品質を10段階評価したもの)
y = DataFrame(wine_data_set["quality"])

#説明変数・目的変数をそれぞれ訓練データ・テストデータに分割
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.05)
```
と言うことで、こちらの１行目を見てわかるように、CSVから取得できるようですね。
で、その後、なんやら**DataFrame**というのを使って定義をし、最後に教師データとテストデータに分けているようですね。

あぁ、次は**DataFrame**ですか。

## DataFrame
DataFrameは

```
import pandas as pd
from pandas import Series,DataFrame
```

にある通り、**pandas**と言うライブラリに含まれている[データフレームワーク](https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.html)の事のようですね。
https://pythondatascience.plavox.info/pandas/pandas%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

次から次へと、、、１つ覚えて、１つ忘れてしまうこの世代には辛い、、、

## sklearn
本当にプログラミングは新しいキーワードが尽きないww(良い意味で心地よい)
次は、ワインのサイトにあった

```
#説明変数・目的変数をそれぞれ訓練データ・テストデータに分割
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.05)
```

なんやら**train_test_split**と言うので学習、テストデータを作っているようだ。
こいつは何者‼

```
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
```

はい、ワインのサイトの方で最初の定義に出てきた**sklearn**と言うライブラリに含まれているものですね。
https://techacademy.jp/magazine/17375
こちらで丁寧にsklearnは初心者向けで使いやすいよ‼と教えてくれていますね。

なんか、様々なページを見てきましたが**「ゼロから学ぶDeepLearning」**を読んだと言う方が多かった。
動画で説明してくれている方もいらっしゃるようだ。(https://note.mu/daikawai/n/n6b79858880e2)

なんか、みなさんちゃんと勉強してから挑んでいるにも関わらず、私は相変わらずの斜め読みで構築中ww

# まとめ
なんか、データ解析周りまで進みそうになってしまったが、今回の目的は最低限、**CSVからnpzを作る**ところまで。
https://note.nkmk.me/python-pandas-numpy-conversion/
最後に、こちらのサイトを紹介して終わりたいと思います。

なんか、今までの長文が嘘のようでしたｗ

# 後述
今更ながら**define by run**と、**define and run**について改めて考えています。
と言うのも、**define and run**は、今、学習しているTensorflowではあるのですが、これは一度生成してしまうと、その学習内容を基に諸々が判断されてしまいます。
例えば、０〜９までの数字があって、どれが近いか、、、と言うのであれば、**define and run**の*静的ニューラルネットワーク*で良いですが、FXのように常にデータ変動を踏まえながら学習していく必要がある場合、**define by run**である*動的ニューラルネットワーク*である必要があるのではないか、と思ったからです。
**Tensorflow**も**Tensorflow fold**と言う**動的ニューラルネットワーク**版を出したようだし、、、。

## 参考サイト
https://cpp-learning.com/chainer_define-by-run/
https://www.hellocybernetics.tech/entry/2017/02/27/025441
Rubyのeachメソッドで繰り返し回数を指定する方法

# やりたい処理
eachメソッドで配列を繰り返し処理する際に、回数を指定したい。

通常

```ruby
countries = ["Japan", "America", "China", "Korea", "Canada", "Brazil", "Bhutan"]
countries.each do |country|
  puts country
end
#  Japan America China Korea Canada Brazil Bhutan
```

# first(回数）
回数を指定する場合firstメソッドを使用し、引数に回数を指定する。

```ruby
countries = ["Japan", "America", "China", "Korea", "Canada", "Brazil", "Bhutan"]
countries.first(3).each do |country|
  puts country
end
#  Japan America China
```


ちなみ同時にshuffleメソッドを使うとランダムに指定した回数分取り出せる。

```ruby
countries = ["Japan", "America", "China", "Korea", "Canada", "Brazil", "Bhutan"]
countries.shuffle.first(3).each do |country|
  puts country
end
#  ランダムで３つ
```

# 参考
https://ref.xaio.jp/ruby/classes/array/first
https://ref.xaio.jp/ruby/classes/array/shuffle
.vimrcやVim scriptでの"~"を使ったホームディレクトリのパスの展開

備忘録です。
プラグインの設定の際に `'~/.config/composer/vendor/bin/hoge'` と設定して動かなかったので。

こちら([Vimのexpand\(\)関数 \- Blogaomu](https://www.blogaomu.com/entry/vim-expand))と同じはまり方をしました。 同じ部分を本家ドキュメント([eval \- Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/eval.html#expand()))から引用します。

>
expand() はシェルの持っている変数や環境変数を展開できる。しかし展開のためにシェルを起動するかもしれないので速度が遅くなることがある。expr-env-expand 参照。
展開された変数はファイル名のリストのように扱われる。環境変数を展開できないときはそのままになる。よって、":echo expand('$FOOBAR')" の結果は "$FOOBAR" となる。

つまり、以下のようになります。

```vim
"OK!!!
if filereadable($HOME.'/.vimrc')
    echo "ok1"
endif

"NG.....
if filereadable('~/.vimrc')
    echo "ok2"
endif

"OK!!!
if filereadable(expand('~/.vimrc'))
    echo "ok3"
endif

"NG.....
if filereadable("$HOME/.vimrc")
    echo "ok4"
endif

"OK!!!
if filereadable(expand("$HOME/.vimrc"))
    echo "ok5"
endif
```

=>

```
ok1
ok3
ok5
```
WildFly を実行すると ClassCastException が発生する現象について

# 概要
[こちらのページ](http://typea.info/blg/glob/2014/06/java-ee-7-wildflydatasource.html) を参考にして、Hibernate にて DB アクセスをしているアプリのデータソースを作成して、WildFly を起動したところ、下記のエラーが発生しました。

```
14:56:32,007 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 72) MSC000001: Failed to start service jboss.persistenceunit."syu.war#SYSY11": org.jboss.msc.service.StartException in service jboss.persistenceunit."syu.war#SYSY11": java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory
	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:195)
	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:125)
	at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:650)
	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:209)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
	at java.lang.Thread.run(Thread.java:748)
	at org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory
	at org.dom4j.DocumentFactory.getInstance(DocumentFactory.java:97)
	at org.hibernate.internal.util.xml.XMLHelper$1.doWork(XMLHelper.java:33)
	at org.hibernate.internal.util.xml.XMLHelper$1.doWork(XMLHelper.java:27)
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.workWithClassLoader(ClassLoaderServiceImpl.java:483)
	at org.hibernate.internal.util.xml.XMLHelper.<init>(XMLHelper.java:26)
	at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:116)
	at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:101)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:297)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)
	at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:167)
	... 9 more

```

# 対処策
DocumentFactory　から DocumentFactory にキャストしようとして失敗しています。
これは、Hibernate が利用している dom4j と WildFly が利用している dom4j のバージョンが異なるため発生しているようです。
私の場合、うっかりミスで発生していました。
WildFly のバージョンが、

* pom.xml
    * 8.2.1.Final
* 実行環境
    * 14.0.0.Final

と食い違いを見せており、この　バージョン間の差異により上記エラーが発生してしまっていました。
実行環境を 8.x の WildFly に変更すると正常に動作するようになりました。
Seleniumでelement not interactableって怒られる場合でもエレメントを押下する方法

ユーザーが特定のボタンを押下すると表示するカレンダー上のボタン（エレメントはspan）をseleniumで押下するために以下のようなコードを実装して動かして見たところ

```
# 事前にボタンを押下して対象のカレンダーを表示済み
driver.find_elements_by_xpath("/PATH/TO/ELEMENT").click()
```

> element not interactable

って怒られる。
エレメントの属性を確認していると、is_displayed()の戻り値はFalse。

```
element = driver.find_elements_by_xpath("/PATH/TO/ELEMENT")
driver.execute_script("arguments[0].style.visibility='visible';", item)
driver.execute_script("arguments[0].style.display='inline-block';", item)
element.click()
```

とか頑張って見てもis_displayed()の戻り値はFalseのまま。

presence_of_element_locatedを使ってWaitをかけてもタイムアウトして一向に表示扱いになる気配なし。
そもそもブラウザ上での操作を見ていると対象のエレメントは表示されているし、きちんとブラウザの表示領域内に収まっている。
無論、自分で操作したら問題なく押下できている。

仕方ないのでアプローチを変更してエレメントのある領域を押下するという方法で今回は実現できた。

```
from selenium import webdriver
...
element = driver.find_elements_by_xpath("/PATH/TO/ELEMENT")
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(element, 5, 5)
action.click()
action.perform()
```

無理やり感がちょっと強いが動くことが大事なテスト用のコードなので大目に見る。
Java で Json を標準ライブラリだけで処理したいときに使うコード（改良版）gson 不要

# 【追記1】
Java 17では Script Engine の除外にともない、この技は利用できません．
この記事が必要な方はもうしばらく Java 8 だと思いますが。。

# 【追記2】
2025年追記: Java 11 において JavaScript Engine は非推奨になっており、Java 15 では削除されていますので、この記事は完全に過去のものです。

---

gson も便利ですが、複数階層を一気に辿れないなど、面倒だと思いましたのでこのようなツールを作っています。
あと「XXシステムでGson使いたいのが本音だが社内の承認などが面倒」というつまらない理由も多いことでしょう。

＊デスクトップ版で普及しているJVMには標準で「JavaScript Engine」が搭載されており、それを呼び出すことで実現しております。組み込み系では不可の可能性が高いです。


こんなふうに使えます。

```java
public static void main(String[] args) {
String json = "{'test':'this is test','test2':{'test3':'value3'},'test4':['a','b','c']}";
	{
		Object value = JsonUtil.get(json, "test"); // <- 
		System.out.println(value); // "this is test"
	}
	{
		Object value = JsonUtil.get(json, "test2.test3"); // <- これをやりたい
		System.out.println(value); // "value3"
	}
	{
		Object[] value = JsonUtil.getAsArray(json, "test4");
		System.out.println(Arrays.toString(value)); // ["a","b","c"]
		System.err.println(value.getClass());
		for (int n = 0; n < value.length; n++) {
			System.err.println(value[n]);
		}
	}
}
```

以下、ソースコードです。ご自由にコピペなり改造なりしてお使いください。

```java

package pkg;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JsonUtil {

	public static Object[] getAsArray(String json, String code) {
		Object obj = get(json, code);
		if (obj instanceof Object[]) {
			return (Object[]) obj;
		} else {
			return null;
		}
	}
	public static Object get(String json, String code) {
		// Get the JavaScript engine
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("JavaScript");

		String script = "var obj = " + json + ";";
		try {
			engine.eval(script);
			{
				Object obj = engine.eval("obj." + code);
				if (obj instanceof Map) {
					java.util.Map map = (java.util.Map) obj;
					Set entrySet = map.entrySet();
					Object[] arr = new Object[entrySet.size()];
					int n = 0;
					for (Object objValue : map.values()) {
						if (objValue instanceof String) {
							String sValue = (String) objValue;
							arr[n] = sValue;
						} else {
							arr[n] = map.get(obj);
						}
						n++;
					}
					return arr;
				}
				return obj;
			}
		} catch (ScriptException e) {
			e.printStackTrace();
			return null;
		}
	}
	public static void main(String[] args) {
		String json = "{'test':'this is test','test2':{'test3':'value3'},'test4':['a','b','c']}";
		{
			Object value = JsonUtil.get(json, "test");
			System.out.println(value); // "this is test"
		}
		{
			Object value = JsonUtil.get(json, "test2.test3");
			System.out.println(value); // "value3"
		}
		{
			Object[] value = JsonUtil.getAsArray(json, "test4");
			System.out.println(Arrays.toString(value)); // ["a","b","c"]
			System.err.println(value.getClass());
			for (int n = 0; n < value.length; n++) {
				System.err.println(value[n]);
			}
		}
	}
}

```
Oracle Databaseのアンインストール

# Oracle Databaseのアンインストール

## 参考
Oracle® Databaseインストレーション・ガイド 11gリリース2 (11.2) for Linux
7 Oracle Databaseソフトウェアの削除
https://docs.oracle.com/cd/E16338_01/install.112/b56273/remove_oracle_sw.htm

## 削除ツールの場所
$ORACLE_HOME/deinstall/ ディレクトリにあります。

## deinstallコマンドについて
deinstallコマンドでは、次の構文を使用します。

```
deinstall
    -home <complete path of Oracle home>
    [-silent]
    [-checkonly]
    [-local]
    [-paramfile <complete path of input parameter property file>]
    [-params <name1=value[ name2=value ...]> ]
    [-o <complete path of directory for saving files>]
    [-tmpdir <complete path of temporary directory to use>]
    [-logdir <complete path of log directory to use>]
    [-help]
```

$ORACLE_HOME/deinstallパスからdeinstallを実行する場合は、実行されているホームをツールが認識できるため、-homeフラグは不要です。とのこと。

## 実行例
### チェックのみ
```
$ORACLE_HOME/deinstall/deinstall -checkonly
```

### コマンドの実行
```
$ORACLE_HOME/deinstall/deinstall
```
PowerShellを使って既定のプリンターの変更と用紙設定の変更

PowerShellを使って印刷するスクリプトを書いた。


```posh:印刷
Start-Process \.printingfile.pdf -Verb Print
```

このスクリプトでは

- 規定のプリンタ
- 既定の用紙設定

で印刷し続けるだけ。

PowerShellで以下のことをやりたい

- 既定のプリンターの変更
- 既定の用紙設定の変更
    - 用紙サイズ
    - 印刷の向き

## 環境
- Windows10 Pro/Home
- PowerShell v5.1


## 既定のプリンターの変更

下記のコマンドを走らせれば一発。

```posh:既定のプリンターの変更
$Printers=Get-WmiObject Win32_Printer
$Printer=$Printers | Where-Object Name -eq "Canon Generic Plus LIPSLX"
# Powershell v2.0
# $Printer=$Printers | Where-Object {$_.Name -eq "Canon Generic Plus LIPSLX"}
$Printer.SetDefaultPrinter()

```
Windows10の設定でプリンターとスキャナーを見てみましょう。

![pp04.png](https://qiita-image-store.s3.amazonaws.com/0/24550/7004d067-f89c-cec9-c71b-d534f93c09f5.png)

設定されました。

## 用紙サイズの変更

A4からB5に変更します。

```posh:用紙サイズ変更
$Printers=Get-WmiObject Win32_Printer
$Printer=$Printers | Where-Object Name -eq "Canon Generic Plus LIPSLX"
# 基本設定のPaperTypeを変更
$Printer.DefaultPaperType="B5"
# 更新
$Printer.Put()

```

プリンターのプロパティの基本設定を開いてみましょう。

![pp00.png](https://qiita-image-store.s3.amazonaws.com/0/24550/1c5131b0-4164-0665-a0cf-8cc0448c5962.png)

原稿サイズがB5になっています。

![pp01.png](https://qiita-image-store.s3.amazonaws.com/0/24550/b2aa850c-f158-bc95-23ca-8084cee33379.png)


## 用紙の向きの変更


```posh:Page_Orientation
# 標準設定の用紙設定をXML出力
$p=Get-PrintConfiguration -PrinterName "Canon Generic Plus LIPSLX"
$p.PrintTicketXML | Out-File psettings.xml -Encoding default
$ps=get-content .\psettings.xml
# 用紙の向き 縦(Portrait)から横 Landscapeに変更
$ps -replace 'Portrait','Landscape' | out-file ppsettngs.xml -Encoding default
# 変更した用紙設定をセット
Set-PrintConfiguration -PrinterName "Canon Generic Plus LIPSLX" -PrintTicketXml (Get-Content .\ppsettngs.xml -Raw) 
```
実際に変更されているか確認してみます。
プリンタープロパティ > 詳細設定 > 標準の設定　を開いてみます。

![pp03.png](https://qiita-image-store.s3.amazonaws.com/0/24550/242c280d-5b8a-cfbc-d914-1474a215ca3a.png)

印刷の向きが横になっています。
成功です。

![pp02.png](https://qiita-image-store.s3.amazonaws.com/0/24550/6ea3ca79-f939-90c5-61f0-30a6299f180d.png)

原稿サイズがA4のままですが、基本設定の原稿サイズB5を優先して実行するので問題ありません。

## 用紙トレイの変更
用紙トレイを選択すると用紙サイズは無視されます。
一般的に下記のように設定されていることが多いです。

- Auto
    - 自動 
- Manual
    - 手差し
- Upper
    - トレイ1
- Middle
    - トレイ2
- Bottom
    - トレイ3


用紙の向きと同じように Set-printConfigurationを使って設定します。

```posh:Select_Tray
# 標準設定の用紙設定をXML出力
$p=Get-PrintConfiguration -PrinterName "Canon Generic Plus LIPSLX"
$p.PrintTicketXML | Out-File psettings.xml -Encoding default
$ps=get-content .\psettings.xml
# トレイの変更
$ps -replace 'Auto','Manual' | out-file ppsettngs.xml -Encoding default
# 変更した用紙設定をセット
Set-PrintConfiguration -PrinterName "Canon Generic Plus LIPSLX" -PrintTicketXml (Get-Content .\ppsettngs.xml -Raw) 
```

トレイがUser0000000261等の数値で指定されているプリンターもあります。
SHARP MXシリーズがそうでした。

もし動かなった場合、下記のようにPrintCapabilitiesXMLを出力して眺めてみて下さい。

```posh:使える設定を見る
$p=Get-PrintConfiguration -PrinterName "Canon Generic Plus LIPSLX"
$p.PrintCapabilitiesXML | out-file pc.xml
# Open
.\pc.xml
```

## 細かいお話

- Windowsのプリンターの設定は基本設定が優先。
- WMIObjectのWin32_Printerを使わないと基本設定の方の用紙設定が設定できない。
- Win32_Printerではトレイ、用紙の向き等は設定できない。
- Set-PrintConfigurationを使えばトレイ、用紙の向き(縦・横)の設定が可能
- PowerShell v2.0しか使えない方はWin32_PrinterConfigurationを使うと幸せになれるかもしれない
AppVeyorでのビルドモードの変更方法


## エラー内容  

コンソールログ

```bash  
The build phase is set to "MSBuild" mode (default), but no Visual Studio project or solution files were found in the root directory. If you are not building Visual Studio project switch build mode to "Script" and provide your custom build command.
```

## 解決策  

Settings>Build>Script>Saveボタンを押下

## おわりに  

今回はビルドモード設定が原因でしたが、Github認証などが原因の可能性もあるようです。
MeCabで「動詞」「名詞」「形容詞」を抽出 + 「動詞」「形容詞」を基本形に変換

<h2>はじめに</h2>
自然言語処理の前処理において行う「動詞」「名詞」「形容詞」の抽出と「動詞」「形容詞」を基本形に変換をMeCabで処理します．

<h2>MeCabのインストール</h2>
[こちら](https://qiita.com/taroc/items/b9afd914432da08dafc8)の記事を参考にすると良いでしょう．

<h2>プログラム</h2>
こちらがプログラムになります．
2行目で空文字列をparseしてますがこれは[node.surfaceが取得できないバグ](https://qiita.com/piruty/items/ce218090eae53b775b79)を回避するための処理です．

```python
tokenizer = MeCab.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
tokenizer.parse("")
node = tokenizer.parseToNode(document)
keywords = []
while node:
	if node.feature.split(",")[0] == u"名詞":
		keywords.append(node.surface)
	elif node.feature.split(",")[0] == u"形容詞":
		keywords.append(node.feature.split(",")[6])
	elif node.feature.split(",")[0] == u"動詞":
		keywords.append(node.feature.split(",")[6])
	node = node.next
```

<h2>実行結果</h2>
"MeCabを使って自然言語処理をしたい"

```python

['MeCab', '使う', '自然言語処理', 'する']
```

<h2>まとめ</h2>
「動詞」「名詞」「形容詞」の抽出と「動詞」「形容詞」の基本形に変換ができました．
抽出する単語は各自カスタマイズして良い自然言語処理ライフを楽しんでください．
TerraformでGCPのIAMをちょっとだけ上手に管理する

# 背景

権限を付与する `google_project_iam_member` のリソースの `role` が配列を持てないので、複数の role を一度に設定することができません。
したがって、複数の `role` をあるアカウントに付与するためにはツラツラ書く必要があって、少し辛いところがあります。

* 参考 
 * https://www.terraform.io/docs/providers/google/r/google_project_iam.html#google_project_iam_member-1

```sh:old_serviceaccount.tf
# create account
resource "google_service_account" "sample_app_user" {
  account_id   = "app-mgr"
  display_name = "app-mgr"
}

# add role1
resource "google_project_iam_member" "sample_app_user_1" {
  role   = "roles/cloudsql.client"
  member = "serviceAccount:${google_service_account.sample_app_user.email}"
}

# add role2
resource "google_project_iam_member" "sample_app_user_2" {
  role   = "roles/storage.objectViewer"
  member = "serviceAccount:${google_service_account.sample_app_user.email}"
}

# add role3
resource "google_project_iam_member" "sample_app_user_3" {
  role   = "roles/bigquery.user"
  member = "serviceAccount:${google_service_account.sample_app_user.email}"
}

# add roleN（このペースで追加するのは辛い..）
# ...
```

# 対応

Terraformの `count` 機能を導入することで上手く構造化が可能です。
`count` に別途変数で切った配列長を設定し、 `count.index` で配列アクセスすることで動的に展開して実行してくれます。
`role` を編集したいときは、 `sample_app_roles` の値を編集すればOK。

```sh:new_serviceaccount.tf
# create account（ここは変化せず）
resource "google_service_account" "sample_app_user" {
  account_id   = "app-mgr"
  display_name = "app-mgr"
}

# add roles（countとリストアクセスを活用）
resource "google_project_iam_member" "sample_app_user" {
  count = "${length(var.sample_app_roles)}"
  role   = "${element(var.sample_app_roles, count.index)}"
  member = "serviceAccount:${google_service_account.sample_app_user.email}"
}

# 別途変数化
variable "sample_app_roles" {
  default = [
    "roles/cloudsql.client",
    "roles/storage.objectViewer",
    "roles/bigquery.user",
    "..."
  ]
}
```

variableを別ファイルで管理すれば、メンテナンス性やレビュー上もお得にできそうです。

# まとめ

* Terraformのcount機能は強力
range()関数の返却オブジェクトについて ~Python学習1.01~

#range()関数とは
引数に指定したサイズの数列を返す関数。
どうやら返り値は数列(？)ではないみたいです。のちのち触れます。

range()関数は引数によって挙動が変わります。
公式ドキュメントで学習した範囲には3パターンありましたので、それぞれ紹介していきます。

##range(整数値)
第一引数のみを指定するパターンです。
負の数を渡した場合、数列は返ってきません。
以下にコードと動作例を示します。

```qiita1.py
for i in range(4):
    print(i)

#出力結果
0
1
2
3
```
0から引数に指定した<b>整数値を含まない</b>範囲の数列を得ることができます。

##range(開始値, 終了値)
第一引数に得る数列の開始値、第二引数に得る数列の終了値を渡すパターンです。
ここでも<b>終了値は含まない</b>ことに注意。
以下にソースコードと動作例を示します。

```qiita2.py
for i in range(5, 7):
    print(i)

#出力結果
5
6
```

##range(開始値, 終了値, 足し合わせる値)
第二引数までは1つ前のパターンと同様であり、第三引数に足し合わせる値を指定します。
ここでも<b>終了値は含まない</b>ことに注意。
以下にソースコードと動作例を示します。

```qiita3.py
for i in range(0, -10, -3):
    print(i)

#出力結果
0
-3
-6
-9
```


#range()関数の返り値は数列？
出力結果だけを見れば数列が返ってきているのでは？と思うかもしれません。
がしかし、次のコードを試すと何かがわかます。

```qiita4.py
print(range(100))
print(range(100).__class__.__name__)

#出力結果
range(0, 100)
range
```
1行目の出力結果からわかるように、range()関数の返り値は数列ではありません。
ではなんなんだ？ というところで、2つ目の出力結果を見ると range と出ています。
2行目のコードで行っているのは、range()関数の出力結果に対して型名を得ています。
つまり、range()関数の出力結果は<b>range型のオブジェクト</b>であるとわかります。

##range型とは
整数を要素とするimmutableなシーケンス(複数の値を順番に並べたものの一塊として保持する型)
を生成するオブジェクトのこと。
シーケンスには、rangeの他にもリストなども含まれるようです。

リストやrangeのスーパークラスがシーケンスなのかな？という感じです。


#開発環境
Windows10 64bit
Python 3.7.1
PyCharm 2018.3.2


#参考資料
学習に用いているものとして、以下の２つがメインです。
・[詳細! Python 3 入門ノート](https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0-Python-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-%E5%A4%A7%E9%87%8D-%E7%BE%8E%E5%B9%B8/dp/4800711673/ref=sr_1_1?ie=UTF8&qid=1546995770&sr=8-1&keywords=%E8%A9%B3%E7%B4%B0%21Python3%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88)
・[Python公式ドキュメント](https://docs.python.jp/3/tutorial/index.html)
Chromebookで資料作成

日常はWindowsなのでChromebookで出張すると混乱します...
他に便利なキーがあったら教えてほしいです。

#日本語入力

半角英字変換：音量上げるキー
全角英字変換：音量下げるキー
半角カナ変換：ミュートキー
全角カナ変換：輝度上げるキー
ひらがな変換：輝度下げるキー

#スクリーンショット
全画面：Ctrl ＋ ウインドウ切り替えキー
領域指定：Ctrl + Shift + ウインドウ切り替えキー

#Google スライド
書式なしで貼り付け：Ctrl + Shift + V
右クリック：Alt + タップ
まずはKerasのお勉強

# Kerasを学ぶ
今後の作業の中で、まず学ぶべきはDeepLearningのモデルを考える必要がある。
それ以外については、今まで学んだ内容を応用すればどうにかなるが、どうにもこうにもベースになるモデルがなければ話にならない

## まず何を学ぶ?
Kerasを学ぶを書いたものの、漠然としすぎて何から手を付けてよいかわからない、、、。

ざっくりやりたいこと
- FXのデータがCSVなどであるので、それをDatasetとしたい
- そのデータに対してなにかのAlgorithmを適用し結果を予想したい

## まずは情報を探す
https://qiita.com/KeisukeToyota/items/c1c626c9efc816932a96
こちらのサイトで詳細されていた情報をもとに、情報を掘り下げていく。

## ソースコードを読んで見る
まず、最初に気になるのがやはりモデルの部分。
と言うことで、サンプルソースのあったリンクをたどる(https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py)
で次に、この中でどんな処理をしているのか、上から追ってみる、、、。

最初の定義などは一旦無視。この辺はプログラム上あとで必要となるだろうから、とりあえずプログラムの内容を先に読む。フムフム、、、

` # the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()`

最初のプログラム部分がここですかね。(変数の定義などもすべてすっ飛ばしています)
まずは、データの読み込み、、、。
これを調べてみると、`mnist.load_data()`と言うのでデータをLoadしているようだ。

`from keras.datasets import mnist`

もともとkerasにはいくつかのdatasetが用意されていて、そのデータを読み込んでいるんだな、、、。[Keras Datasets](https://keras.io/ja/datasets/)

でも、これってどんなデータ形式なんだろう。とりあえず、Jupyterで実行だ‼
> Loading data...
Downloading data from https://s3.amazonaws.com/text-datasets/reuters.npz

こんな感じ。AWSにあるnpzと言うファイル形式のものを使っているようだ。
じゃあ、npzってなんぞや。

https://www.python-izm.com/data_analysis/numerical/numpy/ndarray_filerw/
こちらのサイトを見ると、NumPyのデータ配列を保存したもののようですね。
npzなのでバイナリー式の非圧縮/圧縮の形式で作られたものと言うことが判明。
実際、現時点では圧縮、非圧縮のいずれでも構わない。
ちなみに、サイトにあるサンプルを実行した結果

| ファイル形式 | 圧縮有無 | ファイルサイズ |
|:--|:--|--:|
|text|non compress| 150bytes|
|binary|non compress| 562bytes|
|binary|compress| 393bytes|

まぁ、binaryモードは複数表を保持している事と、binaryにしているのでtextより少し大きくなっているのだろう。でも、binary-compressを採用。

# じゃあ、次は
と模索していると、
https://inon29.hateblo.jp/entry/2017/06/23/183749
と言うサイトを発見‼
こちらも私と同じような考えでソースを読み解こうとしているので、ここは参考にさせていただくことにしました。

# 余談
「つづく」と言う言葉が**タイ**では人気があるらしく、Tシャツにもなっているらしい
http://netgeek.biz/archives/105470
ただ、これは完全に勘違いで、日本のTV番組の終わりに「つづく」と表示されているが、これがその回の終わりであり、まだシリーズは続く、、、と言う意味なのだが、これが「おわり」と理解されていて、それが良い言葉だとして人気となっているようす。
海外のTVシリーズでは**「To be continue」**となっているので普通に考えれば、、、と思うがｗｗ
Amazon Linux WorkSpaces で CopyQ をセットアップする

Amazon Linux WorkSpaces (Amazon Linux 2) 環境にクリップボード管理アプリがほしかったので、CopyQ を導入しました。備忘録を残しておきます。

## ビルド

FlatHub にパッケージがあったのでインストールしてみたところ、トレイアイコンが表示されない不具合があったので、自前でビルドすることにしました。

参考までに、私のビルド方法が知りたい方は [README](https://github.com/albuild/copyq) をどうぞ。

## インストール

[ビルドした RPM パッケージ](https://github.com/albuild/copyq/releases/tag/v3.9.3) をインストールします。

```
sudo yum -y install albuild-copyq-3.9.3-0.amzn2.x86_64.rpm
```

## 実行

MATE のメインメニューの Accessories カテゴリにある CopyQ のランチャーを実行します。

![misc.2.png](https://qiita-image-store.s3.amazonaws.com/0/63688/2c64527b-3724-828a-3d8a-79a7d69b7da2.png)

ハサミのトレイアイコンが表示されました:tada:

Startup Applications に登録しておけば、ログイン時に CopyQ が有効になります。

## ショートカットキーでクリップボードの履歴を表示する

初期状態ではクリップボードの履歴 (メインウィンドウ) を表示するのにトレイアイコンをいちいちクリックしなければならず面倒です。ショートカットキーで表示できるようにします。

CopyQ のメインウィンドウのメニューから [File] -> [Commands/Global Shortcuts...] を実行。"Show/hide main window" コマンドにショートカットキーを割り当てます。今回は `Alt+Shift+V` にしてみました。

![misc.png](https://qiita-image-store.s3.amazonaws.com/0/63688/0a58157b-518b-a056-300e-f404c123e813.png)

早速、キーをタイプしてみます。

![misc (1).png](https://qiita-image-store.s3.amazonaws.com/0/63688/b5aae98d-108e-fb62-b657-9345f85d557d.png)

表示されました:tada:
[django]ブラウザテストをしたい


django.test.Client を使う。

``` python

from django.test import Client, TestCase

class HogeTestCase(TestCase):

    def setUp(self):

        self.user = User.objects.create_user('HogeTaro', 'taro@hoge.com', 'password')
        
        self.client = Client()

        self.client.login(username='HogeTaro', password='password')

    def test_foo(self):

        data = {
            'name': 'FooJiro',
            'email': 'jiro@foo.com',
        }

        response = self.client.post('[URL_Path]', data)

        self.assertEqual(200, response.status_code)

```

参考URL
- https://docs.djangoproject.com/ja/2.1/topics/testing/tools/
All-Pairs法でテストケースを生成するツール「PICT」をMacで使う方法

本稿ではAll-Pairs法(ペアワイズ法)でテストケースを生成してくれる[pict]をいうツールをMacで使う方法を紹介する。

[pict]: https://github.com/Microsoft/pict

## pictのインストール

Homebrewでインストールできる

```
brew install pict
```

```console
$ pict
Pairwise Independent Combinatorial Testing

Usage: pict model [options]

Options:
 /o:N    - Order of combinations (default: 2)
 /d:C    - Separator for values  (default: ,)
 /a:C    - Separator for aliases (default: |)
 /n:C    - Negative value prefix (default: ~)
 /e:file - File with seeding rows
 /r[:N]  - Randomize generation, N - seed
 /c      - Case-sensitive model evaluation
 /s      - Show model statistics
```

## モデル(因子と水準)を作る

因子と水準を定義したモデルをテキストファイルとして作る

```text:parameters.txt
OS: Windows, Linux, macOS
PHP: 7.1, 7.2, 7.3
データベース: MySQL, PostgreSQL, SQLite
```

## テストケースを生成する

```console
$ pict parameters.txt
OS	PHP	データベース
macOS	7.2	PostgreSQL
Linux	7.2	MySQL
macOS	7.3	SQLite
Linux	7.1	SQLite
Linux	7.3	PostgreSQL
Windows	7.2	SQLite
macOS	7.1	MySQL
Windows	7.1	PostgreSQL
Windows	7.3	MySQL
```

## 統計情報

`/s`オプションをつけると統計情報を見れる。

```console
$ pict parameters.txt /s
Combinations:   27 … 全網羅
Generated tests:9 … All-Pairs法
Generation time:0:00:00
```

## 関連

* [組み合わせテストの用語「2因子間網羅」「直交表」「All-Pairs法」 - Qiita](https://qiita.com/suin/items/0d38108ecae341c1700e)
【L2TP】Windows 10での設定手順

Windows 10の標準機能を利用した設定・接続手順を記載します。

- すでにルーター側の設定は終わっているものとします。

##設定手順
###設定に必要な情報の確認

| 項目 | 値（例） |
|:--|:--|
|接続先のIPアドレスまたはホスト名|XXX.XXX.XXX.XXX または hogehoge.jp|
|ユーザー名|user01|
|パスワード|pass01|
|事前共有キー|shared|

###VPN設定手順

1. 画面右下からアクションセンターを開き、「VPN」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/cf9673d8-9817-ed15-e792-54e16518c779.png)

2. 「VPN接続を追加する」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/24a76450-b84f-bd63-63e1-d365768b6af8.png)

3. 「VPNプロバイダー」をクリックし、"Windows (ビルドイン)"を選択し、接続名、サーバー名またはアドレスを入力します。

4. 「VPNの種類」をクリックし、"事前共有キーを使った L2TP/IPsec"を選択し、事前共有キーを入力します。

5. 「サインイン情報の種類」は"ユーザー名とパスワード"のまま変更せず、ユーザー名とパスワードを入力し、最後に「保存」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/58df8355-8be8-ee55-f263-633fc726d898.png)

以上で設定は終了です。

##接続手順

1. 画面右下からアクションセンターを開き、「VPN」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/cf9673d8-9817-ed15-e792-54e16518c779.png)

2. 接続したいVPNの名称をクリックし、「接続」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/6b583fc5-f2d8-34c1-78c0-32e14ada2793.png)

3. 接続が完了すると、"接続済み"と表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122690/f7f93601-efe6-4d5e-8d5b-b2b3c72cdefc.png)

接続に失敗する場合はエラーメッセージを確認し、設定内容等を確認します。「切断」をクリックすると切断されます。
[django]テスト用にPOSTリクエストを作りたい



RequestFactory を使う。

``` python

from django.test import Client, RequestFactory, TestCase

class HogeTestCase(TestCase):

    def setUp(self):

        self.user = User.objects.create_user('HogeTaro', 'taro@hoge.com', 'password')
        
        self.client = Client()

        self.client.login(username='HogeTaro', password='password')

    def test_foo(self):

        data = {
            'name': 'FooJiro',
            'email': 'jiro@foo.com',
        }

        factory = RequestFactory()

        request = factory.post('[URL PATH]', data)

        # ログインユーザ設定
        request.user = self.user

```

参考URL
- https://docs.djangoproject.com/ja/2.1/topics/testing/advanced/
SDLアプリコンテスト 十日目

#概要

SDLアプリコンテスト、見つけたので挑戦してみる。
androidサンプルアプリをビルドして、sdl_coreと接続してみた。

#写真

![Screenshot_1547096424.png](https://qiita-image-store.s3.amazonaws.com/0/18104/945f9587-ae60-bf5a-ce9f-9a02c107f93d.png)

![Screenshot from 2019-01-10 14_00_47.png](https://qiita-image-store.s3.amazonaws.com/0/18104/f93057b5-84b9-f1d2-d2ec-6ab9e80f5baf.png)

#androidエミュレータが動かん。

メモリを増設したが、動かん。
biosのvirtualizetionテクノロジーがoffになってた。

#androidサンプルアプリが動かん。

build variants(初めて知った)をtcpdebugにする。

以上。
親子関係のデータの削除を失敗しました

# controllerでのdestroy対象に漏れがあった

投稿を削除した後にログインしている人のユーザーホームに移動しようとしたらエラーになった

```
NoMethodError in Users#show
undefined method `story' for 2:Integer
ActionView::Template::Error (undefined method `story' for nil:NilClass):
```
コンソールで見るとlikeは取れているが
like.impressionはnil
ライクはあるのにそれにひもづいた感想がない
なんで感想がないのか思い至らなかったが感想を消した時に原因がありそうに思った（レッスン中）

# HTML
```_likes.html.rb
  <% likes.each do |like| %>
    <div class="user_story">
      <%= like.user.nicename %>
      <%= like.impression.impressions %>　# 今回のエラー箇所
    </div>
  <% end %>
```
ユーザー詳細ページにrenderされている
投稿を削除したときのdestoryの指定が甘かったのでいくつか生き残った欠片がエラーの原因
ユーザー詳細画面には自分の投稿を見ることのできる`_user.html.erb`と、
自分がお気に入りした投稿を見ることのできる`_like.html.erb`をつくってあるが
お気に入りの方`_like.html.erb`でエラーが出た

## コントローラー修正前

```books_controller.rb
    def destroy
      @book = Book.find(params[:id])
      @impression = Impression.find(params[:id])
      @impression.destroy
      @book.destroy
      redirect_to "/index"
    end
```
上のコードだと
・感想に紐づいたLikeが削除されない
・コメントも削除されない
・二つともparams[:id]を使って探しているがもしidが違った場合エラーの原因になる


なので

・取得するデータの起点を一つにして連鎖的に投稿に紐づくデータを削除させる
・Likeを取得してdestroyさせたい

## コントローラー修正後
```books_controller.rb
    def destroy
      # params[:id]　と　impression.id　は同じになっている
      @book = Book.find(params[:id])
      @impressions = @book.impressions
      @impressions.each do |impression|
        @likes = impression.likes
        @likes.each do |like|
          like.destroy
        end
        impression.destroy
      end
      @book.destroy
      redirect_to "/index"
    end
```
本のデータを探して、見つかった感想たちを回してライクを取得してdestroyする
コメントも取得して消しておく。作業はlikeと同じ。エラーでなかったから忘れていた作業です

### :dependent => :destroyは失敗
:dependent => :destroyだけだと同じエラーになったので、更に子モデルに:dependent => :nullifyを指定したけれどlike,commentまで消えてくれなかった

```book.rb
   has_many :impressions, :dependent => :destroy
```

```impression.rb
    has_many :comments, :dependent => :nullify
    has_many :likes, :dependent => :nullify
```

```books_controller.rb
      @book = Book.find(params[:id])
      @book.destroy
      redirect_to "/index"
```

問題はコントローラーにありそうだけれどもなんでしょうね。

## 追記
頂いたコメント通りに試しに子モデルに当てていた

```
:dependent => :nullify
```
を

```
:dependent => :destroy
```
に変えてみたところ、要素の削除に成功しました。
ありがとうございます

```impression.rb
    has_many :comments, :dependent => :destroy
    has_many :likes, :dependent => :destroy
```
外部キーとは他のテーブルのidを指し示すものだとのこと


読んでくれてありがとう
AlexaスキルのSSMLレスポンスサイズ（厳密にはoutputSpeechサイズ）の上限は8000文字

AlexaスキルのSSMLレスポンスサイズに上限があってちょっとはまりました。

![スキルがリクエストに正しく応答できませんでした](https://i.gyazo.com/c3984fde37f6126ce78fa2ca1f663cf3.png)

ちなみにレスポンスの内容は意図したものとなっています。（省略しているspeckタグ内の内容も）

```
{
	"body": {
		"version": "1.0",
		"response": {
			"outputSpeech": {
				"type": "SSML",
				"ssml": "<speak>******* 省略（かなり長い） **********</speak>"
			},
			"shouldEndSession": false
		},
		"sessionAttributes": {}
	}
}
```

色々と試した結果、レスポンスサイズに上限があるらしいと推定できましたが[SSMLの公式リファレンス](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)に該当する記載を見つけられず、日本語では該当仕様をググれませんでした。（私の検索スキルが低いのも原因）

結局、[英語版stackoverflowの"Alexa skill SSML max length"](https://stackoverflow.com/questions/36557053/alexa-skill-ssml-max-length)というスレッドに記載されていました。
ただ古いスレッドなので最新でも同じか確認しようとして同スレッドに記載されていた引用元を参照したらリンク切れでした。
そこで記載されていたキーワードを頼りに該当するリファレンスを探してみたところやっとみつけました。

[応答の形式 | カスタムスキルのJSONインターフェースのリファレンス | Custom Skills](https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html#response-format)

やはりssml部分が大きすぎたのが原因でした。

- outputSpeech応答は、8,000文字以内でなければなりません。
- 応答の合計サイズは24キロバイト以内でなければなりません。

というか、もっとわかりやすいエラーメッセージ出してほしいですね。(T_T)

# その他の関連URL

[outputspeechオブジェクト](https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html#outputspeech-object)