サッカー・アジア杯優勝おめでとう

サッカー日本代表、アジア杯優勝おめでとうございます!


実はテレビ中継は見てません。最近忙しくて寝不足気味だったので、起きれませんでした。
と、右のカレンダー見たら、このブログもほとんど更新してませんね。


今日は、新しいシステムでRailsを採用してとても楽できた、という夢を見ました。
あと車の改造を依頼されて(なんでじゃ)、オリジナルの外装を採用したら顧客からダメ出しされた夢も見ました。


夢の中が仕事漬け。。。疲れてるなぁ。

タブレット機で電話したい

こんばんは。


タブレット機(iPadGalaxy Tabなど)で電話したい」と言うと、たいてい怪訝な顔をされるか、スルーされて反応がありません。
彼らの頭の中にはバカでかいタブレット機を、枕のように横顔にあてて歩きながら電話する私の姿が思い浮かぶのでしょう。僕だって街中でそんなことはしないと思います。それがマイク付きイヤホンを使ってるとしてもあまり変わりません。


そうではなくて、テレビ電話またはボイスポイントとして、仕事や家族で使いたいという意味です。


iPadを持ってる人は体験済みの人が多いと思いますが、2〜4人でiPadを使うのはかなり勝手がいいのです。用途がゲーム、静止画、動画、ツールのいずれであっても、操作してる人の横や後ろから人が覗き込んでちゃんと場に入り込めます。
また一人で使う場合も、Webブラウズなりゲームなどにおいて自然に(苦労せずに)コンテンツが目に入ってくる画面サイズでもあります。

そう、タブレット機は少人数の場を作ることができるデバイス、あまり不自由なくゆったり使えるデバイスなのです。*1


そんなタブレット機にカメラと通話機能がついたら、こちら側の2〜4人と遠隔地の2〜4人がコミュニケーションを取れるのです。
楽しいと思いませんか?私は楽しいと思います。


今でもテレビ会議システムを整えればできますが、鞄の中に入れて運ぶのは至難の業だし、高価です。でもタブレット機なら、たった数万円の、持ち運びに便利なデバイスでできるし、さらにそのデバイスは拡張性に富み、他の用途にも利用できるのです。


というわけで、iPad 2が発売されたら購入しようかどうか悩んでいるuzakadeuなのでした。

*1:その点iPhoneはあくまで個人が一人で移動中に使うデバイスだと思います。

MacでClang(ARM用)

昨日Mac OS X 10.6.5上でClangを使って、Intel x86用のコンパイルを行いました。


今日はMac OS X 10.6.5上でClangを使って、iOS 3.0以上&ARM Cortex-A8用のコンパイルを行います。
手探りでコンパイルできた状況をメモと残したものです。ARMアセンブリは昨日始めたばかりだし、実機上で動作確認できないので、間違ってる可能性大です。そのつもりでご覧下さい。


まずGCCコンパイルする方法です。

$ /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2.1 -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/include/ -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib -mcpu=cortex-a8 -miphoneos-version-min=3.0 hello.c -O3

生成する中間アセンブリ言語ソースはこんな感じです。_putsをコールするためのベニアが生成されています。

        .cstring
        .align 2
LC0:
        .ascii "Hello world\0"
        .text
        .align 2
        .globl _main
        .thumb
        .thumb_func _main
_main:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        push    {r7, lr}
        add     r7, sp, #0
        ldr     r0, L4
L2:
        add     r0, pc
        blx     L_puts$stub
        movs    r0, #0
        pop     {r7, pc}
        .p2align 2
L5:
        .align 2
L4:
        .long   LC0-4-(L2)
        .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
        .align 2
        .code 32
L_puts$stub:
        .indirect_symbol _puts
        ldr     ip, L_puts$slp
