2015年11月1日日曜日

パン田一郎 〔LINE ID: @froma〕

人口知能で会話しているそうだ。かわいい。

2015年5月19日火曜日

handsontable があればExcel 風web システムができる

handsontable は機能が豊富で、これだけあれば業務で使うエクセルを置き換えられると思う。エクセルアップロードとダウンロードを繰り返すばかりの業務システムを開発しているエンジニアのる方は、これを使って提案してみてはどうだろうか。

2015年4月18日土曜日

opendns こんなのあるのね

DNS サーバーって大抵インターネット接続会社や、街中のWiFi 提供場所で指定されたものを使用するものと思っていた。

opendns


外出先で、DNS 接続だけ調子が悪いときに、有効だ。(あまりないがたまにある)
あと、こちらを利用すれば、DNS の利用履歴を盗み見られずに済む。
正直DNS 履歴にはかなりの個人情報が入っているので、気になる人は利用すると良いかも。
アダルトコンテンツへのフィルターも提供してくれるようだ。

2015年4月4日土曜日

東日本旅客鉄道株式会社 素敵

車内で財布を無くしたが、次の日東日本旅客鉄道株式会社 から預かっていると連絡いただく。
取りに行くと、1円も無くなることなく落とした時のそのままの状態で返してもらえた。
東日本旅客鉄道株式会社 さん、本当にありがとうございます。

ビットコインはどのようにして動いているのか?

http://www.amazon.co.jp/dp/B00IZGMCFC/ref=pe_492632_166382082_TE_M1T1DP

大西哲之さんのKindle book。とても分かりやすかった。
Bitcoin のアルゴリズムを用いて、国家監視を不要なものとできる可能性がある。
近未来に起こりそうな話に胸が熱くなった。

2015年3月30日月曜日

rasbian /etc 配下を更新できない

ネットワークが不安定なので構成を見直していたら気付いた。

IP アドレスを変更しても再起動すると戻ってしまうのだ。

さらに、/etc/hosts を変更してたり、新たなファイル /etc/hoge を作成したりしても再起動後に戻ってしまうのだ。

戻ると言っでも初期状態ではなく、3週間前頃に設定した内容となる。

/var/log/messages を丁寧に見たが私には手がかりが見つけられない。

仕方ないのでOS インストールからやり直そう。

因みにOS をインストールしたのは2015/2 頃。

理由が分からなくてモヤモヤした気分。。。

追記 (2015/5/9)
SD カードの問題だった。書き込みを受け付けなくなってしまっていた。OS は関係ないですね。

2015年3月27日金曜日

bitcoin 本家のソースをコンパイルした

こちらに分かりやすい手順があるのでそれに従う。

まずは、依存関係のインストール。


sudo apt-get update
sudo apt-get upgrade
sudo apt-get -f install
sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libqrencode-dev


ソースを適当な場所へgithub からコピー(クローン)


cd ~
git clone git://github.com/bitcoin/bitcoin.git




このままmake すると、wallet に必要なBerkleyDB が無いので怒られる。BerkleyDB は Oracle社の AGPLv3 ライセンスなので、apt-get でインストールできない。さらに、最新版v5.1 はサポートされていないので、v4.8 を使用しなければならない。それらが考慮された本家の手順書ページに書いてあるスクリプトを使用してBerkleyDB ダウンロードする。




cd ~/bitcoin
vi myinstall.sh

以下のコードを張り付け
------------------ ここから ------------------
BITCOIN_ROOT=$(pwd)

# Pick some path to install BDB to, here we create a directory within the bitcoin directory
BDB_PREFIX="${BITCOIN_ROOT}/db4"
mkdir -p $BDB_PREFIX

# Fetch the source and verify that it is not tampered with
wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
echo '12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef  db-4.8.30.NC.tar.gz' | sha256sum -c
# -> db-4.8.30.NC.tar.gz: OK
tar -xzvf db-4.8.30.NC.tar.gz

# Build the library and install to our prefix
cd db-4.8.30.NC/build_unix/
#  Note: Do a static build so that it can be embedded into the executable, instead of having to find a .so at runtime
../dist/configure --enable-cxx --disable-shared --with-pic --prefix=$BDB_PREFIX
make install

# Configure Bitcoin Core to use our own-built instance of BDB
cd $BITCOIN_ROOT
./configure LDFLAGS="-L${BDB_PREFIX}/lib/" CPPFLAGS="-I${BDB_PREFIX}/include/"
------------------ ここまで ------------------

chmod 744 myinstall.sh


※補足 最終行から (other args...) を削除してある

いよいよコンパイル。




./autogen.sh
./myinstall.sh
make
make install



make は130分かかった。(on raspberry pi 2)


そして実行!




cd /usr/local/bin
./bitcoin-qt



こんな画面が出てくる。






