アーカイブ

‘ITコーディネータ’ カテゴリーのアーカイブ

思いついたらiPadで

2010 年 6 月 9 日 コメントはありません

iPhone の時から使えるんだけど、太い指では肩が凝るだけだった Instaviz というソフトがあります。昔ならナプキンとか裏紙にちょこちょこと書き直しながら、あーでもないこーでもないとメモしていたフローチャートなんかが iPad でストレスなしのレスポンスで指先で作ることができます。このスキィーとした感覚を経験したら、もう元には戻れないですね。

iPad で思いついたことを書き出しといて、Box.net に書き出しといたら後は、コラボでもなんでもお好みのままにで、生産性が上がると良いですね。

eBook が身近だわ

2009 年 11 月 12 日 コメントはありません

Want to read your ebooks on the Kindle, iPhone, or Sony Reader?

なんてことで、最近購入している本の中にもやたらと ebook が増えてきたなー!ファイル形式も PDF だけじゃなくて、epub1 , mobi, iPhone用 等々。

最近は、iPhone 用に STANZA とか O’Reilley バク本を DL2 して、如実に目の筋肉が弱っているのが実感できる日々です。モバイル・ディバイスは iPhone を日常使っているので、Kindle には食指が動かなかったのだけど、今週 Kindle For PC というソフトウェアを提供するということなので、早速 DL してインストールしてみました。先月発売の XBRL 実装がらみの解説本が、Kindle 版として出ているのでチョイス。

XBRL For Dummies (For Dummies (Business & Personal Finance))
この本、ペーパだと ¥2,808 なんだけど、Kindle 版だと $ 17.83 (約1,600円ぐらいかな)でした。

Kindle For PC は複数のPCでインストールして使うことができるので、まあ腰が痛くならないので良いんだけど。epub のコンテンツフォルダーを共有しないと、この前どこ読んでたっけということになるのが目に見えてるし。Evernote にコンテンツフォルダー置いてみようかな。ああ、めんどいやっちゃ。米国の iTunes App Store には、Kindle For iPhone がもう DL できるのに、日本じゃまだ駄目と検索で言われた。はよーしてんか!!!即、乗り換えるし。

  1. オープンな電子書籍ファイルフォーマット規格 []
  2. ダウンロード []

空白[%20]の呪縛

2009 年 10 月 29 日 コメントはありません

NetBeans 上で JavaFX のサンプルプログラムをコンパイルしようとしたら、出ました空白の呪縛が。
例えば、C:/Documents and Settings/purapura とかの文字の間にあるスペース。通常は、%20 に置き換えれば問題ないはずなんだけど、NetBeans の 6.7.1 でも 6.8 Beta でも C: のコロンが文字化けして、コンパイルできない。

ほんでもって、いろいろいじった結果、下記の方法で無事コンパイルできました。同様の躓きを経験されている方はご参考まで。

nbproject フォルダー内の project.properties に main.class=(ソースパッケージ名) を書いておくと、jnlp.codebase.url=file:/c:ぷらぷらなんて自動で付加されて、コンパイルOKでした。

上記の事象は、XP 上の NetBeans で起こりましたが、Vista 上ではきちんと自動で main.class が設定されていました。なんでやねん??

ちなみに JavaFX のサンプルプログラムは、下記の本を参考にしています。

JavaFX in Action: Meap Edition Amazon ではまだ予約のみのようですね。私は、eBook 即入手でした。

リストからFreeMindへ

2009 年 8 月 14 日 コメントはありません

リストから FreeMind へ変換する用途を思いつかないけど(面倒だからね)、昨日の続きとして、こういう方法もあるよということで紹介したいと思います。

FreeMind の mmファイルは、XML 形式なので Groovy で XML を作成してあげれば良いだけです。
例えば、

1
2
3
4
5
6
7
8
9
10
11
12
13
def sw = new StringWriter()
def mm = new groovy.xml.MarkupBuilder(sw)
mm.map(version:'0.9.0'){
    node(TEXT:"Create FreeMind") {
        node(POSITION:"right",TEXT:"Java")
        node(POSITION:"left",TEXT:"Groovy") {
            node(TEXT:"なんじゃ")
            node(TEXT:"もんじゃ")
        }
    }
}
def f = new File("fm_sample.mm")
f.write(sw.toString())

で、こんな感じになります。

fm_sample

