2012年1月29日日曜日

欧米化

シロクロの伊藤さんに教えていただいたデザイン集があまりにイケてたため、 メモ。

■グラデーションを強く使わず区切り線で質感を持たせるヘッダーメニュー
http://culturedcode.com/things/iphone/

■背景にうっすらグラデーションでシンプルに
http://edovia.com/touchpad/

■メインビジュアルのミシン目、布テクスチャーとテイストに沿ったボタン
http://www.realmacsoftware.com/courier/

■木目背景とメニューボタンの質感
http://themetrust.com/demos/quantum/

■立体的な質感のヘッダーメニュー
http://mixrdj.com/

■質感のある紙背景
http://www.84colors.com/

■海外サイト風なリボン帯
http://sarahlongnecker.com/

■下部コンテンツの上品な木目背景
http://www.tearoundapp.com/

■コンテンツ領域ごとに違ったテクスチャー
http://www.augustinteractive.com/

■その他パターン
http://www.cakesweetcake.co.uk/
※海外サイト風な細かいパーツ処理(背景、コンテンツの区切り線、リボン帯)


この記事でもあるように、日本では色んなところでグローバル化が進んでるんですね。
一昔前は海外のWebサイトって派手なだけでみづらい印象があったんだけど、今は海外のWebデザイン最高!みたいに感じますね。
そのうち言語の違いだけになるでしょうね。
欧米か!!

2012年1月17日火曜日

amazon様のおかげで商品が半額で買えたよ、の巻

小ネタ。

会議用にWebカメラを買おうと思い、amazonを見て以下を買う事に決めた。
C525(2500円)













で、ビックカメラに行ったら4980円。ほぼ倍の値段。










僕「すいません、amazonより高いんですけど」
店員「流通などが異なるため通販の方が安いことがあるんです」
僕「でも倍するんですけど」
店員「え、本当ですか!?調べます」

で、調べてもらったら他の店舗で2750円で売られているのがわかり(そういうデータベースがあるんですねw)、2750円で売ってくれました。

情強レベル上がったわ(笑)

〜教訓〜
・アマゾソ安いよ!
・ネットで値段調べてから買った方がいいよ!


2012年1月14日土曜日

IT業界の「勝ち組」と「負け組」

最近、採用の仕事もやるようになったのだが、 今まで当たり前だと思っていた事がそうじゃないことに気づかされたりして興味深い。

色んな人と話をしていて共通して聞く話題として、 リーマンショック以降、SI業界はずっと業績が悪い。
不景気があれば当然回復もあるわけでこの状態は一見おかしいのだが、実は今の状態が「正しい状態」なのではないか。 


どういうことかというか、ITの利益というのはメリットが直接目に見えないため、 「競合がやっているから」などのネガティブな理由が投資のモチベーションになる。
リーマンショックのときに投資をストップしたことをきっかけに「あんまり困ってなくね?」ということになりそれまで無駄にお金を使っていたのに企業側が気づいたのではないか。

必要のないものを売っていた営業が悪いという立場もあるかもしれないけれど、 十分な価値を生み出せなかった作り手の責任だと僕は考えたい。
アクセンチュアでは特定の顧客から何億もの案件を取ってくるような営業のことを「神の手」というらしいが(笑)、 営業が布教する利益とモノ作りの成果物の価値が乖離しているため、 「どうせ営業が仕事とってくるからいいや」というようななあなあの体質になっているのではないか。

品質を価格に反映するようななんらかの方法を取らなければいけないと思う。 


採用活動をしていると、Web業界の年収が軽く500〜600万いっているのに対し、SIerで働く人は400万あれば良い方である。
プログラミングスキルの違いが原因ではなく、SI業界の悪い慣習を改善できてないからである。 

たとえば、
・多重下請け構造
・ドキュメント作成に時間をかけ実装を軽視する古い「ウォーターフォール」
こんなことを続けてはないだろうか。 (そういった意味ではできることはまだまだあるので、のびしろもまだまだあると思う。)

名指しすると、IBM、富士通、NECのようなメインプレーヤは率先してSI業界を変えて行く責任があると思う。
もしそのような会社で上記のようなことをやっているのであれば改善してほしい。 

もしこれを読んでいる人がSI業界にいて、古いやり方を引きずっている会社にいるようであれば(あなたが役員でないなら)東京にきて一緒にWebの仕事をしましょう!
冗談抜きでこのままいけば企業が使う全部のシステムがGoogleやamazonに組み込まれ、日本からSIerという会社が全滅する可能性も十分あります。


