OmniAICreator/Qiita-1.07M huggingface dataset:
58同城租房信息

#beijing.py

```python:beijing.py
# -*- coding: utf-8 -*-
import scrapy
from zufang.items import ZufangItem

class BeijingSpider(scrapy.Spider):
    name = "beijing"
    allowed_domains = ["58.com"]
    start_urls = ['http://bj.58.com/chuzu/']

    def parse(self, response):
        item = ZufangItem()
        for i in response.css('.des'):
            item['title'] = ''.join(i.css('h2>a::text').extract()).encode('utf-8').strip()
            item['weburl'] = i.css('h2>a::attr(href)').extract_first()
            item['addres'] = i.css('.add>a:first-child::text').extract_first()
            pending_str = i.css('.room::text').extract_first()
            try:
                item['roomtype'] = pending_str.split()[0]
                item['size'] = pending_str.split()[1]
            except:
                item['roomtype'] = ''
                item['size'] = ''
            x = i.css('.jjr')
            if len(x) == 0:
                item['contacts'] = ''
            else:
                shopname =  x.css('span>span::text').extract_first().strip()
                person = x.css('.listjjr>a::text').extract_first()
                item['contacts'] = person
                item['company'] = shopname
            item['price'] = i.xpath('following-sibling::div[@class="listliright"]/div[@class="money"]/b/text()').extract_first()
            yield item
        next_page = response.css('.next::attr(href)').extract_first()
        if next_page:
            yield scrapy.Request(next_page,callback=self.parse)
```

#items.py

```python:items.py
import scrapy

class ZufangItem(scrapy.Item):
    title = scrapy.Field()
    addres = scrapy.Field()
    size = scrapy.Field()
    roomtype = scrapy.Field()
    contacts = scrapy.Field()
    price = scrapy.Field()
    company = scrapy.Field()
    weburl = scrapy.Field()
```

#pipelines.py

```python:pipelies.py
import codecs
import json

class ZufangPipeline(object):
    def __init__(self):
        self.file = codecs.open('zufang.json','wb',encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + '\n'
        self.file.write(line.decode('unicode_escape'))
        return item
```
会議・打ち合わせで新たな役割(スタッフオフィサー[参謀])を作ってみたら捗った話

# はじめに

要件定義などの打ち合わせでこんな経験ありませんか？

- PMが打ち合わせに参加して、戻ってきてエンジニアに降りてきた仕様が全然詰まってない
- 打ち合わせの中で `これ後で聞こう` と思ってたのに、打ち合わせが終わってから思い出した
- あとあと議事録見たら `○○って書いてあるけど、ということは××ってどうなの？` って疑問が湧いてくる

会議・打ち合わせがうまい方であればこんなことはないと思うんですが、結構あるあるなんじゃないかなと思っています。
で、会議で新しい役割を立ててみたら思いのほか捗ったのでこの記事を書いてみようと思いました。

# スタッフオフィサー[参謀]とは？

> 高級指揮官の下で、作戦・用兵などの計画・指導を受け持つ将校。転じて一般に、人を支えてあれこれ策略を立てる人。

Wikipediaより参照

とあります。

今回私が試してみた役割が↑に当てはまるか、と言われるともっと良い言葉がありそうな気がしますが思い浮かばず。。

もっと良いネーミングがあればコメント頂けますと幸いです:bow:

# スタッフオフィサーを参加させる為に必要なヒト・モノ

1. 無駄なくしっかり議事メモが取れる人
1. Googleドキュメント
1. Slack

※下2つは他のツールでも全然問題ないです

# スタッフオフィサーをやってみる

実際に私がやったみたことを書いていきます。

1. Googleドキュメントにアジェンダを起こしておく

    <img width="423" alt="スクリーンショット 2017-05-12 16.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/173370/d1e566e1-4ff5-3a64-00b4-909b2c4b084e.png">

1. 書記役の人が議事メモをどんどん書いていく

    <img width="489" alt="スクリーンショット 2017-05-12 16.31.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/173370/1166e95e-f220-e3c7-d1ed-4ff6d5700b13.png">

1. スタッフオフィサーはGoogleドキュメントの文字をみて疑問に思ったことを逐一参加メンバーにSlackを投げる

1. 投げられたSlackが必要だと判断したら、会議中に必ず確認する

1. 会議が終わったらGoogleドキュメントをテキストファイルでダウンロード(テキストで保存するとマークダウンが効いたまま出力してくれます)して共有のWikiにあげて議事録を保管

以上です。
すぐに出来そうな内容だと思います。

# スタッフオフィサーを作ってみたら何が良かったのか

はじめに書いた

> - PMが打ち合わせに参加して、戻ってきてエンジニアに降りてきた仕様が全然詰まってない
- 打ち合わせの中で `これ後で聞こう` と思ってたのに、打ち合わせが終わってから思い出した
- あとあと議事録見たら `○○って書いてあるけど、ということは××ってどうなの？` って疑問が湧いてくる

この辺りが全部ではないにしても解消したんですが、おそらく 

`会議中の余計な会話を聞かずに必要な文字だけを見て、その言葉に集中出来た` 

ってところがすごい大きかったんだなと思いました。

やってることはすごく単純で、一見 `だったら参加すればいいじゃん！` と思われるかもしれませんが、↑に書いた

`会議中の余計な会話を聞かずに必要な文字だけを見て、その言葉に集中出来た` 

これが本当に大きいなって思いました。

あとは、純粋にやってみたら面白かったってのも結構大きかったです。

# さいごに

会議や打ち合わせってみなさん何かしら悩むことって多くて、解決策たくさん出ている書籍の通りなんですが、皆が皆そうなれるわけではないし、チームごとでいろんな解決策があっても良いのかなと思いました。

こんなしょうもない記事書くなよ、と思われた方、申し訳ありません。。
大したことではないんですが以外にもうまく機能したのでその喜びでついつい書いてしまいました。。。
IOS Object-C UITextField

1. Main.storyboard上に UITextField追加
2. Show the assistant editor モードクリック    
<img width="170" alt="스크린샷 2017-05-12 16.27.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/171961/80f1563c-c660-787b-5026-d4ebefa26682.png">

3.　該当UITextFieldに右クリックと同時にShow the assistant editorに開いた「ViewController.m」へドラッグし、property追加
4.　「ViewController.m」の@implementation ViewController下の部分に追加したUITextFieldの変数名を「@synthesize tempTextField;」のよう追加
5.　viewDidLoadメソッドにtempTextField.text="Hello! UITextField"で初期メッセージを適用してみる
検索から、スタイルをあてる　基本だと思い、メモ

```js
	$(".prev.btn").on("click",function(){
		style_(0);
	});
	$(".next.btn").on("click",function(){
		style_(2);
	});
	var style_ = function(i){
		if($("検索したい要素").eq(i).children('div').hasClass("lengthwise")){
			$("スタイルを当てたい要素").css("padding-bottom","140px");
		} else {
			$("スタイルを当てたい要素").css("padding-bottom","80px");
			if($(window).width() > 1280){//wiseの変化がある｜｜cssでは実現できないの場合　1
				$("スタイルを当てたい要素").css("padding-bottom","20px");
			}
		}
	};
		style_(1);
```

引数がいかに便利なのか、思い知った記述です。
短くできそうだと思いますが、参考までに

１の箇所ですが、自案件で、cssでは実現ができず、こうせざるおえなかったので、このように記述しました。
不要かと思ったのですが、念のため残します。
Mavenのリモートリポジトリをセットアップしてみた

# はじめに

セントラルリポジトリで公開されていないJarやプロジェクトで作成したJarなどを管理するために必要なリモートリポジトリが必要です。
どうやってリモートリポジトリをセットアップすればいいのか調べてみました。
今回のセットアップでは、Nexusを使ってみます。

# リモートリポジトリのセットアップ手順
## 1. ダウンロードサイトからnexusをダウンロードします。
URL：https://www.sonatype.com/download-oss-sonatype
セットアップするOSに合わせてダウンロードする。
ここでは、CentOS7を使うので「Nexus Repository Manager OSS 3.x - Unix」をクリック

## 2. tarファイルを解凍する
rootユーザで起動するとWARNINGがでるので、起動するユーザーでtarファイルを解凍する

## 3. nexusを起動する

```
# nexus-3.3.1-01/bin/nexus start
```
ちなみにrootユーザで実行すると下記のWARNINGが出ます。

```
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
```
## 4. Webブラウザで http://IPアドレス:8081/nexus に接続

## 5. 画面の右上の Login In をクリックしログイン
ログインするための管理ユーザは以下の通り。
  user     : admin
  password : admin123

# リモートリポジトリの作成
ここでは、専用のリモートリポジトリの作成について簡単に書きます。

## 1. nexusの画面の左の Views/Repositories の Repositories をクリックする

