2020年9月23日水曜日

PMシンポジウム2020 参加レポート (Day 1)

2020/9/10~2020/9/11の2日間、PMシンポジウム2020に参加したので、簡単にレポートしておく。
このエントリは1日目分。
今回はコロナ禍によりオンライン開催となったのが残念である。自宅だと講演に集中しづらいというのが正直な感想。

さて、今回は基調講演1、2がすごくよかったので、この2つについては私自身の所感も含めて詳細にまとめる。その他の講演は自分用の備忘としてのメモのみ掲載する。

基調講演1
スタートアップと大企業のオープンイノベーションによる未来創造
株式会社ユーグレナ 代表取締役社長 出雲 充氏

ユーグレナは一言で言うとミドリムシの会社である。
創業者である出雲氏は、学生時代にバングラデシュを訪れ、そこで最貧困国の実態を目の当たりにしたことが人生の転機であったと語る。「栄養価の高い食品を開発し貧困国の人々を救いたい」、との思いでミドリムシの研究をスタート。
試行錯誤を重ねた末、培養が難しかったミドリムシの大量生産に成功する。

そんな氏の講演内容は、「SDGsの達成に向けて何が必要か?」である。

SDGs達成には「イノベーションを創出する力」が必要だと説くが、そこで指摘されたのが日本人が勉強・能力開発に費やす費用や時間の少なさ。
社会人の能力開発を見ると、日本人は平均5万円/年、0時間/週しか能力開発に費やしていないが、一方で米国人の平均は440万円/年、6時間~/週であるという。これは耳が痛い。(この金額は、もちろん個人の自腹だけでなく、従業員を雇っている企業が従業員個人個人のために費やしている能力開発費も含む)。また、大学生を見ると、日本の大学生の8割は1日1時間も勉強していないという(対して米国の大学生の8割は1日1時間以上勉強している)。これでは日本初の画期的なイノベーションが生まれないのは当たり前。

さて、そんな日本の弱点は、DXとアントレプレナーシップの弱さにあるという。
アントレプレナーシップを持った人材を排出するには、大企業と大学発スタートアップとのオープンイノベーションの推進が鍵を握っており、そのためにはエコシステムを形成して大学の先生や学生を徹底的にサポートし、大学発のベンチャーをどんどん生み出していくことが必要。
また、短期的な利益にばかり目を向けていてはDeep Issueには立ち向かえない。日本が得意とするモノづくり等の技術、Real Techが必要と説く。

そして話題は、本公演の核心となる「若者」へ。
日本においては、2025年にはミレニアル世代とZ世代が労働人口の半分を占めるようになる。よって、企業は若者の言葉に耳を傾け、若者の考え方にフィットさせていうことが重要。また、DX化はできない人(おじさんおばさんたち)が今から勉強していては世の中の変化の速さに追いつけないので、デジタルネイティブな若者に任せるべきだという。

所感

これからの時代は若者が主役、という点に異論はないのだが、現在の日本は若者・ベテラン問わず勉強不足・力不足であるのが現状であり、この状況を打開するには「日本の若者をどう育てていくか?」というか「どうやって勉強する気にさせるか?」がポイントになるのだと思う。(内発動機。この講演ではそこまでは語られなかった)

基調講演2
「”あいだ”の経営」~ミクロ人本主義経営の台頭~
長野県立大学グローバルマネジメント学部教授
ソーシャル・イノベーション創出センター長
大室 悦賀氏

イノベーションについて、人間の認知能力という切り口で語られた。

まず、人間の現在の認知能力では現代完了形を捉えることはできるが、現在進行系は捉えられない、という話からスタート。イノベーションは見えていない世界を垣間見るところから始まり、だからこそ難しい。
では、イノベーションを起こす企業とはどんな企業か? それは「哲学」を持つ企業なのだという。CPO(Chief Philosopyy Officer)を置く企業も出てきており、例を挙げるとGoogle, Appleなどが名を連ねる。
VUCAの時代においては従来の合理性や効率性という思考(過去をベースとした延長線で物事を考える手法)が通用しなくなっている。そこには哲学が必要なのだ。(近年、思弁的実在論などの新しい視点の哲学も台頭してきている)

ここから「SDGsは17のゴールを1つずつ対応するのではなく全部まとめて対応する」「オープンイノベーションは市民・ユーザー主導」といった話を挟んだ後、イノベーションを起こすための要件、といった話に向かっていく。

話題がかなり多岐に渡ったため、以下ポイントだけ整理する。
  • イノベーションを生むには、曖昧さや未知のものを捉える力が必要。人は視点を主管・客観で分ける事が多いが、この2つに分けた時点で、物事の曖昧な部分を捉えられなくなってしまう。主管・客観以外の視点が必要。
  • リードユーザー・イノベーション。「ニーズを分かっている人」がそのビジネスをするのが最も有効。ユーザーが主導すべき。
  • 起業の動機要因のひとつに「自己表現」が挙げられる。女性の起業が増えている理由もここにある。
  • ナレッジの整理にはSECIモデルが有効(暗黙知を形式知に変換し、形式知を暗黙知に変換)。
  • 最小有効多様性の法則。複雑多様な環境に対応するには、それに対応する組織も同じ程度の多様性を持っている必要がある。知識を増やし創造性を発揮するにはイントラパーソナルダイバーシティが鍵を握る。
  • 「両利きの経営」。知の探査と知の深化。両方ないとイノベーションは起きない。
  •  直感が重要という話も出てきている。ナポレオンが勝てたのは直感のおかげと言われている。直感の確からしさは知識と経験の量に比例。
  • リラックスしている時の方が良いアイデアは出る。故にデフォルトモードネットワーク、マインドフルネスが注目されている。「内臓感覚」「内臓思考」(内蔵ではない!)。生命の本質は腸。
  • ネガティブ・ケイパビリティ(不確実・曖昧なものを曖昧なまま捉えて受容する能力)は、人間の脳は苦手であるが、極めて大切である。
  • 自由な発想を生むには、まず破壊を先行させ、「余白」を作ることが必要。

所感