こうしている間にも、SI業界からWeb業界への技術者流入が始まっている。

2011年12月27日火曜日

PayPal API の実装

本日microbankがリニューアルオープンしました。

感無量です…と言いたいところですが、どこかバグってないかヒヤヒヤしてます。

microbankではPayPalの代行決済を利用しています。
世界で使われているだけあってかなり実装しやすいですし、問い合わせも確実に答えてくれました。
何より固定費用がかからないので、ちょっとしたWebサービスではこれ以外の選択肢はないと思います。

・はじめに読むべきサイト
「PayPal API導入・活用ガイド」by gihyo.jp

・慣れてきたら読み込んでおくといいもの
エクスプレス・チェックアウト システム統合ガイド

・実装を始めたら手放せないもの
サンドボックス
APIリファレンス(日本語)
APIリファレンス(英語)

実装を始めた当初はまったく知らなかったのですが、いくつかサービスに種類があるそうです。
https://www.paypal-japan.com/business/solution/

・エクスプレス チェックアウト:自分たちで力づくで実装したい人向け。
・ウェブ ペイメント スタンダード:ちょっとした取引が簡単に実現できる(無料)
・ウェブ ペイメント プラス:「スタンダード」より機能が多いやつ(有料。3000円/月)
・モバイル決済
・リファレンス トランザクション
など

「リファレンストランザクション」は会社の設立時期や財務状況などかなり厳しく審査されるらしいです。 それだけ自由に決済できるということなんでしょうね。
今回はもちろんエクスプレスチェックアウトで力づくの実装をしました。w

長くなってきたのでコードは次回。

2011年12月22日木曜日

Flickr APIを使った画像アップロード

自社でやっているソーシャルファンディングサービスではプロフィール画像をFlickrに保存するようにしています。

理由は自分たちのサーバーに画像をどんどん貯めていくと
管理が面倒だからです。

また、メディアデータは物理HDDを圧迫するのでなるべく貯めたくありません。
将来的にそういうサービスを作りたくなったときは、クラウド使うとか安いHDDをクラスタにした構成にする予定です。

そーたろーさんのHPを参考に実装してみたところ、
フローが若干面倒になってしまいました。
(1)認証⇒(2)連携を承認⇒(3)画像をアップロードという3つのステップが必要だったためです。

改善する方法がないかと思い色々調べてみると、実装した認証方式が古いもので、OAuth認証が用意されていた事がわかりました。
http://www.flickr.com/services/api/auth.oauth.html

実装してみるとTwitter連携などとほぼ全く同じようにできました。
コードが統一的になっていいですね。

認証⇒画像アップロード⇒画像URLのコードを晒しておきます。フレームワークはCakePHPです。

(1)リクエストトークンを取得してリダイレクト
$settings = Configure::read('flickr_settings');
        
$consumer = $this->createConsumerFlickr();
$callback = $settings['callback'];
        
$consumer->getRequestToken('http://www.flickr.com/services/oauth/request_token', $callback);
$this->Session->write('flickr_request_token', $consumer->getToken());
$this->Session->write('flickr_request_token_secret', $consumer->getTokenSecret());

$auth_url = $consumer->getAuthorizeUrl('http://www.flickr.com/services/oauth/authorize');
$this->redirect($auth_url);
exit;
(1)-2 createConsumerFlickr()の内容
function createConsumerFlickr(){
    include_once('HTTP/OAuth/Consumer.php');
    require_once(dirname(__FILE__) . "/../Lib/SfOAuthConsumer.php");
    
    $flickr_settings = Configure::read('flickr_settings');
    $consumer_key = $flickr_settings['api_key'];
    $consumer_secret = $flickr_settings['secret'];
    $consumer = new SfOAuthConsumer($consumer_key, $consumer_secret);
    
    return $consumer;
}
HTTP_OAuth_Consumerを継承させただけの SfOAuthConsumer という独自クラスを作っています。 (理由は後で説明します) (2)コールバック
$consumer = $this->createConsumerFlickr();

$verifier = $_GET['oauth_verifier'];
$consumer->setToken($this->Session->read('flickr_request_token'));
$consumer->setTokenSecret($this->Session->read('flickr_request_token_secret'));
$consumer->getAccessToken('http://www.flickr.com/services/oauth/access_token', $verifier);

$this->Session->write('flickr_access_token', $consumer->getToken());
$this->Session->write('flickr_access_token_secret', $consumer->getTokenSecret());

// Flickr User Idを取得
$params = array();
$params['method'] = 'flickr.test.login';
$params['nojsoncallback'] = '1';
$params['format'] = 'json';

