OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]transaction do時のafter_commitでsaved_change_to_attribute?などの扱い

常識なのかわかりませんが、ハマったので備忘録程度に

## after_commitが動かない
`after_commit :hoge, if: saved_change_to_attribute?`
みたいなことをしていたんですが、動かないんです。
**after_saveだと動くのに**

## 該当処理
```ruby
after_commit :hoge, if: saved_change_to_status?

enum role: {
  admin: 0
  general: 1
}

enum status: {
  active: 1000
  suspend: 2000
}

def hoge
  なにかしらの処理
end
```
みたいなモデルが存在して、hogeが走るきっかけとして

```ruby
def fuga
  User.transaction do
    user.admin!
    user.active!
  end
end
```
というのがありました。

`user.active!`でstatusを更新しているので、当然`saved_change_to_status?`はtrueでコミット後にhogeが動くと思っていたら、動かないんです。

## previous_changes
fuga実行時になにが起きてるのか、previous_changesを吐かせて見てみました。
すると、`user.admin!`時のroleカラムの変更しかないんですよね。

```
{"role"=>["general", "admin"], "updated_at"=>[Mon, 03 Sep 2018 17:26:50 JST +09:00, Mon, 03 Sep 2018 17:26:51 JST +09:00]}
```
みたいな感じで。
どうやら**先に走った分しか渡してくれない**模様

## 結論
急いでたので一旦順番を入れ替えることでしのぎました

```ruby
def fuga
  User.transaction do
    user.active!
    user.admin!
  end
end
```
こんな感じで

しかし、本来なら

```ruby
def fuga
  User.transaction do
    user.admin
    user.active
    user.save!
  end
end
```
みたいな感じにするのが適切だったんじゃないかと(未検証)
クラウド障害情報

# 障害情報
どこにあるのか良く忘れるので、記載。

## firebase
https://status.firebase.google.com/

## AWS
https://status.aws.amazon.com/

## G Suite
https://www.google.com/appsstatus#hl=ja&v=status

# 以下追記

## Heroku
https://status.heroku.com

## Microsoft Azure
https://status.azure.com/ja-jp/status

## Pivotal Web Services
https://status.run.pivotal.io
【React Native】FlatListのデータが変更されてもrenderされない

## 対処法
`<FlatList>`の`extradata`に再レンダリングするための基準となるプロパティ値を設定します。

https://facebook.github.io/react-native/docs/flatlist.html#extradata

```jsx
      <FlatList
        data={items}
        extraData={value}
        ...
```

https://github.com/facebook/react-native/issues/14125
SCKOSEN 2018に参加しました

#はじめに
9/1,2と佐世保高専主催の高専セキュリティコンテストにオンラインで参加しました。
SECCONには過去何度か参加経験ありますがその度に全く知識が身についていないので備忘録も兼ねてWriteUpです。

###結果
最終成績が16/35で総合得点は1200点です。クッソ微妙です。

そのうちの自分が解いたやつ+終わってから理解したやつを書いていきます。

#02 ログインしたい!
何も考えずにとりあえずIDAにぶち込んだらIDAが標準でASCIIコードを文字に起こしてくれるもんだから一瞬でFLAGが分かりました

