OmniAICreator/Qiita-1.07M huggingface dataset:
Mysql ODBC(32bit)をWindows8.1(64bit)に入れる


# はじめに
windows8.1(64bit版)にのMySQL ODBC(32bit版)入れても、
システムDSNへの追加でエラーになり、使えなかった。
なんかレジストリへの登録が失敗してるっぽい。

## 前提
- windows7以降の64bit版OS(たぶん)
- MySQLのODBCの32bit版
- VisualC++2013の再配布パッケージ導入済み

### 今回の例
- windows8.1Pro 64bit
- MySQL Connector ODBC 5.3 32bit

## 参考URL
- [MySQL用 Connector-ODBC を Ms ODBCデーターソースアドミニストレーター が認識してくれない - マイクロソフト コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/all/mysql%E7%94%A8-connector-odbc-%E3%82%92-ms/dd933dcc-523c-4b8b-aed9-f13d97bb7f9b)
    - 現象、及び解決方法が詳細に書いてある
- [ODBCデータソースを削除できません。](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/520f9478-aa76-4a11-8183-517b1412807b/cannot-remove-odbc-data-source?forum=sqldataaccess)
    - 消去不可のODBCを作ってしまった時に、せめて「ODBC データ ソース (32 ビット)」のタブ「ドライバー」から存在を消去したい時に読んだ
