<![CDATA[Aimed At An Agile Programer]]>http://a4p.me/Ghost 0.11Fri, 08 Sep 2017 10:47:18 GMT60<![CDATA[Chrome56 で Cookie の取り扱いが微妙に変わった件]]>Chrome56 で Cookie の取り扱いが微妙に変わったので簡単にメモ。
Windows+Chrome56 と Chromebook+Chrome55 で比較。あとでより詳細まで検証する予定。

Chrome55 の挙動

  • サーバサイドでセキュア属性を付与しない限り、セキュア属性はつかない

Chrome56 の挙動

  • サーバサイドでセキュア属性を付与していなくても、HTTPS で発行した Cookie にはセキュア属性が付与される。
  • HTTP/HTTPS で同じ Cookie を利用していた場合、1度でも HTTPS で Cookie を更新すると以降 HTTP では該当の Cookie に触れなくなる

どんな不具合が起こるか

  • HTTP/HTTPS で Cookie を共有していると死ぬ
  • ログインページとかネット広告とかで影響がありそう

とりあえずここまで。

]]>
http://a4p.me/chrome56-cookie/6c190e13-68d7-46ec-aced-73980f9b75b7Thu, 09 Feb 2017 02:12:21 GMTChrome56 で Cookie の取り扱いが微妙に変わったので簡単にメモ。
Windows+Chrome56 と Chromebook+Chrome55 で比較。あとでより詳細まで検証する予定。

Chrome55 の挙動

  • サーバサイドでセキュア属性を付与しない限り、セキュア属性はつかない

Chrome56 の挙動

  • サーバサイドでセキュア属性を付与していなくても、HTTPS で発行した Cookie にはセキュア属性が付与される。
  • HTTP/HTTPS で同じ Cookie を利用していた場合、1度でも HTTPS で Cookie を更新すると以降 HTTP では該当の Cookie に触れなくなる

どんな不具合が起こるか

  • HTTP/HTTPS で Cookie を共有していると死ぬ
  • ログインページとかネット広告とかで影響がありそう

とりあえずここまで。

]]>
<![CDATA[bash の関数で exit したときの挙動が呼び出し方によって変わる件]]>bash の関数で exit した場合、呼び出し元に戻ることなくプロセスが終了すると思っていたけど、どうやら呼び出し方によって挙動が変わるみたい。

1

まずこちらのコード。関数abc で exit しているので、Hello は出力されません。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc

echo "Hello."  

実行結果

$ sh sample.sh
123  

2

次にこれ。関数abc の標準出力をパイプで別のコマンドに渡しています。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc | grep 1

echo "Hello."  

パイプで渡される前に exit を通るので、

]]>
http://a4p.me/bash-exit/cdd438ca-48ac-482d-b4fc-85655a16aed9Wed, 18 May 2016 10:09:06 GMTbash の関数で exit した場合、呼び出し元に戻ることなくプロセスが終了すると思っていたけど、どうやら呼び出し方によって挙動が変わるみたい。

1

まずこちらのコード。関数abc で exit しているので、Hello は出力されません。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc

echo "Hello."  

実行結果

$ sh sample.sh
123  

2

次にこれ。関数abc の標準出力をパイプで別のコマンドに渡しています。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc | grep 1

echo "Hello."  

パイプで渡される前に exit を通るので、Hello されないことを期待。

実行結果

$ sh sample.sh
123  
Hello.  

期待を裏切られる。

3

じゃぁ変数に代入したらどうなるんだろう?と思って試してみた。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

a=`abc`

echo "Hello."  

実行結果

$ sh sample.sh
Hello.  

Hello された。


というわけで、関数の中で exit するときは exit されることを常に期待してはいけないようです。。 ちなみに、呼び出し元に返り値を返したいときは return を使いましょう。

]]>
<![CDATA[A8netがエンジニア採用で事実上の入社祝い金制度を導入しましたよ]]>国内最大級のアフィリエイト広告サービス「A8.net」が、成果報酬50万円で自社エンジニアの募集を開始

仕組みとしては、A8.net の広告プログラム上で求人を出していて、採用に至ったら成果報酬50万円というものなんですが、A8.net にはセルフバックという 広告掲載者本人が申し込みをして報酬を受け取れる 機能があり、この求人広告もセルフバックの対象になっているため、事実上の入社祝い金制度 になっています。

もちろんセルフバックを利用するためには A8.net の会員になる必要があります。このエントリでは A8.net の会員になってセルフバックを利用するまでの流れをご紹介します。

会員登録に必要なもの

会員登録に必要なものは以下になります。

  • メールアドレス
  • 銀行口座
  • ウェブサイト

ウェブサイトについては会員登録時に A8.net が運営しているブログを立ち上げることもできるため、なくても大丈夫です。 銀行口座は成果報酬の振込に使われます。会員登録時に入力しなければならないため、事前に手元に用意しておきましょう。

会員登録

A8.net にアクセスして、ステップ通りに進めていきます。
途中でウェブサイトの入力が求められますが、ウェブサイトを持っていない方は「サイトをお持ちでない方」を選びましょう。A8.net

]]>
http://a4p.me/a8-net-engineer-recruit/e391c31d-31c7-430e-b5c7-759c01f09d1dWed, 06 Apr 2016 12:36:36 GMT国内最大級のアフィリエイト広告サービス「A8.net」が、成果報酬50万円で自社エンジニアの募集を開始

仕組みとしては、A8.net の広告プログラム上で求人を出していて、採用に至ったら成果報酬50万円というものなんですが、A8.net にはセルフバックという 広告掲載者本人が申し込みをして報酬を受け取れる 機能があり、この求人広告もセルフバックの対象になっているため、事実上の入社祝い金制度 になっています。

