OmniAICreator/Qiita-1.07M huggingface dataset:
sortコマンドに悩まされるの巻

# TL;DR
Linuxの(GNU)sortを使って３文字の月名でソートしようとしてハマったのでメモ。
# 環境
```
$ cat /etc/system-release
CentOS release 6.9 (Final)

$ sort --version | head -1
sort (GNU coreutils) 8.4
```
# お題１
こういうファイルがあるとします。

```
$ cat a
Dec
Jan
Jul
Sep
Mar
Oct
```

単純にソートしたら、当然アルファベット順に並びます。

```
$ sort a
Dec
Jan
Jul
Mar
Oct
Sep
```

sort コマンドには、キーを月名とみなす -M オプションがあります。
これを使うと、米国表記の月の順にソート

```
$ sort -M a
Dec
Jan
Jul
Mar
Oct
Sep
```
されません（汗
マニュアルをじっくり読むと、LC_* 系の環境変数に影響されるっぽいので

```
$ env|grep LANG
LANG=ja_JP.UTF-8

$ LANG=C sort -M a
Jan
Mar
Jul
Sep
Oct
Dec
```

明示的に LANG=C したら、今度はうまくいきました。
（ -s(--stable) オプションというのもちょっと謎、、、）

### お題２

本当にやりたかったのこちら。
こういうファイルがあって、これを日付順にソートしたい。

```
$ cat b
www.example.com 192.168.0.12 - - [10/May/2017:03:40:22 +0900] snip...
www.example.com 192.168.0.22 - - [10/Sep/2016:03:33:22 +0900] snip...
hoge.example.jp 192.168.0.21 - - [10/May/2017:03:40:22 +0900] snip...
www.example.com 192.168.9.10 - - [15/Sep/2016:03:34:34 +0900] snip...
www.example.com 10.89.159.137 - - [10/Mar/2016:03:35:48 +0900] snip...
www.example.jp 192.168.0.2 - - [10/Sep/2015:03:36:52 +0900] snip...
test.example.com 192.168.0.1 - - [10/Oct/2016:03:37:52 +0900] snip...
www.example.co.jp 10.2.66.247 - - [10/Apr/2017:03:38:20 +0900] snip...
www.example.com 192.168.0.232 - - [10/Apr/2017:03:39:22 +0900] snip...
```
試行錯誤の結果、以下のようにしたら無事にソートされました。

```
$ LANG=C sort -t '[' -k2.8,2.11 -k2.4,2.6M -k2.1,2.2 b
www.example.jp 192.168.0.2 - - [10/Sep/2015:03:36:52 +0900] snip...
www.example.com 10.89.159.137 - - [10/Mar/2016:03:35:48 +0900] snip...
www.example.com 192.168.0.22 - - [10/Sep/2016:03:33:22 +0900] snip...
www.example.com 192.168.9.10 - - [15/Sep/2016:03:34:34 +0900] snip...
test.example.com 192.168.0.1 - - [10/Oct/2016:03:37:52 +0900] snip...
www.example.co.jp 10.2.66.247 - - [10/Apr/2017:03:38:20 +0900] snip...
www.example.com 192.168.0.232 - - [10/Apr/2017:03:39:22 +0900] snip...
hoge.example.jp 192.168.0.21 - - [10/May/2017:03:40:22 +0900] snip...
www.example.com 192.168.0.12 - - [10/May/2017:03:40:22 +0900] snip...
```
オプションは以下のような感じです。

- -t フィールド区切り文字（デフォルトは空白）
- -k キーの指定（後述）
- M ：そのキーを月名とみなす

### 愚痴

