OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] WebViewからWebViewページの特定のリンクをタップしたときの挙動を制御する

#WebViewからページ内のリンクをタップした時にアプリ側で何かしらの制御をする
今回WebViewページから特定のリンクをタップするとアプリ内で検知してViewを表示するなり、メーラーを起動するようなものを作ってみたのでメモ。


```swift:WebViewController.swift    
    //
    // 省略
    //

    // このメソッドで特定のリンクを検知してアプリ内で制御する
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        //タップしたリンクのURLを取得
        let url = navigationAction.request.url?.absoluteString
        // aaaの場合はあるviewをmodalで出す
        if url == "aaa" {
            let storyboard = UIStoryboard(name: "", bundle: nil)
            let nextView = storyboard.instantiateInitialViewController()
            self.present(nextView!, animated: true, completion: nil)
            decisionHandler(.cancel)
            return
        }
        // bbbの場合はメーラーを起動する 
        else if url == "bbb" {
            self.sendMail()
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
}

// MARK: - MFMailComposeViewControllerDelegate　メーラーを起動する
extension WebViewController: MFMailComposeViewControllerDelegate {
    func sendMail() {
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            mail.setSubject("[お問い合わせ]")
            let toRecipients = ["xxx@xxx.xx"]
            mail.setToRecipients(toRecipients)
            mail.setMessageBody("お問い合わせ内容", isHTML: false)
            present(mail, animated: true, completion: nil)
        } else {
            print("送信できません")
        }
    }
    
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        switch result {
        case .cancelled:
            print("キャンセル")
        case .saved:
            print("下書き保存")
        case .sent:
            print("送信成功")
        default:
            print("送信失敗")
        }
        dismiss(animated: true, completion: nil)
    }
}
```




・参考
https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455641-webview
Visual Studio Code + mac で非常に良く使うショートカット


## コード整形

整形したい範囲を選択して、
``` Cmd + K → Cmd + F ```


## バックシュラッシュ「\」の入力
``` alt(option) + ¥ ```

## 区切りがいいところまで移動

``` alt + ←or→ ```

## 端っこまで移動

``` Cmd + ←or→ ```

## タブ移動

左移動
``` shift + Cmd + [ ```

右移動
``` shift + Cmd + ] ```

## Grep 横断検索
``` Shift + Cmd + F ```

※ほとんど他エディターと共通ですが。


## 一行選択

``` マウスで左クリック x3回```

## すべて選択

``` マウスで左クリック x4回```

## 他のファイルをサクッと検索して開く

``` Cmd + p ```

で、検索窓がでる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/1f440b37-0d95-7091-470a-e9d1f5dc63b9.png)


## 誤字変数を修正する

``` 変数を選択して + F2 ```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/d72e9f20-5318-ee05-f7aa-582182f86938.png)

※ちゃんと参照している4つの変数名も変換してくれる！リファクタリングにとても便利！


> ### 環境
macOS sierra
Visual Studio Code バージョン1.15.1 (1.15.1)
AWS WAF導入　ブラックリストによるアクセス拒否

#AWS WAFとは
- 2017.9月時点で、CloudFrontとALBにのみ適用可能
- 悪意あるウェブリクエストのアクセスを拒否する


#IP address（IP一致制限条件）でできること
- 設定したIPアドレスのアクセスを拒否or許可
- **指定したしきい値（最小2000）以上のリクエストを、5分以内に行ったIPアドレスのみ自動で拒否（Rate-based ruleのみ）**


#やること
- Web ACLsの作成（Application Load Balancerへの適用）
- Conditionsの作成（IP addresses）
- Rulesの作成
- AWS WAFを作成済みのALBに適用させる


#前提
 - Application Load Balancerを作成済み。


#WAF作成手順
1.AWSコンソールにログインする。

2.WAFの画面へ移動
>[サービス]⇒[WAF & Shield]
<br>

3.ACLの作成
>[Create web ACL]⇒[Next]
 - Web ACL name: 任意のACL名
 - CloudWatch metric name: 任意の名前（Web ACL nameを入力すると自動ではいる。）
 - Reigion: 任意のリージョン
 - AWS resource to associate: WAFの適用先
![02.png](https://qiita-image-store.s3.amazonaws.com/0/168635/6ecfc5d9-ec44-403b-91e4-7a488ba58402.png)
<br>

4.Conditionsの作成（今回はIP制限、ブラックリストによる制限）
>IP match conditionsの[Create condition]⇒設定項目を入力⇒[Next]
 - Name: 任意のCondition名
 - IP Version: WAFの対象となるIPアドレスバージョン
　※ここで設定しないと、デフォルトアクションが適用される。 
　　⇒デフォルトアクションがAllowの場合、全許可（0.0.0.0/0）。
　　　デフォルトアクションがBlockの場合、全拒否になる。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/168635/4ea05d64-e7ad-2dbe-ab40-96c4def38aa5.png)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/168635/f41a460f-e15b-c09f-812a-44e9929e13bf.png)
<br>

5.Rulesの作成
>[Create rule]⇒[Create]
●Ruleの作成 
- Name: 任意のRule名
 - CloudWatch metric name: 任意の名前（Nameを入力すると自動ではいる。）
 - Rule type: [Rate-based rule]を選択。
 - Rate limit: 任意のしきい値（5分間のリクエスト数の上限）最低2000
●Add match conditionsの設定
 - does: リクエストが条件に一致するときに選択
 - does not: リクエストが条件に一致しないときに選択
 - original from an IP address in: IP制限のときに選択
 - 4.で作成したConditionを選択（多分Black listとかになる？）
