kintoneのPromiseを説明できるスキル


以前よりお付き合いさせていただいている株式会社アディエム様(https://adiem.jp/)より、
先日ご依頼を受けたたkintone開発案件は、何重にも入れ子になった多重Promise処理が必要でした。

弊社にてコーディングと単体テストを行い、無事納品にこぎつけられたのですが、
アディエム社の技術者様にもコードの説明を行う必要が生じました。

弊社の代表もPromiseの習得にはかなり手を焼いたのですが、そのスキルを習得できたかの判断基準は、その内容を人に説明できるかどうかです。つまり今回、うまく説明できたかどうかは、弊社代表がPromiseを理解できているかのベンチマークにもなりました。

説明を行った結果、アディエム社の技術者様にPromise処理をご理解していただけたようです。追加の処理を実装し、さらにテストまでも行えるまでになったとか。その結果を以下のようなメッセージでいただきましたのでご紹介します。

先日はコードのレクチャーをありがとうござました。
本日、検索部分のエラーハンドリングを追加し、本番環境にリリース致しました。
負荷テストとして4001件のデータを使用して、正常に更新されることも確認しました。

kintone APIのノーマル呼び出しパターン、kintone promise を使ったパターン、promiseでも thenにresolve, rejectを引き渡すパターン、thenとcatchを書くパターンと、かなりケースの整理が できました。また返値の扱いもデバックすることで理解が進みました。
まだうまく関数化して可読性の良いソースを書く自信はありませんが、長井さんソースを参考にさせて 頂きたいと思います。

以上、ご報告まで。

弊社代表は以前より、kintoneのエバンジェリストとしてサイボウズ社より任命されております。
最近はこうしたマンツーマンに近い形で、技術をお伝えする案件も増えつつあります。
その中でこうしたご評価を頂戴したことは、弊社代表にとっても自信になりました。もちろん、スキルの習得に終わりはありません。新たな技術も次々と世の中に生まれています。まだまだ切磋琢磨していかねば。精進します。

今後もアディエム社とはkintone案件のご提案からコーディング・テストまでを協業できる関係を築いていければと思います。
kintoneでのシステム開発のご相談、アディエム社、および弊社にお気軽にお寄せ下さいませ。

また、もし御社の技術者に対し、こうしたマンツーマン形式でのレクチャーをご要望の際は、
ご連絡をください! ご相談に乗らせていただきます。


box for kintoneでERR_CONNECTION_REFUSEDが出てしまった場合


kintoneをカスタマイズする際は、デバッグが欠かせません。
ブラウザーのコンソールに出るエラーメッセージはデバッグを行う上で重要なメッセージですよね。

とくに複数のカスタマイズやプラグインを入れたアプリでは、どのエラーがどのJavaScriptによって出力されるのか把握しておかねばなりません。そうしないと私のように脳のフラッシュメモリー容量が少ない人はすぐにCPU100%に達してしまうのです。

今回、弊社で別のプラグインを作るにあたり、box for kintoneで謎のエラーが出ていました。
エラーが出ているのにbox for kintoneのプラグイン自体はきちんと動作しているという。おやまあ。
謎です。全くの謎です。

と、そんな混乱は、以下にご紹介する方法で解消されました。
ウェブ上でもあまりこの件についての記事がなかったので、ニッチですが皆様のご参考になればとアップしました。

同様にファイアウォール系拡張機能とオンラインストレージの組み合わせだと出るかも。

0.box for kintoneとは

 オンラインストレージとkintoneを連動するプラグインです。こちらは「box for kintone」で検索していただければいくつも見つかると思います。使用上の注意をよく読み、用法 用量を守って正しくお使い下さい。
 こちらとか

1.謎のエラー

 ところが、一見すると想定通りに動いているように見えるbox for kintoneですが、コンソールには
 謎のエラーがうごめいています。

 な、なんやこれ?
 上図では見えませんが、エラーに「その心は?」と聞いてみると「ERR_CONNECTION_REFUSED!」と叫んでいます

 他のカスタマイズを進める都合上、こういうエラーは先につぶしておかないと。

 普通、ERR_CONNECTION_REFUSEDはウェブサイトにアクセスできないときに出るエラー。
 なのにkintoneの画面上にあるboxの窓には接続できていて、ドラッグするとファイルのアップロードもできる。謎です。

 何かが起これば、ファイアウォールを疑う。これは某氏(誰?)の金言です。

 と、そこで、ブラウザー(Google Chrome)に拡張機能として入れているマカフィーの存在に思い至ります。

2.拡張機能を探す。

 拡張機能については、下図のようにたどれば設定画面にたどりつけるはずです。
 

 ここでマカフィーウェブアドバイザーなる拡張機能が登場。これかな。
 

3.拡張機能の「ファイルのURLへのアクセスを許可する」機能をオフにする。

 詳細を押すと、こんな画面が。うむ。OFFになっている模様。これをOnにするといかがかな?
 


 
 こんな風にぽちっと。青くなりましたね。

4.念のためキャッシュやクッキーも消しておきましょうね。

 やってみたらうまくいかないので、ブラウザーがクッキーの消化不良を起こしているに違いない。ここは胃を空っぽにしてあげましょう。

 ここでは閲覧履歴データの消去を選びます。

 ここで閲覧履歴にチェックをいれて消去してしまうと、いろんなサイトで再アクセスが必要になるのでご用心ください。

 すると、謎のboxエラーはいなくなりました。めでたしめでたし。

5.終わりに

これは、2018/9/5時点の情報です。
もちろん、折角ファイアウォールさんがファイルへのURLを許可しないようにしてくれているのに、それを許可するということは、セキュリティ上リスクも増します。
そのあたりをご理解の上、参考にしていただければ。もちろん何かあっても弊社では責任はとれませんので。

なお、弊社はこれから、box for kintoneを拡張し、サブテーブルの行ごとにBOX上でサブフォルダーも作れるようにする予定です。


EBISU Tech Night Vol.2で登壇してきました


先日、恵比寿ガーデンプレイスで開かれた「EBISU Tech Night Vol.2」で登壇してきました。Vol.1に参加したその場でVol.2への登壇依頼をいただいたのです。

ご依頼主は「EBISU Tech Night」を主催されているシステム・インテグレーター様。大規模案件も多く請け負われ、若手の優秀な技術者を多く擁しています。そのオープンな社風と技術社さん達の感度の高さは「EBISU Tech Night Vol.1」に参加してビシビシと感じました。

事前にお題を伺ったところ、複数頂きました。その中から二つを選び、題材にしました。
 ・kintoneエバンジェリストとして小規模のお客様にkintoneを円滑に導入する秘訣
 ・kintoneをIoT案件に導入する勘所

確かにエンタープライズ案件でのやり方と、私がkintoneを提案し導入するお客様に対するやり方では方法論が違います。
また、IoT案件での導入は、今年の2月にQiitaに投稿したブログの内容が今も有効です。これらについて私の経験を語ることでお客様のお役に立てそうです。

「EBISU Tech Night」はお酒も入りながらのフランクな場です。なので私も途中から少し話す内容をやわらかくし、笑いを取ることにも気を配りました。

結果として、今まで私が登壇した中では一番笑いをいただけたように思います。また、話している間、スライドの内容を写真で撮ってくださる技術者さんが何人もいらっしゃいました。話の途中でkintoneを使ったことがある人が何人いるかを聞いたところ、7-8割ほどの方に挙手して頂きました。それもあって、私のお話は好意的に受け止めて頂けたのではないかと思います。実際、アンケートの結果でも好意的な結果が多く、励みになりました。また、終わった後の懇談でもお誉めの言葉を何人かの方から頂き、翌日もその会社様の中で私のスライドを参加できなかった方に共有いただくシーンが見られたとのことです。これはとても嬉しいことです。

こちらがスライドのURLです。
https://slides.com/yoshikazunagai/ebisutechnightvol2

私としては、意識して笑いを取ることを試み、それが功を奏したのは評価したいと思います。とはいえ、まだ自分の話術には向上すべき点が多いと思っています。今回は50-60名ほどの方の前で話しましたが、ゆくゆくは千人以上の方の前でも話せるだけの度胸をつけたいと思っています。

また、「EBISU Tech Night」での登壇依頼を数名の方からメールで頂けました。次回も前向きに登壇を考え、引き続き話すスキルを上げていこうと思います。併せてkintone Caféも開催し、エバンジェリストとして草の根で活動していきたいと思いました。


チーム応援ライセンス開始記念セミナーに登壇しました


5月16日にサイボウズ社27階で開かれた
「チーム応援ライセンス開始記念セミナー」(https://npo.cybozu.co.jp/blog/post/53/)
に弊社代表が登壇者として参加させて頂きました。

今回は、どちらかといえば自治会の元総務部長としての肩書きが主です。

直前に開かれた自治会の役員会で自治会名の実名を出すことが否決されました。
なので、実際の活用事例を写真や具体例で示しませんでした。
そのかわり、サイボウズLiveをサイボウズOfficeに切り替えるにあたり、
どういういきさつで選考を行い、どういう基準で採用したかの観点でお話ししました。
また、予算の限られた任意団体において、どれだけチーム応援ライセンスが重要かということも。

もちろん、最後にはkintoneエバンジェリストとして、
kintoneが自治会や他の組織にこれだけ効きますよ、ということも交え。
スライドはこちら(http://slides.com/yoshikazunagai/for_residents_association)

私は話し終わった後には、隣に座っていた方からお褒めの言葉も頂き、
懇親会でも様々な方からご挨拶や好意的な反応も戴きました。
サイボウズOfficeとkintoneのどちらを採用すればよいか、
との質問も数名の方から頂きました。
また、参加されていた当の自治会の方からも好意的なコメントを頂きました。

逆に反省点もあります。

・スライドに一切具体例を出せず、聞き手の皆様に抽象的な印象を与えたかもしれないこと。
・話の途中で質問してみたところ、自治会の役員経験者が聞き手の1割もいらっしゃらず、
 自治会を経験していない方には、私の話の意図が伝わらなかった可能性があること。
・質問の時間を取れなかったこと。
・kintoneを勧めておきながら、アプリのデモの時間をとらなかったこと。

実際、サイボウズ社より聞き手の皆様から頂いたアンケート結果(個人情報は省いたもの)を見せて頂きましたが、
反応がわかれています。
他の講演者より私の講演に高評価をつけて下さったかたもいれば、逆の評価をした方もいました。
サイボウズLiveの代替をOfficeにする決意がついたと仰って下さった方もいましたし、
懇親会でもそのような評価も頂きました。

そこも含め、どうすればうまく伝えられるか、私の方でも自治会や町内会、任意団体の方々に提案を行う上で、
とてもよい勉強になりました。

最後になりますが、ご出席くださったかた、サイボウズ社のみなさま、ありがとうございました。


サイボウズのクラウドサービスが2018年6月10日より一部利用できなくなる件の対応


このような案内をサイボウズ社から頂きました。

さて、本稿はこのような案内をサイボウズ社からいただいたけれど、どうすればよいかお困りの方へ向けて書いています。

実は弊社にも数カ月前、同様の内容が書かれたメールがサイボウズ社から届いていました。
その時は私はまだ先のことと思い、後回しにしました。
ところが今回、このような内容の案内を郵送で受け取るに至り、さすがにまずいと思って調べてみました。

この案内の中で対処法として書かれている通り、ウェブブラウザーやOSが古い場合は簡単です。
サイボウズのサービスを、新しいパソコンでしか使わないようにすればよいのです。

ところが問題は、ウェブブラウザーやOSが最新版なのにこのような案内が来る場合です。
それはリンクに記載されているチェックツールで問題なしと出る場合です。
問題なしと表示されるのに、なぜこのような案内が来るのか不安になりませんか。
もしかしたら、どうすればよいのか分からない方がいらっしゃるのではないでしょうか。
本稿はそういう方のために書かせていただきます。

実は私は最初にメールを受け取った時点でほぼ見当はついていました。
それはウェブブラウザー以外の場所から、サイボウズのクラウドサービスに接続している場合です。
ウェブブラウザー以外の場所とは、たとえばExcel、Word、Access、PowerPointなどのソフトウエアのことです。

弊社の場合、Excelからkintoneへデータを参照しているプログラムが問題でした。

    Set objweb = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    Else
        MsgBox "MSXML2.ServerXMLHTTP.6.0エラー"
    End If

    Err.Clear
        
    Set objweb = CreateObject("MSXML2.ServerXMLHTTP")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    Else
        MsgBox "MSXML2.ServerXMLHTTPエラー"
    End If

上のプログラムは、Excelのマクロからkintoneに接続するライブラリの設定箇所を抜粋しています。
上で設定したライブラリを、以下のコードでkintoneに接続していました。

    Set objweb = CreateHttpObject()
    
    If objweb Is Nothing Then
        GetData = ""
        Exit Function
    End If
    
    Call objweb.Open("GET", "kintoneのURL", , "basic認証ID", "basic認証PW")

ここで最初に挙げた、

    Set objweb = CreateObject("MSXML2.ServerXMLHTTP.6.0")

または

    Set objweb = CreateObject("MSXML2.ServerXMLHTTP")

が問題です。

要するにこの二つのライブラリが古いのです。古いライブラリですがWindows 10でもサポートされているため、
エラーは特に起きません。

ところがこのライブラリは、kintoneへの接続の際にTLS 1.0という通信プロトコルを使うのです。
これがサイボウズ社のクラウド基盤側で検知されたため、メールや郵送でご案内を出されたのでしょう。
いつもながら、早め早めを見越したサイボウズ社の対応には感謝です。

弊社の場合、上記の処理を2社様にのみ使っていました。
とくに最初のお客様への導入が2012年の春でした。
それはkintoneがリリースされる前、つまりプレリリースの段階でした。
その時点でMSXML2.ServerXMLHTTP.6.0を採用したことが誤りでした。

それを受けて、

    Set objweb = CreateObject("WinHTTP.WinHTTPRequest.5.1")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    Else
        MsgBox "WinHTTP.WinHTTPRequest.5.1エラー"
    End If

と改修しました。WinHTTP.WinHTTPRequest.5.1であればTLS1.0は使いません。
3月の初めに改修を行いましたが、今のところエラーもなく動いています。
(サイボウズ社側でまだTLS1.0として検知されていたら問題ですが)

なお、

    Set objweb = CreateObject("MSXML2.ServerXMLHTTP.6.0")

を使っている場合は、

    Call objweb.Open("GET", "kintoneのURL", , "basic認証ID", "basic認証PW")

でエラーなく通ります。
ですが、

    Set objweb = CreateObject("WinHTTP.WinHTTPRequest.5.1")

に変えた場合、

    Call objweb.Open("GET", "kintoneのURL", , "basic認証ID", "basic認証PW")

ではエラーが発生します。

    objweb.Open "GET", "kintoneのURL", False

と変えるとよいでしょう。
ちなみにベーシック認証の指定は、

    Call objweb.setrequestheader("Authorization", "Basic " & encode64("basic認証ID:basic認証PW"))

とopenの後のコードで行っているので、その変更はありません。

というわけで、同様の案内をサイボウズ社からいただいていて、ウェブブラウザーやOSのチェックでは問題ないと表示される方、
は本稿を参考にしてもらえれば幸いです。

もし必要であれば弊社宛にご連絡を頂戴できれば、ご相談にものらせていただきますよ。


今年はエバンジェリスト活動を活発に


年始の抱負にも書きましたが、

今年はkintoneエバンジェリスト活動に力を入れます。

 

まずは、今年度もkintoneエバンジェリストとして無事に更新頂きました。

こちらはバレンタインデーに合わせてサイボウズさんよりいただいたプレゼントです。
ハッピーエバレンタイン♫ ありがとうございます!
ハッピーエバレンタイン

昨年はほとんどエバンジェリスト活動が出来ませんでした。今年はその反省を踏まえなければ。

サイボウズさんからも昨年の弊社代表のエバンジェリスト活動の低調さには、苦言をいただきました。

少なくとも一昨年並みの活動レベルに戻し、その上に行くことが求められます。

 

その反省から、今年はkintone案件を複数提案し、準備に動いています。その中にはkintoneを使った新規サービスも含んでいます。

先日は久し振りにプラグイン開発も行いました。お客様専用のプラグインなので、公開の予定はありませんが。

また、来週にはkintoneに関するインタビューも受ける予定です。

 

去年の反省を踏まえた上で、弊社代表が何を武器とするか。技術力がある程度あるのは前提で、そこに何を加えられるか。何を武器としてエバンジェリストとしての存在感を出して行くか。弊社代表が至った結論。それは書く力です。文章力。そこに活路を見出そうと思います。そして、去年に比べて一味違った活動を展開できればと思っています。


Save The Live!~サイボウズLiveを救え~


1.読まなくてもいい前書き

2017年の秋晴れを引き裂くように、そのお知らせは降ってきました。そう、サイボウズLive終了のお知らせです。
その直後、お客様から早速ご連絡が。「Liveが終わる。代替案を検討してほしい」と。「はいっ!承知でございます」。

直後に開催されたCybozu Days 2017の基調講演でサイボウズ青野社長からLive終了の事情説明やお詫びをいただき、ようやく事態の深刻さを悟った私。Daysで仕入れた情報では、移行ツールが提供されるとかされないとか。でもそれはあくまでも未確定情報。リサーチして弊社でも移行できるようにしておかないと。

そう思っていたところにkintone Advent Calendarの枠が残り少ないというご連絡を頂きまして。最後の一枠に滑り込めました。Advent Calendarへの参加は3度目なのですが、今回はサイボウズLiveをからめればネタとして旬ではなかろうか。そんなことを、サイボウズのUっ氏~にお伺いを立てたところ、歓迎いただけまして。では取り掛かってみよう、と考え始めたとたん、Advent Calendarの4日目にアップされたのが「kintoneサイボウズLive化作戦」。正直やられた、と思いましたね。けど松田さんの記事を拝見するとkintoneへのデータ移行までは触れていない様子。これは私がやるしかないでしょう。まだ出番まで3週間はあるし、案件の合間でも何とかなるはず。2019年の4月までしか賞味期限のない記事ですが、どなたかのお役に立てれば。せめてもの長井サンタの贈り物です。

目次

1.読まなくてもいい前書き

2.サイボウズLiveのデベロッパー登録を行い、APIキーを入手する。

3.APIリファレンスを読む。理解する。

4.類似の参考サイトを探す。

5.グループと個人の違いを理解する。

6.取り込み方法のインターフェース検討と実装。

7.サイボウズLive APIの制限事項と、kintoneの対応機能の検討。

8.実装。

2.サイボウズLiveのデベロッパー登録を行い、APIキーを入手する。

実は今まで、サイボウズLiveのAPIは存在こそ知っていましたが、完全スルーしていました。
なので今回はデベロッパー登録から始めました。まずはここからやってみましょう。

 ・https://developer.cybozulive.com/apps/top にアクセスします。

・APIの対象を選びます。グループZを選ばないと全データが取得できないのでグループZを選びます。アプリケーションの種類はクライアントにします。

・Consumer KeyとConsumer Secretを入手します。大切に保管しておきましょう。

・上で入手したConsumer KeyとConsumer Secretを使います。

3.APIリファレンスを読む。理解する。

続いてAPIリファレンスです。これを読まねば話になりません。
 https://developer.cybozulive.com/doc/current/

なるほどサイボウズLiveは、認証にOauthを使っているのですね。
JavaScriptだけでの実装だとちょっと面倒かな。oauth.ioとか試してみればできそうな気もするけど後回しにします。
PHPだとOauthの実装したこともあるし多分いけるでしょう。
そんなわけで、まずPHPで実装し、時間があればJavaScriptでやってみよう、と決めました。

4.類似の参考サイトを探す。

ところが、サイボウズLiveってAPIがあまり活用されていなかったのか、情報があまりウェブ上にないのです。
そんなわけで私が公式のサイボウズLive APIドキュメントページ以外で
参考にさせて頂いたのは、まだプログラマーですが何か?さんのページのみです。ありがとうございました。

こちらの情報によると、pearで Net_URL2、HTTP_Request2、HTTP_OAuthを使うのが良さげな感じ。私もそれにのっかりました。
サーバーはさくらインターネットさんのスタンダードプランが手元にあったので使ってみようとおもいます。
と思ったら、ちょっとだけ手間取りました。以下は読み飛ばしてよいです。
 ・Oauthの実装に手間取りまして。
 ・そもそもpear自体がさくらインターネットのサーバーにインストールされていなかったり。
 ・なのでgo-pear.phpを使ってインストールしようとして。
 ・そしたら、ファイルだけでなくディレクトリのパーミッションも755にしないと動かない、とか。
 ・で、pearのインストールができたと思ったら、go-pearのインストーラーからNet_URL2パッケージを入れる際、なぜか古いバージョンしか入れられず。
 ・するとHTTP_Request2、HTTP_OAuthが要求するNet_URL2のバージョンを満たさずさあ困った。
 ・仕方ないのでSSH接続でコマンドからインストールする羽目になりました。
 ・しかも後ほどftpやsocketでもはまってしまい、仕方なくあとでphpのバージョンを7.1.11に上げました。これらの処理に影響はありませんでしたが。

・というわけで、本記事の前提となるバージョンです。
  kintone :::2017/11月アップデート版
  php:::7.1.11
  jQuery:::3.2.1

5.グループと個人の違いを理解する。

さて、Oauthのライブラリをインストールしたことで、サイボウズLiveへの接続はすんなり成功しました。
ところが、上記のサイトでご提供されている情報は認証の部分とXMLのダウンロードまでです。取得したサイボウズLiveのデータをkintoneへ登録する部分はこちらで実装せねばなりません。
実装としてはphpでXMLを解析し、要素や値をkintoneにアップすればよいはず。

ここでサイボウズLiveのデータ構造をどのようにkintoneに移行するか考えないと。
つまり、個人データとグループのデータをどう関連づけ、kintoneに持ってくるか、という問題です。
例えばスケジュールのデータ。グループごとに分かれています。でも、データ構造は同一のはず。
実は個人スケジュールのデータには各グループのスケジュールも全部含まれるので、それを持ってくればよいのですが、グループ単位のスケジュールで取り込めるようにしておかねばあとで困るでしょう。

つまり考えねばならないのは以下の通り。
kintoneで、グループごとにスケジュールアプリを分けてつくるのか、それとも一つのスケジュールアプリに複数のcybozu Liveグループのデータをマージさせるのか。
言い換えれば、kintoneのアプリ単位にユーザーの権限を制御させるのがよいか、それとも同じアプリの中のレコード単位で権限を制御させるのがよいか、ということになります。

考えた結果、kintoneのグループスケジュールアプリは一つにし、グループのデータを別々に登録するようにしました。
個人スケジュールはグループスケジュールと別々にしなければ、あとでデータが混在して困るので、別にしました。ToDoも同じく個人とグループを分けています。

6.取り込み方法のインターフェース検討と実装。

個別にダウンロードするにあたっては、インターフェースを考えたほうがよいですね。
kintoneアプリの一覧画面にダウンロードリンクを貼ることにしました。ヘッダー下のスペースにセレクトボックスを二つ配置し、それに応じてphpへのリンクを切り替えるようにしています。

 取り込み部分のインターフェースはこんな感じで

・初期状態はこんな感じ。

・左側のドロップダウンがグループです。サイボウズのアカウントが属するグループをリストアップし、先頭は個人データとしています。

これらのグループは私が実際に使っている/いたものです。kintoneやcybozu界隈のグループも昔cybozu Liveにあったのですよ。懐かしい\(^o^)/

・右側のドロップダウンが対象となるデータです。左側が個人データなので、5種類のデータを取り込み対象として出しています。
 (「全て」と「テーマチャット」と「ダイレクトチャット」と「コネクション」は本記事では実装していません。)

・左側のドロップダウンをグループにすると、右側のドロップダウンの内容もかわります。4種類のデータを取り込み対象として出しています。
 (「全て」と「メンバーリスト」は本記事では実装していません)

・両方のドロップダウンの選択の値に応じて、すぐ下のリンクの文字列とurlが切り替わります。

ちなみに、各kintoneアプリはこの部分に同じJavaScriptファイルを読ませることで共通化しています。
なお、リンクをクリックした際も、それぞれ定められたアプリにデータを放り込む仕様にしています。そのため、各アプリのリンクから違うアプリの取り込み処理が可能にしています。とはいうものの、混乱はないはずです。

 この部分の実装について説明します。まずはJavaScriptの部分を。

・まず、アプリに対してJavaScriptを登録します。上にcybozu CDNからjQueryを。下にこの後説明するgetGroupList.jsを登録します。

・getGroupList.jsの先頭から。

ここはkintoneではお約束の記述ですね。
4行目のjQuery.support.cors = true;は jQueryのAjaxで他のドメインの値をとるときの呪文です。昔作ったコードを持ってきたので、今ならkintone.proxyのほうが良いと思います。kintone.proxyについてはこちらを。
その下のescapeHtml関数は、サニタイズ用です。まあ今回の案件についてはそういう心配は無用なのですが。ちなみにこのJavaScriptファイルはjswatchdogでチェックすると、三か所XSS Warningが出てしまいます。optionの部品オブジェクトを代入する際に「ちょっと自分危ないんとちゃう!?」と怒られてしまいます。放置しています。ごめんなさい。

・13行もkintoneのJavascriptではおなじみです。一覧の表示時に呼び出されるイベントです。

14-16行は、複数のドロップダウンを出さないようにするためのステップです。すでにドロップダウンがあれば処理を終了します。
19行から下は、jQueryのAjaxのお約束です。上に書いたようにkintone.proxyのほうがよいかも。
ここで、https://dummydesse.sakura.ne.jp/kintonefromcybozulive/cbl_grouplist.php を呼んでいるわけですね。このphpについては下で解説しますので、少々おまちを。

・26行から下は、データがきちんと取れた際の処理です。ここでselect部品やリンク部品を生成しています。
27行がphpから取得した値をこちらで用意した変数に代入しています。

36-37行は、初期値としてリンクに表示させる個人データ「全て」のリンクを表示しています。

・ここではphpが貢いでくれたグループのデータをselect部品のoptionに代入しています。
datalistは処理対象となるデータの種類です。初期値が個人データなので、個人データに対応するデータを配列に登録しています。

・ここでは配列のデータ種別をselecgt部品のoptionに代入しています。

さらに kintone.app.getHeaderMenuSpaceElement メソッドを使い、上で生成したselect部品やリンク部品をkintone画面に表示しています。

・66行目以下は、データ種別のselect値が変わった際に、リンクの表示文字列とurlを変更する処理です。

・78行目以下は、グループのselect値が変わった際に、リンクの表示文字列とurlを変更する処理です。個人とグループではデータの種別も変わるため、リンクの文字列やurlもあわせて変動させねばなりません。いやはや、大変ですね。

・以下は失敗した場合の処理です。ここはエラーメッセージなので、解説は割愛させてください。要するに疲れてきました・・・

 続いてphpでcybozu Liveで認証する部分です。

・といっても、この部分はまだプログラマーですが何か?さんのページを参考させてもらい、それをかなりの部分で使わせて頂きました。改めて感謝です。
とはいえ、私の実装ではcybozu Liveの認証部分は別phpファイルに切り出すなどの改良を加えています。それが5行目ですね。cbl_oauth.phpにお任せしているのです。3,4行目は上に書いたようにさくらインターネットのスタンダードプランに入れたhttp_Request2とhttp_oauthを呼び出しています。あまりサーバーに詳しくない方にとっては、この二つのインストールは厄介かもしれません。 

続いて、認証情報を格納する変数を三つ用意します。この三つの変数は以下の処理でも使うため、すぐ下のgetAccessTokenへは参照渡しをして、getAccessTokenの中で代入された値を使えるようにします。
そして、getAccessTokenを呼び出した結果をaccess_token_infoに格納します。getAccessTokenの戻り値は配列なので悪しからず。
さらに、10行に書いているとおりヘッダーでおまじないをとなえます。これはphpの中で違うドメイン(cybozu Live)のデータをとってくるときに、このおまじないを忘れると、11行目に書かれているような反撃を食らうためです。いわば白魔法の防御呪文のような感じです。

・12行目のtryで処理を開始します。
13行目のHTTP_Request2は上で読み込んだRequest2ファイルの中のクラスをインスタンスとして使いまっせ、ということです。 
14行目はssl_verify_peerをFalseにしています。つまりSSL証明書の検証を要求しませーん、という意味です。
17行目のHTTP_OAuth_Consumer_Requestは上で読み込んだOauthファイルの中のクラスをインスタンスとして使いまっせ、ということです。
18行目は、HTTP_Request2の設定に基づいて一旦つながしてーや、という意味です。まあ斥候みたいなもんです。

20行目は斥候がまず様子見した接続を、本体が認証情報を掲げて大手を振って入場するための準備です。上でとってきたcybozu Liveの認証キーをHTTP_OAuth_Consumerに渡してあげるのです。通行許可証ですな。厳重に4種類の通行許可証を渡してあげるわけです。
21行目は、上で準備した通行許可証を、18行目で斥候が先に接続のお伺いを立てて問題ないよーという情報を御旗にたてて、cybozu Live城にアクセスします。
26行目は、個人フォルダのパスです。cybozu Liveの個人Idはメールアドレスなのです。
27行目はフル許可設定で個人フォルダのパスをなければ生成します。

・34行目はcybozu LiveのAPIのエンドポイントと定められたURLあてにリクエストを送ります。
arrayの中にパラメーターを含めればいろいろとリクエストができますが、ここではグループ一覧をとりたいだけなので、パラメーターはなしで。なお、apiの仕様はこちらに載っています。

36行目でリクエストの結果が $xml0 に代入され、エラーがなければ40行に処理がいきます。
40行は、ここでcybozu Live apiに進呈されたグループ情報の配列に個人を加えるための初期値です。先に説明したインターフェースでは最初に「個人データ」がありました。
45行目では先頭に「個人データ」が入った配列がグループデータに従って生成されます。
47行目では、グループidに従って並び替えます。その際「個人データ」キーは0を指定しているので、かならず先頭です。
48行目は、JavaScriptが読めるようなjson形式でデータを返してあげています。echoで返してあげるとJavaScriptはデータとして喜ぶのです。
49行目以下はエラー処理。疲れたので割愛させてください・・・

 続いてphpでcybozu Liveで認証するコア部分です。

・ここに各種認証キーを記載します。

$consumer_keyには、cybozu Live apiのデベロッパー登録してきたキーを書き込みます。
$consumer_secretには、cybozu Live apiのデベロッパー登録してきたシークレット値を書き込みます。
$xauth_access_token_urlには、cybozu Live apiがトークン取得用としてご用意しているurlを指定します。
$authusernameには、あなたのcybozu Liveのログインアカウントを書きます。
$authpasswordには、あなたのcybozu Liveのログインパスワードを書きます。

・続いて認証リクエストの部分です。先ほどの説明と重複する部分もあるので、21-28行までの処理は説明を割愛しますね。 

30行目では、OauthのsendRequestのメソッドに対して、urlや認証情報のつまったパラメータを渡してあげます。
するとレスポンスにアクセストークンが戻ってくるのですね。あとは、phpのparse_str関数で$access_token_infoにトークン文字列を代入してあげるだけ。簡潔です。

・エラーハンドリングの部分は、割愛でお願いします。

ちなみに今回はkintoneのアプリ一覧画面上に実装しましたが、本当ならばポータルからダウンロードさせるのが親切な気がします。
多分、同じように実装すればいけるはずです。
お時間のあるかた、おもちとみかん食べながら、いかがでしょうか?

7.サイボウズLive APIの制限事項と、kintoneの対応機能の検討。

ところが、こうやって移行の検討を深めてみると、いくつか問題が出てきます。

Q1.サイボウズLiveのユーザーをそっくりkintoneのユーザーとして移行できない。なぜなら開発者ライセンスは5ユーザーしか作れないから。無料だからとたくさんアカウントを作ったはよいが、kintoneアカウントは有料ですから。
     ↓
 A1.kintoneのユーザーやグループの利用はあきらめ、ドロップダウンか文字列(一行)にデータを入れるしかない。またはユーザー一覧のアプリを作ってルックアップや関連レコードで連携させるとか。今回の記事ではドロップダウンか文字列(一行)か複数選択でお茶を濁しています。

Q2.サイボウズLiveのAPIに用意されているファイルダウンロードがそもそも画像のみ。
     ↓
 A2.画像しかとりこまないようにする。
 (ところが、今回は画像のアップロードの実装はしていません。以下は言い訳です。
  ・さくらインターネットのphpがftpサポート外だということをうかつにも忘れていまして。
  ・sshでログインし、コマンドからphpのconfigureやmakeを行ってftpやsocketを有効化した。参考サイト参考サイト
  ・ところがそれにも関わらずダウンロードができない。調べてみたらさくらのftpサーバーがRETR未対応ということで、サーバー自体がphpのftpを頑として受け付けないということに気がつき万策尽きる。
  ・curlだとローカル経由でアップロードした場合はfilekeyの取得ができるが、リモートURL経由ではresponseがNullになってしまう。
  ・処理の一貫性の観点では、ファイルがローカルに自動的にダウンロードされる実装を加えないと、ダウンロードの時点で一度別処理を挟み、それ以降のkintoneアプリに添付ファイルを登録するためのfilekey取得をあらためて行う必要が・・・・

Q3.サイボウズLiveのコメントをkintoneに移したい。ところが、APIトークン利用でのコメント追加だとコメント追加者がAdministrator扱いになってしまう。コメントの記載を各ユーザーで書かせるには、毎回認証ユーザーを切り替えねばならず、実装が面倒。
     ↓
 A3.コメントについてはサブテーブルで実装しました。松田さんのご提供アプリでも一部サブテーブルでしたし。

Q4.マイカレンダーにグループスケジュールへのリンクを実装するのが面倒。
     ↓
 A4.アプリ間の連携を円滑にするには、リンクの設定が不可欠ですが、今回の記事では実装していません。いずれやります。

Q5.スケジュールの日付範囲の取得がサイボウズLiveのAPIの仕様だと制限がある。(FromからToが365日以内でなければならないとか)
     ↓
 A5.他にも、cybozu Liveのスケジュールには通常予定と期間予定、繰り返し予定があります。その実装がちょっとひと手間必要なので、今回の記事では実装していません。いずれやります。

Q6.cybozu LiveのAPIの仕様では、一回当たりのデータ取得件数が最大100件になっている。
     ↓
 A6.これは再帰処理などで、実装可能だと思います。が、今回の記事では実装していません。いずれやります。

8.実装。

あとは、個別のプログラムごとに移行をわけ、それぞれのアプリごとに取り込むだけです。
せっかくなのでアプリは松田さんのご提供いただいたテンプレートをベースに使わせて頂き、適宜修正するようにします。

・今回ここで呼び出すurlとは、右下のリンクのUrlのことです。
 

 まずはxmlを配列に読み込むためのphpの中身です。

・では個人スケジュールから始めてみましょう。cbl_schedule.phpというファイルです。
20行目までは、グループ一覧を取得する処理とほぼ同じなので、割愛します。

・続いて認証処理からの流れです。こちらも32行目まではグループ一覧の取得時の処理と同じなので、割愛しますね。

重要なのは33行目です。ここではcybozu Live apiの個人スケジュールのエンドポイントurlを呼び出しています。
個人スケジュール情報のapiの仕様はこちらに載っています。
ここで、array内に取得する情報の条件をパラメーターで渡します。パラメーターのうち、個人スケジュールについては必須なのはありません。が、期間を指定しないと、思ったデータがとれません。条件の指定方法については、上のapi仕様に載っています。
とくにterm-startとterm-endの設定が重要です。
またmax-resultsは100が基本でしょうね。
embed-commentもコメント情報を取得するためには必要なパラメータです。
cybozu Live apiの一回当たりの取得件数は max-resultの最大値が100なので100件が限度です。
そこで全データを取得するためには、start-indexの値を毎回変動させつつリクエストを投げる必要があります。
38-39行目の置換の意味ですが、cybozu Liveから帰ってくるxmlのデータに名前空間付のタグがあります。名前空間付きのタグとは、
 

<cbl:group valueString="長井家予定" id="2:65107" />
    <cbl:comments>
      <cbl:feedLink>
 

のようなコロン付きのタグですね。このタグの内容はchildren(“cbl”,true)->group といった方法でパースすればデータの取得は可能です。ただ、コメントタグの中で、各コメントごとにある <entry cbl:sequence=”2″> がうまく配列として読みないのです。なので仕方なくコロンを _ に置換する方法を採りました。
45行目の simplexml_load_string で、取得したXMLデータをオブジェクトとして扱えるようにします。
46行目は $authoremail に投稿者のemailを代入します。$list0->author->email が 下記のようなxmlのデータを取得する際の命令文です。この$list0がsimplexml_load_stringで取得してきた全体のオブジェクトにあたります。その中の author タグのさらに下にある emailを取得する際にこの命令を投げればいいのですね。
 

   <author>
     <name>長井 祥和</name>
     <uri>2:39920</uri>
     <email>kakakakaka@dummy.jp</email>
   </author>
 

48行目は 取得したデータをkintoneに放り込むためのphpを呼び出しています。

・続けて、エントリごとの中身を取得に行きます。

49行目の foreach($list0->entry as $entry0) { はエントリータグを上から順にループ(フェッチ)させる命令です。
50-51行目は、entry毎のidを取得します。cybozu Liveのデータはカンマ区切りで四つ目の値がエントリidなので、それを採りに行きます。
52行目から57行目まで、取得時に(string)という文字があります。これは強制的にオブジェクトの型を文字列として変換する処理となります。
55行目と56行目にある cbl_when->attributes()->startTime というのは、XMLでいうと

<cbl_when startTime="2011-04-06T14:55:00Z" />

 のようなstartTimeの属性の値を取得するための命令です。 
59行目はXMLでいうとcbl:facility というタグを取得する際、タグの有無を判別するための文です。
タグがあれば、その中をループします。

・続いてxmlの中身を取得していきます。このあたりのxmlの構成は、apiの仕様を確認するか、もしくは後で紹介するサーバーに保存したxmlファイルの中身を確認するとよいでしょう。

・81行目から下は、エントリ本文に添付ファイルがあった場合の処理です。
添付ファイルの有無は if ($entry0->cbl_attachment) { で判別可能です。

fileDownload の関数は以下に説明しますが、サーバーにxmlファイルを置くための関数です。
93-94行目にある get_filekey_from_kintoneはkintoneにファイルをアップロードし、その添付ファイルをレコードを紐づけるためのfilekeyを取得するための関数です。ただ、言い訳にも書いた通り、ローカルへのダウンロードがうまくいきませんでした。そのため、今回は関数の中身は恥ずかしくてお見せできません。ですが、94行目のようにローカルファイルを指定するとfilekeyの取得はできることは確認済みです。

・98行目以下は、コメントのデータ取得です。
104行目の foreach( $cbl_entry as $entry2 ){ は複数コメントを順繰りに参照するための命令です。
なお、cybozu Liveのapiが提供するXMLファイルのコメントの一つ一つには番号が振られています。それが105行目の $entry2->attributes()->cbl_sequence で取得できます。
つまり、106-110行目の処理は、コメント一つ一つの番号をキーに設定し、連想配列としてコメントのそれぞれの値を格納しているのです。

なお、132-133行目の処理も、実際はうまく動かないため、コメントアウトしています。

・ここからは上の方法のおさらいですね。

・152行目から下は、配列に、取得してきた各値を代入していく作業です。

なお、179行目でheaderを指定してます。これは、呼び出し元に戻す命令です。ここでいう呼び出し元とはkintoneの一覧画面のことですね。これでkintoneにデータを登録した後、もとの画面に何事もなかったかのように涼しい顔で戻れるのです。

・で、こちらはfileDownload関数です。
cybozu Live apiはそもそも画像ファイルしかダウンロードができず、excelやwordファイルだとエラーになってしまいます。
エラーを回避するために拡張子が画像のものしかダウンロードさせないようにしています。ここではサーバー内の場所にファイルを保存するようにしています。

 続いて取得した配列データをkintoneに投げ込むphpの中身です。

・この辺りはデータを登録するためのトークン周りの処理ですね。
念のためですが、トークンの発行時には権限にレコード追加も含めておいてくださいね。

・ここでは、コメントのデータをkintoneのサブテーブルのjsonデータに整形しています。

・ここではkintoneに投げるデータの整形部分です。上でサブテーブル用に整形したコメントのデータも登録しています。

・取り込んだデータをcurlでリクエストとしてkintoneに投げています。

・カレンダービューに取り込んだデータが表示されます。

・レコード詳細もこの通りです。
コメントの内容もサブテーブルに入っていますよね。

とまあ、今日はここまでにしておきましょう。こちらでは個人スケジュール、グループスケジュール、個人ToDo、グループToDo、グループ掲示板まではデータの取得スクリプトを作成済みです。
 実は一つ取り込みのコツがわかれば、あとはデータ形式の差だけなのです。返す返すも添付ファイルの登録ができなかったのは残念ですすが、おいおい実装してこちらのブログをアップデートする予定です。

もしcybozu Liveからデータ移行をしたいというお客様がいらっしゃいましたら、お手伝いできますのでご相談ください。お安くさせて頂きますよ。


Connect 2016 in Koriyamaに参加します


お知らせです。

11/12-13に福島県郡山市でConnect 2016 in Koriyama, with UDC (ハッカソン)が開催されます。
http://www.techno-media.net6.or.jp/newmedia/human/1371

そこに弊社も参加させて頂くことになりました。ただし、参加といいましても、皆さんと一緒にアーバンデータチャレンジ(UDC)2016の応募を目指してアプリを作る側ではありません。アプリを作るための技術セミナーの講師として参加させて頂きます。弊社代表が担当する技術セミナーはkintone。

当日は、福島に対する想いを沢山お持ちの皆様のアイデアが、アプリ開発を通じて実現されてゆくプロセスを目の当たりに出来るはずです。熱気溢れる場となることでしょう。奇想やビジネス感覚に溢れたアイデアにも出会えることでしょう。弊社代表もハッカソンには今まで誘われていながら、一度も参加できていませんでした。今回はとても刺激を受けることになるはずで、今から楽しみにしています。

残念ながら応募者多数により、新規受付は締め切られてしまったそうです。が、当日の模様については可能な限りブログにてレポートさせて頂きたいと思っています。乞うご期待!


kintone Café 福島 Vol.1 ではkintone愛を語りました


%e5%86%99%e7%9c%9f-2016-10-01-14-57-489/30の郡山商工会議所でのセミナーについては、こちらのブログで反省点も含めて報告させて頂きました。こちらは、その翌日10/1に行われたkintone Café 福島 Vol.1についてのエントリーとなります。

セミナーを終えてホテルに投宿した私は、反省と手応えの両方を握り締めていました。今日のセミナーで得た反応を明日のkintone Café 福島 Vol.1にどう活かすか。反省点を改善して臨むのか、それとも手応えをより伸ばして臨むのか。

私が選んだのは、手応えをより伸ばす方でした。もちろん、セミナーで得た反省点は反省点として真摯に受け止める必要があります。しかし、私は元々減点評価でなく加点評価で物事を捉えがち。それにkintone Café 福島 Vol.1を翌日に控え、今さら付け焼刃の修正もないだろうと。それよりも、今日のセミナーで得た手応えを元に、長所をより出していこうと判断しました。

もともと主催者の方に事前にお伝えしていた私の演目のタイトルは「開発者から見たkintone」。であれば、タイトル通り、開発者から見たkintoneの良さをとことん語ってやろうではないか。そう前向きに考えました。kintoneと出会って感じた衝撃や、そこから私が得た技術者としての手応え、管理部門として埋没し掛かっていた自分が再び技術者としての可能性に目覚めるまで。そんな自分のkintone愛を書きまくってやろうではないか、と。しかも、kintone Café 福島 Vol.1には、私をkintoneに誘い、その後エバンジェリストにまで推挙して下さった方がサイボウズ社からいらっしゃるとか。であれば、その方への御礼もしたいではないですか。そしてそういった私の思いを話すことで、福島や郡山の技術者の皆さんにkintoneの良さが伝われば、開発プラットホームとして選ぶに値するとに思って頂ければ本望ではないか。そう思いました。

それからは、月末締めの準備と並行しつつ、喋る内容を再度練り直す作業に没頭しました。そして、練り直すと同時にスライド原稿にも手を入れました。結果、書き上げた私の演目内容は、今までmixiでもTwitterでもFacebookでもブログでも書いたことのない、個人的な技術者としての想いが詰まったものになりました。

その夜は郡山のThe Bar Watanabeでお酒を心行くまで楽しみ、翌朝も月初の仕事をこなした後、気合を入れて往復40キロの自転車旅を敢行しました。おかげでkintone Café 福島 vol.1の会場であるCO-BA KORIYAMAに到着したのは開始ぎりぎりの15:00でしたが。

%e5%86%99%e7%9c%9f-2016-10-01-15-06-35会場となるCO-BA KORIYAMAはとても広く、しかもスツールやカウンターテーブルが置かれたり、ソファに絨毯のスペースがあったりと、とても居心地のよい空間となっていました。なぜか中央に鎮座する卓球台兼テーブルもポイント高いです。そして、人数が前日のセミナー並みに集っています。しかも、年齢層がぐっと下がり、いかにも技術者が集った感が醸し出されてまして。これは多分、セミナーに比べて技術者率がぐっと上がったということでしょう。期待度をひしひしと感じました。そして、サイクリングの疲れでフラフラでしたが、私が昨夜書き直したトーク内容が通ずる、という予感がしました。

私の話した内容はこんな感じです。

%e5%86%99%e7%9c%9f-2016-10-01-23-19-36初めてのサイボウズ社との出会いから、kintoneβテスターとしての申込み、ユーザー会でサイボウズ社の社風に触れたこと、kintone発売開始と私自身kintone案件受注。この辺りのエピソードを当時のTwitterの画面ハードコピーをお見せしながら紹介しました。次いで、私が常駐先の多忙により全くkintoneから離れてしまったこと。その間、技術者としてkintoneの進化に全く付いていけない焦り。技術者として袋小路に入ってしまったという危機感と絶望。最後に、エバンジェリストとしての推挙から法人化を経、ジェネラリストよりもエキスパートたれ、という言葉に開眼し、kintoneエキスパートを目指すことに社業のこれからを賭けようと思ったこと。そういった私の変遷を語りながら、一人親方の技術者としてなぜkintoneがふさわしいかを述べました。商談の場で要件定義と実装とテストが済んでしまうkintoneが、要件定義書や内部設計書やテスト仕様書、エビデンスの作成工数を省ける。それがなんでも一人でやらねばならない一人親方にとってどれだけ現状打破のツールとして魅力的か。そんなことを述べました。

CO-BA KORIYAMAは、演台と聴衆の皆様との距離が近い!私の前に喋られたお二方(サイボウズ社の後迫さん、テクネコ社の加藤さん)はどう思われたのか知りませんが、私にとっては聴衆との間合いがとても喋りやすかったです。前日のセミナーと差別するため、敢えてクダけた雰囲気で喋るつもりでしたが、会場の雰囲気もそれを手助けしてくれました。また、距離の近いことで、うなづきながら聞いて下さる方、笑って下さる方の反応もしっかり受け止められましたし。しかも、全く時計を見ずに喋ったにも拘らず、喋り終えたのは丁度30分きっかり。自分の持ち時間ぴったりでした。これには本気で驚きましたし、自分でも凄え!と思いました。

でも、良かったのはここまで。その後の質疑コーナーでは、まだまだ自らの知識不足を反省しました。トークでも触れたとおり、私が本格的にkintoneとの取り組みを再開したのは昨年秋。それまでの4年分の空白を埋めようと10ヶ月間追いつこうと努力してきました。しかし、まだまだ追いつけていないことが露呈しましたね。こなした案件数としてもまだまだ少ないと思わされました。

例えば、ユーザーが大量のアプリを作った際のアプリ管理はどうするか、というご質問。私自身が関わり納入したお客様は、こちらが提供したアプリ以外は自ら作らない方がほとんど。大量にアプリが存在する際のノウハウについて全く蓄積がなくお手上げでした。また、もう一つ抜かったと思ったのは、バッチ実行をどうするか、という質問でした。ここで私はkintoneのコマンドラインツールのことをすっかり失念してしまっておりました。また、スペース機能の活用についても、経験不足を反省しました。その辺りは、後迫さんと加藤さんにしっかりとフォローして頂きました。ありがとうございました。

こういった反省は、今後沢山の案件をこなして行くことで身につけるしかないでしょうね。kintone Café 福島 Vol.1で得た私の課題は、アプリのカスタマイズよりもむしろ運用面。この課題をどう埋めていくか。そこに努力を集中すべきという気付きが得られました。様々な業種、そして職種のお客様とkintoneを使ったシステムを組み上げて行く。そして運用面のノウハウを少しずつ積み上げて行く。これしかないと思います。

kintone Café 福島 Vol.1では、kintoneのβ版から関わったけれど、そのあと4年のブランクがあったことについて率直に述べました。任命を頂いてしばらくは肩書だけのエバンジェリストでしかなかったことも正直に言いました。しかし、昨秋から活動を再開し、今は伸びしろあるエバンジェリストになろうと努力していることも述べました。今さら経験を飾ろうとも思いませんし、運用ノウハウ不足をハッタリで補おうとも思いません。運用面の経験はこれからも引き続き積み上げ、そのためにもこれから頑張りで沢山のkintone案件を受注できるように頑張るしかないです。そして、その通りに郡山から帰ってからの二週間で、複数のkintone案件の引き合いを頂けています。ありがたいことです。

そういう意味でも、9/30の「脱Excel! 「kintone(キントーン)」で業務改善セミナー」とkintone Café 福島 Vol.1が地元の新聞で記事として頂いたことは、励みとなりました。両記事共に写真に私が登場しています。また、前者の記事には社名や私の名前までも載せて頂いています。仕事に関して新聞に名前が載ったのは初めてなので、正直嬉しいです。

あとは、今回のセミナーとkintone Caféで私が喋った内容が福島県の技術者や会社経営者の皆様にとって何らかの助けになったのであれば、これに勝る喜びはありません。そもそも私が何ゆえ郡山からの御招聘にお応えしたか。それは福島県の人々に何か貢献したいという思いです。これまで阪神・淡路大震災の被災者として、福島県の皆さんには何も出来ていませんでした。そういった私の心情についてはまたブログに書くつもりです。これからも今回のようなお誘いはなるべくお受けしたいと思っています。

その夜の懇親会は、とても初訪問の地とは思えぬほど、気持ちよく飲ませて頂きました。テーブルの下で足が攣るぐらいに。なのにうたた寝してしまうくらいに。

改めまして、kintone Café 福島 Vol.1の主催者の皆様、参加者の皆様、ありがとうございました!


kintoneセミナーで気をつけるべき点


先週末、セミナーの講師としてお招き頂き、郡山に行って参りました。
今回は、郡山地域ニューメディア・コミュニティ事業推進協議会様からのご依頼でした。題して、
「脱Excel! 「kintone(キントーン)」で業務改善セミナー」
http://www.techno-media.net6.or.jp/newmedia/advanced/1362

実は、首都圏を離れた場所でセミナーの講師としてお招き頂くのは始めてです。
今まで弊社の本拠である町田やkintone Café 神奈川、埼玉で話させて頂きましたが、今回は初めて首都圏を離れた場所でお話をする機会を頂きました。弊社にとっても代表の私にとっても初めての試みとなります。

dscn44582
こちらのエントリーでは、今回のセミナーを通じて得たことを書きます。一般の方向けにkintoneをプレゼンする際の反省。それが主な内容となります。また、今回はスライドとしてオンラインプレゼンサービスのslides.comを使いました。そういったオンラインプレゼンサービスでセミナーを行う際に気を付けるべき点も盛り込みました。ご参考になれば幸いです。

そもそも郡山市に訪問するのは、プライベートも含めて初めてです。福島県の皆様の県民性についても知らなければ、kintoneの普及率も知りませんでした。

事前に主宰者のご担当者からは、以下のような方向性を頂いておりました。
 ・社会人一般 ※IT系に限らず(業務改善・効率化・専門知識不要)
 ・中小企業の経営者・管理職(経営の効率化・コストダウン)
 ・ベンダー企業(顧客にkintoneを勧める立場の方)

つまり、技術者よりもユーザー様や導入決定に関わるご担当者向けの内容をご希望でした。

それを受け、どういうセミナー内容が相応しいか。考えました。

kintoneの特徴として真っ先に挙げられるのは、ドラッグ&ドロップによるフォーム作成の容易さと全体に通ずるシンプルな設計です。

それをフォーム設計の容易さ=工数削減の視点で話すか。
それとも、簡単にアプリが作れる楽しさに焦点を当てて語るか。

私が選んだのは両者のいいとこ取りです。

カリキュラムは以下の通り。
  ・excelとkintoneの比較
  ・アンケートアプリの作成実演
  ・アンケート結果の取り込み実演
  ・グラフの作成実演
  ・権限・通知・アクションの説明
  ・休憩
  ・Amazon連携・Google マップ連携の実装例の説明
  ・価格プラン・セキュリティについて
  ・Cybozu Developer Networkについて
  ・kintone Caféについて
  ・質疑応答

dscn44532
カリキュラムの冒頭では自己紹介をさせて頂き、その中で郡山の好印象を語りました。
続いてはExcelとkintoneの比較。kintoneを語る上で両者の比較は欠かせません。
その流れで、実際のアプリ開発の模様をアンケートアプリを例として取り上げました。アンケートアプリが出来た後は事前にアンケートアプリ用に用意しておいたデータの取り込み実演と、グラフ作成の実演。今回はハンズオンは行わず、私のデモをプロジェクタを通して皆様に披露しています。
休憩を挟んでからは、これまた事前に用意しておいたアプリで、住所を入力するとGoogle マップが反映する様子をごらん頂き、さらに書籍アプリとしてISBNを入力するとAmazonから取得した画像データなどが表示される実例の紹介。
その後は、価格の説明、セキュリティ、動作環境から、技術者向けのサポート体制についての説明を行い、質疑応答で幕を閉じました。

定員ぎりぎり、30名弱の方にご参加頂きました。主催者の皆様の努力には感謝です。また、終了後にはアンケートもご回答頂きました。

dscn4471
アンケートの内容からは、皆様の率直なご意見が伺え、とても参考になりました。30代の年齢の方々からは概ね高評価を頂きました。それはとても嬉しかったです。ですが、50代の方からは低評価でした。これには残念な思いでした。でも、高評価よりも低評価こそが自分を成長させてくれる原動力となります。率直にご意見が伺えたことにも感謝ですね。次回に向けてそこをどう活かすか。

以下に、私が受け止めた反省点と今後の改善点を書いてみます。

今回のセミナーでは、kintoneを紹介するのにExcelとの比較から入るのがよいと判断しました。実務に携わることの少ないであろう経営者の皆様にどうやってkintoneの利点を説き明かすか。パッケージシステムや基幹システムの替わりとしてkintoneを持ち出すのはよい選択とは思えません。それでは特定のシステムや業種に偏らざるを得ず、セミナーを聞きに来てくださっている皆様全てにとって相応しくありません。なのでセミナーで取り上げるとすればExcelを取り上げるのが相応しいと思いました。

では、Excelとkintoneはどう違うのか。何がkintoneの長所なのか。この点について、私は同時編集というキーワードに焦点を当てて話しました。

しかし、この点が経営者の方には分かりにくかったかもしれません。同時編集が出来ないことで困るのは、実務の方。そのあたりの不便さは経営者にとってはどうでもよいこと。kintoneの優位性を経営者の方に訴えるには、Excelとの比較には限界があるのかもしれません。30代の実務経験者にとっては理解頂けた点も、実務から離れて久しい経営者の方には利点と映らない。これは反省点ですね。

また、経営者は財務諸表で経営判断することに長けていらっしゃいます。ですが、kintoneのコスト削減効果を財務諸表でお見せすることに意味があるとは思えません。敢えて出すとすれば人件費の削減効果でしょうか。でも、それはアプリ開発のスピード感をデモすれば、容易にご納得いただける気がします。それもあって、今回のセミナーではその点には触れませんでした。ですが、コスト削減効果の見せ方は、今後の課題として考える必要があります。

また、もう一つの反省点は、画面が見えにくかった点です。なるべく文字を大きめに、一ページあたりの情報量も少なく抑えたつもりでした。事前に主催者のご担当者からはそれでもまだ一ページあたりの情報量を少なく、文字を大き目にというご指摘を頂いていました。また、文章の途中で単語が分割されてしまっている箇所についてもご指摘を頂きました。

ここで、冒頭に挙げたslides.comが登場します。ここのところ、私はセミナーや勉強会ではslides.comを使っています。パワーポイントに近い長方形のスライドがオンラインで簡単に出来るので重宝しています。

ですが、私が使っているプランは無料版なのです。無料版はCSS編集ができません。つまり画像のサイズが固定となります。ブラウザの機能でズームさせようにも、一旦貼り付けた画像はズームできません。一方、kintoneの画面を固定した画像はどうしても情報がつまっているため字も小さくなります。年配の方で、なおかつ会場の後ろに座っている方のためには拡大してお見せする必要があります。多分、年配の方からの不評の原因はこれが多かったと思われます。また、CSSが使えないことでもう一つ問題があります。それはテキスト自身の折り返し設定が、パソコンの画面解像度によって変動することです。つまり、セミナー資料を執筆し、改行箇所を調整しても、他のPCで確認すると違った箇所で改行されている可能性があるということです。特にテキスト要素自身の余白を多めに取っておかないと、変な改行が入るようです。これは今後注意したいところです。

CSSによる表示制御。それを実現するには、slides.comの場合Proプランにアップグレードする必要があります。今回は、改めてslides.comの無料版を使い続けることの限界を感じさせられました。
pricing-and-plans-slides

もちろん、オンラインプレゼンツールは他にもあります。Preziがよく知られていますよね。私も昨年、地元で始めてセミナーを行わせて頂いた際、Preziを使って資料作成しました。Preziはズームもできますし、各スライドを別々に管理するのではなく、一枚の大きな用紙の中を自由に移動させるという設計思想の下に作られています。これだとズームや改行の問題もうまく解消できそうです。ですが、私が使っているPreziのプランもまた、無料版です。Preziの無料版は、無条件に公開されてしまう制限があります。つまり、試作段階ですでに公開されてしまうのです。それもあって、Preziは使いませんでした。
%e6%96%99%e9%87%91%e3%83%97%e3%83%a9%e3%83%b3%e3%81%a8%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3
でも、Preziはズームが柔軟に出来るという点があり、やはり捨てがたい。

結局のところ、オンラインプレゼンツールにも一長一短があります。そして、セミナーの資料の質を上げるには有料版を使わざるをえないな、というのが今回の教訓の一つです。kintoneを説明する上で、画像のキャプチャは欠かせません。また、画像はズームして表示させないと、後ろのほうの席の方には見えづらい。ここの考慮をないがしろにすると、折角出席してくださった方のセミナーへの興味を殺ぐことになります。

これを解決するには、素直にパワーポイントをインストールするか、OpenOfficeのImpressを導入すれば済むのかもしれません。が、プレゼンソフト間でも相互の表示がきっちり同一になりません。それもまた、頭の痛いところです。プレゼン環境は早急に定めなければならないと思いました。

今回のセミナーで得た成果は多数ありました。そして、それと同じだけの反省点もありました。
それをまとめるとすれば、以下の三つです。

・Excelとの比較は実務担当者にしか有効でない。
・コスト削減効果を謳うには、 アプリの開発スピード以外に、実際の人件費削減効果を実際に試算したほうがよいかもしれない。
・プレゼンツールを厳選し、細かい画像もズームして表示させるような配慮が必要。

私にとって、今回の郡山商工会議所でのセミナーは、私自身にとってもすごく勉強になるものでした。セミナーの翌日は、kintone Café 福島 vol.1があったのですが、ホテルに帰ってからも資料の改訂作業にも熱がこもりました。

主催者の皆様、ご参加の皆様、今回は誠にありがとうございました!


2期目を迎え、2週間を経ての所感


4月に入ってから、ワークスタイルを少しだけ私の理想に近付けています。

Facebook静かな自宅では開発を集中して好きなだけ行い、一方では営業に商談に交流会にセミナーに自由に動き回る。といったような。もちろん、それにはリスクも覚悟も伴います。バランス感覚がより一層求められることは言うまでもなく。そんなわけで、今日から外回りの際はネクタイを締めることにしました。身だしなみ云々よりも自分のけじめのために。

今日は練馬のお客様の下へ訪問させて頂きました。社長様より経営哲学をじっくり聞かせて頂き、会社内も存分に見学させていただきました。実に見事な運営ぶりや、社員様やパート様との関係を実に上手に築いておられる姿に、感銘しました。アナログとITの長所が実にがっちりとかみ合っている運営を見るにつけ、非常に刺激になりました。ありがとうございました。

弊社も今後は人を雇って作業を分担していかねばなりません。すでに4月から一部の作業についてはお手伝いをお願いし始めています。でも人を自在に使いこなし、適材適所に相乗効果を発揮してもらうレベルに達するにはまだまだ私自身の精進が必要です。努力すべきと思っています。

4月に入ってからは、私自身の開発者としてのスキルをもう一度磨き直すべく、あえてタイトな納期のLAMP案件を請け、CUIでの操作も含めた開発・テストに没頭しています。一方ではkintoneエバンジェリストとしての動きを活発にしています。kintone Café 埼玉 vol.1の事務局を担当し、さらには別のkintone Caféの準備メンバーとしても動いています。そういった動きを重ねることで、人前でしゃべる技術を磨くという私自身の課題も少しずつ前に進んでいるように思います。今後もそのような場で登壇の場数を重ねるようにして、少しずつ経営者としての実践を身に付けて行きたいと思っています。

kintone案件のコンサル兼開発担当も2月から請けさせて頂いているのですが、そちらでも追加開発のご用命を頂きました。さらには今日、ありがたいことに別のお客様からもkintone案件をご用命頂きました。何とかkintoneエバンジェリストとしての顔でも、少しだけ見せられるようになってきたかな、と思っています。

ただ、私自身のマンパワーも限られています。開発とテストと営業と商談に加え、常駐先での作業もまだ続きます。トイロハさんへの記事アップは2週間ほど出稿出来ていません。トイロハさんは今後も続けていきたいと思っております。そんなわけで、交流会の出席はかなり厳選しなければ、と思っています。今日お話を聞かせて頂いた経営者の方も、交流会は厳選して参加されておられるとか。私も少し見直す時期が来ているのかもしれません。

でも、お蔭さまでなんとか4月からのワークスタイル変更もいい滑り出しを見せています。これも皆さまのお力添えの賜物と感謝しております。その場限りの儲け目当てではなく、お互いが永きにわたって良い関係を得られるよう、引き続き努力していきたいと思っております。

今後ともよろしくお願い申し上げます。


kintone Café 埼玉 vol.1を終えて


4/2にkintone Café 埼玉 vol.1が開催されました。
写真 2016-04-02 15 00 18

15名の参加者をお迎えし、なかなかに盛り上がりを見せたCaféとなりました。初回にしては上々の出来ではなかったかと思います。

vol.1の開催概要はdoorkeeperに記載の通りです。

内容については発起人の新妻さんによるこちらがすばらしく簡潔でよいです。

本当に皆様、よい発表だったと思います。私自身もとても参考になるところがありました。改めて発表者の皆様、参加者の皆様、ありがとうございました。

私自身は、ハンズオンを担当させて頂きました。そして、自分の知識不足を痛感しました。ただ、ハンズオンを担当して嬉しいこともありました。それは、とある参加者の方から私のハンズオンの分かり易さを評価して頂いたことです。これは私にとってはハンズオンそのものを評価されただけでなく、別の意味でも嬉しいことでした。

昨夏、私はエバンジェリストとして伸び悩んでいました。今後の活動について、どうすればいいのか、と。常駐先の仕事は忙しく、バージョンアップの度に新機能が実装されても検証の時間すら取れない焦り。ユーザー会やkintone Caféにもほとんど出る暇のない日々。それはただ、ひたすらに悶々とする日々でした。技術者としての自らのキャリアパスにとって、kintoneが最適解の一つであることは確信を持っていました。では自分のkintoneエバンジェリストとしての価値はどうすれば打ちだせるのか。

そんな葛藤の中、私が選んだのは最新の技術を追うのではなく、まずkintoneの本質を伝える道でした。kintoneに初めて出会った時の感動を愚直に伝えるのも、伝道師-エバンジェリストの役目なのではないかと。

もくもく会やkintone Caféで出会うエバンジェリストの皆さんは本当に優秀です。多分今の私よりもずっと。kintoneの可能性を限りなく拡げて行って下さる方があってこそ、kintoneの裾野は広がっていきます。無くてはならない方々だと思います。であれば、技術の追求は他のエバンジェリストの方にお任せして、私は愚直に初心者の方に、ユーザーの方に業務目線でアプローチしてみればよいのではないか? 元々私自身、ユーザー出身者として、ユーザー目線のシステム構築を売りにしていたのではなかったか、と。

そんな中、ご縁があってトイロハさんで初心者向け記事を書かせて頂く機会を頂きました。
https://toiroha.jp/media/detail/185
連載を読んで頂いている方はお分かりのとおり、こちらの連載はかなり異質です。見方によっては、IT女子二人の試行錯誤がだらだらと続いているだけ、とも読めます。最短距離をゆき、効率的合理的に説明を果たすアプローチとは一線を画しているのがこの連載です。でも、私は本連載の中で、敢えてユーザーの立場からの試行錯誤の跡を隠すことなく書いてみようと思いました。

まだ、このやり方が正しいかどうかはわかりません。私自身もこのアプローチでよいのか迷うこともあります。でも、少しずつ評価を頂くことが増えています。なので、今回のハンズオンも同じアプローチを採りました。トイロハさん連載に登場するIT女子だけでなく、著者自身もまた試行錯誤の中にあることを隠さないのと同じように、ハンズオンのスピーカーもまた、修行中であることを隠さぬアプローチ。だから、今回のハンズオンがある参加者の方から評価されたことは、私にとって特別な嬉しさがあった訳です。

今、kintoneは追い風にあります。最近、特にそう思う出来事が増えてきています。

電車に乗っていてサラリーマン同志の交わす会話から「kintone」の言葉が聞こえます。システムの提案要件に当初から「kintone」の含められる案件が増えています。今日も、とある案件の応募先のご担当者様とお話しする機会を頂きました。その中で、弊社以外にも「kintone」による提案が多々あったと教えて頂きました。何よりもお客様の下に伺って「kintone」の提案をすると反応が上々であるケースが増えています。間違いなくシステム構築案件の選択肢の一つとして、kintoneの地位は上がっています。

そういった波に乗るにあたり、私も技術者の端くれですからJavaScriptを駆使したカスタマイズや他システムとのAPI連携に挑みたい気持ちはあります。意図した動作が実現できた時の高揚感は、技術者冥利に尽きますし。

でも、私自身のエバンジェリストとしての存在意義は、きっとそこにはないのだと思っています。少なくとも現時点では。初心者目線を保ったままのアプローチ。まずは業務より始めよ、です。業務とkintoneの互いを活かして相乗効果を産むアプローチ。業務をシステムに合わせるのではなく、システムを業務にカスタマイズするのでもなく、両者の良いところを組み合わせるアプローチ。このアプローチでもう少しやってみようと思っています。

次回のkintone Café埼玉 vol.2。または準備中のkintone Café某所。スピーカーとしての腕前はまだまだこれから磨かねばならない私です。が、引き続き初心者目線でのアプローチは崩すことなく、kintone Caféに臨んで行きたいと思っています。まだkintoneを知らない方に、kintoneの良さを少しでも伝える。これもまたエバンジェリストのあり方の一つだと信じて。

昨夏から試行錯誤してきたエバンジェリストとして行くべき道がようやく少し見えてきた気がします。

これからも、弊社のブログなどでkintone Café埼玉やkintone Café某所のご案内は流して行きたいと思います。そして、その場でまだ見ぬ皆様とお会いできることを楽しみにしています。既存の業務要件を入口に、納品を出口としたシステムでは拾いきれなかったニーズを持ったユーザー様は、あちこちにいらっしゃるはずですから。


年賀状の宛名書きをkintoneにお願いする。WordとAccessを和えて


kintone Advent Calendarへの参加表明をしたはいいですが、ネタ選びで思惑が狂ってしまいました。ネタにしようと目論んでいたSansan API(eightではなくてSansanの方)とkintoneの連携。ところがSansan様よりAPIの技術情報をブログ等で出すことなかれ、と言われてしまいまして。
え、あと私の担当日まで3日しかないのに、どうしよう・・飲み会も続くし、年賀状も書いてないのに。・・・ん?年賀状? と思いついたのがこちらです。はがきといえば差し込み印刷。Wordです。Wordからkintoneを読み込めないか、という浅い思いつきで調べてみました。 あまり実践的な内容とはいえませんが、ごらん頂ければ幸いです。

本記事のネタは 2015/12/11時点のkintoneとWord 2010とAccess 2010で構築しています。12/12に予定されていたkintoneアップデートは延期されてしまいました。アップデートの後も本記事にある技術は使えると思います。
あ、それとQiitaから頂いたリマインドメールにはブログにアップしたurlを連携してもよいと書かれていたので、当方のブログにアップしました。不都合があればQiitaに上げなおします。

 

Wordの差し込み印刷

さて、まずはWordを立ち上げて下さい。メニューの差し込み文書から、宛先の選択を選びます。

1

 

すると、新しいアドレス帳というダイアログが開き、情報が入れられます。いいですねぇ。ちなみに私、Wordの差し込み印刷はほとんど触ったことがありません。

2

 

で、入れ終わって閉じてみると、mdbの保存ダイアログが出てきました。ほう、Wordの裏側はAccessだったんですね。これは思惑が狂いました。調べてみたのですが直接Wordを触って差し込み印刷の値を設定する方法がわかりませんでした。でも、Accessとkintoneって近いようであまり連携例を見かけません。この機会に連携も試してみましょう。ではAccessを任意の場所に保存してみましょう。

3

 

Accessの設定

Accessが出来ました。Address.mdbというやつです。じゃあこれを元にしてkintoneに一つアプリを作ってみましょうか。作成されたAddress.mdbにあるテーブルは一つだけ。Office_Address_Listというテーブルです。これをエクスポートして、csvファイルとして保存し、そのcsvファイルをkintoneに備わっているcsvからアプリを作る機能で作れば何とかなりそうです。

4

 

テキストエクスポートウィザードで出してみます。

5

 

カンマ区切りですね。あとは先頭行をフィールドとして使うにチェックを入れてください。kintoneのアプリストアでExcel/CSVからのアプリ作成で、先頭行に見出し行が設定されている必要があります。

6

 

じゃあ、この場所にcsvを作ってみましょう。

7

 

そしてkintoneへ

いよいよkintoneの出番です。アプリストアから「Excel/CSVから作成」を選びましょう。そしてAccess.mdbから出力したcsvファイルは、以下の通りとなっています。これはWordのアドレス帳のテーブルです。各項目のフィールドタイプはホームページとメール以外は「文字列(一行)」で設定しましょう。

8

 

無事、アプリが作成できました。あとはここに住所を入れて行けば、念願のクラウドでの住所録管理は目の前です。あ、それと、kintoneのフォームで各フィールドのフィールドコードの設定を以下の通りでお願いします。

            ふりがな(姓) → FamilyName_Furigana
            姓 → FamilyName
            ふりがな (名) → FirstName_Furigana
            名 → FirstName
            敬称 → Title
            会社名 → CompanyName
            部署名 → DivisionName
            役職 → Position
            郵便番号 → ZipCode
            住所 1 → Address1
            住所 2 → Address2
            住所 3 → Address3
            勤務先電話番号 → OfficeTelNo
            勤務先 FAX 番号 → OfficeFaxNo
            自宅電話番号 → HomeTelNo
            自宅 FAX 番号 → HomeFaxNo
            連名 → JointSignature
            連名敬称 → JointSignatureTitle
            電子メール アドレス → MailAddress
            ホーム ページ → WebSiteUrl
            市区町村 → City
            都道府県 → Prefecture
            国/地域 → Country

9

 

いよいよAccessからkintoneへ

kintoneにアプリを作ったら、今度はAddress.mdbです。このAccessとkintoneが連携できればよいわけです。ここで、Visual Basic Editorを開いていただき、ツール(T)→参照設定をお願いします。

10

 

参照設定でなにをするかというと、連想配列を使うのでMicrosoft Scripting Runtimeにチェック。それとmdbへのテーブル操作にADOを入れてみましょう。Access 10であれば ADO 2.8が無難でしょうね。これもチェックをお願いします。

11

 

つづきまして、以下の標準モジュールとクラスモジュールを入れてください。ファイルのインポートで可能です。なお、それぞれのモジュールファイルは用意しました。ダウンロードしやすいようにzip化しておきました。解凍してお使い頂ければ。あ、怪しくないので大丈夫ですよ ^_^

JSON
Mod_CommonDeclaration
Mod_DataTrust
Mod_GetKintone

12

 

さて、インポート頂いたファイルですが、ほとんどはそのままで使えるようにしていますが、皆様の環境に応じて若干の変更が必要です。そうしないと動きません。例えば、Mod_GetKintoneのファイルの19行目。ここで
Set objJSON = GetJSON("/k/v1/records.json?app=**") という記載があります。このアスタリスクの2文字は、先にkintoneに作ったアプリのUrlにある数字を入れてください。

12-3

 

続いて Mod_DataTrustです。ここは7行目。
Private Const TARGET_URL As String = "https://*******.cybozu.com"
という記述の****** の部分に、ご契約されているkintoneのドメイン名を当ててください。

12-1

 

さらに Mod_DataTrustです。ここは76、77、78、79行目に情報を入れて頂きます。
76行目はベーシック認証の情報です。BAsic_IDの部分にIDを。Basic_PWの部分にパスワードをお願いします。
77行目はご契約されているkintoneのドメイン名を****の部分に入力してください。
78行目はBAsic_IDの部分にIDを。Basic_PWの部分にパスワードをお願いします。
79行目はkintone内で使用するユーザーのIDとパスワードです。IDの部分にIDを。PWの部分にPWをお願いします。
12-2

さて、ここまででAccess.mdbとkintoneの連携は出来ました。AccessからMod_GetKintoneの中にあるgS_CmdDataRequeryClickを実行すれば、kintoneのデータを反映するのがわかります。

 

再びWord

さて、Wordに戻りましょう。Wordの文書は新たに作成して結構です。作成したら、差し込み文書を選びます。さらにはがき印刷を選んでください。

13

 

さらに、宛名面の作成を選びましょう。

14

 

するとはがき宛名面印刷ウィザードが開きます。

15

 

種類は、年賀/暑中見舞いを選びます。

16

 

さらに様式を選びましょう。好みで縦書きでも横書きでも結構です。

17

 

フォントも選びましょう。

18

 

差出人の情報を選びます。差出人を印刷するにチェックを入れると差出人情報が印刷されます。

19

 

既存の住所録ファイルにラジオにチェックして下さい。さらに、住所録ファイル名は、先ほどAccessのmdbを保存したパスを入力して下さい。

20

 

これではがき宛名面印刷ウィザードは完了です。

21

 

すると、年賀状のイメージと各項目のフィールドに、kintoneに入力した情報が出てきます。この時点で出ているのは、当初アドレス帳に入力して、Address.mdbに入った情報です。

22

 

違う宛先を表示させるには、差し込み文書からメニューの右にある矢印をクリックすればそれぞれの情報にアクセスできます。

23

 

それではこのWord文書を保存して閉じましょう。そして、もう一度開き直すと、以下のようなメッセージが表示されます。これは毎回Address.mdbの情報を見に行き、SQL文を発行してAccess.mdbの情報を取得していることを意味します。

25

 

さて、ここまで出来ているのであれば、もう一段階進んでみましょうか。
先程Accessにモジュールを組み込んで頂いた際に、「AccessからMod_GetKintoneの中にあるgS_CmdDataRequeryClickを実行すれば、kintoneからデータを取りに行ってくれます」と書きました。では、これをWordから行えるようにすれば、いちいちAccessを起動せずに済みますよね。
そんなわけで、GetKintoneFromWordをご用意いたしました。こちらもzip化しています。解凍したらGetKintoneFromWord.basが現れます。これをWordのVisual Basic Editorからファイルのインポートで取り込んで頂ければ。すると、Wordからkintoneの取り込みを行い、その結果をAccess.mdbに取り込むことが出来ます。なお、mdbの場所は C:¥kintone¥Address.mdb にある前提で作成しています。26

 

では、組み込んだマクロを実行してみましょう。メニューの表示からマクロ→マクロの表示を選びます。

26

 

一覧が出るので「アドレス帳最新化」を選んで実行を押してください。

27

 

そうするとkintoneで変更した内容がwordにも反映されます。これで完成です♪
どうでしょう? 今ならまだ年賀状に間に合いますよ♪

29

 

 


cybozu.com conference 2015に参加して


先日、cybozu.com conference 2015 Tokyoに行ってまいりました。https://cybozuconf.com/
私にとってcybozu.com conferenceは3年半前に参加して以来となります。

その時のcybozu.com conference 2012では「世界に通用する日本の企業クラウドを作る」という青野社長の基調講演から、各種セミナーにいたるまでじっくりと参加できました。その少し前に行われたcybozu.comのプレス発表会にも参加させて頂いた私は、海外製品が幅を利かせる現状にサイボウズさんが風穴を開けてくれることに期待し、心地良い期待感と昂揚感に胸躍らせたことを覚えています。

以来、cybozu.comの成長は素晴らしいものがあります。まさに日本発のソフトウェア企業として、有数の会社になっていると思います。私もその波に乗りたかったのですが、cybozu.com conference 2012の直後から参画したプロジェクトに忙殺され、まったくユーザー会にもカンファレンスにもお伺いできずじまい。忸怩たる思いをずっと抱えていました。Kintoneの正式リリース前からkintoneβ版で開発し、正式リリースとほぼ変わらぬ時期にお客様に販売管理システムを無事納品し、以来ずっと運用している自負を持つだけになおさら。

でも、現状をどうこう言っていても仕方ありません。現状をいかにして将来に役立てるかが重要です。今回のサイボウズカンファレンス2015ではセミナー2つのみの参加でした。しかし、その2つのセミナーこそが、今私が参画しているプロジェクトでの経験を将来に役立てるにあたり、ためになると思ったので参加しました。

「サイボウズで実現するNotesマイグレーション~事例に学ぶーNotesマイグレーション成功の鍵~」
「ただしく恐れるクラウドのセキュリティ」

最初のNotesセミナーですが、私にとって現状を活かすには最適なセミナーでした。今のプロジェクト行っている諸作業のうち、Notes Designerを使ってのNotesDB作成があります。正直なところクラウド全盛の今にあって、クライアント/サーバー(クラサバ型)システムによるNotesグループウェアが通用するかは微妙です。しかし、NotesはNotesで今まで広く使われていただけに、慣れた人には使いやすいのでしょう。私にしてもNotes Designerを使い始めたのはこの1、2年ですが、拡張性や機能自体は悪くないと思います。ただ、Lotus Scriptのデバッグやエディタなどがイライラするほどユーザーに優しくないことを除けば、やれないことはあまりないといってもよいと思います。しかし、それにはスキルがいります。NotesはNotesでクラウド化を推進していると聞きますが、多くの現場では依然としてクラサバ型の構成が主流でしょう。特定のNotes技術者を育成せねばならぬところ、開発者向けの環境充実にあまり力を入れていないところからすると、衰退も致し方ないのかもしれません。

しかも、Notes Designerを触って思ったのが、テーブルいらずの発想が、クラウド製品に似通っていること。普通はテーブル設計から入り、Create文を作ってストアド・プロシージャ―などを流してDBを作り込みます。しかし、Notesはいきなりフォーム設計から入ります。フォーム設計でフィールドとして項目を埋め込んでいくことで、それがテーブルとなっていく。この構成は実は、kintoneやSalesForce.comといったクラウドの代表的なアプリにも見えます。ここらに、両者に共通する点を見つけることができました。セミナーでうかがったのですが、青野社長がサイボウズ社を創業するにあたり、Notesの管理者をされていたことがベースにあったとか。これは知らなかった。

サイボウズさんでは、Notesマイグレーション事業を行うにあたり、ターゲットとなる製品をGaroonとkintoneで想定していらっしゃるようです。そして私はkintoneユーザーかつエバンジェリストの端くれでもあります。Notes Designerの現役開発者であり、かつ、kintoneの開発者。ここに私には現状を将来に向けて活かせる突破口を見出したのです。

また、私はkintoneには慣れていますが、Garoonはまだ触ったこともない状態。今回はGaroonに取り組むきっかけになるのでは、とも思いました。例えばNotes上の文書に貼り付ける添付ファイルの位置、これもGaroon上でほぼ再現できるそうです。これは大きいセールスポイントです。

ここ3年ほど、私の人生にとって、技術力の成長面では停滞していたといわれても仕方ありません。エバンジェリストにして頂いたり、法人化を成し遂げたり、診療所を開設したり、自治会で総務部長を完遂したりと個人的にはかなりの成長を遂げることができた3年ですが、最新技術の吸収ではかなり遅れを取っています。危機感も相当持っています。今回のセミナーは、そういった意味でも勉強になりましたし、今後の自分のスキルとして営業に加えていこうと考えています。

また続いてのセキュリティセミナー。これもまた重要です。実は今までもサイボウズさんのセキュリティに関するセミナーには参加させてもらっています。しかしやはり現役の運用本部長からのお話は、紙やディスプレイで読むのと違い、頭に入ります。クラウドに興味を持っていただくお客様の第一の要件は、業務を遂行することができるか、ということです。ただ、お客様自身、あまり口には出しませんが、クラウドのセキュリティへの不安はお持ちではないかと思うことがあります。それはまた、2016年1月からのマイナンバー導入を目前にした今、ますます注視されていることでしょう。私にとって、改めてサイボウズさんの施している万全のセキュリティに対する体制を伺わせて頂いたことは、良かったと思います。今参画しているプロジェクトでも、セキュリティ遵守に関する話は統括部門だけに当然耳に入ってきます。また、運用本部長の山本氏のセキュリティについての謙虚な姿勢も良かったです。100%安全ですというセキュリティに対する態度程危ないものはないと思っています。常に努力と改善しかないのだろうな、と思います。

今回のセキュリティセミナーの受講で新たになった私の知識は、今後のクラウド提案に活かせると思っています。会場でも配布していましたが、セキュリティ&運用基盤というパンフレットは常に最新版を持ち歩いていたいと思いました。説明を求められた際には対応できるように。

現場の作業の都合もあり、青野社長をはじめとした豪華ゲストの方々による基調講演は行かれず。また、夜の池上彰氏による特別講演も聞かれませんでした。しかし、たとえわずかな時間であっても、昨年は参加すら出来なかったことに比べたら状況は回復の途中にあるといえます。私も、このまま回復基調を維持し、次なるキャリアステップに役立てたいと思います。


kintoneのレコード詳細ページからAmazon商品データを参照するテクニック(3/3)


3.kintoneからのJavaScript呼び出しとJavaScript内でのAjaxの記載について

 ここでは、kintoneへのJavaScriptの適用方法その他の説明は割愛します。はじめよう kintone JavaScript API の記述が大変参考になります。私も最初はここから勉強しました^^

 ただし、本稿でもまた、前書きを書かねばなりません。恐縮ですm(_ _)m

 それは、kintoneからAmazon API呼び出しのタイミングについてです。冒頭でも挙げたように、本稿ではレコードの詳細画面でAmazon情報を呼び出すのが目的です。しかし、レコード詳細画面の編集時画面での実装については、本稿では触れていません。できなくもないのですが、現在の2014年9月時点のkintone JavaScript APIでは、レコード詳細画面のテキストボックスの値変更時にJavaScriptを呼び出すことができません。そのため、編集時画面でAmazonからの情報を表示させる意味がないと判断し、記載から外させて頂きました。ご了承下さい。ただし、レコード編集画面のフィールド値変更時イベントについては、2015/07/12の定期メンテナンスにおけるkintone API更新で実装されました。が、本稿ではまだ検証に至っておらず、掲載しておりません。ご了承ください。

 また、Amazonからの呼び出し自体にも、全く問題がない訳ではありません。Amazon側にリクエストを続けて投げると、Http/1.1 Service Unavailableのエラーが返ってくる場合があります。なので、リクエストはほどほどに・・・ということなのでしょう。このエラー対策については、jQueryのAjaxで、Errorハンドラから再帰呼び出しを試したのですが、calleeとuse strictが両立できていません。なので、時間をおいて再実行ということでご了承ください。

 最後にクロスドメイン制約についてです。本稿の目指す実装は、*****.cybozu.com から ****.jp/ または *****.co.jpといった違ったドメインのサーバーにAjaxリクエストを発行します。が、そのような別ドメインへのリクエストは、セキュリティ上脆弱になりかねないため、環境によっては簡単に通信ができないようになっています。本稿ではphpからkintoneへ渡すデータ形式をXMLにしました。JSONPを使えばクロスドメイン制約についても解決できるようです。が、今回はXMLを選択しました。ご了承頂ければと思います。随所にそのあたりについて

 あと、jQueryの呼び出しも必要となりますので、kintoneのアプリ設定画面から、JavaScript登録を忘れずに。

 さて、気を取り直して実装開始^^

 以下は、AmazonCallBookInfoDetail.jsの内容です。200行あるすべてのコードを開示しながら、適宜解説を加えていきたいと思います。

  4行目     jQuery.support.cors = true; はクロスドメイン制約をかいくぐるための呪文の一つです。

  5行目     kintone.events.on('app.record.detail.show', function(event){
は詳細レコード呼び出し時に書く呪文です。

  6行目     実行しているブラウザの種別をここで取得しています。呼び出し先のURLがhttpsから始まっても、画像はhttpが返されることがあり、それを防ぐために一部ブラウザによって画像のアドレスを変更しています。

  8行目     表示したkintone詳細レコードのISBNフィールド(フィールド名はF_Isbn)の値を取得しています。

  9行目     8行目で取得したIsbnから – ハイフンを除去しています。

  10行目     8行目で取得したIsbnから  ISBN を除去しています。

  11行目     kintoneフォーム上で事前に作成しておいたスペースをここで取得しています。このスペース内にAmazon からの情報を書き込んでいきます。

  12行目     kintoneフォーム上で事前に作成しておいたスペースをここで取得しています。このスペース内にAmazon からの大きな画像を表示させます。

  15-17行目 本稿で実装する内容では、ユーザ入力データからのサニタイズ処理はあまりありません。唯一この場所で実施しています。数値がどうかをチェックしていますが、ISBNの末尾一桁のチェックディジット結果が X となる場合があり、その場合のみ許可しています。

  19行目     12行目で取得した画像表示用イメージの横幅を指定しています。

  20行目     11行目で取得したAmazonデータ表示用スペースにユーザを飽きさせないために表示しております。

 

 

  24行目     先に紹介しましたが、codeとIsbnという2つのパラメーター以外に、nowというパラメーターも追加しています。実はnowパラメーターは以下の処理では使われていません。投げるリクエストURLを常に変化させないとInternet Explorer上でうまく値が戻ってこないという情報から、このような記載を設けています。

  25行目     ここは xml を指定しています。おそらくはjsonpでもjsonでもうまくいくことでしょう。

  26行目     キャッシュをOFFにしないとInternet Explorerで正常に戻ってこないという情報を基に追加しました。

  27行目     非同期処理をONにしています。ここをOFFまたは記載なしにすると、何らかのエラーがAjaxで発生した場合、ブラウザがフリーズしてしまいます。

  28行目     10000ミリ秒、つまり10秒間だけphpからの戻り値を待ちましょう。という指定です。

  29行目     正常にデータが戻ってきた場合の処理を30行目以下に記載します。関数の引数dataが、成功した場合に受け取るデータが格納された変数です。

 

 

  30-79行目     商品情報に関するすべてのAmazonからの戻り値を変数として宣言してあります。正直、ここまでやる必要はありません。ありませんとも。

  82行目以下は、実際のXMLの内容を基に、DOMの森を探索することになります。なので、以下ではXMLを実際に表示させてみます。

  この中で実際に表示させるのに必要なのは、32行目の<Item>タグ以下のデータとなります。

  53-101行目までは各種商品イメージの情報が記載されています。この中で53行目から67行目までのSmallImageとMediumImageとLargeImageは。その下の68行目から101行目までの間に同一の情報があります。なので、この部分は取得を省略してもよいでしょう。

  102行目以下は主要な情報が並んでいます。これらはほぼ取得すべきところです。ただし、データの種類によってはタグ自体がないものもあります。以下の例でいうと、104行目の<Creator>タグは小説のように著者がある本には登場しません。著者がある本は<Author>タグが替わりをつとめます。また、112行から117行の<Languages>タグや135行目の<ReleaseDate>タグがないデータがあることも確認しています。

 もう一件、AmazonからのXMLデータで気を付けるべき点があります。それは書籍とkindle書籍の場合です。kindle書籍はISBN項目を持っていないのですが、Amazonの仕様でISBNに対してデータ検索結果にkindleデータも含まれます。XML上では、2つの<Item>タグが紐付いています。その場合は、JavaScript側で<Item>タグ内をループさせるのですが、<ISBN>タグの有無で判別しています。

 大体のXMLデータの構造がおわかり頂けましたでしょうか。先に紹介したAmazonのガイドですが、項目の位置はこちらでガイドされています。ただし、各項目がどのように商品データに関連付いているかはわかりません。なので、上に挙げた項目以外にも存在することもあるかと思います。ご容赦ください。

  82行目     jQueryの文法に則り、XMLのデータが格納された変数dataに対し、<item>タグの要素を検索しています。その結果をループしたのが82行目の記述となります。

  83行目     条件文が真の場合、84行以下の処理を実行しています。条件文の頭に$(this)とありますが、これは 82行目でループを開始した<item>タグの要素データを指します。<item>タグ内でさらに<ItemAttributes>タグを検索し、さらにその中で<ISBN>タグを検索しています。この構造については、3ページ前のXMLをご参照ください。<ISBN>タグの要素内のテキストを取得しているのが text()です。
つまり、ISBNの要素の有無によって判定を分けています。これは先にXMLの構造を説明する際にも書きましたが、kindle書籍データが含まれている場合の退避処理となります。

  84-85行目     <item>タグの要素データ内の<ASIN>タグや<DetailPageURL>タグの要素内データを取得しています。

  86行目     82行目で始めた<item>タグ内ループの中で、さらに<ItemLink>タグを検索し、さらに<Description>タグを検索し、それをループしています。

  87行目     86行目で始めた<Description>タグ内ループの中で、要素内の文字列が Add to Wish Listに等しいかを尋ねています。

  88行目     87行目で条件に合致した場合、<Description>タグと同じレベルの隣のタグ<URL>タグの要素内のデータを取得しています。

  90-98行目 87、88行目と同様です。それぞれの<URL>タグの内容を取得しています。

  99行目     86行目で始めたループを閉じています。

 

  100行目     82行目で始めた<item>タグ内ループの中で、さらに<ImageSet>タグを検索し、それをループしています。

 

  101-118行目    100行目で始めた<ImageSet>タグ内ループの中で、それぞれの要素タグの内容を取得しています。

  119行目     100行目で始めたループを閉じています。

 ここまで来たら大分要領がつかめてきたのではないでしょうか。あともう少しで終わりです。お疲れのことでしょう。
私も大分疲れてきました・・・(^^;)

 120-146行目     それぞれの要素内データを取得しています。もう説明は不要ですよね。ただ、121行目ですが、Attrという見慣れない記述があります。この部分に対応しているのは XMLの104行目に当ります。<Creator>タグ内に Role="監修"というRole属性の値を取得するために、Attrという命令を発行しています。これを末尾につなげることで、 サイボウズ式編集部 監修 という文字列を組み立てているわけです。

 

  147行目     83行目の<ISBN>タグの有無を判定したif文の終わりです。

 

  148行目     82行目で始めたループを閉じています。

  149行目     aws_ASINの値が真かどうかを判定しています。cybozu.com developer networkのTipsの中に(小技)undefined と空文字のスマートな if 文判定がありますが、そちらの記述通り、文字列の取得結果がnull または undefined以外のデータの場合、150行目以下の処理を実行します。

  150-173行目   11行目で取得したスペースに対し、innerHTMLを使用して書き込むべき文字列を生成しています。今回の実装では、一つのスペース内に改行で区切ってAmazonからの情報を羅列する手法を採りました。冒頭に記載しましたが、編集時画面に実装し、Isbnの値の変更時に各フィールドに自動入力するほうが望ましいという考えもあります。なお、169行目から173行目は取得したURL文字列を<a>タグの中に含めています。

  174行目     6行目でブラウザの種別を取得しました。取得したブラウザ文字列にfirefoxが含まれているかどうか、要は実行しているブラウザの種類を問うているのがこの行です。

  175行目     使用ブラウザがfirefoxの場合、12行目で取得したスペースのinnerHTMLに対して書き込む画像の http: を 空白文字 にしています。Firefoxだけが、https:// から http:// の画像を読み込もうとするとエラーが出るため、このような処置を取っています。

  176-178行目     使用ブラウザがFirefox以外の場合、12行目で取得したスペースのinnerHTMLに対して書き込む画像のURLをそのまま使用しています

  179行目     149行目で判定したaws_ASINの値が偽だった場合に、180~184行目の処理が動作します。なお、Amazon側に渡したISBNコードが不正な値だった場合、XMLは違う種類のメッセージを返します。ほとんどの部分は一緒なのですが、<Items>タグの中の<Item>タグが<Errors>タグに置き換えられています。以下にエラー時のXMLを提示します。

 

  180-184行目     11行目で取得したスペースにエラー情報を含めます。上の図にあるとおりのエラー構造に基づいて、適宜整形して頂ければと思います。

 

  185行目     149行目で判定した条件式の終わりの部分です。

  186行目     29行目で判定したAmazonから正常な値が戻ってきたかどうかの判定式の終わりの括弧です。

  187行目     Ajax通信に何らかのエラーが生じた場合、処理はこちらのステートメント内で行われます。関数の引数として、XMLHttpRequest、textStatus、errorThrownといった値が返されますので、その値に応じてメッセージを整形されるとよいでしょう。

  193-195行目     errorThrownは場所の数だけ配列として戻ってきますので、193~195行では配列の要素数だけ処理を行っています。

  196行目     ここでは取得したエラー情報をアラートとしてポップアップ表示しています。Amazon情報を表示するスペースに表示するのもよいでしょう。

  197行目     187行目からのエラー時に実行される関数の終わり部分です。

  198行目     22行目からの$.ajaxの関数の終わりの括弧です。

  200行目     5行目からのkintone詳細レコード表示時に実行される関数を終えるにあたり、戻り値を返しています。

  201行目     5行目からのkintone詳細レコード表示時に実行される関数の終わりの括弧です。

  203行目     本JavaScript全体の無名関数の終わりの括弧です。

これでJavaScriptの実装は終了です。お疲れ様でした。お互い・・・

 さて、JavaScriptを完成させ、あとはこれをkintoneのアプリ管理画面からアップすれば完成!

 のはずですが・・・・・実は先ほどのJavaScriptの仕組みでは動かないブラウザがあります。それは。。。。Internet Explorerです。jQueryのAjax関数では、Internet Explorer 9より前のバージョンに対応しておらず、別の仕組みを経由してAjaxを実装する必要があります。なんてこった!またまたクロスドメインではまることになりました。

 Googleで検索を行うと、いくつかInternet Explorer 9以前のバージョンでのクロスドメイン実装についてのJavaScriptが存在します。私もいくつか試しましたが、私の環境ではそのうち動いたのが以下の1つだけでした。

 MoonScript/jQuery-ajaxTransport-XDomainRequest

 なので、今回はこちらのJavaScriptも使わせて頂きました。ありがとうございます。

 結果として、kintone上にアップするJavaScriptファイルは3種類となりました。最初にjQuery本体。次にIE9以前対応のクロスドメイン制約対応のJavaScript。最後に今回作成したJavaScriptです。

 これで完成です。

 と。このように表示が出来ましたでしょうか。レコードを移動すると新たなレコード先でAmazonから呼び出されたデータが表示されます。ただし、あまり短い時間で呼び出すとAmazonからの応答が途絶えてしまうことがあります。その場合は F5でリロードを行って頂ければと思います。

 外部認証が必要な複雑なAPIを呼び出す場合、このような方法があるよ、ということを理解頂ければ、さまざまなケースで実装が可能になり、kintoneをより一層ご活用頂くことができることでしょう。ぜひ、お試しください。ただしくれぐれも過度なAmazonへのリクエストはお控えください。1時間当たりのリクエスト回数も上限が定められているようですし・・・・

 本件について、文責は全て私、合同会社アクアビットの長井にあります。もし内容についての御質問などございましたら、お寄せいただければ、時間の許す限り、回答させて頂くようにいたします。


kintoneのレコード詳細ページからAmazon商品データを参照するテクニック(2/3)


2.phpを利用したAmazonへのパラメーターの生成方法について

 最初に一言申し添えておかねばなりません。なぜkintoneからAmazonの情報を取得するのにphpを介さなければならないか、について。

 cybozu.com developer networkをご覧の皆様は、すでに有識者の皆様が執筆された、秀逸なTipsの数々にも目を通されたことでしょう。Tipsの中には

  外部APIの同期処理をつかってみよう!

  他サービスのAPIからデータを取得してkintoneに表示してみよう

 という2つのkintoneから外部APIに接続するTipsも挙げられています。私も本稿を書くにあたって参考にしました。ありがとうございますm(_ _)m。

 これらのTipsはkintoneのJavaScript APIを使用しています。JavaScript内に外部APIのURLを直接書き込み、その結果を表示させる方法です。一方、Amazon APIを呼び出す際のURLですが、その中には全章で取得したAmazonの「Access Key ID」「Secret Access Key」「トラッキングID」の3種類から生成した署名文字列を含める必要があります。つまり、署名文字列を生成するにあたっては、JavaScript内に「Access Key ID」「Secret Access Key」「トラッキングID」という機密情報を埋め込まねばなりません。それを避けるために、外部のphpに署名文字列の生成や機密情報の扱いを任せようというのが狙いです。

 能書きが長くなりました。それでは実装に移らせて頂きます。

 まず、kintoneに埋め込むJavaScript内で呼び出すAPIのURLを記します。

パラメーターは ?code=ISBN&no='+Isbn としています。Isbnとあるのは、kintoneのフィールドに入力された本のIsbnを変数化したものです。Amazon認証情報に関する情報の一切はJavaScriptからは省かれています。

 次にパラメーターを受け取ったAmazonBookInfo.phpの中身を示します。

 JavaScriptに値を返すための各種ヘッダの記述と、Amazonから情報を取得する本体のphpであるSetBookByAmazon.phpの呼び出しが書かれています。ヘッダについてはGoogle ChromeとFirefox、そしてInternet Explorer 9で正常にデータが渡せることが確認できています。これは環境によって違いますので、工夫してみてください。特に4番目のヘッダで application/xml となっています。これはJavaScriptに対して渡すデータの種類を xmlとして規定する部分ですから、重要です。

 最後にパラメーターを受け取ったSetBookByAmazon.phpの中身を示します。

 これで動くはずです。あ、Access Key IDとSecret Access Key IDとアソシエイトTagはこんなふざけたものではなく、きちんとAmazonで取得した文字列を使って下さいね^^。

  define('AssociateTag','anatanoiddesu-99'); の赤字の部分を前章で取得した「トラッキングID」で置き換えてください。

  define('AccessKeyId','ICHIBANSAISHINNOAKUSESUKII');  の赤字の部分を前章で取得した「Access Key ID」で置き換えてください。

  define('SecretAccessKey','DAIJINADAIJINASIIKURETTOAKUSESUKIIDESUNENN');   の赤字の部分を前章で取得した「Secret Access Key」で置き換えてください。

 それ以外は、この内容でデータが取得できるはずです。このphpをサーバーにアップし、URLをアドレス欄に打ち込んでみてください。例えば以下のように。

 どうでしょう。XML形式でデータが表示されたのではないでしょうか。そう、あの本の情報が\(^o^)/

 なお、渡すパラメータや取得できる情報の種類はかなり多岐に亘っています。本稿ではISBNのみに焦点を当て、ISBNから取得可能な書籍情報のみについて紹介したいと思います。上に挙げたphpの内容もISBNによる取得に対応しています。Amazon Products Advertising APIの単一商品取得の ItemLookUpはこちらのリンクが公式情報となっています。

 上のphpの内容に ・・・・・・あ といった記述があります。くれぐれもこの部分はphpファイルからは除いてくださいね。動かなくなってしまいますので^^。

 以下は、その あ~か についての説明を記します。

 ・・・・あ その上の行と共にJavaScriptから渡ってきた変数が格納される場所です。

 ・・・・い Amazonから取得する情報の種類を指定します。ItemAttributesは商品詳細、Imagesは画像情報。このように複数の種類を指定する場合 , カンマでつなげます。

 ・・・・う 指定した各種パラメーターをそのパラメーター名称で並び替えます。署名作成時に必要な処理です。

 ・・・・え 指定した各種パラメーターをエンコードします。RFC3986で定められた方法に準じています。

 ・・・・お 署名文字列の生成部分です。ここで初めてSecret Access Keyの活躍の場が与えられます。ハッシュ関数によって、容易には結果から元々の文字列が推測できないような文字列に変換されます。

 ・・・・か 組み立てられたUrlから取得した文字列を取得します。結果文字列はXML形式で帰ってきています。

 ・・・・き 帰ってきた文字列を表示します。この表示処理によって、呼び出し元へ文字列が戻されます。

 これで、Access Key ID と Secret Access Key、トラッキングIDの3種類の情報とISBNからAmazonの書籍情報がデータ取得できました。あとはこれをJavaScriptで加工するだけです。あと一息です!もうしばらくご辛抱ください!!

 最後に、こちらで作成した SetBookByAmazon.php と AmazonBookInfo.php ですが、サーバーにアップする際、http://の領域ではなく、https:// の方にアップされたほうが良いかと存じます。

なぜかというと、呼び出し元となるkintoneのURLは https://******.cybozu.com/k/12/ とhttps://から始まります。これに対し、上記2つのphpファイルが http:// から始まる領域から始まると、ブラウザによっては好ましからざる動きをするからです。


kintoneのレコード詳細ページからAmazon商品データを参照するテクニック(1/3)


はじめに

kintone アプリで資産管理を行いたい、という要望はよく聞きます。その際、既存サイトのデータが参照できたら便利ですよね。例えば商品データを参照したい場合、Amazon APIを通して取得したいといった要件は十分考えられます。本稿では、kintoneの詳細レコード上に、Amazon APIから取得したデータを表示する方法について紹介します。

少々長くなってしまうので、簡単に本稿の構成を書いておきます。

1.AmazonのAccess Key ID と Secret Access Key、トラッキングIDの取得方法について

2.phpを利用したAmazonへのパラメーターの生成方法について

3.kintoneからのJavaScript呼び出しとJavaScript内でのAjaxの記載について

その前に・・・本件を実現するために必要なものがあります。それは例えば・・・

  1. パソコン。ノートでもデスクトップでもよいですが、スマートフォンや俗にいうガラパゴス携帯、またタブレットからの利用は考慮していません。
  2. パソコンのブラウザ。本件ではGoogle Chrome、Firefox、Internet Explorer9、11で検証しています。その他のブラウザでは予測不可能な動作に遭遇するかもしれません。もちろん、他のブラウザでも動けばそれに越したことはありません。ノウハウはぜひ教えて頂ければ^^;)・・・。とりあえずこの4種でお願いします。
  3. phpの動作するサーバー。今回の検証で使用したレンタルサーバーは、php.iniも変更できず、pearなどのライブラリも利用できません。SSLも専用でははく共用SSLを使用しています。phpネイティブだけを頼りに構築しているので、サーバー間の動作差異はあまりないと思えます。なお、レンタルサーバのOSはUnix系で、Apache 2.2で動いているそうです。phpのバージョンは5.3.2です。
  4. kintoneの画面ですが、最低限3つのフィールドが必要です。Isbnを入力するためのフィールド(名称:F_Isbn)を追加し、Amazon情報表示用のスペース(名称:Space_Image)と画像表示用のスペース(名称:Large_Image)を追加してください。
    表にまとめると以下のような感じとなります。

    フィールドタイプ フィールド名 フィールドコード 説明
    文字列(1行) ISBNコード F_Isbn ISBNコード用
    スペース Space_Image Amazon情報表示用スペース
    スペース Large_Image 画像表示用スペース

    (※以下の結果画面は違うフィールドも多数入っていますが)

    それらを満たし、かつ、kintoneにカスタマイズを加えると、以下のように詳細画面にAmazonからの呼び出し結果が表示できるようになります♪

最後になりますが、本稿は2014/10月に書かれました。その時期のkintoneとAWSの仕様に合わせています。cybozu.com developers networkへの掲載に合わせ、サイボウズ社のご担当者のチェックを経て、2015/2月のkintoneのバージョンアップ内容と本稿の記載を照合させた上で投稿しています。2015/7現在、まだ同じ仕組みで動作しているので、本稿の内容に問題ないとは思われますが、今後のkintoneおよびAWSのバージョンアップによっては本稿の内容が正常に動作しない恐れもあります。ご承知の上、ご参考になさって下さい。

1.AmazonのAccess Key ID と Secret Access Key、トラッキングIDの取得方法について

 https://www.amazon.co.jpにアクセスしましょう。まずはここから。

 次にアカウントを既にお持ちの方はログインし、まだの方はアカウントの新規作成をお願いします。

 アカウントでログインすると、下の図の赤枠が こんにちは ○○○さん という表示になっています。

 その赤枠部分をクリックすると、アカウントの管理画面に移動します。

管理画面では、アフィリエイトの報酬結果を見たい気持ちをこらえ、ページの下端まで移動してください。すると下図のような記載が見つかると思います。その中のアソシエイト(アフィリエイト)をクリックしてください。

 下図は、アソシエイト・セントラルの画面です。左上にIDのようなものが書かれています(赤枠囲み)。これがkintoneからAmazonへアクセスする際に必要な情報の一つ「トラッキングID」です。是非φ(..)メモしておいてください。

 続いて、上図のメニューバナーの中に Product Advertising APIというのがあります。そのバナーをクリックしてください。Product Advertising APIのページに移動します。

 Product Advertising API のページ内にはAmazonへのAPIアクセスの奥義が沢山書かれています。是非 お読み頂ければと思います。が、ここは先を急ぎましょう。

 ページの中ほどに、下図のようなリソースというコーナーが設けられており、その中にアカウント設定というリンクがあります。これをクリックします。

 アカウントサービスのページに移動しました(下図)。アクセスキー情報という枠の中に、こちらのリンクというリンクがあります(下図の赤枠です)。これをクリックしてください。

 ダッシュボードのページに移ったと同時に、ダイアログボックスが登場します(下図)。Amazonでは、アカウント管理についてはIAMというサービスを推奨しています。きめ細やかな各種権限設定が可能になっているようです。しかし、今回のAmazonへのAPIに当っては、最初にAmazonにログインした際に使用したアカウント(IAMではルートIDと呼んでいるようです)の認証情報を使用する必要があります。なので、先にContinue to Security Credentialsの方をクリックして下さい。

 下図のようなYour Security Credentialsの画面が表示されました。右側の + Access Keys(Access Key ID and Secret Access Key)をクリックして下さい。

 下図のようにメニューが開きました。Important Changeとメッセージがあります。これはSecret Access Keyの取扱いが変更になり、以前から持っていたAmazonアカウントに紐付いたAccess Key IDでは、再取得を行わないとSecret Access Keyが使用できないという意味です。なので、新たなAccess Key IDを作成しました。新たなAccess Key IDの作成は下図のCreate New Access Keyをクリックすると発行できます。発行が終われば、前のAccess Key IDはDeleteしてください。

新たなAccess Key IDを発行した画面が下図です。Show Access Keyをクリックすると、今回kintoneからAmazon APIへアクセスする際に必要な情報の二つ「Access Key ID」「Secret Access Key」が表示されます。是非φ(..)メモしておいてください。Download Key Fileをクリックすると、csvファイルで2つのIDが保存できます。

 これで、Access Key ID と Secret Access Key、トラッキングIDの3種類の情報が取得できました。3種類とも是非φ(..)メモしておいてください。 図が多くて見にくかったことでしょう。お疲れ様でした。


kintoneについての紹介とデモのイベントを行います



弊社が出展するイベントの情報です。

来たる6/21(日)、町田市鶴川にあるポプリホールの多目的室において、ココデンタルクリニックさん主催のイベントの1部として
「ぶきっちょさんでも出来る?! デジタル健康管理とお財布の健康」
というお題でデモをさせて頂くことになりました。

30分程度の同じ内容を午前中に2回ほどやらせて頂こうと考えています。
kintoneの紹介を10分、残り20分でその場でアプリを作成し、簡単にアプリが出来る様子を見て頂ければと思います。
技術者向けの内容ではないため、やさしくゆっくりめのご説明を心がけたいと思います。また詳細については、変更があるかもしれませんので、追ってご連絡させて頂きます。なお、個別にお話を伺ったりデモさせて頂くことも可能です。当日は16時近くまでイベントに参加しておりますので。

また、午前の1部ではライフプランナーさんがこっそり教える
「お財布の健康」
についての講演を行います。

第2部
お昼からは、
ゲストに、東京なちゅらるぐるめのオーナー宮地祥子さんと、タロットコーチングの佐々木美保さんをお迎えして
「お口から考える、心と身体に良いこと」
をテーマに講演を行います。
ココデンタルクリニック院長(弊社代表の妻です)も、参加いたします。

そして…
会場内では1日を通して、お子様を対象にkao*kaoさんの簡単なワークショップコーナーも設けております。

会場への入場は無料となっておりますので、日曜日のひと時是非足をお運びください✨

本日より、詳細を順次アップして参ります( ´ ▽ ` )ノ


kintoneエヴァンジェリストになりました


IMG_2302

2014/8より、サイボウズ株式会社様の展開するビジネスアプリ作成プラットフォーム「kintone」のエヴァンジェリストとして活動させて頂くことになりました。

今まで以上にkintoneの紹介や活動報告、Tipsなども当ページまたは、cybozu.com developer networkにて書かせて頂くことになるかと思います。

引き続き微力ではありますが、
一期一会の儲けよりお互いが継続して協業できる幸せを
求めていきたいと思います。

サイボウズさんのサービスについて、興味がある方は
こちらからご覧いただければサイボウズ社のページに移動できます。

今後ともよろしくお願いいたします。