自分はなぜか、起動時に qt や x11 関連のエラーが出てしまった。
x11-apps を入れて、xclock が表示されることを確認したり、再起動をしているうちにいつの間にか直った。


sudo apt-get install x11-apps



コンパイルすると勉強になるなぁ。

2015年3月25日水曜日

Bitcoin wallet っていろいろあるのね

Bitcoin wallet は大きく分けて、ウェブサービス上に保存するタイプと個人マシン上に保存するタイプがある様だ。

ウェブサービスの方が便利だが、サービス会社に何かがあった時は損失を被るかもしれない。Mt.Gox 社の事件の様に。

個人マシン管理は良くも悪くも自己責任。
お金は暗号化されたファイルになるので、自分でそのファイルを守らなければならない。
お金が入ったマシンをインターネットに接続すると第三者の不正侵入などにより持ち出されてしまう危険性がある。それを防ぐには、オフラインのマシンを用意して、少額ずつオンラインのマシンに移すことがお勧めされている。
もちろん、そういうことをすると利便性とトレードオフだ。
Android の携帯なら、アプリで管理できるらしいので便利かも。
他にはraspberry pi で管理するキットを売っているところもあった。

まあ、私は大したお金も持っていないし、勉強の目的もあるのでオンラインのraspberry pi 上に保存する方式でやってみるつもりだ。

2015年3月20日金曜日

USB Bitcoin miner 来た

ブームは去ったが BitCoin を採掘したいので、Amazon で購入した。3,500円程。


マニュアル類は全く付いてこなかったので、検索を駆使してセットアップすることになる。
こちらの記事によると、次の5 つが必要とのこと。

(1) プールアカウント
(2) BitCoin wallet
(3) Raspberry Pi
(4) Rspbian OS 入り SD card 
(5) USB BitCoin miner

(3) - (5) は手元に準備できたので、(1) と (2) が必要だ。
(1) のプールアカウントとは、BitCoin の採掘には数百万回の計算が必要で一人で頑張っても難しいからみんなで頑張って報酬を分け合う仕組みだそうだ。

さて、やってみよう。どうなることやら。

2015年3月18日水曜日

人は理由付けが大好き

先日の James さんの記事が面白かった。

コピー機の順番を列に並んで待っている人に、無垢なふりをして割り込みさせてくれと言ってみるテスト。

その時の言い方は次の通り。

(1)
すみません、5ページあるのでコピー機使わせて下さい。

(2)
すみません、5ページあるのでコピー機使わせて下さい。急いでいるのです。

(3)
すみません、5ページあるのでコピー機使わせて下さい。コピーしなけえばならないのです。


普通に考えると、(3) は効果的でないと思われる。
理由になっていない。


結果は、

(1) 60%
(2) 94%
(3) 93%

の人が割り込みさせてくれた。


なぜか。

それは、(2) と (3) は理由が付いているから。
人は理由が大好き。
それが合理的かどうかは関係ない。


なので、誰かに何かを頼むときは理由を付けると良い。

自分の行動にも合理的であれ非合理的であれ、正当化する理由を付けるものだと覚えておくと良い。

生活の中で自分が使った理由を溜めておくと、驚くことになるそうです。試してみよう。

2015年3月16日月曜日

LUKS 簡単そうだ

こちらにとても良い紹介記事がある。

暗号化をかけてマウントすればOK の様だ。

やってみよう。

rasberry pi 3歳の誕生日会

こちらの記事によると raspbery pi 3歳の誕生日会が催されたそうだ。

そこで紹介されている創始者 Eben Upton さんの言葉は、「もっとたくさんの女の子にコーディングを勉強してほしいと誰もが思っていますが、じつは男の子の場合もたった5パーセントだけです。端数を切り捨てたらゼロです」とある。
改めて raspberry pi は単なるオタクのおもちゃではなく子供の教育を目的として作られたデバイスなのだと認識した。
pi と似たデバイスは世の中にたくさんあるが、設計思想や背後にある哲学がしっかりしている点が他に類を見ないのではないだろうか。

2015年3月14日土曜日

使っていないコードは消してね

今日は影響調査に結構な時間を使ってしまった。土曜日なので教えてくれる人がいなかったので自力で調べたところ、どう考えても使っていないという結論だった。

非生産的な時間を過ごしてしまい残念だ。〆切が近くて時間無いのに。

もちろん同じ事を他の人が繰り返さない為に今回消してやるつもりだが、テストコードも無いので神経を使う。
これでトラブルを起こしたら、頼んでもない事をやって何しているんだと、言われてしまうだろう。

そう考えると弱気になりがちだが、ここは頑張らなければならないと思う。

2015年3月13日金曜日

やっぱり TrueCrypt はやめたほうが良いかも