## 2. Repositoriesタブの上部にある Add をクリックし、Hosted Repository をクリックする
クリックすると New Hosted Repository というidなどの入力するための画面がでます。

## 3. New Hosted Repository に必要事項を入力し、Saveボタンをクリック
Saveボタンで登録完了になります。
pom.xmlにはリモートリポジトリの情報を書く必要がありますが、各リポジトリを選択した状態で、summaryタブを選択するとpom.xmlに書くdistributionManagementgが表示されているので、コピーすればいいだけです。
[Android] Bundleを使ってActivity間データ送り。

こんにちは。。**DREAMWALKER** です。
ANDROIDを開発しているとACTIVITYやFRAGMENT間データを伝送しなきゃならない場合があります。
その時色々方法はありますが、簡単にBUNDLEを使って処理できます。

# 序論

ANDROIDではACTIVITY間データを取り交わす場合、
1. REQUEST CODE
2. KEY
3. KEY - VALUE
この三つを基本にして取り交わします。

## 基本的なテクニック.

### 発信（送り）

普通BUTTONを押したあと、処理しますので、OnClickListenerのなかでしました。

```java:activity.java
btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name","john");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
```

注文点はputExtra("key","key-value")です。

### 受信（受け取り）

getを注文。

```java:MainActivity.java
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            String name = intent.getExtras().getString("name");
            Toast.makeText(this,"name:? -> " + name, Toast.LENGTH_SHORT).show();
        }
    }

```
RESULT_CODEはACTIVITY.JAVAの定数です。

```java:ACTIVITY.JAVA
/** Standard activity result: operation succeeded. */
    public static final int RESULT_OK           = -1;
```

# 本論

**BundleもKEY-VALUEになっており、HASH MAP 資料構造(Data Structure)です。**

