2011年3月24日木曜日

お客の質に要注意せよ

ピーター・ドラッガーもフィリップ・コトラーも語らなかった事に、客の質という物があります。

最初に顧客を見つけろ、顧客の要求にあった物は何かを探せとの師達の言葉ですが、そもそも客を装って、サービスをかすめ取る客を想定していません。

こちらが見積書・提案書、仕様概要書を出し、「では頼みます」という所まではOKですが・・・。

その後発注に至る前に「でも、具体的にイメージが湧かないので実際の事例(サンプル稼働)サイトを見せて下さい」とか、「仕様書がこちらの求めているレベルにまで達していません。もっと具体的に資料を作成してださい」とかで順々に資料を要求し設計書まで求めてくるとか。それは発注があってからと返答しても、「具体的に見極めるには資料が必要です」とかで平行線のままこちらは仕事を取りたいが為に資料を作り続ける訳です。

そんなこんなでメールや問い合わせ、資料作成への対応に時間と人的コストを相当つぎ込む事になる訳ですが、もっと具体的に云々と成果物により近い所まで引き延ばしておいて、彼らの狙いは、具体的な「稼働サイトの価値」や(下請けや社内で使える)「設計書」を引き出す事に意図があります。目的の物を手に入れたら、「あなたはこちらの要求を満たせなかった」「資料が後追いで、はじめから要求された物が用意できていない」といってハイさよならです。発注書を獲得しようとして動いた膨大な時間は戻ってきません。

ですから、きっぱりと法的な責任の発生する発注書を受け取るまでに相手に提示できる物を限定しましょう。稼働サイトはあくまでもサンプル品であり発注が無くてもいいレベルまでに限定してつくりましょう。仕様書もしかりです。費やす時間は発注が無くてもいいレベルに設定すべきです。

しかし、それ以上に大事なのは相手の態度です。明らかに高所から見下ろす様な客はマーケティング的に見てもエンゲージメントの対象ではありません。それはロイヤリティです。 あなたは膨大なマーケット中のたった1つの顧客に、しかも発注してもらっていない想定上の顧客に忠誠を誓うつもりですか?気をつけて下さい。見返りはゼロかもしれません。また、いかにもフレンドリーな態度で接してくるのも注意が必要です。ちょっと「お試し」気分なだけかもしれません。

ここら辺の話はビジネス・セミナーで学べるのでしょうか?オープンソースを生業として技術で生きている身として、同じ同業者同士、皆で騙されない様にもっと連帯して学んで行く場があってしかるべきだと思いました。

技術的な勉強会は多々あれど、我々技術者が直面する日々の生活に直結するビジネスの進め方に関する勉強会も大事だと思いませんか?

賛同する方、twitter ID @bluemooninc でお声を掛けて下さい。

本日は、質の悪い客に引っかかったボヤキにお付き合い頂きありがとうございました。

有限会社ブルームーン & XOOPS Cube Information事務局
代表取締役 酒井能克

2011年3月18日金曜日

XOOPS Cube, Weblinks, 一括登録にてカテゴリがセットされない不具合

WebLinksモジュールには、リンク一括登録 (管理者が登録項目を指定する )という機能がありますが、カテゴリが設定されない不具合がありました。

訂正箇所は以下の通りです。