![06.png](https://qiita-image-store.s3.amazonaws.com/0/168635/1dc7777a-b3b4-32be-eb3e-54ca1ff526b0.png)
<br>

6.作成したRuleの動作を設定
>作成したRuleの動作（BlockかCount）とデフォルトアクション（AllowかBlock）⇒[Review and create]
![07.png](https://qiita-image-store.s3.amazonaws.com/0/168635/a6836615-1e9f-f303-158f-b6fdda54074e.png)
<br>

7.最終確認をして作成する
>[Confirm and create]
![08.png](https://qiita-image-store.s3.amazonaws.com/0/168635/e716304d-76bc-30e6-e058-3da68a46dfd3.png)
Macにrmagickをインストールする

Mac環境で動いているRailsに画像処理gemの`rmagick`を入れようとしたら少し詰まったのでまとめておく。

# 環境

```
$ rails -v
Rails 5.1.3

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```

# Gemfile

今回は、画像をアップロードするためのgemである`carrierwave`も一緒に入れる。

```
gem 'carrierwave'
gem 'rmagick'
```

# ImageMagickのインストール

ImageMagickは7系が最新だが、rmagickは6系にしか対応していない。

まだ、ImageMagickがインストールされていない場合は、以下のコマンドでインストールできる。

```
$ brew install imagemagick@6
```

すでに7系のImageMagickがインストールされている場合は、アンインストールしてからインストールする。

```
$ brew uninstall imagemagick
$ brew install imagemagick@6
$ brew link --force imagemagick@6
```

また、PATHが認識されない場合はPATHを追加。

```
$ export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"
```

# `bundle install`

```
$ bundle install
```

これで、`carrierwaver`と`rmagick`が入る。
```
フロントエンドエンジニアのための webpacker

webpacker:install:react とかはしない。Rails上で素の webpack がほしい人のためのガイド。

rails new ~ で webpacker が生成されるのは v5.1 以降らしいが、 Rails 4.2 以上ならインストール可能。

モチベーションとして、アセットサーバーとかダイジェストの生成とかを rails 側に投げたい。あわよくばいい感じに code splitting にも載せたい。そのための下調べ（この記事では code splitting までいかない。結局 digest の問題がある）

## プロジェクトを生成

```
gem install rails -v 5.1.0
rails new mypackapp --webpack
```

後付の場合は Gemfile に webpacker を追記する。略。

bin/webpack と bin/webpacker をインストールする

```
bin/rails webpacker:install
```

そのままじゃなんか足りないのでyarnでインストールした

```
yarn add webpack @rails/webpacker -D
```

アセットサーバーを立てる

```
bin/webpack-dev-server
```

プロダクション用の Hash digest 付きで出力

```
bundle exec webpacker:compile
```


## 実際のコードと設定

- app/javascripts/packs 以下の .js がエントリポイントになる
- `<%= javascript_pack_tag 'application' %>` で `app/javascripts/packs/application.js` を エントリポイントにwebpackでビルドしたもので返却する
- webpackの設定は config/webpack/* にあるように見えるが謎の定義ファイルを require してる
    - 実体は `https://github.com/rails/webpacker/blob/master/package/environment.js` の Environment#toWebpackConfig()
    - (正直面倒なので外出ししないでほしい)
    - ちゃんと追ってないけど、デフォルトだと babel-loader 通って .babelrc も読まれる

つまり実際に webpack の設定をガリガリ拡張したりする場合はこうなる

```js
// config/webpack/development.js
const environment = require('./environment')

module.exports = Object.assign({}, environment.toWebpackConfig(), {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [{ loader: 'babel-loader' }]
      }
    ]
  }
})
```

↑は自分で babel-loader を定義する場合。どうせ production もやるんだから environment 側に寄せてもよさそう。
任意のコマンドをコア数分並列実行する

備忘録です．

シミュレーションなどで同じスクリプトを何回も回したい時があると思います．
その際にコア数分だけ並列に実行します．
TIMEを必要回数分設定し，write scriptと書いてある部分に実行したいスクリプトを書いてください．

```bash
#!/bin/bash

TIME=22

core=`nproc`
quo=$(( $TIME / $core ))
mod=$(( $TIME % $core ))
[ $mod -eq 0 ] && rep=$quo || rep=$(( $quo + 1 ))

for j in `seq 1 $quo`;do
    echo $j"/"$rep
    for i in `seq 1 $core`;do
        n=$(( $core * ($j - 1) + $i ))
        # write script
        echo $n
    done
    wait
done

echo $rep"/"$rep
for i in `seq 1 $mod`;do
    n=$(( $core * $quo + $i ))
    # write script
    echo $n
done
```
if __name__ == '__main__':とは

#スクリプト
chainerを少しいじり始めてから気になったことがあって、
ファイルの一番下に

```py
if __name__ == '__main__':
   main()

```

というのがあって
なんでこんな風に関数を呼び出して実装しているのかなと思ったら、
Pythonに於いて

コマンドプラインからPythonスクリプトファイルを選択してPythonインタプリタを起動して実行すると、
指定されたファイルは

```
__main__
```

というモジュールとして読み込まれる。
実行中のスクリプトファイルのモジュール名は

```
__name__
```

という名前の変数に設定されていて、これを参照した時にファイルがコマンドラインから実行されたのか、それともimport文から読み込まれて実行されたのかの判断ができるようになっている。

だからトップレベルファイルとして選択された時のみ呼び出されるから他のモジュールから呼び出された時に実行されない。

#結論
ファイル内のクラスやら関数やらを使い回すのに便利になる。


#追記
ファイル内のmoduleがどうなっているかの確認で

```
print(vars())
```
を実行したら

```py3
..., '__name__': '__main__',......,
'np': <module 'numpy' from '/Users/~~~/numpy/__init__.py'>,...
```
みたいに色々と見えました。
isc-dhcpで、option code 161,162を定義する方法

isc-dhcpで、option161を定義する方法です。

どういう場合に利用するかというと、
シンクライアントの設定定義ファイル取得時当に利用します。
参考URL)http://ja.community.dell.com/techcenter/b/weblog/archive/2014/02/14/wyse-zero-config-setup-basic

<h2>利用バージョン等</h2>
- CentOS 7 x64
- ISC DHCP 4.2.5

<h2>dhcpd.confの書き方</h2>
下記のように定義します。

```bash:dhcpd.conf
option ftp-server code 161 = ip-address;
option ftp-server-path code 162 = text;

option ftp-server xxx.xxx.xxx.xxx;
option ftp-server-path "string";
```

名前とcodeを定義し、その定義の型を定義します。
その後に、定義した名前に対して設定したい値を”＝”　なしで定義します。

ここにわからずしばらくはまりました・・・。
同じように悩んでいる方のお役にたてば幸いです。
[Vagrant] vagrant upでコケる件

## あらまし

Vagrantで環境構築をしていて、作業開始時に、vagrant upをしようとすると、エラーを吐いてコケるようになった。
腹立つから「destroyして再upたら治るやろー」とdestroyしてからupしても、コケる。
なんでじゃー (:3_ヽ)_ .

エラーメッセージからすると、どうも文字化けが関わってるクサいなぁ。
しかし、調べてもなかなかわからなかった (´･ω･｀)

## 前提情報

|name|version|
|:------|:------|
|Host OS|Windows7 Professional|
|Vagrant|1.9.6|
|VertualBox|5.1.26|
|box|centos/7|

## エラーメッセージ

ERROR warden: Error occurred: "\x87" followed by " " on Windows-31J

- [[Java] シフトJISの扱い](http://qiita.com/yoshi389111/items/9060c8b62df7cac31de9)
    - 文字化けクサいと言う参考情報。
    - "\x87\x40"？
        - だとしたら、"①"らしい。

## 解決手順

見付からんなぁと思いながら探していたところ、バージョン違いながら、ドンピシャっぽい記事を発見。

- [VagrantコマンドでEncoding::InvalidByteSequenceError](http://qiita.com/mokuo/items/fb18713c4f0a19d9c48e)

```C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-v.e.r/lib/vagrant/util/io.rb
# data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)
data << io.readpartial(READ_CHUNK_SIZE).encode("Windows-31J", Encoding.default_external)
```

なんかよくわからんけど、"UTF-8"に変換してたのを"Windows-31J"に変換するように修正…ということ。
Rubyはわからん… (:3_ヽ)_ .

修正して、vagrant up。
確かに、この対応でエラーは消えた。
そして、ちゃんとVirtualMachineは立ち上がった。
ありがたやありがたや (\*´ω｀\*)

**注意点としては、Cドライブのアレなフォルダにファイルがおわしやがるので、まずはデスクトップにでもコピーして、編集して、それから元のフォルダに移動して上書きするのが妥当かと。**

喜びも束の間…設定してあるはずの自動マウントができていなかった… (:3_ヽ)_ .
というか、別のエラーが出てた… (:3_ヽ)_ .

ぼ、ぼ、ぼ、ぼくたちの旅はまだまだ終わらないッッッ!!!(灰色決着)
RectTransformの矩形からスクリーン矩形を得る

#環境
Unity2017.1.0f3

#概要
RectTransformの矩形からスクリーン矩形に変換します
主にWebViewの表示領域に使用します

コガネブログさんが作成したのを使用すると良いと思います。
http://baba-s.hatenablog.com/entry/2019/06/21/090000

#GreeのWebView
[GreeのWebViewをWindowsのUnityEditorである程度動作させるとっかかり](http://qiita.com/fukaken5050/items/7d0fba55565d7e53dcc8)

#プログラム

~~~c#
using UnityEngine;

public class TestRectTransformToScreenSpaceRect : MonoBehaviour
{
	[SerializeField] RectTransform _rectTrans = null;

	private Rect _screenRect;

	private void Update ()
	{
		_screenRect = CalcurateScreenSpaceRect( _rectTrans );
	}

	private static Rect CalcurateScreenSpaceRect( RectTransform rectTrans )
	{
		var canvas = rectTrans.GetComponentInParent<Canvas>();
		var camera = canvas.worldCamera;
		var corners = new Vector3[ 4 ];
		//左下、左上、右上、右下
		rectTrans.GetWorldCorners( corners );
		var screenCorner1 = RectTransformUtility.WorldToScreenPoint( camera, corners[ 1 ] );
		var screenCorner3 = RectTransformUtility.WorldToScreenPoint( camera, corners[ 3 ] );

		//左下基準
		var screenRect = new Rect();
		screenRect.x = screenCorner1.x;
		screenRect.width = screenCorner3.x - screenRect.x;
		screenRect.y = screenCorner3.y;
		screenRect.height = screenCorner1.y - screenRect.y;
#if false
		//左、上、右、下
		var margin = new Vector4( screenCorner1.x, Screen.height - screenCorner1.y, Screen.width - screenCorner3.x, screenCorner3.y );
		Debug.Log("margin x:" + margin.x + "y:" + margin.y + "z:" + margin.z + "w:" + margin.w );
		_WebView.SetMargins( (int)margin.x, (int)margin.y, (int)margin.z, (int)margin.w ); 
#endif
		return screenRect;
	}

	private static Texture2D _debugTexture = null;
	private void OnGUI()
	{
		if( _debugTexture == null )
		{
			_debugTexture = new Texture2D( 4, 4, TextureFormat.ARGB32, false );
			for (int y = 0; y < _debugTexture.height; y++) {
				for (int x = 0; x < _debugTexture.width; x++) {
					Color color = new Color( 1.0f, 0.0f, 0.0f, 0.5f );
					_debugTexture.SetPixel(x, y, color);
				}
			}
			_debugTexture.Apply();
		}
		//こっちは左上基準
		var rect = _screenRect;
		rect.yMax = Screen.height - _screenRect.yMin;
		rect.yMin = rect.yMax - _screenRect.height;
		GUI.DrawTexture( rect, _debugTexture );
	}
}
~~~
vimのINSERTモードでカーソル上下左右移動できるようにする

「数文字だけ移動したい、でもINSERTモードを抜けるのは面倒！」というとき、INSERTモードでもカーソルの上下左右移動をできるようにする方法です。部分的にEmacsキーバインドを採用するやりかたです。

## やりかた

.vimrcに次のキーマップ定義を追加しておきます。

```vim:.vimrc
imap <C-p> <Up>
imap <C-n> <Down>
imap <C-b> <Left>
imap <C-f> <Right>
```

以上。
トラブルシューティング: Fatal error: Class 'Goodby\CSV\Import\Standard\LexerConfig' not found

[goodby/csv]を使っていて 「Fatal error: Class 'Goodby\CSV\Import\Standard\LexerConfig' not found in ○○.php on line ○」というエラーがでた場合の対処方法を紹介します。

[goodby/csv]: https://github.com/goodby/csv

## 症状と処置

### Composerのautoload.phpを読み込んでいない

__症状__

* vendor/goodby/csvがあるが、クライアントコードに`require 'vendor/autoload.php';`を書いていない。

__処置__

* クライアントコードに`require 'vendor/autoload.php';`を書く。

### goodby/csvをインストールしていない

__症状__

* vendor/goodby/csvというフォルダがない。

__処置__

* `composer install`を実行してgoodby/csvをインストールする。
[Unity]Assetが使われているかどうかを検索するエディタ

アプリをリリースする際にアプリサイズを減らすために、
フォルダ整理をしなくてはならないのですが、
アジャイル開発をしていたり、仕分けが適当すぎてどれがいらないものかわかんねー！ってなるので、あると便利かなと思って作りました。

#追記
●こちらにソースコドやらUnityパッケージやらがあります。
どうぞご活用ください。
https://github.com/Uroco/CheckAssetDependences

●2019.2.15f1で動作確認済み

●記事のコピペ用のソースコードは削除しました。

#やり方
Assetはそれぞれmetaデータが生成され、そこにつけられているコンポーネントや素材のデータが書かれています。
GUIDというUnity上でAssetを管理するためにつけられる一意の文字列があり、それらが素材名やパスの代わりに使用されmetaデータに保存されています。
調べたいAssetのGUIDを取得し、全AssetからそのGUIDを使用しているAssetを抽出します。

#AssetDatabaseクラス
アセットについていじくるならこのクラスの関数が必須
使ったものについてまとめます。

**FindAssetsメソッド**
string[] FindAssets(string filter);
string[] FindAssets(string filter, string[] searchInFolders);
アセットを検索するメソッド。戻り値はヒットしたGUIDたちです。
filterには検索する対象を指定することができます。
例）`AssetDatabase.FindAssets ("box t:prefab t:material", new string[]{ "Resources/Temp" });`
検索結果は「boxの名前を含み　prefab もしくは material で、Resources/Temp下にあるもの」
filterはAND条件ではなくOR条件なので、条件を追加すればするほど範囲が拡がってしまいます。

**GUIDToAssetPathメソッド**
string GUIDToAssetPath(string guid);
GUIDからAssetの相対パスを取得できます。まんま

**GetDependenciesメソッド**
string[] GetDependencies(string pathName);
string[] GetDependencies(string pathName, bool recursive);
パスを指定したAssetが使用しているAssetのパスを返します。
recursiveは、検索の範囲を指定します。
falseにすると指定したAssetが直接使用しているもののみ返します。
trueは直接でないものも含みます。prefabでいうと、子関係にあるものが使用しているものも含みます。
デフォルトはtrueです。

#エディタの説明
モードが無駄に３つあり、「検索モード」「参照モード」「ファイル検索モード」です。

- 検索モード
<img width="589" alt="スクリーンショット 2017-09-05 16.15.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/342de9f7-a455-c39f-7023-d6176e7e2b23.png">

1、Search Mode をInputに
2、AssetNameに検索したい名前を入れる
3、Found Assets内に表示されたAssetの名前をクリック
4、クリックされたAssetの使用元が検索され表示される

- 参照モード
<img width="591" alt="スクリーンショット 2017-09-05 16.15.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/293192d2-4a8a-c748-039d-71787a25ed14.png">

1、Search Mode をReferに
2、調べたいAssetをProjectビューからドラッグ＆ドロップ
3、使用元が検索され表示される

- フォルダ検索モード<br>
「フォルダの中からどこからも使用されていないAsset」を抽出します。
<img width="588" alt="スクリーンショット 2017-09-05 16.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/faf75427-69bd-a60d-117b-52bc119d3e50.png">

1、Search Mode をIn Fileに
2、待つ
3、結果が表示される

#終わりに
綺麗なUIとかツールとか作るのって大変ですね。
最新1万件の平均いいね数は4.66


## はじめに
ストックといいねが分かれてある程度の期間が過ぎ，ここで平均いいね数を知りたいと思ったのですが，特にまとめている記事がなかったので下の記事を参考にまとめてみました．


参考：[「平均被ストック数は9」「被ストック数100以上の記事は1%」…QiitaAPIv2で1万件の投稿を分析して分かったこと](http://qiita.com/kure/items/0895983c3e05bfdf8377)


## データの取得方法
ストック数を調べるのとは違い，投稿された記事の取得API(`GET /api/v2/items`)で返って来るJSON内に「記事につけられたいいねの数」(`likes_count`)が含まれています．

最新1万件の投稿を取得して，その中に含まれているいいね数を集計すれば平均を割り出せます．
（1万件以上の投稿を取得する方法がわからないので，最新1万件としています）


### 注意点
1万件取得といっても一括取得ではなく，100件取得を100回繰り返すことになるので，API使用回数は100回になります．
アクセスキーを発行していれば1時間で1000回まで利用できますが，認証していない状態では1時間に60回までという制限があるので，おそらく途中で引っかかります．


## コード
Googleスプレッドシート上で集計する予定だったので，GASで組みました．

やってることは単純です．

1. スプレッドシートを開く
2. Qiita API を利用し，1万件を取得（実際は100件を100回取得している）
3. 返って来たJSON内のいいね数をスプレッドシートに記入していく
4. (手動)スプレッドシート上で関数やグラフを使って集計


```js
function myFunction() {
  const ss_id = <スプレッドシートID>;
  const QiitaAuth = <Qiita API アクセスキー>;
  
  // スプレッドシートを開く
  var ss = SpreadsheetApp.openById(ss_id);
  var sheet = ss.getSheets()[0];
  
  // Qiita API アクセスキー設定
  const headers = {'Authorization' : 'Bearer ' + QiitaAuth};
  const params = {'headers' : headers};   

  // 1万件の取得
  for(var i=1; i<=100; i++){
    var queue = [];
    var url = 'https://qiita.com/api/v2/items?page='+i+'&per_page=100';
    
    var response = UrlFetchApp.fetch(url, params);
    var content = response.getContentText('UTF-8');
    var items = JSON.parse(content);
    
    items.forEach(function(item){
      queue.push([item.likes_count]);
    });
    
    // スプレッドシートへ記入
    sheet.getRange((i-1)*100+1, 1, 100).setValues(queue);
  }
  return 0;
}
```


ちなみにこのコードの実行時間は281秒でした．
GASで動かすときは，1回の実行が5分以内という制限があるので結構ギリギリでした．


## ヒストグラム
参考にした記事に倣ってヒストグラムにしてみました．

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/170435/bb55a837-fe05-a27a-4ca8-a97dcbf6bd5f.png "chart.png")

2桁以上のいいねがつく記事が少ないことがわかります．

## 詳しい結果

今回のコードの実行日時は2017/09/04 18:23です．

詳しい数値は下の表のようになりました．

| いいね数 | 記事数（％） |
|:-------:|:----------:|
| 0       |   43.56    |
| 1-9     |   49.27    |
| 10-19   |    4.00    |
| 20-39   |    1.88    |
| 40-59   |    0.47    |
| 60-79   |    0.17    |
| 80-99   |    0.13    |
| 100-299 |    0.3     |
| 300-    |    0.22    |


また，いいね数の **平均値は「4.66」** ， **中央値は「1」** でした．


## 雑記
実は初投稿だったりします．

元々はQiitaの記事をSlackに流すための基準をいいね数に変更しようと思って，そのベースラインはいくつがいいのかなと思ったのが始まりでした．

ストック数の平均も出したかったのですが，思ったより実行に時間がかかっていたので，実行時間制限を考える必要が出て来てとりあえず諦めました．
（そのうち頑張るかもしれません）
AzureCosmosDBのUDFを使ってページネーションとソートをする

# やりたいこと
[AzureCosmosDBでUDFを使ってjson arrayのPagenationとSort](http://qiita.com/tstakano-yj/items/e47a2d82ae995b26d44e)の記事でAzure Functions、CosmosDBを使ってsearchAPIの作り方が紹介されています。
こちらの記事を参考にページネーションを?page=4&limit=50のようにしたいと思います。
本記事ではUDF（ユーザ定義関数）以外は省略しますので詳細を理解するには最初に上記記事を読んでください。

# UDFの修正点
- 引数start, endをpageとlimitに変更。
`page` はページ番号（デフォルト1）、`limit`は１ページに表示する件数（デフォルト100）です。
もしpageやlimitが整数以外、最小値より小さい値だった場合はデフォルト値に置き換えることにします。

- 引数`order`の値はDESCからTime（昇順）、-Time（降順）に変更。

# 完成したUDF
```sort
function sort(contents, page, limit, order) {  
    /*
        ページング
    */
    page = Number(page);
    limit = Number(limit);
    var MIN_PAGE_NUM = 1;
    var MIN_LIMIT_NUM = 1;

    if (!isValidData(page, MIN_PAGE_NUM)) {
        page = 1;
    }
    if (!isValidData(limit, MIN_LIMIT_NUM)) {
        limit = 100;
    }

    start = limit * (page - 1);
    end = page * limit;
  
    function isValidData(data, min) {
        if (isInteger(data)) {
            if (data < min) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    }

    function isInteger(x) {
        return Math.round(x) === x;
    }

    /*
    ソート
    */
    function compareTime(a, b) {
        if (order == '-Time') {
        return b.Time - a.Time;
        }
        else{
        return a.Time - b.Time;
        }
    }
    return contents.sort(compareTime).slice(start, end);
}
```
読み取り専用パーティション（Oracle Database 12c Release 2新機能）を試す

Oracle Database 12c Release 2の新機能である読み取り専用パーティションを試します。

# 読み取り専用パーティション
Oracle Database 12c Release 1以前では、テーブルを読み取り専用することと、テーブルが格納されている表領域を読み取り専用にすることができました。Oracle Database 12c Release 2では、パーティション単位に読み取り専用を指定できるようになりました。

## 読み取り専用パーティションの指定
パーティションを読み取り専用に指定するには、ALTER TABLE MODIFY PARTITION文にREAD ONLYを指定します。現在の状況を確認するには{DBA|ALL|USER}_TAB_PARTITIONSビューのREAD_ONLY列を確認します。この列がYESの場合、パーティションは読み取り専用になっています。

```
SQL> CREATE TABLE plist1 (c1 NUMBER, c2 VARCHAR2(10)) PARTITION BY LIST (c1)  (
        PARTITION p1 VALUES (100),
        PARTITION p2 VALUES (200),
        PARTITION p3 VALUES (300)
     );

Table created.

SQL> ALTER TABLE plist1 MODIFY PARTITION p1 READ ONLY ;

Table altered.

SQL> SELECT PARTITION_NAME, READ_ONLY FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='PLIST1' ;

PARTITION_NAME                 READ
------------------------------ ----
P1                             YES
P2                             NO
P3                             NO
```
パーティションを読み取り専用にするには、ALTER TABLE MODIFY PARTITION READ ONLY文を実行します。逆に読み書きできるように変更するには、ALTER TABLE MODIFY PARTITION READ WRITE文を実行します。

```
SQL> ALTER TABLE plist1 MODIFY PARTITION p1 READ WRITE ;

Table altered.
```

## 読み取り専用パーティションに対するアクセス
読み取り専用に設定したパーティションに対する更新DMLは、当然ながら拒否されます。

```
SQL> INSERT INTO plist1 VALUES (100, 'insert') ;
INSERT INTO plist1 VALUES (100, 'insert')
            *
ERROR at line 1:
ORA-14466: Data in a read-only partition or subpartition cannot be modified.

```

また、直接パーティションに対する変更操作もできなくなります。

```
SQL> ALTER TABLE plist1 DROP PARTITION p1 ;
ALTER TABLE plist1 DROP PARTITION p1
*
ERROR at line 1:
ORA-14466: Data in a read-only partition or subpartition cannot be modified.
```
imagemagick と rmagick のインストールでつまづいたときに確認する手順


毎回悩むので手順をまとめました。


## 対応する環境

```prettyprinted
Mac OS X 10.12.6
ruby 2.4.1p111
imagemagick@6 6.9.9-10
rmagick 2.16.0
```


## よく見かけるエラー

`gem install`, `bundle install` 時のエラー。

```prettyprinted
Installing rmagick 2.16.0 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
    :
Can't install RMagick 2.16.0. Can't find MagickWand.h.
```


`bundle doctor` のエラー。

```prettyprinted
% bundle doctor
The Gemfile's dependencies are satisfied
The following gems are missing OS dependencies:
 * rmagick: /usr/local/opt/imagemagick/lib/libMagickCore-6.Q16.3.dylib
 * rmagick: /usr/local/opt/imagemagick/lib/libMagickWand-6.Q16.3.dylib
```




## ImageMagick をインストールする

**現行の `rmagick v2.16.0` の対応するバージョンは `ImageMagick v6` までです。
`ImageMagick v7` には対応していません。**


### imagemagick 6 をインストールする

brew で ImageMagick v6 系を再インストールします。

```prettyprinted
% brew uninstall --force imagemagick@6
% brew install imagemagick@6
```

パスが追加されていなければ追加します。

```:~/.zshrc
export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"
```


### 動作を確認する

`convert` コマンドで動作を確認します。

```prettyprinted
% convert --version
Version: ImageMagick 6.9.9-10 Q16 x86_64 2017-08-28 http://www.imagemagick.org
Copyright: © 1999-2017 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
```




## rmagick をインストールする


### rmagick を uninstall する

rmagick を uninstall します。

```prettyprinted
% bundle exec gem uninstall rmagick
Successfully uninstalled rmagick-2.16.0
```


### PKG_CONFIG_PATH を調べる

```prettyprinted
% brew info imagemagick@6
    :
If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.zshrc

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/imagemagick@6/lib
    CPPFLAGS: -I/usr/local/opt/imagemagick@6/include
For pkg-config to find this software you may need to set:
    PKG_CONFIG_PATH: /usr/local/opt/imagemagick@6/lib/pkgconfig
```


### rmagick を bundle install する

`gem 'rmagick'` を `bundle install` します。

```prettyprinted
% PKG_CONFIG_PATH=/usr/local/opt/imagemagick@6/lib/pkgconfig bundle install --path vendor/bundle
```


確認します。

```prettyprinted
% bundle doctor
The Gemfile's dependencies are satisfied
No issues found with the installed bundle
```




## 補遺

> * [Now RMagick 2.15.4 can't be built with ImageMagick 7.0.x · Issue #256 · rmagick/rmagick](https://github.com/rmagick/rmagick/issues/256)
後輩にレビューで突っ込みを入れていたらスパゲティができたでござるの巻

#はじめに
まだ事態が落ち着いてないんですが、半自戒、半怒りの整理メモ。
反面教師事案としてお使いください。できるだけ愚痴にはならないように気を付けてはいますが、一部見苦しかったらすいませぬ。

#何が起こった
以前までに書いたような感じで細々とレビューを入れてパスタ化を回避し、
できるだけ可読性の高い（＝メンテナンスが楽な）コードができるように務めてたんですが。

その後輩が一ヶ月分まるっとまとめてコミットしやがりまして、
しかもそのコードがすさまじいまでのスパゲティになっていて久々に堪忍袋の緒が切れました。

##原因
いくつか考えられますが、できるだけ後輩を責めないように分析。

###素養
そもそもPGとして確かにそこまで高くなかったのですが、
そこはチームなんで適宜フォローしてコードレビューとかを通して品質を上げてきていたわけです。
ただ、どうやら本人は品質を上げるという発想そのものが少なそうです…
（毎回同じようなことを指摘してるのに、延々同レベルで出してくる）

###フォローに入った人との相性
ベテラン（とされていた）人がフォローに入っていたのですが、実はいままでばれてなかっただけの能力不足な上、とにかく自分の責任でないことを確認してから入る「典型的な（僕主観で）昔のクソSE（※）」だと発覚。
※「自分の責任になることを回避するための足場確保」を最優先で確保するタイプ、って言いたいのです
PMさんに対しての弁解が「それは後輩君の担当だから」的な責任逃れに終始したせいで、PMさんが僕以上に激おこスティック略だったのがとても印象的。なお僕よりはるかに年上で経歴長い。

###隠ぺい体質
いわゆる進捗確認に対して「順調です」「問題ありません」と言いつつ、足の進みが遅いタイプ。「実際はそれ問題だよね」というPMの追及が入るまでその意識がなかったのが。
素養に近い部分もあるのですが、これはまぁ場数が少ない若い子なら単独では仕方ないと思う部分で。

むしろ問題はフォローに入った人が（フォロー入り後の進捗遅れが）自分の責任になるのを恐れて
更に進捗を隠していたというのが決定打。何のためのベテランフォローだとおもってんだ、ひどいシナジーだ。

###夏休み
うちの夏休みはずれて取っているという不運もあって、その期間その気になれば怠けたい放題であり。

不運にもリードプログラマ（僕です）とマネージャーが交互に一週間ずつ居なかったのですが、その期間に進捗がずれたので、計２週間＊２人＝事実上の１人月がほぼ無駄になっているという…

###レビューうぜえ
今回決定的に頭を抱えた要素。
「リーダーのレビューがちょいちょい入りすぎて集中できないからまとめて出しました」
どーん。何のためのチームだ。補足しておくと、最初の頃は「後輩君とベテラン（自称）と並行してコードを組んだため、２人のローカル統合に時間がかかっている」っていう説明をもらってたわけで。そもそも何のためのsvnだと思ってんだちまちま上げて駄目なら戻せ。

##私的な反省
別の後輩（こっちは最近無事に卒業してステップアップしました。よきかな。）の面倒を見るのが中心だったのだけど、その子を含めた自分から聞いてくる子のフォロー機会のほうがが圧倒的に多くなったのはやや反省。聞いてこない子ほど不安除去も含めてこっちからちまちま聞くべきで、その際に表面的な「大丈夫？行き詰ってない？」ではなくちゃんと具体的に踏み込んで闇を払いに行くべきだったのかな、と。
※一応マネージャーの仕事と言えばそうだし、僕自身当然自分の開発業務は当然あるのでどこまでやっていいかはアレですが。

#混沌の片鱗
（おまけ。あと微妙に実情とは違います。反面教師としてお使いください）
一例として、updateUserInfo(bool isModeA)というメソッドが呼ばれている箇所。２カ所あり、既存において微妙な動作の違いはメソッド内でbool値を見て吸収していたのですが、今回の更新で処理を切り分ける必要があったために分離したのですが…

##分離後のメソッド名が酷い
"updUserInfo"と"newUpdateUserInfo"。そもそも命名法則規約違反である。

##変数名とか設計もひどい
既存のように(bool)isDeletedとかで処理分ければいいのに、オンオフしかない２モードに対してわざわざ(string)deleteFlgとか書いてたり（"1"がオン）。

##使われてない"updateUserInfo"が生き残っている
しかも中途半端に改造された状態で放置されてた。上記のクソなメソッド名もあり、参照元が全部消えていることを確認するのが大変でした…

#なお現状
リリース最優先のせいでスパゲティと化したコードと格闘するために労働時間マシマシ。
なんとかリリース状態にこぎつけてもスパゲティをほぐす作業と次期開発の並走が確定しており。
なお件の自称ベテランはすでに月末での撤退準備を始めている（これも一因なのか）。やりにげだいなみっく。

俺、直していく中で面白そうなネタがあったら、また投稿するんだ…
[python] click.progressbarの出力を消すオプション

Pythonでコンソールアプリを使う際、[clickのprogressbar](http://qiita.com/naoya_t/items/cc420ea7d6eb74a65b78)を使うと、長時間の作業時に進捗がいい感じに可視化されてうれしいです。

しかし、場合によってはサーバープロセスやバッチ処理に, progressbarを当初使っていた処理の関数を入れたりする場合、オプション引数でprogressbarの出力をon/offしたい、というのがあると思います。

そんなとき使えるコードパターンをご紹介します。 => `file`に/dev/nullを指定するテクニックを発見したのでそちらを最初に...

## UNIX系で使えるシンプルなやりかた

```python
import sys
import click


def something(items, show_progress=False):
    out = sys.stdout if show_progress else open('/dev/null', 'wb')
    with click.progressbar(items, file=out) as bar:
        for item in bar:
            'abcd' * (1024 * 10)


items = list(xrange(10000))
something(items, show_progress=True)
print('--------')
something(items, show_progress=False)
```

`file`というオプションで`click.progressbar`の出力先を指定できるようなので、`/dev/null`へ書き込むファイルオブジェクトを指定すると、なにもでてこなくなります。
ただしこの`something`のような関数を何千回も呼び出す場合はきちんとopenしたファイルオブジェクトをcloseした方がよいと思います。

## /dev/nullがない環境でも使えるPythonのテクニックで解決するやり方

```python
import functools
from contextlib import contextmanager
import click


@contextmanager
def dummy_bar(items, **kwargs):
    yield items


def something(items, show_progress=False):
    f = click.progressbar if show_progress else dummy_bar
    fbar = functools.partial(f, items, show_pos=True, show_eta=True)

    with fbar() as bar:
        for item in bar:
            'abcd' * (1024 * 10)


items = list(xrange(10000))
something(items, show_progress=True)
print('--------')
something(items, show_progress=False)
```

### 解説

なにも出力しないbarを作るものとして、`dummy_bar`という関数を定義しました。
`click.progressbar`は`with`句で呼び出されるため、contextmanagerを使って`as`のあとの変数に代入されるもの, すわなち引数で与えられたiterableを`yield`でそのまま返しています。

使う関数を`show_progress`オプションで切り替え、統一的に引数なしで呼び出せるように`functools.partial`で引数を部分適用しています。
ですので本来`with click.progressbar(...`となっていたところではシンプルに`with fbar()`となっています。

これでオプションの挙動に応じた`bar`が`as`によって代入され、あとは普通に`click.progressbar`のように使えばokです。
Kali Linuxでシャットダウン時に時間がかかる時の対処法メモ

# KaliLinuxでrebootに時間がかかる
## A stop job is for ・・・・と表示されるときの対処方法
調べたのでメモ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156294/94718123-c4de-3df9-64f9-bb7b15bcbbb9.png)

1. watchdogインストール・サービス開始

```
$apt-get install watchdog
$systemctl enable watchdog.service
$systemctl start watchdog.service
$sync
$systemctl daemon-reload
```

1. /etc/systemd/system.conf の編集

```
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
```
を

```
DefaultTimeoutStartSec=10s
DefaultTimeoutStopSec=10s
```

に変更。

reboot後、次のreboot/shutdown時は10秒以内となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/156294/f1a4dea6-1792-fabc-1930-b9970a38d338.png)
ターミナルでソートして最新のファイルをコピー

ググっても出てこなかったので、メモ代わりに書きます。

わかりにくかった場合は質問してください。


#ターミナルでソートして最新のファイルをコピー

##コード
```bash:auto_move.sh
ls -dr /[PATH]/* | head -n 1 | xargs gcp -rt [PATH]
```

## gcpって？
`gcp` == `cp`

と考えて良さそうです。

Macの場合デフォルトで`cp -t`が使えないため、<a href="https://ecpplus.net/weblog/mac%E3%81%A7xargs%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6cp%E3%81%99%E3%82%8B/">coreutils</a>をインストールをし`gcp -t`を利用しました。

<a href="https://ecpplus.net/weblog/mac%E3%81%A7xargs%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6cp%E3%81%99%E3%82%8B/">coreutils</a>をインストールするためには、<a href="http://tweeeety.hateblo.jp/entry/2014/10/01/223700">MacPorts</a>も必要となるため、インストールしてない場合はこちらのインストールも必要。

## cp -tって？
`-t`オプションとは、 `cp PATH1 PATH2` を `cp PATH2 PATH`　転置（Transpose）のtです。



参考：
<a href="http://tweeeety.hateblo.jp/entry/2014/10/01/223700">Mac OS XへのMacPortsインストールとか設定とかコマンドの使い方メモ</a>
<a href="https://ecpplus.net/weblog/mac%E3%81%A7xargs%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6cp%E3%81%99%E3%82%8B/">Macでxargsを使ってcpする</a>
python3でMySQLのutf8mb4データベースへ接続する

# はじめに
　pythonから[PyMySQL3](https://pypi.python.org/pypi/PyMySQL3/0.5)ドライバを利用し、__utf8mb4__設定済みのデータベースにアクセスしました。すると、__KeyError:45__エラーが発生したので、代わりにMySQL公式が提供している[mysql-connector-python-rf](https://pypi.python.org/pypi/mysql-connector-python-rf)ドライバを利用したのですが、その際に軽いトラブルがあったので備忘も兼ねて記録しておきます。


# 環境

                          | バージョン
--------------------------|---
OS                        | macOS 10.12.6
python                    | 3.6.1
pip                       | 9.0.1
mysql-connector-python-rf | 2.2.2
PyMySQL3(参考)            | 0.5

# 手順
　はじめに、ドライバをインストールする為、以下のコマンドを実行しました。

```bash
pip install mysql-connector-python-rf
```

ところが、

```
Command "/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/private/var/folders/j2/8h3wfb391t1_58crtwyc1xx00000gp/T/pip-build-6oqq9ezx/mysql-connector-python-rf/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /var/folders/j2/8h3wfb391t1_58crtwyc1xx00000gp/T/pip-hwj0p9pe-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/j2/8h3wfb391t1_58crtwyc1xx00000gp/T/pip-build-6oqq9ezx/mysql-connector-python-rf/
```

というエラーが発生し、インストールできませんでした。そこで、いろいろ調べた結果、

```bash
pip install --egg mysql-connector-python-rf
```

__--egg__オプションを付加することでインストールに成功しました。こちらのドライバでは、問題なく__utf8mb4__データベースを操作することができています。

# 最後に
　インストールの際、 __DEPRECATION: --egg has been deprecated and will be removed in the future.__ と警告が表示されたので、そのうち使えなくなるかもしれません。
SQLファイル実行時にパスワードを聞かれないようにする方法

# SQLファイル実行時にパスワードを聞かれないようにする方法

## 検証環境
- OS: Windows10
- DB: PostgresSQL9.6

## パスワードファイルの書式
### Format
```
hostname:port:database:username:password
```

### Example.
```
*:*:*:postgres:password
```

## 格納場所
### Windows 
%APPDATA%\postgresql\pgpass.conf
### Linux
ホームディレクトリ/.pass

## 参考
https://www.postgresql.jp/document/9.3/html/libpq-pgpass.html
InetlliJ+Nodistでnpm実行するためのNodeパス

# はじめに
InetlliJ(WebStrom/PhpStorm)でのnpm実行は、登録しておいて右上の矢印から実行すると便利です。
![phpStorm-右上スクリプト実行ボタン.PNG](https://qiita-image-store.s3.amazonaws.com/0/90529/cca77b95-91fd-434c-cc20-2620a70e7ab3.png)
(緑矢印で実行できる)

ただ、Nodeのバージョン管理ソフトのNodistを使用した環境だと、InetlliJがNodeのパスを解決できないようです。


# 必要な設定

Nodistインストールパスはデフォルトで話を進めます。  
![設定１.PNG](https://qiita-image-store.s3.amazonaws.com/0/90529/e0fcd888-d928-1e74-755e-b29cffb98d8e.png)


まず、スクリプト登録時に以下を入力します。
```
"Node interpreter" => ‪C:\Program Files (x86)\Nodist\bin\node.exe
```

その他項目を登録して実行すると、以下のダイアログが出るので、
![phpStorm-npmパス入力ダイアログ.PNG](https://qiita-image-store.s3.amazonaws.com/0/90529/31345caf-b768-d86b-49c3-ad9334825409.png)

以下を入力します。
```
Npm package => C:\Program Files (x86)\Nodist\npm
```


以上で、実行できるはずです。
bundler-audit の警告を無視するための、シンプルな方法

[bundler-audit](https://github.com/rubysec/bundler-audit) は、Gemfile(.lock)で指定されている gem から脆弱性があるものを指摘してくれるツールです。特にCIで使うと効果的です。

出力例:

```
$ bundler-audit
Name: actionpack
Version: 3.2.10
Advisory: OSVDB-91452
Criticality: Medium
URL: http://www.osvdb.org/show/osvdb/91452
Title: XSS vulnerability in sanitize_css in Action Pack
Solution: upgrade to ~> 2.3.18, ~> 3.1.12, >= 3.2.13
```

# bundler-audit の何が問題か？

[rubocop](https://github.com/bbatsov/rubocop)のように、特定の警告を非表示にする機能が無いことです。

脆弱性の中には「プロジェクトでの使い方では発現しない」「新バージョンには互換性がない」などで、修正しない/できないものもあるので、そっとしておいて欲しいもの。

# どうやって解決したか？

あらかじめ、bundler-audit の出力をファイルに保存し、CI時に出力と比較すれば良いのです。

```
$ bundler-audit check > expected-bundler-audit-output.txt
$ git commit -m "..." expected-bundler-audit-output.txt
```

CI時:

```
$ bundler-audit update
$ diff <(bundler-audit check) expected-bundler-audit-output.txt
```

期待結果と差がある（≒ 新たな脆弱性が発見された）場合は `diff` が 1 で終わるのでCIが失敗します。

なお、bundler-audit が出力のフォーマットを変えた場合にも失敗しますが、その場合は諦めて bundler-auditを更新して、`expected-bundler-audit-output.txt` を作り直します。


[^1]: ひょっとしたら最新版やMRにはあるかもしれませんが、私がbundler-auditを導入した時にはありませんでした。
Pythonの例外処理

Pythonの例外処理ルール

- `try`: 括ったコードを例外処理する
- `except <error-case>`: error-caseの例外発生時に実行するブロック
- `except`: どんな例外発生時にも実行するブロック
- `else`: 例外が発生しなかった場合のみ実行するブロック
- `finally`: 例外が発生してもしなくても実行するブロック

サンプルコード

```python:test_exception.py
import sys

zerodiv = len(sys.argv) > 1

try:
    if zerodiv:
        a = 10 / 0
    else:
        a = 10 / 1
    print("answer = {}".format(a))

except ZeroDivisionError as e:
    print("ZeroDivisionError")

else:
    print("else statement")

finally:
    print("finally statement")
```

実行結果

```
$ python test_exception.py 
answer = 10
else statement
finally statement
```

```
$ python test_exception.py zerodiv
ZeroDivisionError
finally statement
```
Spooky.jsでファイルのダウンロード - スクレイピング(環境構築編)


とあるWebシステムから、ファイルを自動でダウンロードしたかったので、
Phantom.js＋Spookyjsでやってみる。

参考
http://wordpress.ideacompo.com/?p=8649

# 環境

* Ubuntu 16.04.2 LTS
* Node.js 8.0.0
* Phantom.js 2.1.1
* Casper.js 1.1.4
* Spooky.js 1.8
* tiny-jsonrpc 2.0.1

# 環境構築手順

## Node.jsのインストール

```shell-session
$ sudo apt-get install nodejs npm
```

最新版を入れたい場合は、Node.jsをバージョン管理できるnvmやgをご利用ください。

## Phantom.jsとCasper.jsのインストール

「apt-getからインストール」、「npmからインストール」、「ソースコードからインストール」の3パターンがありますが、前者はよくトラブるので、ソースコードからインストールをお勧めします。

```shell-session
$ cd /usr/local/share
 
# Phantom.js
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ sudo tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
$ sudo mv phantomjs-2.1.1-linux-x86_64 phantomjs
$ sudo ln -sfn /usr/local/share/phantomjs/bin/phantomjs /usr/local/bin/
 
# Casper.js
$ git clone https://github.com/casperjs/casperjs.git
$ ln -s /usr/local/share/casperjs/bin/casperjs /usr/local/bin/
 
# 確認
$ phantomjs --version
2.1.1
$ casperjs --version
1.1.4
```

## Spooky.jsのインストール

Spooky.jsのインストールはnpmを使用します。

```shell-session
$ npm install spooky
```

今回はローカル環境にインストールしてます。

## Tiny JSON-RPCのインストール

これがないと起動できないので、インストール

```shell-session
$ npm install tiny-jsonrpc
```

## Spooky.jsのコメント不具合を直す

Spookyには、日本語コメントが含まれていると動作が止まってしまう不具合が存在する(2017/9/5現在)
それを修正する。

対象ファイル
node_modules/spooky/lib/spooky/request-stream.js

```js
 RequestStream.prototype.write = function write(packet, callback) {
     var options = _.clone(this.options);
-    options.headers['Content-Length'] = packet.length;
+    options.headers['Content-Length'] = Buffer.byteLength(packet, 'utf8');
     
     var req = http.request(options, this._onResponse.bind(this, callback));
     req.on('error', this._onError.bind(this, callback));
```


# 動作確認

公式ページに書かれているサンプル例をそのままファイルに保存して、動かしてみます。
https://github.com/SpookyJS/SpookyJS

```shell-session
$ node example.js
Hello, from Spooky the Tuff Little Ghost - Wikipedia
```
【プログラマーのための統計学】確率変数と確率分布と確率密度関数

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

## 確率変数とは
確率変数とは、取り得る値の範囲は分かっているが、どれになるかは分からない値を確率変数といいます。
たとえば、サイコロを振った時、出る目は1,2,3,4,5,6のいずれかになりますが、この1から6までの目が、確率変数となります。

式で書くと、以下になります。

```math
P(X) = \frac{1}{6} (X = 1, 2, 3, 4, 5, 6)
```

また、さいころを投げて5の目が出る事象の確率は、以下の式で表すことができます。

```math
P(5) = \frac{1}{6}
```

## 確率分布
確率分布とは、確率変数のそれぞれ値と、その値が出現する確率の分布のことです。
例えば、サイコロの例でいうと、以下のようなものになります。

| サイコロの目 | 確率 |
| --: | --: |
| 1 | 1/6 |
| 2 | 1/6 |
| 3 | 1/6 |
| 4 | 1/6 |
| 5 | 1/6 |
| 6 | 1/6 |

## 離散型確率変数
離散型確率変数とは、とびとびの値しか取らない確率変数のことを指します。
例えば、サイコロの目は、1の次は2であり、1.1や1.2は存在しません。
このような変数を離散型確率変数といいます。
身長や体重のようなものは、連続型の確率変数になります。

## 離散確率分布
離散型確率変数の確率分布を、離散確率分布といいます。

## 確率質量関数
離散確率変数が`x`となる確率を`f(x)`としたとき、この`f(x)`のことを、確率質量関数と言います。
また、全事象が起こる確率は1であることから、以下の式が成り立ちます。

```math
\Sigma_{i=1}^{n} P(x_i) = P(x_1) + P(x_2) + ・・・ + P(x_i) = 1
```

サイコロの例であれば、以下のようになります。

```math
\frac{1}{6} + \frac{1}{6} + \frac{1}{6} + \frac{1}{6} + \frac{1}{6} + \frac{1}{6} = 1
```

## 連続型確率分布
連続型確率変数とは、前述の離散型確率変数の逆で、身長や体重の様に、隣合う値の間に、無数に値があるものです。
例えば、身長の場合であれば、180cmと181cmの間には、180.01cm, 180,001cm, 180.0001cm・・・のように、無数に値があります。
このような連続型確率変数の確率分布のことを、連続型確率分布といいます。


連続型確率変数の範囲を1から6までとしたとき、3が出る確率は、離散型の場合の様に、`1/6`にはなりません。`3は、無限に存在する値のうちの一つであり、この場合の確率は`0`になります。

```math
P(x) = \frac{1}{\infty} = 0
```

## 確率密度関数
連続型確率変数の場合、特定の確率変数の値のとる確率は0になってしまいますが、
連続型の変数`X`が、`a≤X≤b` となる確率を、確率密度といいます。

連続型確率変数`X`が`a`以上`b`以下となる確率が以下で求められるとき、`f(x)`を確率密度関数といいます。
全事象の確率の合計は`1`となるため、`= 1`となっています。逆に、`1`にならないものは確率密度関数ではありません。


```math
P(a \leq X \leq b) = \int _a ^b f(x) dx = 1
```

この式では、以下の図のように、aからbの範囲の面積を算出しています。
`f(x)`をaからbで定積分した値が、Xがaとbの間にある確率を表します。


![kakuritumitudo.png](https://qiita-image-store.s3.amazonaws.com/0/105936/f4bd9742-a405-9480-395b-63f1621f4542.png)

引用元：[高校数学の美しい物語](http://mathtrain.jp/pmitsudo)


## 参考
- [統計web - 確率変数と確率分布](https://bellcurve.jp/statistics/course/6596.html)
- [確率密度関数の意味と具体例](http://mathtrain.jp/pmitsudo)
- [確率密度関数と正規分布](https://logics-of-blue.com/%E7%A2%BA%E7%8E%87%E5%AF%86%E5%BA%A6%E9%96%A2%E6%95%B0%E3%81%A8%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83/)
- [確率密度関数からモンテカルロ積分まで](http://qiita.com/Ushio/items/0040b3c74a480c46c80c)
Time.zone.localでout of range

# Time.localでout of range
当たり前といえば当たり前なのだが、ハマったのでメモしておく

以下のような日付入力フォームを作り、　入力は任意にしようとしたら表題のエラーが発生した。

結論から言うと、月と日には0がないため、月か日が入力されなかった場合、エラーになってしまう。

<img width="278" alt="スクリーンショット 2017-09-05 14.54.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/107187/9cdfb791-b8d6-63eb-61a1-c87b9f2e889f.png">


```erb:search.html.erb
<%= f.label '開始' %>
<div class='form-inline'>
    <%= f.datetime_select :start_at, {use_month_numbers: true, include_blank: true}, {class: "form-control date-select"} %>
</div>
<%= f.label '終了' %>
<div class='form-inline'>
    <%= f.datetime_select :end_at, {use_month_numbers: true, include_blank: true}, {class: "form-control date-select"} %>
</div>
```

```rb:controller.rb
event[:start_at] = Time.zone.local(params[:search]["start_at(1i)"].to_i, params[:search]["start_at(2i)"].to_i, params[:search]["start_at(3i)"].to_i, params[:search]["start_at(4i)"].to_i, params[:search]["start_at(5i)"].to_i)
event[:end_at] = Time.zone.local(params[:search]["end_at(1i)"].to_i, params[:search]["end_at(2i)"].to_i, params[:search]["end_at(3i)"].to_i, params[:search]["end_at(4i)"].to_i, params[:search]["end_at(5i)"].to_i)
```

```shell-session
>> Time.zone.local(2017, 5, 3, 1, 20)
=> Wed, 03 May 2017 01:20:00 UTC +00:00

>> Time.zone.local(0, 5, 3, 2, 1)
=> Wed, 03 May 0000 02:01:00 UTC +00:00

>> Time.zone.local(0, 5, 0, 0, 0)
ArgumentError: argument out of range

>> Time.zone.local(2017, 0, 0, 0, 0)
ArgumentError: argument out of range
```

期限まで**日がない**っていうのにこんなのに時間を・・・（うまい）
phina.jsで改善されたグリッド内に画像を表示する

[phina.jsでグリッドに四角形を敷き詰める - Qiita コメント:#comment-367af7204008c31bfa1f]

こちらでお礼を。
一日経って見返してみればぜんぜん参考記事のコードと別物を書いていましたね…。

頂いたサンプルコードを使うとしっかりと並べることができました。
ありがとうございます。

ただ、このまま画像を載せると四角形の中から、はずれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/45a94f6a-5a89-5d88-5875-5fce344d6b72.png)

これはグリッドを

```js
    Array.range(0, 16).each((X) =>{
      Array.range(0, 16).each((Y) =>{
        let rect = RectangleShape({
          width: 40,
          height: 60,
          padding: 0, // パディングを0にする
          strokeWidth: 1, // 線幅すっきりに
        }).addChildTo(this);
        rect.setPosition(this.gridX.span(X),this.gridY.span(Y));
        rect.setOrigin(0,0); // 左上を原点にする
        rect.fill = 'transparent';
      });
    });
```

`rect.setOrigin(0,0); // 左上を原点にする`
左上を原点にしたからと予想。

この、
「グリッドの点が画面中央に来ることが正しい」
のか
「グリッドの4点に囲まれた四角形(と認識する領域)の中心部が画面中央に来ることが正しい」
のかがまったくわからなくて良く混乱します…。
2進数で0から数えて1番目は0みたいな、ズレというかなんというか…。

閑話休題。

グリッドが左上原点になったので、画像も合わせる

```js
    const player = Sprite('player').addChildTo(this);
    player.x = this.gridX.center();
    player.y = this.gridY.center();
    player.setOrigin(0,0)
```

![2017-09-05_14h23_55.png](https://qiita-image-store.s3.amazonaws.com/0/62354/e60862d9-e40c-b1be-b1f6-7acc710bbd25.png)

行き過ぎてません？
1スタートで16ぶんの9,9グリッドに位置しています。
1時間ぐらい悩んだが、たぶんこれで正しいんだと。
原点が変わったから、画像の左上が画面中央に来ているから正しいのだと言い聞かせました。

こう…さっきの閑話に戻ると…囲碁で中央に石を置いてというのとオセロで中央に置いては違う…みたいな…。

で、前回の雑なグリッドでは目立たなかった(しサイズもちょうど似通っていた)のですが、画像サイズのせいでまだ四角の中央に立っていない。

四角形は40*60。画像は32*64。
左上に置くので、下に4はみ出て右に8余っている計算になる…はず。

サイズオーバーはしかたないので、はみ出すのは下ではなく上に。
左右は中央に置くので余りは左右均等割付で。

するとこんなコードに。

```js
    const player = Sprite('player').addChildTo(this);
    player.xOffset = 4;
    player.yOffset = -4;
    player.x = this.gridX.center() + player.xOffset;
    player.y = this.gridY.center() + player.yOffset;
    player.setOrigin(0,0)
```

gridXに対してxOffsetとかoffsetがあっているかわかりませんが、これで、下のライン上で、頭がちょっと出ていて、左右の中央に立っている画像が設置できた。

![2017-09-05_14h34_25.png](https://qiita-image-store.s3.amazonaws.com/0/62354/f4314737-918a-305a-1478-f2751b8b7aa3.png)

http://runstant.com/runstataccount/projects/9c6a2c4b


# 参考

[phina.js-Tips Shapeの原点を変更する - Qiita]

今後全部原点を左上に置くことになるとその場回転したいときに困るのかも。
(画像の原点移動ではなくオフセットで対応すると)


# 前回

[phina.jsでbase64形式で画像を使う - Qiita]

[phina.jsでbase64形式で画像を使う - Qiita]:http://qiita.com/khsk/items/e7fb9bd6360be08eb3a5

[phina.js-Tips Shapeの原点を変更する - Qiita]:http://qiita.com/alkn203/items/d0954528f23f8c63766d

[phina.jsでグリッドに四角形を敷き詰める - Qiita コメント:#comment-367af7204008c31bfa1f]:http://qiita.com/khsk/items/1bec0a7fa6cc58b2356c#comment-367af7204008c31bfa1f
NEMのモザイクを使って独自通貨を作ってみる

#はじめに
これまでCounterpartyやEthereumなどで独自通貨を作っていましたが、
今回はNEMを使って独自通貨を作成します。
NEMにはnamespaceとmosaicという
独自通貨を作る上で、便利な機能を持っている為、独自通貨という用途として考えたとき、
利便性に優れているといえます。

#NEMとは
NEMはNew Economy Movementの略称。
BitcoinやEthereumと同じように仮想通貨。(仮想通貨の単位はXEM)
ブロック生成間隔が約1分程度とビットコインなど他の仮想通貨と比較すると、
トランザクション承認のスピードが早いことが特徴。

##NEMのnamespaceとは
インターネットのドメインのようなもので、サブドイメインのように階層を持つことができます。
このnamespaceは永続的なものではなく、1年間の有効期限付きで、継続するためには
1年毎に使用料を支払う必要があります。(最大文字数は16文字、サブは64文字まで可能です)

##NEMのmosaicとは
トークンなどと呼ばれるもので、実際に取引される通貨のようなものになります。
planets:jupiter
planets:xxxx
のような感じでnamespaceの下に紐付けされていきます。

>設定可能な項目
>説明
>	フリーテキスト。自由に記述でき、後で変更可能。
>初期供給量
>	発行数。ロックすることもできます。
>

#実際に作ってみる

##1.nano walletをインストール
https://nem.io/downloads/

##2.サービスから、ネームスペース と ドメインの設定をする
注意点としては、上位のネームスペースのレンタル料として100XEM(記事作成時点のレートで2800円前後)がかかります。またサブドメインのレンタル料として10XEM (現在レートで280円)がかかります。レンタル期間は1年となり、継続して使用する場合には手続きが必要となります。
![nem-howto1.png](https://qiita-image-store.s3.amazonaws.com/0/43766/0da23577-81b0-ee7c-f9d2-6efdb4dee9d5.png)

##3.モザイクを作成する
![nem-howto3.png](https://qiita-image-store.s3.amazonaws.com/0/43766/5605c88b-8369-f40f-6471-b71d4b593f9a.png)

##4.モザイクを送信する
![nem-howto4.png](https://qiita-image-store.s3.amazonaws.com/0/43766/53278676-e54c-9cae-3ca2-7d97b1a8c1ac.png)

##5.作ってみた

supernovaというドメインを取得して、その下に、
planetsというサブドメイン、その下にjupiterというような名称のモザイク(仮想通貨)を
作成してみました。

```
Supernova
	|-Planets
		|-Earth
		|-Mercury
```

http://chain.nem.ninja/#/browse/supernova.planets

#nem-libraryを使ってJavaScriptから作成したモザイクを操作する
https://github.com/aleixmorgadas/nem-library-examples

##インストール

```
npm install -g nem-library,rxjs
```

##サンプル

```get_balance.js
//アドレスのXEM + モザイクの残高を確認するサンプル
Object.defineProperty(exports, "__esModule", { value: true });
var nemlib = require("nem-library");
//MAIN_NET、TEST_NETなどから選択する
nemlib.NEMLibrary.bootstrap(nemlib.NetworkTypes.MAIN_NET);
//残高を確認するウォレットのアドレス
var address = new nemlib.Address("");
var accountOwnedMosaics = new nemlib.AccountOwnedMosaicsService(new nemlib.AccountHttp(), new nemlib.MosaicHttp());
accountOwnedMosaics.fromAddress(address).subscribe(function (mosaics) {
    console.log(mosaics);
});
```

```get_namespace_info.js
//作成したネームスペースやモザイクの情報を取得するサンプル
var nemlib = require("nem-library");
//MAIN_NET、TEST_NETなどから選択する
nemlib.NEMLibrary.bootstrap(nemlib.NetworkTypes.MAIN_NET);
var mosaicHttp = new nemlib.MosaicHttp();
var namespace = "supernova.planets";
mosaicHttp.getAllMosaicsGivenNamespace(namespace).subscribe(function (mosaicDefinitions) {
    console.log(mosaicDefinitions);
});
```

#おしまい
MeCab + Unidic を使って単語の語種（和語、漢語）を表示する

# はじめに
文章の難易度判定をするときなど、日本由来の言葉（和語）と大陸由来の言葉（漢語）を区別したい時があります。例えば「代替案」は漢語ですが「今日」は和語です。一見すると両者を上手く見分ける方法はないと思われるかもしれませんが、MeCabの辞書として国立国語研究所作成の[**UniDic**](http://pj.ninjal.ac.jp/corpus_center/unidic/)を使えば形態素解析と同時に漢語・和語・外来語などの区別も行ってくれます。

# 環境

+ Ubuntu 16.04
+ Python 3.5.3
+ MeCab 0.996
+ Unidic 2.12

既にMeCab, Unidic はインストール済のものとしてすすめます。

# 下準備1：Unidicオプションの設定
`/usr/local/lib/mecab/dic/unidic`にアクセスし、中にある`dicrc`を編集します。

```
output-format-type = unidic2

node-format-unidic = %m\t%f[9]\t%f[6]\t%f[7]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-unidic  = %m\t%m\t%m\t%m\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
bos-format-unidic  =
eos-format-unidic  = EOS\n

node-format-chamame = \t%m\t%f[9]\t%f[6]\t%f[7]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
;unk-format-chamame = \t%m\t\t\t%m\tUNK\t\t\n
unk-format-chamame  = \t%m\t\t\t%m\t%F-[0,1,2,3]\t\t\n
bos-format-chamame  = B
eos-format-chamame  = 

node-format-unidic2 = %m\t%f[9]\t%f[6]\t%f[7]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\t%f[12]\n
unk-format-unidic2  = %m\t%m\t%m\t%m\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
bos-format-unidic2  =
eos-format-unidic2  = EOS\n
```
最後の４行が追加部分です。初期設定では語種を表すf[12]が出力フォーマットに入っていないため語種の情報が返されません。
そのためf[12]を指定したフォーマットを新たに作成しunidic2とおいて、output-format-typeにunidic2を指定します。

# 下準備2：MeCab辞書の変更
規定の辞書はipadicですが、これをunidicに変更します。MeCab設定ファイルを以下のように編集します。

```:/usr/local/etc/mecabrc
dicdir =  /usr/local/lib/mecab/dic/unidic
```

# 仕上げ：Pythonコードの作成
例えば下のような関数を定義すれば

```py
def gosyu(text):
    t = MeCab.Tagger()
    node = t.parseToNode(text)
    words = []
    while(node):
        info = node.feature.split(',')
        if info[6] != '*':
            word_type = info[0]
            if word_type not in ['記号']:
                words.append([info[8], info[12]]) #原型を抽出
        node = node.next
        if node is None:
            break
    return words
```

```pycon
>>> gosyu("今日の会議でパートナーに代替案を提出する予定だ")

[['今日', '和'],
 ['の', '和'],
 ['会議', '漢'],
 ['で', '和'],
 ['パートナー', '外'],
 ['に', '和'],
 ['代替', '漢'],
 ['案', '漢'],
 ['を', '和'],
 ['提出', '漢'],
 ['する', '和'],
 ['予定', '漢'],
 ['だ', '和']]
```
語種が抽出出来た！
Railsのコードレビューをするときに確認する観点をまとめてみた

特に、全体を見るときに、Railsの知識があるかや、プログラミングの基礎ができているかどうかを見る際に、気にしている点をまとめた。以下ができていると、良いと判断する。

## READMEの内容
- 今後の開発に関して有益な情報を記載している

## コミットログ
- 適切な単位でコミットがされている

## Gemfile
- 定番のgemを使っている
- groupの設定が適切になっている

## config/routes.rb
- resources を利用している
- RESTの表現を活用して定義している

## db/schema.rb
- 正規化されている
- ActiveRecordの標準にできるだけ沿っている
- 制約が適切についている（booleanに default など）

## controller
- Scaffoldの実装と近い形で実装できている
- before_action などを利用してDRYになっている
- インスタンス変数が必要最低限になっている
- 複雑なロジックはコントローラに記載されていない
- あるモデルの処理は、特別なことがない限り一つのコントローラーにまとまっている

## model
- バリデーションが適切に設定されている
- DBのカラムになっていない属性を attr_accessor で上手く活用して form からのデータを受け取れるようになっている

## view
- 複雑なロジックが含まれない
- できるだけシンプルなHTML構造になっている
- styleなどはcssを利用している

## その他、全体で
- ムダな記載・コードが無い
- インデント・スペースに統一感がある
- クラスメソッドを多用していない（クラスの責務が適切に分割されている）
- １メソッドあたりの行数が多すぎない
- むやみにメソッドの引数を増やしていないこと