2012年12月30日日曜日

外からみえる日本企業と中からみた日本企業


叩かれ、蔑まれる日本企業


昨今何をしても日本企業が叩かれるので、勤めてる一人としては非常に肩身が狭い思いをしています。

例えば某日本企業が炊飯器にandroidを搭載したときはめっちゃ叩かれたのに、サムソンが冷蔵庫にtwitterつけたときは礼賛されるばかりか、「日本企業にこの発想力はない!」と、ちょっと前の批判はどこいったのよ、と文句を言いたくなるばかりの始末です。

業界初! アンドロイドスマホと連携の炊飯ジャー登場にびっくり【売れ筋チェック】

冷蔵庫にツイッターがついた!サムスンの発想力に日本メーカーは追いつけるか


主義主張もなく、ユーザが食いつきそうなネタを展開している各種メディアにはなんの感情もわきませんが、このような日本企業叩きを記事を喜んで読む人が多い現状がとても悲しくなります。

まあ結果を出してない人間が何いっても説得力がないのと同じように、今の状況で「日本企業って実はこんないいとこあるんだぜ!」なんていっても誰も興味を持たないでしょう。

超長期的な会社経営の観点で、新卒主義、長期雇用、集団主義の利点を合理的に反論することに成功したとしても、「でも利益出てないじゃん」で一括されればそこで黙るしかないでしょう。

でも、それでも、日本企業は実体以上に叩かれて蔑まされている気がしています。

本当にほんなにひどいの?


なぜなんでしょう。

悔しいのでしばらく考えたことがありますが、どうやら、それは日本企業に務める人間の情報発信に問題があるような気がしてます。

勤めているとすぐに分かるのですが、実は会社に満足している方々は少なからず存在します。中には会社を愛しててとても献身的に働いている方もいます。

静かなる満ち足りた人たち


ただし、そのような方々は積極的に会社のいいところについてtwitterやfacebookでほとんど情報発信をしていません。恥ずかしいのか、反論された叩かれるのがいやなのか、必要性を感じてないのかはわかりませんが、とにかくネットにコミットすることがほとんどありません。

他方、比較的、会社に文句のある方は、毎日のように不満を公にばらまきます。

また、これは一人一人に限っても同じ話が当てはまります。
いい時は何もtweetしないのに、何か不満があるときだけtweetすることが多い、というのは結構当てはまる人も多いのではないでしょうか。

この結果、おそらく全体で見れば日本企業についての情報は悪い点ばかり外に出ていくことになり、外の人から見れば悪い点しか目につかなくなるでしょう。

2012年12月28日金曜日

MAKERS―21世紀の産業革命が始まる

第1章 発明革命
第2章 新産業革命
第3章 未来の歴史
第4章 僕らはみんなデザイナー
第5章 モノのロングテール
第6章 変革のツール
第7章 オープンハードウェア
第8章 巨大産業を作り替える
第9章 オープンオーガニゼーション
第10章 メイカーズの資金調達
第11章 メイカービジネス
第12章 クラウド・ファクトリー
第13章 DIYバイオロジー


3Dプリンターの普及による次世代を描いた本。

ソフトウェアの世界でオープンソース化が起きたように、今度はハードウェアの世界でオープンソース化(オープンハードウェア)が起きると予見しています。

思いついたアイディアをCADなどのデジタルツールで設計し、最近話題の3Dプリンタで試作品を作りフィードバックを行い、SNSなどを通じて賛同者を募り、そこで製品を気に入った人から資金を集めて会社を起こしていく。これによってスタートアップの障壁は一段と低くなり、新たに多くの企業が花開く新しいものづくりのあり方が描かれています。


実用ベースでどこまで作れるのかはまだまだ未知数ですが、少なくとも趣味ベースではとっても面白い未来がまってそうです。

2012年11月4日日曜日

「枯れた技術の水平思考」とは何か?

第1章 横井軍平の「ものづくり」
第2章 <バーチャルボーイ>とは何だったのか
第3章 偉大なる「すきま産業」

任天堂でゲームボーイとかバーチャルボーイとか開発した人であり枯れた技術の水平思考という言葉で有名な方です。本書は彼のインタビューを追いながら、彼のゲーム開発の哲学を追求することを目的としています。