先日、TrueCrypt 7.1a (最終バージョン)は改ざんの余地がないので返って安全だとの記事を読んだのが気になって、もう少し調べてみた。

それで、StackExchange に同じ質問をしている人を見つけた。

そちらによると、

・現在、安全かどうかは分からない
・開発者が開発しない限り、将来問題が見つかった際に対応されない
・であれば別の手段を検討したほうが良い

という結論だ。

まあ、当たり前と言われればそうですね。
アクティブに活動を続けられないとオープンソースでも使ってもらい続けることは難しいのだな。

2015年3月12日木曜日

raspberry pi 2 マルチコアのお陰でデスクトップが快適

pi のデスクトップは 1 より 2 が断然快適だ。
10 年ぐらい前に自分が持っていたパソコンでインターネットをやっていた頃と同じような感覚だ。
もっとデスクトップを活用しよう。

2015年3月11日水曜日

raspberry pi 2 で YouTube が見える

iceweasel (firefox と同じらしい)を使うと簡単に見れる。

iceweasel のインストールはこちら。

sudo apt-get install iceweasel


あとは、add-on を入れる。
検索ワード「flash」でたくさん出てくる。私はこちらを入れてみた。



 ちゃんと動く。すごい。



私は raspberry pi にディスプレイとキーボードを繋げず、全てリモートデスクトップ(VNC)で作業している。なので、実際には音が出ているかは確認できていない。(多分大丈夫と思う)

2015年3月10日火曜日

片手キーボード

http://gigazine.net/news/20141123-twiddler-3/

使ってみたいなぁ

2015年3月9日月曜日

秘密のファイルを保持するには TrueCrypt ?

TrueCrypt はどのOS でも動く素晴らしいアプリだが、wikipedia によると開発者が興味を失ってしまい現在は開発されていないとのこと。
だが、開発者のページによるとは、2012 から少なくとも27 か月(記事執筆時点)は致命的な問題は見つかっていない。しかも、ソースは分かりやすく完全な形だそう。
最終バージョンの、7.1a を使う限り改ざんの心配がなく返って安全との記載もある。
本当のところはどうなのだろうか。
代替手段として、FileVault(Mac OS X), LUKS(Linux), BitLocker(Windows) がこちらでは紹介されている。

2015年3月8日日曜日

NAS がマウントできなくなった

raspberry pi 2  からNAS をマウントするとエラーが。
raspberry pi 1 では動くのに。
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

調べてみたら、オプションを追加すれば直るようだ。
sec=ntlm

これを入れると自分の場合は、/etc/fstab が次のようになった。

//192.168.xxx.yyy/somedir /mnt/mountpoint cifs guest,noperm,rw,iocharset=utf8,sec=ntlm 0 0

これでマウント(mount -a) が通るようになった。

2015年3月7日土曜日

Tor Browser 入れてみた

Tor とは、ルーターをたくさん経由させることで、アクセス元のアドレスが分からないようにするアプリだそうだ。
しかも、1分程度で別のルーターに切り替えるので使い続けても同じアクセス元である事が分からないという優れもの。
もともと米軍のために開発されたもので、あのスノーデン氏もお勧めしていている。

Tor を使った TorBrowser というのがあり、試してみたが遅いことを除けば問題なさそう。
遅いのはネットワークの負荷が高まるのでやむを得ない。
まあ、実際のところ私には匿名性なんてあまり必要ないが。。。

The Onion Router とはうまい表現だな。玉ねぎのようにむいてもむいても中身が無い様子がルーターを辿っても辿っても実体にたどり着けない様子を想像させる。

2015年3月5日木曜日

Java の DI コンテナは Google Guice か Spring か

Spring は便利だが jar が大きくなり過ぎているように思えたので他のDI コンテナを探してみた。
Google Guice が軽量で扱いやすそうなので、乗り換えを試みた。

が、Spring で一番気に入っている機能のAutowire に相当する機能が無い。
インジェクション対象を個別に登録する必要があるのだ。
Spring に慣れてしまった私にはそれは残念すぎる。
結局Spring に戻ることにした。

2015年3月3日火曜日

Raspberry Pi バッテリーパック

PiJuiceは、Raspberry Piにパワーと自由を与えるバッテリーパック

これさえあればいつでも手元にサーバーを。。。

津田さんのこの回答が好き