fm_sample

簡単だけど、面白くないですよね。リストから groovy ファイルの中に XML 形式 に手動で置きなおしているのがネックですね。上記プログラムリスト内の MarkupBuilder の代わりに StreamingMarkupBuilder と XSLT1 を使って、ネックになる部分を解消できそうですが。 GIS2 とか何か私にとっての用途が出てきたらまた考えましょう。

  1. XMLによって記述された文書を他のXML文書に変換するための簡易言語 []
  2. 地理情報システム []

FreeMindからリストへ

2009 年 8 月 13 日 コメントはありません

FreeMind で「見える化」の一歩目に進んでも

ウェブアプリで、そのデータを再入力なんてことじゃ 泣きますよね。

一度デジタル化したものを再入力なんてことは、『内部統制上のリスク』だと言えば今回の例では超大げさですが、財務データを扱う場合は、そういったプロセスは明らかなリスク要因になります。各人にPCが割り当てられている会社でも、扱う帳票フォーマット、計算式が違うといった理由で、データを印刷してまた必要なデータを入力したりしていませんか?ファイルをもらって必要な個所をコピペ1 していませんか?
こういったことを日常業務の中に空気として持っている会社と、少なくとも財務プロセス上で再入力時間の低減見直しを行った会社との競争力に差がないとお考えになる経営者がいるでしょうか?

話が針小棒大になったかもしれないので、今日のテーマである FreeMind 図形から階層ごとのデータをリストとして取り出して、再入力しなくても良いよねという基礎的な例を上げます。

重要経営課題の選択(製造業版)

重要経営課題の選択(製造業版)

分類図で全体がぱっと見えるようにしたは良いけど、そのデータをリストにして別の属性と結びつけたりしたくなりますよね。今回は、グラフィックな属性は要らなくてデータだけウェブアプリ上で再利用したいケースです。

FreeMind はラッキーなことにXMLファイルなので、前回 Amazon から情報を取り出した方法がまた使えます。

def fm = "重要経営課題の選択(製造業版).mm"
def fmitems = new XmlSlurper().parse(fm)
def count = 0
 
fmitems.node.node.each{
  println it.@TEXT
  count++
}
println "Total number of under_2 node(大分類): ${count}"
println ""
count = 0
fmitems.node.node.node.each{
  println it.@TEXT
  count++
}
println "Total number of under_3 node(中分類): ${count}"
println ""
count = 0
fmitems.node.node.node.node.each{
  println it.@TEXT
  count++
}
println "Total number of under_4 node(小分類): ${count}"

出力は、以下のようなリストになります。
既存事業の転換
売上拡大
製品力・サービス力の強化
スピード経営への転換
Total number of under_2 node(大分類): 4

グローバル化への対応
低コスト経営への転換
高付加価値事業の確立
環境経営の強化
外部経営資源との連携・活用
リスク管理の強化
新しい市場、新製品への事業展開
新規顧客開拓
顧客維持の強化
企業ブランド・イメージの強化
品質経営の強化
新製品・新サービスの開発
開発期間の短縮
物件納期の短縮
製造リードタイムの短縮

電子調達への対応
Total number of under_3 node(中分類): 17

製造拠点の再配置(海外移転含む)
量産型事業から受注型事業への転換
多品種・少量・短納期対応
安価な海外商品の輸入
原価企画、製品原価・プロジェクト原価の把握
開発コスト低減
製品ライフサイクルコスト低減
製造原価低減のための製造技術開発
購入資材価格の低減
海外資材調達
在庫圧縮
新しい顧客サービスの提案
高付加価値製品・新サービスの開発
新製品の損益分岐点到達期間短縮
ISO14000取得
環境ビジネスへの進出
コーディネート企業連合の実現
アウトソーシング
産学連携の実現
成功したリスク対策処理
納期・予算を満たしたプロジェクト
新流通チャンネルの確立
インターネット・マーケティング
インターネットによる情報提供
提案営業
新規顧客の獲得
製品サポートデータの提供
サービスパーツの円滑な供給
顧客問合せ・問題提起への迅速な対応
見積回答の迅速化
クレームへの迅速な対応
顧客満足度の測定
顧客ニーズの把握
ISO9000/ISO14000取得
市場における評価
トレーサビリティの確立
ISO9000取得
品質改善に寄与する新製造技術の開発
工程不良の低減
改善活動のデータによる管理
トレーサビリティの確立
新製品・新サービス開発
新製品のための基礎技術開発
新製品のための新製造技術開発
産学連携の実現
再設計・試作回数の低減
技術・製造ノウハウ共有
社内外情報の迅速な検索
生産開始までの時間短縮
プロジェクト所要時間の短縮
再設計・再加工の低減
検査・調整時間の短縮
製造リードタイム日数短縮
一個作り生産への切り替え
納期短縮に寄与する新製造技術の開発
製造納期遵守率の向上
資材欠品による納期遅延件数低減
納期・仕様変更への対応時間短縮
需要予測の精度アップ
見込みまとめ生産から多品種・少量生産へ
適正在庫の設定と不良在庫発生額低減
納期遵守率の向上
SCM対応資材調達方式への転換
サプライヤーの選別・集約化と新規開拓
サプライヤーの納期短縮・納入条件改善度
物流の整備・合理化
発注先のEDI化率
受注先のEDI化率
社内システムとEDIの連結
Total number of under_4 node(小分類): 69

