2015年2月28日土曜日

SSL 証明書更新 著名要求書の作成

毎年必要な作業なのに、いつも時間がかかる。
今年実施した作業をまとめておく。

まずは暗号鍵の作成。

openssl genrsa -out 2015.key 2048


続いて、著名要求書の作成

openssl req -new -sha256 -key 2015.key -out 2015.csr

次の事項を聞かれるので適当に入力
- 国名
- 都道府県名
- 市区町村名
- 組織名
- 部署名
- Common Name は自分のFQDN と同じにする

以下は省略(空エンター)で良い。
- Email Address
- A Challenge password
- An optional company name



昨年何を入力したか確認するにはこれ。

openssl x509 -in 2014.crt -noout -text

Subject : の後を見ると良い。


2015.crt を認証局に証明してもらう。


Apache の再起動時にパスワードを聞かれないようにパスワードを削除。

openssl rsa -in ./2015.key -out 2015.key.withoutpass



2015.key と 認証局からもらえるファイルを Web サーバー(Apache 等)に登録すればOK。

raspberry pi スターターキット

http://www.itmedia.co.jp/pcuser/articles/1502/27/news126.html

OS インストールは最初の試練だから、準備してもらえるのはいいよね。

2015年2月25日水曜日

Pi-Top ほすぃ

Pi-Top それは Raspberry pi がノートPC になってしまう素敵なキット。
これがあればいつでもサーバーを手元に置いておける。
でも、スマホの方がスペック高いんだよな。。。

ojdbc をmaven で管理するには

ojdbc はライセンスの都合でmaven リポジトリに登録されていないそうだ。

代わりに、自分のローカルマシンのレポジトリにインストールすればよい。


mvn install:install-file -Dfile=/path/to/your/ojdbc.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar

あとはいつも通り pom.xml を記載。

<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0</version>
		</dependency>
意外と簡単だ。


こちら参照させて頂いた。
http://www.mkyong.com/maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/

2015年2月23日月曜日

スーパーマリオに出てくるきのこはベニテングダケだった

http://ja.wikipedia.org/wiki/ベニテングタケ

基本的には毒きのこだが、摂取すると多幸感が得られるらしい。
長野県の一部で食用とされている。
いつかちょっとだけ食べてみたいものです。

Mac book air のSSD が約1T に!

Transcend SSD いいなあ。
これさえあれば、自宅のNAS すら要らなくなる気がする。
Boot camp で Windows 用の領域もたっぷり確保できそう。
75,000 円は自分には手が出しにくいのだが。

2015年2月20日金曜日

casperjs デバッグ注意点

やはりステップ実行できないと開発効率が悪いと思う。
以下に使い方をメモしておきます。こちら参照させてもらいました。

casperjs 起動時に、オプション「--remove-debugger-port=9000」を付ける。
なぜか最後の引数としないと動かない。

Chrome 系のブラウザで http://localhost:9000 を開き、「about:blank」をクリックする。

Console から「__run()」を実行すると処理が動きだす。

casperjs のコードの途中に、「debugger;」と記載するとそこで止まってくれる。

あとはchrome での javascript のバッグと同じ。

2015年2月19日木曜日

amazon の購入履歴csv 化

casperjs というのを使って作ってみた。
コードは荒いが必要な方がいるかもしれないので、公開します。

casperjs のセットアップ(こちらが良いかも)後、下のamazon_csv.js を保存して、コマンドラインから次のように実行します。

使い方)
casperjs amazon_csv.js メールアドレス パスワード 対象年

例)
casperjs amazon_csv.js hoge@fugapiyo.co.jp password001 2014年


ここからamazon_csv.js
var casper = require('casper').create({
  pageSettings: {
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4'
  },
  verbose: true,
  logLevel: 'debug'
});
var email = casper.cli.get(0);
var pass = casper.cli.get(1);
var targetYear = casper.cli.get(2);

var url = 'https://www.amazon.co.jp/gp/css/order-history';
var detailIdList = [], detailIdIndex = 0;
var capId = 1;
var csvDatas = [];

function cap(){
  casper.capture(capId++ + '.png');
}
function dump(o){
  require('utils').dump(o);
}

function setEidToDetail(){
  var linkCandidates = document.querySelectorAll(".order .a-link-normal");
  var map = Array.prototype.map;
  var filter = Array.prototype.filter;
  var id = 0;
  return map.call(filter.call(linkCandidates, function(e){
    return '注文の詳細' == e.innerHTML;
  }), function(e) {
    var newId = 'secret' + id++;
    e.setAttribute('id', newId)
    return newId;
  });
}

casper.start(url);

// ログイン
casper.then(function() {
  this.fill('form#ap_signin_form', {
    email: email, 
    password: pass
  }, true);
});

// 期間を選択するプルダウンをクリック
casper.thenClick('#a-autoid-1 .a-dropdown-prompt')

// 指定の年を選択
casper.then(function(){
  var id = this.evaluate(function(targetYear){
    var liList = document.getElementById('1_dropdown_combobox').getElementsByTagName('li');
    for (var i = 0; i < liList.length; i++){
      var li = liList[i];
      var a = li.childNodes[0];
      if (a.innerHTML.trim() == targetYear){
        return a.id;
      }
    }
  }, targetYear);
  if (! id){
    throw 'no such year ' + targetYear;
  }
  casper.thenClick('#' + id);
});