私の頭ではうまく整理できていないが、「哲学を持つこと」「知の深化と知の探索」「イントラパーソナルダイバシティ」「直感・内臓思考」「ネガティブ・ケイパビリティ」あたりが重要キーワードであると理解した。
面白かったのは、イントラパーソナルダイバーシティの話題の中で、「経験を積んだ人が自分の思考パターンを見つめ直すことが大事、これができないと若い人に任せるという話になってしまう」という話があったこと。出雲氏の言葉と見事に相反している。おじさんの私としては、若い人たちに任せられるところはどんどん任せていく一方で、任せっきりにするのではなく自分たちもイントラパーソナルダイバーシティを高めていきたいところである。「直感の確からしさは知識と経験の量に比例する」のであれば、直感を活かせるのは若者よりも経験豊富なおじさんのはずである。

基調講演はここまで。以下、受講した講演のメモのみ。

ポストコロナのSDGs×DX社会
クレアン 薗田 綾子氏

ポストコロナの世界では、ビジネスモデルの変換が必要。調達先変更、特定国への集中見直しなど。
働き方も変革する。子育てや介護との両立、ワーケーションなど。

コロナで生活者の価値観・消費行動・働き方が変わった。
安全・安定 節約 イエナカ・家族 社会協調。

忘れてはならないのは、そもそもコロナ以前から環境・社会問題は山積みで、だからSDGsが提唱されたということだ。

SDGsの背景には以下のようなデータがある。
  • 地球の人口は2050年には97億人に達すると言われている。
  • 今や環境問題が人類の一番のリスク。全人類が日本人と同じ暮らしをするには地球2.8個必要と言われている。人類は地球に負荷をかけすぎている。ここからOne Planet活動が生まれた。
  • 今でも、世界中には奴隷労働を強いられている人が4030万人もいるとされている。それはサプライチェーンの最上流(資源発掘現場など)で起きている。
  • 海洋プラスチックは深刻な状況。2050年には魚を上回る量の海洋プラが海を漂うと言われる。
  • フードロス。
  • ジェンダーギャップ。日本は後進国である。

あちらこちらで言われているように、パートナーシップがSDGsの本質であり、様々なステークホルダーが協働し取り組まなければならない。世界のSDGs達成度ランキングにおいて、日本は現在17位だ。特に「1.貧困をなくそう」「5.ジェンダー平等を実現しよう」「13.気候変動に具体的な対策を」「14.海の豊かさを守ろう」が停滞している。

社会の変容、Social Transformationが起きている。
SDGsのような長期的な目標を達成するためには、将来のあるべき姿を想定し、そこからバックキャスティングして計画を立てていくことが必要だ。

以下、世界に見るDXの実例。
  • セネガルのデジタル決済プラットフォーム。保険費がモバイルマネーで支払えるため、多くの国民が保険制度に加入できるようになった。
  • 輸血用血液を運搬するドローンを開発するスタートアップが登場。
  • ブロックチェーンとAIで廃棄物をマッチング。例えば、コーヒーかすをフィルターや顔料、石鹸、紙にしたり、バイオプラスチックできのこを栽培したり。
  • サーキュラー・エコノミーのためのAI活用が始まっている。エレン・マッカーサー財団とGoogleが提携。

廃プラの再利用は大きな市場になりつつあり、もはや環境問題だけでなく経済政策である。つまり、多くの企業にとってビジネスチャンスになりうるということ。
イノベーションは右脳が起こすと言われている。講演内容は右脳にインプットしてほしい。

技術と叡智、IHIの技術力と人材で実現する社会
IHI 加藤 格氏

IHIにおけるDXの取り組みの紹介。

IHIが直面する課題は4点。
  • 社会インフラの多様化
  • 高度情報化の加速
  • 世界経済の複雑化
  • コロナの影響

IHIの主要ビジネスは、以下4つの事業領域。
資源・エネルギー・環境
 脱CO2・循環型社会
社会基盤・海洋
 安全・安心な社会インフラの実現
産業システム・汎用機械
 事業運営の最適化 産業インフラの発展に貢献
航空・宇宙・防衛
 航空輸送、防衛システム、宇宙利用の未来を切り拓く

DX事例紹介
バリューチェーンをデジタルで連動させて最適化、お客さま価値創出

事例1 デジタルを生かしたお客さま価値創造
salesforce、ILIPSを利活用し業務効率化
創出した時間を顧客対応に振り向ける
Salesforce
顧客の状況がリアルタイムに見えるようになった
→資料作成が不要に。会議も減る。
蓄積・共有した情報をお客さま価値へ

事例2 タクトタイム生産をデジタルで支援
実績報告→進捗・異常の見える化→データ分析
実績報告に基づいてJITでKIT化

事例3
ICTタグ活用によるスピードアップ
Before 情報端末
After タブレットで手元で入力、RFIDで自動入力
生産性向上

事例4
建設現場ICTツール
タブレットで一元管理
物量進捗の取得
配管品質記録の一元管理

事例5
航空機エンジンの最適な水洗時期の提示
機械学習、航空エンジンモデルで予測モデルを構築


DXへの取り組み
デジタル化しない企業は生き残れないという意識で施策を打ち出している。
CEO直下に全社横串のDX担当部門を設置し、全社CDOを配置。
各事業領域にもCDO/DXグループを配置し、全社横串部門と連携。

CDOの役割は?
IoT/ICT戦略、投資配分、人材マネジメント
お客さま価値創造・業務改革・共通ICTツール基盤
人材マネジメント

DX戦略
過去より蓄積してきたデータとIoT/ICT戦略で新たに獲得するデータをAI/データ分析で利活用、課題を解決してお客さま価値を提供する。
プラットフォームづくり。環境だけでなくノウハウ、方法論、ルール・制度、教育プログラムを整理・整備

DX実現のために
ビジネスモデルを変える
ものづくりを変える
業務を変える
「つなぐ」を変える

DXのためのプラットフォーム
価値創出
AI/深層学習
プロセス改革
クラウド活用 情報セキュリティ
人材育成

共通IoTプラットフォーム ILIPS
4つの事業領域から情報収集
基本機能
装置の状態監視
予防保全
レポート作成支援
アラート
取り扱いデータ多様化 数値、テキスト、画像、音声
外部サービス連携 API用意
マイクロサービス提供 BI、分析ツール、グラフ表示
 ユーザ認証 サマリデータ アラームデータ 動的MT法