これを使ってどんなウェブアプリになるかは、またの機会に!!!

その前に、ウェブ上の階層リストから FreeMind に描く方法を考えないと片手落ちですね。

  1. コピー、ペースト []

当たりマエダの行動

2009 年 8 月 12 日 コメントはありません

グーグルに依存し、アマゾンを真似るバカ企業 (幻冬舎新書) 画像だけだと寂しいですか?

西川ヘレンさんもクリックて何?とCMしている「クリック」です。チャハ!

本の内容は、あと 5か月で還暦を迎える私にとって耳の痛い話が多いですが、下記については同意します。
世の経営者の皆様にも当たり前だの行動として取り組んで頂く空気になって欲しいものです。

ウェブビジネスというのは、組織的に、何か新たなディレクションを出そうといった、会社全体のストラテジーの話なのだ。

ビジネスプロセスをはっきりさせ、その目標を達成するのに必要な IT の達成目標もご提示するのが、ITコーディネータの役割なのです。

Amazon Product Adv. API でもう少し

2009 年 8 月 1 日 コメントはありません

先日、Amazon Product Advertisng API の Java コマンドタイプのサンプルを Grails で動かしてみようと ItemLookup のサービスとコントローラ、ドメイン、ビューを作ったのですが、今朝からもう少し進めて ItemSearch のコントローラ、ビューを作ってみました。ドメインはデータ保存しないので今のところ必要ないかな。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  ItemSearch-Keywords で Book名を入手 とりあえず。
 *
 */
 
package com.yuruyakana
 
import com.amazon.advertising.api.sample.SignedRequestsHelper
import org.codehaus.groovy.grails.commons.*
import net.sf.ehcache.Element
 
class AmazonItemSearchService {
 
    boolean transactional = false
 
    String AWS_ACCESS_KEY_ID
    String ASSOCIATE_TAG
    String AWS_SECRET_KEY
    String ENDPOINT
 
    def getItemSearch(searchIndex, keyword) {
        /* Set up the signed requests helper */
        SignedRequestsHelper helper
 
        try {
            helper = SignedRequestsHelper.getInstance(ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_KEY)
        } catch(Exception e) {
            log.error "Problem communicating with SignedRequestsHelper: ${e.message}", e
            return
        }
 
        String requestUrl = null
        String titles = "_"
        String author = null
        String imageUrl = null
        String price = null
        String totalresults = null
 
        // map形式
        println "Map form example:"
        Map params = new HashMap()
        params.put("Service", "AWSECommerceService")
        params.put("Operation", "ItemSearch")
        params.put("AWSAccessKeyId", AWS_ACCESS_KEY_ID)
        params.put("AssociateTag", ASSOCIATE_TAG)
        params.put("SearchIndex", searchIndex)
        params.put("Keywords", keyword)
        /** こっちの方が良いわな
        def params = ['Service':'AWSECommerceService',
	              'Operation':'ItemSearch',
	              'AWSAccessKeyId':'AWS_ACCESS_KEY_ID',
	              'AssociateTag':'ASSOCIATE_TAG',
	              'ResponseGroup':'Medium']
    */
        requestUrl = helper.sign(params)
 
        // XML構文解析
        def uri = requestUrl.toURI().toString()
 
        def ItemSearchResponse = new XmlSlurper().parse(uri)
 
        println "Total Results: " + ItemSearchResponse.Items.TotalResults
        //println "Total Pages: " + ItemSearchResponse.Items.TotalPages
 
        ItemSearchResponse.Items.Item.ItemAttributes.Title.each{
            // リストをコントローラに渡す方法思いつかなかったのでアンダー
      //  スコアで芋づるにしちゃいました。
            titles = titles + "_" + it
        }
 
        //println "ITEM Author: " + ItemSearchResponse.Items.Item.ItemAttributes.Author
        //println "ITEM Medium Image: " + ItemSearchResponse.Items.Item.MediumImage.URL
        //println "ITEM Price: " + ItemSearchResponse.Items.Item.ItemAttributes.ListPrice.FormattedPrice
 
        totalresults = ItemSearchResponse.Items.TotalResults     
 
        def map = [TotalResults:totalresults, Title:titles]
 
        return map
    }
}
 