weblinks/admin/bulk_manage.php 649行目付近
function _insert_link($cid, $arr)
{
    global $xoopsUser;
    $cid = intval($cid);

    if ( $cid <= 0 )
    {
        $this->_print_error( _AM_WEBLINKS_BULK_ERROR_CID );
        return false;
    }

// BUG : not set search field
    // Bugfix by bluemoon inc.
    // $arr['cid'] = array( $cid );
    $arr['uid'] = $xoopsUser->uid();
    $arr['cids'] = "$cid";

// BUG 4318: cannot register bulk links.
// Fatal error: Call to undefined method weblinks_link_edit_handler::add_link_to_link()
    $link_obj =& $this->_link_edit_handler->create_add_link_by_arr( $arr, true, false );
    // Enforced set by bluemoon inc.
    $link_obj->setVar('cids', $cid );
・・・以下省略

2011年3月16日水曜日

ブロックの強制的な非表示

XOOPS Cubeで、あるモジュールのindex.phpの時だけブロックを表示したくない。
そんな時は、header.phpをインクルードする前に、$show_rblock変数を宣言します。

たったこれだけで、ブロック表示をオフにする事ができるのです。ソース中からでも細かいブロック制御ができるのでとても便利です。
$show_rblock=0;

include 'header.php';

2011年3月14日月曜日

Donate to Japan earth quake.

Hi All,

If you try to donate for Japan Earthquake. I write here Japanese "RED-CROSS" office safely and trusty.

CITI-BANK Japan.

Given the impact of the tragedy, Citi has pledged 100 million yen and has established an account for donations to support the relief efforts of the Japanese Red Cross Society.
Customers interested in making a donation can send funds to:

•Citi Japan Disaster Relief
•Citibank Japan Ltd. (bank code: 0401, SWIFT Code for International Payments: CITIJPJT)
•Otemachi Branch (Branch #021)
•Account number: 7778563 Savings (Futsu)

*Free fund transfer if you transfer your donation from a Citibank ATM.
**Donations made to this account are not tax deductible, and we cannot provide Tax receipts. If you wish to make a donation that is eligible for a tax deduction, please donate directly to the Japan Red Cross (http://www.jrc.or.jp)

You can check it double below the URL

http://www.citibank.co.jp/en/customernotices/customernoticesindex/customernoticepages/cust_031311_01.html

Yoshi Sakai
CEO,Founder as Blueoon inc.
XOOPS Cube and LAMP Web System Developper

2011年3月11日金曜日

ジオ情報をソーシャルに

yahoo が Open Street Maps プロジェクト参入するに当たって、ジオ情報をもっとソーシャルにという事をキャッチフレーズにしていました。


2011/3/6 Yahoo!Japanは、Yahoo!Japanが保有する地図データをOpenStreetMapに提供することを発表しました
Yahoo!Japanは、3月6日に開催されたGeolocation Confrence 2011において、保有するちりデータを無償でOSMに提供することを発表しました。あわせてYOLPという新サービスを発表しています。
 http://openstreetmap.jp/

そこで、弊社開発の XOOPS Cube モジュール Realty (不動産モジュール)をどう連動させれば訴求効果があるかを考えてみました。

Realty モジュールは、公的機関である reins.jp の不動産情報をCSVダウンロードしてジオ検索、逆ジオ検索できる機能があります。この他に、公共交通機関データベースより駅の情報をダウンロードして沿線指定や始発、到着駅間での不動産検索ができます。検索対象は売買・賃貸マンション、一戸建・土地等です。

さて、私たちは、引っ越し先の情報をどうやって知るでしょうか?たいてい不動産業者から大まかな提示のみで、実際に引っ越してから探す事になります。

そこを例えば、近隣の食べ物情報やスーパー等の生活情報、DIYストアやカーディーラー、安いガソリンスタンド等、実際に引っ越す前に知る事が出来れば、よりその地域での生活感がイメージできるのでは無いでしょうか。

そうすれば、実際に生活者の視点で、自分のライフスタイルに適した引っ越し先を探せると思います。

ジオ情報をソーシャルに活用するに当たって、不動産情報とどの様に連携させれば便利かという事を考察してみました。

最後に弊社で開発した不動産システムをご紹介します。

現在は、 http://bluemoon.sub.jp/pitat にて公開しております。システムの導入や協業についてご興味ある方は、info@bluemooninc.jp までご連絡ください。

2011年3月8日火曜日

XOOPS Cube : ユーザー登録に本名を追加

XOOPS Cube のユーザー登録欄はコアで一番ハック需要があるソースです。今回は新規ユーザー登録時に本名を必須として入力してもらう場合のハック情報を記載します。
なお、ここに記載のハック情報のコアソースは、XOOPS Cube 2.1.8a の物です。

user/templates/user_register_form.htmlに本名欄を追加 (ユーザー名欄から記載)
  <tr>
    <td class="head"><{$smarty.const._MD_USER_LANG_NICKNAME}></td>
    <td class="<{cycle values="odd,even"}>"><{xoops_input maxlength=25 name=uname value=$actionForm->get('uname')}></td>
  </tr>
  <!-- by bluemooninc -->
  <tr>
    <td class="head"><{$smarty.const._MD_USER_LANG_NAME}></td>
    <td class="<{cycle values="odd,even"}>">
      <{xoops_input type=text name=name value=$actionForm->get('name') size=30 maxlength=60}>
    </td>
  </tr> 
 user/templates/user_register_confirm.html も同様に追加(ユーザー名欄から記載)
  <tr>
    <td class="head"><{$smarty.const._MD_USER_LANG_NICKNAME}></td>
    <td class="<{cycle values="odd,even"}>">
      <{$registForm->get('uname')|xoops_escape}>
    </td>
  </tr>
  <!-- by bluemooninc -->
  <tr>
    <td class="head"><{$smarty.const._MD_USER_LANG_NAME}></td>
    <td class="<{cycle values="odd,even"}>">
      <{$registForm->get('name')|xoops_escape}>
    </td>
  </tr>
user/forms/UserRegisterForm.class.php に本名を追加(14行目から記載)
    function prepare()
    {
        parent::prepare();
        //
        // Set form properties
        //
        $this->mFormProperties['uname'] =& new XCube_StringProperty('uname');
        $this->mFormProperties['name'] =& new XCube_StringProperty('name');        // by bluemooninc
        $this->mFormProperties['email'] =& new XCube_StringProperty('email');
        $this->mFormProperties['user_viewemail'] =& new XCube_BoolProperty('user_viewemail');
        $this->mFormProperties['url'] =& new XCube_StringProperty('url');
        $this->mFormProperties['timezone_offset'] =& new XCube_FloatProperty('timezone_offset');
        $this->mFormProperties['pass'] =& new XCube_StringProperty('pass');
        $this->mFormProperties['vpass'] =& new XCube_StringProperty('vpass');
        $this->mFormProperties['user_mailok'] =& new XCube_BoolProperty('user_mailok');
        $this->mFormProperties['agree'] =& new XCube_BoolProperty('agree');

        //
        // Set field properties
        //
        $this->mFieldProperties['uname'] =& new XCube_FieldProperty($this);
        $this->mFieldProperties['uname']->setDependsByArray(array('required', 'maxlength', 'minlength'));
        $this->mFieldProperties['uname']->addMessage('required', _MD_USER_ERROR_REQUIRED, _MD_USER_LANG_UNAME, '25');
        $this->mFieldProperties['uname']->addMessage('maxlength', _MD_USER_ERROR_MAXLENGTH, _MD_USER_LANG_UNAME, min(25,$this->mConfig['maxuname']));
        $this->mFieldProperties['uname']->addMessage('minlength', _MD_USER_ERROR_MINLENGTH, _MD_USER_LANG_UNAME, $this->mConfig['minuname']);
        $this->mFieldProperties['uname']->addVar('maxlength', min(25,$this->mConfig['maxuname']));
        $this->mFieldProperties['uname']->addVar('minlength', $this->mConfig['minuname']);

        // hack start by bluemooninc
        $this->mFieldProperties['name'] =& new XCube_FieldProperty($this);
        $this->mFieldProperties['name']->setDependsByArray(array('required', 'maxlength'));
        $this->mFieldProperties['name']->addMessage('required', _MD_USER_ERROR_REQUIRED, _MD_USER_LANG_NAME, '60');
        $this->mFieldProperties['name']->addMessage('maxlength', _MD_USER_ERROR_MAXLENGTH, _MD_USER_LANG_NAME, '60');
        $this->mFieldProperties['name']->addVar('maxlength', 60);   
        // hack end by bluemooninc