MS Teamsベースのコラボレーションツールを社員に提供。リモートワークにも円滑に対応。

情報セキュリティ体制
セキュリティ監査 3つのディフェンスライン

  1. ビジネスユニット、関係会社
  2. 事業領域
  3. コーポレート

人材育成
AI/データ分析技術
製品/サービス開発
ものづくり生産技術
全コース内製
お客さま価値創造プロセスをコースプログラムに適用
コンセプト創造を重視
経営層にも受講してもらった

IHIの叡智を引き出すDXに必要な人材力は?
ものづくり力
お客さま価値創造力
IoT/ICT戦略技術の活用力

地上のちいさな太陽のつくりかた
実験炉イーターの建設プロジェクト
量子科学技術研究開発機構 杉本 誠氏

温暖化とエネルギー需要の関係。
2020年から2100年までにエネルギー需要は2倍になる。
二酸化炭素は今よりも削減しなければならない。

資源の残量は?
石油 50年
天然ガス 50年
石炭 132年
ウラン 99年
あと200年で底をつく。
新エネルギー源の開発が必要。

フュージョン発電(水素)
 燃料は海水から採取
 運転時CO2を出さない
 安全性が高い
資源のない日本には有効。

寿命とエネルギー消費
 女性寿命とエネルギー消費には正の相関あり。

フュージョン発電の原理
 太陽エネルギーの源
 水素原子4つが重力で融合しヘリウムに変わる
地上に太陽を。
重水素+三重水素→ヘリウム+中性子 ここでエネルギー取り出す。
燃料1gで石油8t分。
重水素は海水から取得。三重水素は自分で作る。
燃料をプラズマ状態にし燃焼させる→ブランケットで受け止め熱水に→熱交換器でタービンを回す。
ブランケットでトリチウムを作る→ヘリウム+三重水素
燃料は無限にある。

湯川秀樹が先導(中間子を予言)

フィッションvsフュージョン
フィッションは重い原子核が分裂してエネルギーが発生
 連鎖反応する
 数年部の燃料を炉に入れておく
 暴走しない工夫が必要
 核分裂生成物が発生
フュージョンは軽い原子核が融合してエネルギーが発生
 連鎖しない
 必要な分しか炉内にない→燃料供給が必要

フュージョン煉獄時代
技術的課題
 炉内を1億度以上にする必要があり、プラズマの閉じ込め性能が劣化
 プラズマ電流の定常駆動が必要
→既に克服済み。
超伝導コイルでプラズマを閉じ込める。
 超伝導コイルはニオブ・スズから作る。製造は難しい。

ITER計画
1985年 ゴルバチョフ、レーガンの首脳会談が発端
2007年 協定が発効、日欧米露中韓印
技術的実証実験が目的。現在建設中(フランス プロヴァンス)

国際プロジェクト管理の難しさ

1. 想定外のことが起こり、要求変更が発生する。
 例
 ITER機構(IO) 通路の幅を広げる必要がある(要求変更)
 国内機関(DA) その費用とスケジュールはどうする?
 IO-DA間で多くの議論・時間を費やす
 
 解決策
 意思決定機関を作った。
 Exective Project Board
 Joint Project Coordination

2. 部品ごとに調達するDAが違う
 例
 A国DA ある部品の取合交差を変更したい。
 B国DA こちらの部品は既に完成している。
 
 解決策
 課題解決のための各種プロジェクトチーム設立。

3. 建築・運営にフランス当局の許認可を受ける必要あり。
 例
 フランス当局より地震等による全所停電のストレステストが必要と言われる
 DA 当初計画にない。コストとスケジュールは?
 解決策
 課題解決のための各種プロジェクトチーム設立。

日本の貢献
那珂市 サテライト・トカマク
六ケ所村 事業所
不定期に採用試験をやっている

Society5.0/第4次産業革命期におけるデジタル社会経済のマネジメント
ウィズ・コロナ/アフター・コロナ時代における新しい資本主義
日本総合研究所 東 博暢氏

平和末期~令和初期は新たな資本主義への幕開け。
Invisible Capital/Circular Economy/SDGs
統合イノベーション戦略/融合・エコシステムの時代。

1.複雑化する社会における未来社会の捉え方

政治・社会・経済・制度が複雑化・創発化。
イノベーターが出てきてパラダイムシフトが起こる。
イノベーション=新しい組み合わせ
要素還元主義の限界、確実性の終焉。
エコシステムを作ろうという動きに。

必要な人材は?
全包括主義。
スーパージェネラリスト、プロデューサーが必要。

Against Short-Termism
短期指向の克服。短期指向ではイノベーションが出てこない。長期的視野で。

今後40年で概念、価値観、ものの見方が変わる。

Society5.0/第4次産業革命期の本質は?
スマート化する社会(市民にとって便利)⇔複雑化する社会(企業にとって複雑)

5年スパンで産業界が変わってきた。
インターネット商業化
Social
Mobile
自律化
Tech企業が他業種を侵食していった。金融、交通など。

社会の構造は4つのレイヤーに整理できる。
最上位 サービス提供者
レイヤー4. コンテンツ・サービス・アプリケーション
レイヤー3. プラットフォーム
レイヤー2. ネットワーク
レイヤー1. もの
最下位 利用者・住民

自動車業界でこの4レイヤーの垂直統合をしたのがTESLA。Googleも乗り込んできた。
日本はネットワークのレイヤーに注力してきた。フィジカル(リアル)側。
一方、欧米はプラットフォームに注力。一番儲かる。サイバー側。

Society5.0
創造社会。サイバー空間とフィジカル空間が融合。
新しいバリューを生み出す(コストカットではない)。

社会・経済・街づくりのDX化
DXはDigitalizationとは違う。
社会では美的体験が求められており、それを生み出すためにデジタルを使うというのがDX。The city as service platform for citizen

Society5.0=SmartCity推進。
テクノロジーではなく住民主体。
地域課題を解決することが本質。
Society5.0の街づくりはSDGsの17の課題解決。

"G20 Global Smart Cities Alliance"
参加都市増えている。GAFAも入ってきた。