L1$scv: add     ip, pc, ip
        ldr     pc, [ip, #0]
L_puts$slp:
        .long   L_puts$lazy_ptr - (L1$scv + 8)
        .lazy_symbol_pointer
L_puts$lazy_ptr:
        .indirect_symbol        _puts
        .long   dyld_stub_binding_helper
        .subsections_via_symbols


次にClangでコンパイルする方法です。

$ /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/include/ -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib -arch armv7 -mcpu=cortex-a8 -miphoneos-version-min=3.0 hello.c -O3

生成する中間アセンブリ言語ソースはこんな感じです。_pusをコールするためのベニアが生成されてません。

        .globl  _main
        .align  2
        .code   16
        .thumb_func     _main
_main:
        push    {r7, lr}
        ldr.n   r0, LCPI0_0
        mov     r7, sp
        
LPC0_0:
        add     r0, pc
        blx     _puts
        movs    r0, #0
        mov     sp, r7
        pop     {r7, pc}
        .align  2
LCPI0_0:
        .long   _str-(LPC0_0+4)
         

        .section        __TEXT,__cstring,cstring_literals
        .align  2
_str:
        .asciz   "Hello world"


気付いた違いをまとめると...

  • ARMの場合、分岐命令で指定できる即値アドレスの範囲が小さいので、必要ならベニアを生成して二段階で分岐する必要があります。GCCアセンブリの出力段階でベニアを生成し、Clangはリンカの配置段階でベニアを生成するようです。
  • GCCの方はSPレジスタをリストアしてません。_puts呼び出し後には上位を含めてSPレジスタを使用しないので、そこまで見越したということかも知れません。


今はお金がないので無理ですが、そのうちiOS Developer Programを購入したら実機で確認したいと思います。


                                    以上です。

MacでClang

Mac OS X 10.6.5でClangを使ってみました。
今なぜClangなのか。私は詳しくないのでこの記事この記事を参考にして下さい。


さてHello world(hello.c)をGCCとClangでそれぞれコンパイルしてみます。

起動方法 内部で起動するプログラム
GCC $ gcc hello.c cc1, as, collect2
Clang $ clang hello.c as, ld


まずGCCが生成するコードを見てみます。

$ gcc hello.c -S -O3
        .cstring
LC0:
        .ascii "Hello world\0"

        .text
        .align 4,0x90
.globl _main
_main:
        pushq   %rbp
        movq    %rsp, %rbp
        leaq    LC0(%rip), %rdi
        call    _puts
        xorl    %eax, %eax
        leave
        ret


次にClangが生成するコードです。

$ clang hello.c -S -O3
        .section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:
        pushq   %rbp
        movq    %rsp, %rbp
        leaq    _str(%rip), %rdi
        callq   _puts
        xorl    %eax, %eax
        popq    %rbp
        ret

        .section        __TEXT,__cstring,cstring_literals
_str:
        .asciz   "Hello world"


ほぼ同じコードを生成しますね。


今回は x86用にコンパイルしましたが、そのうちARM用のコンパイルも試してみようと思います。


                                    以上です。

製品は商いのための道具...という考え方

自分の知能・情熱を余す所なくつぎ込んだ製品を、魂の宿ったアートだと思いたい気持ちが私にはあります。


でもどんなに素晴らしい理想的な製品であっても、人の役に立たないモノは売れません。


人の役に立つモノを適正価格でタイミングよく上手に売ってこそ、商いが成り立ちます。自分の作りたいモノではなく、自分の得意なモノでもなく、ターゲットが欲するモノを提供する必要があります。
そう言う意味で製品は商いのための道具だと言えます。

  • 目的は商いで利益を上げること
  • 目的を実現するための道具が、製品、販売戦略、組織、etc


製品をアートだと考えて悪いわけじゃありません。いろんな考え方があっていいと思います。ただ商いが目的である以上、製品は商いのための道具だと考えるとシンプルになると考えています。


商いは「誰に」「何を」「どうやって」売るかが基本です。他の人との差別化もこの三点を中心に考えます。人の役に立つものを売るからには、「誰に」をまず決めて「何を」「どうやって」売るかを後で考える方が合理的だと思うのです。


                                    以上です。

新製品/新規顧客は敵のいない所で...という考え方

新製品を開発しようと言うと「今までにない画期的な製品」とか「世界で最高の性能/品質」を作りたくなります。

そんな製品を作れたら世界制覇も夢ではないかもしれません。でも、正直なところ、技術的にもリソース的にもそんな製品を作るのは大変です。それに美味しい製品はみんなが参入してきて、収益を保つことは難しそうです。



もちろん「敵のいない所/敵の弱い所」では商売がしやすいので、商品の差別化は必要です。だから技術やリソースが少なくて実現できる差別化を考えだします。


具体的には次のような方法があるかなぁと思います。

  • 商圏を絞る。採算上の都合などで敵がいない地域をターゲットにする。特化することで一番になれる。
  • 商品カテゴリーを絞る。採算上の都合などで敵がいないカテゴリーをターゲットにする。特化することで一番になれる。
  • ライバルとまったく反対の戦略をとる。スーパーの隣にスーパーと品揃えの違う店を出せば、スーパーと競合しないし、スーパーの集客力を利用できる。

敵が多いフィールドで華々しく戦うか、敵のいない所で戦わずに勝つか。

敵と戦うにしてもまず自分を大きくする、武田家や上杉家に対する織田信長のような戦略もあります。



。。。と、昨日の続きで考えてました。


                                    以上です。

難しいですよね、新規開拓営業と新製品開発

きっかけはさておき、主力事業の利益や売り上げが伸び悩むんだり下降すると、主力事業以外を開拓しようということになります。
つまり

  • 現在の顧客の別のニーズを開拓する
  • 新しい顧客を開拓する
  • 新しい製品を開発する

といったことをやろうということになります。


ですが、実際どうやるのかというと難しいですよね


営業員は今の顧客の継続営業で日々手一杯だろうし、技術者も日々の仕事で忙しいから、なかなか余裕がありません。それに通常業務とは求められる技能が違うかもしれません。


かといって、手を打たないと会社の業績が悪くなるのは目に見えています。
だから会社はそこに適切なリソース(人材、資金、しくみ、ツール、etc)をきちんと投入しなくてはなりません。会社というか経営者かな。


。。。と、ある記事を読んで考えてました。


                                    以上です。