もちろんセルフバックを利用するためには A8.net の会員になる必要があります。このエントリでは A8.net の会員になってセルフバックを利用するまでの流れをご紹介します。

会員登録に必要なもの

会員登録に必要なものは以下になります。

  • メールアドレス
  • 銀行口座
  • ウェブサイト

ウェブサイトについては会員登録時に A8.net が運営しているブログを立ち上げることもできるため、なくても大丈夫です。 銀行口座は成果報酬の振込に使われます。会員登録時に入力しなければならないため、事前に手元に用意しておきましょう。

会員登録

A8.net にアクセスして、ステップ通りに進めていきます。
途中でウェブサイトの入力が求められますが、ウェブサイトを持っていない方は「サイトをお持ちでない方」を選びましょう。A8.net が運営するブログの開設に進みます。

セルフバックのページを開く

会員登録が済んだら A8.net にログインし、右上にあるセルフバックのリンクをクリックします。

A8.net のエンジニア募集プログラムを探す

キーワードに エンジニア募集 と入力して検索すると出てきます。

「詳細を見る」 から 「セルフバックを行う」 をクリックします。

求人ページからエントリーする

Webアプリケーションエンジニアとインフラエンジニアの2職種で募集をしています。どちらもエントリーには氏名・生年月日・現住所(都道府県まで)・メールアドレス・自己PRのみで応募できるようになっています。


ここまでやれば成果報酬が発生します。翌日以降にメニューのレポートから確認できるはずです。(実際に成果報酬が確定されるのは入社後3ヶ月の試用期間終了後になります)

A8.net のセルフバックにはこれ以外にも、食品や生活用品など普段の暮らしの中で使えるものもあるので、上手く使えばお小遣いくらいは稼げます。この機会に A8.net に登録してみてはいかがでしょうか。



]]>
<![CDATA[プログラマのためのコミュニケーション入門]]>社内LTで話したネタ。

プログラマはコミュニケーションが苦手という人が割と多いと思いますが、仕事を円滑に進めていく上で必要となるコミュニケーションのポイントをまとめました。

Level.0 知らないことを知らないと言う

知らないことを知らないと言うことは仕事を進める上で非常に大事なことなのですが、特に未熟なプログラマほどこれが出来ないケースが多いです。プログラマであっても専門分野のすべてを知っているわけではないので、知らないことがあるのは恥ずかしいことでもなんでもないんですけどね…。

Level.1 "自分が知っていること"を知らない人間を馬鹿にしない

これやられると知らないことを知らないと言えない文化が出来上がるので、こういう行為は全力で排除しないといけない。特に非プログラマのIT知識はプログラマが思うよりずっと低いのでつい馬鹿にしがち。非プログラマのステークホルダーに知ったかぶられるときのダメージは計り知れないので絶対にやってはいけない。

Level.2 相手の言葉を使う

Scala の勉強会とかでよく、「これはHaskellで言うところのxxx」的な説明をする人がいますが、その説明は最悪だよねってことです。(Scala界隈の人がネタとしてやってるのはわかってます念のためw)
(相手がHaskellerの場合はもちろん問題ないです)

非プログラマにとってはHTTPサーバもアプリケーションサーバも物理サーバも仮想サーバも等しく「サーバ」です。つまり apache をリスタートするのも電源落として入れ直すのも「サーバ再起動」です。専門用語を使いまくると「難しいこと言って煙に巻こうとしている」としか思われないので相手にわかる言葉を喋りましょう。

Level.3 厳密さより伝わることを大事にする

これはある程度技術力のあるプログラマに多い印象。 きちんと相手に説明しようとして、非常に論理的で且つ正確に説明しているんですが、扱っている問題が難しすぎて相手の理解が追いつかないケースです。

プログラマ同士であっても専門分野が違えば詳細を完全に理解するのは困難ですし、相手が非プログラマになればなおさらです。全てを理解してもらうのではなく、相手に知っておいてほしいことをまず伝えましょう。

]]>
http://a4p.me/communicationintroduction4programmers/d2c9fa23-b2eb-4f20-ac99-82b9521fbb63Sun, 28 Jun 2015 13:59:26 GMT社内LTで話したネタ。

プログラマはコミュニケーションが苦手という人が割と多いと思いますが、仕事を円滑に進めていく上で必要となるコミュニケーションのポイントをまとめました。

Level.0 知らないことを知らないと言う

知らないことを知らないと言うことは仕事を進める上で非常に大事なことなのですが、特に未熟なプログラマほどこれが出来ないケースが多いです。プログラマであっても専門分野のすべてを知っているわけではないので、知らないことがあるのは恥ずかしいことでもなんでもないんですけどね…。

Level.1 "自分が知っていること"を知らない人間を馬鹿にしない

これやられると知らないことを知らないと言えない文化が出来上がるので、こういう行為は全力で排除しないといけない。特に非プログラマのIT知識はプログラマが思うよりずっと低いのでつい馬鹿にしがち。非プログラマのステークホルダーに知ったかぶられるときのダメージは計り知れないので絶対にやってはいけない。

Level.2 相手の言葉を使う

Scala の勉強会とかでよく、「これはHaskellで言うところのxxx」的な説明をする人がいますが、その説明は最悪だよねってことです。(Scala界隈の人がネタとしてやってるのはわかってます念のためw)
(相手がHaskellerの場合はもちろん問題ないです)