"man sort" でぐぐると、
[Section: User Commands (1) - sort - テキストファイルをソートする](https://linuxjm.osdn.jp/html/gnumaniak/man1/sort.1.html)
というありがたい日本語の man ページが読めるんですが、ここの

```
-k POS1[,POS2]
  -K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが推奨される。
  行の POS1 から POS2 までのフィールドを指定する。 POS2 を含む。 
  POS2 が省略されたら行末まで。 フィールドと文字位置はそれぞれ 0 から数えはじめる。
```

この最後の部分が間違っているようです（仕様が変わった？）。
コマンドのヘルプによると、

```
$ sort --help | sed -n 35,36p
  -k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                            (default end of line)
```
位置は 1 オリジンらしいです。これに地味にハマりましたｗ
PyCharmでcsvやtsvを列毎に綺麗に表示する


PyCharmでcsvやtsvを開くと基本的にはテキストファイルとして開かれると思います。
しかし列が多くなってくると見にくくなるので、エクセルのように列ごとにわけて表示したいなと思うわけです。
この記事はその方法を説明します。

# 手順
普通にcsvを開くとこうなります
![csv1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/129a00f3-7e54-7a51-4414-952ac65095b4.jpeg "csv1.jpg")

エディターの任意の場所を右クリックすると次のようなメニューが表示されます。
![csv2.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/1793f237-cd46-35f9-df2e-31e386fd3a6c.jpeg "csv2.jpg")

次のような設定画面が表示されるので、区切り文字や、囲み文字の設定をプレビューを見ながら行います。

![csv3.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/93d9e3fa-af11-4e52-f43a-6ece621e5583.jpeg "csv3.jpg")

OKをクリックすれば、列ごとに綺麗に分かれたエディターになりました。
![csv4.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/30141853-358c-bdf8-dbcc-2c1a54a3d8a2.jpeg "csv4.jpg")

# 参考
https://www.jetbrains.com/help/pycharm/editing-csv-and-similar-files-in-table-format.html#open_table_editor
cordova webviewでハマったこと

# 問題
 - androidの一部端末で、webviewがうまく動かない問題が起きた。
    - jsの動作が一部おかしい
    - cssの読み込みがおかしい
    - 動くには動くが、すぐにエラーがでる

# 原因
 - androidは端末毎にwebviewで使われるブラウザの種類とバージョンのパターンが端末によるらしい

# 解決
 -  cordova-plugin-crosswalk-webview というプラグイン入れてビルドしたら解決した

# 感想
 - webviewで起こり得る問題だったので、知っている人は知っている単純な話だった。
Centosでファイル名に日付をつけてコピーするコマンド

ログファイルなど、ファイルのバックアップを取るときに、
いつも手入力で```
cp -f hoge.txt hoge.txt.bak_20170922
```
とか、泥臭くやっていましたが、
いい加減excellentなやり方を覚えようと思い。。。

現状たどり着いたのがコレ　↓```
cp -pi hoge.txt hoge.txt.`date "+%Y%m%d_%H%M%S"`
```

cpコマンドの配置先ファイル名にdate関数？みたいなもの入れられるんですね…！

・・・ちゃんとLinuxコマンド勉強しますorz
SSH利用してWordPressインストールするときのメモ


# 概要
いつもちょいちょい忘れるのでメモ

## WordPressインストール[1]
#### 前提
* PHPインストール済み

```
cd workspace # 配置したいディレクトリへ移動
wget https://ja.wordpress.org/wordpress-4.8.1-ja.zip # 公式サイトからURL持ってくる
unzip wordpress-4.8.1-ja.zip
ls # wordpressってのができてる
mv wordpress/ blog # 名前を適したのに変える(任意)
```

### サーバー起動
`workspace/blog`へアクセスして表示確認

## データベース準備

#### 前提
* mysqlインストール済み

```
mysql-ctl start # 起動
mysql-ctl cli

# mysql> 入力画面にて
create database wp_blog
GRANT ALL PRIVILEGES ON wp_blog.* TO "wordpress"@"localhost" IDENTIFIED BY "password";
```

## WordPressインストール[2]

`workspace/blog`へアクセス

画面の指示に従いインストール
```
database名 : wp_blog
ユーザー名 : wordpress
ホスト名 : localhost
パスワード : password
````

## 完了
selenium chromedriver で、click のエラー回避（備忘）

# selenium chromedriver で、click ができない件

画面上、見えていないと、click できないようになっているみたいです。回避方法としては、画面サイズを変更します。python のコードですが、下記のように、縦長にします。

**driver.set_window_size(800,6000)　とか**

chrome と、selenium は相性が悪いのでしょうか。。。。。。。。
Cloud9からbitbucketへpushする方法

#　使う環境　

Bitbucket
https://bitbucket.org/
リポジトリが作成されている必要があります。

Cloud9
https://c9.io/xxxxxxxxx(個人による)



## Cloud9側での作業
Cloud9でSSH Keyを入手する。
https://c9.io/account/ssh

ログインしているアカウントのSSH Keyが表示される。


## Bitbucketでの作業
BitbucketでCloud9から入手したSSH KeyをAccess keysに追加する。
　追加するリポジトリを選択
　　設定
　　　Access keys
　　　　鍵を追加

コピーしてきた、Cloud9のSSH Keyを入力する。
できたら鍵を追加をする。
成功していると、鍵のところに情報が追加されている。
これで外部からのアクセスを許可してる。

## リモートリポジトリと同期する方法

Cloud9からBitbucketにアクセスできるようにする。

最初にローカルリポジトリを作成する

適当に作業フォルダを作る

_$ mkdir git_

Gitを有効にするためにコマンド実行

_$ git init_

リモートリポジトリを追加する。

_$ git remote add origin https://xxxxx.org/yyyyy/zzzzz.git_

追加されたことを確認

_$ git remote -v_
origin  https://aaaaa@bxxxxx.org/yyyyy/zzzzz.git (fetch)
origin  https://aaaaa@bxxxxx.org/yyyyy/zzzzz.git (push)

リモートリポジトリと同じ内容にするために、マージする。

_$ git merge --allow-unrelated-histories origin/master_

マージが完了しているか、フォルダを確認する。

nkns:~/workspace/git (master) $ ls
README.md  sample.txt  ttt.txt

リモートリポジトリと同じ内容になっていれば、作業完了！
関連テーブルを簡単保存

少しハマってしまったので、メモ

#templateファイルを少しいじると簡単にできる

```php:Template/Articles/add.ctp
$this->Form->create($article);

// Author 入力 (belongsTo)
//下記のようにカラムの前にモデル名を記入する
echo $this->Form->control('author.first_name');
echo $this->Form->control('author.last_name');


// Tags 入力 (belongsToMany)
echo $this->Form->control('tags.0.name');
echo $this->Form->control('tags.1.name');


// belongsToMany の複数選択要素
echo $this->Form->control('tags._ids', [
    'type' => 'select',
    'multiple' => true,
    'options' => $tagList,
]);


// 結合テーブルの入力 (articles_tags)
echo $this->Form->control('tags.0._joinData.starred');
echo $this->Form->control('tags.1._joinData.starred');


// Comments 入力 (hasMany)
echo $this->Form->control('comments.0.id');
echo $this->Form->control('comments.0.comment');
echo $this->Form->control('comments.1.id');
echo $this->Form->control('comments.1.comment');
```

※注意※
モデル指定のとき大文字始まり複数形ではないので注意が必要

コントローラの例としては

```php:Template/Articles/add.ctp

$article = $this->Staffs->newEntity();
if ($this->request->is('post')) {
   $article = $this->Articles->patchEntity($article, $this->request->getData());
   if ($this->Staffs->save($article)) {
        $this->Flash->success(__('登録を完了しました'));
        return $this->redirect(['action' => 'index']);
   }
     $this->Flash->error(__('登録に失敗しました'));
}

```

こんな感じで普通に保存すればOK
ほとんど公式のままですが、、、
【初心者向け】Railsでテーブルを削除する

#概要
削除できたと思っていたテーブルが残っていることに気づいた。
不要になったテーブルを削除しよう！

#モデルを削除すれば良いと思っていた
間違って作成してしまい不要になったテーブルを削除しようと思い、

```rails destroy model [任意のモデル名]```
を実行する。

モデルは削除されるものの、テーブルはまだ残ったまま…

#マイグレーションファイルから指定しよう
適当にマイグレーションファイルを作成する。

```
rails g migration records(任意の名前)
```

マイグレーションファイルに

```ruby
drop_table
```
を書き加える

```ruby:[タイムスタンプ]_records.rb#
class DeleteRocords < ActiveRecord::Migration[5.1]
  def change
    drop_table :[削除したいテーブル名]
  end
end
```

忘れないこと！
```rails db:migrate```

##削除完了
不要なテーブルは初めから作成しないのがベストなんですけどね笑
Java-データベース接続 Java-MySQL接続④：JDBCドライバのロード / 2017年9月

#テキストエディタ(メモ帳)とコマンドプロンプトを使用する場合
コマンドプロンプトにて、notepad ChkLoadJdbc.java を入力し、メモ帳を開きます

#Eclipse を使用する場合
すでに作成している Java プロジェクトフォルダ(ChkLoadJdbc)を開きます
src フォルダを右クリック
新規->クラスを選択
「新規 Java クラス」画面が表示されます

名前:ChkLoadJdbc
□「public static void main(String[] args)」にチェックをつける
□「コメントの生成」にチェックをつける
「完了」ボタンを押下

```
public class ChkLoadJdbc {
   public static void main(String[] args) throws InstantiationException, IllegalAccessException {
   String msg = "";
   try {
     Class.forName("com.mysql.jdbc.Driver").newInstance();
     msg = "ドライバのロードに成功しました";
   } catch (ClassNotFoundException e){
     msg = "ドライバのロードに失敗しました";
   }
     System.out.println(msg);
   }
}
```    

プログラミングが終わったら実行

JDBC ドライバを正常に呼び出していれば、「ドライバのロードに成功しました」
失敗していた場合は、「ドライバのロードに失敗しました」と表示されます。

失敗の場合は、CLASSPATH の設定に誤りが無いか、正しく設定されているかなどを確認
            
          


***
Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  
***
Java-データベース接続 Java-MySQL接続③-2：Eclipse（Pleiades All in One）のビルドバスへCLASSPATHを設定する方法 / 2017年9月

#CLASSPATH（クラスパス）の設定
標準的なシステムライブラリに含まれていない部品（jarファイル）は、「外部ライブラリ」と呼ばれます。
JDBCドライバは、外部ライブラリのひとつです。標準的なシステムライブラリにくわえて外部ライブラリを使用するには、この外部ライブラリの場所をコンパイラや JVM（JavaVirtualMachine:Java 仮想環境）へ伝える為の設定が必要となります。この設定を「CLASSPATH(クラスパス)の設定」といいます。

「CLASSPATH(クラスパス)の設定」はいくつか方法がありますが、
このQiita自分用メモでは、
1.環境変数へ CLASSPATH を設定する方法
2.Eclipse(Pleiades All in One)のビルドバスへ CLASSPATH を設定する方法
を記載します。

#Eclipse(Pleiades All in One)のビルドバスへ CLASSPATH を設定する方法

ここでは後ほど作成する ChkLoadJdbc の作成を例として記述します。

Eclipse(Pleiades)を起動します。
 
Java パースペクティブにて操作をおこなう事とします。
(Java パースペクティブでない場合は、当該パースペクティブに切り替えておきます)


パッケージ・エクスプローラーの空白部分を右クリック
->新規->Java プロジェクトを選択

「新規 Java プロジェクト」画面が表示される

プロジェクト名:ChkLoadJdbc
とします
実行環境 JRE の使用:JavaSE-1.8
とします

「次へ」ボタンを押下

ここで「ライブラリー」タブを選択
（後ほど<<確認方法>>の部分でも設定をおこなう事ができます）

「外部 JAR の追加」ボタンを押下

C:\Program Files\Java\jdk x.x.x_xxx\lib を開く
※xはインストールされている JDK のバージョンによって異なります。

mysql-connector-java-x.x.xx-bin.jar を選択して、「開く」ボタンを押下

「完了」ボタンを押下します。

<<確認方法>>
Java プロジェクトフォルダ(ChkLoadJdbc)を右クリック
プロパティを選択
「Java のビルド・パス」を選択
「ライブラリータブ」を選択
mysql-connector-java-x.x.xx-bin.jar と JRE システム・ライブラリーが登録されていることを確認します。
登録されている場合は、以上で設定は完了です。

登録されていない場合は、以下の設定をおこないます。

***
「外部 JAR の追加」ボタンを押下
C:\Program Files\Java\jdk x.x.x_xxx\lib を開く
※xはインストールされている JDK のバージョンによって異なります。
mysql-connector-java-x.x.xx-bin.jar を選択して、「開く」ボタンを押下
「完了」ボタンを押下


以降、
１.JDBCドライバのロード（JDBCドライバを使ってデータベース（MySQL）に接続できる状態かを確認する）

2.MySQL への接続(データベース(MySQL)に接続して、テーブル情報を検索する。また検索結果を表示する。) の順に2つのプログラム(アプリケーション)を作成します。

***


***
Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  
***
Java-データベース接続 Java-MySQL接続③-1：環境変数へCLASSPATHを設定する方法 / 2017年9月

#CLASSPATH（クラスパス）の設定
標準的なシステムライブラリに含まれていない部品（jarファイル）は、「外部ライブラリ」と呼ばれます。
JDBCドライバは、外部ライブラリのひとつです。標準的なシステムライブラリにくわえて外部ライブラリを使用するには、この外部ライブラリの場所をコンパイラや JVM（JavaVirtualMachine:Java 仮想環境）へ伝える為の設定が必要となります。この設定を「CLASSPATH(クラスパス)の設定」といいます。

「CLASSPATH(クラスパス)の設定」はいくつか方法がありますが、
このQiita自分用メモでは、
1.環境変数へ CLASSPATH を設定する方法
2.Eclipse(Pleiades All in One)のビルドバスへ CLASSPATH を設定する方法
を記載します。

#環境変数へ CLASSPATH を設定する方法
mysql-connector-java-x.x.xx-bin.jar をコピー
Windows エクスプローラー(Windows ボタン+E ボタン)を開く
C:\Program Files\Java\jdk x.x.x_xxx\lib を開く
※xはインストールされている JDK のバージョンによって異なります。 

先ほどコピーした mysql-connector-java-x.x.xx-bin.jar を貼り付け
貼り付けができたら、Windows エクスプローラーは閉じて構わない

次に、WIndows ボタン->コンピューターを右クリック->プロパティを選択
システムの詳細設定リンクをクリック
環境変数ボタンを押下





 
#CLASSPATHが存在しない場合
「システム環境変数」の一覧に変数 CLASSPATH が存在しない場合は、以下の登録をおこないます。

「システム環境変数」の下にある新規ボタンを押下します。
変数名: CLASSPATH
変数値: .;C:\Program Files\Java\jdk x.x.x_xxx\lib\mysql-connector-java-x.x.xx-bin.jar; のような形式で記述します。

＊xはフォルダ名、ファイル名と照らし合わせて、相違がないように記述します。
フォルダ名やファイル名は、名前をコピーした上で貼り付ける方法がもっとも確実です。

#CLASSPATHが存在する場合
「システム環境変数」の一覧にて、変数 CLASSPATH が存在する場合は、以下の登録をおこないます。

CLASSPATH が表示されている列を選択
「システム環境変数」の下にある編集ボタンを押下

変数名: CLASSPATH
変数値: .;xxxxxxxxxxxxx.jar;C:\ProgramFiles\Java\jdkx.x.x_xxx\lib\mysql-connector-java-x.x.xx-bin.jar; のような形式で追記します。

＊xはフォルダ名、ファイル名と照らし合わせて、相違がないように記述します。
フォルダ名やファイル名は、名前をコピーした上で貼り付ける方法がもっとも確実です。

これでダメなら次回自分メモのEclipseから設定する（小声）


***

☆変数値: .;C:\Program Files\Java\jdk x.x.x_xxx\lib\mysql-connector-java-x.x.xx-bin.jar;について 変数値は;(セミコロン)記号で区切りながら宣言をおこないます。

最初の.(ドット)は、JDBC ドライバと接続する Java プログラム(これから作るプログラム)を意味しています。また、C:\Program Files\Java\jdk x.x.x_xxx\lib\mysql-connector-java-x.x.xx-bin.jar は、JDBC ドライバとなる外部 ライブラリのファイル名と保存した場所を示しています。

この後作成する Java プログラム内にて JDBC ドライバマネージャを呼び出す為の命令を書くと、JDBC ドライバは指定された JDBC ドライバを更に呼び出し、対象となるデータベースへ接続しようとします。

***

***
Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  
***
Java-データベース接続 Java-MySQL接続②：JDBCドライバの取得方法（MySQL用）とデータ接続準備 / 2017年9月

#JDBCドライバの取得(MySQL用）-データベース接続
MySQL へ接続するためには、MySQL に対応する JDBC ドライバを準備する必要があります。これは MySQL の Web サイトから提供されています。

下記 URL からダウンロードできます。
http://dev.mysql.com/downloads/connector/

上記 URL にアクセスすると「Connector/J」というリンクがあります。これをクリックすると、Download Connector/J ページに画面遷移することができます。以下の手順にて、MySQL に対応する JDBC ドライバのダウンロードをおこないます。

***
Select Platform: Platform Independent を選択します。
ダウンロードが開始されます。
ダウンロードされたファイルは、Windows では通常、ダウンロードフォルダに保存されます。
Windows エクスプローラー(Windows ボタン+E ボタン)を開きます。
ダウンロードフォルダを開きます。
以下のファイルが保存されていることを確認します。
mysql-connector-java-x.x.xx.zip
*拡張子（zip）が表示されていない方は注意

mysql-connector-java-x.x.xx.zip を右クリックします。
「7-Zip -> mysql-connector-java-x.x.xx\ に展開」を選択します。
*7-Zip（圧縮・解凍ソフト）が表示されていない方は注意

mysql-connector-java-x.x.xx.zip が展開されると、mysql-connector-java-x.x.xx フォルダが作成されます。
mysql-connector-java-x.x.xx フォルダを開きます。
"mysql-connector-java-x.x.xx-bin.jar"があることを確認します。


***

以下は上記備考になります。

＊拡張子(zip)が表示されていない方は、以下の設定をおこなってください。
スタートボタン->コントロールパネルを選択
表示方法:にて大きいアイコンを選択
フォルダーオプションを選択
表示タブを選択
「登録されている拡張子は表示しない」のチェックを外す
OK ボタンを押下する

＊7-Zip（圧縮・解凍ソフト）が表示されていない方は、今後も使用する可能性が高い為、ここでインストールして以下の設定をおこなってください。
7-Zipをインストールする
Webブラウザを開く
「7-Zip」を検索する。もしくは https://sevenzip.osdn.jp を開く
64ビットx64のダウンロードリンクをクリック
ダウンロード後、保存されたファイルを実行してインストールを開始
インストールを完了

＊Jar ファイル
※jar(Java Archive)ファイルは、クラスファイルや構成ファイルを一つのファイルにまとめたもの、もしくは、この jar ファイルを出力する為のツールをいいます。
jar ファイルは ZIP 形式で作成されており、ファイルサイズを小さくするだけでなく、Java は jar ファイルを直接扱うことができる為、サーバー負荷の軽減や起動速度の向上を期待することができます。



***
Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  
***
Java-データベース接続 Java-MySQL接続①：JDBCとJDBCドライバの概要 / 2017年9月

#はじめに
Javaデータベースの接続完了までを５段階に分けた自分用メモになります。至らぬ点などがございましたら恐れ入りますが、ご教示いただけますと幸いでございます！

Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  


#概要
Javaプログラムを使ってデータベースへ接続するには、「JDBC(JavaDataBaseConnectivity)」と呼ばれる仕組みを利用する必要があります。

JDBC とは、MySQL や PostgreSQL のようなデータベースや Excel のようなスプレッドシート(データファイル)に対して Java 言語のプログラムからアクセスする為の API の総称です。

※API(ApplicationProgrammingInterface)は、簡単に機能を利用することができるようにするための部品や定義のことで、一般的にはアプリケーションにおける機能や仕様のような概念をとりまとめたものとして使われます。 

JDBC を利用する為に、各データベースを提供するベンダーやスプレッドシートを提供するベンダーでは、「JDBCドライバ」と呼ばれる部品を提供しています。データベースやスプレッドシートへ接続するには、「JDBCドライバ」をダウンロードする必要があります。

これは、JDK が提供する標準的なシステムライブラリには、各データベースやスプレッドシートへ接続する為の部品が含まれていない為です。

なお、JDK が提供する標準的なシステムライブラリには、「JDBC ドライバマネージャ」が提供されており、この機能を使って、JDBC ドライバを呼び出します。JDBC ドライバは JDBC ドライバマネージャが指定したデータベースへ接続をおこないます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200922/2efc347b-cd06-5697-260a-bbe188278818.png)

***
Java-データベース接続 / Java-MySQL接続
①[JDBCとJDBCドライバの概要](https://qiita.com/drafts/c08edca77306cadd3217)
②[JDBCドライバの取得方法（MySQL用）とデータ接続準備](https://qiita.com/drafts/7cbe6afd3c3486dcdab1)
③-1 [環境変数へCLASSPATHを設定する方法](https://qiita.com/drafts/4961ce6d5b12aff6c108)
③-2 [EclipseのビルドバスへCLASSPATHを設定する方法](https://qiita.com/drafts/f2b677770791f4611520)
④[JDBCドライバのロード](https://qiita.com/drafts/7f712392a910f2e9b993)
⑤[データベース（MySQL）に接続してテーブル情報を検索、また検索結果を表示](https://qiita.com/drafts/39dc456d6cd722270a17)  
***
[Swift4] NSNib.Nameの便利なExtensionとProtocol

Swift4から`NSNib`を生成するためにXib(.nib)の名前を`NSNib.Name`という特別なtypeにする必要が出来ました。

面倒くさいのでExtensionを作りました。

```swift
extension NSNib.Name {
    static func nibName<Subject>(_ type: Subject) -> NSNib.Name {
        return NSNib.Name(rawValue: String(describing: type))
    }
}
```

例えば`CellItem`クラスが使うクラスと同名の`CellItem.xib(nib)`をロードするときは、

```swift
let nib = NSNib(nibNamed: .nibName(CellItem.self), bundle: nil)
```

これでＯＫです。


----
追加
protocolも作りました。

```swift
protocol NibLoadable {
    
    static var nibName: NSNib.Name { get }
}

extension NibLoadable {
    
    static var nibName: NSNib.Name {
        
        return .nibName(for: self)
    }
}
```

これで、

```swift
extension CellItem: NibLoadable {}
```
とするだけで

```swift
let nib = NSNib(nibNamed: CellItem.nibName, bundle: nil)
```
とできるようになります。
iOS11でFBSDKLoginKit使ってアラートが出るようになってもプロダクトコードもろバレを防ぐ方法

iOS11 で FBSDKLoginKit の FBSDKLoginManager で Facebook認証しようとすると、アラートが表示されるようになりました。
Bundle Identifier が com.hoge.app だとデフォルトだと下記になります。
<img width="30%" alt=" 2017-09-22 2.49.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/37274/0ef4444f-e29b-d617-eee2-3d3daf7fc6ee.png">

```
"A"がサインインのために"B"を使用しようとしています。
これを行うと、AppとWebサイトにあなたに関する情報を共有することを許可します。
キャンセル 続ける
```


会社のプロダクトや、企画を並行してとりあえずプロジェクト作ったようなアプリとかだと、
Bundle Identifier などが識別ができるだけの適当なプロダクトコードになっている場合もあるのでは？

## 解決方法
Info.plist の Bundle Name を変えるとアラートの文言も変わります。

### デフォルト
<img width="580" alt=" 2017-09-22 2.49.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/37274/24e2c543-942f-5fe1-4a70-b9ca920aa667.png">

<img width="376" alt=" 2017-09-22 2.49.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/37274/0ef4444f-e29b-d617-eee2-3d3daf7fc6ee.png">

### Bundle Name 変更後

<img width="444" alt=" 2017-09-22 2.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/37274/e4ecfdbd-6dfc-3263-fc47-2a4be558a43f.png">


<img width="376" alt=" 2017-09-22 2.50.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/37274/992f1f04-8060-2218-4683-484eb2ef76d9.png">


## 何が起きたのか？

どのSDKバージョンから入ったのか追跡はしていませんが、iOS11だと↓コードが実行されることでSafariセッションを使おうとしてアラートが出ています。
[FBSDKApplicationDelegate.m#L337](https://github.com/facebook/facebook-ios-sdk/blob/fb1023d53e30e9cb07e407787fad6cedb164f1e3/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m#L337)

↑のリンク先コードを見ると分かりますが、 SFAuthenticationSession が使われています。
つまり Facebook 特有コードというわけでなく、 SafariServicesモジュールのSFAuthenticationSessionを使う場合は全て対象になります。

## 補足
実際にサンプルでアラートを見たい場合は↓記事を次のようにすればすぐ確認できます。
具体的な説明などは↓記事にかかれているのでそちらをどうぞ。
https://qiita.com/koogawa/items/55a7405c2c323a8f413a#%E5%AE%9F%E8%A3%85

```swift
import UIKit
import Foundation
import SafariServices

class ViewController: UIViewController {
    var session: SFAuthenticationSession?
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "https://ja.foursquare.com/oauth2/authenticate?client_id=hogehoge&response_type=token&redirect_uri=app://authorized")!
        self.session = SFAuthenticationSession(url: url, callbackURLScheme: nil) { url, error in
            print(url)
        }
        session?.start()
    }
}
```
ローカルの Flash ファイルが Firefox で開かなくなった

近い将来の廃止が約束されている Flash ですが、まだ開発やメンテナンスに取り組んでいるエンジニアの方は多いと思います。そのようなエンジニアの中には

- Firefox + Flash Debug version
- Flash Builder or IntelliJ

といった開発環境で、作業されている方も多いのではないかと思います。そのような方向けの情報です。

最近、開発環境から Flash アプリを起動しても、Firefox で Flash が起動しないという症状に遭遇していないでしょうか。私は遭遇し、困りました。

Firefox の仕様変更の影響です。バージョン 55 から、http / https の URL 以外で Flash が起動しないように変更になりました。Firefox の設定変更が必要です。

https://support.mozilla.org/ja/questions/1172126

1. アドレスバーに "abount:config" と入力して設定一覧を開く
2. 検索まどで "plug*ht" と入力し、plugins.http_https_only の設定を探す
3. plugins.http_https_only の設定値を true から false に変更する
AWS Cloud Roadshow 2017 大阪メモ


AWS Cloud Roadshowに行ってきたので、手書きメモを書き起こしてみました。間違っている箇所があれば、ご指摘お願いいたします。
【基調講演】クラウドで実現する IoT、ビッグデータ、AI の活用と最新事例は特にメモしていなかったので、飛ばします。

##  IoT with Amazon Web Services ～最新テクノロジーアップデート、AWS IoT と AWS Greengrass を中心に～

- AWS Green glass… インターネットに接続されたデバイスでローカルのコンピューティング、メッセージング、データキャッシュ、同期を安全な方法で実行できるようにするソフトウェア
- Java,Python,node.jsが使える
 
![image](https://qiita-image-store.s3.amazonaws.com/0/123008/c321f2a5-9db7-9cfe-5665-39953398930e.png)

## 【ヤンマー】お客様サービスを変革するヤンマーの IoT 戦略 A SUSTAINABLE FUTURE ～テクノロジーで、新しい豊かさへ。～
-  農業機械の盗難対策としてIoTでモニタリング
-  使用場所の範囲や使用時間を閾値にし、位置情報や起動時間をモニタリングする。閾値を超えた場合は、お客様にアラートと電話がいく。
-  2050年には世界人口は1.4倍になる
→世界的に食糧不足になる→戦争
- 一方で日本は2/3の人口になる
→労働力の減少
→IoTでの効率化が必要

## AWS で実現するデータレイクソリューション ~ AI, IoT, データ分析環境構築パターン ~
- データ活用の考え方
- AWSのサービスの使い方
- 構築パターン

○各フェーズで必要なツールやリソースを確保する
○データの取得と整形
○可視化のためのSQLパイプライン処理

- S3を中心としたデータレイク構成

![image](https://qiita-image-store.s3.amazonaws.com/0/123008/6bfc5d0c-7445-f984-89f5-40f9645ae1f9.png)

- AWS Athena… prestoベースの標準SQL
- AWS Glue… フルマネージドのデータカタログ,ETLサービス
- P2インスタンス+DeepLarningAMI

![image](https://qiita-image-store.s3.amazonaws.com/0/123008/e2428dc6-ca00-89ae-f73d-6dc5fa741d2e.png)

- 直近のホットデータとコールドデータでアクセスの方法を変える
構成例

![image](https://qiita-image-store.s3.amazonaws.com/0/123008/88f89fb0-0de3-09c9-8b5e-db1cd0f0b497.png)

- マルチノードパターン
構成例

![image](https://qiita-image-store.s3.amazonaws.com/0/123008/1ded2e6c-5d40-1be4-0c31-626e31d1dde6.png)

- ABテストパターン
構成例
Data→Route53 or Lambda@Edge →ELB →EC2 or ECS

- データマネジメントパターン
- カタログサーチパターン
 データだけでなくメタデータも
## これで安心！セキュリティとネットワーク ～ Getting Started with AWS Security and Networking ～
- パブリックサブネット… インターネットに繋げる
- プライベートサブネット… 繋げない
- AWS Direct Connect… リモートネットワークからVPC専用のプライベート接続を提供する。インターネットに繋ぐのが怖い人向け。
 
![image](https://qiita-image-store.s3.amazonaws.com/0/123008/2d3d10fe-0b98-82d5-48c9-45b9c5370e06.png)

- IAMロール…ヘルメットに付箋(ポリシー)を張り付けるみたいなイメージ
- EC2にIAMロールを被せる→他サービスにアクセスする
- AWS Cloud TrailでAPIアクセスログをとれる！

## 使ってみよう！データベースとストレージ ～ Getting Started with AWS Database and Storage Services ～

![image](https://qiita-image-store.s3.amazonaws.com/0/123008/65de5aff-bbc6-1e34-a7ef-5a0aff3854ee.png)

- セッションをどうする？
→ELBにセッションスティッキーを持たす？
→追加ユーザが対応できない
★スケーラブルにしたかったらサーバにデータを一切持たせない
- バケットはそんなに作るものじゃない
- キー毎にアクセス管理したければIAMで管理
- S3バージョニングで論理削除から守れる
- Glacier… 前もってデータを取り出す時が分かってる時に使う。バックアップには向いてない。
- S3 IA… 低頻度で使用する場合に使う。取り出す時にS3よりちょっと高くなる。
- SQL…RDS,Redshift
- NoSQL…DynamoDB
- RPJのマルチAZ配置(別のAZに同期的にレプリケートされる)
- レプリケート… マスタデータの複製(レプリカ)を作成すること

## サーバーレスアプリケーションの入門と実践
- サーバレス…サーバの運用・管理が不要になること(バックグラウンドでは動いている)
- サーバレスへの時代の流れ
データセンタ上の物理サーバ⇒データセンタ上の仮想サーバ⇒クラウド上の仮想サーバ⇒サーバレス
○サーバレスに移行する時に考える事
- 既存アプリを分解するか
- どのようなコンポーネント群が通信するか？
- 関数は何に反応するか？
- 粒度
　関数が多くてめんどくさくならないか？
- 関数の多いアプリケーションはAWS SAMで解決
SAM + Cloud Formation →Lambda

- github/awslabs 便利
- git-secret…　認証情報を公開しちゃうのを防いでくれるよ
- chalice(Pythonのフレームワーク)

サーバレスの構成を考えるのがめんどくさい……

- AWS Codestarを使えば数分で開発が開始できる！

AWS X Ray

- 本番環境の分散アプリの分析とデバッグ
- 問題の発見
- リクエストをトレース→トレースを記録→サービスマップを表示→問題を分析

理解してほしかった事

- AWSにおけるサーバレスとは
- サーバレスのためのCI/CDパイプライン
- SAMやCode系サービスを活用
- Code star
- 信頼性
顔を左右対称にするTwitter botを作った話

# 顔を左右対称にするbotとは?
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/3330046d-db09-3ed1-d3b9-8b125028cba1.png)
**リプライでアカウント([@SymmetryFace](https://twitter.com/SymmetryFace))に顔写真を送ると、顔を左右対称にした画像を作って送り返します。**
元ネタ→[ゲームをする時はしっかりマイクをOFFにしましょう - Oculus VR -](https://www.youtube.com/watch?v=4wSCLrW40nA)

**※鍵アカウントの人のための使い方**
(鍵アカウントは相互フォロー状態にならないと、リプライを送っても動作しません。)
1. 一度鍵を外す。
2. アカウント([@SymmetryFace](https://twitter.com/SymmetryFace))をフォローする。
3. 鍵を付け直す。
4. 写真を送り付ける。
この仕様をなおしたい...:anguished:

# 左右対称にしたサンプル
これが
![e884a322.jpg](https://qiita-image-store.s3.amazonaws.com/0/91558/9d2109e3-c4a9-1f0c-6b13-d8f0599ed233.jpeg)
こうじゃ
![DKTkz-6UEAAyDS_.jpg](https://qiita-image-store.s3.amazonaws.com/0/91558/31601c12-ed48-afc9-e87c-ed5736c93bfd.jpeg)


# 顔を左右対称にするプログラム

```python:SymmetryFace.py
import cv2
import sys
import math
import numpy as np

