OmniAICreator/Qiita-1.07M huggingface dataset:
dplyrでPostgreSQLにSSL接続

# DBにSSL接続する

RからDBに接続するには、例えば`{RPostgreSQL}`パッケージを使って

```r
library(RPostgreSQL)
con <- dbConnect(PostgreSQL(),
                 host = "your_host",
                 port = 5432,
                 dbname = "your_db_name",
                 user = "your_user_name",
                 password = "your_password")
```

のようにやる。ただし、`{RPostgreSQL}`は現状ではSSL接続に対応していない。

SSLに対応しているパッケージとして`{RPostgres}`がある。`{RPostgres}`はCRANに登録されていないので、githubからインストールする。

```r 
install.packages("devtools")
devtools::install_github("rstats-db/RPostgres")
```

使い方はPostgreSQL()とほぼ一緒。

```r 
con <- dbConnect(RPostgres::Postgres(),
                 host = "your_host",
                 port = 5432,
                 dbname = "your_db_name",
                 user = "your_user_name",
                 password = "your_password")
```

# dplyrからDBに接続する

`{dplyr}`からDBに接続することができる。

```r 
con <- src_postgres(
  host = "your_host",
  port = 5432,
  dbname = "your_db_name",
  user = "your_user_name",
  password = "your_password")
```

こうしておけば`{dplyr}`っぽく操作できるようになるし、必要であればクエリも送れるので大変便利だ。ただしこれはSSLに対応していない。

中身を覗くと分かるが、`src_postgres()`は内部で`RPostgreSQL`によりコネクションを作成し、`src_sql()`を呼び出している。

```r 
> src_postgres
function (dbname = NULL, host = NULL, port = NULL, user = NULL, 
    password = NULL, ...) 
{
    if (!requireNamespace("RPostgreSQL", quietly = TRUE)) {
        stop("RPostgreSQL package required to connect to postgres db", 
            call. = FALSE)
    }
    user <- user %||% if (in_travis()) 
        "postgres"
    else ""
    con <- dbConnect(RPostgreSQL::PostgreSQL(), host = host %||% 
        "", dbname = dbname %||% "", user = user, password = password %||% 
        "", port = port %||% "", ...)
    info <- dbGetInfo(con)
    src_sql("postgres", con, info = info, disco = db_disconnector(con, 
        "postgres"))
}
<environment: namespace:dplyr>
```

おそらく`{RPostgreSQL}`はいずれ`{RPostgres}`に置き換えられると思うが、まだそうはなっていない。

ともあれ、`src_postgres()`の`RPostgreSQL`を置き換えてやれば接続できるようになる。

```r 
con <- dbConnect(RPostgres::Postgres(),
                 host = "your_host",
                 port = 5432,
                 dbname = "your_db_name",
                 user = "your_user_name",
                 password = "your_password")
```