ざっくりと説明してしまうと、枯れた技術とは、世の中に広く流通し、安価に応用出来る技術のことです。一方、水平思考とはそれを普通の人が思ってもいなかった使い方に流用することです。

例えば、枯れた技術の水平思考の適用例として、ゲーム&ウォッチを挙げることができます。

ゲーム&ウォッチは電卓の技術を利用して作られています。発売当初に最先端の技術を駆使して開発された電卓は、40万円以上もしましたが、やがて時が立つにつれコモディティ化が進み、その頃には数千円で購入できるようになっていました。横井氏は、出張中に電卓を叩いて遊んでいるサラリーマンを見かけ、それをゲームとして再利用することを思いつきました。


彼は娯楽を安価な値段で提供するために、コストの安い枯れた技術を使用することに哲学を持っていました。そんな横井氏は、今の最新技術を求めてゲームを作る風潮をこう表現しています


いまのゲームは松茸とフォアグラで餃子を作っているようなもんですね。

ゲームは娯楽(餃子)で安くないと買ってもらえないから、高価な技術(松茸とフォアグラ)でつくるなんて矛盾してるよ、とウィットな表現で問題提起をしています。確かにちょっと前にはSONYがPS3を5万円と、当時の相場を大きく越える価格設定をしたために普及の妨げになりました。昨今でも任天堂が3DSを高価格で販売したために売上不振に陥り、わずか半年で異例の値下げに踏み切ったのは記憶にあたらしいところでしょう。

また本書を読んでいると、枯れた技術を利用しているのはコスト観点からだけではないような気がしています。横井氏は主体的に遊べる、素朴な、創造的なゲームを追求しているようで、それが次のような発言に表れています。


TVというのはあくまでも情報機器であってクリアなほうがいい。
けれど遊びというものには、それは必要ないんです。
もっと想像の世界があったほうが膨らみがあるということを感じますね
ゲームを考えるときに、まずは◯とか■でどういうことをしたら面白いか考えるわけですよ。次のその映像を何に置き換えるかという時にどうしたら、それを説明書なしに理解できるかという How To Playをキャラクターに置き換えるのです。それが本来のゲームの姿なんですよ。


彼はもともとウルトラハンドやラブテスターなどTVゲーム以前の素朴な技術を使っておもちゃを作ってた人でした。なのでTVゲームと言えどもグラフィックがきらびやかなだけのゲームは好まないのでしょう。

最近のゲームはオンラインゲームやソーシャルゲームに代表されるように、本能的な刺激にボタンを押すだけのゲームが多くなっています。主体的に遊ぶゲームと言うよりは、もはやパチンコやパチスロといったジャンルに近いです。

いい悪いは別として、彼の望んでいる方向とはまったく逆の方向にゲームは進化し続けています。どちらかといえば古き良き任天堂のゲームが好きな私としては彼の早い死を惜しく思ったりします。

2012年10月12日金曜日

jquery mobileのreadyとpageinitイベント〜その1

jquery mobileのページ初期化イベントを発行するpageinit。これは単にjqueryのreadyに相当するのかと思っていたのですが、どうやらそうではない様子。

jquery mobileの公式ページによるとreadyとpageinitについてこんな記述があります。


Important: Use $(document).bind('pageinit'), not $(document).ready()The first thing you learn in jQuery is to call code inside the $(document).ready()function so everything will execute as soon as the DOM is loaded. However, in jQuery Mobile, Ajax is used to load the contents of each page into the DOM as you navigate, and the DOM ready handler only executes for the first page. To execute code whenever a new page is loaded and created, you can bind to the pageinit event. This event is explained in detail at the bottom of this page.


なので、安直にjqueryで$(document).ready()としていたところを$(document).bind('pageinit')とすればいいのかと思ってましたが、やってみるとそれではうまくいきません。たとえばclickイベントをbindする処理。

pageinitイベントは<div data-role='page'>で指定したページが初期化されるときに呼ばれるので、$(document).bind('pageinit')にしてしまうと、初めてページ遷移するときに必ず呼ばれてしまいます。