事例
  • Sidewalk Toronto(残念ながらGoogleは撤退したが)
  • DIGITAL NYC
    スタートアップが集まりお金も集まった
  • ET City Brain
    都市のOS
    監視都市だが中国人はもうなれてきている
  • TOYOTA Woven City
  • Softbank インドネシア都市移転プロジェクト

プラットフォーム事業者がSimCity化している

日本は人口増減が大きい。今の都市設計で耐えられるか?
人が減ることを想定していない。
人が住まない家はぼろぼろになってしまう。
住まない・家を畳む=都市開発と矛盾している。

日本はインターネットが発展する前に都市のインフラシステムを作ってしまった。
逆にテクノロジーへの追従が遅れた。

社会保障費は今後爆発的に増えていく。効率化が必要。ピンピンコロリを技術で実現。

スマートシティ推進の困難さ
従来型の都市計画は工学系、フィジカル。
インターネットが入ってきた途端に訳が分からなくなる。

コロナで仕事の拠点と住居が一体化。都市づくりを困難に。

新たなPublic Private Partnership
官民マッチング。政府が仕掛けるべき。
1社で何かを作ることはもはや無理。オープンイノベーション。

プロセスのイノベーションも必要。
従来の街づくりは完璧なウォーターフォール型。
これからはアジャイル型+ウォーターフォールのMixとなる。

公共調達のスタートアップへの開放。SBIR(中小企業技術革新制度)。
インキュベーターとしての都市。
例:浜松市スマートシティ戦略

ウィズ・ポストコロナ社会のマネジメント
生活はがらっと変わってしまった。完全に元に戻せない これをどうマネジメントするか?
感染症社会になり、首都圏は脆弱だということが分かってしまった。
地方への分散化が始まる。「自然首都圏構想」など。
大企業が本社機能を地方に移すことも始まっている。

Dual Mode Society(ポストコロナにおける新たな社会システム)
Biz.MODE⇔SAFE MODE
今後は2つのモードを状況によって行ったり来たりする。冗長性・アジリティをどう実装するか?

やはり若者がカギ。Audrey Tang(台湾デジタル大臣)は「リバース・メンタリング」として若者がシニアを教える(デジタル)というルールを作った。

Posted in 

2020年9月14日月曜日

Vimperatorに続いてcVimも死んだのでSurfingkeysに乗り換えた

cVim がchromeウェブストアから削除されてメンテされなくなり、さてどうしたもんかなあと思っていたら、Surfingkeys に辿り着いた。
何これめっちゃええやん。今まで知らなかったの悲しい。

私がこの手のキーバインド系ブラウザ拡張を使い続ける最大の理由は、fキーで使える"hit a hint"機能にある。
リンクに番号(英字だけど)が振られ、キー操作でリンクを辿ったりボタンをクリックしたりできるこの機能により、右手をマウスとキーボードの間で行ったり来たりさせる必要がなくなるわけである。

Figure.1 Hit-a-hint

矢印キーも極力使いたくないので、手をホームポジションに置いたままスクロールしたりタブを切り替えたりできるようにカスタマイズすることも極めて重要である。

ぼくのかんがえたコンフィグ

私のSurfingkeysのコンフィグは、現在以下のようになっている。
もともとVimperator使いだったので、かなりVimperatorに寄せたキーバインドにしている。
mapがなくコメント行だけ書いてある機能は、Surfingkeysデフォルトのキーマップそのままで使っている。コメント行はマニュアル代わり&備忘が目的。

// P Open selected link or link from clipboard
map("P", "cc");

// p Open selected link or link from clipboard in current tab
mapkey('ci', '#7Open selected link or link from clipboard on current tab', function() {
    if (window.getSelection().toString()) {
        window.location.href = (window.getSelection().toString());
    } else {
        Clipboard.read(function(response) {
            window.location.href = (response.data);
        });
    }
});
map("p", "ci");

// on Open newtab

// S Open Search with alias g
map("S", "og");

// d Close current tab
map("d", "x");
// u Restore closed tab
map("u", "X");
// U Open recently closed URL
map("U", "ox");

// gx0 Close all tabs on left
// gx$ Close all tabs on right

// ctrl+→ Move current tab to right
map("<Ctrl-ArrowRight>", ">>");
// ctrl+← Move current tab to left
map("<Ctrl-ArrowLeft>", "<<");

// gu Go up one path in the URL
// gU Go to root of current URL hierarchy

// D go forward in history
// <Backspace> Go back in history
map("<Backspace>", "S");

// l Go one tab right
map("l", "R");
// h Go one tab left
map("h", "E");
// g0 Go to the first tab
// g$ Go to the last tab

// gg Scroll to the top of the page
// G scroll to the bottom of the page

// j Scroll down
// k Scroll up

// / open find bar

// n Next found text
// N Previous found text

// r Reload the page

// gf Mouse over elements.

// yy Copy current page's URL

// v Toggle visual mode
// V Restore visual mode

// ;e Edit settings
// i Go to edit box

まだまだSurfingkeysを使いこなすところまで行っていないが、一旦満足。今後もちょこちょこチューニングしていく所存。

2020年5月12日火曜日

ブログのテーマ変えた

前のテーマは4年くらい使っていたのだけど、フォントが大きすぎるのと、デザインが今時じゃなくなってきたので、変えてみました。シンプルで落ち着くデザインなので、しばらくこれで。

kintoneのデータをSQL文で加工する

最近kintone漬け。
といっても、新しい機能を追加していくような楽しい作業ではなく、運用中のアプリの不具合対応(デバッグ)と細かい改良ばかりで、少し疲れてきた。

そんな中で、kintoneのデータの加工・集計をラクにやる方法はないものか? と調べていたら、
kintone でSQLを使う
という記事を発見。
alasqlというJavascript用データベースを使うと、kintoneのデータをSQLで集計できるじゃん。これすごい。
SUM(Group By)で合計値を求めたり、複数のアプリのデータをJoinで組み合わせたりできる。
(逆に言うと、こんな簡単なことがkintone標準機能ではできなかったりするのだが…)

"kintone alasql"でググるとそこそこ記事が出てくるので、もしかしてkintoneガチ勢には当たり前の話?

早速、工数管理アプリに入っている工数明細をプロジェクト単位・個人単位でSUMする画面を作ってみたので、備忘のために記事に残しておく。

