OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】UITextViewにHTMLを表示する方法

## UITextViewにHTMLを表示してみた

UITextViewにHTMLを表示したかったので、試してみました。

こちらの記事[UITextViewにHTMLを表示する（Swift3版）](https://qiita.com/kumetter/items/91b433cd4d30abe507c5)を参考にして、HTMLをNSAttributedStringに変換するextensionを定義しました。

``` Swift
	import Foundation
	import UIKit

	extension NSAttributedString {
    
    	static func parseHTML2Text(sourceText text: String) -> NSAttributedString? {
	        let encodeData = text.data(using: String.Encoding.utf8, allowLossyConversion: true)
	        let attributedOptions = [
	            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject,
	            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue as AnyObject
	        ]
        
	        var attributedString: NSAttributedString?
	        if let encodeData = encodeData {
	            do {
	                attributedString = try NSAttributedString(
	                    data: encodeData,
	                    options: attributedOptions,
	                    documentAttributes: nil
	                )
	            } catch _ {
	                
	            }
	        }
	        
	        return attributedString
	    }
	    
	}
```

あとは、こちら↓のようにHTMLを変換して、UITextFieldのattributedTextに代入すればオッケーです。

``` Swift
	let htmlText = "<p>UITextFieldにHTMLを表示することができます。<font color=#ff0000>フォントの色</font>も変更できますし、<a href=\"https://www.apple.com/jp/\">リンク</a>も埋め込むことができます。</p>"
	let attributedString = NSAttributedString.parseHTML2Text(sourceText: htmlText)
	htmlTextView.attributedText = attributedString
```

文字列のなかに `"` ダブルコーテーションがあるとエラーになります。リンクなどでダブルコーテーションをつかうときは、 `\` バックスラッシュをダブルコーテーションのまえにつけてください。

実行すると、こちらのようにHTMLのタグを解釈して表示されています。

<img width="301" alt="スクリーンショット 2018-07-24 14.37.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/62fb1803-3489-d71a-3552-ae2d876dfdc8.png">


## リンクをタップしたいとき

<img width="254" alt="スクリーンショット 2018-07-24 11.53.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/71778178-ec1c-85db-5ff2-d990fbae2d4a.png">


リンクをタップしたいときは、 `Behavior` の`Selectable` と `Data Detectors` の `Link` を有効にします。
HTMLのなかにリンクが埋め込まれている場合は、タップするとSafariに遷移してリンクを開いてくれるようになります。
powershellでIEのいろいろ

#1.概要
①IEのインターネットオプションを設定する方法。
②IEをURL指定して開き、操作
③IEで開いているページを取得

#2.環境
・powershell : 5.1
・IE : 11

#3.コード

##3.1.インターネットオプション
```IE_set.ps1
#IEのスタートページをグーグルに変更
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Internet Explorer\Main' -Name "Start Page" -Value "https://www.google.co.jp/" 
#インターネットオプションのプロパティ確認
#gp "HKCU:\Software\Microsoft\Internet Explorer\Main" 
```

##3.2.IEを開く
```IE_ope.ps1
$ie = New-Object -ComObject InternetExplorer.Application  # IE起動
$ie.Navigate("開きたいページのURL") # URL指定
$ie.Visible = $true #IEの画面表示
$doc=$ie.document
#オブジェクトを配列で取得
$txtId=$doc.getElementsByName("操作したいオブジェクトのnameプロパティ")　
#idプロパティの場合：getElementById
@($txtId)[0].value = "代入したい値"
#TagNameプロパティでオブジェクトを取得。whereでオブジェクトの絞り込み
$btnDay = $doc.getElementsByTagName("操作したいオブジェクトのタグ名") | where {$_.innerText -eq ""} 
 #取得したボタンをクリック
@($btnDay)[0].click()
```

##3.3.IEで開いているページを取得
```IE_get.ps1
#シェルを取得
$shell = New-Object -ComObject Shell.Application
#ieで開いているページ一覧を取得
$ie_list = @($shell.Windows() | where { $_.Name -match "Internet Explorer" })
#URL指定でIEページのオブジェクトを取得する([-1]で同一ページの最新のタブのオブジェクトを取得する)
$ie = @($ie_list | where { $_.LocationURL -match "オブジェクトを取得したいページのURL" })[-1]
```
iOS　メモリ管理のまとめ

#はじめに
普段iOSアプリを開発する際は、メモリ管理を意識することがほとんどありません。
しかし、こういったトリビア的なものも知っておくと後々便利になることもありますし、裏でどんなことを行なっているのかある程度知ることができます。

結構ためになると思うので共有してみたいと思いこの記事を書きました。

認識が間違っている箇所があったら、是非指摘していただけたらと思います。

#メモリ管理モデル
１つのオブジェクトは１つ以上の所有者を持ち、少なくとも１つの所有者を持つ間は、オブジェクトは存在し続けます。
所有者がいなくなった場合はランタイムシステムが自動的にオブジェクトを破棄します。
受け取ったメソッドはメソッドのスコープ内で有効でスコープから外れると**参照カウント**が減るようになっています。

#参照カウントというモデルについて
前知識としてまず、メモリ管理モデルの**参照カウント**についてお話します。
iOSはこのメモリ管理モデル(参照カウント)を採用しております。参照カウントの基本モデルは、NSObjectのプロトコルで定義されているメソッド命名規約から成っており、これはオブジェクトを参照するとカウント数が1増え、参照し終えると1減ります。最終的に0になるとNSObjectが自動的に確保したメモリを破棄します。

# iOSの過去のメモリ管理方法
iOSアプリのメモリ管理では**MRR**(Manual Retain Release)というメモリ管理方法が用いられていました。これは自分でメモリ領域を確保したり、解放したりするメモリ管理メソッド(new, retain, release, alloc等)を自分で加えなければいけませんでした。（本当に便利になりませんでした。）

# iOSの現在のメモリ管理方法ARCについて
現在ではARC(Automatic Reference Count)というメモリ管理方法が主流で、MRRと同じで「参照カウント」を用いられているのですが、メモリ管理メソッド(retainとかリリース、オートリリースとか)をソースコードに書く必要が無く、コンパイル時に必要なメモリ管理メソッドを挿入するようになっているのです。
なので、コンパイル途中のコードを見るとメモリ管理メソッドが加えられたコードを見ることができると思います。

#そもそもメモリ管理とは
メモリを割り当てて、使い、必要がなくなったら解放することがメモリ管理です。
ARC方式だとあまり意識しなくて良いのですが、油断が禁物です。
循環参照だったり、繰り返し処理などで、常に新しいviewをaddSubviewしたり、closureなどによってメモリが解放されなくなったすると、メモリが圧迫されます。
これは過去の**MRR方式と現在のARC方式のメモリ管理方法両方で直面することがある問題**ですので、是非気をつけましょう。

スコープの中で必要がなくなった変数がどのように解放されるか注意しておくとよいかもしれません。

#メモリ管理でよく起こった問題
##使用中のデータを解放、上書き等してクラッシュする　
まだ使用中のデータを解放、上書きしてメモリの内容が破損しクラッシュにもつながります

例えば、APIにリクエストを送ってレスポンスが帰ったときに、処理をさせたい場合があるとします。
そんな時にclosureを使って、インスタンス変数に帰ってきた値を入れるとしましょう。

```swift:
API.request(parameters: parameters, completion: { (result) in
  self.requestResult = result
})
```

この場合、APIのレスポンスが返って来る前に、selfが解放されたりすると、クラッシュします。
解決するには、弱参照を使いましょう。（デフォルトの参照方法は強参照。）


```swift:
API.request(parameters: parameters, completion: { [weak self] (result) in
  guard let optionalSelf = self else { return }

  optionalSelf.requestResult = result
})
```

##メモリリーク
割り当てたメモリが不要になったのに、解放されないことで、メモリのリソースが消えて行きクラッシュしてしまいます。

例えば、ボタンを押すたびに、新しいviewを追加するとします。

```swift:
@objc private func pushButton(_ sender: UIButton) {
 let view = hogeView()
 addSubView(hogeView)
}
```

こうすると新しいviewがどんどん追加されていって、メモリを圧迫していくので、古いものを解放する必要がります。
`removeFromSuperview`を使ってちゃんと削除しましょう。

#終わりに
必要以上にメモリを使わないプログラムは高品質なプログラムに繋がりますので、常に意識しましょう！
Docker CE で Keras 環境を構築ver2

#目的
前回、CentOS でテンソーフローを試そうとして失敗。
今回は、Ubuntu でリベンジ。

#Setup
まずは、Ubuntu 18 のダウンロード
https://www.ubuntu.com/download/server/thank-you?country=JP&version=18.04&architecture=amd64

806MB あるので、インターネット環境に合わせてお待ち下さい。
私の場合、20分程度で完了しました。

##pyenv の導入
sudo apt-get update


sudo apt-get install -y  git zlib1g-dev libbz2-dev libreadline6 libreadline6-dev libsqlite3-dev libssl-dev

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

source ~/.bash_profile

#テンソーフローの導入
https://www.tensorflow.org/install/install_linux

virtualenv --system-site-packages -p python3 venv 







conda create -n py36 python=3.6 anaconda
source $PYENV_ROOT/versions/anaconda3-5.2.0/bin/activate py36

今後は、py36 環境で実行。

sudo apt-get install python3-pip python3-dev python-virtualenv



#Tips
source activate py36

エラーが発生
pyenv: activate: command not found

anaconda のパスと競合してうまく動かないのかも。
https://qiita.com/y__sama/items/f732bb7bec2bff355b69
フルパスで試験。

source $PYENV_ROOT/versions/anaconda3-5.2.0/bin/activate py36
動いた！

別の環境を作ろうとしたら、下のエラーが出た。
Running virtualenv with interpreter /home/admin/.pyenv/shims/python3
もうあるよってことで、終了。
Linux ユーザのパスワードを(ほぼ自動)更新する

## Linux ユーザのパスワードを(ほぼ自動)更新する
いやぁ。毎日記事を書こうと思ったけど、続けるのは、なかなか難しい。。。

で、本題。
都合上、半年に一度、パスワードを変更する必要があるシステムがあるんですが、勝手に変えてくれたらいいなぁ。と思い、適当にスクリプトを作ったった。
(ほぼ自動)って書いてあるのは、変更対象のユーザリストを手で作っているから。

```bash:
#!/bin/bash

# list.confにはパスワードを変更したい対象のユーザ名を記載しておく
FILENAME=/path/to/list.conf
PSWDLIST=/path/to/pswd.conf

# 
if [ -e $PSWDLIST ]; then
  /bin/rm -f $PSWDLIST
fi

# "username":"password" の形式のファイルを生成する
/bin/cat $FILENAME |while read LINE ;do
  # パスワードの長さを変える場合は "fold -w XX" を変更する
  PASSWORD=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1 | sort | uniq`
  /bin/echo $LINE:$PASSWORD >> $PSWDLIST
done

# パスワード変更
/usr/sbin/chpasswd < $PSWDLIST 2> /path/to/result`/bin/date +%Y%m%d%H%M%S`.log
```

ユーザが存在しない場合は、パスワード更新は実行されず、Log にエラー内容が出力される。
これを cron で回す。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
sqlite2 を Arch Linux にインストール

Sqlite2.1 のデータを読む必要がでてきたので、その対処方法です。
ソースコードから、コンパイルするという方法を取りました。
次のページを参考にしました。
[SQLite2をMac OS Xにインストール](https://kujirahand.com/blog/index.php?SQLite2%E3%82%92Mac%20OS%20X%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

読みたいファイル

```text
$ file sqdb00.db 
sqdb00.db: SQLite 2.x database
```

sqlite コマンドのインストール手順

```bash
wget http://www.sqlite.org/sqlite-2.8.17.tar.gz
tar -zxf sqlite-2.8.17.tar.gz
cd sqlite-2.8.17
./configure
make
sudo make install
```

インストール先

```text
$ which sqlite
/usr/local/bin/sqlite
```

コマンドを起動

```text
$ sqlite
SQLite version 2.8.17
Enter ".help" for instructions
sqlite> .exit
```

sqlite コマンドが使えるようになれば、DB を sqlite3 に変換することができます。
次のページに記述があります。
[SQLite Version 3 Overview](https://www.sqlite.org/version3.html)

```bash
sqlite OLD.DB .dump | sqlite3 NEW.DB
```
ローカルホストの Tomcat サーバのアプリケーションファイル展開場所

## 環境
- Tomcat 8
- Java 8
- eclipse Photon (4.8)

## 背景
デバッグで tomcat サーバー 起動したけど、実ファイルってどこにあるのか忘れてしまうのでメモ
Eclipse Tomcat Plugin ではないです。

## ローカル・ホスト の Tomcat v8.0 サーバーをダブルクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/834529e9-7684-224b-11bd-03451d7e4ef7.png)

見づらいですが下の方に記載があります。

## ディレクトリ
\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps

## Tomcatの設定ディレクトリ
\\workspace\\Servers\\ローカル・ホスト の Tomcat v8.0 サーバー-config
SAS Viyaで用意されている開発者向けリソースについて

SAS ViyaはAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。

具体的には以下の環境が用意されています。

## [REST](https://developer.sas.com/guides/rest.html)

REST APIです。[ドキュメントはこちら](https://developer.sas.com/apis/rest/)にあります。カテゴリは以下に分かれています。

- Visualization
- Compute
- Text Analytics
- Data Management
- Decision Management
- Core Services

## [Python](https://developer.sas.com/guides/python.html)

基本的にREST APIをラッピングしたPythonライブラリです。ソースコードは[sassoftware/python-swat](https://github.com/sassoftware/python-swat)にて公開しています。swatというのはSAS Scripting Wrapper for Analytics Transferの略称になります。

## [R](https://developer.sas.com/guides/r.html)

Python同様にR言語用ライブラリもあります。R言語でのはじめ方は[SAS® Help Center: Getting Started with SAS Viya 3.3 for R](http://documentation.sas.com/?cdcId=pgmcdc&cdcVersion=8.11&docsetId=caspg3r&docsetTarget=titlepage.htm&locale=ja)を参照してください。

## [Lua](https://developer.sas.com/guides/lua.html)

同様にLuaです。LuaにもR言語同様に[Getting Startedを用意しています](http://documentation.sas.com/?cdcId=pgmcdc&cdcVersion=8.11&docsetId=caspg3lua&docsetTarget=titlepage.htm&locale=ja)。

## [Java](https://developer.sas.com/guides/java.html)

Java用のライブラリです。APIリファレンスは[Overview (cas-client 3.2.9 API)](https://developer.sas.com/apis/cas/client/java/v3.2.9/apidoc/index.html)になります。

## [Mobile SDK | SAS](https://developer.sas.com/guides/mobile-sdk.html)

現在はiOS向けにSDKを提供しています。アプリからSAS Viyaのサーバにアクセスできます。Android向けも間もなく登場予定です。

## [SAS](https://developer.sas.com/guides/sas.html)

もちろんSAS言語からもアクセスできます。SAS言語からの利用方法は[Getting Started](http://documentation.sas.com/?cdcId=pgmcdc&cdcVersion=8.11&docsetId=pgmdiff&docsetTarget=titlepage.htm&locale=ja)を参照してください。

----

SAS Viyaは皆さんの好きな言語、システム構成に合わせて利用できます。ぜひご利用ください！

[SAS for Developers | SAS](https://developer.sas.com/home.html)
FFmpegで進捗を出力して計算するには


# FFmpeg

[FFmpeg](https://www.ffmpeg.org/)は動画変換を行ってくれるとても便利なソフトウェアです。
その進捗を出力する方法についてのTipsです。

## FFmpegの進捗を出力する

エンコーディングには多少時間がかかりますが、その進捗情報を表示させるためには prgressオプションを使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37364/68397977-eebf-9e07-b3c6-0aecb0d553d8.png)
- [ffmpeg Documentation](https://www.ffmpeg.org/ffmpeg.html)より

この `-progress` オプションを使うと進捗情報を出力できます。

### ファイル出力させたい場合

`-progress`の引数に `progress.txt`のようにファイルを渡してあげれば良いです。

```
ffmpeg -i INPUT -progress progress.txt out.mp4
```

### 標準出力させたい場合

これが中々分からなかったのですが、標準出力させるには **`-` を引数に渡してあげる**と大丈夫です。
（地味にハマりました。）

```
ffmpeg -i INPUT -progress - out.mp4
```


## FFmpegの進捗をパーセントで出すには

ちなみに、FFmpegの進捗はパーセントで出力されません。

**frame数**や**変換が完了した秒数**が取得できるので、`変換できたframe数/全体のframe数` または `変換できた時間/全体の時間` という計算を行うことで進捗のパーセントを算出する必要があります。


ぜひ試してみてください。
NodejsでSQL Server接続

# 経緯
Windows10内にある、Microsoft SQL Server 2012にあるデータを取得してFTPSでputして欲しいという要件があった。
SQL Serverなんか触ったのは、おそらく２０年前くらい。
簡単な要件だったので、Nodejsで作ることにした。
その時のメモ。

#SQL Driver
Windows10内のNodejsの環境が構築されているものとする。
SQL Serverへは、ODBC経由でいいはずだけど、調べてみると以下のページを発見。

[Node.js Driver for SQL Server](https://docs.microsoft.com/ja-jp/sql/connect/node-js/node-js-driver-for-sql-server?view=sql-server-2017)

[Tedious](https://github.com/tediousjs/tedious)
[- Overview](http://tediousjs.github.io/tedious/)

ひとつのプログラムだけで実行するので、ローカルインストール

```
npm install tedious
```
#接続
接続ユーザはすでに作成されているものとする。

```
const Connection = require('tedious').Connection;
const config = {
 	server:DB_HOST,
 	userName:DB_USER,
 	password:DB_PASS,
 	options:{
 		database:DB_NAME,
 		encrypt:false
 	}
};

const connection = new Connection(config);
connection.on('connect', function(err) {
 	if ( err ) {
 		// ERROR - SQL Serer connect error.
 		console.log('SQL Serer connect error.(' + err + ')');
 		// 終了
 		process.exit();
 	}
 	// Info - SQL Server connected.
 	console.log('SQL Server connected.');
 	// 接続したらクエリ実行
 	execute();
});
```

#実行

```
const Request = require('tedious').Request;
function execute() {
	// Query Request
	let sql = getQuery();
	const request = new Request(sql, function(err, rows) {
		if ( err ) {
			// ERROR - Query request error.
			console.log('Query request error.(' + err + '');
			process.exit();
		}
 		// INFO - Run query. sql
 		console.log('Run query. ' + sql);
       　// close
		connection.close();
	});
	request.on('row', function(columns) {
      　// 実行結果が返ってくる
　　　　　　　　　....... 処理
	})
    // exec
	connection.execSql(request);
}
function getQuery() {
	// SQLを返す
	return sql;
}
```
java.lang.IncompatibleClassChangeError: Implementing class

## 環境
- Wicket 7.10
- Tomcat 8
- Java 8
- org.apache.xmlrpc 3.1.3

## 背景
eclipse でデバッグ時に変なエラーでてちょっとはまったのでメモ

## 現象
Tomcat アプリ起動時にタイトルのエラー、環境関連か・・・

## 結論
バージョンの異なるライブラリの読み込みを行ってしまっていたため。
pom.xml の依存関係をチェックする。

## 原因
pom.xml にとりあえずライブラリ入れてみて問題ないからOKと思っていたら
WEB-INF/lib のディレクトリに新旧の xmlrpc の jar ファイルがあったという…凡ミスでした
UnrealRemote2を使って、モバイルアプリの簡易デバッグを行う

**この記事はUE4.20のものです**


VirtualCameraを導入するときに使ったUnrealRemote2ですが、これを使えば
実機にデプロイせずとも、モバイル向けアプリケーションの操作感を確認することができます


# 注意
- ARKitが利用可能なiOS機器を準備してください
- 利用可能なUE4のバージョンはUE4.20以降です
- Androidは対象外です


## できること
- モバイル画面で表示したときのレイアウトの確認
- モバイル画面で操作感の確認

## できないこと
- レンダリング周りの確認
- 負荷の確認
- サウンドの確認
- GPS等のデータ連携の確認

など

# 導入

導入手順は非常に簡単です

## iOS機器の準備
まずはUnrealRemote2をiOS機器にインストールしておきましょう
https://itunes.apple.com/jp/app/unreal-remote-2/id1374517532?mt=8


## RemoteSessionプラグインの導入

対象のプロジェクトに、RemoteSessionプラグインを導入しておきます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117589/bebd7b89-0c58-ebcd-f211-7b22b9be8660.png)

## (オプション) Touch Interfaceの表示設定
Touch Interfaceが必要な場合は、ProjectSettings > Engine > Inputの`Always Show touch Interface`をONにしておきましょう

# 実行

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UnrealRemote2を使えば実機転送しなくても簡単に操作感を確認できるよ。待望の機能だ！（ただしiOSのみ<br><br>動画撮りながらだったので片手操作です<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/i92qhXNpyJ">pic.twitter.com/i92qhXNpyJ</a></p>&mdash; 墨崎達哉 (@T_Sumisaki) <a href="https://twitter.com/T_Sumisaki/status/1021605864900182016?ref_src=twsrc%5Etfw">2018年7月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Xcodeでadd new constraintsする方法探すのに1時間かかったメモ

# 概要

`constraints`を追加するためだけに1時間以上かかってしまったのでメモ

XcodeのUIわかりづら過ぎませんかね。。

# 方法

ここを

<img width="261" alt="Screen Shot 2018-07-24 at 13.38.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/f79cd606-15da-b77c-55ec-d8a0c5e96196.png">

こう

<img width="370" alt="Screen Shot 2018-07-24 at 13.45.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/b0f659ef-72f3-a987-ce6f-cbc902b5e271.png">

<br/><br/><br/><br/><br/><br/><br/><br/>
一瞬やんけ
SeleniumからヘッドレスChromeをプロキシ環境下で使用する

# 概要

とある用途でSeleniumを使用してWebスクレイピングをするときにヘッドレスChromeを利用しました。
職場でもテストするときにヘッドレスで動かせるようにしたろ！って設定したら動かなかったのです:weary:
お前の環境だけじゃい！という内容かもしれないが、動くようにするまでの設定をまとめます:metal:

# 環境

Selenium Gridのhubもnodeも全てローカル環境のみで試しています。

|ソフト|バージョン|
|:-----|:---------|
|OS|Windows7 64bit|
|Chrome|67.0.3396.99|
|ChromeDriver|2.40|


# 試したら動かなかった

[Selenium(Java)でE2Eテスト環境を構築する](https://qiita.com/umasaki/items/7ac1ea1719c1a786d64f)で作成した環境に対し、[ヘッドレス Chrome ことはじめ](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)を参考に設定を変えました。

argsの詳細は[Capabilities & ChromeOptions](https://sites.google.com/a/chromium.org/chromedriver/capabilities)とか[List of Chromium Command Line Switches](https://peter.sh/experiments/chromium-command-line-switches/)で見れます。

prefsは[Preferences](https://www.chromium.org/developers/design-documents/preferences)と[Configuring Other Preferences](https://www.chromium.org/administrators/configuring-other-preferences)ですかね。
良い一覧が見つかりませんでした。

Pitalium環境でなくても org.openqa.selenium.remote.DesiredCapabilities に同じような設定をすれば動くんじゃないかと思います。

```json:capabilities.json
[
 {
  "browserName": "chrome",
  "chromeOptions": {
    "args": [
         "headless",
         "disable-gpu",
         "remote-debugging-port=9222"
    ],
    "prefs": {
       "download.prompt_for_download":false
    }
  }
 }
]
```

動かしてみるとブラウザは画面に表示されないが・・・
http://localhost:4444/grid/console を確認するとブラウザは使われている。
![qiita1.JPG](https://qiita-image-store.s3.amazonaws.com/0/187061/6930cdcb-9523-c591-e192-329aa7cd0746.jpeg)

しかし指定した要素が見つからないエラーで終わってしまいます。
もちろんヘッドレスの設定でなければ要素は見つかり操作が進みます。


# 動かなかったのでChromeのデバッグをしてみた

ここで念のため設定していた『remote-debugging-port=9222』が活躍します。

Chromeを開き http://localhost:9222 にアクセスすると開いているタブがリンクで一覧表示されます。
そのリンクを開くとヘッドレスで動いているブラウザの画面が見れるのですが、以下のように驚きの白さ:innocent:
![qiita2.JPG](https://qiita-image-store.s3.amazonaws.com/0/187061/07fc90ae-f20b-9223-417d-e17a96506d75.jpeg)


# プロキシの設定をしたら動いた

とりあえずプロキシ環境下だからプロキシ設定してみるかなと以下のように設定。

```json:capabilities.json
[
 {
  "browserName": "chrome",
  "chromeOptions": {
    "args": [
         "headless",
         "disable-gpu",
         "proxy-server=http://proxyserver:8080",
         "remote-debugging-port=9222"
    ],
    "prefs": {
       "download.prompt_for_download":false
    }
  }
 }
]
```

先ほどと同様に http://localhost:9222 にアクセスして画面を見ると**表示されてるやん！**
※問題あるとき以外はこの画面開かない方が良さそう。操作を取ってしまい進まなくなることがある。
![qiita3.JPG](https://qiita-image-store.s3.amazonaws.com/0/187061/35fe23a7-5bae-c15c-0553-71974937c7de.jpeg)

んーヘッドレスの時はユーザープロファイルがなんか違うのか？
Stack Overflowとか色々調べたら原因わかりそうだけど解決したから良しとしとこ:thinking:
障害報告書まとめ

# このまとめについて
他社の障害(事故)報告書には学びがあります。

* 障害報告書の書き方
* 障害内容
* 対応方法
* etc...

その学びを得るため、ここに障害(事故)報告書のリンクをまとめます。
随時追記していきます。

追加してほしい障害(事故)報告書があればコメントに記載お願いします。

## 2018年
会社名 | 障害内容
--- | ---
ファーストサーバ株式会社 | [サーバー高負荷障害](https://zenlogic.jp/pdf/report/20180717.pdf)
株式会社スタディスト | [不正アクセス(ではなかった報告)](https://studist.jp/news/news180723/)
国立研究開発法人 産業技術総合研究所 | [不正アクセス](https://www.aist.go.jp/pdf/aist_j/topics/to2018/to20180720/20180720aist.pdf)
九州商船株式会社 | [不正アクセス](http://www.kyusho.co.jp/report/)

## 2017年
会社名 | 障害内容
--- | ---
株式会社メルカリ | [個人情報流出](https://about.mercari.com/press/news/article/20170622_incident_report/)
GMOペイメントゲートウェイ株式会社 | [不正アクセス](https://corp.gmo-pg.com/newsroom/pdf/170501_gmo_pg_ir-kaiji-02.pdf)
Gitlab Inc. | [オペミスによるサービス停止](https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/)

## 2016年
会社名 | 障害内容
--- | ---
日本テレビ放送網株式会社 | [不正アクセス](http://www.ntv.co.jp/oshirase/20160714.pdf)
株式会社パイプドビッツ | [不正アクセス](https://www.pi-pe.co.jp/pb/info/)

## 2012年
会社名 | 障害内容
--- | ---
ファーストサーバ株式会社 | [顧客データのロストなど](https://www.firstserver.co.jp/pdf/effort/fs-report.pdf)

## 2011年
会社名 | 障害内容
--- | ---
さくらインターネット株式会社 | [ストレージ障害](https://cloud-news.sakura.ad.jp/wp-content/uploads/2012/06/storagehoukoku20120625a.pdf)

## 2008年
会社名 | 障害内容
--- | ---
株式会社サウンドハウス | [不正アクセス](https://www.soundhouse.co.jp/company/news/pdf/20080418.pdf)
Cloud DatastoreのテストでPut後データが取得できない

```go
ctx, done, err := aetest.NewContext()
if err != nil {
  t.Fatal(err)
}
defer done()
g := goon.FromContext(ctx)
newUser := model.User{}
_, err = g.Put(newUser)
if err != nil {
  t.Fatal(err)
}
```
みたいなコードを実行した後、テスト対象のコードでnewUserを参照しようとすると、データが登録されておらず半日ハマった。

[Google App Engine Datastore - Testing Queries fails
](https://stackoverflow.com/questions/28590519/google-app-engine-datastore-testing-queries-fails)

ここに書いてあるとおり100msまたせたらちゃんとデータが登録できてテストも通った。要は、

```go
ctx, done, err := aetest.NewContext()
if err != nil {
  t.Fatal(err)
}
defer done()
g := goon.FromContext(ctx)
newUser := model.User{}
_, err = g.Put(newUser)
if err != nil {
  t.Fatal(err)
}
time.Sleep(100 * time.Millisecond)
```

なんて原始的な・・・・（英語読めないので流し読み）
Mac上のmatplotlibでグラフ描画できないときの対処法

最近『ゼロから作るDeep Learning』でPythonと機械学習の勉強を始めました。
1章の最後でつまずいたのでメモ。

## 実行環境
macOS High Sierra バージョン10.13.6
Python 3.6.5 
numpy 1.14.3
## 問題：matplotlibでグラフ描画できない
下記を書籍p16~p17のとおりPythonインタプリタで実行。

```py
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0,6,0.1)
>>> y=np.sin(x)
>>> plt.plot(x, y)
[<matplotlib.lines.Line2D object at 0x121ca3be0>]
>>> plt.show()
```

正常時は上記を実行すると別ウィンドウで画面が開きグラフが表示されるようなのですが、何も出てきませんでした。
「matplotlib グラフ描画　できない」等でググって検索結果のリンクを上から見て回ったりました。


## 原因1
matplotlibの backend指定がデフォルトで画面表示できないものになっていた。 
## 対処法1
以下ファイルのbackendをTkaggに変更。ファイル自体は600行強あったので必要なところだけ記載します。
~~` /anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc`~~

追記：コメントでご指摘頂いた通り
`~/.matplotlib/`配下に上記のmatplotlibrcをコピーしてから編集、下記内容を保存しスクリプトを実行してもグラフ描画できました。
site-packages配下はあまり触らない方が良さそうです。


```
#backend: macosx
backend: Tkagg
```

## 変えた結果
```py
>>> plt.plot(x, y)
[<matplotlib.lines.Line2D object at 0x12021d908>]
>>> plt.show
<function show at 0x111e19a60>
```
やはり描画できない。

## 原因2
tcl-tkというパッケージが必要らしい。
## 対処法2
該当パッケージをインストールし、

```
$ brew install tcl-tk 
```

matplotlibを再インストール。

```
$ pip uninstall matplotlib
$ pip install matplotlib
```

以上を実行後、もう一度書籍p16~p17のとおり実行すると
無事グラフが描画されました！！

## 参考サイト
https://www.dogrow.net/python/blog47/
https://qiita.com/harusora/items/ca87c73de4b975fdf23b
http://pppurple.hatenablog.com/entry/2016/02/28/213152
https://qiita.com/kkdd/items/55be4c4218a18f54716c

## 感想
- 描画するためのツールを入れろとは特に書いておらず、書籍どおりに進めればできると思っていたのですが甘かったです。。
- Vimのショートカットを覚えたい。
PowershellでPowerPointのスタート画面の表示を設定

#1.概要
powerpointのスタート画面（テンプレートの選択）の表示をレジストリキーを用いて変更する方法。
自分用覚え書きなので悪しからず。

#2.環境
・powershell : 5.1
・powerpoint : 16.0

#3.コード
```ppt_set.ps1
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Office\16.0\PowerPoint\Options' -Name "DisableBootToOfficeStart" -Value "1" 
```
また、念のためpowerpointのテンプレートを配置する場所を示しておく。
C:\Users\"ログオン中のユーザ名"\AppData\Roaming\Microsoft\Templates\Blank.potx
**注意：テンプレートとして表示したいファイル名は必ず"Blank.potx"にする**。
[超意訳]bitbucketにpushしたら何かすげぇエラーぽいのが出てきた件

# [追記/注意]この記事は過去の遺物になります
`22:00 UTC on Sunday, July 29 2018` にbitbucketが新IPに移行するにあたり
注意喚起が行われた際の記録です。
日本時間では `2018/07/30 07:00` に行われました。
対応した皆さまお疲れさまでした。

# pushしたらエラーが出たんです
正確にはエラーっぽい何か

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160396/46612ce6-8877-a2cd-9cc0-44d87498f351.png)

```
remote: We're changing our IP addresses starting 29 July 2018 at 22:00 UTC.
remote: Please make sure your firewalls are up to date:
remote: https://blog.bitbucket.org/?p=3707
```

## とりあえず出てきたURLを見てみる
こちらです。
https://blog.bitbucket.org/?p=3707

## 英文をざっくり読んでみる
> New IP addresses for Bitbucket Cloud

って書いてあるので、IPアドレスが新しくなるらしい。
「これは何？」とか「なんでやるの？」とか書いてあるけどそれぞれの事情がおありなのでしょうからすっ飛ばす
必要なのは
***「影響があるの？」***
これだけ

### 影響はないよ
正確には「 ~~ほとんどのユーザーには影響が無いよ~~ 多くのユーザーは特別な対応は不要だよ」って書いてあります。
※[修正] 「正確には」って書いてあるのにあんまり正確な訳じゃなかったので修正
> Most users will not have to do anything special for this migration.

### 「Firewall」の設定している人は更新してね
職場からの外部アクセスとかで「Firewallの設定をしている場合は接続先を更新してね」と書いてあります。
更新先はこちらだそうです。

```
IPv4: 18.205.93.0/25 and 13.52.5.0/25
IPv6: 2406:da00:ff00::0/96*
```

### SSH接続でエラー表示が出るかもしれないよ
sshの鍵ファイルはそのまま引き継がれるので更新の必要は無いそうですが
sshの設定次第ではエラー文が出る可能性もあるみたいです。
もしエラー文言出たら `~/.ssh/known_hosts` 辺りを弄って解消してね！
っていうことみたいです。

# まとめ
特別な設定をしていなければ影響は無い！！
IPアドレスの変更の影響を受ける設定を追加している場合は切り替え作業をよろしく！！
ということみたいです。
よろしくどうぞ
bottleでCORSに対応

bottleでCORSを使う方法について自分なりにまとめてみた

#きっかけ
自作APIと外部APIの連携する処理を作ったが正常に処理されない...


#結論
CORSへの対応が必要
>参考
>CORSまとめ
>https://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34

#解決策
こちらのgithubのソースをいただいた
>参考
>Bottle with Cross-origin resource sharing (CORS)
>https://gist.github.com/richard-flosi/3789163

hook機能を使ってリクエスト処理の最後にヘッダを付与している

Allow-Originヘッダがワイルドカードだと外部API側で警告っぽい応答をされてしまったので、リクエストヘッダからURLを打ち込んでやった

そしてAllow-HeadersヘッダにAuthorizationが必要だったので追加

```routes.py
@app.hook('after_request')
def enable_cors():

    if not 'Origin' in request.headers.keys():
        return

    response.headers['Access-Control-Allow-Origin']  = request.headers['Origin']
    response.headers['Access-Control-Allow-Methods'] = 'PUT, GET, POST, DELETE, OPTIONS'
    response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token, Authorization'
```

また、OPTIONSメソッドにレスポンスを返す処理が必要だったので以下のように実装

```routes.py
@app.route('<any:path>', method='OPTIONS')
def response_for_options(**kwargs):
    return {}
```


hook機能についてはこちら
>参考
>API Reference
>http://bottlepy.org/docs/dev/api.html#bottle.Bottle.add_hook
>Recipes
>http://bottlepy.org/docs/dev/recipes.html#using-the-hooks-plugin

毎リクエスト毎に実施する処理があればhookに置き換えていきたい
正規表現におけるグループ化と JavaScript の match メソッドの戻り値について

#正規表現で括弧を使うとグループが作られる

以下のような場合、配列 <i><b>result</b></i> には２つの値が入ります。

```sample.js

var result = 'ABC1000'.match(/^(ABC|XYZ)\d+/)

console.log(result[0]) // 'ABC1000'
console.log(result[1]) // 'ABC'
```

なぜ <i><b>result[1]</b></i> の値が返ってくるのでしょうか。
これは、括弧で囲った <i><b>`(ABC|XYZ)`</b></i> について、どちらのグループに属しているかを示す役割を果たしてくれているんですね。正規表現では括弧を使うことで特定の部分をグループ化することができます。

※正規表現内 <i><b>`^(ABC|XYZ)`</b></i> の部分は「文字列の最初に ABC もしくは XYZ がくる」を意味しています。

#グループ化すれば特定の部分だけを取り出せる

これは正規表現で文字列を検索した後、特定の部分のみを使いたいときに便利です。
例えば、最初の <i><b>ABC</i></b> ではなく、最後の数字の部分だけ欲しいのであれば <i><b>`\d+`</i></b> にも括弧をつけてあげれば取り出せます。

```sample.js
var result = 'ABC1000'.match(/^(ABC|XYZ)(\d+)/)

console.log(result[0]) // 'ABC1000'
console.log(result[1]) // 'ABC'
console.log(result[2]) // '1000'
```

また、どのグループに属するかを示す <i><b>ABC</i></b> を使わない場合、<i><b>`?:`</i></b> を付けてあげれば配列に入ってきません。

```sample.js
var result = 'ABC1000'.match(/^(?:ABC|XYZ)(\d+)/)

console.log(result[0]) // 'ABC1000'
console.log(result[1]) // '1000'
```

以上～
ParcelでVueアプリケーションを作る環境

昨年12月に、[この記事](https://qiita.com/soarflat/items/3e43368b2d767c730781)を見てWebpackから[Parcel](https://parceljs.org/)に乗り換えることを決意、[Vue](https://jp.vuejs.org/)派の私は、

「どうしてもParcelでVueを使いたい！」

しかし調べ始めてもネットには日本語どころか英語の知見もほとんど転がっていない状況。
(Reactは公式にもサンプルがあったはずですが)
おそらくこの記事を読んでいるあなたも同じ悩みを抱えていることではないでしょうか。

Parcelとの出会いからかれこれ7ヶ月、試行錯誤の末たどり着いたビルド環境を貴重な(?)日本語の知見(?)として公開します。

# テンプレ
まずは手っ取り早く、私がいつも使うVue + [Vuex](https://vuex.vuejs.org/ja/) + [vue-router](https://router.vuejs.org/ja/)をひとまとめにした[テンプレ環境](https://github.com/tomon9086/parcel-vue)と、サーバーも一気に開発したいんだ！！という方向けに[サーバー付きテンプレ](https://github.com/tomon9086/parcel-vue-with-koa)を上げておきます。
サーバーフレームワークは[Koa](https://koajs.com/)を使っています。

正直、私の好み全部載せ感否めませんが、参考にしていただければと思います。

# 解説することもない解説
たどり着いてしまえばかなりシンプルです。
最も重要なのはparcel-plugin-vueというパッケージです。
これを入れさえすれば.babelrcもほぼ白紙で動くのではないかと思います。

ひとつ、不思議なことがありまして、このテンプレをビルドすると、
parcel-bundler/parcel @1.7.0 support Vue Now. This plugin will be not recommended.
というwarningが出るのですが、いざparcel-plugin-vueを消してビルドさせてみると初回ビルドに非常に時間がかかる上、2回目以降 ( キャッシュのある状態で ) のビルドもparcel-bundlerを使った場合に比べて数十 ~ 数百倍 ( 数十~数百ms → 数s ) 時間がかかるようでした。
しかもparcel-bundlerを使って動いていたのと同じ設定同じファイルでブラウザは真っ白エラーはなしという最悪の事態。
まだParcelのVueデフォ対応は完璧ではないように思います。

> 追記 ( 2018.11.20 )
使おうとクローンしてきたら動かなくなってたので調査したところ、プラグインなどなにも要らなくなってたようです…
parcel-bundlerにvueがあれば動くようです。
すこし悲しいですが、素晴らしいことです。
[参考記事](https://qiita.com/kobaatsu/items/ed0dc0aaa739fd454a2b)

# 👋
以上参考になれば幸いです。

必要に応じて追記していきます。


## 参考
[Parcel 入門 ～Parcelはwebpackの代わりになるのか～](https://qiita.com/soarflat/items/3e43368b2d767c730781)
 ( と、上記事のイベントを聴いて口コミをくれた[zmirez](https://qiita.com/zmirez) )
GitBucketでプライベートリポジトリにあるファイルを得たい

tl;dr
------------

GitHub APIを使う感じに落ち着きました。互換API素晴らしい...。

```
curl --fail \
  -H "Authorization: token ACCESSTOKEN" \
  -H "Accept: application/vnd.github.v3.raw" \
  http://HOST:PORT/api/v3/repos/:owner/:repo/contents/:path
```

※`Accept`の内容でレスポンスが変わるので、ちゃんと上記の内容で指定する

### 参考

- https://github.com/gitbucket/gitbucket/wiki/API-WebHook
- https://developer.github.com/v3/repos/contents/#get-contents
- https://developer.github.com/v3/repos/contents/#custom-media-types


背景
-------------


### やりたいこと

クラウド上のあるサーバから社内で運用しているGitBucketへアクセスし、あるスクリプトファイルだけを得たい。
（※クラウド→社内にはSSHトンネルで繋いで一時的にアクセスできる状態にする。）

cloneでも得ることは出来るのですが「スクリプトだけ得られれば良いしcloneするほどでもないなー」と思い、ファイルをダウンロードで済ませられないかと考えました。


### やったこと

パブリックなリポジトリであれば、こんな感じにrawアクセスすればよいです。

`http://HOST:PORT/:owner/:repo/raw/:branch/:path`

(version 4.26.0の画面に出てくるrawボタンのURLはなぜかcommitを指してますが、ブランチ名を指定すればそれで得られます。)


また、プライベートリポジトリのcloneであれば [GitHubのHelpにあるUsing a token on the command line](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#using-a-token-on-the-command-line)と同じ内容で出来ます。

しかし、version 4.26.0では、rawアクセスはプライベートリポジトリでは使えないようです。Basicもtoken認証もダメな模様。

GitHub APIを実装してるし何とかならないかな、と調べたら冒頭にある通りでしたので、それで対処しました。
PHPでcsvファイルを読み込んで、前処理してから、別のcsvファイルにコピーする

PHP5.1以降使えるというSplFileObjectを使うと簡単。

```php
// 読み込むcsvファイル
$filepath = './query_result.csv';
$file = new SplFileObject($filepath);
$file->setFlags(SplFileObject::READ_CSV);

// 書き込むcsvファイル
$filepathForCopy = './query_result_copy.csv';
$fileForCopy = new SplFileObject($filepathForCopy, 'w');

// 読み込んで、前処理して、書き込む
foreach ($file as $line) {
    // 空行で無い場合のみ書き込む
	if(!is_null($line[0])) {
		// 必要な前処理を行う
		preprocessing($line[0]);
		// copy用csvファイルに書き込み
		$fileForCopy->fputcsv($line);
	}
}

function preprocessing($value) {
   // csvから読み込んだデータに行う前処理
}
```

(参考)
https://qiita.com/kazu56/items/06660b0dc8638a6c948f
https://centosinstall.com/programming/php/csv-splfileobject#CSV-3
http://php.net/manual/ja/splfileobject.fputcsv.php
AWS CLIでMFAを使う

MFA設定後、AWS CLIからMFAを使うためには一時的なクレデンシャルを発行する必要があります。

## 前提

IAMポリシーにこんな感じでConditionを設定するとMFAが有効になっていない時の設定を行うことができます。

ここで例えばEffectをDenyに、Actionをiam:DeleteUserとすると、MFA認証なしではDeleteUserができなくなります。

```js
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
```

MFAを設定しておけば、AWSマネジメントコンソールにログインしようとするとMFAのコード入力画面が勝手に出てきますが、AWS CLIの場合は出てきません。

## 本題

どうするのかというと次のコマンドを実行し、一時的なクレデンシャルを発行します。

```bash

aws sts get-session-token --serial-number (登録MFAのARN 例：arn:aws:iam::500000000:mfa/kter) --token-code (MFAコード)
```

環境変数にクレデンシャルを突っ込むワンライナーはこちら。

```bash
eval `aws sts get-session-token --serial-number (登録MFAのARN) --token-code (MFAコード) | awk ' $1 == "\"AccessKeyId\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_ACCESS_KEY_ID="$2 } $1 == "\"SecretAccessKey\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SECRET_ACCESS_KEY="$2 } $1 == "\"SessionToken\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SESSION_TOKEN="$2 } '`
```

### 参考にさせていただいたページ

https://www.slideshare.net/tetsunorinishizawa/aws-cliassume-role
T.B.AとT.B.CとT.B.Dの覚え方と意味

# 覚え方
- T.B.A：ちょっ、あんたバカァ、後でのお楽しみなんだから隠しときなさいよ♪
- T.B.C：ちょっ、あんたバカァ、調整中なんだから待ちなさいよ！
- T.B.D：ちょっ、あんたバカァ、どうしようか悩んでるんだから焦らさないでよ//


# 意味
どれも、まだ決まってない。っていう意味。
でも、覚え方に書いたように少しずつ違う。

- T.B.A：｢後日発表｣(To Be Announced)
- T.B.C：｢最終確認中｣(To Be Comfirmed)
- T.B.D：｢随時、決定していく｣(To Be Determined)

ちなみに、TBBは、
等価黒体温度か、
テトラ・ブロモ・ベンゾトリアゾールか、
インテルの並列化処理スレッディング・ビルディング・ブロックか、
鉄JIS規格シャックルのBB型。
Heroku PostgresのDBにターミナルからアクセスする


```
heroku login
```

```
heroku pg:psql -a [アプリケーション名]
```

## データベースの項目をみたいとき

```
\d l_subscription_migrate;
```

終了するときは

```
\q
```

## テーブルに登録されている件数をみたいとき

```
SELECT COUNT(*) FROM m_product; 
 count 
-------
   117
(1 row)
```

## 注意点
セミコロンを打たない限り、エンターは **改行** を意味することになるので注意。
なので、逆に言えば下記のように打つことが可能。

```
hoge-stg::DATABASE=> SELECT
hoge-stg::DATABASE-> count(*)
hoge-stg::DATABASE-> FROM 
hoge-stg::DATABASE-> m_product;
 count 
-------
   117
(1 row)
```
SparkDataFrameのTimeStampはSparkSessionのタイムゾーン設定の影響を受ける

# 概要

HPC環境で加工したデータをローカル環境で分析する、といったようなことはよくあることだが、
SparkのTimeStap型を持つDataFrameをparquetで保存する場合、元の環境のタイムゾーンの影響を受けるらしいので注意しようという話。
おそらくparquetで保存する場合、その環境のタイムゾーンの情報を一緒に持つみたい。

# タイムゾーンの影響を受ける例

1. UTCの環境で加工したデータを
2. JSTの環境で取り扱う


```python:データ加工(UTC環境)
data = (sc.parallelize([(2018-04-01 00:00:00)]).toDF(['t'])
        .withColumn('ts', to_timestamp('t', 'yyyy-MM-dd HH:mm:ss'))
data.write.parquet(path)
```

```python:データ読み込み(JST環境)
spark.read.parquet(path)
```

この場合、JST環境でデータを確認すると、UTC環境で保存した元データに9時間加えられた値が入る。

# 解決策

from_utc_timestampやto_utc_timestampでparquetで保存するデータのタイムゾーンを指定してやればよい。

```python:データ加工(UTC環境)
data = sc.parallelize([(2018-04-01 00:00:00, 'yyyy-MM-dd HH:mm:ss')]).toDF(['t'])
# 元データをJST環境で取り扱いたいので、
# JSTのTimestamp値を加工環境のUTCへタイムゾーンを変換
data = data.withColumn('ts', to_utc_timestamp('t', 'JST'))
data.write.parquet(path)
```
個人学習メモ＃７　ウェブ分析を少し学習

昨日から主にプログラム関係、たまにこういったウェブ分析などを毎日投稿することを目標に設定しました。

今年の６月から本格的に学び始めました。

ITに関して知識をつけていきたいなと思っておりますので、コメントやフォロー、よろしくお願いいたします。

ウェブ分析の3ステップ
-
１サイト内外のデータを収集

２収集したデータを分析する

３分析結果をもとに改善策を演じる


集計と分析は違う
-
集計・・・データを集めて計算すること

分析・・・ある物事を分解して、それらを成立させている成分・要素・側面を明らかにすること


・ cookieが拒否されているブラウザからのアクセスなどは正しくデータを取得できない

サイトの目標の可視化
-
・なぜサイトを立ち上げるのか
ーサイト単体での売上を増やす
ーブランドを認知してもらうために、多くの人にページを見てもらう
ーヘルプセンターを開設して、ユーザーの疑問を解決する


KGIーサイトの目的・目標（売上を20%向上させる）

KPIー達成度、主要業績評価指標・目標の達成に向かってプロセスが
適切に実行されているか（購入単価を１購入あたり1.5倍にする）

CSFーKGIに決定的な影響を与える要素
（売上を20%向上させるー「何を行えば売上が上がるのか」 "何が"の部分）


KGIの設定
-
・どれくらい、いつまでにを設定する
ーサイト単体の売上を１年間で15％向上させる
ーブランドを認知してもらうために、半年後に月間閲覧数を100万回にする
ーヘルプセンターを開設して、電話へのお問い合わせ数を20%削減する
目標設定方法がわからない場合は前回より少し高めに設定する

KPIの設定
-
・実行できるかどうか
・変動要素が小さい（大きいと施策の判定がわかりにくい）
・改善幅が大きい（直帰率が90%以上のページを50%以下にするービュー数が１００ｐｖしかない場合は改善したところでサイト全体に影響はほとんどないので、改善幅が大きい箇所を選ぶことが重要）


CSFの設定
-
・目標・目的を明確にしておく必要がある（購入回数を増やす）
・戦略（CSF）ごとに計測できる指標を決める
・戦略（CSF）を実現するための施策を考える
CodeBuild artifacts は AWS-KMS + binary/octet-stream として S3 に配置される

## TL;DR

- CodeBuild のアーティファクトを S3 に配置すると AWS-KMS で暗号化され、 `Content-Type: binary/octet-stream` がメタデータに付与される。
- アーティファクトに HTML などを含み、それをそのまま静的ウェブサイトとしてホストするには、 AWS cli を使って自分で S3 に cp する必要がある。

## 背景
parcel-bundler などのツールを使って静的な Web サイトを書いたので、それを S3 を使って配信したい。配信まわりの作業を自動化するために CodeBuild を使うことにした。

## ダメだったやり方
CodeBuild はビルド結果をアーティファクトとして（入力と区別するためにこれを "出力アーティファクト" と明示する場合もある） S3 などに自動的に配置する機能がある。 アーティファクトとして HTML を CodeBuild で S3 に配置するには以下のような buildspec.yml をプロジェクトルートに設置する。

```yml:buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - npm install
  pre_build:
    commands:
      - npm test
  build:
    commands:
　　　　　　　　　　 # `npm run build` すると dist ディレクトリに静的ファイルが生成されるとする
      - npm run build
artifacts:
  files:
    - '**/*'
  base-directory: dist
```

その上で CodeBuild のビルドプロジェクトの "アーティファクト" の "タイプ" 項目で "AWS S3" を選択し、ビルドを実行すると、たしかに dist ディレクトリ以下のファイルが全て指定した S3 バケットに設置されている。

しかし、これらのファイルは全て AWS-KMS で暗号化されているため、都度複合キーを指定しなければ静的ファイルとしてアクセスすることができない。また Content-Type が octet/steam なのでブラウザが正しく解釈することができない。

## AWS CLI を使う
アーティファクトを使えないので、自分で S3 に移動させる必要がある。

```yml:buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - npm install
      - pip install --upgrade awscli
  pre_build:
    commands:
      - npm test
  build:
    commands:
      - npm run build
  post_build:
    commands:
      - aws s3 cp --recursive dist/ s3://$WEBSITE_S3_BUCKET/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
```

S3 バケットの名前は `WEBSITE_S3_BUCKET` という環境変数として指定する。バケットにはパブリックアクセス権限を持たせず、コピーするファイルに都度権限を設定しているので（`--grants read=...`）、 `PutObject`だけでなく `PutObjectAcl` 権限が必要となる。
おいらのbash

```
HISTSIZE=50000

alias ll='ls -la'
alias vi='vim'
alias dock='docker-compose'
alias ctags="`brew --prefix`/bin/ctags"
alias launch-teachme="docker-sync start && docker-compose up"
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
java -jar $HOME/lib/java/plantuml.jar -tpng $@

GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\W\[\033[31m\]$(__git_ps1 [%s])\[\033[00m\]\$ '

if [ -f ~/.nodebrew/completions/bash/nodebrew-completion ]; then
    . ~/.nodebrew/completions/bash/nodebrew-completion
fi
```

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

# npm
export PATH="/usr/local/share/npm/bin:$PATH"
export PATH="$HOME/.rbenv/bin:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```
UiPath - Orchestrator Assets 注意点

# Assets とは
Orchestrator側から、ロボットで使用する変数の内容を管理できる。
また、同じロボットでも環境ごとに変数の値を変更することも可能。

## Text(String)型の変数を使用する際の注意点
- Orchestrator側の設定
    -  Name：Message(任意)
    -  Type：Text
    -  VALUE：こんにちは(任意)
-  Studio側の設定
    -  アクティビティ：Get Asset
        -  AssetName："Message"(※""が必要)

""をつけずにエラーが出て、フォーラムを調べて解決した。
pipがいきなりversion 18になったわけ

# 何の話？
今日何も考えず`pip install`を使っていたら、

```
You are using pip version 10.0.1, however version 18.0 is available.
```

version 10.0.1 → version 18.0 !?
ってなったので気になって調べました。

# Calendar Versioningを導入したらしい
[pipのリリースノート](https://pip.pypa.io/en/stable/news/)を見るとサラッと書いてありました。
> Switch to a Calendar based versioning scheme.

[Calendar Versioning (CalVer)](https://calver.org/)は要するに年月日などをバージョンに取り入れることで、バージョン情報にリリース時期の情報も含ませてあげようと言う考え方です。これによってソフトウェアが上手く動かなくなった時などに、ソフトウェアがアップデートされたタイミングや、その依存関係をすぐに確認して適切な対処ができるということですね。

18.0なので年の下二桁とマイナーバージョンだと思うのですが、個人的には月にしてくれたほうが分かりやすかったかな。

リリースサイクルも早めるみたいです。
> Switch to releasing a new, non bug fix version of pip every 3 months.
[シリーズ]初心者のためのプログラミングことはじめ〜目次〜

# PHP編

- [導入編](https://qiita.com/sho0211/items/96ac59878b7bfd3d73eb)
- [制御構文](https://qiita.com/sho0211/items/16d7b28a2fedc8e37005)
- [変数](https://qiita.com/sho0211/items/71821bf4bee94f45bb7a)
- [関数を使う](https://qiita.com/sho0211/items/7243b9baf03688e127a8)
- [関数を作る](https://qiita.com/sho0211/items/438b7652822b8c9bee03)
- [ファイルを分ける](https://qiita.com/sho0211/items/68c1aee2f2f1880a545c)
- 配列

# Ruby編（Rails含む）

- 導入編
- 他の言語を下敷きにした学び方
- 変数の種類とオブジェクト指向
- ビュー（erb)
オープンソースプロジェクトのコミュニティを育てる方法についての考察

# 背景
オープンソースという手法を使って、ベクトルタイルに関するプロセスをこなすスクリプトを共有し、それによりベクトルタイルを活用推進したいと私は思っているのですが、そのスクリプトについてのオープンソースコミュニティを作るには、明らかに「ソースコードを公開したら終わり」ではなく、むしろソースコードを公開するところは始まりでしかありません。

ここでは、Ben Balter の [Twelve tips for growing communities around your open source project](https://ben.balter.com/2017/11/10/twelve-tips-for-growing-communities-around-your-open-source-project/) を咀嚼し、いわば自分で自分を説得する形で、コミュニティを育てる方法を考察してみたいと思います。このエントリは、Ben Balter の記事の内容をすべてカバーしているとは限りません。Ben Balter の記事はこのエントリとは別にお読みになることをお勧めします。

# 1. 共通課題を解いているか
## 私は何をするか
私のプロジェクトは、ライブラリではなくてスクリプトを共有する試みですが、データに依存する部分は別個のスクリプトになるように切り出しを図っています。例えば、[modify-spec](https://github.com/hfu/modify-spec) や [stratify-spec](https://github.com/hfu/stratify-spec) がこの切り出しに当たります。この別個のスクリプトを編集する方法をドキュメント化することで、共通課題を解く形に変形する必要があります。

## 何が利益か
ここに留意することで、プロジェクトはよりモジュラーな、よりロバストなコードを手に入れることができ、コミュニティによる改善も期待できるようになります。そして、コミュニティは、私が解決しようとしている課題以外の課題に、プロジェクトの成果物を使えることになります。

# 2. (広く使われている) オープンソースライセンスを選んでいるか
ここは留意しています。非技術的な判断を含むので、本稿では割愛します。

# 3. プロジェクトの頒布チャンネルから GitHub レポジトリへのリンクがあるか
プロジェクトの頒布チャンネルはまだしっかりしたものがありません。ここは留意しています。

# 4. 技術ドキュメントを公表しているか
## 私は何をするか
プロジェクトの構想が概ね固まってきた現時点の段階において、私がやるべきことは、まさに技術ドキュメントを公表することです。コミュニティ拡大の相手の姿を見ながら、ドキュメントを作成・公表していく、というのが私のするべきこととなるでしょう。ドキュメントには次の３つの種類があるそうです。

### マーケティング資料
なぜあなたがこのプロジェクトを使う必要があるか書いたドキュメントです。重要ですね。

### エンドユーザドキュメンテーション
このプロジェクトの使い方です。私が作っているようなスクリプトでは、README.md をしっかり書けば対応できるように思えます。

### 技術ドキュメンテーション
プロジェクトがどのように働いているか、あるいはプロジェクトをどのように実装するか、といったことを書く文書です。通常、こう言った情報はコードに頼ることも多く、また、コードとの乖離が怖いので、書くことを避けてしまうような気がしますね。実際、一般的にもこの文書が描かれないことは多いようです。

技術ドキュメンテーションの目的は、メンテナのプロジェクト知識を潜在的なプロジェクト貢献者に移すことです。メソッドや関数のレベルでの機能について記載します。コードの中にインラインでも、自動生成であっても、手製であっても、プロジェクトをもともと期待していたものよりも大きくすることを主眼として書きます。

詳しい技術ドキュメントを用意することは、コードをより明確で目的に応じたものにします。また、曖昧さの余地を少なくします。

## 何が利益か
私のプロジェクトは短いスクリプトが多いので、技術ドキュメンテーションの規模は大きくならなさそうですが、大きくならなそうであればなおさら、短い時間をかけて技術ドキュメントを整備しておいた方が良さそうです。

# 5. 貢献の仕方を文書化する
いずれやらねばならぬでしょう。

# 6. サポートと開発を区別する
誤解を防ぐために、いずれ明確にしておいた方が良さそうです。

# 7. 新規貢献者を歓迎する

# 8. 自動テストを設定する

# 9. コードスタンダードを施行する
私のプロジェクトは JavaScript なので、StandardJS をコードスタンダードとしています。

# 10. コミュニティ管理を自動化する

# 11. コードオブコンダクトを採用する

# 12. 引き取ってくれる人を探す

# 結論
私にとっては、以下の３点が重要でした。
1. 共通の課題を解決する
2. 技術ドキュメンテーションを公開する
3. コードスタンダードを施行する
Pleasanterで入力値を確認して更新ボタンを非表示にする

## 一度、完了にした報告書を更新できないようにしたい
Pleasanterを利用して、報告書を作成、提出できるようなアプリを作ったのですが、「状況を完了にした後は事務担当者以外には更新できないようしたい」という要望がでてきました。

## アクセス制御で…
アクセス制御や拡張SQLを使用して、編集権限の操作をしてみたのですが、もともとテーブルに編集権限があると特定のユーザーに対して、書き込み不可にするのが難しいようです。

##拡張スクリプトでボタンを非表示に
ならば、少々乱暴ではありますが、状況の値を取得して完了だったら、更新ボタンを押せなくしてしまえと思いたち

```JavaScript:hideUpdateButton.js
function statusCheck() {
  if (originalStatus == 900) {
    // 更新及び、移動、削除ボタンを非表示にする
    $('[data-action="Update"]').hide();
    $('[data-action="MoveTargets"]').hide();
    $('[data-action="Delete"').hide();  
  }
}

$(window).on('load',function(){
  originalStatus = $("#Results_Status").val();
  statusCheck();
});
```
この時点では、更新、移動、削除ボタンが表示されていますが
![image.png](https://qiita-image-store.s3.amazonaws.com/0/256425/a3255f2f-7153-364f-a896-c5c390d787f2.png)

状況を完了にして、再読込すると、表示されなくなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/256425/41403380-8c42-bd56-e474-7a03f8958f10.png)

これで、編集画面を開いて、中身を書き換えても更新はできません。

## まとめ
あとは、ユーザーIDを取得して、条件に追加してあげれば、事務担当者には更新ボタンを表示したまま、一般ユーザーには更新不可にできそうです。
これだけだと、カンバンやAPIから更新できてしまいますが、とりあえずの対処としてはこれで十分な気もします。
SQLServerでRAISEERRORが使えなかったのはスペルミスのせいだった話

#経緯
昔のストアドプロシージャで例外処理のテスト
したい！

#軽く調べてやってみたけどできない
例外を発生させたい箇所に次のコードを挿入

```rb
RAISEERROR("!!ERROR!!", 12, 1)
```
↑ RAISEERRORがピンク色になるけど**不適切な構文**扱い

#問題に関する質問を発見
https://stackoverflow.com/questions/40785033/tsql-raiseerror-incorrect-syntax-following-msdns-guidelines

これじゃないっすか。
エジプトの太陽神 ラー Is Errorっていうコメントウケる。

#こうして正しく動いた
```rb
RAISERROR("!!ERROR!!", 12, 1)
```
RAISEERROR → RAISERRORに変えただけ。
ちなみにRAISERRORだと青色で表示されました。
よかった～。

#環境がSQLServer2012になったので
TRY～CATCHを使用するよう改修して、
THROWで例外発生テストをしようと思います。
What is Docker?

<h2>Containers</h2>
<p>To understand docker we should first understand the notion of containers</p>
<p>Containers are not new to software development industry and many developers and programmers have at least encountered one of these container technologies as <em>Zones, BSD jails, LXC</em></p>
<p>Docker indeed is an open-source based on Linux containers which run on top of the operating system. </p>
<h2>Docker Containers</h2>
<p>A Docker container wraps the application with everything that the applications needs to run as dependencies such system libraries, or system tools and so on.</p>
<p>the images that Docker creates a read-write system over it,besides that Docker creates a network interface to make the communication possible between the container and the local host.</p>
<h2>Difference between containers and VMs</h2>
<h4>what is VM?</h4>
<p>To understand the difference between VMs and containers we should first understand how the VMs works:</p>
According to Wikipedia <a href="https://en.wikipedia.org/wiki/Virtual_machine" target="_blank">VM</a>:
<p>A virtual machine (VM) is an emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized hardware, software, or a combination.</p>
<p>In other words, it is a guest machine that is running on the host machine, which provides it with the needed platform to allow it to run</p>
<h4>The main difference between Containers and VMs</h4>
<p>The one big difference between containers and VMs is that how they are using the host system : <ul>
<li>the <strong><em>VMs</em></strong> tend to isolate from the host system's kernel and use it as just a platform</li>
<li>the <strong><em>Containers</em></strong> tend to share the host system's Kernel with other containers</li></ul>
<h2>Why Docker becoming more popular</h2>
<ul>
<li><strong><em>Fast: </em></strong>very fast to set up and initiate in opposite of VMs which need more time because need to boot a whole virtual system</li>
<li><strong><em>Easy: </em></strong>very simple commands allows you to set your container that can run without worrying to be modified for that purpose</li>
<li><strong><em>Organisation: </em></strong>One application can be divided into different containers so you can have the data base in different container and your Rails app in another, and with Docker it is so easy to link different containers together.</li>
</ul>
<h2>Conclusion</h2>
<p>Hope this article made the notion of containers more easy to understand, and the slight difference between VMs and Containers more clear</p>
第10回AKB48世界選抜総選挙のデータをスクレイピングしてみました！

毎年６月になるとAKB48の総選挙で盛り上がりを見せています。2018年もやってきました。6月16日、「第10回AKB48世界選抜総選挙」（別名：AKB48 53rdシングル 世界選抜総選挙 ～世界のセンターは誰だ？～）の開票イベントが、愛知・ナゴヤドームにて開催されました。総投票数は3836652票だそうで、松井珠理奈さんが194453票で1位の座を獲得しました。

今年は100位まで発表され、みんなそれぞれの情報を了解したいので、この度[Octoparse](https://www.octoparse.jp/)という[スクレイピングツール](https://www.octoparse.jp/)を使って、メンバーのデータを一気に取得しています。（[Octoparseをダウンロード](https://www.octoparse.jp/Download)）

Octoparseでは、様々なデータ抽出方法があるのですが、今回は「リスト状となっているコンテンツからデータを抽出する」と「リストから詳細ページへ行ってデータを抽出する」の2種類の方法を全部使って紹介したいと思います。

 

さて、始めましょう！

 

#ステップ1：Octoparseでスクレイピングするサイトを開く

Octoparseには、ウィザード形式で手軽に行える「Wizard mode」と、自由度高い「Advanced mode」がありますが、今回は「Advanced mode」を利用してみます。

サイト：[https://www.akb48.co.jp/sousenkyo53rd](https://www.akb48.co.jp/sousenkyo53rd) を入力し、下部にある「Save URL」をクリックして、最初のステップを完了しました！
![Octoparseでスクレイピングするサイトを開く.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/1c0854bc-e3c9-506e-2080-1842efe0956e.jpeg)


ちなみに、インターフェイスの右上にある「ワークフロー」ボタンを開くと、タスクの実行順番を確認できます。
![「ワークフロー」ボタン.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/2defb266-8128-c15e-c553-068d478afcce.jpeg)

次のようになります。
![「ワークフロー」.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/976dab6c-867a-e23e-134b-6006b1be240e.jpeg)

 

 

 

 

#ステップ2：Webクローラーを定義する

すべての情報を読み込んだ後、スクレイピングするデータを指定します。


1.まず、各アイテムを全体として、クリックします。「Action Tips」パネルには選択結果を提示します。
![各アイテムを全体として、クリックする.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/8fd6e8b2-a658-d59c-a044-5f0027a90679.jpeg)

アイテムが16しか選択されません。ですから、100件になるまで選択されていないアイテムをクリックします。

![「Action Tips」パネル.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/051d60a6-0b30-129a-0f00-a8128f8d5f6b.jpeg)
 

2.「Loop click each element」をクリックした後、詳細ページに入ります。そうすると、スクレイピングするデータを指定します。
![スクレイピングするデータを指定する.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/9a459d8e-2a57-d42d-2715-ad294c558442.jpeg)
 

データを取得しました。データフィールドの下にあるツールは[データを再フォーマット](http://jp.octoparse.com/tutorial/re-format-data-extracted/)できます。
![データを再フォーマット.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/a0b53a04-c313-0a35-3d1d-3af2878736ae.jpeg)
 

3.タスクを正しく行うために、「Loop Item」の「Variable List」を修正する必要があります。以下のXpathを入力します。

**//DIV[@class="quickAnnouncementList"]/UL/LI/A**
![Xpathを入力する.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/f67cd57c-4a50-f93f-fc8d-5ebe8b87e9a4.jpeg)
 

4.詳細ページには得票数がないから、アイテムページで取得しかありません。ワークフローでは、「Extract data」のアイコン![「Extract data」のアイコン.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/44f64fb8-dbe0-c6c1-9b8f-db7e5523333a.jpeg)を「Loop Item」に引きずって、「Click Item」の上に置きます。
![「Extract data」を「Click Item」の上に置く.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/477f6b10-7106-70a2-33fd-f4c0c64e2971.jpeg)
 

それから、アイテムから得票数をクリックして、「Extract text of the selectedelement」を選択します。
![得票数をクリックする.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/99e11ddc-97da-bcba-f1df-3c5009123cbd.jpeg)

 

  

#ステップ3：クローラーを行い、データを抽出する

「Save」をクリックして、クローラーの設定を保存します。それから、「Start Extraction」をクリック、クローラーを行い、以下のようにデータを取得しました！CSV、Excelなどの形式で出力できます。
![データを取得.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/095d4346-05d8-6279-c691-1370119af80c.jpeg)

 

 
いかがでしたか？簡単にデータを取得できますね！皆さんもお試してみてください。
Commandメモ

```
# 7月２４日以降のファイルをリストアップする。
ls -ltr | awk '$6 == "7月" && $7 >= 24{print}'


# 7月２４日以降のDocxファイルをリストアップする。
ls -ltr | awk '$6 == "7月" && $7 >= 24{print}' | grep \.docx$


```
MySQLで、ランダムな文字列を挿入するだけのプロシージャ

# サンプル

ランダムな文字列を挿入するだけのプロシージャ

## テーブル用意

```
CREATE TABLE `test` (id INT(11) NOT NULL AUTO_INCREMENT, string VARCHAR(32), created_date TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
## プロシージャ作成
```
DELIMITER //
CREATE PROCEDURE f(n INT)
BEGIN
    DECLARE i int DEFAULT 0;
    WHILE i < n DO
        INSERT INTO `test` (`string`) SELECT MD5(RAND());
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;
```

## プロシージャ実行

```
CALL f(1000);
```

参考
- https://qiita.com/tayasu/items/c5ddfc481d6b7cd8866d
Gitで最初に覚えておくと便利な内容

git入門時の備忘録。ちなみにgitの開発者はlinusと[日本人のお方](https://github.com/gitster)。しゅごい。

# 基本的な操作(GUI、CUIどちらでも)
```
git init
git checkout

git add
git commit
git push

git clone
git pull (= git fetch & git merge)
```
開発を始めたら下記コマンドもよく使う。

```
git rebase
git cherry-pick
```


GUIを使うのが分かりやすくておすすめ。
[Source Tree](https://ja.atlassian.com/software/sourcetree)とか。
Rebaseの処理は、[GitUP](https://gitup.co/)が使いやすいように感じる。


# ".gitignore"というファイルの役割
コンパイルされてできたもの（.class）ファイルなどは無視する。


# コンフリクトの際の処理
マージツールを使うと楽だがなんだかんだ手で修正するのが早い気もしている。

[IntelliJでも、右クリックから Git->Resolve Conflictsみたいな感じでマージツール起動できる](
https://qiita.com/yoppe/items/fd03607d4d4f191d32dd#%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AA%E3%82%AF%E3%83%88%E8%A7%A3%E6%B6%88)

# sshkeyの登録
httpsを使う場合、毎回パスワード入力するの面倒なので、sshを使うと楽。

# ブランチの役割とかコミットの整理とか
Git Flow, GitHub Flow

# 良記事
- https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0