- [Using the ODBC Installer Command-Line Tools](http://gemfirexd.docs.pivotal.io/1.0.0/userguide/developers_guide/topics/odbc/using_odbc_installer_tool.html)
    - コマンドミスった時に、コマンドからODBCの登録を削除したい時に読んだ

# 手順
- MySQLのODBC(32bit版)のインストーラーをダウンロードしてインストールする。
- `C:\Program Files (x86)\MySQL\`以下に`Connector ODBC 5.3`のフォルダが出来上がる。
- 上記のODBCフォルダをコピーしてどっかに残す。
- インストーラーを再度起動し、removeを選択して無かった事にする。
    - ※これやらずに以下にあるコマンド打つと、変更・消去不可の(空の)ODBC設定が登録されてやべーことになる。
- コピーしといたODBCフォルダを`C:\Program Files (x86)\MySQL\`以下に置く。
- コマンド打つ。
- ＯＫ！

```:コマンドプロンプト
"C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc-installer" -d -a -n "MySQL ODBC 5.3 ANSI Driver" -t "DRIVER=C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5a.dll;SETUP=C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5S.dll"

"C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc-installer" -d -a -n "MySQL ODBC 5.3 Unicode Driver" -t "DRIVER=C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5w.dll;SETUP=C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5S.dll"
```

※`5.3`や`myodbc5`等のバージョン部分は適宜変える。あとインストールフォルダとかも。

## ミスった場合
上記のコマンドでバージョンとかインストール場所とかをtypoした場合、
以下のコマンドでODBCドライバーのレジストリ設定を削除可能。

```:コマンドプロンプト
"C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc-installer" -d -r -n "MySQL ODBC 5.3 ANSI Driver"

"C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc-installer" -d -r -n "MySQL ODBC 5.3 Unicode Driver"
```

※`5.3`や`myodbc5`等のバージョン部分は適宜変える。あとインストールフォルダとかも。
はてなブックマークの特定のキーワードをRSSで読む方法

#はてなブックマークの特定のキーワードをRSSで読む方法
メーラーを変えてやり方を忘れていたのでメモ
①はてなブックマークで気になるキーワードを探す
http://b.hatena.ne.jp/search/text?q=arduino&sort=recent&users=3&safe=on
②上記URLの最後に「&mode=rss」をつける
http://b.hatena.ne.jp/search/text?q=python&sort=recent&users=3&safe=on&mode=rss
③このURLをRSSリーダーに登録する

これで特定のキーワードを含む新着はてなブックマークをRSSで読めるようになる。
Amazon Linux 2 のbashでリダイレクト先が補完されなくなった

# 困ったこと
```bash
# test.sh を実行し、標準出力／エラー出力を log/test.log に書き出す
$ sh test.sh >& log/test.log
```
このとき、`log/`を打とうとすると、補完されなかった。これまでは出来たのに。。と思って調べると以下の通り。
- Amazon Linux 2 では補完されない
- Amazon Linux (1) では補完される
- RHEL7 では補完される

# bash_completion が原因？
- `rpm -qi bash_completion` で調べると、Amazon Linux 2にだけ入っている。
- `/usr/share/bash-completion/bash_completion` をrenameして再ログインすると、補完された。
- （が、当然bash-completionをもって機能する補完も使えなくなる）
- これまでの感じに戻したければこれでOK

# より前向きな解決
`>&`ではなく`&>`を使おう

```bash
$ sh test.sh &> log/test.log
```
http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html
「標準出力と標準エラー出力のリダイレクト」の項
意味は同じだが、`&>`の方が推奨とされている。
これであればbash-completionが効いたままでもOK

# ぼやき
（この辺て困ることでも無いと、使い始めた時点の知識からなかなかアップデートされないのでおじさんたちは注意しよう）
LaravelからSlackのメッセージを改行させる

文字列をダブルクォートで囲って改行文字を使うと改行されます。

```php
<?php

use Illuminate\Notifications\Messages\SlackMessage;

class CustomSlackMessage extends SlackMessage
{
    public function __construct() {
        $this->content = "1行目\n"
            . "2行目\n"
            . "3行目";
    }
}

```

ちなみにシングルクォートだと改行されません。

ソースはgithubのコメント https://github.com/cleentfaar/slack/issues/21 から
SurfaceProタイプキーボードで日本語入力するお話


SurfacePro向けの日本語タイプキーボードを買ったのに、英語キーボードとして認識されてしまう問題に対処するためのメモです。
※レジストリを編集するので、あくまで自己判断でお試し下さい。

### 1.レジストリエディタを開く
[Win]+Rキーでファイル名を指定して実行ウィンドウを開き、「regedit」と入力。
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/1ac2cb93-dfc2-6053-0b98-eb3ef01c2938.png" width=50% />

### 2.下記の項目に移動
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/66701b0f-ec92-1dec-3cdb-5b71e1071136.png" width=70% />

### 3.レジストリの新規作成
レジストリを新たに作成します。既にある場合は、作成不要です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/ef65b711-2913-e258-4f91-de4fba743f40.png" width=70% />

エディタ白い箇所を右クリックし新規作成メニューを開き、
下記の名前で、文字列値タイプのレジストリを作成する。
- LayerDriver JPN
- OverrideKeyboardIdentifier

下記の名前で、DWORD(32ビット)値タイプのレジストリを作成する。
- OverrideKeyboardSubtype
- OverrideKeyboardType

### 4.値の入力または編集
先程作成した各レジストリをダブルクリックし、値のデータを入力、編集する。

- LayerDriver JPN に 「kbd106.dll」
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/c99d48ae-cf38-7ed2-1da8-c83938f1fbea.png" width=70% />

- OverrideKeyboardIdentifier に 「PCAT_106KEY」
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/17067013-a554-07e3-0d44-0dd9c11f331d.png" width=70% />

- OverrideKeyboardSubtype に 「2」
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/2e56b332-70e6-d09b-bd76-8728d7367e19.png" width=70% />

- OverrideKeyboardType に 「7」
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/46122263-baae-b3b9-cd8c-17b063834fa9.png" width=70% />

### 5.Windowsを再起動
日本語入力ができるようになったかご確認ください。
作業は以上となります。

## 参考
[Surface Proのタイプカバーが英語配列になってしまう場合の対処 | 闘うサンデープログラマー](http://windows-podcast.com/sundayprogrammer/archives/1277)
nodeでgoogle spreadsheetから値を取得する。

# 公式チュートリアルする
https://developers.google.com/sheets/api/quickstart/nodejs?hl=ja

https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit#gid=0
ここの値を取得するテスト。

## Step 1: Turn on the Google Sheets API
credentials.jsonをダウンロードしておく
自身の持っているgoogleアカウントの認証情報を取得

## Step 2: Install the client library

ライブラリを追加する

```
npm install googleapis@27 --save
```

## Step 3: Set up the sample
Sampleコードをコピペする
sheets/quickstart/index.js


## Step 4: Run the sample
``` 
node .
```

途中で
> Authorize this app by visiting this url: https://accounts.google.com/o/oauth2/v2/auth?acce....

と聞かれる。


そのURLをクリックすると、Quickstartアプリへ、Googleスプレットシート表示権限が与えられる。
どういうことじゃ？
許可をクリックすると、トークンが表示される。
トークンを入力すると、spreadsheetの値が表示される。


# 自身の作ったSpreadsheetを参照する
spreadsheet_idとシート名を自身のspreadsheetに変えれば、動作する。

# Spreadsheetの値を更新する

```hoge.ts
  var values = [["value1", "value2", "value3"]];
  var body = {
    values: values
  };
  var request = {
    spreadsheetId: "xxxxxxxxxxxx", 
    range: "シート1!B3:D3",
    valueInputOption: "USER_ENTERED",
    resource: body
  };
  const sheets = google.sheets({ version: "v4", auth: oAuth2Client });
  const res = await new Promise((resolve, reject) => {
    sheets.spreadsheets.values.update(request, (err, res) => {
      err ? reject(err) : resolve(res);
    });
  });
```
macでバックスラッシュ「\」を入力する方法

#Macでバックスラッシュを入力する方法

##バックスラッシュとは
「 \ 」 ⇦これの事です！


##入力の仕方
「option」キー　+ 「¥」マーク


これでバックスラッシュが出てきたはずです！yay!
[Ruby] 配列、eachメソッド

# eachメソッド
今回は配列内に共通の処理を行うときに使うeachメソッドを説明していきたいと思います。

```配列.rb
example = ["ゆーいち", 25, "エンジニア"]
```
例えばこのような配列があったとします。配列内の一つの要素を取り出す場合は**example[0]**のように番号を指定してあげるのでした。
もしここら辺がわからないという場合は[こちら](https://qiita.com/yuichir43705457/items/7f2b6767376750a87209)をご確認ください。

今回は配列内全てに対して処理を行います。

## eachメソッドの定義
それでは配列内の全ての要素を順番に取り出し表示するという処理を書いていきます。

```配列.rb
example = ["ゆーいち", 25, "エンジニア"]

example.each do |ex|
  puts ex
end
# =>ゆーいち
　　#25
  # エンジニア
```

これで配列内から要素を順番に取り出しそれぞれに対してputsという処理をする事ができました。

まず定義の仕方としては
**配列名.each do |変数|
　　処理
　end　**
このように定義します。
このとき変数名はなんでも構いません。
言い方を変えるとこの処理は、**配列内の０番目の要素を取り出し変数にその要素が代入され処理をする。次に1番目の要素を...
この作業を配列内に要素がなくなるまで繰り返す**と言ったほうがわかりやすいかもしれません。

配列内に処理をする要素がなくなった時点で終了します。

上の例でいうと、まず0番目の要素である"ゆーいち"が変数exに代入され**ex = "ゆーいち"**の関係になりputs exなので"ゆーいち"が表示されます。次に**25**が取り出され...と言った感じですね。


## each_with_indexメソッド
少し発展的なものとしてeach_with_indexメソッドも紹介していきます。
eachメソッドと処理の仕方は変わりませんがこのメソッドは取り出した要素の番号をつける事ができます。
例えば上の例で
　　[0]ゆーいち
　　[1]25
　　[2]エンジニア
と出力したい場合

```配列.rb
example = ["ゆーいち", 25, "エンジニア"]

example.each_with_index do |ex, index|
  puts "[#{index}]#{ex}"
end
# =>[0]ゆーいち
　　#[1]25
  # [2]エンジニア
```

これで出力できました。変わったところは変数が一つ増えていますね一つ目の変数には配列内の要素が、二つ目には0から始まる番号を定義しています。


## 最後に
今回はeachメソッドについて説明していきました。例では要素が3つしかなかったので簡単でしたが、多くの要素を持っている配列だと一つ一つ取り出して行くのは無理がありますね。そういったときにeachメソッドを使いましょう。

最後まで読んでいただきありがとうございました。
RedmineとSlackの連携の方法

# きっかけ
最近はSlackが結構増えてきて、メールで通知受けてると見逃しそうでヤダ。
見るものを極力Slackに集約したい。

そんな中で、Redmineの通知をSlackに渡す簡単な方法を探していた。

## 前提
* Redmineのサーバをいじる権限はないけど、管理者権限は持ってる
* Slackは無料版のまま使っている
* Slackの管理者権限は持ってる。

サーバ触れるか有料版Slackであれば、もうちょっとやりようはあったなぁ。

# 2019/3末を以って、IFTTTでGmailが使えなくなる
ネットで探して結構多かった手段として、
1. Redmineに通知用ユーザ追加(Gmail)
2. IFTTTにGmailアカウントで参加して、Gmailサービス＋Slackサービスの設定
が多かったように思う。

**しかし、**2019/3末を以って、IFTTTでGmailが使えなくなるってよ。

Σ(ﾟДﾟ)

ということで、方針を変更。

# 実践

## 設計
1. Redmineに通知用ユーザ追加(Gmail)
2. IFTTTにGmailアカウントで参加して、メールサービス＋Slackサービスの設定
3. Gmailから自動でIFTTTにメール転送するGASを作る

٩( ''ω'' )و


## ポイントだけ解説
まぁ、設計を見れば「そうだよね」ってなる人は細かいこと要らないよね。

なので、ポイントだけ・・・

### IFTTTにサインアップするメールアドレスは通知用Gmailで！
IFTTTの仕組みを微妙に分かっていなかったところとして、メールサービスって「サインアップしたメールアドレスからの受信」だったんだ。

なので、IFTTTにアカウントを作るときは作成したGmailアカウントで。

### SlackとIFTTTの連携はメールアドレスは通知用Gmailで！
まぁ、言わずもがなかな。
SlackでAppの追加でIFTTTを追加するわけだけど、その時にIFTTTログインを求められる。
もちろんその時に通知用Gmailのアカウントでログインしなければならない。

### GASのスクリプトはこんな感じ

通知用GmailのGoogleDriveで、新規のGoogle Apps Script（最初期は「その他」→「アプリの追加」が必要）を作成。

```
// XXXXXXXXXXXXXXXXXXXXはフィルタする件名
var FindSubject = 'subject:(XXXXXXXXXXXXXXXXXXXX) label:inbox -in:starred';
 
function getMail(){
 
  //指定した件名のスレッドを検索して取得 
  var myThreads = GmailApp.search(FindSubject, 0, 10); 
  //スレッドからメールを取得し二次元配列に格納
  var myMessages = GmailApp.getMessagesForThreads(myThreads);
  
 
  for(var i in myMessages){
    for(var j in myMessages[i]){  
      var strSubject　=　'#DrSmile ' + myMessages[i][j].getSubject();
      var strMessage　=　myMessages[i][j].getPlainBody().slice(0, 200);
      strMessage += AutoLink(myMessages[i][j].getBody());
      Logger.log(strMessage);
      sendMail(strSubject,strMessage);
      
      //処理済みのメッセージをスターをつける
      myMessages[i][j].star(); 
    }
  }
}

// チケットのリンク抽出
function AutoLink(str) {
    var regexp_url = /((h?)(ttps?:\/\/[a-zA-Z0-9.\-_@:/~?%&;=+#',()*!]+))/g; // ']))/;
    var regexp_makeLink = function(all, url, h, href) {
        return '<a href="h' + href + '">' + url + '</a>';
    }
    link = '\n\n' + str.match(regexp_url)[0]
    // タグで埋め込む場合
    //link = link.replcace(regexp_url, regexp_makeLink)
    return link;
}

// メール送信
function sendMail(strSubject,strMessage){
  var to_address = 'trigger@applet.ifttt.com';
  var mail_subject = strSubject;
  var mail_body = strMessage;
  
  MailApp.sendEmail(to_address,mail_subject,mail_body);

}
```

微妙に小一時間格闘した。

* FindSubject でフィルタ条件がなかなかツラかった（なかなか原因に気が付かず。。）
  * 検索する対象はスレッドなわけだが、そうすると送信側も抽出対象になる→ `label:inbox` が無いと無限ループ

これをスケジュール実行を設定する。

* メニューから「編集」「現在のプロジェクトのトリガー」
  * 途中SSL認証で怪しい画面が出る　→　「表示する」でそのまま設定

# 最後に
10分でできるかなーが、GASのせいで1時間かかった。。
あと、昔は絶対顔文字使わなかったのに、最近めっちゃ使う自分に驚く。
シェルスクリプトで日本時間のYYYYMMDDを返す

実行環境に依存せずに、任意のタイムゾーンでの「今日の YYYYMMDD」を取得したい。

```bash
# 1. 今日の UNIX時刻(=UTCでの経過時間(秒)) を取得
unix_today=$(date +'%s')

# 2. タイムゾーンをズラす(+9:00 を秒に変換している)
unix_today=$((unix_today+32400))

# 3. YYYYMMDD に変換
jst_ymd_today=$(date '+%Y%m%d' --date "@$unix_today")

# 出力
echo $jst_ymd_today
```

## 出力

```bash
20190327
```

もっと短くかけないもんですかねえ。

## 追記

コメントで教えてもらいました。

```bash
# JST で今日の YYYYMMDD を得る
jst_ymd_today=$(TZ=UTC-9 date '+%Y%m%d')

# 出力
echo $jst_ymd_today
```
WinActor 変数を設定ファイル化まとめ

後でやればいいや
→いつまでもやらないのでまとめ

基本的にフォーラムの通り
https://winactor.com/questions/question/%e5%a4%89%e6%95%b0%e3%81%ae%e5%88%9d%e6%9c%9f%e5%80%a4%e3%82%92%e3%80%81%e5%a4%96%e9%83%a8%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%8b%e3%82%89%e5%8f%96%e5%97%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/

わかりやすいようにメモ

##1.変数を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/fcd278a4-0a56-eaae-b14e-3007be571f93.png)
##2.CSVを生成
雛型ファイル作成を押して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/34d60de2-9974-4d01-925d-459de12d5d77.png)
変数の一覧と中身が記入されたCSVを作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/816793f2-2c13-3869-948a-e18c90310ff6.png)

多分おすすめは
・シナリオファイルの置き場所にシナリオファイル名.csvに生成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/88d10325-3429-78e1-db0d-e0adec30efd3.png)

拡張子を指定しないとxlsxで作成される。
テキストで編集できるのでCSVにした。
~~csv指定で作成してもエクセル対策済みのcsvなので
よくあるエクセルでCSVを編集しても問題は少ない。~~
と思ったけど読めるけど上書きするとTrue→TRUEとかがあるので注意
""も上書きで消える。

ただテキストエディタだと列が合わなくて正直書き換え


[xlsxにしない理由]
・csvはtextエディタがあれば書き換えられるがxlsxはofficeが必要

##3.シナリオにCSVから変数へ適応するアクションを追加する
ライブラリ
→ NTTAT_vX.X.X
→ 03_変数
→ 01_csvファイル読み込み
→ csvファイル→変数値.ums5
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/b329b24a-0ea3-24d6-3dcf-43c0ef1c2741.png)

##4.アクションの設定
エクスポートしたcsvを使うならcsvファイル名と行数は以下になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345260/d9af0862-e10b-5738-ded6-46e2369b3242.png)

##備考
絶対パスがいらないのでシナリオファイルと一緒に配布出来てよい。

そもそも論で機能実行版で変数書き換えられるようにすればこの作業無用だし、
シナリオファイル一つで簡潔になるからWinActorが変わってくれないかなという淡い思い。
プロキシでの User-Agent の変更

# はじめに

[BurpSuite](https://portswigger.net/burp), [ZAP](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project), [Fiddler](https://www.telerik.com/fiddler) は、デバグ/セキュリティ診断で使われている

稀にUser-Agent毎に診断してくれ。という案件もあるので、User-Agentの変更方法

# User-Agent の変更

## Webブラウザでやる

Webブラウザ(または、そのプラグイン)で設定してもいいだろう。

## BurpSuiteの場合

アーキテクチャ的には、HTTPリクエストヘッダの書き換えで行う。

![burpU.png](https://qiita-image-store.s3.amazonaws.com/0/182822/2b28a330-0035-d7e3-469a-c699613aaa27.png)

## ZAPの場合

アーキテクチャ的には、HTTPリクエストヘッダの書き換えで行う。

![zapU.png](https://qiita-image-store.s3.amazonaws.com/0/182822/c5597798-486b-267d-31d9-cd8d6d804948.png)

## Parosの場合

できなかったような記憶...

## Fiddlerの場合

「User-Agentを変更する」という独立したメニューがある。

![fiddlerU.png](https://qiita-image-store.s3.amazonaws.com/0/182822/9f58ab89-15c4-621a-bbb5-57dfd60fde27.png)

## sPortRedirector2 の場合

[自作(VB6+COM{VC++6/ATM})](http://rocketeer.dip.jp/sanaki/free/free68.htm)は、できなかった記憶。

## sPortRedirector2 の場合

[自作(C#/.NET4})](http://rocketeer.dip.jp/sanaki/free/free140.htm)は、HTTPリクエストヘッダの書き換えで行う。

![sWebToolU.png](https://qiita-image-store.s3.amazonaws.com/0/182822/fe6cc38c-8cfa-e799-f5c8-70ab3e19aed6.png)

# Index

[Indexへ戻る](https://qiita.com/tomoki0sanaki/items/258d6e77e4b16bc7d1c9)

# 以上
【Android】EditText でのアルファベット大文字制限、長さ制限

#EditText でのアルファベット大文字制限

Android アプリでの入力ボックスとして使われる EditText で、
アルファベット大文字のみの入力に制限したい！
iOS の場合は [【iOS】UITextField でのアルファベット大文字制限、長さ制限](https://qiita.com/a__i__r/items/2a0afcc6d95d17c1eb63) を参照してください。

# 環境
ホスト: Windows 10
Android Studio: 3.3.2
Java

# 属性の設定で行う場合
レイアウトを開き対象の UITextField を選択して 右ペインの属性:digits を開いて編集します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/2033d525-377a-3bc4-b884-f52ac00df32a.png)

```code
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
```

# 他の制約もまとめて適用する場合
フィルターの準備

```java:MyActivity.java
    // アルファベットフィルタ
    private  InputFilter alphabetFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                                   Spanned dest, int dstart, int dend) {
            if (source.toString().matches("^[a-zA-Z]+$")) {
                return source.toString().toUpperCase(Locale.ROOT);
            } else {
                return "";
            }
        }
    };
```

# EditText にフィルター設定
1. onCreate 関数内などで実装

```java:MyActivity.java
    InputFilter myFilters[] = {alphabetFilter, new InputFilter.LengthFilter(5)}; // 大文字＋アルファベットフィルタ＋長さフィルタ

    EditText targetEditText = findViewById(R.id.edittext_target);
    targetEditText.setFilters(myFilters);
```

# 実機テスト
キーボードにて数字入力ができない事、長さの制限がされていること、
小文字を入力した場合に大文字に自動変換されることを確認します。


以上、お疲れ様でした！
while文による繰り返し (Ruby)

####はじめに
初学者のアウトプット記事です。

#while文によるループ処理


プログラムを終了させず同じ処理をずっと繰り返すループ処理を行う方法はwhile文の条件式をtrueにしておくこと。これでwhileが繰り返すための条件が常に真となり、永遠にwhile内の処理が繰り返される。

```ruby
while true do    
    # 条件式がtrueになることでプログラムは終了せず繰り返し処理が行われる
    ## 処理
  end
```

しかしこれでは無限ループとなり、処理が終わることがない。ループの処理から抜けるためにはexitメソッドを呼び出す。
↓
↓

```ruby
while true do
    exit  # ここのexitでプログラムが終わる
    puts "こんにちは" # これは呼ばれない
  end

```
exitメソッドはプログラム自体を強制終了させるのでexitメソッド以降の処理は行われない。



```ruby
while true do
    input = gets.chomp         # ユーザーの入力をinputに代入
    if input == "exit"     # exitと入力されたら
      exit                     # exitメソッドによりプログラムを終了
    end
    puts "ループ中"
  end
```

これはexitと入力するまでずっと処理を続けるプログラム。whileの条件式をtrueにすることでexitを呼ぶまで同じ処理を行い続ける。




###１〜10まで順に足し合わせて出力するプログラム

```ruby
 
  number = 1        
  while number <= 10 do　#numberが10以下なら繰り返す
    puts number　　　　　　#number 出力
    number += 1　　　　　　#出力後numberに+1して繰り返し
  end
```







訂正修正ありましたらご指摘お願いします。
php-master-changes 2019-03-26

今日は interbase のバグ修正、extract() で SEGV が出る場合がある問題の修正、FTP ストリームへの再帰的な mkdir() が正しく動作しなかった問題の修正、ドキュメントの更新、FFI のパーサ再生成、組み込み Web サーバの Date ヘッダフォーマットが間違っていた問題の修正、PCRE で CLI でのキャッシュの扱い修正、内部 API zend_error_at の追加があった！

# 2019-03-26
## nikic: Fixed bug [#72175](https://bugs.php.net/bug.php?id=72175)
- https://github.com/php/php-src/commit/85095dfd0956bc09f5157211948c40cfa2859d27
- [7.2~]
- ext/interbase で、PHP7.x で複数接続が持てない問題の修正
- ext/interbase は長いことメンテナ不在でちょくちょく[公式バンドルから外す](https://externals.io/message/104871)話が出ている

## nikic: Fixed bug [#77793](https://bugs.php.net/bug.php?id=77793)
- https://github.com/php/php-src/commit/e97577edde49e1f6e86219091b343f80b3b92e65
- [7.3~]
- extract() で SEGV が出る場合がある問題の修正
- 参照カウントの操作の問題だった

## vtemian: Fix bug [#77680](https://bugs.php.net/bug.php?id=77680): Correctly implement recursive mkdir on FTP stream
- https://github.com/php/php-src/commit/ec2ecb7e12b96f8f95af2885d173a0d46c88e190
- [7.2~]
- FTP ストリームへの再帰的な [mkdir()](https://www.php.net/manual/ja/function.mkdir.php) が正しく動作しなかった問題の修正

## derickr: Update README.RELEASE_PROCESS
- https://github.com/php/php-src/commit/af1be9c33e8208f739a411c8716c249dbbf103dd
- README.RELEASE_PROCESS で、リリースマネージャ向けのチェック項目を修正

## dstogov: Regenerate parser
- https://github.com/php/php-src/commit/164b7ec549402eecb18c95156c66974a9ac5ef0a
- [7.4~]
- ext/ffi で、パーサの再生成

## kelunik: Fix [#77794](https://bugs.php.net/bug.php?id=77794): Incorrect Date header format in built-in server
- https://github.com/php/php-src/commit/7f9872387e38a05b11ce233b4d142325d742c487
- sapi/cli で、組み込み Web サーバの Date ヘッダフォーマットが間違っていた問題の修正
- "GMT" と出さないとあかんところを "+0000" とか吐いてた
- [実際これで困るケースがあった](https://gist.github.com/theseer/dff2d65ac80df66afc0a4cca68f4030c)らしい

## petk: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/72a2ab39ba977d542fdc33109dead3a87ea9f2ab
- [7.2~]
- NEWS で、↑の追記

## petk: [ci skip] Join contributing and patches docs
- https://github.com/php/php-src/commit/886b2a22e98ae96497a27d581795debaf6407c5c
- [7.4~]
- CONTRIBUTING.md と README.SUBMITTING_PATCH をがっちゃんこした
- ルートディレクトリのファイルを減らす活動の一環かな

## nikic: Make PCRE cache per-request on CLI
- https://github.com/php/php-src/commit/a9b01b60d89506b4f661b7108836d217158e83a2
- [7.4~]
- ext/pcre で、CLI では persistent キャッシュではなく per-request キャッシュを使うよう修正
- これだと任意の文字列をキャッシュに使えるらしい、が、よく分かってない

## Hywan: Fix typos in the documentation
- https://github.com/php/php-src/commit/ece7fe60f5a476662a7a04d5a69c46975388cade
- コメントの typo の修正

## nikic: Add zend_error_at API that accepts a filename and lineno
- https://github.com/php/php-src/commit/0122f395c7dc5afb9feb3e2dcd11bb90e7433948
- [7.4~]
- zend_error_at API の追加
- opcache の preloading の警告とかに使えるらしい
参考リンク

https://developer.mozilla.org/ja/docs/Web

練習問題集
https://tech.pjin.jp/blog/category/programming/java/
https://paiza.hatenablog.com/entry/2017/05/23/初心者向け・Javaの練習問題をたくさん解ける学習サ


良質開発ブログ(最新の開発ブログ記事です。HTML, CSS, Git, SEO, ウェブに関する豆知識、
忘れやすいコマンド覚書など、なにかと役に立ちそうな事を、気ままに共有します。)
http://www-creators.com/archives

html,css,js(LIMST~TECH~の教材の参考にもなる)
https://cyllabus.jp/banana

web
https://www.muratayusuke.com/2015/09/03/for_biginner_engineers/
jupyternotebookで重回帰分析をした時に自分でデータを収集すると苦労しそうなところ

自分でデータを収集してjupyternotebook上で重回帰分析をしたのですが教科書や講座で用意された資料ではないため様々な苦労がありました。
まずはコマンドプロンプトで以下のコマンドを打つとブラウザが起動します。

```
jupyter notebook
```

僕はchrome使っているのでchromeが起動しました。
<br>
<br>
分析に必要なpandasをインポートして略称をpdに、numpyはnpに。matplotlibはpltにします。

```
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR
```
<br>
独自に作ったcsvを出力します。最初encodingを書かないで出力したら文字化けしました。

```
train = pd.read_csv("ベルマーレ観客動員数(2010-2017).csv", encoding="shift-jis")
test = pd.read_csv("ベルマーレ観客動員数(2018).csv", encoding="shift-jis")
sample = pd.read_csv("sample.csv", encoding="shift-jis")

```

<br>
encodingをutf-8にしたところ、こんなエラーが出ました。


```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 0: invalid start byte
```

最終的にはutf-8で使いたいんですけど仕方がないのでencoding="shift-jis"に。
ここら辺の文字形式の変換は今後大いに学ぶ必要性があると感じています。
<br>

以下のように書くことでtrainに代入されたベルマーレ観客動員数(2010-2017).csvのカラムである観客動員数を導き出したいというように定義します。

```
y = train["観客動員数"]
```
<br>
質的データは重回帰分析では使えないのでダミー変数を使うことで量的なデータに置き換えます。

```
pd.get_dummies(train[["home","away","stadium","weather"]])
```
<br>

もしも欠損値があった場合0に置き換えます。欠損値があると重回帰分析は出来ません。

```
trainX = trainX.fillna(0)
```
<br>
回帰モデルの箱を用意します。

```
model = LR()
```
<br>

重回帰モデルを作ります。

```
model.fit(trainX, y)
```
trainXには分析で使用する説明変数が、yには目的変数が代入されています。
trainXのデータを使用して、yである観客動員数を予測するモデルを作る。
という言い方がよいですかね。
<br>
続いてtestの方もこんな感じで書き換えます。

```
testX = pd.get_dummies(test[["相手チーム","曜日","天気","降水量","スター", "開幕戦", "産能大スペシャルデー"]])
testX = testX.fillna(0)
```
testは実際に分析したい年度のデータ。
<br>
それより前の年度を利用して以下のようにモデルは作ってあるので

```
model.fit(trainX, y)
```
<br>

変数 = model.predict(実際に分析したい年度のデータ)のように書くと実際に分析したいデータで重回帰分析を行ってくれます。
なので以下のように書く。

```
pred = model.predict(testX)
```


<br>

えらーーーーーーーーーーーーーーーーーー！！！

```
ValueError: shapes (313,40) and (43,) not aligned: 40 (dim 1) != 43 (dim 0)
```

なんでこのようなエラーが出るのかというと。結論から言うとmodelで使うデータと実際に分析したいデータのカラム数が違うとこんな風にエラーが出るんですよ。
僕の場合分析に対戦チームの名前や試合をする曜日を使っていたんですが、昇格降格の影響でmodelで使ったデータにはいなかったチームが実際に分析するデータには存在していたり、modelでは水曜日に開催した日があったのに実際に分析するデータには存在しなかったり。
そんな理由でエラーが出たのです。
自分でデータを収集するとそういうエラーが出るんですね。

<br>
ちなみに僕は手作業でデータを消しましたが多分jupyter notebook上で削除したり別のデータを便利に結合することができると思います。
そこら辺は今後学んでいきたいですね。
<br>
エラーが出なくなったら以下でcsv出力できます。

```
 sample[1] = pred
 sample.to_csv("出力したい名前.csv",index=None, header=None)
```

<br>
以下余談。
どうやって分析するための説明変数を決めるのかというと、modelで使用した「ベルマーレ観客動員数(2010-2017).csv」を今回と同じ手順で分析しました。
その際に説明変数は色々変更を加えて。
それでいい値が出たものを実際に説明変数として使用するのです。
でも、ほかにもいろんな方法があるんだと思うのでそこも勉強したいですね。
HomebrewでPHP7.2をインストールする

# Homebrewのインストール

コマンドラインを開いて下記を実行する。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

実行できなければ、下記の公式ページを開いてコマンドを確認してください。
https://brew.sh/index_ja

# PHP7.2をインストール

```
$ brew search php72

==> Formulae
php@7.2
```

パッケージ名がわかったので、インストールを実行

```
$ brew install php@7.2
```

インストールが終わったらパスを通します

```
$ echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ php -v

PHP 7.2.16 (cli) (built: Mar 22 2019 08:49:28) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.16, Copyright (c) 1999-2018, by Zend Technologies

```

以上になります。
Java で Azure Bing SpellCheck を利用する

Java で Azure Bing SpellCheckを利用するには
・自前でHTTPリクエストを作成する
・Azure Java SDKを利用する
の二通りがありますが、SDK利用の方法メモです。
案外たどり着くのに時間がかかりました。

#Maven
こちらです。これが意外に見つからなかったです。
https://mvnrepository.com/artifact/com.microsoft.azure.cognitiveservices/azure-cognitiveservices-spellcheck/1.0.2

#Sample
こちらです。
https://github.com/Azure-Samples/cognitive-services-java-sdk-samples/blob/master/Language/BingSpellCheck/src/main/java/com/microsoft/azure/cognitiveservices/language/spellcheck/samples/BingSpellCheckSample.java

#できないこと
HTTPレスポンスのJSONをそのまま取得してファイルに保存しておき、キャッシュとして利用することでAPI呼び出しの回数を減らすということを考えていたのですが、本家SDKではレスポンスをそのまま取得するメソッドは実装されていないように見えます。そりゃソースコードを変えれば可能なのでしょうけれど。
bit と byte の語源

## bit

binary digit の略。
二進の数字、つまり二進数。

bi- は2を表す接頭辞。
bicycle とか、bilingual とか。


## byte

bite(噛む)をもじった造語。

情報を "ひと噛み" して、その塊を情報の基本単位としよう的な意味。

## 出典

プログラムはなぜ動くのか
サッドホロ「:-(」が出たあなたへ

### はじめに
* 会社で長い間未使用だったホロレンズを引受け起動したところ中央に「:-(」という記号が出て終了しました。
何度やっても同じ。よく見たらこれって顔文字？！サッドマックならぬサッドホロか！？とこの状況の対処を行いました。

### 結論
Windows Device Recovery Toolで復旧します。しかし、通常の手段では認識しないので回復モードで起動して認識させます。

* 回復モード：電源ボタンと音量(＋)ボタンを同時押しで起動

### 参考ページ
* Windows Device Recovery Toolを使用してHoloLensをリカバリーする
    * https://blog.hololab.co.jp/entry/2019/01/16/171916
* HoloLens RS5 InsiderPreview (Build 17720) にアップデートする
    * http://bluebirdofoz.hatenablog.com/entry/2018/07/25/084022
    * （回復モードでの起動方法が書いてある）

### まとめ
* アイコン作ろうよｗ
Portalsをさわってみた

## 背景

- [話題の Portals を使った画面遷移 UX の未来](https://blog.uskay.io/article/002-hands-on-portals)という記事を読んでPortalsを知りました
- 詳しいことは上記の記事に書いてありますが自分なりにさわってみた記録を書きます

## Portalsとは

- `<portal>`という新しいHTMLタグのことです
- `<iframe>`のように別のページを埋め込むことができます
- `<iframe>`と違うところは表示したページに遷移させることができる点です
- すでにページ上に埋め込まれているページに遷移するため高速に遷移することができます
- ただし`<iframe>`のように埋め込んだ中のページを操作することはできずプレビューのみといったイメージです

## 作ったもの

- 言葉だけだとよくわからないと思うのでデモアプリを載せます

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/35397bc9-f8e5-2999-c4d8-3dcd112cbd8a.gif)

- `mouseEnter`/`mouseLeave`でPortalsの表示/非表示を切り替えてクリック時に遷移するように実装してあります
- 普段使い慣れているのでReactで書いています
- コードあまりきれいではないですがリポジトリはこちらです
    - https://github.com/ozaki25/portal_demo
- デモアプリはこちらです
    - https://ozaki25.github.io/portal_demo/
- ※ChromeCanaryを引数付きで起動しないと動作しません
    - 上記ブログ記事より引用

    > 現状 Chrome Canary で Portal は試せます。起動フラグを付けて Canary を立ち上げてください。
    Mac: open -a Google\ Chrome\ Canary --args --enable-features=Portals
    Windows: ショートカットを右クリック、リンク先に --args -enable-features=Portals のオプションを付けて起動。
    Linux: Canary は Linux ではサポートされていません。代替として Chromium をご利用ください。

## Portalsの使い方

- デモアプリではややこしいことをしていますが単に使うだけであればとても簡単です
- 以下のファイルを作成してブラウザで開いてみて下さい
    - ※ChromeCanaryを引数付きで起動するのを忘れずに
- ①ページを表示するとQiitaのトップページが表示されます
- ②画面をクリックするとQiitaへ遷移します

```html:index.html
<portal src="https://qiita.com" style="height: 1000px; width: 1000px"></portal>
<script>
  const portal = document.querySelector('portal');
  portal.addEventListener('click', () => portal.activate());
</script>
```

![demo2.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/696ca0ea-e2d6-fb89-d27b-b6572cad11de.gif)



### ①ページを表示するとQiitaのトップページが表示される

- `<portal>`タグのsrc属性に表示したいURLを設定するだけで表示することができます
- 上のデモで表示/非表示を切り替えていたのはタグ自体を挿入したり削除したりしていただけです

### ②画面をクリックするとQiitaへ遷移する

- Portalsでページ遷移させるためにはJavaScriptによる操作が必須となります
- `<portal>`のDOMを取得し`.activate()`を実行するとPortal内に表示しているページに遷移することができます

## まとめ

- Portalsはiframeのようなものと冒頭で紹介しましたが、単に別のページを埋め込むだけでなく新たなUXの実現ができるような面白いタグだということがわかりました
- まだ一般的なブラウザでは動作しませんが実装はとても簡単なので今後が楽しみです
加圧シャツサイトのHTML

今はWordpressがあるため、初心者でもサイト制作は可能になりました。ツールを使うことと、自作タグ打ちのどちらが優れているか？

例えば表作成では付属のツールと自作では圧倒的に自作が優れている。Wordpressでサイト制作するタイプは、自作タグ打ちはしないことがおおいから不要なのでしょうか。

<a href="https://pressurize-shirt.com/pressure-compression-shits-recommend/" >加圧シャツの表作成の例</a>

サイトの中心は記事。SEOという専門の世界でも、画像や動画よりは文字を重視します。記事の内容が10とすれば、画像動画などの補助コンテンツは2か3程度でしょう。

HTMLでの画像はもちろんそのまま投稿というカタチが一般的。リサイズや圧縮加工というと、アプロードする前に加工します。

<a href="https://pressurize-shirt.com/posture-correction-stoop-kaatu/" >着圧と加圧の写真の使い方例</a>

画像に文字入れ、加工するのはプログラミングとは違います。フォトショップ、Windows付属のエディターでも十分。プロのような加工が好みなら有料ソフトを使用します。

WEBでのアクセスアップにはデザイン性も重要。しかしもっと重要視されているのがSEOという技術です。技術的にはプログラミングとは別世界。Googleという検索エンジンの仕様がすべて。

例えば動画埋め込みや写真を織り交ぜた頁があるとします。

<a href="https://pressurize-shirt.com/vidan-gohst-kaatushirts-reputation-review/" >ビダンザゴーストの口コミ体験談</a>

このようなWordpressサイトのプログラマーとしての評価は低いでしょう。SEOにおいては高い評価を受けられる。コーディングが拙いことよりもサイトに独自価値があるかないかです。このように求められる違いによって適切なサイト制作を行うことが理想とされます。

<a href="https://pressurize-shirt.com/kaatushirt-comparision-list-matome/" >比較一覧おすすめ表</a>のように網羅性や一覧性を出すことも必要とされます。コードよりはユーザーに見やすいレイアウトを出すこと。
RSpecでRedmineのsudoモードをテストする

```rb
# spec/support/time_helpers.rb
RSpec.configure do |config|
  # travel_toを使えるようにする
  # https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html#method-i-travel_to
  config.include ActiveSupport::Testing::TimeHelpers, type: :feature
end
```

```rb
RSpec.describe 'sudoモードが有効になっているとパスワードを入力しないと操作ができない', type: :feature do
  include ActiveSupport::Testing::TimeHelpers

  background do
    # sudoモードを有効にする
    allow(Redmine::SudoMode).to receive(:enabled?).and_return(true)
  end

  scenario '操作しようとしたらsudoモードの期限が切れていたのでパスワードを再入力して操作を完了する' do
    visit パスワードの再入力が求められるフォームがある_path
    fill_in 'パスワードの再入力が求められるフィールド', with: 'なにか'

    # Redmine::SudoMode.timeoutの値はデフォルトだと15分に設定されている。
    # そのため20分後に操作をしてパスワードの再入力が求められることを確認する。
    travel_to(20.minutes.from_now) do
      click_on '送信'
      expect(page).to have_content('この操作を続行するにはパスワードを入力してください')
      fill_in 'パスワード', with: 'password'
      click_on '送信'
    end

    expect(page).to have_content('操作が成功した際に表示されるであろう文言')
  end
end
```

## 参考

https://github.com/redmine/redmine/blob/f0d579adebfe3c5da93135fbaa3d9ec503d06855/test/integration/sudo_mode_test.rb#L9
https://github.com/redmine/redmine/blob/f0d579adebfe3c5da93135fbaa3d9ec503d06855/test/integration/sudo_mode_test.rb#L197-L200
NginxでSSLとロードバランサーの設定

#はじめに
Ruby on Railsのフロントウェブサーバとしてnginxを使用するときのSSLとロードバランサー（upstream）の設定について記述します。

ブラウザ --https--> nginx --http--> Ruby on Rails（unicorn,pumaなど）

#前提
OSはCentOS7を使用
SSL証明書はあらかじめ用意しておきます。

```
/etc/pki/tls/certs/server.crt
/etc/pki/tls/private/server.key
```

nginxのインストールはこちらを参考させていただきました。
> [CentOS7 に nginx導入](https://qiita.com/MuuKojima/items/afc0ad8309ba9c5ed5ee)

#nginxのインストール
上記の参考のとおり、yumでインストールしました。

###yum.repos.dの設定

```
$ sudo vi /etc/yum.repos.d/nginx.repo
...
```
###インストール

```
$ sudo yum install nginx
...
```

インストールしたnginxのバージョンは
nginx.x86_64 1:1.15.10-1.el7_4.ngx
です。

###nginxの起動と自動起動設定

systemctlで自動起動設定と起動します。

```
$ sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
$ sudo systemctl start nginx
$
```

#ここから本題
タイトルのとおり、SSLとロードバランサーの設定を行います。

```
$ sudo vi /etc/nginx/conf.d/ssl_lb.conf
---
upstream backend {
  server localhost:3000; #バックエンドプロセスは同じサーバ内で起動している前提、ポート3000
}

server {
  listen      443 ssl;
  server_name sample.co.jp;

  ssl_certificate     /etc/pki/tls/certs/server.crt;
  ssl_certificate_key /etc/pki/tls/private/server.key;

  root /path/to/root; #コンテンツのルートパスを設定

  location / {
    try_files $uri @backend;
  }

  location @backend {
    proxy_set_header Host              $http_host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://backend;
  }

}

```

### upstream
upstreamに振り分ける対象のサービスを記載します。（ロードバランサー）
複数記述することでロードバランスされます。
また、unix socket接続の記載も可能です。

### server
ssl_certificate、ssl_certificate_keyにSSL証明書のファイルを指定します。
upstreamで設定したbackendは"location @backend"に設定します。

### nginxの再起動

nginxを再起動することで上記の設定が反映されます。

```
$ sudo systemctl restart nginx
```
新人Webエンジニア - 死闘！Github　編

GitHub入門
https://qiita.com/ay3/items/8d758ebde41d256a32dc

git init

git clone

git remote add

git add path

git commit

git checkout 

git push origin hoge

不要なブランチを削除する方法
https://qiita.com/iorionda/items/c7e0aca399371068a9b8
Excel／VBAのNGパターン


## 名前の定義を使用している

##### 説明
- シートのコピーの際、エラーの原因になる。

##### 解決案
- 使わない。

## セルを結合している

##### 説明
- セルを結合すると、行単位（または列単位）の挿入やコピペができなくなる！

##### 解決案

- セルを結合しない
- セルの枠線を消すまたはセルの背景色を白色にする
- セルの罫線を消す
- セルの書式設定の、文字の横配置に「選択範囲で中央」を使う
- 見た目にこだわるならば、データ用のセルを用意し参照する

## 画像の挿入にPictures.Insertを使う

##### 説明
- Pictures.Insertで画像を挿入すると、リンクオブジェクトになってしまう！（別PCで開くと画像が表示されない！）
- 埋め込みオブジェクトになることを期待して使うが、リンクオブジェクトが作成される。
- マクロの記録機能を使用して図を挿入した場合は Pictures.Insert メソッドが使用されるため、これが誤用の原因だと思われる。

##### 解決案
- オブジェクトとして画像を挿入したい場合は、Shapes.Addを使う。
https://support.microsoft.com/ja-jp/help/2396509
[Memo] OpenCV3 + Tensorflow on Tinkerboard




```bash
# Use: 20181023-tinker-board-linaro-stretch-alip-v2.0.8.img.zip
#
# If you have apt-cacher-ng server
# echo 'Acquire::http::Proxy "http://apt-cache-server:3142";' | tee /etc/apt/apt.conf.d/02proxy

########
#Update packages except Chromium :-)
sudo sh -c 'apt-mark hold chromium && apt update && sudo apt upgrade -y'

##########
# Fix Cpu Freq : /boot/rk3288-miniarm.dtb
wget https://github.com/mt08xx/files/raw/master/TinkerOS-v2.0.8_CPUFreqFix_rk3288-miniarm.dtb.bz2 -O rk3288-miniarm.dtb.bz2
# Extract and make sure if it's correct
bzip2 -d rk3288-miniarm.dtb.bz2
md5sum rk3288-miniarm.dtb
# => ce70fbd5cf42cc3e4d9728612837887e  rk3288-miniarm.dtb

# backup and copy to /boot
sudo mv /boot/rk3288-miniarm.dtb{,.bak}
sudo cp ./rk3288-miniarm.dtb /boot

##########
sudo reboot
##########


##########
# Install OpenCV
wget http://ftp.us.debian.org/debian/pool/main/j/jasper/libjasper1_1.900.1-debian1-2.4+deb8u3_armhf.deb
sudo apt install ./libjasper1_1.900.1-debian1-2.4+deb8u3_armhf.deb
# 
OPENCV_DEB=libopencv3_3.4.5-20181227.1_armhf.deb
curl -SL https://github.com/mt08xx/files/raw/master/opencv-rpi/${OPENCV_DEB} -o ${OPENCV_DEB}
sudo apt autoremove -y libopencv{3,4} # when old one is installed
sudo apt install -y ./${OPENCV_DEB}


##########
# Install Tensorflow
# Using: https://github.com/lhelontra/tensorflow-on-arm/releases

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 ./get-pip.py

# Use piwheels
cat << EOF | sudo tee /etc/pip.conf
[global]
extra-index-url=https://www.piwheels.org/simple
EOF

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.13.1/tensorflow-1.13.1-cp35-none-linux_armv7l.whl
sudo pip3 --no-cache-dir install ./tensorflow-1.13.1-cp35-none-linux_armv7l.whl
```
Parallel 的ゾンビを殺した話

# TL; DR

v1.16.0 から、 parallel の gem 使ってるときに timeout とか使って親を殺しても、ちゃんと子供達も kill されるようになりました。

# 詳細

parallel の gem は、便利なんだけれども、親スレッドを kill してもその子供達は普通に活動し続ける。 thread であろうとも process であろうとも。

例:

```ruby
t = Thread.new do
  Parallel.map(0..1000, in_threads: 2) do |i|
    p i
    sleep 1
  end
end
sleep 1
t.kill
sleep
# 0 
# 1                                   
# 3                               
# 2                         
# 5
# 4
# => kill しているにも関わらず 1000 まで出力される。      
```

たとえば、悪名高い timeout と組み合わせるとこうなる。

```ruby
begin
  Timeout.timeout(1) do
    Parallel.map(0..1000, in_threads: 2) do |i|
      p i
      sleep 1
    end
  end
rescue Timeout::Error
  p :timeout
end
sleep
# 0
# 1
# 2
# 3
# :timeout
# 4
# 5
# 6
# 7
# 8
# => 1000 まで続く
```

これは、あんまりにもあれなので、 parallel 本家に以下の PR を出してマージしてもらった。

https://github.com/grosser/parallel/pull/248

これによって、 Timeout やら 親スレッドの kill やらが行われた時に、その子供のスレッドやプロセスについても正しく kill されるようになった。

```ruby
begin
  Timeout.timeout(1) do
    Parallel.map(0..1000, in_threads: 2) do |i|
      p i
      sleep 1
    end
  end
rescue Timeout::Error
  p :timeout
end
sleep
# 0
# 1
# 3
# :timeout
# 2
# => ここでとまる
```

~~Concurrent Ruby を使えよ、という話は若干ある~~
書いた記事のモチベーションと心がけていること

# 【数理最適化】シリーズを書きたい
## モチベーション
2018年に[OR系の研究室](http://infosys.sys.i.kyoto-u.ac.jp/)を卒業しました。
社会に出て、1年間色々やってきましたが、[OR学会の春季研究発表会](http://www.orsj.or.jp/~nc2019s/index.php/symposium/)に出たら、数理最適化がやりたいことに気づきました。とはいえ、知識は学部並で、研究室は確率・統計系だったので、ちょっと縁遠いです。なので、自分の進捗と、新しい仕事の確保を行うために、

- 基礎的な内容を紹介
- その例題演習

をシリーズとして書きたいとかんがえています！（あと、この手の仕事が降ってくるといいな）

2019/4/3 追記：書いていて思ったのですが、趣味の時間で書くとなるとどうしても、記事サイズが小さくなりがちだし、調べるための時間も少なくなりがちです。つまり記事として、ニーズに合った記事を書くのはとても難しい。なので、日々の気付きはシリーズとして、人の目どうこう、viewを増やすためにどうこうは考えず、ただ分かったことを書いていこうかと。集大成として、大きな記事を上げる、ということにしました。
後、タグの設定をちゃんとしてあげないとなぁと思った次第。このシリーズを何に位置付けるかによってそこが変わるので、もうちょっと書いてから考えていきたいと思います。

2019/4/11 追記：会社から許可が降りたので、Qittaに弊社の名前が（どこかの段階で）登場するはずです。Qittaに投稿するにあたってのルールづくりを現段階では考えています。また、タグとして、日々の学んだことのシリーズには`TodayILearned`を追加しました。`-tag:TodayILearned`でこれらの記事を除外できます。

# 【極値統計】シリーズを書きたい
## モチベーション
2018年に[OR系の研究室](http://infosys.sys.i.kyoto-u.ac.jp/)を卒業しました。
研究としてはそこで終わりでしたが、その研究の中で使っていた極値統計を大変気にいったので、なんとか仕事にしたいと思っています。とはいえ、確率分布のままでは仕事にならないので、どのように適用するかが課題で、ついては、

- 論文を読んで紹介する
- 実務への適用提案

をこのシリーズでは書いていきたいと思っています。

# 設計系の話をしたい
今就いているお仕事の関係上、プロトタイプを量産します。その際に、外注したり、内製したりするのですが、いずれにせよ、設計を書かなければなりません。その関連の話で知見が溜まってきたので、そろそろそれをアウトプットしたいなと考えています。
Electron-VueでVuetifyを使用した際に「[Vuetify] Multiple instances of Vue detected」が発生する時の対処法

Electron-VueにVuetifyを追加したときに、以下のようなErrorがconsoleに表示されました。
その対処法です。

![スクリーンショット 2019-03-27 6.15.05.png](https://qiita-image-store.s3.amazonaws.com/0/114396/b0ce3ba7-cd13-ffef-a468-2cd2c3818f3a.png)

# 対処法
https://github.com/vuetifyjs/vuetify/issues/4068 に記載の通り
webpack.renderer.config.jsのwhiteListedModulesの定義にvuetifｙを追加することで解消できます。

```diff:.electreon-vue/webpack.renderer.config.js
- let whiteListedModules = ['vue']
+ let whiteListedModules = ['vue', 'vuetify']
```
Xcodeの自動アップデート設定を無効にする方法

![AppStore.png](https://qiita-image-store.s3.amazonaws.com/0/95033/98cd8596-89e6-e0f6-66ef-2bd890e62e2e.png)


App StoreからダウンロードしたXcodeは自動アップデートの設定が有効になっています。

チームで開発をしている状況では、知らない間にXcodeのバージョンが揃わなくなり、
特定の人しかビルドできない...などといったトラブルの元になります。

![SS123.png](https://qiita-image-store.s3.amazonaws.com/0/95033/bf16af50-690b-4333-8860-9df8bb87ca51.png)

トラブルを避けるためにはDeveloperサイトの 
[Downloads > More downloads](https://developer.apple.com/download/all)からダウンロードしてください。
(最新版が目当てなら[Downloads > Applications](https://developer.apple.com/download/applications)でも可)

こちらからダウンロードしたXcodeには自動アップデートの設定が付いていません。
![more.png](https://qiita-image-store.s3.amazonaws.com/0/95033/97f8070a-6ab2-d4d6-2d24-ea79e4ed2969.png)



#自動アップデート無効化
1. Xcodeのアイコンを右クリックして「パッケージの内容を表示」を選択。
![package_no.png](https://qiita-image-store.s3.amazonaws.com/0/95033/82fb4646-1162-d4b5-6e3e-a315c68f6834.png)

2. Contentsの下にある「_MASReceipt」を削除。
![before.png](https://qiita-image-store.s3.amazonaws.com/0/95033/2e37486e-1a51-0def-662c-d607ff9024b3.png)

3. これでOKです。
![after.png](https://qiita-image-store.s3.amazonaws.com/0/95033/0cd3df56-f30a-6583-f834-1cfa365ebea8.png)


それでは新しいXcodeをお楽しみください！！
【Python】if 変数: の真偽値

pythonでは

```py
if 変数:
    処理
```
で変数のnullチェックが行える。

本記事は、None以外の値で誤動作を防ぐためのメモ。

サンプルコード

```
if hoge:
    print('True')
else:
    print('False')

```

のとき

```
Trueになるもの
hoge = True
hoge = 1
hoge = '0'
hoge = ' '
hoge = ['']
hoge = {''}

Falseになるもの
hoge = None
hoge = False
hoge = 0
hoge = ''
hoge = []
hoge = {}

```

### 公式ドキュメント該当箇所
[組み込み型 — Python 3.7.3 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#truth-value-testing)
FineReport+csvJDBCでcsv型のデータを可視化表示する

# 準備
csvJDBC：http://sourceforge.net/projects/csvjdbc/files/latest/download
FineReport：http://www.finereport.com/jp/products/trial/

# 利用する方法
## FineReportのインストール
https://www.youtube.com/watch?v=e68v-FwEe9g&list=PLIBA1Y7M1guWjmiQ2d_dFMefFxllFnEcV&index=1

## ドライバーのコピー
![企业微信截图_20190327034935.png](https://qiita-image-store.s3.amazonaws.com/0/350893/4f3e0ede-a3ca-1c1b-68ca-d7e5c9163502.png)

## テスト用のcsvファイルを作成
![企业微信截图_20190327040913.png](https://qiita-image-store.s3.amazonaws.com/0/350893/1c011056-db07-1d75-23fa-17a345292769.png)

## FineReportの使用
### ①データ接続定義
ドライバ：org.relique.jdbc.csv.CsvDriver
URL：jdbc:relique:csv://${ENV_HOME}/../csv
自分の実際状況より配置してください、上記の設定情報は相対パスで、絶対パスでも問題ありません。
![企业微信截图_20190327035447.png](https://qiita-image-store.s3.amazonaws.com/0/350893/cf566fe1-5263-2ef1-6a30-ddd9755ffc86.png)
![企业微信截图_20190327035711.png](https://qiita-image-store.s3.amazonaws.com/0/350893/9b704937-bc44-5e82-5c74-032c6f302b9d.png)

### ②データベースクエ作成
![企业微信截图_20190327041122.png](https://qiita-image-store.s3.amazonaws.com/0/350893/d80c8217-d328-2c1d-0b3a-2284912146ee.png)
![企业微信截图_20190327041429.png](https://qiita-image-store.s3.amazonaws.com/0/350893/e98c692d-e9c5-0d15-f83f-692acbe69603.png)
![企业微信截图_20190327041443.png](https://qiita-image-store.s3.amazonaws.com/0/350893/6dd3f768-47c3-d55a-f9ea-3657327dafc1.png)

### ③画面作成
![企业微信截图_20190327042018.png](https://qiita-image-store.s3.amazonaws.com/0/350893/e510bd5f-cae2-39cb-c0af-2064b11db26b.png)
![企业微信截图_20190327042053.png](https://qiita-image-store.s3.amazonaws.com/0/350893/75a94477-1ef4-2557-de74-b6494e4e9775.png)
![企业微信截图_20190327042121.png](https://qiita-image-store.s3.amazonaws.com/0/350893/697ffd84-9c19-6225-9486-31f024071189.png)

# FineReportの画面作成について、下記の資料を参照してください
http://www.finereport.com/jp/
![企业微信截图_20190327042550.png](https://qiita-image-store.s3.amazonaws.com/0/350893/e4657833-3f21-39a5-abec-7525e012d0b6.png)
UIColor

```
/// UIColorの拡張
extension UIColor {
    
    /// 16進数での色指定
    ///
    /// - Parameter rgb: 16進数での指定色
    convenience init(rgb: Int32) {
        
        let r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0
        let g = CGFloat((rgb & 0x00FF00) >>  8) / 255.0
        let b = CGFloat(rgb & 0x0000FF) / 255.0
        self.init(red: r, green: g, blue: b, alpha: 1.0)
    }
    
    //-----------------------------------------------------------------------------
    
    /// 16進数での色指定（アルファチャンネル付）
    ///
    /// - Parameter rgba: 16進数での指定色
    convenience init(rgba: Int64) {
        
        let r: CGFloat = CGFloat((rgba & 0xFF000000) >> 24) / 255.0
        let g: CGFloat = CGFloat((rgba & 0x00FF0000) >> 16) / 255.0
        let b: CGFloat = CGFloat((rgba & 0x0000FF00) >>  8) / 255.0
        let a: CGFloat = CGFloat(rgba & 0x000000FF) / 255.0
        self.init(red: r, green: g, blue: b, alpha: a)
    }
    
}
```
Javaの引数は値渡しなのか、参照渡しなのか

正直知ってても知らなくても困ることはないのですが、Javaの引数の渡し方のお話です。

Javaは参照渡しと言われることが多くて、でもなんだかそのあたり腹落ちせずもやもやしてたのが[C++の勉強をしていて](https://qiita.com/yachinco/items/ec5a5e3e751d6a490921)霧が晴れた感があったので記事にしてみました。

くり返しになりますが、別にJavaに限っていったら知っててても知らなくてもどうでもいいことです。

# プリミティブ型の場合

```Java
	public static void main(String[] args) {

		int a = 1;
		int b = 2;

		System.out.println("Before swap");
		System.out.println("a = " + a);
		System.out.println("b = " + b);

		swap(a, b);

		System.out.println("After swap");
		System.out.println("a = " + a);
		System.out.println("b = " + b);
	}

	static void swap(int x, int y) {
	
		System.out.println("In swap");
	
		int t = x;

		x = y;
		y = t;

		System.out.println("x = " + x);
		System.out.println("y = " + y);
	}
```

```:出力
Before swap
a = 1
b = 2
In swap
x = 2
y = 1
After swap
a = 1
b = 2
```
　```swap```メソッドの引数```x```、```y```は呼び出し元の```a```、```b```のコピーであり異なる実体です。したがって、```swap```メソッドの中で```x```と```y```の値が入れ替わっても呼び出し元に影響は及びません。

これがすなわち```値の値渡し```です。

# オブジェクトの場合
```Java
	public static void main(String[] args) {

		Integer c = new Integer(1);
		Integer d = new Integer(2);

		System.out.println("Before swap");
		System.out.println("c = " + c);
		System.out.println("d = " + d);

		swap(c, d);

		System.out.println("After swap");
		System.out.println("c = " + c);
		System.out.println("d = " + d);
	}

	static void swap(Integer x, Integer y) {

		System.out.println("In swap");

		Integer t = x;

		x = y;
		y = t;

		System.out.println("x = " + x);
		System.out.println("y = " + y);
	}
```

```:出力
Before swap
c = 1
d = 2
In swap
x = 2
y = 1
After swap
c = 1
d = 2
```
結果はプリミティブ型と同じく、```swap```メソッド内で値が入れ替わっても、呼び出し元の値は入れ替わりません。
```swap```メソッドにはIntegerクラスのインスタンスに対する参照が引数として渡されます。
ただし、引数に渡される参照は、プリミティブ型の場合と同じく呼び出し元における**参照のコピー**となります。
つまり、```swap```メソッドで```x```と```y```の参照を入れ替えたとしても呼び出し元```a```と```b```の参照は変更されません。
これはすなわち```参照の値渡し```ということなります。

# でも、オブジェクトの場合参照を引数に渡してるんだから参照渡しっていってもいいんじゃない？
以降は余談です。

厳密な意味での参照渡しって、たぶんC++でいうところの参照を引数として受け渡しすることだと思うんです。

でも、私が大昔すこしだけC言語をかじったときも引数の値渡し、参照渡しっていい方をしていた記憶があって、C言語の参照渡しってポインタを引数として渡すことだと思うですが、これも厳密にいうと```ポインタの値渡し```です。

正直なところ、C言語での文脈とか理解が曖昧なのですが、もし```ポインタの値渡し```を参照渡しという文脈があるなら、Javaのオブジェクトだって、参照渡しといってもいいんじゃない？

# 自分なりの結論
厳密にはJavaは値渡しである。
でも、暴論めいたことを言うと、参照渡しと言ってそれも間違ってはないっしょ。

# 本当に大切なのは
それが値渡しだろうが参照渡しだろうが、Javaに関してはオブジェクト引数にわたす場合その参照が渡されることには違いない。

参照の向き先はメソッドの呼び出し元、メソッド内でもおなじになるので、メソッド内で参照介してオブジェクトを操作した場合、呼び出し元に副作用的に影響が及び得る、ということです。
[git] gitconfigで会社用アカウントと個人用アカウントを楽に使い分けする

## 概要

やむを得ない事情でgitアカウントが複数あり、会社用アカウントと個人用アカウントなどを分けたいケースがあると思います。
そういったときは、会社用アカウントで作業するフォルダと個人用アカウントで作業するフォルダを分け、gitconfigの `includeIf` で **このフォルダ配下ならこのアカウントを使うよ** という設定を書いてあげるとよさげです。

ベースとなるgitconfigを作り、分けたいアカウントの数だけ[user]だけ描いたgitconfigを作ってincludeIfで参照するといい感じだと思います。

## ベースgitconfig

```sh:~/.gitconfig
省略

# workフォルダの時会社用gitアカウントに切り替え
[includeIf "gitdir:~/project/work/"]
  path = ~/.gitconfig-work

# otherフォルダの時は個人用アカウントを使用する
[includeIf "gitdir:~/project/other/"]
  path = ~/.gitconfig-other
```

## 会社用gitconfig

```sh:~/.gitconfig-work
[user]
  email = ***@***.co.jp
  name = ***
```


## 個人用gitconfig

```sh:~/.gitconfig-other
[user]
  email = ＊＊＊@gmail.com
  name = SugarShootingStar
```


## はるか昔に見た参考記事

[git configをプロジェクトによって使い分ける - Qiita](https://qiita.com/htanjo/items/51245c08327a31da73f4)
はじめてのC++【28日目】

#はじめに
学習の仕方を変えようと思います。いままで、コメント欄で新しい機能などを皆様から教えていただいたときに、次の日にすべてを理解しようとしていました。しかし、この方法だと私の許容範囲を超えてしまい正しく理解できないと感じました。そこで、１日１~2項目を正しく理解できるように、その項目を深く調べようと思います。
##Stock List
ここでは、まだ少し不安な要素があるものをリストにする。
1日目から今日までの投稿を振り返ってみて見ようと思う。
オブジェクト指向関係は、後回しにするかな。静的メンバとか。
###未解決
・`int const * const * const ** const * p` ←今日解決する
・静的メンバ [参照](https://qiita.com/yumetodo/items/b0ff58617f2733d4ffa1#%E9%9D%9Estatic%E3%81%A7%E9%9D%9Evirtual%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A6%E3%82%8B)
・`std::string`
・`i++`と`++i`の違い
・`nullptr`
・`std::vector`
・`std::array`
・`enum class`
・メモリ  [メモリの話](https://qiita.com/yumetodo/items/067b2db266ae0779f030)
・スマートポインタの使い方　`std::unique_ptr` や` std::shared_ptr`
・`std::quick_exit` [あとで読む](https://qiita.com/yumetodo/items/ba5bef7f64636ed2f439)
・初期化子
・みえる・みえない
・this
###解決
##ロベールのC++
###07-11　クラスの実体の動的確保

オブジェクトをnewするときにコンストラクタが、deleteするときにデストラクタが呼ばれる。
引数つきのコンストラクタも呼べる。

一度読んでみたがイマイチ理解ができなかったので、明日もう一度やってみる。
クラスの動的確保は重要そう。
##int const * const * const ** const * p
###constポインタの基本
 
```cpp
int * p; //アドレスも中身も書き換え可能

const int * p; //アドレスは書き換え不可能　中身は書き換え可能

int * const p; //アドレスは書き換え可能　中身は書き換え不可能

const int * const p; // アドレスも中身も書き換え不可能
```
[↑参照](https://qiita.com/yohhoy/items/feadbe1a245caadc44f7)
英語を使った解読方法をコメント欄にて教えていただいたので紹介する。

```英訳
int * p; //アドレスも中身も書き換え可能
|　|　|
|　|　`p` is
|　|  |
|   pointer to
|
int 
```
これより、`p is pointer to int`という文がでる。

```cpp
const int * p; //アドレスは書き換え不可能　中身は書き換え可能
```
この場合は、`p is pointer to read only int`

```cpp
int * const p; //アドレスは書き換え可能　中身は書き換え不可能
```
`p is read only pointer to int`

```cpp
const int * const p;  // アドレスも中身も書き換え不可能
```
`p is read only pointer to read only int`

英文の作り方は多分あっていると思います。英語が苦手なので、正しく意味があっているか不安です。

つまり、

```cpp
int const * const * const * * const * p;
```
`p is pointer to read-only pointer to pointer to read-only pointer to read-only pointer to read-only int`
英文が読めないのですけど、
中身の書き変えOKで、アドレスも書き換え可能とコメント欄で教えてもらいました。

いい画像を頂いたのでここに掲載してもらいます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3331313333302f65323166326565322d373866322d323066392d383164632d3638346634393537333330662e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/298612/063e43c2-9409-ed6c-da52-128397c424fd.png)
この図を見てると、規則性がいくつか思いつきそう。

一番右にポインタがついていると、pは書き換え可能ということになる。
他にも見つけられそう。


#終わりに
英語嫌い
toいっぱいあってややこしいな。