元データはこんな感じ。

Figure.1 集計元のkintoneアプリ
設計方針

データは、event.recordsではなくAPIで取得する(event.recordsは最大でも100件しかデータが取れないので、集計目的では使えない)。 APIは生で叩くのではなく、kintone-rest-api-clientを利用。(getAllRecordsWithCursorが最強。みんな使うといいと思う。)

データの表示にはjQuery DataTablesを利用する。DataTablesを使って多機能な一覧画面を作ろう! – cybozu developer network とかが参考になる。

動作環境

アプリ設定画面の「JavaScript / CSSでカスタマイズ」にて以下URLを指定。

https://js.cybozu.com/jquery/3.4.0/jquery.min.js
https://js.cybozu.com/datatables/v1.10.19/js/jquery.dataTables.min.js
https://unpkg.com/@kintone/rest-api-client@latest/umd/KintoneRestAPIClient.min.js
https://js.cybozu.com/datatables/v1.10.19/css/jquery.dataTables.min.css

また、http://alasql.org/ から alasql.min.js をDLし、PC用のJavaScriptファイルにアップロードしておく(alasqlのzipをダウンロードして解凍し、distディレクトリから取り出せば良い)。

もう1点、DataTablesの見栄えをkintoneに近づけるため、DataTablesをkintoneライクにする魔法のコード - Qiitaからkintone-datatables.cssをDLし、PC用のCSSファイルにアップロードしておくとよい(作者の方に感謝)。

サンプルコード HTML

アプリに一覧「プロジェクト別集計」を作成しておく。
レコード一覧の表示形式を「カスタマイズ」にし、以下のHTMLを記述。

サンプルコード js
/*
 * project_summary.js
 * 工数管理アプリのデータをプロジェクト別・個人別に集計
 * 
 * required: jquery.dataTables.min.js
 * https://js.cybozu.com/datatables/v1.10.19/js/jquery.dataTables.min.js
 * 
 * required: kintone-rest-api-client
 * https://unpkg.com/@kintone/rest-api-client@latest/umd/KintoneRestAPIClient.min.js
 * 
 * requeired: alasql.min.js
 * http://alasql.org/
 */
(function() {
  "use strict";
  kintone.events.on(['app.record.index.show'], function(event){
    if(event.viewName !== 'プロジェクト別集計') return;

    // Initialize kintone-rest-api-client
    const client = new KintoneRestAPIClient();

    var myTable;

    var appId = kintone.app.getId();
    var query = kintone.app.getQuery();
    // APIでデータ取得
    client.record.getAllRecordsWithCursor({
      app: appId,
      query: query,
    }).then(function(response){

      // kintoneのrecords(json)を、alasqlで扱える配列に変換
      function convertToRows(records) {
        var rows = records.map(function(record){
          var keys = Object.keys(record);
          var row = {};
          keys.map(function(key){
            switch (key) {
              case '担当者氏名':
                // '担当者氏名'フィールドからname(=氏名)を取り出す
                row['担当者氏名'] = record[key].value[0]['name'];
                break;
              case '作業担当部署':
                // '作業担当部署'フィールドからname(=部署名)を取り出す
                row['作業担当部署'] = record[key].value[0]['name'];
                break;
              default:
                // 他のフィールドはvalueを取り出す。数値の場合はNumberに変換
                row[key] = record[key].type === 'NUMBER' ? Number(record[key].value) : record[key].value;
            }
          });
          return row;
        });
        return rows;
      }
      var recordSet = convertToRows(response);

      // sum([工数]) by alasql
      var sqlResult = alasql(
          "SELECT [プロジェクトコード], [作業担当部署], [担当者氏名], SUM([工数計_人月]) AS [工数計_人月] FROM ? GROUP BY [プロジェクトコード], [作業担当部署], [担当者氏名]", 
        [recordSet]
      );

      // 表に表示するカラム(alasqlの出力結果の項目名)
      var columns = [
        'プロジェクトコード',
        '作業担当部署',
        '担当者氏名',
        '工数計_人月',
      ];

      // 表のタイトルを好きにいじれるよう、別変数で定義。このサンプルではあまり意味がない。
      var titles = {
        プロジェクトコード: 'プロジェクトコード',
        作業担当部署: '作業担当部署',
        担当者氏名: '担当者氏名',
        工数計_人月: '工数計',
      };

      // DataTables初期化
      myTable = $('#myTable').DataTable({
        // DataTableの設定値はお好みで。
        destroy: true,
        pageLength: 100,
        lengthChange: false,
        searching: false,
        info: false,
        data: sqlResult.map(function(record){
          return columns.reduce(function(data, column){
            data[column] = record[column];
            return data;
          }, {
            レコード番号: record['レコード番号']
          });
        }),
        columns: columns.map(function(column){
          return {
            title: this[column],
            data: column
          }
        }, titles)
      });
    });
  });
})();
動作イメージ

サンプルの動作結果はこんな感じ。

Figure.2 カスタマイズ結果


画像にモザイクがかかりまくっていて何がなんだか分からないが、結果はとても良好。パフォーマンスも今のところ申し分ない。

今回はSUMしか使っていないが、そのうちJoinも使ってみたい。

2020年2月3日月曜日

kintoneのデータをスプレッドシートで編集する(Tabulator編)

最近、kintoneでエンジニアの工数管理みたいなことをしている。
工数データをスプレッドシート型のUIでサクサク入力したくて、HandsontablesTabulatorの両方を試してみた。
Handsontablesを使う方法は、cybozu developer network上にHandsontableを使ってkintoneをExcelライクに入力しよう その1という記事が載っていたりするのだけど、Handsontable自体が最近有償化されてしまったのと、いろいろ実装がうまくいかないところがあって、断念。
一方のTabulatorは、そこそこいい感じに動いているので、備忘のためまとめておく。
ちなみに、今回はレコードの追加や複製、削除には対応していない。あくまで既存のレコードの編集のみ実装している(追加や複製はそのうちやるかも)。
要件(やりたいこと)
kintoneの工数管理アプリに、以下のような案件別・担当者別の日々の工数情報が入っているとする。