例えば次のようにページを2つ遷移させたあとにあるlabelにclickイベントをbindする処理では、labelを開くまでに3回bindが実行されてしまうので、labelをclickした時に3回分だけalertが実行されることになります。

 <script type="text/javascript">

$(document).bind('pageinit',function() {

     $('label').live("click",
             function(){
                  alert("clicked!");
             }
     );
});
</script>
</head> 
<body>
  <div data-role="page" data-theme="b" id="page1">
     <div data-role="content" id="page_word_list_content">
      <a href="#page2">to page2<a> 
    </div>
  </div>
  <div data-role="page" data-theme="b" id="page2">
    <div data-role="content" id="page_word_list_content">
      <a href="#page3">to page3</a>
    </div>
  </div>
  <div data-role="page" data-theme="b" id="page3">
    <div data-role="content" id="page_word_list_content">
      <label>click me!
    </div>
   </div>
</body>




なので、pageinitイベントはあくまでもdata-role="page"の初期化相当に限り、イベントハンドラの登録処理などは相変わらず$(document).readyを利用して記述するのがよさそうです。

まあ考えてみれば当たり前なんですが、公式のドキュメントで


Important: Use $(document).bind('pageinit'), not $(document).ready()

なんて言われちゃうとreadyイベント自体を使っちゃいけないのかな、なんて気になっちゃいますよね。

2012年10月11日木曜日

中国人エリートは日本をこう見る

プロローグ 実は小泉元首相は人気がある?

第1章 中国人はなぜ日本が好きなのか
第2章 日本はとても居心地がいい国
第3章 日本企業は人材をじっくり育ててくれる
第4章 でも、日本人の仕事は細かすぎて…
第5章 「日本人は幸せだ」と思えるこれだけの理由
第6章 やっぱり不思議な日本人の性格と行動
第7章 日本人が見ているのは「昔の中国人」です

エピローグ 隣国という関係は永遠に続く

本書は著者が、中国人エリートと会話した内容を元に作られているるようです。
中国の国内外のトップ大学を卒業し、華々しく活躍している20~30代の中国人が日本を
どのように見ているか。


同世代の私としては非常に興味深く読ませていただきました。

本書を手に取る前からも、各所では実は中国人は日本を評価している、といったような
話は聞いたことがありました。でも、そんなの30年くらい前の過去の日本のイメージですごいとおもってるだけでしょ、今の実態を知ったらそんなこといわないでしょ、なんて思ってましたが本書を読むとそうでもなさそうです。


「今は中国が世界中から注目を集めていますが、それはつい最近のこと。日本の電車の正確なダイヤ、落ち着いていていつも綺麗な服装で街をあるく人々。来日して社会の成熟度とか民度とかいう点でも中国は日本には絶対にかなわないなと実感しました。少なくともあと何十年かは追いつくのは無理だとおもいました」

「私達の生活は以前に比べれば良くなっていますが、日本に旅行をしたことがある人は日本との桁違いの生活レベルの差を実感しているはず。だから日本を抜いて第二位だと言われてもなんとも思いません。むしろ恥ずかしくなるくらい。どんなに経済成長してもこの汚い空気と安全かどうかもわからない食べ物を心配しながら食べてる私達の姿を想像してみて下さい。」

なるほど。日本の生活レベルはまだまだ高いとのこと。
そしてこれに加えて日本を羨ましく感じるいくつかのエピソードが紹介されています。

「日本では能力されあれば、外国人でも日本人と対等に仕事ができるし、日本の法律に則って日本で起業することもできます。でも中国ではどんなことでもすべてが濃い『人間関係』で決まるんです」

「自分の能力次第で誰に頼らずとも道を切り開いていける。強いコネがなくとも純粋に仕事を頑張っていればある程度は出世の道がひらける。他人とフラットな付き合いをしていれば普通に生活ができる。そんな日本が羨ましい。日本人は本当に幸せだと思います」

中国はコネ社会なため、何をするにもコネが必要になるととか。コンサートのチケットを買うのにも、仕事を回してもらうにも何をするにも日頃のお付き合いが重視されそれがかなりのストレスになるとのこと。本の中で日本がシステマティックとか効率的とか言われてたりしますが、正直、毎日のように日本組織の非効率性がパッシングされていることを思い出すと、非常に違和感のある褒め言葉です。