CASCADE_PATH = "haarcascade_frontalface_alt.xml"

def symmtry_face(in_image_path, out_image_path):
    image = cv2.imread(in_image_path)
    height, width, color = image.shape
    cascade = cv2.CascadeClassifier(CASCADE_PATH)
    facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))

    if len(facerect) == 0:
        return False

    rect = facerect[0]
    start_x = rect[0]
    face_width = rect[2]
    center_x = int(math.floor(start_x + face_width/2.0))

    left_image = image[0:height, 0:center_x]
    right_image = left_image[:,::-1]
    out_image = cv2.hconcat([left_image, right_image])

    cv2.imwrite(out_image_path, out_image)

    return True

if __name__ == "__main__":
    symmtry_face("test.jpg", "test.out.jpg")
```
→実行するとtest.jpgから顔を検出して、左右対称にした画像をtest.out.jpgをして書きだす。

# その他にやったこと
この記事には載せていませんが、Twitter botにするにあたって以下のこともやってます。

- Tweepyを使ってリプライの監視と左右対称画像の返信
- Supervisorを使ってでメインスクリプトのデーモン化

# 同じことをやろうとしている人へのアドバイス

- OpenCVを入れるのがめんどくさいときは、Anacondaを使うとかなり楽ちん[3]です。
- 画像のDLはPython2.7.9以上じゃないと、InsecurePlatformWarningとかがでるからアップデートしたり、Anaconda使ったりするといい。
- Supervisorの設定項目のdirectoryをちゃんと指定するといい。
- Supervisorで困ったときは「```sudo service supervisor restart```」すると動くかもしれない。

# 参考にしたサイトとか
1. [ゲームをする時はしっかりマイクをOFFにしましょう - Oculus VR -](https://www.youtube.com/watch?v=4wSCLrW40nA)
2. [Tweepyでstreaming apiを使用した自動フォロー返し](https://qiita.com/naari/items/fa44a318dad81c8c627f)
3. [pythonでOpenCVを使う一番簡単な方法](https://qiita.com/ru_pe129/items/8a1a75cdf713d4fa6bc8)
4. [Authentication Tutorial — tweepy 3.5.0 documentation](http://docs.tweepy.org/en/v3.5.0/auth_tutorial.html)
5. [Unable to save image from web using urllib2](https://stackoverflow.com/questions/14439809/unable-to-save-image-from-web-using-urllib2)
6. [Supervisorで簡単にデーモン化](https://qiita.com/yushin/items/15f4f90c5663710dbd56)

# 宣伝
フォローお願いします:soccer: [@redshoga](https://twitter.com/redshoga)
NEF(Nikon RAW) からセンサー RAW 値を取り出す

漢なら Nikon NEF ファイルから Sensor RAW 値を取り出したいですよね!

やりましょう! 

手っ取り早く取得したいなら dcraw を使いましょう. 
https://www.cybercom.net/~dcoffin/dcraw/

## 情報源

* Nikon Electronic File (NEF) file format description http://lclevy.free.fr/nef/
* dcraw
* Astrophotography Part 2 : The Linearization Curve http://diyastro.blogspot.jp/2014/06/astrophotography-part-2-linearization.html
* Quick Way to Decode a Huffman Table http://diyastro.blogspot.jp/2014/06/quick-way-to-decode-huffman-table.html
* Metadata reference tables http://www.exiv2.org/tags-nikon.html

## EXIF

TIFF IFD と同じなので, TIFF IFD と同じようにパースします.

## Maker note

Maker note はメーカー定義の情報が入っています. NEF の場合はこれも TIFF IFD フォーマットになっているので, TIFF のパーサーを使いまわすことができます.

## センサー値の復元

ダイナミックレンジを稼ぐためなのか, Nikon の場合 RAW 値(A/D 値)は**リニアになっていない**のでつらい.
リニアに復元するための curve が NEF の maker note に含まれていますのでこれを使う必要があります.

Nikon の RAW には white balance preconditioning も入っていますが, これも関係していそうですね.

Nikon RAW の white balance pre-conditioning について
https://syoyo.wordpress.com/2017/02/02/nikon-raw-%E3%81%AE-white-balance-pre-conditioning-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

## 圧縮について

NEF では, 12bit, 14bit, lossy 圧縮, 非圧縮があります.
D810 などのハイエンド系では uncompressed をサポートしていますが, D5100 など入門機用は uncompressed には対応していません.

## white-balance 暗号化

昔の NEF では, white balance 値には暗号化がかかっていました.

Nikon's photo encryption reported broken
https://www.cnet.com/news/nikons-photo-encryption-reported-broken/

dcraw にそのデコードのコードがあります.

近年のカメラ(D5100, D810 で確認. Nikon maker format 2 以降)では, maker note tag の `0xc` に white balance が R, B で書き込まれています(B = 1.0 を基準として R, B が正規化されている)ので, 暗号化された whilte balance をデコードする必要はなくなりました.


## 手順まとめ

1. TIFF IFD をパース
2. EXIF をパース
3. Maker note をパースし, 圧縮タイプと linearization table を取得
4. 圧縮タイプに応じてハフマン符号化された RAW データをデコードし, linearization table でリニア化
5. predictor 復元 + lossless デコード的なのをちょっぴり

ややこしいですね!

## コード

tinydngloader `nef` branch にあります.

https://github.com/syoyo/tinydngloader/tree/nef

dcraw, 1 億年かけて熟成した秘伝のソースみたいな感じでつらいのでいろいろ書きなおしていますが, ハフマン符号化のテーブル値が dcraw 以外に見当たらないので, dcraw から取得しています
そのため dcraw 部分はとりあえず GPL ライセンスにしています. RESTRICTED でない部分の code fragment だけなら違うライセンスでいけるかも? dcraw 作者にコンタクトを検討.

## TODO

* ハフマン符号化テーブルの情報源を突き止める.
* ディープラーニングで RAW 画像パーサーをつくってほしい.
* 優秀な RAW 画像処理若人が人類史上最速で育成され, 優秀な RAW 画像若人が日々切磋琢磨し RAW 画像処理を極めるスキームを確立したい.
SmartGit > remoteへpush済のフォルダを削除し、ignoreする

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.5 #10143
```