プロジェクト番号客先名案件名担当者名年月1日工数2日工数31日工数
12345678○×商事株式会社メールシステム構築山田太郎2020/010.520
12345678○×商事株式会社メールシステム構築鈴木花子2020/01030.5
23456789▲△自動車株式会社仮想化基盤構築田中勘太郎2020/012.51.57

これをスプレッドシートで入力・編集したい。下に合計行もあるとうれしい。
準備①:kintoneの"一覧"を準備
kintoneの「アプリの設定」画面にて、一覧"Tabulator"を作成(※好きな名前でよい)。
レコード一覧の表示形式を「カスタマイズ」にして、以下のようなHTMLを設定しておく。
準備②:Javascriptの準備
kintoneの「アプリの設定」画面の「JavaScript / CSSでカスタマイズ」にて、以下をリンクしておく。
PC用のJavaScriptファイル
https://js.cybozu.com/jquery/3.4.0/jquery.min.js
https://unpkg.com/tabulator-tables@4.5.3/dist/js/tabulator.min.js
PC用のCSSファイル
https://unpkg.com/tabulator-tables@4.5.3/dist/css/tabulator.min.css
これで準備OK。
サンプルコード
以下のコードを「PC用のJavaScriptファイル」にアップロードする。
/**
 * kintone_tabulator.js
 * kintone上でスプレッドシートによるデータ表示・更新を実現
 * Tabulatorにて実装
 * 
 * @author dsp74118
 * @version 1.0 2020.02.03
 *
 */
(function() {

  "use strict";

  // レコード更新用データを生成する関数
  var setParams = function(record) {
    var result = {};
    for (var prop in record) {
      // note: アップデートしないフィールドを除外する処理をここに入れるとよい
      result[prop] = record[prop];
    }
  }

  // 一覧ビュー表示用のイベントハンドラ
  kintone.events.on(['app.record.index.show'], function(event) {
    // 「Tabulator」一覧のみ処理
    if (event.viewName !== "Tabulator") return;
    var records = event.records;

    // 列の定義
    var columns = [
      {title: "プロジェクト番号", field: "プロジェクト番号.value"},
      {title: "担当者氏名", field: "担当者氏名.value"},
      {title: "年月", field: "年月.value"},
      {title: "客先名", field: "客先名.value"},
      {title: "案件名", field: "案件名.value"},
    ];
    for (var i = 1; i <= 31; i++) {
      columns.push({
        title: i + "日工数",
        field: "_" + i + "日工数.value",
        align: "right",
        editor: true,
        bottomCalc: "sum",
        validator: [{type: validateManhours, parameters: {}}]
      });
    }

    // Tabulator初期化
    var tab = new Tabulator('#spreadsheet', {
//      layoutを指定指定すると表示が表示が崩れるためコメントアウト
//      layout: "fitData",
      data: records,
      // 左右矢印キーでセル移動
      keybindings:{
          "navLeft" : "37",
          "navRight" : "39",
      },
      columns: columns,

      // 更新処理
      cellEdited:function(cell) {
        console.log(cell);
        var id = cell._cell.row.data['レコード番号']['value'];

        // データを更新用に加工し配列に格納
        var updateRecords = [];
        updateRecords.push({
          id: id,
          record: setParams(cell._cell.row.data),
        });

        // 更新用Requestを作成
        var requests = [];
        requests.push({
          method: "PUT",
          api: "/k/v1/records.json",
          payload: {
            app: kintone.app.getId(),
            records: updateRecords
          }
        });

        // bulkrequestで一括で更新
        // 失敗した場合はロールバックされる
        var self = this;
        kintone.api('/k/v1/bulkRequest', 'POST', {requests: requests},
          function(resp) {
            console.dir(requests);
            console.dir(resp);
            console.log('Data updated successfully.');
            self.redraw();
          },
          function(resp) {
            console.dir(resp);
            console.log('Data update fail.');
          }
        );
      },
    });
  });
})();
event.recordsをそのままTabulatorに食わせられるので、コードがすごくシンプル! これはうれしい。
kintoneのデータ更新にはbulkrequestを使ったけど、複数セル同時編集はできないはずなので、bulkrequestではなく普通のrecords.jsonで良いかも。

注意点がいくつか。
  • layout: "fitData" で列幅を自動調整させると、横スクロール時に表示がめちゃくちゃ乱れるので、やめた。
  • 列の設定で frozen: true にて左側に特定列を固定すると、これまた横スクロール時に表示がめちゃくちゃ乱れるので、やめた。
このあたり、Tabulator側の問題な気がする(kintoneのCSSとの相性かも?)。まだ追及はできていない。
結果
こんな感じ。Excelと同等の使用感を再現することは無理だけど、矢印キーで縦横無尽に移動しながら、工数をExcel風に入力できるようにはなっている。
※このブログ記事用に別途アプリを作ることが難しい状況なので、実際に職場で作っているアプリのスクショにモザイクかけまくったものを掲載することをご容赦ください。
 ちなみにアプリは開発中のもので、データはテストデータです。悪しからず。

2019年10月29日火曜日

kintone APIで取り出したJSONデータの重複排除をする

最近、私の所属組織ではkintoneで案件(プロジェクト)管理をしている。
JavaScriptでごりごりカスタマイズしていたりするのだけど、そんな中で備忘録を残しておいたほうがよさそうなネタがあったので投稿。

要件(やりたいこと)
kintoneのプロジェクト一覧アプリに、以下のような情報が入っているとする。

プロジェクト番号客先名案件名担当者名
12345678○×商事株式会社メールシステム構築山田太郎
12345678○×商事株式会社メールシステム構築鈴木花子
23456789▲△自動車株式会社仮想化基盤構築田中勘太郎
※kintoneのアプリは正規化ができないので、1つの案件を複数名で担当する場合、上記のようにプロジェクト番号、客先名、案件名は重複して登録される。

このうち、プロジェクト番号、客先名、案件名の3つをkintone APIで取り出し、重複排除したい(=一意なデータとして取り出したい)というのが今回の要件。