日本のシステムは非効率で全くいいところなし。いろんなところでこんな言われ方をしています。確かに、これは事実なのかもしれませんが、冷静に周りを見渡せばまだ機能してる方のシステムに分類できるのかもしれません。

また書籍の中ではここでも引用させていたように、たくさんの中国人エリートのコメントが載せられています。コメントは洞察が深く、彼らの教養の深さを感じさせられました。三島由紀夫の著作についてコメントをしてる方もいたりして、正直そんな本まで読んでるのかと感心させられます。

グローバル・グローバルと巷間騒がれてますが、世界がもっとフラットになったら彼らとガチンコバトルがスタートするんですよね。もう負けちゃいそうです。

タイトルにもあるように、本書は若手中国人エース達が見ている日本と中国についてのありのままが書かれています。中国について少しでも興味のある方は手にとって読んでみる価値のあると思います

2012年10月7日日曜日

実行中プロセスをhtmlで出力するpower shellスクリプト





powershellにはConvertTo-Htmlというhtml変換のためのコマンドレットが標準提供されています。

デフォルトの形式のままでもtableタグを使って表形式で表示されているのですが、見た目的にあまりにシンプルで味気ないので、テーブルをzebraで表示するスクリプトを書いてみました。


$a = Get-Process | ConvertTo-Html -Title "Process Table" -Body "<h2>Current Running Processes</h2>"
$red = $true

for($i = 0; $i -le $a.length; $i++){
    if($a[$i] -like "*<tr>*</tr>"){
        if($red){
            $a[$i].replace("<tr>","<tr bgcolor=FF8C00>")
            $red = $false;
         }else{
            $a[$i].replace("<tr>","<tr bgcolor=FFE4C4>")
            $red = $true;
         }         
     }else{
        $a[$i]
     }
}
出力されるHTMLはこちら

2012年10月3日水曜日

powershellでスクリプト実行を許可する方法


powershellはデフォルトで全スクリプト実行がoffになっているようだ。

ローカルにあるスクリプトだけ実行できるようにコマンドをうつ(もちろんpowershellで)


PS C:¥develp>Set-ExecutionPolicy RemoteSigned

今の設定を確認するコマンドGet-ExecutionPolicyをうって設定が反映されていることを確認する

PS C:¥develp>Get-ExecutionPolicy
RemoteSigned

なお、スクリプトの許可権限は以下の4つがある。


  1. Restricted すべてのスクリプトが実行禁止。PowerShellインストール直後のデフォルト設定
  2. AllSigned 署名されているスクリプトのみが実行可能。署名されていないスクリプトは実行禁止
  3. RemoteSigned ローカルに保存されているスクリプトは実行可能。インターネットからダウンロードしたスクリプト(非ローカルのスクリプト)は、署名されているもののみが実行可能
  4. Unrestricted すべてのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、実行するかどうかが確認されるので、ユーザーが明示的に許可した場合のみ実行される

2012年9月9日日曜日

chrome extensionからのform submit


Chromeの拡張を使って、開いているWebページのformをsubmitしたくて色々調べていました。

結論からいうと、とりあえずできなかった。

やろうとしてたのはこんな検索formのwebサイト。

まず調査したこと。

Q1. Chrome拡張から表示しているサイトのjavascriptを実行できるのか?
A1. できない

残念。

Q2. Chrome拡張から表示しているサイトのDOMを操作できるのか?
A2. できる。

おお!

content scriptというのを使うとできるらしい。

content scriptでできることできないこと。

できること。
  • linkされていないURLを探し出し、hyperlinkに変換する
  • フォントサイズを大きくする
  • DOM操作


できないこと。
  • chrome.* APIの利用(chrome.extensionは利用できる)
  • 拡張で定義されたjavascript関数や変数の利用
  • Webページや他のcontent scriptで定義したjavascript関数や変数の利用

dom操作ができるということで、document.forms['fname'].submit();とかdocument.getElementByName('fname')とかでsubmit出来ないかと次いで調べてみた。