非プログラマにとってはHTTPサーバもアプリケーションサーバも物理サーバも仮想サーバも等しく「サーバ」です。つまり apache をリスタートするのも電源落として入れ直すのも「サーバ再起動」です。専門用語を使いまくると「難しいこと言って煙に巻こうとしている」としか思われないので相手にわかる言葉を喋りましょう。

Level.3 厳密さより伝わることを大事にする

これはある程度技術力のあるプログラマに多い印象。 きちんと相手に説明しようとして、非常に論理的で且つ正確に説明しているんですが、扱っている問題が難しすぎて相手の理解が追いつかないケースです。

プログラマ同士であっても専門分野が違えば詳細を完全に理解するのは困難ですし、相手が非プログラマになればなおさらです。全てを理解してもらうのではなく、相手に知っておいてほしいことをまず伝えましょう。

Level.4 ポジティブにできないと言う

プログラマであれば日々無理なことを要求されていると思いますが、無理なことを無理と言うだけだと「あいつはやる気がない」というレッテルを貼られて非常に仕事しづらい状況になります。 とはいえ無理なものは無理なので、無理なときは妥協案を提案するのが良いです。

ちなみに体育会系相手であれば、「がんばります」が汎用性高くて良いです。彼らはやる前から無理って言う人間は大嫌いですが、がんばった結果無理だったら責めないので。

Level.5 なるべく相手の近くで話す

コミュニケーションの基本はやはり対面です。プログラマはみんなチャットツールやメールが大好きだと思いますが、特に自分が何かしらの失敗をしたときは対面でコミュニケーションした方がいいです。物理的に対面が無理なら電話や音声チャットを使いましょう。

仕事がうまくいってるときはチャットでさらっとで問題ないですが、下手こいたときは対面で何が起こっているのかをきちんと共有しましょう。人間は弱みを見せる人を信頼するので、失敗したときに対面コミュニケーションをとっていると自然と信頼が集まります。信頼されていると自分の意見が通りやすかったり、いろいろと仕事が進めやすくなります。

「今対面コミュニケーションはハードル高いな」と思ったときが対面コミュニケーションのタイミングです。チャットに逃げちゃダメ。

さいごに

一番大事なことは敬意を払うことです。コンピュータは100%自分の言うことを聞いてくれますが、人間はほとんど言うことを聞いてくれません。僕らプログラマはコンピュータ相手に慣れきっているので、人間相手のコミュニケーションを忘れがちになります。相手への敬意を忘れないようにしましょう。

]]>
<![CDATA[組織のパフォーマンスを最大化する]]>マネージメント層の人たちは常日頃からどうやったらチームのパフォーマンスが上げられるか考えていると思います。

トランザクティブ・メモリー

トランザクティブ・メモリーとは組織学習に関する概念で、ざっくり言うと、「全員が同じことを知っていること」よりも「"誰が何を知っているか"を知っていること」が重要ですよ、という話です。

トランザクティブ・メモリーが有効に働いている場合というのは、チームのメンバーの誰もが、"誰が何を知っているか"を知っている状態になるため、暗黙的に適切な役割分担が行えます。いわゆる「阿吽の呼吸」というやつです。

システム開発の仕事には非常に多岐にわたるスキルが必要で、且つ状況が常に変わります。「今のこの状況で各々のスキルを踏まえた上で最適な布陣を敷く」というのはそう簡単なことではありません。特にマネージメント層の人間は最前線のエンジニアに技術面では敵わないため、技術領域の役割分担はエンジニア同士で行った方がうまくいくはずです。

トランザクティブ・メモリーを有効化する方法

トランザクティブ・メモリーというのは日々のコミュニケーションの中で自然に形成されるものです。

つまり、飲みニュケーションやタバコ部屋が大事ってことになってしまうのですが、仕事で必要なコミュニケーションは業務時間にincludeするべきです。

雑談を促進する

雑談を禁止している職場はさすがに少数派だと思いますが、積極的に雑談しましょうっていうのもなかなか難しいのではないでしょうか。僕のチームでは雑談を促進するために以下の2つを行っています。

  • おやつミーティング
  • 朝会LT

おやつミーティング

チームで行っている週次のミーティングではおやつの持ち込み可としています。傍目には仕事してる感が全くなくなるのがネックですが、単に雑談が促進されるだけでなく、普通のミーティングと比較してメンバーからの意見も出やすくなるため非常におすすめです。

朝会LT

朝会の最後に毎日1人ずつ、

]]>
http://a4p.me/transactive-memory/1b644a5d-71f8-4ec3-9b63-b51c2bf74b13Mon, 29 Dec 2014 08:32:36 GMTマネージメント層の人たちは常日頃からどうやったらチームのパフォーマンスが上げられるか考えていると思います。

トランザクティブ・メモリー

トランザクティブ・メモリーとは組織学習に関する概念で、ざっくり言うと、「全員が同じことを知っていること」よりも「"誰が何を知っているか"を知っていること」が重要ですよ、という話です。

トランザクティブ・メモリーが有効に働いている場合というのは、チームのメンバーの誰もが、"誰が何を知っているか"を知っている状態になるため、暗黙的に適切な役割分担が行えます。いわゆる「阿吽の呼吸」というやつです。

システム開発の仕事には非常に多岐にわたるスキルが必要で、且つ状況が常に変わります。「今のこの状況で各々のスキルを踏まえた上で最適な布陣を敷く」というのはそう簡単なことではありません。特にマネージメント層の人間は最前線のエンジニアに技術面では敵わないため、技術領域の役割分担はエンジニア同士で行った方がうまくいくはずです。

トランザクティブ・メモリーを有効化する方法