■Q2 私はある精神疾患を患っており、長年精神科に通院しております。カウンセリングも受けています。先日、そのカウンセリング中に、「どうして私はこんなに自己肯定感が低いのだろうか?」「どうして私はこんなに自分に自信がないのだろうか?」という自身の“人生の課題”に気づきました。どうしたら自分自身に自信がもてるようになると思いますか?
□A2 僕自身もあまり自身や自己肯定感には薄い人生を歩んできました。学校の勉強やスポーツで一番を取った経験などはないですし、大学も一浪して入学、留年も一年してますし、就職活動も失敗しました。何とかライターの世界に入っていろいろな同年代のすごい人を取材していると、自分はなんてちっぽけな存在なんだと思わされることばかりでした。そんななか、なぜいまのようなことができているのかといえば、仕事として同じことを繰り返してこれたということなんだと思います。優れた人と比較したときに自分は決して敵わないけど、その人が優れているとほかの人に伝えることはできる。それは、劣っている自分が優れた人に貢献できる、自分にしかできないことじゃないかと。ある時期からそう思うようになり、そこから気が楽になったような気がします。どんなことでも長く続けられたこと、続けたことは自分の血や骨になっている。それはたいてい後から気づくものなんですよね。だからまずは1年でもいいから通して続けられる、好きなことを見つけてそれを続けてみるというのが、自信を持つための第一歩になるんじゃないかと思います。「ほかのことでは議論とかできないけど、自分が思い入れのあるこのことについてだけでは何かきちんと自信を持って意見を言える」というポイントを見つけることができれば、それがどんどん横に広がっていって、自分自身の肯定感につながっていくと思います。焦らず頑張ってください。
津田マガ 2015.2.6(vol.153)より

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/

2015年1月27日火曜日

Oracle 大量データ修正はSQLLoader

600万件のデータ修正を update 文で実行すると8 時間かかった。
delete & insert にしてもほぼ同じ。
CSV を吐き出してから、SQL Loader ならば2時間で取り込みまで完了する。
CSV 作るのが若干手間だが、初めからこうすればよかった。

2015年1月25日日曜日

Java で zip ファイル作成

以外と悩んだので、参考になったサイトのリンクを残す。

http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure
java.net.URI の relativize() を上手く使って非常にわかりやすいコードになっている。勉強になります。


http://oshiete.goo.ne.jp/qa/5157299.html
日本語の記事ではこちらの記事が良かった。

2015年1月4日日曜日

Yahoo User Interface 2 Tree View 不用意にハッシュが消えてしまう事象の回避

お客さんの要望により、Javascript でツリーを表示を開発する。
いろいろなツリー表示のライブラリがあるが、自分が一番気に入っているのは、Yahoo User Interface 2 の Tree View だ。
YUI2 は開発停止しているものの、API が使いやすくて素晴らしいライブラリだと思う。


で、1つだけ問題が。
赤いところをクリックすると、アドレスバーのハッシュが消えてしまうのだ。


理由は、赤いところのタグがこうなっているから。

<a href="#" class="ygtvspacer"> </a>


この問題を回避するには、次のようにHTMLNode を継承すると良い。


var NewHtmlNode = function(oData, oParent, expanded, hasIcon) {
    if (oData) {
        this.init(oData, oParent, expanded);
        this.initContent(oData, hasIcon);
    }
};
//YUI2.9.0
YAHOO.lang.extend(NewHtmlNode, YAHOO.widget.HTMLNode, {
getNodeHtml:function(){
    var sb = [];

    sb[sb.length] = '<table id="ygtvtableel' + this.index + '" border="0" cellpadding="0" cellspacing="0" class="ygtvtable ygtvdepth' + this.depth;
    sb[sb.length] = ' ygtv-' + (this.expanded?'expanded':'collapsed');
    if (this.enableHighlight) {
        sb[sb.length] = ' ygtv-highlight' + this.highlightState;
    }
    if (this.className) {
        sb[sb.length] = ' ' + this.className;
    }
    sb[sb.length] = '"><tr class="ygtvrow">';

    for (var i=0;i<this.depth;++i) {
        sb[sb.length] = '<td class="ygtvcell ' + this.getDepthStyle(i) + '"><div class="ygtvspacer"></div></td>';
    }

    if (this.hasIcon) {
        sb[sb.length] = '<td id="' + this.getToggleElId();
        sb[sb.length] = '" class="ygtvcell ';
        sb[sb.length] = this.getStyle() ;
//修正ここから
//        sb[sb.length] = '"><a href="#" class="ygtvspacer">&#160;</a></td>';
        sb[sb.length] = '"><a class="ygtvspacer"> </a></td>';
//修正ここまで
    }

    sb[sb.length] = '<td id="' + this.contentElId;
    sb[sb.length] = '" class="ygtvcell ';
    sb[sb.length] = this.contentStyle  + ' ygtvcontent" ';
    sb[sb.length] = (this.nowrap) ? ' nowrap="nowrap" ' : '';
    sb[sb.length] = ' >';
    sb[sb.length] = this.getContentHtml();
    sb[sb.length] = '</td></tr></table>';

    return sb.join("");
}});


私が現在手がけているシステムは、jQuery History と連携させているのでハッシュが無くなると非常に困る。
もはや時代遅れと思うが、もしかしたら誰かの役に立つかもしれないので、記載しておきます。