調べたところ、どうやら、そもそも<form>要素のなかで<input type="submit">を定義してしまうと、<form>の外からsubmitが出来ないようだ。

具体的なコードを示して説明する。
下記のようなコードだと、submitされなかった(/foo/barにページ遷移されなかった)
submit


しかし、次のように<input type="submit">をなくすと、きちんとsubmitされた(/foo/barにページ遷移された)
submit


操作したかったページには<input type="submit">が定義されているので、dom操作でsubmitするのは無理そう。

なんか他にないだろうか。











2012年7月9日月曜日

Address already in useとなったときの対処法[Mac/Eclipse/GAE]


Eclipseのアプリケーションサーバを停止できなくなったときの対処法。

EclipseでGAE開発とかしていると、アプリケーションサーバが異常終了するときがあります。

その際Eclipse上では停止しているように見えるけど、実際にはポートがlistenになっていて、新規に立ち上げることも停止することも出来なくなります。


そのような挙動になったときの対処法を備忘録として残しておきます。

使ってるポート番号が8080の場合で説明します。

1. ポートを利用しているプログラムのPIDを調べる

%>lsof -i:8080

するとこんな結果が返ってくる。

COMMAND  PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Python  1592 admin    7u  IPv4 ********      0t0  TCP localhost:http-alt (LISTEN)

PIDの所をみると1592と書いてあり、これによりプロセスID(PID)が1592とわかる。


2.プロセスを殺す

%>kill 1592

プロセスが死んだので、listen状態のポートも解放される。

これでEclipseからアプリケーションサーバが立ち上がるようになります。

2012年4月15日日曜日

フォロワーさんのTwitterクライアントを表示するアプリ

フォロワーさんのTwitterクライアントを表示するアプリを作ってみました。

ソースはここアプリはここ

Twitter4jとGoogle Apps EngineとjQuery Mobile使いました。