トランザクティブ・メモリーというのは日々のコミュニケーションの中で自然に形成されるものです。

つまり、飲みニュケーションやタバコ部屋が大事ってことになってしまうのですが、仕事で必要なコミュニケーションは業務時間にincludeするべきです。

雑談を促進する

雑談を禁止している職場はさすがに少数派だと思いますが、積極的に雑談しましょうっていうのもなかなか難しいのではないでしょうか。僕のチームでは雑談を促進するために以下の2つを行っています。

  • おやつミーティング
  • 朝会LT

おやつミーティング

チームで行っている週次のミーティングではおやつの持ち込み可としています。傍目には仕事してる感が全くなくなるのがネックですが、単に雑談が促進されるだけでなく、普通のミーティングと比較してメンバーからの意見も出やすくなるため非常におすすめです。

朝会LT

朝会の最後に毎日1人ずつ、予め決められたテーマでLTをします。僕のチームは現在6人なので、1週間で5人喋ったあと良かったLTを投票して1位の人が勝ち抜けし、次週のテーマを決めるという形にしています。

ここでポイントなのが、LTのテーマが仕事とほとんど関係のないことだということです。具体例を挙げると、

  • コンビニで買えるおすすめスイーツ
  • 子供の頃影響を受けたマンガ・アニメの紹介

とかですね。他にもいろいろあったはずなんですが、どうでもよすぎるテーマで全く思い出せない…。

注意点

トランザクティブ・メモリーが有効になっていない人同士の場合には、外部から役割分担をきっちり決めてあげた方がパフォーマンスがよくなります。新しいメンバーがチームに入った場合には、「君はXXXの人」と決めてあげた方がいいでしょう。

まとめ

  • 雑談してトランザクティブ・メモリーを形成しよう!
  • トランザクティブ・メモリーが形成されないうちは役割分担を決めよう!
]]>
<![CDATA[GitHub を yum リポジトリにする]]>弊社のロックファイル処理がクソ過ぎてロックファイルを制御するスクリプトを作ったのですが、なかなか使ってもらえてないので、GitHub を使って yum でインストールできるようにしたまとめ。

必要なものをインストールする

yum install rpm-build  
yum install yum-utils  
yum install rpmdevtools  
yum install createrepo  

rpm を作る

rpmdev-setuptree$HOME/rpmbuild を作り、その中の $HOME/rpmbuild/SPECS に SPEC ファイルを作ります。

SPECファイル作成

$HOME/rpmbuild/SPECS/lockfile.spec を作ります。今回はただのシェルスクリプトなのでコピーするだけ。

Name: lockfile  
Version: 1.0  
Release: 0  
Group: Utilities
]]>
http://a4p.me/lockfile-rpm/14dea0a2-a4b5-4723-bd20-c2daef500fd6Tue, 04 Nov 2014 01:38:37 GMT弊社のロックファイル処理がクソ過ぎてロックファイルを制御するスクリプトを作ったのですが、なかなか使ってもらえてないので、GitHub を使って yum でインストールできるようにしたまとめ。

必要なものをインストールする

yum install rpm-build  
yum install yum-utils  
yum install rpmdevtools  
yum install createrepo  

rpm を作る

rpmdev-setuptree$HOME/rpmbuild を作り、その中の $HOME/rpmbuild/SPECS に SPEC ファイルを作ります。

SPECファイル作成

$HOME/rpmbuild/SPECS/lockfile.spec を作ります。今回はただのシェルスクリプトなのでコピーするだけ。

Name: lockfile  
Version: 1.0  
Release: 0  
Group: Utilities  
Source: lockfile-1.0.tar.gz  
Summary: lock file controller  
Packager: Taisuke Shiratori  
License: MIT License  
BuildRoot: /root/rpm/ROOT

%description
lockfile