※`dplyr 0.7.0`から`src_*`系の関数が不要になった(cf.[dplyr 0.7.0を使ってみる - Technically, technophobic.](http://notchained.hatenablog.com/entry/2017/04/15/160631))。

`dplyr 0.6.0`以前の場合は下記を実行してコネクションを変換する必要がある。

```r 
con <- src_sql("postgres", con, info = dbGetInfo(con))
```
rippleのmaster keyとは

# 仕様

RFC-1751
[A Convention for Human-Readable 128-bit Keys](https://tools.ietf.org/html/rfc1751)

# サンプル

```
"master_key" : "I IRE BOND BOW TRIO LAID SEAT GOAL HEN IBIS IBIS DARE"
"master_seed" : "snoPBrXtMeMyMHUVTgbuqAfg1SUTb"
```

人間が読める言葉のmaster_key から ランダムな文字列の master_seed を 復元できる

# 資料

https://www.xrpchat.com/topic/998-official-cold-wallet-from-ripplecom/

# rippled該当箇所

https://github.com/ripple/rippled/blob/a61ffab3f9010d8accfaa98aa3cacc7d38e74121/src/ripple/rpc/handlers/ValidationSeed.cpp
`typealias My` をススメようと思ったけどやめた件　あるいはstatic methodをどうやって呼ぶか

# staticメソッドの呼び方パターン洗い上げ

```swift
class Hoge {
    typealias My = Hoge

    func instanceMethod() {
        // インスタンスメソッドからstaticメソッドを呼ぶとき

        // (1) 一番プレーンなやり方。⭕️わかりやすい ❌️型名の変化に弱い
        Hoge.staticMethod()

        // (2) Swiftyなやり方。⭕️標準的かつ変化に強い ❌️ちょっと長いし、インスタンスメソッドでしか使えない
        type(of: self).staticMethod()

        // (3) typealiasを使ったやり方。⭕️読みやすい ❌️オレオレ
        My.staticMethod()
    }

    static func staticMethod() {
        // staticメソッドからstaticメソッドを呼ぶとき

        // (1) 型名は省略できる。 ⭕️シンプル ❌️static methodだとわかりにくいかも？
        anotherStaticMethod()

        // (2) selfつけることもできる。 ⭕️良い点はないかな ❌️尚更static methodだとわかりにくい
        self.anotherStaticMethod()

        // (3) 型名つけることもできる。 ⭕️インスタンスメソッドと同じように書けて統一性がある ❌️型名の変化に弱い
        Hoge.anotherStaticMethod()

        // (番外) これはできない。 ❗️Type 'Hoge.Type' has no member 'anotherStaticMethod'
//        type(of: self).anotherStaticMethod()

        // (4) typealiasも使える。 ⭕️インスタンスメソッドでのやり方と同じで統一性がある ❌️オレオレ
        My.anotherStaticMethod()
    }

    private static func anotherStaticMethod() {
    }
}
```

# `typealias My` の良さ

- インスタンスメソッド・staticメソッドでの統一性があるやり方
- 読みやすい

ってことで、オレオレなやり方ではあるけど、 `typealias My` いいんじゃないのって思うんですけど。どうでしょう。
でもやってる例みたことないんで、デファクトスタンダード取れるように流行れー。

# と思ったけど (15:04追記)

コメント欄でのやりとりで意見変わりました。

https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md

Swift Evolutionで、 `Self` で呼べるようプロポーザルが出て、既にAcceptされていた。
将来的なことを考えると、 `My` よりも ``` `Self` ``` にするのがよさそうです。
任意精度対角化の速度の備忘録

# 目的
任意精度演算で対角化を実行してくれるmpmath(python)とMathematicaを使って，対角化に要する時間を計測したので備忘録として残す．

## 評価方法
評価した行列は一次元ハミルトニアン
$$ H = p^2/2 + q^4/2 $$
を調和振動子の基底で構成したHermite 行列．
行列要素は100桁の精度で構成．対角化ルーティンは

* mpmath の eigh
* Mathematica と Eigensystem

を利用．

## 結果
Mathematica の方が約10倍程度早い．

![diag time.png](https://qiita-image-store.s3.amazonaws.com/0/138934/2dba831d-3b54-ad6a-ab95-30647a508fca.png)



## 課題
多次元では$10^4\times10^4$程度の行列を評価することになるのでmathematicaだと40日かかる．
lapackを多倍長拡張したmpackを使ってみたい．

## 追記

mpackをinstallして数時間だけ触ってみた．
ついでに速度を評価したので，追記として記録する．

対角化した行列は対称実行列で
$a_{i,i}=i$, $a_{i+1,j}=i$, $a_{i,j+1}=i$ それ以外は0の要素を持つ実対称行列を使う．

mathematica とmpackのRsyevのルーチンを比較．
結果としてmpackはmathematicaより10倍程度早そう．
![diag-time-2.png](https://qiita-image-store.s3.amazonaws.com/0/138934/56e46025-121d-7dcd-1bc2-58b7ecf4d8f8.png)

エルミートの場合はまだ評価していないが，Mathematicaより10倍程度早くなるのであれば$10^4\times 10^4$の対角化が4日で終わる計算になる．
これは非常に期待せざるを得ない．

しかし，まずはmpackを使えるようにならなければ．
Facebookのいいね！ボタンを複数ページに設置する


## TODO


### Facebookタグのコードを生成する
[いいね！ボタン(ウェブ用)](https://developers.facebook.com/docs/plugins/like-button?locale=ja_JP)でコードを生成する
この作業は一度だけでOK

### コード書く
取得した上記jsファイルを設置し、HTMLをよしなに編集する。
ここまでは一般的ないいね！ボタンの設置方法。

### titleを変更する
ページごとに異なるtitleをつける。

```
<title>blar blar</title>
```


### metaタグを変更する
ページごとに異なるmetaタグをつける。

```
<meta property="og:title" content="XXX-XXX" />
<meta property="og:type" content="website" />
<meta property="og:url" content="http://xxx.xxx/" />
<meta property="og:image" content="http://xxx.xxx/xxx.jpg" />
<meta property="og:site_name" content="XXX" />
<meta property="fb:admins" content="*********************" />
```


## 困った時
上記の設定で異なるページに同じ(tilte||meta)タグを使ってしまうと他のページのいいね！数を取得してしまう。
一度取得してしまうとコード上で修正することはできないようなので[Open Graph Debugger](https://developers.facebook.com/tools/debug/)と呼ばれるFacebookのデバッガを利用する。

デバッガのページを開くと下記の画面が表示される。
ここに該当ページのURLを打ち込み、`Debug`ボタンを押す。

![スクリーンショット 2017-05-18 12.14.42.png](https://qiita-image-store.s3.amazonaws.com/0/79598/34e598ac-adee-d6c0-1713-94a684f86376.png "スクリーンショット 2017-05-18 12.14.42.png")

すると下記の画面が表示される。
`Scrape Again`ボタンを押すことで正しく設定したURLが反映され、いいね！数もリセットされる。
![スクリーンショット 2017-05-18 12.15.01.png](https://qiita-image-store.s3.amazonaws.com/0/79598/472e7341-8e2a-aa90-cebb-36609603a780.png "スクリーンショット 2017-05-18 12.15.01.png")



## 参考
http://raku-gaki.com/blog/2011/09/facebookhtml.php
js:即時関数と無名関数

#無名関数#
```js
function hoge(){...}
```

```js
var hoge = function hoge(){...};
```

　↓　省略

```js

var hoge = function (){...};
```

#即時関数#
関数定義

```js
function unitopi(){
  console.log('hello');
}

/*　関数呼び出し　*/
unitopi();
```

 関数定義と呼び出しのセット

```js
 (function unitopi(){
  console.log('hello!');
})();
```

　↓　省略

```js

(function (){
  console.log('hello');
})();
```
SQL Severで日本語を扱う際に文字化けさせないために



ファイルの文字コードやBULK INSERTのじゃなく、まずCREATE TABLEをちゃんと書きましょう、ということ。
SQL Severでは照合順序を適切に設定してあげないと、正しくデータをimport（もしくはBULK INSERT）しても、selectしてみてると文字化けしてる
照合順序の詳細はこちらを参照
https://blogs.msdn.microsoft.com/jpsql/2016/07/26/1-3/

必要なのは「COLLATE Japanese_XJIS_100_BIN」をCREATE TABLE時に対象のカラムに付けるだけ

```sql
CREATE TABLE test_table(
japanese varchar(500) COLLATE Japanese_XJIS_100_BIN NULL
);
```
【Mac】自分の画面を録画して、即gif動画化する方法

#Gif動画はとっても便利
GitHubやQiita等で自分の画面の挙動を誰かに伝えたい場合に、動画で表現できると伝わりやすいですよね。そんなとき、サクサクとGif動画が作れるととても便利です。

この記事では、下のような動画GIFを簡単に作れる方法をご紹介します。
※Macユーザーを想定しています。
![自分の画面を録画.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/179510/a5572f1a-0f92-9bf1-28e6-10d8d8c03ca5.gif)

# QuickTime Playerで画面を録画する
まずは[QuickTimePlayer](https://support.apple.com/ja_JP/downloads/quicktime)を利用し、画面を録画します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/179510/9fdd72aa-cca2-fa1d-022f-70b7db44ebc0.png" width=10%>

普段QuickTimePlayerを使わない方でも既に**`アプリケーション＞ユーティリティ`**の中にあるケースが多いです。もし、持っていないければ[ダウンロード](https://support.apple.com/ja_JP/downloads/quicktime)してください。

## 画面収録方法
### ①QuickTimePlayerを開き、**`ファイル＞新規画面収録`**をクリックします。
<img width="415" alt="スクリーンショット 2017-05-18 11.59.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/348f7493-778b-59fc-7728-d6e105401884.png" >

### ②「画面収録」の赤い丸をクリックします。
　<img width="283" alt="スクリーンショット 2017-05-18 12.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/a0449eb7-81ae-537d-c816-552c23f28687.png">

### ③下記のような画面が出たら、クリックし続けながらマウスを動かすことで範囲を指定できます。
<img width="1040" alt="スクリーンショット 2017-05-18 12.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/28994e9a-42b3-63d1-0ba0-dc7b5ce725f4.png">

### ④Command + Control + esc キーを同時に押すことで撮影を終了します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/179510/267160ee-8a96-47f1-3031-411128834f30.jpeg" width=30%>

これにて.mov形式の動画が撮影できたかと思います。

#GIFに変換する
GIF化が直感的で楽な[Gifted](https://itunes.apple.com/jp/app/gifted/id771955779?mt=12)というアプリがありますので、これをインストールします。

><img width="245" alt="スクリーンショット 2017-05-18 12.16.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/69f88e10-1ecf-b004-15c4-af07edfc8d19.png">

この画面に先ほどQuickTimePlayerで撮影した動画をドロップして**Start**を押すだけで変換されます。
変換された動画は**`ピクチャ>Gifted`**内に保存されるようになっています。
Google I/O '17　Web Componentsのプレゼンのメモ

[Future, Faster: Unlock the Power of Web Components with Polymer (Google I/O '17)](https://www.youtube.com/watch?v=cuoZenpQveQ)を見ました。

全体として、そもそもWeb ComponentsやPolymerに馴染みのない開発者向けにPolymer 2.0の紹介やWeb Componentsがブラウザで標準サポートされる意義を噛み砕いて紹介する内容でした。Polymer Summit 2016をご覧になった方にはほとんど新しい内容はないと思います。また、他のJSライブラリユーザーに向け、Polymer 1.0では難しかった他のJSライブラリ(angular/react)との互換がPolymer 2.0の登場でより簡単になった点についても言及しています。

以下動画を見ながらメモしたものです。書き起こすのは大変なので、Web ComponentsやPolymerの一般的な内容は割愛しました。ご覧になる際に参考にしてください。

(！)は拍手や歓声のあった瞬間です(笑)

- 2:27 (!!)safari10からCustom ElementsとShadow DOMを正式にサポート
- 11:34 Polymerを使っている企業の紹介(Comcast/USA Today/ING/NET-A-POTER/BBVA/Coca Cola/Electronic Art/Predix/Google Earth/Youtube)
- 15:47 (!)Polymer 2.0の発表
- 16:14 (!)ブラウザがWeb Componentsをサポートし始めたのでPolymer 2.0は1.0のファイルサイズは1/4に
- 18:45 (!)Web Componentsは標準だから、サポートブラウザであればconsole上でそのままコードを試すことだってできる(ライブラリも不要)
- 22:06 Polymer2.0 + Polyfill(Custom Elements&Shadow DOM&CSS Custom Properties)のサイズ Chrome(11k)Safari(14k)Firefox(33k)
Edge(33k)IE(37k)
- 22:47 Angularやpreact(Reactのalt版)のコンポーネントとも互換性がある
- 23:57 Polymer 2.0は、全てのJSライブラリとも互換性がある
- 24:46 Polymer 1.0から2.0へのスムーズなマイグレーションが可能
- 29:25 最近ローンチされた[WebComponentsOrg](https://www.webcomponents.org/)は開発者の作成したオープンソースのWeb Componentsを共有可能なプラットフォーム(すでに1000を越えるコンポーネントがアップされている)
- 32:36 IDEのプラグイン([Qiitaに投稿した記事](http://qiita.com/jtakgiuchi/items/7a3316e716df5e361615))と新しいPolymer CLIの紹介
- 33:45 ここから[PRPLパターン](https://www.polymer-project.org/2.0/toolbox/prpl)の説明
- 34:02 PRPLパターンの誕生したエピソード。(凄い…これぞ集合知)
- 36:37 Twitter LiteがPRPLパターンに基づいて作成されたという話。PRPLは固有のライブラリに縛られない応用のきくコンセプトである。
- 37:02 PWAのサンプルとしてデモアプリケーション[Polymer News](https://github.com/Polymer/news)を紹介
- 39:56 写真加工アプリ[Cheese](https://cheese.polymer-project.org#PolymerIO)も作ってみた
- 41:24 IOのWeb Components関連のプレゼン紹介
- 42:18 (!!)次のPolymer SummitはCopenhagenでAugust 22-23, 2017に開催。Chromeの検索から「g.co/polymersummit2017」にアクセスすると申し込みの方法など確認できる。
API Gatewayの前にWAFを設定する

# 概要
API Gatewayを使うとき手が届かないむずかゆいところがたくさんあります（HTTPSのみしか受け付けないとか、前段にWAFおけないとか）。このうちのWAFを設定するという部分に今回は取り組んだときのTipsを残しておきます。

* API Gateway + CloudFront + AWS WAF (+ S3)
* AWS WAFのIP Match Conditionのみを利用

# 前提
以前に投稿した、
[「CloudFrontに複数オリジン（API GatewayオリジンとS3オリジン）の設定」](http://qiita.com/horsewin/items/3209083d9fb3a8441895)の通り、下記の環境が構築されている前提とします。なお、今回はAPIGatewayの前段におくことがメインなのでS3はオプションです。

![arch.png](https://qiita-image-store.s3.amazonaws.com/0/123578/73fb1c7c-fafa-53ea-6c38-c484e16306a3.png)

# アーキテクチャ構成
AWS WAFが入ることで下記の構成になります。

![arch2.png](https://qiita-image-store.s3.amazonaws.com/0/123578/9c1cde4e-2553-c39d-c928-7ab59f78586d.png)

# AWS WAFの概要
詳細は公式ドキュメントやブログ等でたくさんの方が紹介していただいているのでそちらを参照してください。

* [AWS WAF and AWS Shield Documentation（英語）](https://aws.amazon.com/jp/documentation/waf/?nc1=h_ls)
* [Blackbelt seminar(AWS WAF)](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-2015-aws-waf)
* [[新機能]AWS WAFの概要簡単まとめ！(reinvent2015)](http://dev.classmethod.jp/cloud/aws/aws-waf-faqs/)


# AWS WAFの設定
今回はIP Match Conditionを設定します。下記手順でコンポーネントを構築していきます。

 1. IPSetsの作成
 2. Ruleの作成
 3. WebACLの作成

## IPSetsの作成
非常に簡単です。CIDR形式でIPを登録してIPアドレスの集合を作るだけです。

![ip_create.png](https://qiita-image-store.s3.amazonaws.com/0/123578/396eb9d2-b1b3-4301-9479-6e8745cfa863.png)

![ip_setting.png](https://qiita-image-store.s3.amazonaws.com/0/123578/2b0d7a28-8b0d-8110-ba61-b3d6b3b25497.png)

![ip_result.png](https://qiita-image-store.s3.amazonaws.com/0/123578/40268fd7-ea01-b9ce-ad99-c901624be813.png)

## Ruleの作成
CloudFront－＞APIGatewayへのルーティングになるため、CloudFrontを指定しています。

![rule_create.png](https://qiita-image-store.s3.amazonaws.com/0/123578/1a303507-d677-1e96-15d0-bd1e935bd89d.png)

![rule_setting.png](https://qiita-image-store.s3.amazonaws.com/0/123578/2460aa69-1456-d6fd-36dc-3cdf17950b48.png)

![rule_result.png](https://qiita-image-store.s3.amazonaws.com/0/123578/2ffda211-2df0-20ed-06fe-4dd59246134c.png)

## WebACLの作成
作成したIPSets、RulesをWebACLに設定します。

![acl_setting_1.png](https://qiita-image-store.s3.amazonaws.com/0/123578/f530279c-daa8-700d-e328-af00f1eb1c44.png)

![acl_setting_2.png](https://qiita-image-store.s3.amazonaws.com/0/123578/fad2a947-55d3-1ff0-72ec-252b68baeaad.png)

![acl_setting_3.png](https://qiita-image-store.s3.amazonaws.com/0/123578/ccf55586-b3cc-43f6-dc58-e62f22e30217.png)

![acl_setting_4.png](https://qiita-image-store.s3.amazonaws.com/0/123578/7573bb31-cfcd-5a73-bb27-7f0a93138b75.png)

![acl_result.png](https://qiita-image-store.s3.amazonaws.com/0/123578/9a242464-c05e-8b33-46d0-63aca237f17c.png)

# 結果
* IPSetsに設定したIPからは問題なくアクセスできます。
    * API Gatewayは単純にSuccessと返すだけのMockエンドポイントを用意し、prodステージにデプロイしました。
        * リソース名：success
    * ブラウザから動作確認
        * アドレスバーに下記を入力して実行
        * https://xxxxxx.com/success 
        ![result1.png](https://qiita-image-store.s3.amazonaws.com/0/123578/6adf59ce-3ad6-5f82-0504-696762853d9e.png)  　

* IPSets外のブラウザからアクセスしてみます。
    * アクセスブロックされました！
    ![wafblock.png](https://qiita-image-store.s3.amazonaws.com/0/123578/90b0686f-77c7-2ca2-6c66-8e9014c95284.png)

# まとめ
* APIGatewayの前段にWAFを置く構成を構築しました。
* IP Match Condition以外にSQLインジェクションやXSSなど他にも設定がたくさんあります。IP Match Conditionだけでいうと超シンプルに作れます。
PowerShell で、SharePoint Online の リストとアイテムの情報を書き出してみた

# 目的
SharePoint Online では、Client Side Object Model(CSOM)を使って、
色々な情報を抜き出したり、書き込んだりすることができる。
これを使うと、簡単に管理作業が出来るので、これから色々なスクリプトを書いてみる。 

CSOMに関することは、サポートチームのblogで、
https://blogs.technet.microsoft.com/sharepoint_support/2014/10/19/sharepoint-online-powershell/

# 事前準備

以下のインストール

- PowerShell Ver 3.0 以上
- SharePoint Server 2013 Client Components SDK  
（ https://www.microsoft.com/en-us/download/details.aspx?id=42038 ）


# サンプル

設定する項目は、以下の二か所

\$SiteCollectionUrl ：サイトコレクションのURL
\$Account ：管理者権限のアカウント
\$objListName ：リストの表示名

```PowerShell
 # Read CSOM
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# SiteCollection URL 
$SiteCollectionUrl = "https://tenant-name.sharepoint.com" 
# $SiteCollectionUrl = "https://tenant-name.sharepoint.com/sites/subsite" 

# Account
$Account = "administratorsName@tenant-name.onmicrosoft.com" 
$SecurePassword = Read-Host -Prompt "Enter Your Password." -AsSecureString

# Create Credential
$Credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Account, $SecurePassword) 

# Create Context
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl)
$Context.Credentials = $credential

$objListName = "ドキュメント"

# Create List object
$objList = $Context.Web.Lists.GetByTitle($objListName)
$Context.Load($objList)
$Context.ExecuteQuery()

Write-Host "list Title : " $objList.Title
Write-Host "list BaseType : " $objList.BaseType
Write-Host "list Created : " $objList.Created
   
$query = New-Object Microsoft.SharePoint.Client.CamlQuery
$query.ViewXml = ""

$objListItems = $objList.getItems($query)
$Context.Load($objListItems)
$Context.ExecuteQuery()

Write-Host ""
   
foreach($item in $objListItems)
{
    Write-Host  $item.Id.ToString() `t $item["FileLeafRef"] `t $item["Editor"].LookupValue `t $item["Modified"]

}

# Dispose Context
$Context.Dispose()
```

# 参考
クエリ スキーマ(CAML)
https://msdn.microsoft.com/ja-jp/library/ms467521(v=office.14).aspx
SPBuiltInFieldId メンバ (Microsoft.SharePoint)
https://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.spbuiltinfieldid_members(v=office.12).aspx
金銭授受で表す共変・反変(メモ書き)

以下、共変・反変というのはScalaの型パラメータを扱う際用いられる概念のことを言う。

## 共変と反変をざっくり
共変である型パラメータをもつクラスを扱う際、
型パラメータにサブクラスの型を入れたサブクラスを作成でき

反変である型パラメータをもつクラスを扱う際、
型パラメータに(上とは逆に)親クラスの型を入れたサブクラスを作成出来る

## 送信と受信
共変と反変の定義は上の通りだが、
何処で差が生まれるかと言うと受け渡しの送信側と受信側どちらを制約するかの差のようだ。
TaPLによるとC#とかだとout, in とかいう直接的な表記で反変・共変を表すらしい。

## 大は小を兼ねる……本当に？
集合として捉えた場合、親クラスに属する集合の方がサブクラスに属する集合より大きい。
何故なら包含関係があるからだ。

しかし、各クラスを表現するために必要なパラメータ数に着目してみるとどうだろう。
サブクラスは親クラスに必要なパラメータも備え持つため、
親クラスを表現するパラメータ以上のパラメータを持つ。
集合としては小さいサブクラスの方がパラメータとしては多くのものを持つと言えよう。

サブクラスの方が同じか多くのパラメータを持ち、
親クラスとして捉える(アップキャスト)することも出来る。

## 金銭授受でのアナロジー

以上より、サブクラスは親クラスの代役を出来るが、親クラスはサブクラスの代役を出来きない。

これを金銭のアナロジーで表して、
1100円(サブクラス)は1000円(親クラス)の代役を出来るが、1000円(親クラス)は1100円(サブクラス)の代役を出来ないと表してみる。

自身が金銭を送る(データを送信する)際、
元々1000円送るつもりだった場合、既に1000円送る用意があるため、送る額が減額されても(親クラスになっても)何もしなくて良い。一方、送る額が増額される(サブクラスになる)と困る。
型パラメータを親クラスの型で置き換えられるが逆は出来ないため、これは反変と対応する。

自身が金銭を受取る(データを受信する)際、
元々1000円受け取るつもりだった場合、既に1000円使うつもりにしているため、受け取る額が増額されても(サブクラスになっても)何もしなくて良い。一方、受け取る額が減額される(親クラスになる)と困る。
型パラメータをサブクラスの型に置き換えられるが逆は出来ないため、これは共変と対応する。
ajaxで外部htmlを読み込む方法　メモ

簡単で、拡張もしやすいかと思い、メモ。

```js

    function 関数名(){
      $.ajax({
          url　: 'parts.html',
          dataType : 'html',
          success　: function(data){
              $('#要素').html(data);//A
          },
          error: function(data){
              $('#要素').html(data);//A
          }
      });
    }
```
もちろん、読み込みたいファイルの方で、scriptを読み込んで、その中でもpartsを実行します。

```html
<script type="text/javascript">関数名();</script>
```
```html
<div id="要素"></div>
```
↑
こちらが、Aの部分です。
別で、読み込ませたいファイル（html）を作成する必要がありますが、楽です。

では、参考までに
mysqlpump の使い方

# mysqlpumpとは

* MySQL5.7（厳密には、MySQL5.7.8）から加わったmysqldumpにはない機能をいくつか持ったバックアップコマンドになっている
* 用途としては、データベースをダンプする、ダンプしたファイルを別サーバのDBにインポートすることが想定されている（mysqldumpと用途はほぼ同じ）
* mysqldumpの互換性を気にせず使えるように作られている

# mysqlpumpができること

## 並列dump

* データベースに含まれるスキーマ及びテーブルに対して並列処理が可能なため、更新中に並列ダンプを行っても整合性のあるバックアップが取得できる
> InnoDBの一貫したバックアップを取得するには、--single-transactionをmysqldump同様に指定する必要がある。

## ユーザアカウント

* ユーザアカウント情報のテーブルをINSERT文で出力された権限テーブルではなく、CREATE USER, GRANTコマンドで出力ができる

## データリストア

* 処理時間を削減するために、インデックス作成とデータリストアを同時に行わずに、データをINSERTしたからインデックスを作成している

## 出力の圧縮

* 別サーバにバックアップファイルを転送する必要がある場合、データ自体を圧縮することができる。--compressオプションで対応可能なため、転送時間・帯域の節約ができる。

## バックアップの進捗出力

* 進捗状況を出力するコマンドがあるため、どのくらい完了しているか、あとどのくらいかかるかを表示してくれるので、とても便利。

> イメージとしては、こんな感じで出力される。

```
Dump progress: 0/2 tables, 250/9213 rows
Dump progress: 0/2 tables, 1000/9213 rows
Dump progress: 0/2 tables, 3000/9213 rows
Dump completed in 1580 milliseconds
```

# バックアップとリストア

* バックアップ

```
mysqlpump --single-transaction --users > dump.sql
```

* リストア

```
$ mysql -uroot -p < dump.sql
```

# mysqlpumpのデータベース指定

## 全データベースをバックアップする

```
$ mysqlpump
(or)
$ mysqlpump --all-databases
```

## バックアップ対象のデータベースをリスト化する

```
$ mysqlpump --databases=db1, db2, db3
```

## ワイルドカードを使って、バックアップ"する"データベースを指定する

```
$ mysqlpump --include-databases=db%
```

## ワイルドカードを使って、バックアップ"しない"データベースを指定する

```
$ mysqlpump --exclude-databases=db%
```

## 指定したデータベース以下のテーブルのみを指定する

```
$ mysqlpump db1 table1 table2
```

# キューを増やして、mysqlpumpを実行する

> キューはデフォルト1で実行されており、キューに対してのスレッド数は、デフォルト2になっている。
> --parallel-schemasオプションを使用することでキューを増やすことができ、--default-parallelismオプションを使うと指定した数のスレッド数で実行することができる

## 例

* 全データベースを4スレッドでダンプする

```
$ mysqlpump --default-parallelism=4
```

* db1,db2に対しては、最初のキューで5スレッド、db3,db4,db5に対しては、2番目のキューで3スレッド、その他のテーブルについては、3スレッドでダンプをする

```
$ mysqlpump --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3,db4,db5 --default-parallelism=3 
```

## 注意点

> 1つのテーブルを複数スレッドでダンプすることはできないため、テーブル数がスレッド数よりも少ない場合は、余るスレッドが発生して活用することはできない。
rippleのpartial paymentとは？

# 機能

* 部分支払い
* 指定された金額の一部を支払う
* 10000XRPのうち100XRPを支払うという払い方

https://ripple.com/files/GB-2014-06.pdf

# 事件

justcoinという取引所が破綻した事件があった
以下の記事が詳しい

https://www.cryptocoinsnews.com/ripple-tfpartialpayment-causes-gox-style-hack-justcoin-exchange/

http://bitantenna.com/2014/10/30/justcoin-exchange-closes/

# 原因

partial paymentのチェックをしていなかった

# どんなデータか

## 通常の場合

Amountには支払われた額が入る

## partial Paymentの場合

Amountには支払うべき額が入る
DeliveredAmountに実際に支払われた額が入る

エラーとして扱うならば以下のようなコードで対策する必要がある

```
if( Amount != DeliveredAmount ){
  Amount = DeliveredAmount または エラー処理
}
```

https://ripple.com/build/transactions/#delivered-amount

# partialpaymentについては何回も蒸し返されている議題

https://www.xrpchat.com/topic/3223-vulnerability-on-gateways-responsibility-legitimacy/

https://bitcoin.stackexchange.com/questions/29445/ripple-partial-payments
[Mac] VmwareFusionからVirtualBoxへの移行

#なぜ移行することにしたのか、その経緯

* MacOSX(El Capitan）の上でVmwareFusion7を使ってWindows10を動かしていた
* macOS Sierraにアップデートしたい。
* アップデートした場合、VmwareFusion7が動かない可能性が高い。
* しかし、VmwareFusionにアップデート費用をかけるのは厳しくなってきた。
* VirtualBoxなら無料らしい。
* 本腰を入れてVmwareFusionからVirtualBoxへの移行をしてみた。

#やったこと

* まずはVmwareFusionの仮想ディスクを統合
    * Vmware →仮想マシン→設定→ハードディスク→複数のファイルを割り当てるのチェックをはずす
    * [参考：YosemiteとVMWare Fusion 5.0.5からVirtualBoxへの引越し](https://whiskers.nukos.kitchen/2014/10/24/hello-yosemite.html)
* 「パッケージの中身を見る」で、「仮想ディスク.vmdk」ファイル選んでコピー
* それをVirtualBoxで選択、新規で起動
* Guest Additions をインストール
    * [参考：VirtualBoxの使い方 - Guest Additions のインストール](http://pc-karuma.net/virtualbox-install-guest-additions/)
* モニタの設定
* 共有フォルダの設定
    * [参考：VirtualBox 共有フォルダー設定 - ホストとゲスト間でフォルダーを共有](https://pc-karuma.net/virtualbox-folder-share/)
* クリップボードの共有
    * [参考:VirtualBoxでOS間のクリップボードを共有する方法](https://pc-karuma.net/virtualbox-clipboard-share/)
* キーボード設定
    * コマンドキーを使えるように
    * [参考：Mac OSXとWindows8 on VirtualBoxで同じショートカットキーを使う方法](https://pc-karuma.net/mac-osx-windows8-on-virtualbox-keyboard-shortcut/)
* Windows10のライセンス移動
    * [Microsoftアカウントをリンク](http://s.kakaku.com/bbs/-/SortID=20090078/)して試みたがエラー発生
    * エラー内容：Windows を再度ライセンス認証することができません。現在、弊社のサーバーが利用できないためです
    * そのため、[このサイトを参考](https://mome-n.com/windows10-license/)に試みたところ成功！
* 最後にWindowsからもDVD-Rドライブなどで書き込みしたいことがあるので、なんとか外付けドライブを認識させたかったが、色々苦戦。
    * ようやっと解決
    * 外付けDドライブ認識させるためにExtensionパックをダウンロードして、USB3.0を有効化
    * [参考：VirtualBoxでのUSBデバイス認識 - Qiita](http://qiita.com/civic/items/684c4b82428feb0c4ae1)
* マウスとトラックパッドを併用していて気づかなかったが、Windows上でトラックパッドでのドラッグ操作ができないことに、気づく。
    * 「設定」→「システム」で「ポインティングデバイス」の項目をPS/2マウスに
    * [こちらを参考](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10127929205)に解決！ 

* 2020/08/14追記
    * ビデオRAMが潤沢ではないので、表示倍率を225%とかにして拡大して表示すると、割と快適になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171102/e166f366-8fae-ea7d-36e8-8b47090cc57f.png)

* 2020/08/14さらに追記
    * メインメモリーもホスト8GBに対して、2GB程度（3分の1以下）にしないと、ホストもろとも固まる現象が出てしまうので、少なめで様子をみたほうがいいかと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171102/4d207504-68c7-de9b-35a2-0923ce956b9f.png)
Android標準ブラウザでinput[type="file"]を扱う

## 問題
非表示になっているinput[type="file"]で選択した画像のサムネイルを表示するというものを作成した。
しかし、Android標準ブラウザでいくらボタンを押してもファイルのエクスプローラが立ち上がらない……。
~~標準ブラウザとか爆発しろ~~

解決案を探してみると、clickしたときに`display: none;`を外すというのが書かれていた。
しかし、それだとエクスプローラが立ち上がってから`display: none;`をつけるということで妙な動きが発生する可能性がある。
また`display: none;`をつけるタイミングによってはエクスプローラが立ち上がらない事がある。

## 解決方法1
visibility: hidden; position: absolute; top: -200px; を設定する。
これだと大きさが確保されなくなるので、他のデザインにも影響を与えにくい。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fileinput</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.0/vue.min.js"></script>
    <script>
    window.onload = () => {
      var vm = new Vue({
        data: function () {
          return {
            fileUrls: []
          }
        },
        methods: {
          submitFileButton: function (e) {
            var input = e.target.parentElement.querySelector('input');
            if (input) {
              input.click();
            }
          },
          showThumbnail: function(e) {
            var self = this;
            self.fileUrls = [];
            var size = e.target.files.length;
            for (var i = 0; i < size; i++) {
              var fileReader = new FileReader();
              fileReader.onload = function (e) {
                self.fileUrls.push(this.result);
              };
              fileReader.readAsDataURL(e.target.files[i]);
            }
          },
          remove: function (fileUrl) {
            var index = this.fileUrls.indexOf(fileUrl);
            this.fileUrls.splice(index, 1);
          }
        },
        el: '#vue'
      });
    }
    </script>
</head>
<body>
<section id="vue">
		<div>
			<button class="btn" @click="submitFileButton">ファイルを選択</button>
<!--
Android標準ブラウザではinput[type="file"]が非表示の場合エクスプローラが立ち上がらない
その為0pxでinput[type="file"]を置いておく
			<input type="file" style="display: none;" @change="showThumbnail" accept="image/png,image/jpeg,image/gif ">
-->
			<input type="file" style="visibility: hidden; position: absolute; top: -200px;" @change="showThumbnail" accept="image/png,image/jpeg,image/gif ">
			<div v-if="fileUrls.length == 0">
				画像をアップロードできるよ
			</div>
			<div v-else>
				<div v-for="fileUrl in fileUrls">
					<img :src="fileUrl" height="100%" width="100px">
					<button @click="remove(fileUrl)">×</button>
				</div>
			</div>
		</div>
</section>
</body>
</html>
```

## 過去の解決法
width:0; height:0; を設定する。
これだと見えなくなるが、幅などは設定されてしまっているので注意する。

## 備考
上記を解決しても、Android標準ブラウザでは、サムネイルが表示できる画像とできない画像がある。
ただし、カメラから取った画像は表示できる。
これについては解決できていない……~~標準ブラウザとか爆発しろ~~
Raspberry PiにRuby (2.4.1)インストール

Raspberry Piに最新安定版(2017/5/17)のRuby (2.4.1)をインストールする。

##rbenvのインストール
#### 1. gitインストール
```
user@raspberrypi:~ $ sudo apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
git is already the newest version.
git set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 20 not upgraded.
```
#### 2. rbenvインストール
```
user@raspberrypi:~ $  git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Cloning into '/home/user/.rbenv'...
remote: Counting objects: 2595, done.
remote: Total 2595 (delta 0), reused 0 (delta 0), pack-reused 2595
Receiving objects: 100% (2595/2595), 476.26 KiB | 184.00 KiB/s, done.
Resolving deltas: 100% (1627/1627), done.
Checking connectivity... done.

```

#### 3. .rbenvのsrcでコンパイル
```
user@raspberrypi:~ $ cd ~/.rbenv && src/configure && make -C src
make: Entering directory '/home/user/.rbenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/rbenv-realpath.dylib  -o ../libexec/rbenv-realpath.dylib realpath.o
make: Leaving directory '/home/user/.rbenv/src'
```

#### 4. .bashrcにPATH通す
```
user@raspberrypi:~ $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
```

```
#### 5. rbenvの初期化＆rbenvコマンド化
user@raspberrypi:~ $ ~/.rbenv/bin/rbenv init
# Load rbenv automatically by appending
# the following to ~/.bashrc:

eval "$(rbenv init -)"


user@raspberrypi:~ $ source ~/.bashrc
```

#### 6. rbenvインストール確認
```
user@raspberrypi:~ $ rbenv -v
rbenv 1.1.0-2-g4f8925a
```
*rbenv update時は`$ cd .rbenv/` & `$ git pull`

#### 7. Rubyをインストールするための　rbenvプラグインであるrube-build(rubyのコンパイルとインストールを行う)をインストール
```
user@raspberrypi:~ $ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/user/.rbenv/plugins/ruby-build'...
remote: Counting objects: 7534, done.
remote: Compressing objects: 100% (48/48), done.
remote: Total 7534 (delta 36), reused 0 (delta 0), pack-reused 7483
Receiving objects: 100% (7534/7534), 1.54 MiB | 330.00 KiB/s, done.
Resolving deltas: 100% (4567/4567), done.
Checking connectivity... done.
```

#### 8. rbenvでインストール可能なrubyのversionを調べる (2.4.1が最新)
```
user@raspberrypi:~/.rbenv $ rbenv install -l
```
#### 9. rbenv経由でrubyインストール(20minぐらいかかる)
```
user@raspberrypi:~/.rbenv $ rbenv install 2.4.1
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
Installed ruby-2.4.1 to /home/user/.rbenv/versions/2.4.1
```
#### 10. rubyのversion変更&rubyのインストール確認
まずは元のrubyのversion確認

```
user@raspberrypi:~/.rbenv $ ruby -v
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf]
```
rubyのversion変更
(ここでrbenvによるversion変更に失敗した場合は、.bashrcを確認して
`export PATH="$HOME/.rbenv/bin:$PATH"`, `eval "$(rbenv init -)"`がきちんと記載されているか確認する)

```
user@raspberrypi:~ $ rbenv global 2.4.1
user@raspberrypi:~ $ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [armv7l-linux-eabihf]
```

#### (11. bundler入れる)
bundlerを入れるとgemfileの依存関係を解決してくれるのでぜひ入れておく

```
$ gem install bundler
```
以下参考
http://qiita.com/hisonl/items/162f70e612e8e96dba50
AndroidStudio 3.0 previewについて


更新のあった機能の見出しみたいなものです。
気になったのものは掘り下げるかもしれませんが、開発しなくなって久しいうえ、会社にAndroidのプロダクトがなくなってしまったのでががががが

# 参考
Android Developers Blog: Android Studio 3.0 Canary 1 https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html


Android Studio プレビューを入手する | Android Studio https://developer.android.com/studio/preview/index.html

Google announces the first preview of Android Studio 3.0, puts emphasis on speed and smarts | TechCrunch
https://techcrunch.com/2017/05/17/google-announces-the-first-preview-of-android-studio-3-0-puts-emphasis-on-speed-and-smarts/


## まとめ
- エミュレータでGooglePlayサポート
	- Android Oだけっぽい
- <b>Kotlinサポート！</b>
![Screen Shot 2017-05-16 at 5.24.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/44384/32dadb6f-604e-0753-6900-c8b9e003a46c.png "Screen Shot 2017-05-16 at 5.24.36 PM.png")

- Java 8サポート
- ビルド時間の短縮
- Gradle4.0サポート
    - 既存プロジェクトを開いた際にプラグイン関係の更新やってくれるようです
    - AndroidGradlePlugin3.0α 
    - https://developer.android.com/studio/preview/features/new-android-plugin-migration.html
	
- InstantAppサポート
- パフォーマンスチェックツール強化
	- CPU, メモリ, ネットワークなどのリソース状況確認

CPUプロファイラー
![memory-profiler-callouts_2x.png](https://qiita-image-store.s3.amazonaws.com/0/44384/2bf037d8-557c-07e7-0be1-2f46a05f8331.png "memory-profiler-callouts_2x.png")

メモリプロファイラー
![Untitled_document22.png](https://qiita-image-store.s3.amazonaws.com/0/44384/c6ae2938-da0c-f8f2-2a45-8bdeb8fcb151.png "Untitled_document22.png")

- APK Debugger
- APK Analyzer
	- 中身のサイズチェックとかが出来るみたい
	- パッケージ、クラス、およびメソッドに加えて、フィールドを表示
	- minify有無でどうなるかは不明

### そのほか
- XMLフォントサポート
- レイアウトエディタまわりの強化
- File Explorer強化
git pullしてきたときに "git pull origin 自分のいるブランチ" するコマンド

適当に `pull`　と `push` を作りました。
pushについてはy/nとかつけたほうが良さそうな気もしますが、今はつけてないです

```lang:~/.bash_profile
git_branch() {
  echo $(git branch --no-color 2>/dev/null | sed -ne "s/^\* \(.*\)$/\1/p")
}
alias pull='git pull origin `echo $(git_branch)`'
alias push='git push origin `echo $(git_branch)`'
```

`git_branch()`はechoで今いるブランチを出力するだけの関数で、これを`git pull origin`に足してあげることでoriginの入力を省略してます。

pullした時の例

```
$ pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From github.com:aaaaa/iiiii
 * branch              develop    -> FETCH_HEAD
   ***********  develop    -> origin/develop
Updating ***********
Fast-forward
 path/to/filename | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
```

git pullしたときの挙動を今自分がいるブランチに直す方法がわからなかったので自分でつくりました。
誰かもっといい方法知っていたら教えてください〜
Kotlinでdpやspを簡単に変換する拡張

KotlinのExtensionを利用して以下のようにdp, spに変換することができます。

```kotlin
textView.textSize = 10f.sp

view.layoutParams = LayoutParams(
                LayoutParams.MATCH_PARENT,
                100.dp)
```


プロジェクト内に以下のファイルを置くとプロジェクト内のどこからでも使用できます。

```kotlin:MyUtil.kt
package com.yourapp.util // <- ここは各自のパッケージ名に変更

import android.content.res.Resources
import android.util.TypedValue
import android.util.TypedValue.applyDimension

val Float.dp get() = applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)
val Float.sp get() = applyDimension(TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics)
val Int.dp get() = toFloat().dp.toInt()
val Int.sp get() = toFloat().sp.toInt()
```
Flaskで作るTwitter投稿クライアント　簡易ログイン機能付き

#Flaskの学習

bottleもDjangoも一通り触ったのでFlask。
例によってまたTwitter APIを使います。

```shell-session
$ python3 -m venv flaskworks
$ ls flaskworks/
$ . flaskworks/bin/activate
(flaskworks)$ pip install flask
(flaskworks)$ pip install requests requests_oauthlib
```

bottleみたいにすごく簡単にディレクトリを作成していきます。

```shell-session
(flaskworks)$ cd flaskworks
(flaskworks)$ mkdir static
(flaskworks)$ mkdir templates
```

#テンプレートを作る

テンプレートの継承を利用するので2つ作成。

```base.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/css/style.css">
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <title>Tweet</title>
</head>
<body>
  <div class="container">
    <div class="row">
      <form method="post" action="/send">
        <input type="text" id="msg" name="msg">
        <input type="submit" value="Send Form">
      </fomr>
        {% block content %}
        {% endblock %}
    </div>
  </div>
</body>
</html>
```

```index.html
{% extends "base.html" %}
{% block content %}
  {% if msg %}
  <p>「{{msg}}」　と投稿しました</p>
  {% endif %}
{% endblock %}
```

#投稿用のアプリケーションを書いていく

とりあえず簡易ログイン機能をつけることにしました。実態はほぼbottleと同じですねこれは。

```tweet.py
import os
from requests_oauthlib import OAuth1Session
import requests
from flask import Flask, render_template, request, redirect, url_for, session
app = Flask(__name__)

app.config['SECRET_KEY'] = os.urandom(24)

C_KEY = '＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋'
C_SECRET = '＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋'
A_KEY = '＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋'
A_SECRET = '＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋'

Post_API = 'https://api.twitter.com/1.1/statuses/update.json'
tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)

@app.route('/')
def index():
    if 'username' in session:
        return render_template('index.html')
    return '''
        <p>ログインしてください</p>
    '''

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        if username == 'admin':
            session['username'] = request.form['username']
            return redirect(url_for('index'))
        else:
            return '''<p>ユーザー名が違います</p>'''
    return '''
        <form action="" method="post">
            <p><input type="text" name="username">
            <p><input type="submit" value="Login">
        </form>
    '''

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))

@app.route('/send', methods=['GET', 'POST'])
def send():
    if request.method == 'POST':
        msg = request.form['msg']
        url = Post_API
        params = {'status': msg,'lang': 'ja'}
        req = tw.post(url, params = params)

        return render_template('index.html', msg=msg)

if __name__ == '__main__':
    app.debug = True
    app.run()

```

#動作確認

```shell-session
(flaskworks)$ python tweet.py
```

<img width="306" alt="スクリーンショット 2017-05-18 10.47.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/54b26b8d-6a99-55a0-24c4-d10d85b722c2.png">


おしまい。


薄い本ですがまとめています
https://www.amazon.co.jp/dp/B0714D1VGP
SEO内部施策の基本のメモ


- 主要タグの見直し(title,meta,h1,h2)
- ぱんくずリストの設置
- XMLサイトマップ作成
- 関連記事など内部リンクを適切に設置
- SSL対応
- pageinsight：ページの表示速度計測と改善ポイントが表示されるツールで検証と改善
- モバイルフレンドリーテスト：スマホ対応にどれだけ最適化してるかツールで検証と改善
- 画像を記事にアップする際は、altタグに何の画像かわかりやすいテキスト

##参考にしている情報
http://static.googleusercontent.com/media/www.google.co.jp/ja/jp/intl/ja/webmasters/docs/search-engine-optimization-starter-guide-ja.pdf
https://support.google.com/webmasters/answer/35769?hl=ja
WordPressを想定したアタックURLの記録

WordPressを想定したアタックURLらしきものを、サーバーのログから拾ってきたのでメモしています。2017年4月～2017年5月前半ぐらいにあったものです。

### ログインページ

    /wp-login.php
    /wp-admin/

ログインページへのアクセスと思われるもの。WordPressではないウェブサイトにも、このようなアクセスが結構あります。
ログインURL自体を変える方法もありますが、まずは管理パスワードを強固なものにする、という対策が重要だと思われます。

### 設定ファイル

    /wp-config.orig
    /wp-config.php.orig
    /wp-config.php.bak
    /wp-config.bak
    /wp-config.php~
    /wp-config.php.old
    /wp-config.old

WordPressの設定ファイルのバックアップが、サーバー上にあるかどうかをチェックしにきていると思われるもの。もし、サーバー上に置いてある場合、データベースの接続情報が見えてしまう可能性があります。不要なファイルは置かないようにしましょう。

### 特定のテーマ

    /wp-content/themes/churchope/lib/downloadlink.php
    /wp-content/themes/awake/lib/scripts/dl-skin.php
    /wp-content/themes/elegance/lib/scripts/dl-skin.php
    /wp-content/themes/RightNow/includes/uploadify/upload_settings_image.php
    /wp-content/themes/Ghost/includes/uploadify/upload_settings_image.php
    /wp-content/themes/evolve/js/back-end/libraries/fileuploader/upload_handler.php
    /wp-content/themes/satoshi/upload-file.php

ファイル名を見る限りでは、ファイルアップロード、ダウンロード関係のファイルにアクセスを試みているようです。
まず考えるべきなのは、「テーマでファイルアップロード機能を実装する」ことの問題でしょう。

* テーマの役割を考えれば、独自のファイルアップロード機能を持つことは相当異常である
* WordPressでは、テーマカスタマイザーという機能が用意されている(独自のファイルアップロード機能を実装しなくて良い)

なので、セキュリティや脆弱性を議論する以前の問題で、独自のファイルアップロード機能を持つテーマは避けるべきでしょう。

### 特定のプラグイン

    /wp-content/plugins/myshe.php
    /wp-content/plugins/SocketIasrgasfontrol.php
    /wp-content/plugins/sql_dump.php
    /wp-content/plugins/SocketIontrol.php
    /wp-content/plugins/Fbrrchive.php
    /wp-content/plugins/really-simple-guest-post/simple-guest-post-submit.php
    /wp-content/plugins/dzs-zoomsounds/admin/upload.php
    /wp-content/plugins/google-mp3-audio-player/direct_download.php
    /wp-content/plugins/document_manager/views/file_download.php
    /wp-content/plugins/paypal-currency-converter-basic-for-woocommerce/proxy.php
    /wp-content/plugins/reflex-gallery/admin/scripts/FileUploader/php.php
    /wp-content/plugins/peugeot-music-plugin/js/plupload/examples/upload.php
    /wp-content/plugins/front-end-editor/lib/aloha-editor/plugins/extra/draganddropfiles/demo/upload.php

プラグインも、ファイル名を見る限り、ファイルアップロード、ダウンロードに関するものが多そうです。WP標準機能ではない実装を使いたくなる部分ではあるので、プラグインを導入する場合は、

* メリットとリスクを考える(リスク以上にメリットがあるかを考える)
* プラグインの実装を確認する

といったことが必要だと思われます。

### 情報募集中

他にも、こんなURLへアクセスがあった、という情報ありましたら、コメントでお知らせいただけると幸いです。
Cloud9 IDEでJupyter

# 目的
Hands-on Machine Learning with Scikit-Learn and TensorFlow [ageron/handson-ml](https://github.com/ageron/handson-ml)等の[Jupyter](http://jupyter.org/) notebookを[Cloud9](https://c9.io)で動かしてみよう。

---
# 前提
- Cloud9のaccount取得
- Cloud9 workspace起動

が完了していること

---
# インストール
```
$ pip install --upgrade pip
$ pip install --user --upgrade virtualenv
$ export PATH=~/.local/bin/:$PATH
$ which virtualenv
/home/ubuntu//.local/bin/virtualenv
```

---
# プロジェクトenvの準備
```
$ export PJ=~/workspace/hanson-ml
$ mkdir -p $PJ && cd $PJ
$ virtualenv env
(env)$ source env/bin/activate
(env)$ pip install --upgrade jupyter
(env)$ python -c "import jupyter"
(env)$ jupyter --version
4.3.0
```

---
# Jupyter起動
```
(env)$ jupyter notebook --port $PORT --ip $IP --no-browser
... The Jupyter Notebook is running at: 
http://0.0.0.0:8080/?token=TOKEN ...
```
URLをクリックして、OpenすればOK!
![Screenshot 2017-05-18 at 10.23.58.png](https://qiita-image-store.s3.amazonaws.com/0/36973/6e54ae46-358f-c94a-4386-eeda314e0fa8.png)
TravisCIで新しいMongoDBを使う

通常、TravisCIでMongoDBを使う場合、以下のようにtravis.ymlに記述する。

```yml:travis.yml
services:
  - mongodb
```

しかしここで利用可能になるmongoDBのバージョンは2017年5月現在で2.4.12になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28792/5112cb8a-1a5c-00de-f058-542c6ce68dc0.png)

新しいバージョン（ここでは3.2を利用する）を使いたい場合には以下の記事の通り、travis.ymlを書き換えるとうまくいった。
[install newer version of MongoDB](http://stackoverflow.com/questions/32945007/install-newer-version-of-mongodb-for-travis-ci)

```diff:.travis.yml
-services: mongodb
+addons:
+  apt:
+    sources:
+      - mongodb-upstart
+      - mongodb-3.2-precise
+    packages:
+      - mongodb-org-server
+      - mongodb-org-shell
```

この変更だけでmongodのサービスも起動するようになる。

ビルド内でバージョンを確認したところ、ちゃんと3.2系が使われていることが確認できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28792/3bc38cd1-f9ac-f626-700e-816bc5132f0d.png)
Listを任意の要素数ごとに分割する

# 概要

- 与えられたListを任意の数の要素ごとに複数のListに分割する
    - OracleのIN句のように一度に処理できる要素数に上限がある場合に有効

## Java 8の場合

Java 8ではストリームAPIを活用しリストを分割する

```java
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class CollectionUtils {
    public static <T> List<List<T>> chunk(List<T> list, int size) {
        if (list == null || list.isEmpty() || size <= 0) {
            return Collections.emptyList();
        }

        int block = list.size() / size + (list.size() % size > 0 ? 1 : 0);

        return IntStream.range(0, block)
            .boxed()
            .map(i -> {
                int start = i * size;
                int end = Math.min(start + size, list.size());
                return list.subList(start, end);
            })
            .collect(Collectors.toList());
    }
}
```

さらにコンパクトな例 (@natty420 さんより)

```java
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class CollectionUtils {
    public static <T> List<List<T>> chunk(List<T> list, int size) {
        return IntStream.range(0, (int) Math.ceil((double) list.size() / (double) size))
            .boxed()
            .map(i -> list.stream().skip((long) i * size).limit(size).collect(Collectors.toList()))
            .collect(Collectors.toList());
    }
}
```

## Java 9以降の場合

Java 9の導入された`Stream.iterate`を利用できる

```java
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CollectionUtils {
    public static <T> List<List<T>> chunk(List<T> list, int size) {
        return Stream.iterate(0, n -> n + size)
            .limit((list.size() + size - 1) / size)
            .map(n -> list.subList(n, Math.min(n + size, list.size())))
            .collect(Collectors.toList());
    }
}
```

## Google Guavaライブラリの使用

`Lists.partition`が同等の機能を提供している

```java
import com.google.common.collect.Lists;

import java.util.List;

public class CollectionUtils {
    public static <T> List<List<T>> chunk(List<T> list, int size) {
        return Lists.partition(list, size);
    }
}
```

# テストケース

```java:JUnit
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Arrays;

public class CollectionUtilsTest {
    @Test
    void testChunk() {
        Assertions.assertEquals(
            // Expected
            Arrays.asList(
                Arrays.asList(1, 2, 3),
                Arrays.asList(4, 5, 6),
                Arrays.asList(7, 8, 9),
                Arrays.asList(10)
            ),
            // Actual
            CollectionUtils.chunk(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 3)
        );
    }

}
```

# 参考

- [Listを指定サイズ毎に分割するutility](https://gist.github.com/tksmaru/5301447) 
  - [フォークしてJava8のStreamを利用してみる](https://gist.github.com/seijikohara/ab25c8e973a2afb286ec16d89891ab37)
RSpec で pending しても before :context が呼ばれてしまう

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/05/17/221959)からの転載です。

結果だけ先に書いてしまいますが『pending しているスコープで `before :context` を定義すると `before` のブロックが呼ばれます』。  
どういうことかというと次のように `before :context` 内で例外が発生した場合、テストが失敗してしまいます。

```ruby
describe X do
	# 以下のブロックを pending にする
	xcontext 'hoge' do
		# pending しているのにもかかわらず it 時に before のブロックが呼ばれてしまう
		before :context do
			raise "error"
		end
		it { expect(0).to eq 0 }
	end
end
```

これは pending してるのにもかかわらず `before` に `:context` を指定した場合、`it` 時にブロック内の処理が呼ばれてしまうためです。  
また、この問題(というべきかはわかりませんが)は `:context` を渡した時のみ発生し、引数を渡さなかったり `:example` を渡した場合には再現しません。  
ちなみに `:all` は `:context` のエイリアスなので `:all` を渡しても同様の問題が発生します。

## どういう時に困るのか

例えば、次のように `before` 内で実装する予定のメソッドを呼び出していると例外が発生するのでテストが失敗してしまいます。

```ruby
describe X do
	# X.hoge を後で実装する
	xcontext '.hoge' do
		before :context do
			# この段階では .hoge は未実装
			@result = X.hoge
		end
		it { expect(@result).to eq "hoge" }
		it { expect(@result).to be_kind_of String }
	end
end
```

こういう場合は `before :context` を使わなかったり、`before` 以外(`subject` など)を使用して回避する必要があります。  

## [関連]

https://github.com/rspec/rspec-core/issues/107

## [追記]

書き忘れてましたが RSpec のバージョンは 3.6.0 です。
JAVA-Eclipseを用いたMySQLのJDBCをロードするための手順

#準備
https://dev.mysql.com/downloads/connector/j/5.1.html
JDBCをダウンロードする。

#設定

Eclipseを起動し任意の名前でプロジェクトを作成。

Eclipse上でプロジェクトフォルダを右クリックしnewから新規フォルダを作成。

ダウンロードしたファイルを解凍する。

解凍したフォルダの中にあるjarファイルをコピーする。

Eclipseで新規作成したフォルダを右クリックしペーストする。

すると、フォルダの中にjarファイルが出来上がり、そのjarファイルを右クリックし、

Build Pathを選択しAdd to Build Pathをクリック。

以上。
Jupyterの小技5

# Jupyterの(マイナーな)マジックコマンド紹介
[Jupyterの小技4 - Qiita](http://qiita.com/SaitoTsutomu/items/34847c066880ebfdebf7)の続き

## %precision : 表示桁数設定

- 使用法1 `%precision` : デフォルトの設定を表示
- 使用法2 `%precision 3` : 小数点以下3桁表示に設定
- 使用法3 `%precision %08.3f` : 小数点以下3桁、全体で8桁、頭を0で埋めるように設定

## %bookmark, %cd, %pwd: ディレクトリ操作

### 使用例
c:\temp を workingdir(名称は任意可) ディレクトリとして登録

```py3:jupyter
%bookmark workingdir c:\temp
```

登録済み一覧表示

```py3:jupyter
%bookmark -l
>>>
Current bookmarks:
workingdir -> c:\temp
```

カレントディレクトリ表示

```py3:jupyter
%pwd
>>>
'C:\\Users\\tsutomu\\Documents'
```

登録したディレクトリに移動

```py3:jupyter
%cd workingdir
>>>
(bookmark:workingdir) -> c:\temp
c:\temp
```

元のディレクトリに戻る

```py3:jupyter
%cd -
>>>
C:\Users\tsutomu\Documents
```

ブックマーク削除

```py3:jupyter
%bookmark -d workingdir
```

全ブックマーク削除

```py3:jupyter
%bookmark -r
```

## 参考
[Built-in magic commands — IPython 3.2.1 documentation](https://ipython.org/ipython-doc/3/interactive/magics.html)

以上
第１回 Zendeskとは − Zendeskで顧客サポート

`別サイトで2014/4/16に投稿した記事です。別サイト閉鎖につき、移転しました。情報が古い可能性があるので、ご注意ください。`

## Zendeskとは
[Zendesk](http://www.zendesk.co.jp)とは、クラウドで利用する顧客サポートソフトウェアです。
デンマーク発のプロダクトで、現在はサンフランシスコに本社があります。4万アカウントが開設され、40種類以上の言語に対応しています。もちろん、日本語にも対応しています。

## 顧客サポートソフトウェアとは
例えば、モニタが映らなくなったら、メーカーに電話・メールで問い合わせるでしょう。

メーカーの顧客サポート部門では、顧客サポートソフトウェアを使って、顧客からの問い合わせを記録しています。そうすることで、メーカーは顧客からの問い合わせに漏れなく対応したり、製品改良や次の製品開発に役立てたりしようとしています。

Zendeskが新しいのは、クラウドで顧客サポートソフトウェアを提供している点です。
できることはシンプルで、顧客対応票（チケット）の管理です。

## 顧客サポートソフトウェアを使うメリット
チケットを管理することで、誰からどういう問い合わせがあったのかをブラウザ上で知ることができます（iPhone/iPad/Androidアプリからでも利用できます）。

今まで顧客サポートソフトを使ってこなかった会社なら、以下のことが期待できるでしょう。

* 顧客対応状況が一覧で分かるので、対応漏れも減らせる
* どのオペレータがどのお客さんにどういう対応をしたか分かる
* 対応件数などの統計を得られる

## Zendeskを使うメリット
さらに、Zendeskのいいところは、

* 申し込んだ当日からZendeskを利用できる
* 専門ソフトウェアのインストールが不要で、ブラウザから利用できる（顧客サポート用ITインフラの運用・保守も不要）
* Zendesk Voiceというオプション機能を使うと、電話対応もZendeskで管理できる

特に「電話対応もZendeskで管理できる」という点が大きいでしょう。
通常は、メール対応と電話対応システムは別になっており、両者（コンピュータと電話）を統合しようとすると、CTI（Computer Telephony Integration)ソフトウェアが必要になり、なかなか大変です。

しかし、Zendeskであれば、数クリックで電話番号を取得し、Zendeskに組み込めます（電話はZendeskとは別料金です）。
メールと電話を同じ画面上（同じシステム）で管理できるため、対応漏れを防いだり、管理コストを減らしたりする効果が期待できます。

＊ただし、Zendesk Voiceは簡単に使いはじめられますが、機能は限られています。
Zendesk Voice以上のことがしたい場合は、Zendesk API を利用して、Twilioというクラウド電話サービスと連動させることで、電話機能を拡張できます。詳しくは、別の回で説明します。

## 価格とプラン
1ヶ月の無料利用期間、有料プランは月額1ドルからあるので（2014年4月現在）、まずは試してから判断するといいのではないでしょうか。

[https://www.zendesk.co.jp/pricing](https://www.zendesk.co.jp/pricing)

## Zendeskに電話を組み込む場合の電話利用料
[https://support.zendesk.com/entries/23069713](https://support.zendesk.com/entries/23069713)

## まとめ
Zendeskの登場によって、即日・月額利用料で、便利な顧客サポートソフトウェアが利用できるようになりました。

加えて、メール・電話を統合的に利用できるようになったのは大きいと思います。
「CTIは高すぎて無理」とお考えでしたら、一度、Zendeskを試してみる価値はあると思います。

＊Zendeskで扱えるチャネルは、メールと電話だけではなく、チャット・Facebook・Twitter・Q&Aサイトなど、いろいろあります。
[料金プラン](https://www.zendesk.co.jp/pricing)の「顧客とのコミュニケーションチャネル」に10個のチャネルのリストが載っています。

## Zendesk公式サイト
[https://www.zendesk.co.jp/](https://www.zendesk.co.jp/)
Git Stash 临时保存技术

#Git Stash

```git stash save```
用于保存当前分支中的修改内容，save的意思是コメント的意思。

```git stash list```
查看保存一覧

```git stash pop```

从Git栈中读取最近一次保存的内容，恢复工作区的相关内容。由于可能存在多个Stash的内容，所以用栈来管理，pop会从最近的一个stash中读取内容并恢复。并删除曾经的保存。

```git stash clear```

清空Git栈。此时使用gitg等图形化工具会发现，原来stash的哪些节点都消失了。

```git stash save --include-untracked```

这里也可以使用git add命令加上untracked文件.



#有关stash的其他命令

shortcut|相同的命令或者说明
-------------|-------------
git stash|git stash save
git stash apply |git stash apply stash@{0}
git stashdrop|git stash drop stash@{0}
git stash pop|git stash apply 和 git stash drop
git stash list	|查看stash列表
git stash list --stat|list可以加和git log一样的参数，stat表示显示改变
git stash show stash@{0}|显示一个stash内容
git stash show|git stash show stash@{0}
git stash show --patch |显示文件差异
git stash save "yin save"|给stash加上说明信息
git stash branch LittleBear stash@{0}|创建LittleBear分支，然后再stash pop
git stash save --keep-index |staging area not to be stashed