#06 exchangeable if
![out.jpeg](https://qiita-image-store.s3.amazonaws.com/0/286097/33c4a469-a763-5287-82e8-13265e64e79a.jpeg)
こんな感じの画像が渡されました。なんで中央じゃなくて微妙に右下に寄ってるのか気になりましたが全く関係なかったです。
この画像、画像タイトル`md5=2009d1c114ed83f57cf8adde69fd6ca8`となっているので、最初画像のハッシュ値かと思い調べましたが違いました。ファイル破損も疑ったので何度か確認しましたが画像のハッシュ値ではないことが分かりました。

じゃあSCKOSEN{~xxxx~}のハッシュ値か？と思いコーディングタイムです。

```c:main.c
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

int compute_md5(unsigned char * src, unsigned int src_len, unsigned char * buffer) {
	MD5_CTX c;
	MD5_Init(&c);
	MD5_Update(&c, src, src_len);
	MD5_Final(buffer, &c);
	return 0;
}

int main(){

	char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int length = strlen(str);
	char pass[] = "SCKOSEN{sHDtF1xxxxNLTIWp}";
	char answer[] = "2009d1c114ed83f57cf8adde69fd6ca8";
	unsigned char md[MD5_DIGEST_LENGTH];
	char mdstr[33];

	int i,j,k,l,m;

	for(i=0; i<length;i++){
		for(j=0; j<length;j++){
			for(k=0; k<length;k++){
				for(l=0; l<length;l++){
					pass[14] = str[i];
					pass[15] = str[j];
					pass[16] = str[k];
					pass[17] = str[l];
					compute_md5(pass, 25, md);

					for(m=0; m<16; m++){
						sprintf(&mdstr[m*2], "%02x", (unsigned int)md[m]);
					}
					//printf("%s\n",pass);
					//printf("%s\n",mdstr);
					if(strcmp(mdstr, answer) == 0){
						printf("%s\n",mdstr);
						printf("%s\n",pass);
						return 0;
					}
				}
			}
		}
	}
	return 0;
}
```
結果は`SCKOSEN{sHDtF1qOLZNLTIWp}`でした。~~OpenSSLの導入に手間取った~~

#14 アカウントを奪え
![aa0478a5-22d1-48ad-aba2-1658c2af6487.png](https://qiita-image-store.s3.amazonaws.com/0/286097/0e688f6d-891f-6f9c-f873-be340e975e2c.png)
SQLインジェクションの知識はありましたがブラインドSQLインジェクションの知識は無かったためかなり手間取りました。かなり頭の悪い手法を取りました。

普通は`SUBSTR`句を使うようですが`LIKE`句を使用しました。

1. まずは kosenjoh' AND pass LIKE '%a%' -- とa~zまでの文字の中でどの文字が使われているか確認
2. 次に　kosenjoh' AND pass LINE '_' -- とアンダーバーの数を増やしていきパスワードの総文字数の確認
3. 総当たり

1~3の流れを***人力で***行いました。盛大に笑ってください。大体30~40分くらいかかりました。
SCKOSENが終わった後に他の方のWriteUpでブラインドSQLインジェクションの存在を知って一人勉強会開催したので次は多分大丈夫だと思いたい。

#22 ディスクが足りない！
`file file`
をしてファイル形式特定して何度も解凍を繰り返して取得しました。

#21 謎のファイル
これはSCKOSEN終了後に調べて分かりました。

まず手に入るfileはzip形式なのでrenameして解凍したらrename_me.xmlとかwordフォルダとかが出てきて、まずrename_me.xmlを読むと
`<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">`
とあったのでこのURLをgoogleさんに投げるとOpenXMLと返ってきました。なんじゃいそりゃとさらに調べると、WordやExcelファイルは拡張子を.Zipにして解凍するとxml形式でソースが読めるとのこと。
`.docx`を解凍すると今回のようなファイルツリーになるようなので、`rename_me.xml`ファイルくんを恐らく本来の名前であろう`[Content_Types].xml`に変えて、またファイルをzip圧縮してから拡張子を.docxに変えると見事wordで開けました
![スクリーンショット 2018-09-03 17.48.44.png](https://qiita-image-store.s3.amazonaws.com/0/286097/ebc2f083-f8f2-202c-44f2-b1e535f78c9f.png)
これがフラグですね

#感想
今まで参加したSECCONは何から何までさっぱりで解けてもせいぜい1問とかだったのですが、今回は4問も解けたので一番楽しかったですね。これを機にksnctfとかの恒常ctfを解いてもっと勉強しようと思います。
あとBash on Windowsはダメですね、32bit実行ファイルが軒並み実行できずにかなり苦戦しました。最終的に諦めましたが。
[Kubernetes] 特定のPVCに紐づけて後付けでPVを作成する方法

# シナリオ(実際に手元で必要になった状況)
オープンソースのツールをhelmチャートを使用して導入しようとしている。helmを使用して導入したところいくつかの Persistent Volume Claim(PVC)が同じような条件(サイズ、ポリシー)で作られた。ただ対応するPVが存在していないので、バインド待ちの状況となっている。

- namespace
    - pvc-namespace
- persistent volume claim
    - pvc-a : 10 GiB, RWO
    - pvc-b : 10 GiB, RWO


Persistent Volume(PV)を作成したいが普通に作ってしまうとどのPVCにバインドされるかわからない。あらかじめバインド対象のPVCを明示する形でPVを作成したい。

# 方法
Persistent Volumeを作成するときの定義ファイルにclaimRef属性を追加して、対象の PVC の namespace および name を記載してしまう。そうするとPVの作成時に該当するnamespaceおよびnameのPVCを探してすぐにBindしてくれる。

```shell:shell
kubectl create -f pv-a.yaml
```

```yaml:pv-a.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-a
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: pvc-namespace
    name: pvc-a
  nfs:
    path: /nfspath/pv-a
    server: nfshost.domain
```

# IBM Cloud Private のUIから作成する場合
Persistent Volume 作成のダイアログで主要なパラメータを指定した後で「JSONモード」をOnにしてclaimRef属性を手でjsonに追加することで同じことができる。

```json:pv-a.json
{
  "apiVersion": "v1",
  "kind": "PersistentVolume",
  "metadata": {
    "name": "pv-a"
  },
  "spec": {
    "capacity": {
      "storage": "10Gi"
    },
    "nfs": {
      "path": "/nfspath/pv-a",
      "server": "nfshost.domain"
    },
    "accessModes": [
      "ReadWriteOnce"
    ],
    "claimRef": {
      "kind": "PersistentVolumeClaim",
      "namespace": "pvc-namespace",
      "name": "pvc-a"
    },
    "persistentVolumeReclaimPolicy": "Retain"
  }
}

```

# 環境
kubernetes 1.4 以降

# 参考リンク
Stackoverflow QA
[Can a PVC be bound to a specific PV?](https://stackoverflow.com/questions/34282704/can-a-pvc-be-bound-to-a-specific-pv)

Kubernetes issue
[pv/pvc pre-binding fixes #24682]
(https://github.com/kubernetes/kubernetes/pull/24682)
関数のあれこれ

##関数の実引数へのアクセス

```js:js
function doit(a, b, c) {
  console.log(arguments.length);
  console.log(arguments[0], arguments[1], arguments[2]);
}

doit(1);
```

##再帰関数

再帰関数とは関数内部で自身を呼び出す関数。
再帰関数が常に自分自身を呼び続けると、実行は終わらない。
そのため、停止処理を書く必要がある。

今回はreturn 1が停止処理になっている。

```js:js
function loop(n){
  if (n != 0){
    return n * loop(n-1);
  }
  else{
    return 1;
  }
}

loop(5); //5 * 4 * 3 * 2 * 1
//120
```

##スコープ
* グローバルスコープ
* 関数スコープ
* 各ウィンドウ（タブ）、各フレーム（iframe）ごとにグローバルスコープがある。
詳細は変数のところにあるので割愛。


##シャドーウィング
スコープの小さい、同名の変数でスコープの大きい変数を隠すこと。バグの要因になる。

```js:js
const n = 1;
function f() {
  const n = 4;
  console.log(n);
}
//4
```

##コールバック関数

関数の引数には関数が渡せる。これを利用して
**「ある特定の処理が終わったっら、引数に渡した関数の処理を実行する」**のような処理のフローを制御することができる。

このとき引数に渡される関数のことを、**「コールバック関数」**という。

処理の制御は非同期処理の場合などで利用される.
その場合promiseなどに置き換えられることが多い。

```js:js
//コールバックを呼ぶ関数
function call(callback) {
  console.log('come on! callback!');
  callback();
}

//渡されるコールバック関数
var person = function () {
  console.log('Im here');
}

call(person);
//'come on! callback!'
//'Im here'
```

**クリックイベントなどもコールバック関数が用いられる。**

```js:js
$('#div').click(function(e) {  
  console.log(e.currentTarget);
  return false;
});
```

**setTimeout関数のような非同期処理の場合にも使われる**

要素が0.5秒ごとに動くイメージ。

```js:js
const div = document.getElementById('js-div');

var a = function(callback) {
  setTimeout(function() {
    div.classList.toggle('is-right');
    callback();
  }, 500);
};

var end = function() {
  setTimeout(function() {
    div.classList.toggle('is-hide');
  }, 1000);
};
a(end());
```

**これをpromise処理に変換すると**

```js:js
var a = function() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      div.classList.toggle();
      resolve();
    }, 500);
  });
};


var end = function() {
  return new Promise(function(resolve, reject){
    setTimeout(function() {
      div.classList.toggle('is-hide');
      resolve();
    }, 1000);
  })
};

a().then(end);
```
bitbucketのAPIの仕様でハマったポイント

## はじめに

bitbucketのAPIを叩いていてハマったポイントがあったので備考録的に残しておきます
これは2018/09/03時点での仕様なので今後変わる可能性もあります

## 元々

下記はユーザー名とパスワードで叩いていますがヘッダーにアクセストークン情報を入れても叩けます

```bash
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches?page=1" | jq .
```

こんな感じでブランチ一覧を取ってきて、必要であれば2ページ目3ページ目を以下のような感じで取得していました

```bash
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches?page=2" | jq .
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches?page=3" | jq .
```

これで動いていたはずですがある日突然エラーレスポンスが返ってくるようになりました

```json
{
  "type": "error",
  "error": {
    "message": "Invalid page" 
  }
}
```

## 問い合わせ

bitbucketのサポートへ問い合わせたところオフセットの次ページを参照するにはレスポンスで返ってきている`next`の値を使って欲しいとのことでした

```bash
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches" | jq .
```

レスポンス

```json
  "pagelen": 1,
  "values": [略],
  "page": 1,
  "next": "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches?page=8xhd"
```

## 修正後

1ページ目の取得

```bash
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches" | jq .
```

2ページ目の取得

```bash
curl --user {ユーザー名}:{パスワード} "https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/refs/branches?page=8xhd" | jq .
```

以下これをループすることで全ブランチを取得することができました

## おわりに

bitbucketのAPIのリファレンスを見ている限りpageはintegerのつもりでいましたが普通に文字列が返ってきていました
普通に連番で良いのではと思ってしまいますが現状はこれが仕様のようです
でもrepositoriesのエンドポイントは普通に連番なんだよなぁ…
bitbucketのAPIを叩く人は注意です

## 参照

branchesのエンドポイント
https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/refs/branches

repositoriesのエンドポイント
https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories
eachをmapに変換し、コードを簡潔にしよう！

#はじめに

はじめまして！
今回はeachをmapに置き換えてコードをより簡潔にしようと思います。
mapってどんなメソッド？って方は[こちら](https://ref.xaio.jp/ruby/classes/array/map)
#バージョン
Ruby 2.4.0

#実際にやってみよう
今回は以下のコードを簡潔にしてみようと思います！

```ruby

numbers = [1,2,3,4,5,6]
str_numbers = []
numbers.each do |n|
  str_numbers << n.to_s
end
p str_numbers

#出力結果
["1", "2", "3", "4", "5", "6"]
```

#mapを使って簡潔にしてみよう
```ruby
numbers = [1,2,3,4,5,6]
str_numbers =  numbers.map do |n|
                 n.to_s
               end
p str_numbers
#出力結果
["1", "2", "3", "4", "5", "6"]
```


#ワンライナーでかいてみよう

do...endの代わりに{}でもブロックが作れるため以下のような書き方ができる。

```ruby:⓵
numbers = [1,2,3,4,5,6]
str_numbers = numbers.map { |n| n.to_s }
p str_numbers

#出力結果
["1", "2", "3", "4", "5", "6"]
```

ワンライナーで以下のようにも書ける。

```ruby:⓶
numbers = [1,2,3,4,5,6]
str_numbers = numbers.map do |n| n.to_s end
p str_numbers
#出力結果
["1", "2", "3", "4", "5", "6"]
```
ただワンライナーで書く場合、⓶は読み辛いので⓵の書き方をお勧めします。


#&とシンボルを使って更に簡潔に
```ruby
numbers = [1,2,3,4,5,6]
str_numbers = numbers.map(&:to_s)
p str_numbers

#出力結果
["1", "2", "3", "4", "5", "6"]
```

最終的にここまで簡潔にすることができました(￣∀￣)
<font color="Red">**&:を使用するときの注意点(mapメソッド使用時)**</font>

```ruby

1.ブロック引数が１つのみ
  #今回のケース: ブロック引数はnのみ
2.ブロックの中で呼び出すメソッドに引数がない
　#今回のケース:　to_sメソッドに引数がない
3.ブロック引数に対して呼び出すメソッドは１回
　#今回のケース:　s.to_s以外の処理がない
```

以上の条件を満たす時に使用できます。
お疲れ様でした(^_^)


#この記事を読んでくれた方へ
「ここがおかしい」や「もっとこう書いた方がいいよー」など意見がございましたら、御手数ですがコメントなどで、ご指摘いただければ幸いです。
よろしくお願いします！！

#参考文献
[rubyのeach,mapの違い](https://manji602.hatenablog.com/entry/2016/01/01/145346)
[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/exec/obidos/ASIN/4774193976/manji602-22/)
[rubyリファレンス](https://ref.xaio.jp/ruby/classes/array/map)
UiPathでテキストファイルの文字列置換を行う

## あるテキストファイルにある文字列を別の文字列に置換する方法
### 置換する方法１

1. ReadTextFileアクティビティで対象のファイルを読み込む（プロパティのエンコーディング設定を忘れずに）
2. Assignアクティビティの右辺にを入れると置換された文字列が左辺に出力される。  
読み込んだテキストを格納した変数.Replace(置換前文字列,置換後文字列)

##### ワークフロー例
・sample.txt
読み込むテキストファイル
・temp
読み込んだテキストを格納する変数
・result
変換後の結果を格納する変数
・Assignの右辺
temp.Replace("hello","good by")

![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/43c6a733-8271-6ae5-6e4f-40274caf8689.png)

##### 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/526185d1-4fb2-b828-c4b2-a3f6225ea39a.png)

### 置換する方法２
1. ReadTextFileアクティビティで対象のファイルを読み込む（プロパティのエンコーディング設定を忘れずに）
2. Microsoft.Activities.Expressions.ReplaceStringアクティビティを利用する。  
プロパティのExistingValueに変換前の文字列  
Inputに変換対象のテキストを格納する変数  
Replacementに変換後の文字列  
Resultに変換結果を格納する変数  
を設定する。

##### ワークフロー例
・sample.txt
読み込むテキストファイル
・temp
読み込んだテキストを格納する変数
・result
変換後の結果を格納する変数

![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/43d033ce-4b24-5344-19da-0a0a4bb4684c.png)
ReplaceStringアクティビティのプロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/f3c91c01-f908-313b-1696-b631a911d552.png)


##### 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/b9e14c83-4b69-6a44-9ba2-763c649a33cc.png)
Centos起動時に出るエラーメッセージ

現在CentOS 7.1をインストールする作業をしています。

インストールが完了した後、再起動をすると以下のようなエラーメッセージが出ます。
(起動時)

 [0.000000]Dected CPU family 6 mode 

l 85
 [0.000000]Warning:Intel CPU model- this hardware has not undergone upstream
 [0.001000] tsc: Fast TSC calibration failed

原因が分かりません。助けてください(；д；)
Python3 で SQLite を利用するときにエラーの対処法

# エラー内容

>  File "/home/hoge/.pyenv/versions/3.6.2/lib/python3.6/site-packages/zeep/cache.py", line 67, in __init__
>    raise RuntimeError("sqlite3 module is required for the SqliteCache")
> RuntimeError: sqlite3 module is required for the SqliteCache

↑ は googleadsのパッケージで利用した際のエラー内容

# 解決方法
SQLite（sqlite-devel）をインストールしてからpythonをビルドし直さないといけない。


### 参考URL
http://yoshida-ahiru.hatenablog.com/entry/2017/08/13/020007
vs2010でmanaged directx その13

#概要
c#で、3Dやりたかった。
Xファイルを読んでみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/7e3754c2-553b-38aa-737f-e76527e4d0fe.png)


#サンプルコード


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        private Device device = null;
        private Mesh mesh = null;
        private Material[] meshMaterials;
        private Texture[] meshTextures;

        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            PresentParameters pp = new PresentParameters();
            pp.Windowed = true;
            pp.SwapEffect = SwapEffect.Discard;
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pp);
            ExtendedMaterial[] materials = null;
            mesh = Mesh.FromFile("Dolphin1.x", MeshFlags.SystemMemory, device, out materials);
            if (meshTextures == null)
            {
                meshTextures = new Texture[materials.Length];
                meshMaterials = new Material[materials.Length];
                for (int i = 0; i < materials.Length; i++)
                {
                    meshMaterials[i] = materials[i].Material3D;
                    meshMaterials[i].Ambient = meshMaterials[i].Diffuse;
                    if (materials[i].TextureFilename != null)
                    {
                        meshTextures[i] = TextureLoader.FromFile(device, materials[i].TextureFilename);
                    }
                }
            }
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 1.0f, 1000.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            device.Transform.Projection = Matrix.PerspectiveFovLH((float)(Math.PI / 4), 1.0f, 0.1f, 10000.0f);
            device.Lights[0].Type = LightType.Directional;
            device.Lights[0].Diffuse = Color.White;
            device.Lights[0].Ambient = Color.Red;
            device.Lights[0].Enabled = true;
            device.Clear(ClearFlags.Target, Color.DarkBlue, 1.0f, 0);
            device.RenderState.Lighting = true;
            Matrix rotateMatrix = Matrix.RotationY(Environment.TickCount / 5000.0f);
            device.BeginScene();          
            device.SetTransform(TransformType.World, rotateMatrix * Matrix.Translation(new Vector3(0.0f, 0.0f, 0.0f)));
            for (int i = 0; i < meshMaterials.Length; i++)
            {
                device.Material = meshMaterials[i];
                device.SetTexture(0, meshTextures[i]);
                mesh.DrawSubset(i);
            }
            device.EndScene();
            device.Present();
            this.Invalidate();
        }
    }
}


```

以上。
vagrant，Rails5.2.1，webpack-dev-serverが動かせるようになった時のメモ

## 環境
- vagrant
 - ホスト Windows10
 - ゲスト Ubuntu 18.04.1 LTS
- Rails5.2.1
 - turbolinks, sprockets, coffee無し 
- Ruby2.5.0

## 設定
```config/webpacker.yml
  # webpacker.ymlより抜粋
  dev_server:
    https: false
    # locahostからvagrantのIPに変更する
    host: 192.168.33.10
    port: 3035
    # locahost:3035からvagrantのIP+portに変更する
    public: 192.168.33.10:3035
    hmr: false
    inline: true
    overlay: true
    compress: true
    disable_host_check: true
    use_local_ip: false
    quiet: false
    headers:
      'Access-Control-Allow-Origin': '*'
    watch_options: {
      ignored: /node_modules/,
      # ここを追加
      poll: true,
    }
```

あとは通常通り起動する

```:bash
bin/webpack-dev-server
rails s
```  
## 最後に
ホストと仮想環境とのIPアドレスの仕組みが謎すぎるので
勉強する。
ベクトルの繰り返し要素を1つにして返す


## やり方

```R
> v <- c(1, 1, 5, 5, 5, 5, 2, 2, 6, 6, 1, 3, 3)
> v[v != dplyr::lag(v, default = !v[1])]
[1] 1 5 2 6 1 3
```

## なぜできるか

lagが一つずらしたものを返すので、それを使う

```R
> dplyr::lag(v, default = !v[1])
 [1] 0 1 1 5 5 5 5 2 2 6 6 1 3
> v
 [1] 1 1 5 5 5 5 2 2 6 6 1 3 3
```

## 参考
- https://stackoverflow.com/questions/10769640/how-to-remove-repeated-elements-in-a-vector-similar-to-set-in-python
Carthageの古いバージョンを入れる（ダウングレード）

# Facebook SDK でエラーが。。。
とあるリポジトリをクローンし、`carthage update --platform iOS`するとFacebookSDKでエラーがでました。
![Screen Shot 2018-11-15 at 11.01.51.png](https://qiita-image-store.s3.amazonaws.com/0/15297/4d538b42-0c5b-952a-9e17-246acb12b39b.png)

```
Build Failed
	Task failed with exit code 65:
```

下記リンクにある通りの旧バージョンのCarthageをいれれば解決する模様。
[Carthage update fails on "FBSDKIntegrationTests" #244](https://github.com/facebook/facebook-sdk-swift/issues/244)

# githubで入れたいverのコミットハッシュを探す
[https://github.com/Homebrew/homebrew-core/search?p=1&q=carthage&type=Commits&utf8=%E2%9C%93](https://github.com/Homebrew/homebrew-core/search?p=1&q=carthage&type=Commits&utf8=%E2%9C%93)

# install
`brew install https://github.com/Homebrew/homebrew-core/raw/(インストールしたいコミットハッシュ)/Formula/carthage.rb`

```ver0.29の場合
brew install https://github.com/Homebrew/homebrew-core/raw/45dd24d8dfa7a2fb69812c678ceb34be0c16e295/Formula/carthage.rb
```

# refs.
[How to install older version on carthage](https://stackoverflow.com/questions/48505431/how-to-install-older-version-on-carthage)
[HomebrewでCarthageの過去バージョンをインストールする](https://qiita.com/usayuki/items/2d26aacd81c717a366a3)
sidekiqの管理画面でキューの削除ができなかった場合の対処

## はじめに

sidekiqでの処理に不具合があり大量にキューが溜まり続けてしまった
原因を突き止めて改修はしたもののそのまま改修をリリースしてしまうと過去のキューが捌かれてしまう
過去分は全部捨ててしまいたかったが管理画面から「kill」「削除」しようとしてもできなかったので何とかしたかった

## 対応

以下記事の対応をすれば画面からもキューの削除ができるらしい
https://qiita.com/shouta-dev/items/7d56b8424cf0a0458657
試してはいない

今回はコマンドをサーバで直接叩いてキューを消しました

## コマンド

以下記事を参考にしました
https://qiita.com/gabu/items/cfb0044b1485a649510e

```bash
bundle exec rails c

# rails console内にて
Sidekiq::RetrySet.new.each {|job|
  Sidekiq::RetrySet.new.find_job(job.jid).delete
}
```

1回の実行では何故か全ては消えなかったので複数回実行し全て削除できました

## 追記

後からみたらなんかすごく無駄なことをしていることに気付いてしまいました

```bash
bundle exec rails c

# rails console内にて
Sidekiq::RetrySet.new.each {|job|
  job.delete
}
```

これでいいですね…

## おわりに

sidekiq意外と扱いが面倒くさい…
次同様の対応をしなければならなくなったら根本対応を検討する
SQL文の強制停止機能を試す （Oracle Database 18c）

Oracle Database 18c の新機能である SQL 文の強制終了機能を試してみました。負荷が高いSQL文を実行してしまった場合に、外部から SQL 文のみを強制的に停止することができます。

# セッションの切断
Oracle Database 18c よりも前のバージョンでは、実行中の SQL 文を外部から停止するにはセッションを強制切断するしかありませんでした。外部からセッションを強制的に切断するには ALTER SYSTEM KILL SESSION 文または ALTER SYSTEM DISCONNECT SESSION 文を実行します。パラメーターとしてセッション識別子（SID）、セッション・シリアル番号（SERIAL#）、インスタンス番号（INST_ID）を指定します。これらの情報は GV$SESSION ビューから入手できます。

```
SQL> SELECT INST_ID, SID, SERIAL# FROM GV$SESSION WHERE USERNAME='SCOTT';

   INST_ID        SID    SERIAL#
---------- ---------- ----------
         1        395      39236

SQL> ALTER SYSTEM KILL SESSION '395, 39236, @1';

System altered.

```
Oracle Real Application Clusters 環境でなければインスタンス番号は不要になり、検索するビューも V$SESSION ビューになります。
切断されたクライアントはにはエラー「ORA-00028 your session has been killed」が発生して処理を継続できません。

```
...
        C1 C2
---------- -----
    145014 data1
    145015 data1
    145016 data1
    145017 data1
    145018 data1
    145019 data1
    145020 data1
ERROR:
ORA-00028: your session has been killed

145020 rows selected.

```

# SQL 文の停止
Oracle Database 18c では、セッションを維持したまま SQL 文の実行だけを停止できるようになりました。SQL 文を停止するには ALTER SYSTEM CANCEL SQL 文を実行します。指定するパラメーターは ALTER SYSTEM KILL SESSION 文に指定した情報に加えて SQL識別子（SQL_ID）を追加するだけです。

```
SQL> SELECT INST_ID, SID, SERIAL#, SQL_ID FROM GV$SESSION WHERE USERNAME='SCOTT';

   INST_ID        SID    SERIAL# SQL_ID
---------- ---------- ---------- -------------
         1        395      50025 6cgru9ybzwr89

SQL> ALTER SYSTEM CANCEL SQL '395, 50025, @1, 6cgru9ybzwr89';

System altered.

```

SQL識別子を省略することもできます。その場合には現在実行中の SQL 文がキャンセルされます。キャンセルされた　SQL 文には、エラー「ORA-01013: user requested cancel of current operation」が発生してSQL文が停止されます。

```
...

        C1 C2
---------- -----
    246984 data1
    246985 data1
    246986 data1
    246987 data1
    246988 data1
    246989 data1
    246990 data1
ERROR:
ORA-01013: user requested cancel of current operation

246990 rows selected.

SQL>
```

# マニュアル
マニュアルは [こちら](https://docs.oracle.com/cd/E96517_01/sqlrf/ALTER-SYSTEM.html#GUID-2C638517-D73A-41CA-9D8E-A62D1A0B7ADB) です。

# 実は
この機能は Oracle Database 12c Release 2 (12.2) でも[実行できることがわかりました](https://twitter.com/TanelPoder/status/1037172882944786432)。
ただしマニュアルには記載されておらず、Oracle Database 18c の新機能ガイドに載っているのでサポート対象かはわかりません。

```
SQL> SELECT BANNER FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME='SCOTT';

       SID    SERIAL#
---------- ----------
       159      20923

SQL> ALTER SYSTEM CANCEL SQL '159, 20923';

System altered.

```
UiPathStudioを使っていて使用頻度の高いショートカット

## はじめに
今年の７月ごろからUiPathを本格的に扱う様になりました。
ワークフローを作成する中で様々なTIPSが貯まってきましたので
ここで整理も兼ねてまとめたいと思います。
初回はショートカットについてです。
なお、UiPathStudio 2018.1.4 を使用しています。

#### アクティビティの有効化と無効化
無効化したいアクティビティを選択した状態
Ctrl + d
無効化されたアクティビティのコメントアウト部分を選択した状態
CTrl + e

#### Try Catchで囲む
Ctrl + t
選択したアクティビティをTry Catchで囲む


#### 変数作成
変数を使用したいアクティビティのフォームにフォーカスした状態
Ctrl + k
を押すとSet Nameと表示されるので、作成する変数名を入力する。

#### ユニバーサルサーチ
Ctrl + f
UiPathStudio中の何でも検索できる。
ある変数がどこで使ってるか分からなくなってしまった時に便利

#### 対象選択の一時停止
選択状態（Indicete on screenなど）
F2
を押すと一時停止して3秒後に選択を再開する。

#### 保存
Ctrl + s
書くまでもないと思いますが・・・
Monacaで作ったアプリで動画のエンコードは可能なのか

Monacaを用いてアプリ開発を行っているものです。
プラグインを検索していたところffmpeg.jsを見つけたのですが、これを使ってアプリ上で動画のエンコードを行うことは可能なのでしょうか。javascriptでの構文がいまひとつ調べても分からないので質問させていただきます。
Monappyのトラブルの原因を推測してみた


# Monappyで不正出金事件が発生

一昨日の9月1日に、MonappyでMonacoinが不正に出金されるという事件が発生しました。

[MonappyにおけるMonacoinの不正出金につきまして](https://medium.com/@IndieSquare/monappy%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bmonacoin%E3%81%AE%E4%B8%8D%E6%AD%A3%E5%87%BA%E9%87%91%E3%81%AB%E3%81%A4%E3%81%8D%E3%81%BE%E3%81%97%E3%81%A6-bdb1179e2bb9)

ユーザ間で気軽に投げ銭ができるプラットフォームとして楽しく遊べるサイトだっただけに、悲しいです。

今後、他のサービスでも同様のトラブルが起こらないか心配です。
悪意のある人にとってはポピュラーな手口かもしれないので、再発防止のために詳細な流れが気になりました。
高負荷時に発生する事象とのことです。
自分の頭の整理のため、どういった流れで発生したのか推測してみました。

公式の説明文からの推測なので間違っている部分も多いと思います。
添削・ご指導いただけるとありがたいです。

# 原因の推測

気になったのは、[公式発表](https://medium.com/@IndieSquare/monappy%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bmonacoin%E3%81%AE%E4%B8%8D%E6%AD%A3%E5%87%BA%E9%87%91%E3%81%AB%E3%81%A4%E3%81%8D%E3%81%BE%E3%81%97%E3%81%A6-bdb1179e2bb9)の「攻撃の経緯」の「詳細」にある、以下の文です。


> MonappyからMonacoinを送信する際は、monacoindという別のサーバ上のアプリケーションと通信する仕様になっています。この通信がタイムアウト等で失敗した場合はサーバダウンなどで送金に失敗しているとみなして、取引をロールバックする仕様となっていました。また、ギフトコードの処理に関してはデータベースのトランザクション機能等を利用しており、本来同じギフトコードを二重に使用することはできないようになっていました。しかし、高負荷状態でギフトコードを連続して使用しようとした場合、通信を受け取ったmonacoindの応答に時間がかかり、サイト側ではタイムアウトとなってロールバックされたあとにmonacoind側では送金が行われていました。この結果、一つのギフトコードから複数回送金されたものと考えられます。また、この攻撃に際し少額のMonacoinを大量に送付しておくことでcoind送信時の負荷を増大させようとする試みも確認しました。

Monappy上の残高を先に書き換えてmonacoindに送金処理を行うロジックになっていて、本来はmonacoindでの送金処理は即時に行われ、Monappy側に応答を返すはずが、monacoindが高負荷の場合は、下記の図のようにMonappy側がタイムアウトした後でmonacoindでの送金処理が行われたために、実際の残高とMonappy上の残高が食い違ってしまったというのが、推測です。

# タイムアウトとタイミングの図

![monappy-trouble (2).png](https://qiita-image-store.s3.amazonaws.com/0/142577/36026828-80c3-a88f-495d-ffd13ff920fa.png)



# もしそうなら、どうすれば良かった？
対応としては、残高書き換えとmonacoindへの送金依頼の順番が逆(外部システムとのやり取りを先に行う)なら良かったのかと思いました。


# 余談:シーケンス図を描くツール
今回のシーケンス図ぽい図を描くのに、[draw.io](https://www.draw.io/)を使いました。ユーザ登録なしで使えるのがいいですね。
しかし作成に小一時間かかってしまった上に、図が汚い。。。
何かいいツールをご存知の方いましたら教えてください m_()_m
pecoを Ctrl+g で抜ける

[peco](https://github.com/peco/peco) はデフォルトでは `ESC` キーで抜けれます（キャンセルできます）が、Emacs使いとしては `Ctrl+g` でキャンセルしたいもの。

そんなときは `~/.config/peco/config.json` のキーマップ設定に `"C-g": "peco.Cancel"` を追記しましょう。
（ファイルがまだ存在しなければ、新規作成します）

```json:~/.config/peco/config.json
{
  "Keymap": {
    "C-g": "peco.Cancel"
  }
}
```

これで `Ctrl+g` で **peco** から抜けれるようになります。

詳細は [pecoのREADME、Keymapsの項](https://github.com/peco/peco#keymaps) を参照してください。
OctoberCMSにComposerでComposer非対応プラグインをインストールする

## 概要
下記に該当するOctoberCMSプラグインは、そのままではComposerで適切にインストールできないので対処が必要になる。

* [Packagist](https://packagist.org/)に登録されていない
* ソースコードにcomposer.jsonが含まれていない
* composer.jsonが含まれているが適切なパッケージ定義になっていない

自分のプロジェクト（または自分のプラグイン）のcomposer.jsonで、ソースを取得してくる場所を指定し、プラグインが定義しているべき情報を代わりに定義してやれば、composerでインストール＆管理することができる。

## 取得場所の指定
自分のプロジェクトまたはプラグインのcomposer.jsonに`repositories`を定義して、ソースコードの取得場所を指定する。これによりPackagsitに登録されていなくてもダウンロードできるようになる。

```json
{
    ...
    "require": {
        ...
        "simplicitylab/blogfeaturedvideo": "dev-master",
        ...
    },
    "repositories": [
        ...
        {
            "url": "https://github.com/simplicitylab/blogfeaturedvideo",
            "type": "git",
        },
        ...
```

これで、`composer update`すると、GitHubのmasterブランチからソースを取ってきてくれる。しかし、これだとvendorディレクトリにインストールされてプラグインとしては認識されない。

## プラグインとして認識させる
プラグインとして認識させるには、自分のcomposer.jsonで代わりにそのプラグインの情報を定義してやる。ここの例だと、最終的には下記のようにすれば、プラグインディレクトリにインストールされてコンポー年やモデルなどが認識されるようになる。

```json
{
    ...
    "require": {
        ...
        "simplicitylab/oc-blogfeaturedvideo-plugin": "dev-master",
        ...
    },
    "repositories": [
        ...
        {
            "type": "package",
            "package": {
                "name": "simplicitylab/oc-blogfeaturedvideo-plugin",
                "type": "october-plugin",
                "version": "dev-master",
                "source": {
                    "url": "https://github.com/simplicitylab/blogfeaturedvideo",
                    "type": "git",
                    "reference": "master"
                }
            }
        },
        ...
```
だいたい見ればわかると思うが、`"type": "october-plugin"`を指定することで適切にプラグインディレクトリにインストールしてくれる。

そして、注意すべきなのは`name`で、ネームスペースと関係するディレクトリ構成を決定するものなので、ネームスペースを確認して決定する必要がある。

このプラグインの場合、ソースコードを見るとネームスペースは下記のようになっている。

```PHP
namespace Simplicitylab\BlogFeaturedVideo;
```
なので、ディレクトリ構成は`plugins/simplicitylab/blogfeaturedvideo`となる必要がある。

よって作者名は`simplicitylab`。また、プラグイン名はOctoberCMSのネーミング規約から`oc-`プレフィックスと`-plugin`ポストフィックスをつける。

ということで、パッケージ名は`simplicitylab/oc-blogfeaturedvideo-plugin`となる。すべて小文字。これを上記のように`name`と`require`のところに記述する。
このプラグインは比較的そのままのパッケージ名になったが、中にはGitHub上のレポジトリ名がパッケージ名と大きく異なるケースもある。

## ソースコードがcomposer.jsonを含んでいた場合
代わりのパッケージ定義をしてやることで、元々あったcomposer.jsonが読み込まれなくなるようだ。
つまり、もし、元々あったcomposer.jsonに依存パッケージが定義されていた場合は、これらを作成した代わりのパッケージ定義に転記してやる必要がある。作成したパッケージ定義の`package`の中に`require`を転記する。

## Class not foundになる場合

<img width="705" alt="Screen Shot 2018-09-03 at 14.32.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/70c44e6a-4d14-40ba-593c-7130f3153028.png">

ファイルが存在しているのに、クラスが見つからないというエラーが発生した場合、再度、先の手順で勝手に決めた作者名とパッケージ名が全て小文字になっているか確認する。

作者名とパッケージ名作者名とパッケージ名がキャメルケースなどになっていると、この様なエラーが発生するようだ。
CentOS5でfdiskが使えない場合の対処法

OSの初期状態では，`/sbin`にPATHが通っていないらしい。　　

binaryは`/sbin/fdisk` にあるので，絶対パスを指定して使う。　　

もしくは以下のコマンドでパスを通す(bash)。

`export PATH=/sbin:$PATH`

なお，fdiskを実行するには管理者権限(root)が必要。


参考：
https://www.linuxquestions.org/questions/linux-software-2/bash-fdisk-command-not-found-804767/
ftpで接続して、サーバの中身をまるごと取得（バックアップ）する方法

## ftpの仕組み
ftpでつなげることが出来るということは、ftp:// でURL的に接続出来るわけです。
ユーザID、パスワードがわかっていれば

ftp://ユーザID:パスワード@サーバ名（IPでも可）/
で、ユーザID、パスワード聞かれること無くftpのIndexを表示できます。

## wgetで再帰的に取得
ftpでURL的に接続出来るということは、wgetで中身を取れます。
wgetのコマンドは

```
-r：再帰的に取得（--recursive）
-l：深さを設定（--level）、0で際限無く取れる
```

のパラメータが付けれるので、結果

```
wget -r -l 0 ftp://ユーザID:パスワード@サーバ名（IPでも可）/
```
で再帰的にファイルを取得できます。

## ちょろっとハマったこと
ユーザIDがXXX@XX.XX.jp みたいに@を含む場合は@をエンコードして%40にしましょう。
Android SDK Manager をコマンドラインから操作

## パッケージの一覧を表示
下の情報が表示される

- インストール済みパッケージ
- 利用可能なパッケージ
- 更新可能なパッケージ


```
android-sdk/tools/bin/sdkmanager --list
```

## インストール
```
android-sdk/tools/bin/sdkmanager --install "platforms;android-N"
```

## アンインストール
```
android-sdk/tools/bin/sdkmanager --uninstall "platforms;android-N"
```
HTML特殊文字をDOMに埋め込んでHTML表示させる方法

いじっているシステムでこのような対応が必要だったのでその備忘録

# 事前知識
### HTML特殊文字
HTMLタグ(< や >)を文字列として識別させたいときに`&lt;`などHTML特殊文字を使用します
https://html.spec.whatwg.org/multipage/syntax.html#escapingString

```html:簡単な例
<!-- 普通のHTMLマークアップ -->
<h1>本日は晴天</h1>

<!-- HTML特殊文字 -->
&lt;h1&gt;本日は晴天&lt;/h1&gt;
```

# 実践
### DOMParserでHTML特殊文字化された文字列を読み込む

```javascript
const parser = new DOMParser();
const stringContainingHTMLSource = "&lt;h1&gt;本日は晴天&lt;/h1&gt;";
const doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
```

### DOMに埋め込んでHTML表示させる
DOM要素を取得して置き換え

```javascript
const contents = document.getElementById("contents");
contents.innerHTML = doc.body.innerText;
```

ちなみに`doc.body.innerText`の出力は`<h1>本日は晴天</h1>`
`doc.body.innerHTML`の出力は`&lt;h1&gt;本日は晴天&lt;/h1&gt;`となります

contents.innerHTML に doc.body.innerHTML入れようとしてハマってた...

# 完成形
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <div id="contents"></div>
  <script type="text/javascript" src="./index.js"></script>
</body>
</html>
```

```javascript:index.js
const parser = new DOMParser();
const stringContainingHTMLSource = "&lt;h1&gt;本日は晴天&lt;/h1&gt;";
const doc = parser.parseFromString(stringContainingHTMLSource, "text/html");

const contents = document.getElementById("contents");
contents.innerHTML = doc.body.innerText;
```
インスタンスメソッドとクラスメソッド

超基礎メモ。
# メソッドとクラスの関係

```ruby:
class Hello

    def sayHi(name)
        puts "hi! #{name}"
        return ""
    end

    sayHi("yukaaaah")
    /* sayHi "yukaaaah"　　 実はカッコは省略可能 ←驚き！ */
    p sayHi

end
```

- メソッドはクラスの中に定義する。
- 引数はカンマ区切りで何個でもOK。デフォルト値も渡せる。
- メソッド内で定義された変数は外では使えない。
- ＠：インスタンス変数
    - クラスのインスタンスごとに作られる。
    - 他のフィーチャでも使いたい場合に、インスタンス変数を使う。


# メソッドの入れ子

http://jutememo.blogspot.jp/2012/02/ruby.html

2. Ruby でネストしたメソッドは定義できるが、変数のスコープに注意
-> 手続きオブジェクトを使って、外側の変数を参照する。
* `lambda{ }` または `proc{ }`
* Ruby ではオブジェクトのインスタンス変数はクラスと何のつながりもない。インスタンス変数は値を代入したときに初めて出現する。

3. 内部スコープから、外部スコープを参照できない
プログラムがスコープを切り替える場所は3つ
 - クラス定義
 - モジュール定義
 - メソッドよひだし  
クラス・モジュールはすぐに実行されるが、メソッドは呼び出した時にのみ実行

4. トップレベルに定義したメソッドの所属先は `Object`
`self` ->  カレントオブジェクト
toplevel の`self` -> `main`
シェルスクリプトでjsonの値を取得する

下記のようなjsonの値をシェルスクリプトでぶっこ抜く備忘録。
`jq`コマンドが入っていない場合は別途インストール。


```json

{"path":"/","code":"200","remote":"xxx.xxx.xxx.xxx","agent":"useragent"}
```

```bash
# agentをぶっこ抜く
agent=$(echo $json | jq '.agent' | cut -c 2- | rev | cut -c 2- | rev)
```
Swift 4.2の変更点メモ

## Swift4.2の改善
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/8a3e58d9-8028-9eda-251c-53fa7dfc1715.png)

* より速いコンパイル速度
* 新しい言語機能により効率が向上し、テンプレートコードが削除される
* Swift SDKの改善
* バイナリ互換性の向上

## Swift5の改善
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/f163168f-63a4-5c48-08d4-77ad575e4880.png)

* バイナリ互換性が安定します。
 * コンパイルされたバイナリは、他のコンパイラで作成されたコードと相互運用できます。
 * SwiftランタイムをOSで格納ことができ、これまでAPPに含めるより、APPの起動スピードや操作効率を大幅に向上させ、APPのサイズを縮小できる

## Buildの改善
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/6376f08a-9aba-80cf-b776-51348e3d15c0.png)

* 最大3倍速くなった
 * Swiftのみ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/80d5a167-083e-aa94-4651-c91f65a16eb7.png)

* Compilation ModeをOptimization Levelから切り離します。
* Compilation Modeの推奨設定
 * Debug→Incrementalモードを有効にしてコンパイル速度を上げ
 * Release→Wholeモジュール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/14d3f1e8-6a1d-dc42-c772-b6abb9b6778d.png)

* Optimization Level
 * Optimize for Sizeを追加された
 * バイナリファイルは10％から30％削減されますが、パフォーマンスは5％低下します

## RunTimeの改善

### ARC
#### Swift4.2以前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/9883d9c7-742f-fd5b-bb7f-fd17eb0d7c8b.png)

* 「Owned」モード
* 呼び出し元はRetainを担当し、呼び出し先はReleaseを担当します。

#### Swift4.2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/fbdd4873-7ce1-3e2a-2801-796a378d8115.png)

* 「保証」モード
* 呼び出し元はオブジェクトのライフサイクルを管理し、呼び出し先はReleaseに対して責任を持ちません。 
* 無駄なRetain、Releaseコードの削減、パフォーマンスの向上、バイナリファイルのサブセットのサイズの縮小が可能になります。

### Small String

* 文字列のエンコーディングが24バイトから16バイトに変更され
* 文字列のサイズが十分小さい場合、スタックに直接保存し、ヒープメモリを割り当てる必要がなく、パフォーマンスが向上し、メモリ使用量が削減されます。

## そのた機能改善

### CaseIterable

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/5a067a13-1a6a-0702-91c2-fdfe3ffe91d7.png)

### EquatableとHashableの自動合成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/20eaf8e9-5ac5-615a-98c4-4d8283323d87.png)


### Random

やっとarc4randomと別れた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/7fe4ea09-9dd9-1800-5f3f-8dcd7e8afd7f.png)

### 環境変数の変化

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/e14b4f91-29d1-e811-c256-2c5dd497461a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192913/16e75b07-2265-a294-282f-a0a1ae001ccd.png)
WebアプリをMacアプリ化する

## 方法


Fluid(<http://fluidapp.com/>)を使います。

1. ダウンロード
Freedownloadをクリックして、Fruid.appを実行。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148170/09a2dae4-b4be-823e-36f9-62b905eb4f99.png)

2. URLを指定し、アプリケーションを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148170/cf2c5d8a-ae42-f0fe-4c8d-b72fb41b3fa0.png)

3. [外部サービスによるログイン認証が必要なアプリケーションの場合は、手順3. が必要。]
ログインした時にブラウザにコールバックされるのを防ぐ。

メニュー > Preferences > Whitelist

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148170/b98d06cd-1278-47a9-fb40-dafaacb068ff.png)

ここで、外部サービスのリンクをホワイトリストに追記する。
Google認証の場合は、以下の2つが必要。
(1) *accounts.google.com*
(2) *google.com*/accounts/ServiceLogin*

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148170/d768e849-46ab-aba9-189a-140d1c2d267a.png)
ionicでfirebaseへ認証できるように

# ionic環境準備とプロジェクトを作成
* 参照： https://qiita.com/alingogo/items/fc5eece405cdc6ffc025

# Firebase configとアプリ設定
### Email/Password認証方法を有効する
* Firebase console画面 -> 開発 -> Authentication -> ログイン方法
* メール/パスワードを有効にする

### Firebaseへ接続できるように
* Project Overview -> アプリを追加 -> Web platformを選択する
* 以下のような情報をコピー

```
    apiKey: "XXX",
    authDomain: "XXX.firebaseapp.com",
    databaseURL: "https://XXX.firebaseio.com",
    projectId: "XXX",
    storageBucket: "XXX.appspot.com",
    messagingSenderId: "XXX"
```

* ionicプロジェクトのsrc/config.tsファイル内容を追加

```
export const fCon = {
	fireSetting: {
            apiKey: "XXX",
            authDomain: "XXX.firebaseapp.com",
            databaseURL: "https://XXX.firebaseio.com",
            projectId: "XXX",
            storageBucket: "XXX.appspot.com",
            messagingSenderId: "XXX"
	}
};
```

# モジュールのインストール
### インストール

```
$ npm install firebase angularfire2 --save
```

### config内容を導入
* app.modules.ts

```
import { AngularFireModule } from 'angularfire2';
import { AngularFireAuth } from 'angularfire2/auth';
import { firebaseConfig } from '../config';

AngularFireModule.initializeApp(fCon.fireSetting),
```


# サービス実装
``` js:src/service.ts
import { Injectable } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import AuthProvider = firebase.auth.AuthProvider;

@Injectable()
export class AuthService {
	private currentUser: firebase.currentUser;

	constructor(public bAuth: AngularFireAuth) {
		bAuth.authState.subscribe(user => {
			this.currentUser = user;
		});
	}

	signInWithEmail(c) {
		return this.bAuth.auth.signInWithEmailAndPassword(c.email,
			 c.password);
	}

}
```



# ログインページ実装
* ログイン画面を省略して、ロジック部分のみを説明する

```typescript:login.ts
import { AuthService } from '../../services/auth.service';

private auth: AuthService


login() {
		let d = this.loginForm.value;

		if (!d.email) {
			return;
		}

		let c = {
			email: d.email,
			password: d.password
		};
		this.auth.signInWithEmail(c)
			.then(
				() => this.navCtrl.setRoot(HomePage),
				error => this.loginError = error.message
			);
	}

```
ドラッグドロップでadb install(Windows/Mac)

# はじめに
よく、ブラウザからapkをダウンロードしてUSB接続したAndroid端末にインストールすることがあるのですが、いちいちコマンドプロンプトやターミナルを開いてコマンドを打つのが面倒だったので、Windows/Macそれぞれでスクリプトを作ってみました。

# Windows
バッチファイルを作ります。
たった2行。(1行でも出来ます)

```:adb_install.bat
adb install -r %1
timeout 60
```
引数にもらったapkをインストールします。
このバッチファイルにapkをドラッグドロップすれば、adbインストールが走ります。
![Screenshot_227.png](https://qiita-image-store.s3.amazonaws.com/0/192408/f2bd545a-aad4-088f-c52a-36e56c830a2b.png)
timeoutは、インストールした結果を見たいけど、結果が見られればウィンドウは必要ないので自動的に消えるようにしているだけです。
ステータスバーのクイック起動にバッチファイルを入れておけば、どこでもapkをドラッグドロップすればインストールが出来て便利です。
![Screenshot_226.png](https://qiita-image-store.s3.amazonaws.com/0/192408/bf50c5d6-628d-4816-a7c2-fd3c99cfbc87.png)



# Mac
最近Macを使うようになったので、Mac用にAppleScriptを書いてみました。
メッセージは仮で入れています。

```applescript:adb_install.app

set result to display dialog "ファイルをドラッグドロップしてください" default answer ""
set apk_path to text returned of result
display notification apk_path
do shell script "source ~/.bash_profile
path=\"" & apk_path & "\"
echo $path
adb install -r $path
"
display notification "インストール完了"

```
<img width="434" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/192408/337462c4-8d96-a9cf-987c-dcd119e3aaa0.png">
スクリプト起動後、テキストボックスにapkファイルをドラッグドロップすればOK。
出力結果を流したりはまだ出来ていないので、成功しているか失敗しているかわからないのが玉に瑕。
shellのコンソール出力を変数に入れられれば良いのだけれど・・・。

do shell scriptをすると、adbのパスが通っていないので、ここではbash_profileを読み込んでいます。
直接adbのパスをexportしても問題ないと思います。

alfredで呼び出せるので、どこでもダイアログを呼び出せて便利です。
<img width="564" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/192408/d627d9d9-d0b7-ae97-6ae5-9f9a5e14439a.png">

Macに関しては恐らく知識がないだけで、windowsの様に簡単にできるもっといい方法がある気がしています。
「こんな感じでできるよ」という方法をご存知の方がいらっしゃれば、是非アドバイスいただきたいです。
fileタイプのinput→localStorage及びlocalStorage→canvas

# 概要

今[画像ファイルをパスワードとして用いることのできるのモジュール](https://github.com/Hayakuchi0/imageregist)をGithubで作っているけども、画像ファイルをcookieみたいに保存し、それをcanvasにする方法がないか探したところlocalStorageなるHTML5用のすごい機能を発見
しかし実際にlocalStorageに画像ファイルを放り込んだり、放り込んだ画像ファイルをcanvasとして読み込む方法を書いた日本語の資料があんまり見当たらない
というわけで備忘も兼ねてQiitaに書いてみる

# fileタイプのinput→localStorage

案外見当たらないので調べるのに苦労したが、英語の資料にそれっぽいのがあった
もう少し効率的なソースがあると思うので、ありましたらコメントお願いします

```html
<!DOCTYPE html>
<html>
  <script>
    function readFile() {
      var inputTag = document.getElementById('inputFile');
      var reader = new FileReader();
      reader.onload = function() {
        var img = new Image();
        img.onload = function() {
          var canvas = document.createElement('canvas');
          var context = canvas.getContext('2d');
          canvas.width=img.width;
          canvas.height=img.height;
          context.drawImage(img,0,0);
          localStorage.setItem("hoge", canvas.toDataURL());
        };
        img.src=reader.result;
      };
      reader.readAsDataURL(inputTag.files[0]);
    }
  </script>
  <body>
    <form>
       <input type='file' id='inputFile' onchanged="readFile();"></input>
    </form>
  </body>
</html>

```


# localStorage→canvas

どういう形式で保存されているのか、getItemで取得した内容をconsole.logで出力するとBase64だったことが判明
なのでimg.srcにgetItemの戻り値を指定することを試してみると、ものの見事に成功

```javascript
var img = new Image();
img.onload = function() {
  var canvas = document.createElement('canvas');
  var context = canvas.getContext('2d');
  canvas.width=img.width;
  canvas.height=img.height;
  context.drawImage(img,0,0);
}
img.src=localStorage.getItem("hoge");
```

# 参考資料
https://qiita.com/yasumodev/items/e1708f01ff87692185cd
https://hacks.mozilla.org/2012/02/saving-images-and-files-in-localstorage/
プログラミング言語　ブラウザ実行環境

プログラミング言語図鑑
http://www.socym.co.jp/book/1108

http://www.99-bottles-of-beer.net/


プログラミング言語　ブラウザ実行環境
https://ideone.com/

https://www.tutorialspoint.com/

https://wandbox.org/
.basファイルをテキストエディタで開こうとすると「パラメーターが間違っています。」

ググッても、すぐには出てこなかったので、一応記録しておきます。

#前提条件：
　.basを開く既定のプログラムがメモ帳などのテキストエディタ
#エラーメッセージ：
 「パラメーターが間違っています。」
#症状：
  1.ダブルクリックで開こうとすると上記エラーメッセージ
  2.右クリ⇒「プログラムから開く」⇒「既定のプログラムの選択」でも同じエラー
#直接原因：
  ファイルサイズが0バイトだった為
#根本原因：
  不明
#環境：
  Windows7（32bit）※ちなみにWin10(64bit)では上記と同じ条件でも、エラーは発生しなかった
VS Code 1.26 の気になった新機能(まとめ&小ネタ)

[Visual Studio Code](https://code.visualstudio.com) の バージョン 1.26 がリリースされたので、[リリースノート](https://code.visualstudio.com/updates/v1_26)を眺めてみて気になった機能をチェックしてみた。(以前のバージョンを眺めてみた時のやつはこちら。[1.25](https://qiita.com/12345/items/e7b5b9954f5d721be2c8) / [1.24](https://qiita.com/12345/items/935770c6a3515ca80472) / [1.23](https://qiita.com/12345/items/627298550aab19f1d8a6) / [1.22](https://qiita.com/12345/items/8253a1eee38b6741905e) / [1.21](https://qiita.com/12345/items/71ce73c52cf2232fc10c) / [1.20](https://qiita.com/12345/items/1390c7cab11d968e7691) / [1.19](https://qiita.com/12345/items/a331c014a9d3fa9dac0e) / [1.18](https://qiita.com/12345/items/9b827138b5044ca82482) / [1.17](http://qiita.com/12345/items/28d83361341ce3ff3c9c) / [1.16](http://qiita.com/12345/items/5215293977dde2149c0f) / [1.15](http://qiita.com/12345/items/cebf4b4e9bfb2d2ef771))

# [階層リンク(パンくずリスト)](https://qiita.com/12345/items/da13fc34e25b51de52c5)
開いているファイルの階層パスを辿れる機能。ファイル内のシンボル移動も行える。

# [エディタグループの自動最大化](https://qiita.com/12345/items/584f093e457b061f70c8)
アクティブエディタを自動的に最大化する機能。

# [相対パスのコピー](https://qiita.com/12345/items/097e7b332b2ce68d676d)
ファイルの相対パスを取得する機能。
　

**以下、小ネタ集。**

# [Windows版が管理者権限なしでインストール可能に](https://code.visualstudio.com/updates/v1_26#_user-setup-for-windows)
今まではインストーラが全ユーザ用だったので管理者権限が使えない環境ではZIP版を使用する必要があったが、ユーザごとのインストールに変わったため、管理者権限が使えない環境でもインストーラが使えるようになった。


# [表示メニューの構成変更](https://code.visualstudio.com/updates/v1_26#_view-menu-cleanup)
`表示`メニューの項目数がかなり多くなっていたので、新たに`外観`サブメニューが作られ、スッキリしたメニュー構成に変更になった。

v1.25|v1.26
---|---
![view_menu_old.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/4cb02a85-f732-c7f8-889f-a84fe25698dc.jpeg)|![view_menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/ec037fde-3280-d449-1c3c-9415075bcc4c.jpeg)

# [統合ターミナルでの矩形選択](https://code.visualstudio.com/updates/v1_26#_column-selection)
統合ターミナルで矩形選択が可能になった。`Alt`を押しながらマウスドラッグすると矩形選択が行える。

# [統合ターミナルでの行跨ぎでの単語選択](https://code.visualstudio.com/updates/v1_26#_improved-multiline-support)
統合ターミナルで行を跨いだ単語をダブルクリックした際、従来だとその行の範囲でしか単語選択がされなかったが、ちゃんと行を跨いで選択がされるようになった。

v1.25|v1.26
---|---
![term_word_old.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/20dab1d4-64c1-6f2e-6172-d1b99ba46514.png)|![term_word.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/1f16469e-5f53-443c-d031-cdaa1b30bc1c.png)
iOSでタイトルとURLをマークダウンでコピーするブックマークレット


タイトルとURLをマークダウンでコピーするブックマークレットです。

下記で紹介されていた`x shoji様`のブックマークレットに少しだけ手を加えさせていただいてマークダウンでコピーできるようにしました。
[iOS(iPhone)でWebページのタイトルとURLをワンタップでコピーするBookmarklet - Qiita](https://qiita.com/xshoji/items/619a5c3cceb310a2b35a)


**タイトルとURLをマークダウンでコピーする**

```javascript
javascript:var%20global=window;global.COPY_TO_CLIPBOARD=global.COPY_TO_CLIPBOARD%7C%7C%7B%7D;global.COPY_TO_CLIPBOARD.copyToClipboard=function()%7Bvar%20a=document.createElement(%22textarea%22);a.textContent=%22%5B%22+document.title+%22%5D(%22+document.URL+%22)%22;var%20b=document.getElementsByTagName(%22body%22)%5B0%5D;b.appendChild(a);a.contentEditable=!0;a.readOnly=!1;a.setSelectionRange(0,999999);document.execCommand(%22copy%22);b.removeChild(a)%7D;global.COPY_TO_CLIPBOARD.copyToClipboard();
```

***

**このページで実行した結果**

```
[タイトルとURLをマークダウンでコピーするブックマークレット - Qiita](https://qiita.com/maboy/private/2a4a4641b514703031b8)
```  

**Qiitaのトップで実行した結果**

```
[Qiita](https://qiita.com/)
```
Pandas で Multi-Index の特定のレベルの値を取得する

いつも忘れてしまうのでメモ。

## やりたいこと
例えば以下のような Multi-Index な Pandas DataFrame があったとする。

``` python
import pandas as pd
from itertools import product

keys = ['key1', 'key2']
df = pd.DataFrame(list(product(list('ABC'), list('DEF'))), columns=keys).set_index(keys)
df['val'] = None
```

![](https://qiita-image-store.s3.amazonaws.com/0/16369/457e4cde-2cf0-cede-70a8-a399c54f4eda.png)

ここで「`key1` が `A` の行だけフィルタリングしたい」という場合、どうすればいいか。

## 解決策
[pandas.MultiIndex.get_level_values](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.MultiIndex.get_level_values.html) というメソッドを使うと、Multi-Index の値にアクセスできる。

``` python
df.index.get_level_values('key1')  #=> Index(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], dtype='object', name='key1')
```

フィルタリングする場合はこう。

``` python
df[df.index.get_level_values('key1') == 'A']
```

![](https://qiita-image-store.s3.amazonaws.com/0/16369/f41ee9fa-dd2b-7f20-13d8-387f51f187b2.png)

## [追記] 補足
フィルタリングするだけなら `.loc` にタプル渡すだけでもできた。

``` python
df.loc[('A',)]
```

![](https://qiita-image-store.s3.amazonaws.com/0/16369/256652f7-b5e3-54e7-f2f3-66b877452951.png)

## 参考
- [pandasのMultiIndexについて - Qiita](https://qiita.com/ryskchy/items/59028f1a3ed1d433b1a8)
Rails db:seed二重登録解除

##`db:seed`の内容を書き換えて更新
そのまま`rails db:seed`を実行すると、二重登録となってしまい、seedの内容を編集した時の更新は出来ない為

```ruby
rails db:migrate:reset
```
上記コマンドを実行した後に`rails db:seed`とすることで、再登録出来る。

参考サイト
[Railsでrake db:seedをやり直す](https://blog.bgbgbg.net/archives/3256)