/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  keyword で Book名リストを入手 とりあえず。
 *
 */
package com.yuruyakana
 
class AmazonItemSearchController {
 
    //def scaffold = AmazonItemSearch
 
    def AmazonItemSearchService
 
    String searchIndex = "Books"
    String keyword = "IT経営"
 
    def index = {
        redirect(action:"search")
    }
 
    def searchFlow = {
 
        // 検索
        search {
            on("doSearch") {
 
                def amazonBook = amazonItemSearchService.getItemSearch(searchIndex, keyword)
                /**
                 * サービスからの戻り値を配列で渡す方法分からないので、リストをアンダー
                 * </code><code>スコアでつないで</code><code>マップで渡して、ここでまたスプリットにかけています。
                 * Groovy の each メソッドはすごい。
                */
                amazonBook.Title.splitEachLine("_") {titles-&gt;
                    titles.each{
                        //println it
                        //render(view:'search', model:[keyword:keyword, Title:titles])
                    }
                    ["keyword":keyword, "Title":titles]
                }
            }.to "search"
        }
        // 詳細
        displayDetail {
            on("search"){
 
            }.to "search"
        }
    }
}

ビューはこんな感じ。

AmazonItemLookup Sample

AmazonItemLookup Sample

AmazonItemSearch Sample

AmazonItemSearch Sample

さて、次は何をしましょうか?
カートを付けて、plugin とか、GAE 上で実験してみるとか?

イノベーションが面白い時代

2009 年 7 月 29 日 コメントはありません

ハイブリッド車みたいなかったるいことふっ飛ばして、早く安い電気自動車出してよという人には不向きかも知れませんが、地道にイノベーションを経営課題にしている向きにとっては、トレンド把握の参考になる本だと思います。

また例によって、目に付いたところを FreeMind に。

The New Age of Innovation

The New Age of Innovation

内容は、国際企業の例が殆どですし、中小企業にとって面白いサービスを始めたと挙げられている CogHead は既にSAP に買収されていてサービス停止しているような新陳代謝の激しいトレンドを物語っているかたちです。

日本の大企業も中は、中小企業の寄せ集めみたいなものですから、効率性と柔軟性のバランスを取りにくい旧態依然のものになっているところが多いでしょうから、イノベーションなんか無理だと諦めず、業務プロセス中心に競争優位になる機会を増やすことにチャレンジして欲しいものです。なにせ十羽一絡げのお客から、個別の顧客とサービスを練り上げていく時代が IT経営で可能になってきたのですから。イノベーションが面白い時代です。

Product Advertising API を使わないと

2009 年 7 月 22 日 コメントはありません

先週【重要・あと30日です】メールなんてことで、Amazon アソシエイト Web サービスが 8月15日以降使えないそうなので、先日の[gTunes] も amazon-a2s-2007-10-29-java-library を使っている関係上、署名認証の機能を含めないと動かなくなりますね。動かないと面白くないので、少し連休中に勉強しました。
ここ から Amazon の Java Sample をダウンロードしました。詳細な使い方は、付属の README に書かれていますが、コマンド・プロンプトから ant run で 署名認証して、決め打ちの ITEM_ID(ASIN) の ItemLookup から Title が表示されます。早速 NetBeans 6.7、Grails 1.1.1 でプロジェクト名:AmazonBook を作って、Grails 上でも使えるようにしてみました。( ITEM_ID は本以外にも全ての商品が対象のようだから Book でなくてもいいんだけど)