// 詳細画面へのリンク一覧を取得
function first(){
  debugger;
  detailIdIndex = 0
  loop.call(this);
}

// 詳細画面へ遷移し、csv 情報を取得
function loop(){
  detailIdList = this.evaluate(setEidToDetail);
  if (detailIdIndex < detailIdList.length){
    var eId = detailIdList[detailIdIndex++]
    this.thenClick('#' + eId);
    casper.then(function(){
      var datas = this.evaluate(function (){
        function scrapeDetailNormal(){
          // 注文日
          var date = document.getElementsByClassName('order-date-invoice-item')[0].childNodes[0].textContent.replace(/注文日/, '').trim();
          // 注文番号
          var order = document.getElementsByClassName('order-date-invoice-item')[1].childNodes[0].textContent.replace(/注文番号/, '').trim();
          var items = document.querySelectorAll('.a-fixed-left-grid');
          var result = [];
          for (var i = 0; i < items.length; i++){
            var item = items[i];
            item.getElementsByClassName('a-row').childNode
            // 商品名
            var name = item.getElementsByClassName('a-row')[0].getElementsByTagName('a')[0].innerHTML.trim()
            // 金額
            var price = item.getElementsByClassName('a-color-price')[0].innerHTML.trim()
            // 販売
            var shopEl = item.getElementsByClassName('a-color-secondary')[0]
            var shopAEl = shopEl.getElementsByTagName('a');
            if (0 < shopAEl.length){
              var shop = shopAEl[0].innerHTML;
            }else{
              var shop = shopEl.innerHTML;
            }
            shop = shop.replace(/販売:/, '').trim()
            result.push({
              date:date, order:order, name:name, price:price, shop:shop
            });
          }
          return result;
        }
        if (0 < document.getElementsByTagName('h1').length){
          return scrapeDetailNormal();
        }else{
          // TODO 電子書籍は難しい
          return [];
        }
      });
      csvDatas = csvDatas.concat(datas);
    });
    casper.then(function(){
      casper.back();
    });
    casper.then(function(){
      loop.call(this);
    });
  }else{
    last.call(this);
  }
}

// 次のページがあれば遷移してループを続ける
function last(){
  var nextId = this.evaluate(function(){
    var lastEls = document.getElementsByClassName('a-last')[0].getElementsByTagName('a');
    if (0 < lastEls.length){
      var a = lastEls[0];
      if (0 < a.className.indexOf('disabled')){
        return;
      }
      var id = 'go-to-next-page';
      a.setAttribute('id', id);
      return id;
    }
  });
  this.then(function(){
    debugger;
    if (nextId){
      this.thenClick('#' + nextId, function(){
        first.call(this);
      });
    }else{
      var csv = [];
      for (var i = 0; i < csvDatas.length; i++){
        var data = csvDatas[i];
        if (! data){
          continue;
        }
        var list = [];
        list.push(data.date);
        list.push(data.order);
        list.push(data.shop);
        list.push(data.name);
        list.push(data.price);
        for (var j = 0; j < list.length; j++){
          list[j] = '"' + list[j].replace(/"/g, '""') + '"';
        }
        var line = list.join(',');
        csv.push(line);
      }
      for (var i = 0; i < csv.length; i++){
        this.echo(csv[i]);
      }
    }    
  });
}

// ループ開始
casper.then(function() {
  first.call(this);
});

casper.run();

ここまで
※電子書籍の購入履歴は取得できません
※数量の取得もできません

本日 2014/2/19 時点では動くが、いつかデザインが変わったら動かなくなると思う。
お約束ではありますが、試される方は全て自己責任でお願いします。

2015年2月18日水曜日

raspberry pi 2 来た!





箱がかわいらしい。

2015年2月17日火曜日

raspberry pi 2 発送された!

2/5 にRS コンポーネンツに発注して、2/16 に出荷のメールが送られてきた。もうすぐだ。

2015年2月15日日曜日

ドスパラ Lightning ケーブル 222円(税抜き)激安!

ドスパラのお店を駅前に見つけたのでふらっと入って、表題のものを買ってみた。
iPhone5 version8.1.3 で問題なく動く。ラッキー!

近未来デザインのタッチ式ガラスキーボード

2015年2月11日水曜日

お金より人柄

Industry, thrift and self-control are not sought because they create wealth, but because they create character.
Calvin Coolidge (30th U.S. president, 1872-1933)
勤勉、倹約、自制はそれらが富を作るから求められるのではない。人柄をつくるからだ。

NHK 実践ビジネス英語 より

raspberry pi 2

CPU が 6倍らしい。
正確には、クロック周波数が1.5倍でコアが4つ。(いままで1つ)
あと、windows 10 も動くようだ。
windows は遅そうだけど、多くの人は Linux のサーバー管理に慣れていないだろうから良いかも。

http://www.raspberrypi.org/products/raspberry-pi-2-model-b/