まず、上記のプロジェクト一覧アプリをkintone APIで取り出すと、recordsに以下のようなJSONデータ(オブジェクト値の配列)が入ってくる。
[
 {
  プロジェクト番号: {type: "SINGLE_LINE_TEXT", value: "12345678"},
  客先名: {type: "SINGLE_LINE_TEXT", value: "○×商事株式会社"},
  案件名: {type: "SINGLE_LINE_TEXT", value: "メールシステム構築"}
 },
 {
  プロジェクト番号: {type: "SINGLE_LINE_TEXT", value: "12345678"},
  客先名: {type: "SINGLE_LINE_TEXT", value: "○×商事株式会社"},
  案件名: {type: "SINGLE_LINE_TEXT", value: "メールシステム構築"}
 },
 {
  プロジェクト番号: {type: "SINGLE_LINE_TEXT", value: "23456789"},
  客先名: {type: "SINGLE_LINE_TEXT", value: "▲△自動車株式会社"},
  案件名: {type: "SINGLE_LINE_TEXT", value: "仮想化基盤構築"}
 },
 {
  …
 }
]
これの重複排除をするにはどうすればよいか?
オブジェクト値の配列なので、一工夫必要である(Javascriptにおいてはオブジェクト値を単純に比較演算子やindexOfで評価できないため)。

結論
StackOverflowに頼ってしまいました。
How to remove duplicates from multidimensional array?
このQAは多次元配列のdedupeに関してだが、オブジェクト値の配列にも転用可能。

以下、コード。
StackOverflowのコードをまんまパクらせていただいてるけど、本記事は自分への備忘なのでご勘弁。
オブジェクト値をstringifyし、それをインデックスにした別配列(itemsFound)を使って重複チェックする。

なお、kintoneからのデータ取得には、APIの生使用ではなくkintoneUtilityを利用。
(function() {
  "use strict";
  kintone.events.on(['app.record.index.show'], function(event){
    kintoneUtility.rest.getAllRecordsByQuery({
      app: xx, //プロジェクト一覧アプリのID
      fields: [
        'プロジェクト番号',
        '客先名',
        '案件名',
      ],
    }).then(function(response){
      // 重複排除を行う関数
      function multiDimensionalUnique(arr) {
        var uniques = [];
        var itemsFound = {};
        for(var i = 0, l = arr.length; i < l; i++) {
            var stringified = JSON.stringify(arr[i]);
            if(itemsFound[stringified]) { continue; }
            uniques.push(arr[i]);
            itemsFound[stringified] = true;
        }
        return uniques;
      }

      // ここから本処理
      // kintoneUtilityで取得したデータを重複排除する
      var projects = multiDimensionalUnique(response.records);
      console.dir(projects);

      // 後続処理(略)

    });
    return event;
  });
})();

2019年9月9日月曜日

PMシンポジウム2019参加レポート

2019/9/5~9/6の2日間、恒例のPMシンポジウムに参加してきたので、いつものように(近年ずっとサボってましたが)レポートします。
9/5 基調講演1
好き嫌いの復権
一橋大学教授 楠木 建氏
もはやお馴染み感もある楠木教授。PMシンポジウムでの講演も常連になりつつあるが、実は私の所属企業の社内イベントにもお越しいただいて講演していただいたことがある(私はその時は地方勤務でしたので受講できなかったが)。
今回は「好き嫌いの復権」というタイトル。現代のビジネスにおいては「良し悪し」が尺度として使われ、個人の「好き嫌い」は無視される傾向があるが、楠木先生はそんな世間に警鐘を鳴らし、「好き嫌い」こそが競争戦略において重要だと説く。なぜなら、経営には「センス」が必要であり、センスの源泉は「良し悪し」よりも「好き嫌い」であるからだという。
このあたりで一流国内企業の著名な経営者の方々の面白語録が披露される。今回は全体的にアパレルネタで攻めてきており、"LifeWear"でおなじみの某社Y社長、月旅行に行く予定のM社長、某セレクトショップ運営会社のT社長などの発言が引用され、場内は笑いに包まれる。こういうユーモアで聴衆の心を一気に掴んでしまうところが楠木先生の上手いところ。
楠木先生曰く「スキルは訓練や教育で伸ばせるが、センスはそうはいかない」とのことで、これには私も同意するのだが、ではセンスとは先天的なもので、誰にも伸ばしようがないものなのか? それともどうにかして伸ばすことができるのか? センスのない自分としては、この辺りをいろいろ模索してみたいところである。

という具合で、前半は「経営=センス=好き嫌い」というお話であったが、後半は「ビジネスパーソンの仕事との向き合い方」へと話題が移っていく。趣味と仕事を区別するとき、一般的には「趣味=好き嫌い」「仕事=良し悪し」で語られるが、楠木先生は逆に「仕事こそ、好き嫌いが大切」と説く。好きな仕事なら続けられるし、努力も不要(好きなことを頑張るのは「努力」ではない、という理屈)。「負け」もないという。
(このあたりで、某週刊誌の記者が某芸能人のマンションを24時間張り込んでいた時の逸話が飛び出す。その雑誌の編集長?に「君たちはブラック企業を告発するような記事も書いているのに、自分たちの働き方こそ24時間の張り込みがあったりしてブラックではないか」と指摘したら「この仕事(=他人のスキャンダルを記事にすること)が好きなんだからいいのだ」と反論されたという。実例としてはいいんだか悪いんだか。)
この論説は、「仕事を好きになりなさい」と諭された気分であるが、これは私自身よりも後輩(特に若手)に伝えたいメッセージであった。若手にもいろいろいるので一絡げにするつもりはないのだが、自分の目の届く範囲の若手の中にも、「今の仕事を好きでやっていそうな人」と、「収入を得るために、嫌いだけど仕方なく仕事している人」の2種類がいるように思う。後者を頭ごなしに否定するつもりはないのだけど(収入を得ることがモチベーションだという米国的な考え方もあるので)、ただ、それって幸せなのかなあ? とは思う。
ちなみに自分の持論は「好きなことを仕事にする必要はないが、自分の仕事を好きになったほうがよい」である。もっというと、自分は働くのは嫌い(できれば遊んで暮らしたい)なのだが、働かないと生きていけないので仕方なく働いている。んで、どうせ働くのであれば、やってる仕事を好きになったほうが幸せだよね、という考え方で日々過ごしている。