サンプルには、ソースとして SignedRequestsHelper.java と ItemLookupSample.java が提供されているので、SignedRequestsHelper はそのまま、Javaソースパッケージフォルダーにコピー。ItemLookupSample を AmazonItemLookupService.groovy としてサービスフォルダーに作成。
コードは、下記のような感じ。

/**
 * Amazon Product Advertising API を使ったサンプル
 * API Version: 2009-03-31
 *  ASIN で Book名を入手 とりあえず。
 *
 */
package com.yuruyakana

import com.amazon.advertising.api.sample.SignedRequestsHelper
import org.codehaus.groovy.grails.commons.*
import net.sf.ehcache.Element

class AmazonItemLookupService {

    boolean transactional = false
    String AWS_ACCESS_KEY_ID
    String AWS_SECRET_KEY
    String ENDPOINT
    //def titleAuthCache

    def getItemLook(ITEM_ID) {
        /* Set up the signed requests helper */
       SignedRequestsHelper helper

        try {
            helper = SignedRequestsHelper.getInstance(ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_KEY)
        } catch(Exception e) {
            log.error "Problem communicating with SignedRequestsHelper: ${e.message}", e
            //e.printStackTrace();
            return;
        }

        String requestUrl = null
        String title = null

        // map形式
        println "Map form example:"
        Map params = new HashMap()
        params.put("Service", "AWSECommerceService")
        params.put("Version", "2009-03-31")
        params.put("Operation", "ItemLookup")
        params.put("ItemId", ITEM_ID)
        params.put("ResponseGroup", "Small")

        requestUrl = helper.sign(params)
        println "Signed Request is " + requestUrl

        // XML構文解析
        def uri = requestUrl.toURI().toString()
        //def xml = requestUrl.toURL().text
        println "Response URI: " + uri
        //println "Response XML: " + xml
  // URLだと日本語でEND-Tagで文字化けしてエラーになるので、URIを取得してParseすることでOK。
        def ItemLookupResponse = new XmlSlurper().parse(uri)
        //def ItemLookupResponse = new XmlSlurper().parseText(xml)

        println "ITEM Title: " + ItemLookupResponse.Items.Item.ItemAttributes.Title
        println "ITEM Author: " + ItemLookupResponse.Items.Item.ItemAttributes.Author
    }
}

変更したところは、概ね以下の3点:

  1. AWS_ACCESS_KEY_ID、AWS_SECRET_KEY、ENDPOINT を Config.groovy にbeans として
    移行。ENDPOINT は別に移動しなくても6か所ほど選択できるようなので、DOMAINで選択できるよう
    にしておいても良いですね。
  2. Controller 側で上記 Service のgetItemLook(ITEM_ID) を呼び出したこと。
  3. XML 構文解析を Java の DocumentBuilder から Groovy の XmlSlurper にしたこと。
    • toURL() メソッドは、URL 内で使用できないエスケープ文字は自動的に変換できないので
      非推奨になっています。

今回は、XMLの階層全て書いてタイトル表示しているので、スマートじゃないけど動作確認できたので まっ、いいか。

ITEM_ID で検索するのは実用的じゃないので、ITEMSearch 作って domain と View を今度作れればいいですね。

iTunes の Library をデータベースに

2009 年 7 月 8 日 コメントはありません

先週末、久しぶりに下記の本の AJAX の章を読んでいたのですが、[gTunes] という Grails App のサンプルを使う上で自分の iTunes の Music Library(xmlファイル)をサンプルアプリに読み込むためのGroovyスクリプトが、ソースコードとして提供されています。
The Definitive Guide to Grails (Expert's Voice in Web Development)

そのままじゃ動かなかったので、同じような経験された方がいるかどうか分かりませんが、少し変更したらきちんと、MySQLデータベースに artist 名が登録されました。
変更した箇所は、

def artists = handler.artists.values().findAll { it.albums?.artist } を

def artists = handler.artists.values() に。

else if(songProps && qName == ‘dict’) { を

else if(songProps && qName == ‘/dict’) { に。

Album クラスはmap で値をきちんと取れているのですが、データベース登録はエラーになるのはどうしてでしょうかね。
時間ができたらまたチャレンジしてみます。

NetBeans で Grails コマンドが使えるので便利ですよ。