[Bundle - Android Developers](https://developer.android.com/reference/android/os/Bundle.html)

### 発信（送り）

```java:activity.java
  Bundle bundle = new Bundle();

  bundle.putString("data0", "bird");
  bundle.putString("data1", "lion");
  bundle.putString("data2", "dog");
  bundle.putString("data3", "cat");

  Intent intent = new Intent(getApplicationContext(), DrugDetailActivity.class);
  intent.putExtras(bundle);
  startActivity(intent);
```

1. putExtra("key","value");
2. putExtras(bundle);

### 受信（受け取り）

```java:ReceivedActivity.java
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();

        String bird = bundle.getString("data0");
        String lion = bundle.getString("data1");
        String dog =  bundle.getString("data2");
        String cat =  bundle.getString("data3");
    }
```

# 結論

PUT-GETのメカニズム です。
1. intent
2. bundle
3. send-receive

# 終わりに
初心者の方は無限な振り返りをして、
自分のものにしましょう。Codingは見るだけではNGです。

読みいただきありがとうございました。
次のPostで会いましょう！

**Dreamwalker。**
クロージャ調査内容の備忘録

Pythonの勉強中にクロージャなるものが出てきて何言っているのかわからなかったので、忘れたときに振り返ることができるようメモ。

基本的には以下を参照するとなんとなくわかる。
[Python Tips：Pythonでクロージャを使いたい](http://www.lifewithpython.com/2014_09_01_archive.html)
[クロージャってどんなときに使うの？ ～ 利用場面を ３つ 挙げてみる](http://qiita.com/HirofumiYashima/items/ed17c83f26de3d510b93#python-tipspython%E3%81%A7%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)
[[Python] 関数(4)](https://python.g.hatena.ne.jp/muscovyduck/20080709)

クロージャをざっくりいうと
**関数内の変数の値は、関数の宣言（関数を読み込んだ）時点で通った変数の値になる。**
みたいなのが、今の俺の理解。

こんなのあったときに、関数が読み込んだ時点で変数「i」には5が格納されているので、そのあとに変数「i」に6が入っても返却される値は5になる。

```py
i = 5

def f(arg=i):
    print(arg)

i = 6
f()
```
http://docs.python.jp/3/tutorial/controlflow.html


今までクロージャと無縁の世界に生きてきたので、なんでや！6やろ！感ある。
　
　
でもって、[クロージャってどんなときに使うの？ ～ 利用場面を ３つ 挙げてみる](http://qiita.com/HirofumiYashima/items/ed17c83f26de3d510b93#python-tipspython%E3%81%A7%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)に記載されているコレ。

```py
def circle_area_func(pi):
    """円の面積を求める関数を返す"""
    def circle_area(radius):
        return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値

    return circle_area #関数を返り値として返す

#円周率を 3.14 に設定した場合の面積を計算する関数を生成
ca1 = circle_area_func(3.14)

#次に、円周率を3.141592に設定した場合の関数を生成
ca2 = circle_area_func(3.141592)

#上記で作成した２つの関数に、半径=1 を引数に与えて、演算結果を取得
ca1(1)
ca2(1)

#上記で作成した２つの関数に、半径=2 を引数に与えて、演算結果を取得
ca1(2)
ca2(2)
```
各関数のパラメータにはそれぞれの値が入るんだけど、radiusに格納される値がなぜこれなのかよくわからなかった。

- circle_area_func(pi)のパラメータ「pi」には3.14(or 3.141592)
- circle_area(radius)のパラメータ「radius」には1(or 2)

　
そもそも俺は「ca1 = circle_area_func(3.14)」のca1に何が格納されているのかというのを理解できていなかったよう。

ca1に格納されているのって、ずっと関数「circle_area_func(pi)」内のすべてだと思っていたんだけど、じゃなくて関数「circle_area(radius)」だったのな。

```py
    def circle_area(radius):
        return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値

    return circle_area
```

後続処理で「ca1(1)」が実行されたときに、呼ばれているのは関数「circle_area(radius)」。
だからパラメータ「radius」には「ca1(1)」の1が格納されているということ。

関数「circle_area(radius)」内の変数「pi」はクロージャの考え方で、「ca1 = circle_area_func(3.14)」で引数に入れた3.14が入っているというだけ。


ものすごい時間とられたけど、腹落ちしたのでよし。
GoogleAnalyticsとBigQueryをリンクした時のtimezone

GoogleAnalyticsとBigQueryをリンクしたときに日次で`ga_sessions_YYYYMMDD`なテーブルが
自動で作成され、そこに日次のGAデータが格納される

スキーマとして、日時を表すvisitStartTimeはTIMESTAMPとして、日付を表すdateはSTRINGとして扱われているが、
BigQueryのtimezoneのデフォルトはUTCなので、ひょっとして1日の`ga_sessions_YYYYMMDD`の中に
dateが2ついるのかと考えて、以下のクエリを試してみた


``` SQL:bigquery
#standardSQL

SELECT
    MIN(date) AS min_date
  , MAX(date) AS max_date
  , MIN(TIMESTAMP_MILLIS(visitStartTime * 1000)) AS min_time
  , MAX(TIMESTAMP_MILLIS(visitStartTime * 1000)) AS max_time
  , MIN(DATETIME(TIMESTAMP_MILLIS(visitStartTime * 1000), 'Asia/Tokyo')) AS min_tokyo_time
  , MAX(DATETIME(TIMESTAMP_MILLIS(visitStartTime * 1000), 'Asia/Tokyo')) AS max_tokyo_time
FROM
    `projectId.datasetId.ga_sessions_20170508`

```

結果は以下で、dateとテーブル名に食い違いはなかった
ソートしたり極限値を条件にするだけならわざわざtimezoneは変換しなくて良さそう

|min_date|max_date|min_time|max_time|min_tokyo_time|max_tokyo_time|
|:---|:---|:---|:---|:---|:---|
|20170508|20170508|2017-05-07 15:00:00 UTC|2017-05-08 14:59:59 UTC|2017-05-08T00:00:00|2017-05-08T23:59:59|
Emacs使い方


|操作|コマンド|
|---|---|
|起動|eamcs|
|終了|C-x C-c|
|コマンドキャンセル|C-g|
|ファイルを開く|C-x C-f ファイル名を指定|
|ファイルを保存せずに終了|C-x k|
|上書き保存|C-x C-s|
|名前をつけて保存|C-x C-w|
|コピー|C-space(始点), M-w(ここまでコピー)|
|カット|C-space(始点), C-w(ここまで切り取り)|
|ペースト|C-y|
|元に戻す|C-x u|
|ウィンドウ分割(上下)|C-x 2|
|ウィンドウ分割(左右)|C-x 3|
|ウィンドウ間移動|C-x o|
|分割を解除|C-x 0(カーソルがある方が閉じる。ない方を閉じるなら1)|
|ファイル(バッファ)一覧|C-x C-b|
|行末までカット|C-k|
|シェルを起動|M-x shell|
|コンパイル|M-x compile|
|デバッガ|M-x gdb|

`M-x` : esc, x
AWS S3 に手軽にファイルをアップロードする方法 (Cyberduck, Transmit or Coda 2.5)


concrete5 のサイトで、S3 にファイルマネージャー内のファイルを保存しています。

その際、concrete5 (ブラウザ + PHP) ではアップロードしきれない大容量ファイルをアップする必要があったので、メモとして残します。

## Cyberduck や Transmit、 Coda 2.5 が良い

AWS CLI は、1端末につき1アクセスIDしか付与できませんので、複数アカウント管理している場合、切り替えが面倒です。

無料 (寄付型) ソフトで Mac & Windows 版がある Cyberduck や私が使っている、 Coda 2.5 や Transmit でも Amazon S3 を FTP のように扱える機能がついています。

### 各ソフト

- [Cyberduck](https://cyberduck.io/index.ja.html?l=ja)
- [Coda](https://panic.com/jp/coda/) ※有償
- [Transmit](https://panic.com/jp/transmit/) ※有償

### 設定のメモ

- 接続設定を開く
- Access ID を登録
- シークレットキーを入力
- アクセスできるバケットやフォルダを制限していたら、パスに
     - `/[バケット名]/[フォルダ]` などアクセスできる先のフォルダを入力する（そうじゃないと権限エラーで接続できない)
- あとは FTP のようにファイルをやり取りする

### 参考記事

- [Amazon S3 再入門 – AWS IAMでアクセスしてみよう！(Cyberduck 編)](https://cloudpack.media/5726)
- [Amazon S3編　サードパーティ製ツール比較](https://recipe.kc-cloud.jp/archives/7482)
- [Amazon S3バケットへのファイルアップロードを実現する – 01.概要&GUIお勧めツール編](http://dev.classmethod.jp/cloud/aws/various-way-of-s3-file-upload-01-gui/)


## IAM アカウントを作成

AWS コンソールから IAM アカウントを作成します。

- IAM ユーザーを作成
- S3 の権限を付与
    - S3FullAccess ではなく、特定バケットや特定ディレクトリ内のみの権限をあげるようにしましょう。（後述）
- アクセスキーと、シークレットキーを生成してダウンロード

## AWS CLI も良い

AWS CLI を使ってコマンドラインから送る方法もありますが、それは、いろいろ先人の方が記事をかかれているので、検索されると良いかもです。

### 参考記事

- [AWS CLIでS3を操作する](http://qiita.com/ran/items/e274ad35a27b5a003282)
- [AWS CLI で S3 にファイルをアップロード](http://qiita.com/seyself/items/43426f57c50021ea55f8)
- [S3特定バケットにアップロードできるだけの権限のユーザを作成する](https://github.com/mechamogera/MyTips/wiki/S3%E7%89%B9%E5%AE%9A%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A0%E3%81%91%E3%81%AE%E6%A8%A9%E9%99%90%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)


以上

# クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えて見て下さい。
OAuthアクセストークンを使ってAzure Storageにアクセスする


# 概要
[OAuthアクセストークンを使ってMicrosoft Azureにアクセスする](http://qiita.com/jkawamoto/items/6600d2d4ee4855fbfb87)では Swagger で生成したクライアントで OAuth アクセストークンを利用する方法を紹介したが，
本記事では，[Azure Storage SDK for Go](https://github.com/Azure/azure-storage-go/) を利用する方法を紹介する．


# API アクセスキー
Azure Storage SDK のクライアントはアクセストークンではなく，アクセスキーを必要とする．
このアクセスキーは [Storage API](https://docs.microsoft.com/en-us/rest/api/storageservices/) ではなく，[Storage Accounts API](https://docs.microsoft.com/en-us/rest/api/storagerp/storageaccounts) 経由で取得する．
また，Storage API は Azure Storage SDK からアクセスできるが，Storage Accounts API はアクセスできないので，
例によって Swagger を使って [Azure REST API Specifications](https://github.com/Azure/azure-rest-api-specs) からバインディングを用意する必要がある．

```sh
swagger generate client \
	-f https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2016-12-01/swagger/storage.json \
	-t storage
```

# Storage Accounts API
生成されたソースコードを用いて，先ずは Storage Accounts API のクライアントを作成する `NewStorageAccountsClient` 関数を定義する．

```go
import (
	"context"

	httptransport "github.com/go-openapi/runtime/client"
	"github.com/go-openapi/strfmt"

	// 以下は Swagger にて生成されたソースコードに合わせて修正する
	client "github.com/jkawamoto/roadie/cloud/azure/storage/client"
	"github.com/jkawamoto/roadie/cloud/azure/storage/client/storage_accounts"
)

const (
	StorageAPIVersion = "2016-12-01"
)


func NewStorageAccountsClient(ctx context.Context, token string) *storage_accounts.Client{

	manager := client.NewHTTPClient(strfmt.NewFormats())
	switch transport := manager.Transport.(type) {
	case *httptransport.Runtime:
		transport.DefaultAuthentication = httptransport.BearerToken(token)
		manager.StorageAccounts.SetTransport(transport)
	}
	return manager.StorageAccounts

}
```

次に，得られたクライアントの `StorageAccountsListKeys` メソッドを使ってアクセスキーを取得する `GetStorageKey` 関数を定義する．
またこの関数はアクセスキーが見つからない場合 `StorageAccountsRegenerateKey` 関数を使って生成する．

```go
const (
	// サブスクリプション ID
	SubscriptionID = ""
	// リソースグループ名
	ResourceGroupName = ""
)

func GetStorageKey(ctx context.Context, cli *storage_accounts.Client, account string) (key string, err error) {

	keyList, err := cli.StorageAccountsListKeys(
		storage_accounts.NewStorageAccountsListKeysParamsWithContext(ctx).
			WithAPIVersion(StorageAPIVersion).
			WithSubscriptionID(SubscriptionID).
			WithResourceGroupName(ResourceGroupName).
			WithAccountName(account)) // Storage アカウント名

	if err != nil || len(keyList.Payload.Keys) == 0 {
		res, err := cli.StorageAccountsRegenerateKey(
			storage_accounts.NewStorageAccountsRegenerateKeyParamsWithContext(ctx).
				WithAPIVersion(StorageAPIVersion).
				WithSubscriptionID(SubscriptionID).
				WithResourceGroupName(ResourceGroupName).
				WithAccountName(account))
		
		if err != nil {
			return "", err
		}
		key = res.Payload.Keys[0].Value
	} else {
		key = keyList.Payload.Keys[0].Value
	}

	return

}
```

# アクセスキーを使った Storage API のアクセス
最後に，得られたアクセスキーを使って Storage API のクライアントを作成する．

```go
import (
	storage "github.com/Azure/azure-storage-go"
)

func NewStorageClient(account, key string) (storage.Client, error) {
	
	return storage.NewBasicClient(account, key)

}
```
[Linux][kernel module] kthreadの実行CPUを指定/制限する

以下の記事の関連。各kthreadが実行されるCPUコアを制限する方法メモ。

[[Linux][kernel module] カーネルモジュール内でkthreadを作成する - Qiita](http://qiita.com/koara-local/items/8c46826ac02cff6d4be6)

# 実現方法

`void kthread_bind(struct task_struct *k, unsigned int cpu)` を使用すればよさそう。

[kthread_bind()/linux2.6 - LinuxKernelHackJapan](http://www.kerneldesign.info/wiki/index.php?kthread_bind()%2Flinux2.6)

複数指定する場合は、 `kthread_bind_mask(2)` というものも存在しているため、こちらを使えばよさそう（未検証）

`void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask)`

# 使用例

```c:使用例
struct task_struct *k0;
struct task_struct *k1;

k0 = kthread_run(kthread_func0, NULL, "task0");
k1 = kthread_run(kthread_func1, NULL, "task1");

kthread_bind(k0, 0);
kthread_bind(k1, 1);
```

`kthread_run()` 時に取得した task_struct と cpu のコア番号を指定する。
現在の環境のcpuの状況に関しては `/proc/cpuinfo` などを参照。

# 関連
[[Linux][kernel module] カーネルモジュール内でkthreadを作成する - Qiita](http://qiita.com/koara-local/items/8c46826ac02cff6d4be6)

# 参考
[linux/include/linux/kthread.h - Elixir - Free Electrons](http://elixir.free-electrons.com/linux/latest/source/include/linux/kthread.h#L52)
[kthread_bind()/linux2.6 - LinuxKernelHackJapan](http://www.kerneldesign.info/wiki/index.php?kthread_bind()%2Flinux2.6)
apt-getでエラーが出た場合の対処法：E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 

##目標
  - [ ] エラーが出てapt-getが操作できない問題を解決

##環境
 - Ubuntu 14.04.5 LTS

##問題
端末操作を誤って、apt-getプロセスを殺してしまいその後操作してもエラーとなってしまう

```shell-session
$ sudo apt-get install python-numpy
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
```

##対処法
同じ現象の質問と対処方法の回答が載っているページを見つけたので実施したら解決した
[E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) [duplicate]](https://askubuntu.com/questions/346143/e-could-not-get-lock-var-lib-dpkg-lock-open-11-resource-temporarily-unavai)

```shell-session
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
```
Cognos レポート出力形式(HTML or PDF)によりリストで表示される列を変える

##概要
タイトルのまんまになってしまいますが、Cognos BI&Analyticsで、同じレポートを出力する際に、HTMLで出力した場合とPDFで出力した場合に、出力内容を変える方法です。

HTML出力の場合のイメージ（収益の列が表示されている）
![017.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a844d10a-e09a-295a-3c1a-b4de6f9347f0.png)

PDF出力の場合のイメージ（数量の列が表示されている）
![018.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4389b1f6-a1e9-0bcf-8841-cf9acfb91ef7.png)

Report Authoringでのレポート定義は、リストに「収益」「数量」共に持っている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/75c6c7e8-2650-c1a3-3c71-a526870f6624.png)


##実装方法
Report Authoringでリストを配置し、図のように「製品ライン」「数量」「収益」を置いてみます。
数量の列の「リスト列の本体」部分を選択し、プロパティの「スタイル変数」から「新しい文字列変数」を選択します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4bfac7e5-32eb-fad8-ee1b-d6937ad5ff3f.png)

この画面のように「名前」と「値」を指定しOK。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9886087c-b97c-0ba3-c4a3-474ee56b973d.png)

この画面が開くので、図のように ReportOutput() と式を定義します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2fd0f6ff-62f4-96b7-cc16-2cce102d5a15.png)

OKを選択。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0aa7351c-26e5-78f5-bff5-5d931e156f44.png)

図のように「数量」列の本体が選択された状態で、
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e7796d6a-7afb-1172-3bb4-f04713a4b242.png)

コンディション・エクスプローラーを開き「HTML」を選択します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d9c54d8e-dc35-ad24-19b2-29ba5fe5039b.png)

プロパティから「ボックスのタイプ」で「なし」を選択します。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e1fc9589-63cb-165d-7e1b-506a5be23fc9.png)

ページ・エクスプローラーで「ページ1」を選択して戻ります。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2c5cf971-fb3e-9d22-93de-b0d1fadea299.png)

同様に「収益」列の本体を選択し、スタイル変数で作成済みの「vDISP」を指定します。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/23b18ab2-93aa-3fb6-ddd4-1e61098f204f.png)

このように「収益」列の本体を選択して状態で、
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/467455aa-3d06-461b-17c7-46be15520f22.png)

コンディション・エクスプローラーで「PDF」を選択します。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/bc622fbb-e894-4fa8-a83c-63b74851be03.png)

ボックスのタイプで「なし」を選択します。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b4c10455-16fd-0a0f-3d37-a5fc0c1c1491.png)

「数量」のリストの列タイトルを選択して、同様にスタイル変数に「vDISP」を指定します。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/46181da6-1a5c-1657-30c0-c20d3d06f9e1.png)

同様の処理を行います。コンディション・エクスプローラーでHTMLを選択し、ボックスのタイプで「なし」を選択します。
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7bce1d0c-f991-9280-1d0e-a3c90778fc4c.png)

同様に「収益」のリストの列タイトルを選択して、スタイル変数に「vDISP」を指定します。
![015.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cc3a3af8-2c6c-fcdf-bb43-315cf8ab679e.png)

コンディション・エクスプローラーでPDFを選択し、ボックスのタイプで「なし」を選択します。
![016.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4102eb37-d996-dbad-af0b-eac0b97d4bd9.png)

以上です。
出力形式による内容変化は求められる事も多いので、是非覚えておいて頂ければと思います。
CircleCI2.0でdockerのexperimentalを有効にする


ただ、`--squash`をしたかった。

CircleCI2.0では実行環境(Executer)を2種類から選択できる。指定イメージをつかう`docker`と1.0のような環境の`machine`。
dockerデーモンの挙動に手を入れられるのは`machine`のほうだけなので、環境に`machine`を指定。この時点でdockerは`17.03.0-ce`だったので、`--squash`が使える。おそらくもっと新しいバージョンにアップグレードして使うこともできるでしょう。


サンプルで使用したDockerfileはこちら。レイヤに差分がないと`--squash`がコケるので軽く変更します。

```Dockerfile
FROM alpine:latest

RUN apk update
ADD Dockerfile /Dockerfile
CMD ["/bin/true"]
```

## `.circleci/config.yml`のサンプル

最初のstepで`--experimental=true`を追記してリスタート。

```yaml:.circleci/config.yml
version: 2
jobs:
  build:
    machine: true
    working_directory: /home/circleci/circleci-sandbox-bb
    steps:
      - checkout
      - run:
          name: Enable experimental
          command: |
            set -x
            echo 'DOCKER_OPTS="--experimental=true"' | sudo tee -a /etc/default/docker
            # sudo DEBIAN_FRONTEND=noninteractive apt-get update && sudo apt-get install -y docker-engine ## ついでにdockerデーモンをaptリポジトリの最新にしたい時
            sudo service docker restart
      - run: |
          TAG=0.1.$CIRCLE_BUILD_NUM
          docker build -t local/circleci-sandbox-bb:$TAG --squash .
          docker image history local/circleci-sandbox-bb:$TAG
```


`image history`の実行結果で`--squash`による寄せができていることを確認。

```shell:circleci-outputs
.
.
.
Successfully built 6d611d5da4fc
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
2de9d6caee54        1 second ago                                                        1.03 MB             merge sha256:6d611d5da4fcfe515263c628140ae8a25a4b870881b8da9f88f9130caf44ae3c to sha256:02674b9cb179d57c68b526733adf38b458bd31ba0abff0c2bf5ceca5bad72cd9
<missing>           1 second ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           1 second ago        /bin/sh -c #(nop) ADD file:00457989c9c63fa...   0 B                 
<missing>           1 second ago        /bin/sh -c apk update                           0 B                 
<missing>           37 hours ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0 B                 
<missing>           37 hours ago        /bin/sh -c #(nop) ADD file:63f63606d6e289e...   3.99 MB            
```

machine-executerは起動がちょっと遅いのと、ちょいちょい環境の変化がありそうなのであまり常用したくはないけど、イメージのビルド用途なら十分。
Mavenで簡単ライブラリ導入！

## 目的
開発を行うにあたり、Mavenでライブラリを用意し、環境を構築するのは非常に便利です！
下記に手順を載せていきます。

## ダウンロード
Eclipse、もしくはpleiadesのダウンロード。
これについてはたくさんの解説サイトがあるので割愛

## 手順
まずはEclipse起動
![image001.png](https://qiita-image-store.s3.amazonaws.com/0/172553/3a8b51fa-f8ce-b642-1b18-be976f41c267.png)

ファイル→新規→Mavenプロジェクトの作成
![image002.png](https://qiita-image-store.s3.amazonaws.com/0/172553/617f8648-40ea-0214-9efe-9122e9073043.png)


シンプルなプロジェクトの作成にチェック
![image003.png](https://qiita-image-store.s3.amazonaws.com/0/172553/c03a2142-8946-31a5-bbf0-519143a560a7.png)


※下記は例
グループId：プロジェクト名を付ける
アーティファクトId：パッケージング名を付ける
バージョン：標準で可
他は標準のまま空白で化

![image005.png](https://qiita-image-store.s3.amazonaws.com/0/172553/d3bf1666-bae5-e263-0fae-f55ca4d1d746.png)

これでプロジェクトが作成されましたので、
Mavenでライブラリを追加していきます！

## Mavenでライブラリ追加
作成したプロジェクトのpom.xmlを開く
![image006.png](https://qiita-image-store.s3.amazonaws.com/0/172553/dbc97355-9b69-20f8-9343-2cff9eb50f7b.png)

中央のタブの「依存関係」を開き、真ん中の「追加」をクリック
![image007.png](https://qiita-image-store.s3.amazonaws.com/0/172553/433c46a4-eadf-d241-b1c6-94769fa693a0.png)

すると追加したいライブラリの情報を入力する画面が出てくる。
![image008.png](https://qiita-image-store.s3.amazonaws.com/0/172553/03320ede-cb23-a3f7-9e5a-f48495f3250e.png)


ここではJsonicのライブラリを追加してみる
http://jsonic.osdn.jp/index.html#maven


どこのライブラリもMavenリポジトリがある場合、下記のような記述があるので、それをそれぞれ入力する。

```xml
　　<groupId>net.arnx</groupId>
　　<artifactId>jsonic</artifactId>
```
バージョンは特定のバージョンを入れたい場合に入力
![image009.png](https://qiita-image-store.s3.amazonaws.com/0/172553/7b523b96-694d-fd44-ddd6-8cd53d7ef5e9.png)


これでOKをクリックし、前の画面に戻ると依存関係が追加されている
この状態でpom.xmlの保存を行うとライブラリが追加される。
![image010.png](https://qiita-image-store.s3.amazonaws.com/0/172553/d1a86856-f2fa-d592-a436-a1a6c36c59c2.png)


が、バージョンが入力されていないとダウンロードされない場合があるので
その場合は依存関係で追加したもののプロパティーを選択し、バージョンを入力
![image011.png](https://qiita-image-store.s3.amazonaws.com/0/172553/56f2531e-f37d-6ca9-7d79-5a276789085c.png)


入力して戻り、保存すると
Maven依存関係が増えており、jarファイルがあるのが確認できる
![image012.png](https://qiita-image-store.s3.amazonaws.com/0/172553/ba6e8290-13a8-3be0-cebd-73da9d7fa928.png)


あとは通常のライブラリと同じように
そのまま使うことができる

こんな感じの適当なソースを作成
Mavenプロジェクト立ち上げ後の作業はpom.xmlを編集しただけなのに
Jsonicがインポートできている
![image013.png](https://qiita-image-store.s3.amazonaws.com/0/172553/4230d3de-b2c6-5b68-de5f-782467061145.png)

```java:Testjson.java
package maventest;
import java.util.HashMap;

import net.arnx.jsonic.JSON;

public class Testjson {

	public static void main(String[] args) {
		HashMap<String, String> testdata = new HashMap<String, String>();
		testdata.put("testkey1", "testvalue1");
		testdata.put("testkey2", "testvalue2");
		
		String jsontext = JSON.encode(testdata);
		
		System.out.println(jsontext);
	}

}
```

ソースをJavaアプリケーションとして実行すると
コンソールのような出力に！
![image014.png](https://qiita-image-store.s3.amazonaws.com/0/172553/6ded309c-28e3-3f1c-2e15-7cb408b6e570.png)


Mavenを使えばこんな感じで簡単にライブラリ追加可能です！
kibanaをnginxのリバースプロキシでアクセスする

kibanaの設定ファイルでbasePathを指定することができる

```yaml:/etc/kibana/kibana.yml
server.basePath: "/kibana"
```

```nginx:nginx.conf
location /kibana/ {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        rewrite /kibana/(.*)$ /$1 break;
}
```
Macでタイプウェルをやる方法

## 必要なもの
- VirtualBox
- modern.IEの仮想イメージ
- 25GBの空きディスク

## Install
### VirtualBoxのインストール
VirtualBox は、使用している PC 上に仮想的な PC を作成し、別の OS をインストール・実行できるフリーの PC 仮想化ソフトです。 


VertualBoxのインストールを下記のURLからVertualBoxをインストールしてください。
https://www.virtualbox.org/

### modern.IEのインストール
modern.IEはMicrosoft社が無償で提供しているWindowsの仮想イメージになります。Internet Explorer上でのWebページの動作をテストする目的で提供されています。

これも下記URLからIEのversionと仮想化ソフトを選択し、仮想イメージをダウンロードしてください。
今回は、64bitのwindow7のIE11で、仮想化ソフトはVirtualBoxを使います。
4GBくらいあるので大体30分くらいかかります。
ダウンロードが終わったらzipファイルを解凍しておいてください。
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

<img width="857" alt="スクリーンショット 2017-05-12 13.17.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/1baaee53-ef8d-daed-d0f6-83744b5f1eff.png">

## Setup
下記の手順でセットアップを行います。
1. VirtualBoxで新しく仮想マシンを作成
2. 仮想マシンの起動
3. Windows7の日本語化
4. タイプウェルのインストール
5. テスト

### VirtualBoxで新しい仮想マシンを作成
インストールしたVirtualBoxをアプリケーションからから起動してください。
立ち上がったWindowの左上にある新規ボタンを押して新規仮想マシンの作成しましょう。

<img width="770" alt="スクリーンショット 2017-05-12 14.07.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/5c9aa1b5-4809-c18c-4cd8-4db86ad59197.png">

出てきたポップアップに適当な名前を入力してください。
タイプはMicrosoft Windowsで、バージョンはWindows7(64-bit)のままで大丈夫です。
名前が入力できたら続けるを押してください。

<img width="775" alt="スクリーンショット 2017-05-12 14.23.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/23bc26bd-cd79-7bf8-6c7e-5ef1cab3f607.png">

次に、仮想マシンに割り当てるメモリサイズを決めてください。あまり小さくしすぎるとwindowsの動作がとても重たくなってしまうので注意してください。
大体4096MB~8192MBの間であればサクサク動くと思います(僕は8192MB割り当てました)。
ちなみに、ここで割り当てるメモリは1GB=1024MBで計算してください。

<img width="772" alt="スクリーンショット 2017-05-12 14.32.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/febac6fb-3590-9847-8ca1-c5781448c9d6.png">

最後に、一番下の「すでにある仮想ハードディスクファイルを使用する」を選択し、右のフォルダアイコンを
クリックして、解凍したmodern.IEの仮想イメージを選択してください(.vmdkの方です)。
下図のようになった後に作成ボタンを押すと、Windows7の仮想マシンが作成されます。

<img width="772" alt="スクリーンショット 2017-05-12 14.37.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/9867852e-4b2f-b8fc-d1f1-dc57f19e9168.png">


### 仮想マシンの起動
作成した仮想マシンを起動してみましょう。
VirtualBoxのWindowの左側にWindowsの仮想マシンができているはずです。
それをダブルクリックすると仮想マシンが起動します。

<img width="774" alt="スクリーンショット 2017-05-12 14.44.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/120358/a5d61016-8169-30ee-41eb-d07a1e2927e2.png">

### Windows7の日本語化

modern.IEのデフォルトは英語です。タイプウェルは日本語Windows環境でしか動かないため日本語化する必要があります。
Windowsの日本語化については、こちらの記事の少し下の方にある日本語環境設定の手順通りにしてもらえれば問題ないと思います。
http://fnya.cocolog-nifty.com/blog/2015/12/vagrant-windows.html

### タイプウェルのダウンロード
下記からタイプウェル国語R2.2.3をダウンロードしてください。
タイプウェル憲法と間違えないように注意してください。
http://www.twfan.com/download.html

(注): optional updates are availableからJapanese Language Packを見つけられない人は[こちら](http://hacknote.jp/archives/20208/)を参照

### テスト
ダウンロードしたタイプウェル国語Rを解凍して起動してみてください。
問題なければタイプウェルが起動し、タイピング練習をはじめられると思います。
日本語化が上手くできていないとエラーが出てしまいます。

## おわりに
Think Padなどに比べるとMacのキーボードはかなりタイプし易いはずなので、爆速タイピングで周囲を驚かせましょう\(^o^)/
AndroidシミュレータGenymotionに Google Play ストア をインストール


みんな大好きAndroidシミュレータ [Genymotion](https://www.genymotion.com/)。
Google Play ストアを入れる方法が楽になっていた。

**(2019.11.25) もっと楽になってました。**

<img width="772" alt="スクリーンショット_2019-11-25_23_14_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16548/ed06d973-586f-d84a-16fb-90ebc066f262.png">

1. 右上の`OpenGApps`ボタンを押す。
2. NOTEを確認して `Accept`
3. `Restart Now`でシミュレータを再起動

以上です。

<img width="651" alt="スクリーンショット_2019-11-25_23_37_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16548/c03182ba-0141-de50-f629-68dd159794b4.png">

Play Storeがインストールできました。


---

_以下、昔の記事_

出回っている情報は古いものが多かった。「`ARM Translation Installer v1.1.zip`を入れて〜」とかもう~~不要~~`[訂正]armネイティブのコードを含むアプリを入れるには必要`だったので現状で、最新の方法。

[公式FAQ](https://www.genymotion.com/help/desktop/faq/#google-play-services
)に方法が書いてあった。



[Open GApps](http://opengapps.org/)で落としたZipファイルをエミュレータにドラッグ＆ドロップするだけ




## 拡張パッケージをダウンロード

![スクリーンショット 2017-05-12 14.34.50.png](https://qiita-image-store.s3.amazonaws.com/0/16548/9b61b26c-df4a-dca3-9815-42ea1543efcb.png "スクリーンショット 2017-05-12 14.34.50.png")

[Open GApps](http://opengapps.org/) から以下を選択。

1. Platform`x86`を選択
2. Androidバージョンを選択
3. Variantは`nano`
4. 赤いボタンでZipファイルがダウンロードされる





## ダウンロードしたZipファイルをGenymotion仮想デバイスにドラッグ＆ドロップする

![スクリーンショット 2017-03-28 7.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/16548/a8ad8f13-7ea4-96de-26f3-7466a8b222fc.png "スクリーンショット 2017-03-28 7.16.25.png")

アラートで出るので「OK」を押すと再起動される。


## できました

![スクリーンショット 2017-03-28 6.48.31.png](https://qiita-image-store.s3.amazonaws.com/0/16548/56802fe1-7b48-a71b-b432-d251cb7223ec.png "スクリーンショット 2017-03-28 6.48.31.png")

再起動後、Playストア アイコンが増えてます。


![スクリーンショット 2017-03-28 6.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/16548/2610cf28-fdd5-c714-5196-a3ef23bfa4fc.png "スクリーンショット 2017-03-28 6.58.09.png")


あとはインストールするだけ
（armネイティブのコードを含むアプリには``ARM Translation Installer`が必要だそうです）



## 引責


> Genymobile Inc.とGenymotionは、仮想デバイス内でのGoogle Playサービスのダウンロード、インストール、使用に起因するいかなる責任も負いません。あなたはその使用に全面的に責任を負い、それに関連するすべての責任を負うものとします。さらに、OpenGappsパッケージとGenymotionの任意のバージョンとの互換性に関して、特定の目的のためのいかなる種類の保証も否認します。

とのことですので、自己責任で使用しましょう。
pfsenseでSSL証明書を設定する時に、中間CAを設定する。

## 目的
pfsenseでSSL証明書を設定する際に中間CAを設定する。

## 経緯
先日、ロードバランサとして使用しているpfsenseでSSL証明書を設定しようとしたところ
中間CAを設定する箇所がなく、解説しているサイトも見当たらなかったためメモしておく

## 手順
とっても簡単
Cart Manager→Certificate→＋
で新規追加するという部分から通常の設定は全て同じだが

Certificate dataの欄にと通常の証明書を張り付け
-----BEGIN CERTIFICATE-----
～～～～～～～～
-----END CERTIFICATE-----
そしたらそのままその欄内に
-----BEGIN CERTIFICATE-----
～～～～～～～～
-----END CERTIFICATE-----
と、中間CAも貼り付けすればよい。

他は通常通りPrivate key dataの欄にプライベートキーを張り付ければ
-----BEGIN RSA PRIVATE KEY-----
～～～～～～～～
-----END RSA PRIVATE KEY-----
中間CAのあるSSL証明書の設定が完了する。
ロリポップでSQLiteを使う

#ロリポップでSQLiteを使う
一番安いプランが月額100円なので遊び用にロリポップのレンタルサーバーを契約しましたが、最安プランでもSQLiteが使えるので、せっかくだから使い方を調べてみました。
特になにか設定などは必要なく、PHPだとソース中に ``new PDO('sqlite:～')`` と書くだけで使用できるようです。

##サンプル
```php
<?php
header('Content-type: text/plain; charset=utf-8');

$conn = new PDO('sqlite:./test.db');

$conn->exec("create table if not exists aaa(xxx, yyy) ");

$sth = $conn->prepare('insert into aaa(xxx, yyy)values(:xxx, :yyy)');
for ($i = 0; $i < 100; $i++) {
    $sth->bindValue(':xxx', $i, PDO::PARAM_INT);
    $sth->bindValue(':yyy', $i + 100, PDO::PARAM_INT);
    $sth->execute();
}

echo date(DATE_ATOM), "\n";
foreach ($conn->query("select xxx, yyy from aaa") as $row) {
    echo "{$row['xxx']}\t{$row['yyy']}\n";
}
$conn->exec("delete from aaa");
InkCanvasとViewbox

Windowのサイズ変更に応じてInkCanvasの大きさを変えたかったので
Viewboxの中に放り込んだら、
InkCnavasの端っこで描くと勝手にサイズを変更してしまうみたいだった。
かなり鬱陶しい

```
    <Grid>
        <Rectangle Fill="Black" />
        <Viewbox>
            <InkCanvas />
        </Viewbox>
    </Grid>
```

最初の状態
![01.png](https://qiita-image-store.s3.amazonaws.com/0/172316/5f2dfd1d-9f8f-e0ac-29e9-d64c2d7adac9.png)

下に線を引いたら、それに引っ張られるように縦長に
![02.png](https://qiita-image-store.s3.amazonaws.com/0/172316/ef10453b-e442-c5ab-a5e8-1b1c38bcb1f6.png)

右に線を引いたら右に伸びた
![03.png](https://qiita-image-store.s3.amazonaws.com/0/172316/43e03926-2a1c-51b1-177f-a3fbf54fa955.png)


InkCanvasのWidth, Heightを指定する

```
    <Grid>
        <Rectangle Fill="Black" />
        <Viewbox>
            <InkCanvas Width="400" Height="300" />
        </Viewbox>
    </Grid>
```

すると、端で描いてもサイズが変わらなくなった
![04.png](https://qiita-image-store.s3.amazonaws.com/0/172316/0080bf55-0905-605c-629d-40fd8e8a4a94.png)

なんでかようわからんけど、まぁよし
Xcode覚書


Xcode上でリリースビルド用のAdHocプロビジョニングを設定し、
Run実行時に下図のエラーがでる。
<img width="422" alt="スクリーンショット 2017-05-12 14.11.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/17904/6eea83a9-fe41-9cee-d88b-bfa9a2c3ad87.png">

解決方法
Product > Scheme > EditScheme > Run > DebugExecutable　のチェックを外す。


参考URL：http://qiita.com/Tomooki_Tatsuguchi/items/7924b1bb924860ca219f
Monacaでモバイルアプリ開発環境を準備しよう!

※本ドキュメントは新入社員向けのトレーニング資料です。
#1.はじめに
**Monacaとは**
Monacaはアシアル社が提供しているスマートフォン向けアプリの開発環境の呼称です。
アプリの開発はMonacaクラウドIDE(Web経由)を使用して行います。
開発環境の提供だけではなく、誰でも簡単にスマートフォン向けのアプリ開発ができるように、その仕組みとサポートを提供しています。

![monaca-ide.png](https://qiita-image-store.s3.amazonaws.com/0/96076/5c4f3845-6471-5161-e536-a0b3e4212106.png)

**OnsenUIとは**
OnsenUIは同じくアシアル社が提供しているフロントエンド開発用のツールです。
OnsenUIが提供するUIを使用すると、PhoneGap/Cordovaアプリを非常に簡単に綺麗で見映えの良い、使いやすいUIを実現できます。
ハイブリッドアプリでもネイティブ並みの外観と操作性を全てのプラットフォーム上で実現できます。Monacaと共に使用すればバックエンドとデバイスのサポート機能を追加でき、公開可能なアプリを簡単に作成できます。Monacaが提供するテンプレートには標準でOnsenUIが使用されています。

**詳しくは…**
[Monaca Docs](https://docs.monaca.io/ja/)をご覧ください。

#2.開発環境の準備(IDE編)
**アカウントの作成**
Google Chromeにて以下のサイトにアクセスします。
[https://ja.monaca.io/](https://ja.monaca.io/)

「今すぐ試す（無料）」もしくは「サインアップ」をクリックします。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/96076/aec95485-1462-fe66-8f96-9f4355071c27.jpeg)

メールアドレスとパスワード(確認含めて2回)を入力し、「今すぐ試す」もしくは「今すぐ登録(無料)」をクリックします。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/96076/747ce455-942e-90c3-523d-d91adcaebfbb.jpeg)
![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/96076/cb0fec27-f792-989c-d323-103d208efb33.jpeg)

確認メール送信画面が表示されます。
もしメールが届かないようなら、「確認メールを再送する」ボタンをクリックし、再度メール受信を試みてください。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/96076/1238d5e1-3043-a06f-4ff1-92af56dd33cc.jpeg)


メールを確認し、本文中のリンクをクリックします。
この際、デフォルトのブラウザがChorome以外の場合はリンクをコピーしてChorome上で実行してください。
![スクリーンショット 2017-04-21 12.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/96076/30fc8056-183c-7633-7ff5-318837d52766.png)


アカウントの登録が完了しました。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/96076/4cff4e23-f9df-b5eb-6f49-072f1ac67bff.jpeg)

その後、自動的にダッシュボードに遷移します。

#3.開発環境の準備(スマホアプリ編)
**Ｍonacaデバッガーのインストール**
実機で確認するためにiPhone/Androidのデバッグアプリをインストールします。
AppStoreもしくはGooglePlayにて「Monaca」で検索します。
![IMG_0022.PNG](https://qiita-image-store.s3.amazonaws.com/0/96076/70144c81-5374-f15a-63be-0f01e678540e.png)

アプリの発行元がAsial Corporationであることを確認した上でインストールしてください。
![IMG_0928.PNG](https://qiita-image-store.s3.amazonaws.com/0/96076/e85c1212-b7be-d953-d4aa-da394c8e69a9.png)


インストール完了後にアプリを起動します。
![IMG_0023.PNG](https://qiita-image-store.s3.amazonaws.com/0/96076/f70cb2c8-f03f-c620-b1a0-5de44cb6c570.png)

PCにて登録したアカウントとパスワードを用いてログインします。
![IMG_0024.PNG](https://qiita-image-store.s3.amazonaws.com/0/96076/eefff424-c94e-307f-c9dd-b001e3ff92d6.png)

ログインが完了すると以下のような画面になります。
![IMG_0025_1.png](https://qiita-image-store.s3.amazonaws.com/0/96076/a8bb7dc5-d07b-6d27-b51b-dfd67acbe86a.png)


開発環境の準備は以上で終了です。お疲れさまでした。
Choregraphe 2.5.5.5における［Say］ボックス及び［Animated Say］ボックス


# 新しい［Say / Animated Say］ボックス
　Choregraphe 2.5.5.5では［Say］ボックス及び［Animated Say］ボックスでの発話（セリフ）の設定方法が変更になりました。
## Choregraphe 2.5.5.5
　［Say］あるいは［Animated Say］ボックスの［スパナ］ボタンをクリックし、ボックス内変数［Text］に発話させたい文章を入力します。
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/222ac1ae-dc14-7cb6-04ad-c964ba1e907b.png)
↓［スパナ］ボタンをクリック
![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/cd51a1da-49cc-bdba-9214-6baa2612b020.png)
## Translation Workflow
　2.5.5.5ではNAOqiにTranslation Workflowが導入され、アプリの多言語対応が一元的に行えるようになりました。ロボアプリ内に含まれる［Say］あるいは［Animated Say］ボックスに対して、一つづつ翻訳設定を行う必要はなくなります。
　参考：http://doc.aldebaran.com/2-5/software/choregraphe/objects/translations.html
### 使い方
　設定の流れは以下の通りになります。
#### Choregrapheの操作
1.	［Say］あるいは［Animated Say］ボックスを作成し、セリフを設定します。
2.	［プロジェクトファイル］パネルより［プロパティ］ボタンをクリックします。（［プロジェクトのプロパティ］が画面が開きます。）
3.	［プロジェクトのプロパティ］画面内［ロボアプリの対応言語］で、追加させたい言語を選択します。
![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ec9b4001-1b12-f464-54cc-4efa85cbfd76.png)
4.	［OK］ボタンをクリックします。
5.	メニュー［ファイル］-［アプリをローカライズする］をクリックします。（Qt Linguistが起動します。）


#### Qt Linguistの操作
1.	Qt Linguist［コンテキスト］パネルで翻訳の対象となるボックスを選択します。
![fig4.png](https://qiita-image-store.s3.amazonaws.com/0/54394/fe42379b-8f42-58f8-6490-175218fc72ee.png)
2.	［文字列］パネル-［ソーステキスト］リストで翻訳の対象のボックス変数を選択します。
3.	メインパネルに翻訳テキストを入力します。
![fig5.png](https://qiita-image-store.s3.amazonaws.com/0/54394/89d4bc50-57b9-8a16-0059-4726861af5ce.png)
4.	メニュー［ファイル］-［全てを保存］をクリックします。
5.	Qt Linguistを終了させます。

　上記設定を行うことで、実行言語ごとに設定したテキストが反映され、Pepeprが発話します。
### アップグレードの必要性
　Choregraphe 2.5.5.5でも同様に、従来の［Say］あるいは［Animated Say］ボックスを含むアプリは編集もでき、動作もします。ボックスを無理に置き換える必要はありません。
　しかし、Choregraphe 2.5.5.5で作成された［Say］あるいは［Animated Say］ボックスはChoregraphe / NAOqi 2.4.3.28では正常に編集も動作もできません。
　対応関係は以下のようになります。

|  |NAOqi 2.5.5.5|NAOqi 2.4.3.28|
|:--|:--:|:--:|
|従来の［Say / Animated Say］ボックス|○|○|
|新しい［Say / Animated Say］ボックス|○|×|

　多言語化が前提となるアプリであれば新しい仕様のボックスへの変更も検討してみてください。
### translationsフォルダ
　Qt Linguistによって設定された情報はどこに格納されているのでしょうか。2.4.3.28のプロジェクトとは違い2.5.5.5では新しいフォルダ”translations”が作成され、このフォルダに言語毎の設定情報ファイルが作成されます。
　中身はxmlファイルですのでテキストファイルとして編集できますが、**Qt Linguistを利用した編集を推奨**いたします。
トランザクション分離レベルの勉強記録(4) 検証手順と予測

（前提知識：[InnoDBのロックに関する用語の確認](http://qiita.com/noonworks/items/e7c17c91caab1bbb7593)で書いた用語を使っているのでさらっと読んでおくとわかりやすいと思う）



## おさらい

トランザクション分離レベルを実現するために、MySQLは以下の方法を組み合わせている。

* 読み取り／書き込みについて、**ロック**を使って待機させたりエラーにしたりして制御する方法
* 読み取りについて、**MVCC**を使って前のバージョンを読み取る方法

また、MySQLでの読み取り／書き込み操作には以下の種類がある。

* 書き込み（`UPDATE`、`DELETE`、`INSERT`）
* 読み取り
  - `SELECT ...`（ロックを明示しない読み取り）
  - `SELECT ... LOCK IN SHARE MODE`（共有ロックを明示した読み取り）
  - `SELECT ... FOR UPDATE`（排他ロックを明示した読み取り）



## 予測

検証の前に、予測を立てた。

* 予測①　**書き込み**は、どの分離レベルでも同様に排他ロックを取得する
* 予測②　**ロックを明示した読み取り**は、どの分離レベルでも同様に明示された通りのロックを取得する
* 予測③　読み取り時にロックを取得する場合は、最新のデータを読む（過去のバージョンのデータをロックすることはできないから）
* 予測④　**ロックを明示しない読み取り**の動作は、分離レベルによって異なる
  - 最新の値を読み取る場合／前のバージョンを読み取る場合／ロックを取得する場合
  - どの分離レベルでどの動作かは長くなるので別ページにまとめる予定



## 検証手順、詳細な予測および結果へのリンク

検証項目が多く、書いていたらあまりにも長くなったので、ページを分けた。書き次第リンクをつなげていく。

1. 予測①書き込み
   * [検証手順と詳細な予測](http://qiita.com/noonworks/items/f22bf1f1f7a9a677f434)
   * [`INSERT`の結果](http://qiita.com/noonworks/items/3733d76405892b598323)
2. 予測②と③ロックを明示した読み取りの検証手順
3. 予測④ロックを明示しない読み取りの検証手順
netflowはじめてみた

netflow は前から試してみたかったのだけれど、対応しているものを常設するのも億劫で手を出せていなかった。Linux 箱で組んで入れてみたものの、「ずっと動かすのもなー」とか「電源落ちたらネットワークも断だなー」とか考えて困っていた。そうしていたら、気が付いたら[mirror ポート設定できるスイッチングハブ](http://www.tp-link.jp/products/details/cat-41_TL-SG105E.html)が2000円台で[買える](http://amzn.asia/5lY3WKI)ようになっていて、これ使えそう！

こんな感じに組んだ。

```
 upstream
   |
 +-+-------------+
 |   TL-SG105E   |
 +-+-------+---+-+
   |       |   |(mirror)
   |       |   |
 +-+--+  +-+---+-+
 | PC |  | Linux |
 +----+  +-------+
```

upstream の ingress, egress を mirror ポートに出す設定を入れる。

Linux 側ではこれらを準備する。なお Linux はここでは Ubuntu 17 を使う。

- [ipt-NETFLOW](https://github.com/aabc/ipt-netflow)
- [nprobe](http://www.ntop.org/products/netflow/nprobe/)
- [ntopng](http://www.ntop.org/products/traffic-analysis/ntop/)

データの流れは promisc interface -> `ipt-NETFLOW` -> (netflow) -> `nprobe` -> (zeromq) -> `ntopng` のようになる。IPV6 対応させたいので netflow v10 であるとろの ipfix を使う。

## interfaces

mirror に繋がっているインターフェースが `ethX` だったとする。`NetworkManager` にはミラーポートにパケットを流して欲しくないので、`/etc/network/interfaces` 管理にするなど対策を講じる。

```:/etc/network/interfaces
auto ethX

iface ethX inet manual
  pre-up ifconfig $IFACE up promisc
  post-down ifconfig $IFACE down
```

## ipt-NETFLOW

普通にやると Linux が upstream と通信したパケットもミラーされて送られてくるので、そのアドレスが再び解釈されて `127.0.0.1` に変換されたりする。これを防ぐために `PREROUTING` チェーンで処理することになる。`PREROUTING` で処理するためには ipt-NETFLOW は promisc オプションを有効にしてコンパイルしないといけないと README.promisc に書いてある。

```:/etc/sysctl.d/60-netflow.conf
net.ipv6.conf.ethX.disable_ipv6=1
```

```:/etc/modprobe.d/netflow.conf
options ipt_NETFLOW protocol=10 promisc=1
```

上記の kernel パラメータを有効にした後、netfilter の設定を入れる。module parameter はsysctl だと上手く反映されなかったりしたので、modprobe 時点で設定するようにしています（原因未調査）。

```bash
iptables -A PREROUTING -t raw -i ethX -j NETFLOW
ip6tables -A PREROUTING -t raw -i ethX -j NETFLOW
/etc/init.d/netfilter-persistent save
```

## nprobe, ntopng

[公式ドキュメント](http://www.ntop.org/get-started/download/) に従ってインストール。

### nprobe

nprobe は少し癖がある。`systemd` のファイルは用意されていない。いずれにせよ、collector モードで動作させるので、次のような設定ファイルを用意する。

```:/etc/nprobe/nprobe-none.conf
-g /var/run/nprobe.pid
--collector-port 2055
-i none
-n none
--zmq tcp://127.0.0.1:1234
-V 10
```

`/etc/nprobe/nprobe-none.start` という名前の空ファイルを用意しておくと、起動されるようになる。systemd の互換機能を使えば大丈夫。

```bash
$ systemctl enable nprobe
```

### ntopng

ntopng は通常の `systemd` ファイルで起動するようにできている。デフォルトの設定では、各 netdev を対象として分析を行うようになっている。今回は zeromq プロトコルで nprobe から受け取るので、次のように設定する。

```:/etc/ntopng/ntopng.conf
--community
-G=/var/run/ntopng.pid
-i=tcp://127.0.0.1:1234
```

これも systemd から起動するようにしておく。

```bash
$ eystemctl enable ntopng
```
「ふしぎなポケット」の設計

# 前提
ふとぼんやり考えて「あーこういうこと考えるの楽しいなー」と思う感覚を共有したい記事です。
筆者はシステム設計をやっている者ではないです。

# 問題

「ふしぎなポケット」まど・みちお作詞
>
ポケットの　なかには
ビスケットが　ひとつ
ポケットを　たたくと
ビスケットは　ふたつ
>
もひとつ　たたくと
ビスケットは　みっつ
たたいて　みるたび
ビスケットは　ふえる
>
そんな　ふしぎな
ポケットが　ほしい
そんな　ふしぎな
ポケットが　ほしい

# ビスケットの増えかたについて考察
ビスケットの増えかたには`ひとつ->ふたつ->みっつ`という情報がある。
1,2,4,8...と増えるのは間違いだとわかるが、1,2,3,4,...も1,2,3,5,8,...もあり得る。
さらに`叩いてみるたび増える`が3つに増えるまでの現象のみを指しており、未来については言及していないという可能性もある。

よってビスケットが増える仕様として想定しておくものは以下の3通り。

A. 1,2,3,4,...とひとつずつ増える
B. 1,2,3,5,8,...とフィボナッチ数列的に増える
C. 1,2,3と増えて止まる

# 不思議なのはポケットなのかビスケットなのか
そもそも`そんなふしぎなポケットがほしい`なのでポケットなのだが、ちょっと考えてみる。

## ビスケット自身の機能で増える場合

単純に「叩かれると増える」だと1,2,4,...と増えそうなのでNG。
ここに例えば「増えるのは一度きり」という仕様を追加すると、1,2,3,4,...というAの動作をしてくれそうなのでOKっぽい。
例えば「2度増えると死ぬ」という仕様にすればBが実現できる。
「ポケットの残り容積が足りない場合は複製に失敗する」みたいな処理が入るならCは間接的に実現できそうだけどロバスト性に欠ける。

## ポケットの機能でビスケットが増える場合

### Aをやろうとしてみる
「叩かれるとなにかしらのビスケットがひとつ生成される」機能だと、作った時点で想定していなかった種類のビスケットは生成されなそうなので何年後かにメンテが必要。
ビスケットが入ってない時でもビスケットが生成できるのでそこは嬉しい。

ただ、ビスケット以外のものでも増やせたほうが夢があるのでそこは限定したくない。

「中のものの種類をチェックする」機能を追加するとクリアできるけど、一気に機能が複雑になるしこれ以上考えてもあんまり面白くなさそう。

### Bをやろうとしてみる
前回と前々回にいくつ増やしたか（あるいはいくつ存在したか）を覚えておく必要がある。
発想というよりは腕力でねじ伏せる感じのソリューションなのでこれ以上考えても（略
途中でビスケットをいくつか食べたあとに謎の挙動をして持ち主を困惑させる恐れもあるし。

### Cをやろうとしてみる
いまいくつあるのか（もしくは何回増やしたか）を気にする必要がある。
「ポケットの残り容積が足りない場合は失敗する」みたいな処理が入るなら実現できそうだけどロバスト性に欠ける。


# さいごに
あーたのしい。
しかし実際に使われるシーンを想像してみると、ビスケット側に実装したほうが幸せな気がしますよね。
童謡とか物語とかのシーンを抜き出して、「私ならこうプログラミングする」みたいな大喜利やるとたのしそうだなー。
Laravelでfakerのlocaleを常時日本固定にする方法

fakerを使うときに毎回localeを指定するのが面倒だったので。

# 2017/05/29 追記

もっと簡単な方法ありました。
fakertのデフォルトのlocaleはconfigで管理できるようです。
fakerでgrepをかけていたときにたまたま見つけたのですが・・・

```php:DatabaseServiceProvider::registerEloquentFactory
    /**
     * Register the Eloquent factory instance in the container.
     *
     * @return void
     */
    protected function registerEloquentFactory()
    {
        $this->app->singleton(FakerGenerator::class, function ($app) {
            return FakerFactory::create($app['config']->get('app.faker_locale', 'en_US'));
        });

        $this->app->singleton(EloquentFactory::class, function ($app) {
            return EloquentFactory::construct(
                $app->make(FakerGenerator::class), $this->app->databasePath('factories')
            );
        });
    }
```

## こんな感じでスッキリかけます

```php:config/app.php
    // fakerで使用するlocale
    'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
```

```.env
APP_FAKER_LOCALE=ja_JP
```

## 動作確認

いいかんじ！！

```
$ php artisan tinker
app(\Faker\Generator::class)->name;
=> "浜田 香織"
```


# ~~ServiceProviderでサービスコンテナへ登録する~~

このやり方でも出来なくは無いですが無駄が多いです。
[こちらを参照してください](http://qiita.com/shima_6_you/items/83af3b9fe79387d82286#20170529-%E8%BF%BD%E8%A8%98)

```php:DevEnviromentServiceProvider.php
	/**
	 * Register the application services.
	 *
	 * @return void
	 */
	public function register() {
		if (in_array(config('app.env'), [
				'local',
				'dev',
				'testing'
		])) {
			// fakerのlocaleを日本語に固定する
			$this->app->singleton(\Faker\Generator::class, function () {
				return \Faker\Factory::create('ja_JP');
			});
		}
	}
```
VBScriptでファイル一覧作成 

大量ファイルの一覧が欲しかったので書いてみた


### ファイル一覧.vbs

```vbnet:ファイル一覧.vbs

Option Explicit

'// INIT
Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

'// メイン処理開始
WScript.Echo  "日時" & vbTab & "サイズ" & vbTab & "ファイル名" & vbTab &  "フォルダパス"
FindFolder FSO.GetFolder(".")

'// 後処理
Set FSO = Nothing


'//===================================================================
'// サブフォルダも再帰して一覧を表示
Sub FindFolder(ByVal objMainFolder)
    Dim objSubFolder
    Dim objFile
    
    '// フォルダがあれば再帰
    For Each objSubFolder In objMainFolder.SubFolders
        FindFolder objSubFolder
    Next
    
    '// フォルダの中のファイル情報を表示　　：　日時　サイズ　ファイル名　フォルダパス
    For Each objFile In objMainFolder.files
        WScript.Echo  objFile.DateLastModified & vbTab & objFile.Size & vbTab & objFile.Name & vbTab &  objFile.ParentFolder 
    Next
End Sub

```


### 使い方

```
cd  c:\・・・・\・・・・
cscript  //nologo  ファイル一覧.vbs   >  list.tsv

```

DOS窓でリストを取りたいフォルダに移動して
cscript コマンドを実行
リダイレクトしたファイルに一覧が保存されます

一覧をエクセルなりなんなりで処理すればいい感じになると思います