最後に「他人の好き嫌いを尊重し、自分の好き嫌いを押し付けない」ことが成熟した社会の姿である、とのメッセージで講演は締めくくられた。ダイバーシティ<インクルージョン。

9/5 基調講演2
AI、ロボット、IoTを社会に活かす
株式会社hapi-robo st 代表取締役社長/ハウステンボス株式会社取締役CTO 富田 直美氏
富田氏は、ハウステンボスを立て直したことで有名な澤田社長の片腕ともいえる人物。その辺りを絡めて、ロボットやドローンがどうやって人を幸せにするか? というテーマで講演する…予定だったはずが、楠木教授の講演内容に引っ張られて前半がグダグダに…。(かなりアツくなってたので、可愛い性格の方だなあと感じた。御年71歳とのことだが、まだまだ若くて純粋な気持ちをお持ちのようです!)
講演終盤に"temi"というパーソナルロボット https://www.robotemi.com/ をご紹介しておられ、「これをやるのが私の夢」と語っておられた。以前、社内で新事業創出みたいな取り組みに参加させられたした時に、似たようなことを考えていたので、少し興味あり。
9/5 特別講演
行動経済学とプロジェクトマネジメント
慶應義塾大学 経済学部教授 星野 崇宏氏
今回のシンポジウムで1, 2を争うすばらしい内容だったが、講演資料がダウンロードできないので所感がうまくまとめられない(汗)。
行動経済学とは、ものすごくざっくり言うと、経済学に心理学を合わせたような学問であり、「合理的でない・利己的でない」人の行動を経済学に活かしていくことを目指す研究分野である、と理解している(違ったらすみません)。
行動経済学を突き詰めていくと、プロジェクトマネジメントにおいてプロジェクトメンバーを動かすことはもちろん、ビジネスにおいて顧客をはじめとするステークホルダーを動かす上でも必ず役立つはず! と感じた…のだが、短い講演時間中に山ほどキーワードや手法が紹介されてメモが追いつかず、いまいち整理できていない。書籍なりセミナーなりで今後も追いかけたいところである。ひとつ言えるのは、人間は案外動物的な判断基準で物事を決めている、ということか。例えば「何かをするたびに毎回ご褒美をあげてると、人はご褒美のためだけに行動するようになってしまう」などなど。
9/6 特別講演
新しい価値を生む方法論としてのForesight Creation
大阪ガス 行動観察研究所所長 松波 晴人氏
個人的に今回のシンポジウムでNo.1の講演。
"Foresight Creation"とは大阪ガス行動観察研究所がまとめた「新価値創造の方法論」であり、そこに必要とされる能力を「8つの玉」に整理した、というのが主旨。
新価値を創造するための発想を得るには、大きな母数からデータを収集して統計を取るよりも、少数のターゲットに密着して観察するほうが有効だという。この考え方には正直感心してしまった。例えば、高齢者向けの新たなサービスを考えるという取り組みにおいては、ある高齢者に1日密着してその行動を観察した。すると、その観察結果から「高齢者は何かサービスを受けたいというよりも、逆に自分が他人にサービスを提供したいと考えている」という新たな仮説に行き着き、「高齢者が他社に貢献するサービス」を検討するに至ったのだそう。
アンケートやインタビューといった手法では顕在化した(見えやすい)ニーズや機会、課題しか捉えることができないが、行動観察を行うことで新たな気付きが得られ、潜在ニーズを掘り起こすことができるというわけだ。

そして、新しい価値を作り出すにあたっては、「リフレーム」が大切だと説く。リフレームとは、それまで常識とされていた解釈やソリューションの枠組みを、新しい視点や発想で作り直すこと。
e.g.)
動物園の常識:「形態展示」→旭山動物園の「行動展示」
音楽の常識:「音質」→ウォークマンの「外で音楽を楽しむ」

この「リフレーム」が、先に挙げた「8つの玉」の1つ。他にも「統合」や「先見力」などの玉があるそうだ。

講演の後半は、いかに新しい価値を意思決定するか? という方向に話題が進む。ここがまた面白かった。
組織には、イノベーションを阻害する「3つの壁」があるという。
1. 意志決定の壁(新ビジネスがno risk high returnであることを証明しろと言われる)
2. リソースの壁(会社から「人も時間も金もないけど頑張れ」と言われる)
3. 横連携の壁(他部署に「ウチの部署は関係ございません」と突き放される)
この3つ、あるあるすぎる…。どこの会社も一緒ってことかと。
特に1.については、松波氏は「no risk high returnなビジネスは無いので、その中でいかに意志決定するかが重要」という。なにせ、イノベーションは新たな価値を生み出すものなので、どの案が成功するかを事前に目利きすることは非常に困難である。よって、案の是非を判断するにあたっては、「市場で正解かどうか」を基準とするのではなく、「個人の思い」から始めることになる(この点は楠木教授の「好き嫌い」の話にも通ずるものがある! 1日目と2日目で話がリンクした瞬間)。

続けて紹介された「イノベーションが経る3つのステップ」も必笑。
①無視される(関わってもらえない)
②怒られる(そんなもの上手くいくわけないだろうと反対される)
③「それが上手くいくことは最初から分かっていた」と言われる(手柄を横取りされる)
これまた、あるあるすぎる。

これらの「イノベーションを阻害する壁や組織文化」を解決するには、「出島」を作り、既存組織の影響を受けずに取り組むのがよいという。その出島として、行動観察研究所主導でForesight Creationの塾というか共創ラボのようなものを立ち上げ、業種問わずに参加者(参加法人?)を募る予定とのこと。そこではForesight Creationについて学べるだけでなく、そこに集まった人たちとともに実際にイノベーションを発想し(オープンイノベーションですね)、さらにはそれを実現させる場まで提供するつもりだという。これ、非常に興味がある。うちの会社からもぜひ代表者を送り込み、8つの玉を学んできてほしいし、何かを産み出してきてほしい(というか私が行きたい)。

全体を通して
今年は抜群に満足度が高い2日間であった。特に、一橋大学 楠木教授と大阪ガス 松波氏の講演が自分の中でガチッとリンクしたのが最高に気持ちいい。自分のこれからのビジネスに(そして人生に)どう取り込むか? マジで考えないとあかんな。