%prep
rm -rf $RPM_BUILD_ROOT/*

%setup

%install
mkdir -p $RPM_BUILD_ROOT/usr/local/{bin,man/man1}  
cp lockfile $RPM_BUILD_ROOT/usr/local/bin  
cp lockfile.1 $RPM_BUILD_ROOT/usr/local/man/man1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%attr(-, root, root) /usr/local/bin/lockfile
%attr(-, root, root) /usr/local/man/man1/lockfile.1

SPEC ファイルができたら $HOME/rpmbuild/SOURCES にソースを置きます。

rpm のビルド

rpmbuild -ba $HOME/rpmbuild/SPECS/lockfile.spec でエラーが出なければ OK

yum リポジトリの作成

まず git リポジトリを作ります。

mkdir lockfile-rpm  
git init  

rpm ファイルと man 用のファイルを配置

mkdir -p lockfile-rpm/centos/6/os/{x86_64,SPRMS}  
cp $HOME/rpmbuild/RPMS/x86_64/lockfile-1.0-0.x86_64.rpm lockfile-rpm/centos/6/os/x86_64/lockfile-1.0-0.x86_64.rpm  
cp $HOME/rpmbuild/SRPMS/lockfile-1.0-0.src.rpm lockfile-rpm/centos/6/os/SPRMS/lockfile-1.0-0.src.rpm  

yum のリポジトリ作成

createrepo centos/6/os/SPRMS/  
createrepo centos/6/os/x86_64/  

で、そのまま GitHub にプッシュします。

yum install してみる

/etc/yum.repos.d/lockfile-rpm.repo に以下の内容を書いて、、

[lockfile-rpm]
name=lockfile-CentOS-$releasever  
baseurl=https://github.com/shitai246/lockfile-rpm/raw/master/centos/6/os/x86_64/  
enabled=1  
gpgcheck=0  

yum install -y lockfile でインストールできれば OK

まとめ

というわけで yum リポジトリ公開しました。

https://github.com/shitai246/lockfile-rpm

ドキュメントちゃんと書かないと…

]]>
<![CDATA[Web から取得した html をローカルで動かしたとき相対パスが読み込めなくなる問題の解決法]]>技術調査などで Web ページの html をちょっと修正して挙動を見てみたいけど、デベロッパーツールだとちょっと面倒な修正のときに使える Tips

html ソースをブラウザから取得してローカルで動かした場合、相対パスで記述されている css や javascript が読み込めなくなってしまいますが、head タグ内に下記を記述すると解決します。

  <base href="{元のWebページのURL}" />

なんで今までこんなことに気づかなかったのか…

]]>
http://a4p.me/base-href-tag/e13d7197-54e2-4ad5-8955-e665ab610a34Wed, 01 Oct 2014 08:36:36 GMT技術調査などで Web ページの html をちょっと修正して挙動を見てみたいけど、デベロッパーツールだとちょっと面倒な修正のときに使える Tips

html ソースをブラウザから取得してローカルで動かした場合、相対パスで記述されている css や javascript が読み込めなくなってしまいますが、head タグ内に下記を記述すると解決します。

  <base href="{元のWebページのURL}" />

なんで今までこんなことに気づかなかったのか…

]]>
<![CDATA[リモートで bash をアップデートするスクリプト書いたよー]]>puppet とか入ってない残念な環境向け。

#!/bin/sh

if [ "$1" == "" ]; then  
  echo "usage : $0 ipaddress"
  exit 1;
fi

IP=$1

ssh -t $1 "sudo yum -y update bash && sudo /sbin/ldconfig && echo '----- result -----' && cat /etc/redhat-release && rpm -q bash && echo '------------------'"  
]]>
http://a4p.me/bash-update-script/c2674d5b-0155-4446-a37d-bfd89d981772Thu, 25 Sep 2014 08:20:21 GMTpuppet とか入ってない残念な環境向け。

#!/bin/sh

if [ "$1" == "" ]; then  
  echo "usage : $0 ipaddress"
  exit 1;
fi

IP=$1

ssh -t $1 "sudo yum -y update bash && sudo /sbin/ldconfig && echo '----- result -----' && cat /etc/redhat-release && rpm -q bash && echo '------------------'"  
]]>
<![CDATA[ScalaMatsuri に行ってきたまとめ。]]>ScalaMatsuriに行ってきた。疲れたけど忘れないうちに気になったところまとめとく。

セッションのスライド

GitBucket: The perfect Github clone by Scala

個人的に一番面白かった。Apache MINA が気になる。

Node.js vs Play Framework

直接見てないけどすごい盛り上がってた。良いまとめ。

ツール類

  • Rapture I/O
    • これも直接聞いてないけどJSONパーサーで結構いい感じらしい空気だったので後でちゃんとチェックする。
  • Apache Spark
    • BigData
]]>
http://a4p.me/scalamatsuri2014/6565984d-0d57-4dce-b323-4647892e3c70Sun, 07 Sep 2014 14:24:39 GMTScalaMatsuriに行ってきた。疲れたけど忘れないうちに気になったところまとめとく。

セッションのスライド

GitBucket: The perfect Github clone by Scala

個人的に一番面白かった。Apache MINA が気になる。

Node.js vs Play Framework

直接見てないけどすごい盛り上がってた。良いまとめ。

ツール類

  • Rapture I/O
    • これも直接聞いてないけどJSONパーサーで結構いい感じらしい空気だったので後でちゃんとチェックする。
  • Apache Spark
    • BigData を Scala でなんとかするとかそういうやつ。まだよくわかってない。。
  • Databricks
    • 直接見てないけど Spark と連携して使うBIツール?
    • まだ開発中で課金モデルも決まってないらしい。
  • Akka
    • Actor 面白そう。
  • Scala.js
    • Scala.js すごそう。
]]>
<![CDATA[Pidora に CUI の TwitterClient をインストールする。]]>Pidora2014(RaspberryPi) に CUI の Twitter Client であるRainbowStream をインストールしてみました。

事前準備

RainbowStream は pip でインストールできるので、Pidora で pip を使えるようにします。

distribute のインストール

pip をインストールするために easy_install を使えるようにします。

wget http://python-distribute.org/distribute_setup.py  
python distribute_setup.py  

pip のインストール

easy_install で pip をインストールします。

easy_install pip  

python-devel のインストール

python-devel

]]>
http://a4p.me/rainbowstream-on-pidora/9a7fc4fe-4169-4c5a-9fbd-765f31fb5344Fri, 05 Sep 2014 02:48:47 GMTPidora2014(RaspberryPi) に CUI の Twitter Client であるRainbowStream をインストールしてみました。

事前準備

RainbowStream は pip でインストールできるので、Pidora で pip を使えるようにします。

distribute のインストール

pip をインストールするために easy_install を使えるようにします。

wget http://python-distribute.org/distribute_setup.py  
python distribute_setup.py  

pip のインストール

easy_install で pip をインストールします。

easy_install pip  

python-devel のインストール

python-devel を入れないと pip でのインストール時にエラーが出るため、python-devel もインストールします。

yum -y install python-devel  

RainbowStream のインストール

pip から RainbowStream を入れます。

pip install rainbowstream  

certifi のインストール

rainbowstream をインストールすると certifi が無いと言われるのでインストールします。

pip install certifi  

RainbowStream のセットアップ

rainbowstream を立ち上げると Twitter 認証用のURL が表示されます。

# rainbowstream
Hi there! We're gonna get you all set up to use Rainbow Stream.

In the web browser window that opens please choose to Allow  
access. Copy the PIN number that appears on the next page and paste or  
type it here:

Opening: https://api.twitter.com/oauth/authorize?oauth_token=wO4VhK9Fi8vp9Lw5QyVHex4zL08pMAr3


Uh, I couldn't open a browser on your computer. Please go here to get  
your PIN:

https://api.twitter.com/oauth/authorize?oauth_token=wO4VhK9Fi8vp9Lw5QyVHex4zL08pMAr3  
Please enter the PIN:  

表示されたURLにブラウザでアクセスし、表示されたPINコードをRainbowStream に入力すればOKです。別のマシンのブラウザでPINコードを取得しても問題ありません。

RainbowStream の使い方

いろいろコマンドはありますが、以下を覚えたらだいたい大丈夫です。

  • h …ヘルプを表示
  • home …自分のタイムラインを表示
  • s abc …abc の検索結果を表示
  • switch public abc …ストリームを abc キーワードにスイッチする
  • switch mine …ストリームをデフォルトに戻す
  • t abc def …「abc def」 とツイートする
]]>
<![CDATA[Raspberry Pi でモバイルPCを作った。]]>

材料

Raspberry Pi

なにはともあれ Raspberry Pi ですね。今買うなら断然 TypeB+ がおすすめ。僕のは TypeB ですが、配線がごちゃごちゃしがち。B+ は電源周りも改善されているようですし、PIN の数も多いので将来的に電子工作をやりたくなったときにも使えます。

Raspberry Pi Model B (Plus)

新品価格
¥4,880から
(2014/9/3 00:27時点)

モニター

電子工作とかやってる人は秋葉原行ったら安い液晶があるらしいですが、僕はそういうのあんまり得意じゃないので普通に買いました。
RaspberryPi は HDMI が使えるので HDMI 出力できるモニタを探したところ、カーナビ用のオンダッシュモニターが割と安くていい感じでしたね。スピーカーもついてる。

HDMI iPhone5充電可USB 内蔵 シガー 電源 スピーカー 付

]]>
http://a4p.me/raspberry-pi/fe26fc99-e225-423b-bd7a-2d2a48326899Tue, 02 Sep 2014 16:42:59 GMT

材料

Raspberry Pi

なにはともあれ Raspberry Pi ですね。今買うなら断然 TypeB+ がおすすめ。僕のは TypeB ですが、配線がごちゃごちゃしがち。B+ は電源周りも改善されているようですし、PIN の数も多いので将来的に電子工作をやりたくなったときにも使えます。

Raspberry Pi Model B (Plus)

新品価格
¥4,880から
(2014/9/3 00:27時点)

モニター

電子工作とかやってる人は秋葉原行ったら安い液晶があるらしいですが、僕はそういうのあんまり得意じゃないので普通に買いました。
RaspberryPi は HDMI が使えるので HDMI 出力できるモニタを探したところ、カーナビ用のオンダッシュモニターが割と安くていい感じでしたね。スピーカーもついてる。

HDMI iPhone5充電可USB 内蔵 シガー 電源 スピーカー 付 7インチ オンダッシュモニター

新品価格
¥5,880から
(2014/9/3 00:36時点)

HDMI 内蔵 シガー 電源 スピーカー 付 10.1インチ オンダッシュモニター

新品価格
¥9,280から
(2014/9/3 00:33時点)

画面の大きさで結構値段が変わってきます。RaspberryPi で GUI を使いたければ画面解像度の高い10インチにしたらいいと思います。

バッテリー

スマホ充電用のモバイルバッテリーがちょうどいいです。Raspberry Pi と モニタに給電する必要があるので USB が 2ポートあるやつを買うこと。モニターに USB がある場合でも、そこから Raspberry Pi に給電すると電力不足で落ちたりします。

cheero Energy Plus 12000mAh

新品価格
¥3,250から
(2014/9/3 00:41時点)

ちゃんと計測していませんが、cheero Energy Plus 12000mAh で 8時間くらい稼働できました。

その他

他は細かい物がいろいろ必要です。

  • SDカード
    • Raspberry Pi TypeB+ の場合は microSD
  • microUSB
    • Raspberry Pi 給電用。100均で買えます。
  • キーボード
  • マウス
    • GUI 使わないなら不要。
    • Pidora なら設定すればキーボードでマウスカーソルを操作できます。
  • HDMI ケーブル
  • USB無線LANアダプタ
    • WiFi 環境は別途準備しましょう。。
  • モニタ用のUSB給電ケーブル

しかし持ち運びにちょうどいい箱はなかった…

ので自作した。

見ての通り木製の箱ですね。日曜大工とかしないので結構苦労しました。蝶番難しい…

アタッシュケース型にしてモニタを背面に螺子留め。チェーンでちょうどいい角度に固定できるようにしました。

木材はホームセンターに行けば指定した大きさにカットしてくれるサービスがあるので利用すると楽です。

作ってみて

3万円足らずでモバイルPCが作れました。箱の材料費で6000円くらいかかったし、モニタなどもケチれば2万円台いけるかもしれない。

ただ意外と重い。中身だけだと1.5kgないはずなんですが、箱込みで3.1kgあった。重い。ちなみに Raspberry Pi 本体は 85g だそうです。

愛着はすごい湧くのでおすすめ。

]]>
<![CDATA[Wordpress から Ghost に乗り換えてみた。]]>Ghost?

最近でてきたnode.jsのCMS
https://ghost.org/download/

  • かるい
  • Markdown でさくさく書ける

WP からの移行方法

ここ参考にした。
http://qiita.com/hiro/items/11ea2c953d90eb946eef

実際どうなん?

  • ただimportするだけだとurlの形式が変わる。。
    • いままでは /archives/1250/ とかだった。
    • rewriteするしかなさそう。。
  • コードハイライトとかも死亡
  • テーマが個人的に微妙なかんじする
    • こんど自作しよう…
  • markdown でさくさく書けるのは非常に良い。

とりあえず

しばらくGhost使ってみる。markdown が非常にいい感じなので blog書くモチベ上がりそうな予感はする。

]]>
http://a4p.me/wptoghost/c1cc2d18-cd59-4796-a45e-eecff6733f22Mon, 25 Aug 2014 17:13:26 GMTGhost?

最近でてきたnode.jsのCMS
https://ghost.org/download/

  • かるい
  • Markdown でさくさく書ける

WP からの移行方法

ここ参考にした。
http://qiita.com/hiro/items/11ea2c953d90eb946eef

実際どうなん?

  • ただimportするだけだとurlの形式が変わる。。
    • いままでは /archives/1250/ とかだった。
    • rewriteするしかなさそう。。
  • コードハイライトとかも死亡
  • テーマが個人的に微妙なかんじする
    • こんど自作しよう…
  • markdown でさくさく書けるのは非常に良い。

とりあえず

しばらくGhost使ってみる。markdown が非常にいい感じなので blog書くモチベ上がりそうな予感はする。

]]>
<![CDATA[最初のフォロワーは誰だ?]]>社内LTで話したネタを再編集して。

組織に新しい何かを導入するのは結構大変です。IT業界だとここ数年はアジャイルやクラウドやビッグデータや関数型プログラミングなどが盛り上がってますが、いざ導入しようと思ってもなかなか上手くいかないことが多いと思います。

 

弊社でアジャイルを導入した例

僕の会社(の僕の部署)では現在アジャイル開発を採用しています。結構いい感じでアジャイルしてると思いますが、2011年まではガチガチのウォーターフォールでした。レビューが通らなくて泣く奴がいるレベル。2012年にアジャイル宣言して2年半が立ちましたが、本当にアジャイルっぽくなってきたなと感じたのは2013年の暮れくらいです。アジャイルを導入するのに2年近くかかったわけですね。

ともあれアジャイル導入には成功したわけですが、もちろん2年のうちにはいろいろあって、アジャイルが原因で辞めて行った方も何人かいて、もっと犠牲を払わずに成功できなかったのかと振り返ることもあります。

 

どうすればよかったのか

デレク・シヴァーズの「社会運動はどうやって起こすか」が非常に参考になります。見た事のない方は是非見てみてください。

この中でデレク・シヴァーズが言っている通り、最初のフォロワーが変化を起こす上で非常に重要な役割を担います。

しかし、この "最初のフォロワー" というのは具体的にどういう人なのかを見誤ると痛い目に合います。。

 

最初のフォロワーとはどんな人か

変化のきっかけとなる "最初のバカ" にとっても、バカにはなれないけど変化に貢献したい人にとっても、"最初のフォロワー" がどういう人かを知ることは大事なことです。"最初のフォロワー" の資質がないのに "最初のフォロワー" 扱いをする・されることはお互いにとって不幸だからです。

新しい変化を目の当たりにしたとき、人の反応というのは4つに分類されます。

  1. 積極的反対派 反対する理由があって積極的に変化を拒絶する人
]]>
http://a4p.me/1285/e69819ab-347c-4e7c-b294-b72050001259Mon, 30 Jun 2014 08:30:42 GMT社内LTで話したネタを再編集して。

組織に新しい何かを導入するのは結構大変です。IT業界だとここ数年はアジャイルやクラウドやビッグデータや関数型プログラミングなどが盛り上がってますが、いざ導入しようと思ってもなかなか上手くいかないことが多いと思います。

 

弊社でアジャイルを導入した例

僕の会社(の僕の部署)では現在アジャイル開発を採用しています。結構いい感じでアジャイルしてると思いますが、2011年まではガチガチのウォーターフォールでした。レビューが通らなくて泣く奴がいるレベル。2012年にアジャイル宣言して2年半が立ちましたが、本当にアジャイルっぽくなってきたなと感じたのは2013年の暮れくらいです。アジャイルを導入するのに2年近くかかったわけですね。

ともあれアジャイル導入には成功したわけですが、もちろん2年のうちにはいろいろあって、アジャイルが原因で辞めて行った方も何人かいて、もっと犠牲を払わずに成功できなかったのかと振り返ることもあります。

 

どうすればよかったのか

デレク・シヴァーズの「社会運動はどうやって起こすか」が非常に参考になります。見た事のない方は是非見てみてください。

この中でデレク・シヴァーズが言っている通り、最初のフォロワーが変化を起こす上で非常に重要な役割を担います。

しかし、この "最初のフォロワー" というのは具体的にどういう人なのかを見誤ると痛い目に合います。。

 

最初のフォロワーとはどんな人か

変化のきっかけとなる "最初のバカ" にとっても、バカにはなれないけど変化に貢献したい人にとっても、"最初のフォロワー" がどういう人かを知ることは大事なことです。"最初のフォロワー" の資質がないのに "最初のフォロワー" 扱いをする・されることはお互いにとって不幸だからです。

新しい変化を目の当たりにしたとき、人の反応というのは4つに分類されます。

  1. 積極的反対派 反対する理由があって積極的に変化を拒絶する人
  2. 消極的反対派 賛成する理由がないため変化を拒絶する人
  3. 消極的賛成派 反対する理由がないため変化を許容する人
  4. 積極的賛成派 賛成する理由があって積極的に変化を許容する人

1, 2 はスタンスの違いはあれど、変化を拒んでいるため最初のフォロワーにはなりえません。

問題は 3 の消極的賛成派です。「それ凄くいいアイデアだね!ぜひ進めてよ!」と言ってくるような人です。ちなみに賛成派のうち大多数は消極的賛成派に属します。この人たちを "最初のフォロワー" として扱ってはいけません。

 

消極的賛成派を "最初のフォロワー" にしてはいけないワケ

消極的賛成派は簡単に言うと「導入コストを他人が払ってくれるのなら賛成」という人たちです。それなのに "最初のフォロワー" として扱ってしまうと、導入コストの支払いが変化を反対する理由になってしまいます。

変化を導入するのはすごく大変です。当初想定もできなかった問題がいくつも起きたりします。そんなところに消極的賛成派を招いても積極的反対派になって帰っていくだけです。

念のためフォローしておくと、消極的賛成派というスタンスは悪い事ではありません。単にそれよりも興味のあることがあったり、仕事が忙しすぎてそんな余裕がなかったり、上司が反対派だとかで積極的になれなかったりします。導入フェーズが上手くいってキャズムを超える段階になったときには消極的賛成派を仲間に迎えていかなければならないため、消極的賛成派を敵に回すような行動は慎むべきです。

特に変化を起こそうとするくらい意識が高まっている人にとって、消極的賛成派というのは「誰かがリスクを取ってくれたあとにメリットだけ享受したい人間のクズ」に見えることがあるので注意が必要です。注意が必要です。大事なことなので2回言いました。

ついでに言うと、"気持ちだけは積極的賛成派" という人もいるので注意しましょう。重要なことは導入コストを一緒に支払ってくれるかどうかです。

 

まとめ

あなたが "最初のバカ" であれば、導入コストを一緒に支払ってくれる積極的賛成派を "最初のフォロワー" に迎えましょう。導入コストを支払えない消極的賛成派は然るべきタイミングまで適切な距離を保ちましょう。ここで間違えると導入自体失敗したり、なんとか導入できても犠牲を増やす結果になります。

あなたが "最初のバカ" ではなく、変化に賛成のスタンスを取るなら、導入コストを支払えるかをよく考えましょう。消極的賛成派は悪い事ではありません。導入コストが支払えないなら "最初のフォロワー" にならないよう振る舞いましょう。

]]>
<![CDATA[OracleでSQL実行時に引数をとる]]>引数をバインドしたい部分を &数字 にして sql ファイルを作って、、

$ cat hoge.sql
select * from hoge where foo = &1 and bar = '&2' and baz = '&3';  

sql ファイル実行時に引数を渡すと勝手に展開してくれる。
'''
SQL> @hoge.sql 123 abc xyz
旧 1: select * from hoge where foo = &1 and bar = '&2'

]]>
http://a4p.me/oraclee381a7sqle5ae9fe8a18ce69982e381abe5bc95e695b0e38292e381a8e3828b/3feb7b82-918d-41c2-b579-3d0ad95d2bdeWed, 21 May 2014 15:10:11 GMT引数をバインドしたい部分を &数字 にして sql ファイルを作って、、

$ cat hoge.sql
select * from hoge where foo = &1 and bar = '&2' and baz = '&3';  

sql ファイル実行時に引数を渡すと勝手に展開してくれる。
'''
SQL> @hoge.sql 123 abc xyz
旧 1: select * from hoge where foo = &1 and bar = '&2' and baz = '&3' 新 1: select * from hoge where foo = 123 and bar = 'abc' and baz = 'xyz' '''

なんで今まで知らなかったんや…

]]>
<![CDATA[cp するときに上書きされるファイルがあったらバックアップを取る。]]>今朝同僚に話したら意外とみんな知らなかったので。

cp コマンドの -b オプションを使うと上書きするファイルがあったとき自動でバックアップを取ってくれる。

$ touch aaa
$ touch bbb
$ cp -b ./aaa ./bbb
$ ls
aaa  bbb  bbb~  

そのままだとバックアップファイルは ~ がつくが、--suffix オプションで指定できる。

$ cp -b --suffix=.`date +%Y%m%d` ./aaa ./bbb
$ ls
aaa  bbb  bbb.20140325  bbb~  

bashrc に alias を書いておくと便利。

alias cp='cp -ivb --suffix=.`date +%Y%m%d%H%
]]>
http://a4p.me/cp-e38199e3828be381a8e3818de381abe4b88ae69bb8e3818de38195e3828ce3828be38395e382a1e382a4e383abe3818ce/2d56b2bc-e4a0-4004-8187-d1982e620d67Tue, 25 Mar 2014 12:35:15 GMT今朝同僚に話したら意外とみんな知らなかったので。

cp コマンドの -b オプションを使うと上書きするファイルがあったとき自動でバックアップを取ってくれる。

$ touch aaa
$ touch bbb
$ cp -b ./aaa ./bbb
$ ls
aaa  bbb  bbb~  

そのままだとバックアップファイルは ~ がつくが、--suffix オプションで指定できる。

$ cp -b --suffix=.`date +%Y%m%d` ./aaa ./bbb
$ ls
aaa  bbb  bbb.20140325  bbb~  

bashrc に alias を書いておくと便利。

alias cp='cp -ivb --suffix=.`date +%Y%m%d%H%M%S`'  

おわり。

]]>