まず認証部分。
Twitter4Jを使って、ユーザにアプリを承認させます。
ユーザさんが承認してくれるとgetOAuthRequestTokenの引数で指定したコールバックに指定した画面へかえってくる。


 private void doOAuth(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {

  Twitter twitter = (new TwitterFactory()).getInstance();

  try {

   RequestToken reqToken = twitter
   .getOAuthRequestToken(req.getRequestURL() + "?" + QUERY_MODE + "=" + QUERY_CALLBACK);
   HttpSession session = req.getSession();
   session.setAttribute(SESSION_REQUEST_TOKEN, reqToken);
   resp.sendRedirect(reqToken.getAuthenticationURL());
  } catch (TwitterException e) {
   Logger logger = Logger.getLogger(this.getClass().getName());
   logger.warning(e.getMessage());
  }

 }
そしてコールバックされてきたときの処理。

ここでさっきセッション中に保存したRequest TokenとTwitterから返されたVerifierを使ってAccess Tokenを取得しにいく。

 private void doCallBack(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {

  HttpSession session = req.getSession();
  AccessToken accessToken = null;
  accessToken = (AccessToken)session.getAttribute(SESSION_ACCESS_TOKEN);

  // in case of already having access token
  if(accessToken != null){
   doWriteHTML(req, resp);
  }else{
   Twitter twitter = (new TwitterFactory()).getInstance();

   String verifier = req.getParameter(SESSION_AUTH_VERIFIER);

   try {
    accessToken = twitter.getOAuthAccessToken((RequestToken) session
      .getAttribute(SESSION_REQUEST_TOKEN), verifier);
   } catch (TwitterException e) {
    Logger logger = Logger.getLogger(this.getClass().getName());
    logger.warning(e.getMessage());
   }

   if (accessToken != null) {
    session.setAttribute(SESSION_ACCESS_TOKEN, accessToken);
    session.removeAttribute(SESSION_REQUEST_TOKEN);
    doWriteHTML(req, resp);

   } else {
    resp.setContentType("text/plain");
   }
  }
 }
無事取得できた後は画面表示のためのHTMLを動的に生成していく

まずフォロワーさん一覧を取得するためにgetFriendsIDs()を呼び出す。
その後そのフォロワーさんのステータスを取得するためにlookupUsers()を呼び出す。
Twitter利用者の使ってるクライアントソフト名はStatusクラスのsorceというプロパティに入ってるので、
User->Status->Sourceとたどっていくことで欲しい情報がとれます。
 private void writeBodyContentList(HttpServletRequest req, HttpServletResponse resp)throws IOException
 {
  HttpSession session = req.getSession();
  Twitter twitter = TwitterFactory.getSingleton();

  AccessToken token = (AccessToken) session
    .getAttribute(SESSION_ACCESS_TOKEN);
  if (token == null) {
   logger.warning("access token missing!");
  }

  twitter.setOAuthAccessToken(token);
  try {
   IDs ids = twitter.getFriendsIDs(-1);
   long[] friendIds = ids.getIDs();
   ResponseList userList = twitter.lookupUsers(friendIds);

   for (User user : userList) {
    String name = user.getName();
    URL imageURL = user.getProfileImageURL();

    resp.getWriter().print("<li>");
    resp.getWriter().print("<img src='http://");
    resp.getWriter().print(imageURL.getHost());
    resp.getWriter().print(imageURL.getPath());
    resp.getWriter().print("'/>");

    resp.getWriter().print(name);

    String source = user.getStatus().getSource();
    // composing a <a> tag, since when the source is "web", API return <a> tag.
    if ("web".equals(source)) {
     source = "<a href = http://twitter.com>web</a>";
    }
    resp.getWriter().println(source);
    resp.getWriter().println("</li>");
   }

  } catch (TwitterException e) {
   resp.getWriter().println(e);
  }
 }

2012年3月21日水曜日

Twitter Clientライクな可変長UITableViewCell

Twitterクライアントでよく見る可変長のUITableViewCellを作成してみました。(ソース)

ざっくりと調べたところ、UILabelを用いると簡単に実装できるみたいなんですが、これの問題点はhrefなどのリンクが使えないところ。

僕のよく使ってるechofonなんかは、aタグだけじゃなく@XXXXとかもリンクで飛べる実装にしているみたいなので、これも視野に入れて実装してみたいな、と。

で作ってみた。





実装は大まかに以下のよう。


1.tableView:heightForRowAtIndexPathにとりあえずの高さ100.0を返す。

2.tableView:cellForRowAtIndexPathでUITableViewCellを作成する。高さ1のUIWebViewを作成し、loadHTMLStringでテキストを読ませておく。

3.tableViewをreloadするためにタイマーをセット

4.再度、tableView:heightForRowAtIndexPathが呼ばれるのでUIWebView.scrollView.contentSize.heightによりテキスト表示に必要な高さを取得し、呼び出しもとに返す。

5.UIWebViewのdrawRectも呼ばれるので、高さを再調整。
ソースコードの概要を説明していきます。


詳細はgithubみてください。



まずはUITableViewController

@implementation VHTableViewController
{
// 省略
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    int row = [indexPath row];
    
    VHTableViewCell *cell = [cellDict objectForKey:[NSNumber numberWithInt:row]];
    if(cell == nil){
        cell = [[VHTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil index:[indexPath row]];
        // 一度作ったセルを覚えておく
        [cellDict setObject:cell forKey:[NSNumber numberWithInt:[indexPath row]]];
        // 3秒後にtableViewをリロードするようにタイマーをセット。
        // タイマーにしておくと、連続して再描画要求が来たときもOSがいい感じにはしょってくれてる。
        [self setTableReloadTimer];
    } 
    return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    int row = [indexPath row];
    VHTableViewCell *cell = [cellDict objectForKey:[NSNumber numberWithInt:row]];
    if(cell == nil){// はじめに呼ばれた場合
        return 100.0;
    }
    // 二回目以降は必要な高さ
    return cell.webView.scrollView.contentSize.height;
    
}
// 省略
}
@end

んでUITableViewCell(のサブクラス)のコード 本当はUITableViewCellのサブクラス一個でこれを実現できると、使い回しが相当よかったんだけど、ちょっとやり方思いつかなかった。

高さ可変のセルなんか需要たくさんあるだろうから、apple様に標準提供していただけるとうれしいんだけど、作り的に難しいのかなー。