$response = $consumer->sendRequest("http://api.flickr.com/services/rest", $params, "GET");
$login = json_decode($response->getBody(), true);

$this->me['User']['fl_oauth_token'] = $consumer->getToken();
$this->me['User']['fl_oauth_secret'] = $consumer->getTokenSecret();
$this->me['User']['fl_user_id'] = $login['user']['id'];

//DBに保存
$this->User->save($this->me);
$this->Auth->login($this->me);

$this->redirect('/users/uploadPhoto');
exit;
(3)写真をアップロード(フォームから送信ボタンを押したあとのアクション)
$consumer = $this->createConsumerFlickr();
$consumer->setToken($this->me['User']['fl_oauth_token']);
$consumer->setTokenSecret($this->me['User']['fl_oauth_secret']);

$file = $_FILES['user_photo']['tmp_name'];

// 写真を登録
$params = array();
$consumer->addUpload($file);
$response = $consumer->sendRequest("http://api.flickr.com/services/upload/", $params, "POST");
$photoId = FlickrApi::parsePhotoId($response->getBody());

// 写真情報を取得
$params = array();
$params['photo_id'] = $photoId;
$params['method'] = 'flickr.photos.getInfo';
$params['nojsoncallback'] = '1';
$params['format'] = 'json';

$response = $consumer->sendRequest("http://api.flickr.com/services/rest", $params, "GET");
$photoInfo = json_decode($response->getBody(), true);

// 写真URLに変換
$photoUrl = FlickrApi::convertUrl($photoInfo);

// DBに登録する
$this->me['User']['image1'] = $photoUrl;
$this->User->save($this->me);
$this->Auth->login($this->me);

$this->redirect('/users/uploadPhoto');
exit;
(3)-2 FlickrApi::convertUrl()の内容
public static function convertUrl($info){
    // http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpgg
    $farm_id = $info['photo']['farm'];
    $server_id = $info['photo']['server'];
    $id = $info['photo']['id'];
    $secret = $info['photo']['secret'];
    $mstzb = 't';
    
    return "http://farm{$farm_id}.staticflickr.com/{$server_id}/{$id}_{$secret}_{$mstzb}.jpg";
}
(3)-3 FlickrApi::parsePhotoId()の内容
public static function parsePhotoId($str){
    /* $str ='<?xml version="1.0" encoding="utf-8" ?><rsp stat="ok"><photoid>6536716601</photoid></rsp>'; */
    $p = xml_parser_create();
    xml_parse_into_struct($p, $str, $vals, $index);
    
    $photoid = null;
    foreach($vals as $dom){
        if($dom['tag'] == 'PHOTOID'){
            $photoid = $dom['value'];
            break;
        }
    }
    
    return $photoid;
}
写真をアップロードしようとして困ったのですが、 PEAR のHTTP_OAuthには画像を送信する方法が用意されていませんでした。(多分) 実装スピードを重視して今回は継承クラスを書き換え、sendRequest() 内でバイナリを送信できるようにしました。
class SfOAuthConsumer extends HTTP_OAuth_Consumer
{
    public $filename = null;
    
    
    public function addUpload($filename){
        $this->filename = $filename;
    }
    
    public function sendRequest($url, array $additional = array(), $method = 'POST')
    {
        $params = array(
            'oauth_consumer_key'     => $this->key,
            'oauth_signature_method' => $this->getSignatureMethod()
        );

        if ($this->getToken()) {
            $params['oauth_token'] = $this->getToken();
        }

        $params = array_merge($additional, $params);

        $req = clone $this->getOAuthConsumerRequest();

        $req->setUrl($url);
        $req->setMethod($method);
        $req->setSecrets($this->getSecrets());
        $req->setParameters($params);
        
        if(!is_null($this->filename)){
            $req->addUpload('photo', $this->filename);
        }
        
        $this->lastResponse = $req->send();
        $this->lastRequest  = $req;

        return $this->lastResponse;
    }   
}
Flickr が社内で不評だったことの原因の一つに、認証ページが英語しかないことがあると思います。 英語アレルギーの人には嫌われるかもしれないですね。。 早く日本語対応してほしいです。

2011年12月9日金曜日

【書評】働かないアリに意義がある



どういう意義があるのかというと、
アリによって刺激に対する感度の違い、いわば『個性』があって、
ある刺激に対して反応するアリとそうでないアリがいることによって
さらに大きな刺激があったときに対応するだけの余力を残しておける、ということらしい。

アリに「個性」があったなんてびっくりですね。