間違ってpushしたフォルダをignoreする方法。

### remoteへpushしているフォルダの削除

参考: [あとからまとめて.gitignoreする方法](https://qiita.com/yuuAn/items/b1d1df2e810fd6b92574)

フォルダ(例: Win32)をremoteにpush済の場合、以下のようにする。
(Tools > Open Git-Shell上で実行)

```
$ git rm -r --cached Win32
```

### ignore

- Repositoriesペインのプロジェクト > 対象フォルダ(Win32)上で右クリックし、ignoreを選択する。
- ダイアログにてIgnoreボタンを選択
    + .gitignoreファイルに追記される
- .gitignoreをcommit, push

### 補足

Filesペイン上でignoreばかりしていたので、Repositoriesペインでignoreするという発想はなかった。
Windows資格情報のユーザーが保存されない現象への対応

# 1. 症状
　一言で言うなら、
　「パソコンがユーザー情報を保存してくれない！」
　「ネットワークのパソコンにアクセスするたびにログインを求められる！」

　
　ファイル共有の際、エクスプローラーでWindowsパソコンAにWindowsパソコンBからアクセスしようとすると、以前登録したユーザー情報とパスワードを再び求められました。チェックボックスにチェックを入れて、ユーザー情報を保存したにもかかわらずです。再起動のたびにこの現象が見られました。ちなみに、パソコンBはパソコンAが作ったホームグループに入っています。

　再起動直後に、コントロールパネル（Windows10の設定アプリではない方）からWindows資格情報の詳細を除くと、まるで心当たりのないユーザー名が表示されて、再起動前に保存した情報が保持されていないと見当がつきました。その時のスクリーンショットがこちら。

![windows_authorization_HomeGroupUser.jpg](https://qiita-image-store.s3.amazonaws.com/0/201801/e402c64a-419e-ae42-416b-6c4d60441f15.jpeg)
（※ {ComputerName}のところは、接続先のパソコンのコンピューター名です）

　再起動の度にユーザー名が {ComputerName}￥HomeGroupUser$（￥は半角）になってしまうため、パソコンAにアクセスするとログイン情報を求められました。ユーザー情報を記録してほしい！


# 2. 環境（前提）
・ Windows10
・ Windowsのホームグループに入っている

　本稿の解決策は上記2項目が対象です。おそらく、Windows10に限らず次の対応策は有効だと思います。ホームグループに件に関して、ホームグループに入っていないパソコンではこのような症状が出ないため問題ないでしょう。


# 3. 対応策
## 3.1. Windows資格情報の確認
　まずは資格情報を確認しましょう。Windows資格情報は、コントロールパネルの「ユーザーアカウント」＞「Windows資格情報の管理」（コントロール パネル\ユーザー アカウント\資格情報マネージャー）で見られます。接続先のパソコンのユーザー名が、{接続先のパソコン名}￥HomeGroupUser（￥は半角）になっていませんか？

## 3.2. 「ホームグループ接続」の設定変更
　3.1. 対応策で、ユーザー名が件（くだん）のようになっていたらホームグループの設定を変更しましょう。コントロールパネルの「ネットワークとインターネット」＞「ホームグループ」＞「共有の詳細設定の変更...」＞「ホームグループ接続」を開きます。

![HomeGroup.png](https://qiita-image-store.s3.amazonaws.com/0/201801/647c4e97-06c0-0120-dd4c-0b67423bb7e0.png)
　コントロールパネルの「ネットワークとインターネット」＞「ホームグループ」の画面

![NetworkSettingsProperty.png](https://qiita-image-store.s3.amazonaws.com/0/201801/e5d6df61-6778-39ed-e7d6-85453388a246.png)
　ホームグループの「共有の詳細設定の変更...」の画面

　上のスクリーンショットの「ホームグループ接続」を確認しましょう。「Windowsでホームグループ接続を管理できるようにする（推奨）」にチェックが入っていませんか？ここにチェックが入っていると再起動時（おそらく再ログイン時）にホームグループに入っているパソコンのログインユーザー名が、{接続先のパソコン名}￥HomeGroupUser$（￥は半角）に書き換えられてしまいます。

　そこで、このチェックを「ユーザーアカウントとパスワードを使用して他のコンピューターに接続する」に入れて下さい。これによって、ログイン情報が紛うことなく保全されます。（下のスクリーンショット参照）

![windows_authorization.jpg](https://qiita-image-store.s3.amazonaws.com/0/201801/5b90d4f6-8610-9ffa-7494-f28ae0eff479.jpeg)

　再起動しても、ユーザー名が保存されていて、「常設」の項目がローカルコンピューターからエンタープライズになっています。これで終了です。


# 4. 要約
【症状】　パソコンがユーザー情報を保存してくれない！
【確認】　ユーザー名が　接続先のパソコン名￥HomeGroupUser$
【対応】　ホームグループ接続の詳細設定で、「Windowsでホームグループ接続を管理できるようにする（推奨）」→「ユーザーアカウントとパスワードを使用して他のコンピューターに接続する」にチェック
vimコマンド

個人的によく使うキーをまとめています
ある程度のキーが自然と使えたらvimも楽しくなりますね
追々vimの設定系も調べて行きます

## コマンドモード中
### モード切替
| キー | 動作 |
|---|---|
|i|カーソル位置からINSERTモードになる|
|a|カーソル位置の1つ後ろからINSERTモードになる|
|Shift+a|カーソル行の末尾からINSERTモードになる|
|Ctrl+v|ヴィジュアルモードに切替え|

## 保存・終了
| キー | 動作 |
|---|---|
|w|編集内容の保存|
|q|vimを終了する|
|q!|強制的にvimを終了する|
|wq|編集内容を保存してvimを終了|

### 基本動作・移動
| キー | 動作 |
|---|---|
|u|戻る。一つ前の状態に戻る|
|Ctrl+r|進む。戻した操作を元に戻す|
|Shift+g|ファイルの最後に移動|
|gg|ファイルの先頭に移動|

### コピー・切取り
|キー|動作|
|---|---|
|yy|行コピー。yyの頭に数字を指定することで複数行コピーとなる|
|dd|行切取り。ddの頭に数字を指定することで複数行削除となる|

### 貼付け
|キー|動作|
|---|---|
|p|カーソルのある行から1つ下の行に挿入|
|Shift+p|カーソルのある行から1つ上の行に挿入|

### その他
| キー | 動作 |
|---|---|
|Ctrl+z|プログラムを一時停止。jobsコマンドでプログラムの一覧を表示し、fg コマンド（fg [再開プログラム番号]）で再開する。|

## INSERTモード中
### モード切替
|キー|動作|
|---|---|
|Esc|INSERTモードから抜け、COMMANDモードになる|
pythonメモ：isinstance() 変数の型を確認

#動機
pythonだと型の厳密さを気にすることはこれまであまりありませんでしたが、コマンドライン引数で整数を入力して欲しいのにfloatが来たら困るな〜、という時に、型を確認してエラー処理するにはどうしたらいいのか、と思ったため。

#isinstance()
isinstance(変数, 型)とすることで、変数が指定した型かどうかをTrue, Falseで取得できます。

```Python:type_check.py
a = 1
b = 2.0

print(isinstance(a, int), isinstance(a,float)) #True False
print(isinstance(b, int), isinstance(b,float)) #False True
```

Tensorflowの中身を見ている時によくisinstance()をよく目にしたんですが、こういう使い方なんですね。便利。
Laravel5.3を使っていた人が、テスト時に遭遇した5.5の相違点

## 経緯
今まで`Laravel5.3`を使ってきたのですが、[この記事](https://qiita.com/motuo/items/b2194d7fb0d940af387f)で初めて、`Laravel5.5`を触ってみました。
個人的にちょっと驚いた(？)相違点を書き留めておきます。5.4の時点で既に変わっている、というものかもしれませんが、多めに見てください。

### Netbeans8.2では単体テストが出来ない。
Laravel5.5に入っているPHPUnitを使おうとした時に、`unrecognized option --log-json`というエラーが発生してテストが止まってしまいました…
[こちら](https://netbeans.org/downloads/index.html)からダウンロードできる最新版のNetbeansでは対応できない模様。
参考:[NetBeans forums](https://forums.netbeans.org/topic67531.html)

[開発版](http://bits.netbeans.org/download/trunk/nightly/latest/)を使う事で、上記の事象は解消しました。

### $this->visit('/')を使うと、`Call to undefined method `になる
使えると思いこんでいたので、ハマる…
どうやら、Laravel5.4以降は、duskを使う必要があるらしいです。[参考](https://laracasts.com/discuss/channels/testing/call-to-undefined-method-viewtransactionlisttestvisit)
duskの使い方に関しては、先人たちが残した資料があるので、これを使いながら進めていこう。

まだ、少ししか触っていないので、知らないことが他にも色々とありそうです…
MSエクセル：日付形式の設定

MicroSoftエクセル-2013で日付形式設定について、

本日はお客様から要望がいただきました。
**要件は、** 日付の形式が間違いの場合は、
エクセルセルの色は赤色に表示したいです。

例えば、日付の形式は、**yyyy/mm/dd**です。
ユーザーは **yyyy/mm-dd**形式に記入の場合は、エクセルセルの色は赤色に変わります。

下記の方法を使用して日付形式のチェックをできます。

**ステップ１・**
![Screen Shot 2017-09-20 at 14.15.22.png](https://qiita-image-store.s3.amazonaws.com/0/117479/2ce3ccc1-f0c2-f0b8-bce5-319edee838a1.png)

**ステップ２・**
![qiita_01.png](https://qiita-image-store.s3.amazonaws.com/0/117479/a81ebbf4-d21f-067f-d7eb-c2677504954c.png)

**ステップ３・**
![qiita_02.png](https://qiita-image-store.s3.amazonaws.com/0/117479/9baea780-a86f-4821-c499-9a36fc54e23a.png)

**ステップ４・**
![qiita_03.png](https://qiita-image-store.s3.amazonaws.com/0/117479/b8d2ec98-1c50-8a9b-7532-61edc3762b14.png)

終わりました。:slight_smile: :slight_smile:

何か不明な点をございましたらご連絡ください。

以上。
Spotifyで聞いている音楽をSlackのStatusに表示させるアプリを作った

[![https://gyazo.com/51505a9647471452d7bc27492e0bf1d4](https://i.gyazo.com/51505a9647471452d7bc27492e0bf1d4.png)](https://gyazo.com/51505a9647471452d7bc27492e0bf1d4)

# tl;dr

- MacのSpotifyアプリで聞いている音楽情報をSlackのstatusに表示させる
- SpotifyからデータとってくるところはAppleScriptを使った

# 元ネタ

[iTunes版](https://qiita.com/narikei/items/5c847d2a4f4f10bff0ea)が以前紹介されてました。

iTunesで曲を聞くことはほぼなくなっていたので、Spotifyの再生情報をとってこれないかなーと考えていてAPIみてました。
[Web API](https://developer.spotify.com/web-api/)をみても再生中の曲をとってくるやつはなさそうだったので断念していたのですが、[Spotifyで再生中の曲をtmuxのステータスバーに表示する](https://qiita.com/j-un/items/cf544b3e131772f5f197)という記事が目について、AppleScript使えばできるってことがわかったのでやってみました。

# Spotify版

ソースは以下になります。
https://github.com/iwata/nowplaying-on-slack

fork元では`playback`を使ってiTunesの情報をとってきていた部分を、AppleScriptを使ってSpotifyの情報をとってくるように変更してます。
あと永続化のためにelectron使っていたのを、`forever`でdaemonizeするようにしました。

## AppleScript

```applescript:bin/get-playing-on-spotify
#!/usr/bin/osascript

if application "Spotify" is running
  tell application "Spotify"
    set currentState to player state as string
    set currentArtist to artist of current track as string
    set currentTrack to name of current track as string
    return "{\"state\":\"" & currentState & "\", \"track\":\"" & currentTrack & "\", \"artist\":\"" & currentArtist & "\"}"
  end tell
else
  return "{\"error\":\"Spotify is not running.\"}"
end if
```

[ドキュメント](https://developer.spotify.com/applescript-api/)のサンプルコードをみてもらえば大体わかると思います。
このscriptをNodeからshell execしてあげるんですが、構造化されたデータをやりとりしたかったのでJSONを標準出力にだすことで実現しました。
AppleScriptでJSON書くのシンドイ…。

## main.js

NodeでSpotifyのデータを処理してくる部分は以下。

```js
const watchSpotify = () => {
  let before;

  setInterval(() => {
    exec(spotifyScript, (e, stdout, stderr) => {
      if (e) {
        console.error(e);
        return;
      }
      if (stderr) {
        console.error(stderr);
        return;
      }

      const m = JSON.parse(stdout);
      if ('error' in m) {
        console.error(m.error);
        return;
      }

      if (before === JSON.stringify(m)) {
        // console.log('not change');
        return;
      }
      before = JSON.stringify(m);
      const message = `${m.track} - ${m.artist}`;
      const emoji = (m.state === 'playing') ? ':spotify:' : ':musical_note:';
      sendToSlack({ message, emoji });
      console.log(m);
    });
  }, 3000);
};
```

playerの再生状態をもっている`state`をみて、statusで使う`emoji`を切り替えてます。
Spotifyのカスタム絵文字を使うようにしているので、環境によっては使えないと思うので適宜変更してもらえればと思います。

## 実行

```shell-session
git clone git@github.com:iwata/nowplaying-on-slack.git
cd nowplaying-on-slack
yarn install
SLACK_API_TOKEN=[[token]] npm start
```

現場からは以上です。
Javascript Promiseとasync/await

# Promiseとasync/await
## Promiseとは
- 非同期処理を統一的に扱う方法を定義したオブジェクト。
- Promiseを使えばネストが深いコールバック嵐から解放される。

## async/awaitとは
- ES2016+から導入されたasync関数と、await演算子。
- await/asyncを使うにはPromiseから習得する必要がある。
- await演算子はPromiseの処理が完了するのを待機するために使うもので、async関数（async function）内でのみ有効となる。

## Promiseとasync/awaitの違い
- Promiseは、非同期の処理を上手く同期的に見せたり、並列処理が出来るメソッド。await/asyncは非同期処理を同期的に行うため直列の処理をするもの。書き方が違う。
- Promiseを使うと、「非同期の処理」、「結果の処理」といったように処理を分けて書くことができるが、.then()メソッドの連鎖の部分は、処理が多くなると複雑になっていく。Promiseをよりシンプルに書けるようにするために、追加されることになったのが「async/await」。

## async/awaitの使い方
- awaitでPromiseの完了を待つことが出来る。そのため、awaitの後続処理を同期的に処理を記述できる。またawaitはasync functionからだけ呼ぶことが出来る。

```JS
// Promiseを作成
function testFunc(num, cb) {
    return new Promise((resolve, reject) => {
        return cb(resolve, reject, num);
    });
}

// 非同期処理
function target(resolve, reject, num) {
    return setTimeout(() => {
        try {
            if (num) {
                return resolve(num + num);
            }
            return reject('error!!!!!!');
        } catch(err) {
            return reject(err);
        }
    }, 100);
}

// 非同期処理の結果を用いた処理（async/await）
async function testAsync() {
    try {
        const a1 = await testFunc(1, target); // => 1 + 1
        const a2 = await testFunc(a1, target); // => 2 + 2
        const a3 = await testFunc(a2, target); // => 4 + 4
        return console.log(a3); // => 8
    } catch(err) {
        return console.error(`error: ${err}`);
    }
}

// async関数の実行
testAsync().catch(
    err => console.error(`error: ${err}`)
); // => 8

```
Rspec 3.6 | インスタンスのモック

# モックの生成

```rb
instance = instance_double('TestClass', some_method: 'return message!')

instance.some_method # "return message!"
```

# クラスに特定の引数を与えた時のインスタンスをモックする

## Class

```rb
class SomeClass
  def some_method
    "original message!"
  end
end

SomeClass.new.some_method
# => "original message!"
```

## Rspec

元の呼び出しは `NoMethodError` になってしまうようだ。

```rb
allow(SomeClass)
  .to receive(:new)
  .with(:specified_arg)
  .and_return instance_double('TestSomeClass', some_method: 'mocked message!')

SomeClass.new(:specified_arg).some_method
# "mocked message!"

SomeClass.new.some_method
# "NoMethodError: undefined method `some_method'"
```


# 環境

- rspec (3.6.0)
- rspec-mocks (3.6.0)

# 参考

https://relishapp.com/rspec/rspec-mocks/docs








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows > コマンドプロンプト > 700個のtest.exeプロセスをKillする > taskkill /IM test.exe /F

```txt:動作環境
Windows 10 Pro (64bit) Creators Update適用済
```

間違ってtest.exeを700個起動してしまった場合。

コマンドプロンプトで切るには。

参考: http://tweaks.com/windows/39559/kill-processes-from-command-prompt/

以下を実行してみた。

```
taskkill /IM test.exe /F
```

```txt:run
成功: プロセス "test.exe" (PID XXXX)は強制終了されました。
成功: プロセス "test.exe" (PID XXXX)は強制終了されました。
成功: プロセス "test.exe" (PID XXXX)は強制終了されました。
...
成功: プロセス "test.exe" (PID XXXX)は強制終了されました。
```
[RaspberryPi] Model 2から３に

忘れていたModel 3のRaspberry Piをあけました。


![IMG_5154.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/9addc23c-a8df-e9b3-f536-3b3fe0816266.jpeg)

# RASPBIAN(OS) インストール
 
[Download NOOBS] (https://www.raspberrypi.org/downloads/noobs/)
[Download Raspbian](https://www.raspberrypi.org/downloads/raspbian/)

### SD CARD 

1. 8GB 以上の SD CARDを準備。
2. 私の場合はNOOBSをダウンロードして解壓縮。
3. そのままＳＤCARDにCOPY。
4. RASPBERRY PIに取り付け。

### INTERFACE 

1. USB キーボード.
2. USB マウス.
3. HDMI ケーブル
4. モニター

 

# 日本語のFontのインストール。

### Update 

```
~$ sudo apt-get update
```

### Font 探し。

```
~$ sudo apt-cache search japan
```

### 欲しいFontインストール

私の場合はnoto-cjkにしました。

```
~$ sudo apt-get fonts-noto-cjk
```
safeAreaInsets.top と status bar のメモ

safeAreaInsets.top と status bar のメモ

| OS      |  Device           | AppDelegate?.window?<br>.safeAreaInsets.top | UIApplication.shared<br>.statusBarFrame |
|:--------|:-----------------:|:--------------:|:-------------------------:|
| iOS10   | iPhone7 Plus Port | - 取得できない - | (0.0, 0.0, 414.0, 20.0)   |
| iOS10   | iPhone7 Plus Land | - 取得できない - | (0.0, 0.0, 0.0, 0.0)      |
| iOS10   | iPad Port         | - 取得できない - | (0.0, 0.0, 768.0, 20.0)   |
| iOS10   | iPad Land         | - 取得できない - | (0.0, 0.0, 1024.0, 20.0)  |
| iOS11   | iPhone6 Plus Port | 0.0            | (0.0, 0.0, 414.0, 20.0)   |
| iOS11   | iPhone6 Plus Land | 0.0            | (0.0, 0.0, 0.0, 0.0)      |
| iOS11   | iPhoneX Sum Port  | 44.0           | (0.0, 0.0, 375.0, 44.0)   |
| iOS11   | iPhoneX Sum Land  | 0.0            | (0.0, 0.0, 0.0, 0.0)      |
| iOS11   | iPad Port         | 0.0            | (0.0, 0.0, 768.0, 20.0)   |
| iOS11   | iPad Land         | 0.0            | (0.0, 0.0, 1024.0, 20.0)  |


XだけsafeAreaInsetsが設定されている。
変にsafeAreaLayoutGuideとか使わず親Viewに対してstatusBarFrame.heightでオリジナルトーストの位置を調整。

こんな感じのグローバル変数作って制約設定時に利用。

```swift
///
/// Safe Area Insets
///
var SAFE: UIEdgeInsets {
    get {
        if #available(iOS 11.0, *) {
            if let insets = AppDelegate?.window?.safeAreaInsets {
                return insets
            }
        }
        return UIEdgeInsets.zero
    }
}
```
[Survey] Kaggle - Santander 9位解法まとめ

Kaggle - Santander Product Recommendation[^1]の9位解法[^2]の調査記事です．

Title: #9 solution
Author: raddar
Kaggle Discussion: https://www.kaggle.com/c/santander-product-recommendation/discussion/26809


## モデル

Panos氏のLB score結果から上位15の製品を抽出し，以下の3つのモデルを適用．

1. 特徴量lag1〜lag12を用いて，2016年1月以降の上記15製品に対してmloglossでモデルを構築
2. 特徴量lag1〜lag5を用いて，2015/06/18〜2015/12/28での"cco"製品用の別モデルを構築
3. 特徴量lag1〜lag5を用いて，2015/06/18〜2015/07/17での"reca"モデル用の別モデルを構築

ここでlagXは2016/01/28を観測日とすると

lag1: 2015/12/28〜一ヶ月間の製品の価値
lag2: 2015/11/28〜一ヶ月間の製品の価値
...
lag12: 2015/01/28〜一ヶ月間の製品の価値

で全製品に対して計算している．

## 工夫

- ccoとrecaモデルはそれぞれccoとreca製品に対する最大尤度を取ることで，最初のモデルと組み合わせた．
- ccoとreca製品に対するロジット変換でのキャリブレーションが効いた．
- 製品以外の特徴量(rentaとageを除く)は性能改善に無関係(上記情報のみで95%以上の性能を出している)

## References

[^1]: Kaggle, [Santander Product Recommendation](https://www.kaggle.com/c/santander-product-recommendation).
[^2]: raddar, [#9 solution](https://www.kaggle.com/c/santander-product-recommendation/discussion/26809).
解決擁有單一 Parcelable 參數的建構子和 Parcel 用建構子同時存在時導致無法判定該使用哪個的問題

## 背景

我有個 Parcelable 型別，他的建構子有一個有擴充 Parcelable 的參數，像是這樣：

```kotlin:Product.kt
// package 略
// import 略

data class Product(val id: String, val name: String): Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString(),
            parcel.readString())

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(id)
        parcel.writeString(name)
    }

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<Product> {
        override fun createFromParcel(parcel: Parcel): Product = Product(parcel)
        override fun newArray(size: Int): Array<Product?> = arrayOfNulls(size)
    }
}
```

```kotlin:Presenter.kt
// package 略
// import 略

class Presenter(val product: Product): Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readParcelable(Product::class.java.classLoader))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeParcelable(product, flags)
    }

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<Presenter> {
        override fun createFromParcel(parcel: Parcel): Presenter = Presenter(parcel)
        override fun newArray(size: Int): Array<Presenter?> = arrayOfNulls(size)
    }
}
```

## 無法判定該使用哪個建構子

這時候出現在這個地方

```kotlin
constructor(parcel: Parcel) : this(
        parcel.readParcelable(Product::class.java.classLoader))
```

出了一個錯誤：

```
Overload resolution ambiguity. All these functions match.
- public constructor Presenter(parcel: Parcel) defined in my.package.Presenter
- public constructor Presenter(product: Product) defined in my.package.Presenter
```

原因是 Product 的物件要放進來，因為他本身也是 Parcelable ，所以在這兩個建構子都可以使用的情形之下，導致 IDE 發出錯誤訊息說他不知道該用哪一個建構子。

## 解決方法 - Named Arguments

當在使用 Kotlin 的函式的時候，可以在前面加上參數的名稱，增加呼叫時的可讀性
所以在這個時候，只要指定說，我是要用 `Product` 的那個建構子即可。

所以那段程式碼可以這樣改：

```kotlin
constructor(parcel: Parcel) : this(
        product = parcel.readParcelable(Product::class.java.classLoader))
```

這樣子就可以解決錯誤提醒並正常運行了！

## 參考

- [Named Arguments](https://kotlinlang.org/docs/reference/functions.html#named-arguments) (官方)