株式会社富士通システムズウェブテクノロジー ·...

58

Upload: others

Post on 05-Jul-2020

256 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている
Page 2: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

株式会社富士通システムズウェブテクノロジー

Page 3: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

4

【開発ナビゲーション事業】大規模なシステム開発では、効率化のためのフレームワークや共通部品、開発ルールの存在が欠かせません。 また、ミドルウェアを含むアプリ基盤やインフラ基盤の整備、データ設計、品質改善、DevOps などには専門性の高い技術が要求されます。こうした「非機能領域」の技術提供を通じ、文字通り開発をナビゲーションする事業です。

【プロダクト事業】当社ではアプリケーションの内部動作をモニタリングする「DynamicPULSE」や、多様な帳票アプリケーションの開発基盤となる「INTARFRM List(Batch)」などの自社プロダクトを開発。パッケージソフトの販売・保守も手掛けています。システムの開発や運用をサポートするプロダクトを通じて、富士通のソリューション・ビジネスを支援しています。

【マイグレーション事業】マイグレーションとは、OS などのバージョンアップでサポート対象外となってしまったシステムを、最新の環境に移し替えるサービスのこと。単にプログラムをコンバートするだけでなく、効率やセキュリティに配慮したシステムに再生します。マイグレーションは新規システム開発に比べて大幅なコストダウンが可能なため、ニーズが急激に高まっています。

【デジタルビジネス事業】お客様ビジネスのデジタル化を支援するため、プロジェクトの一員としてプロジェクトの初期段階から参画します。技術面でプロジェクトの進め方をリードし、デジタルビジネスを創出するためのプラットフォームの整備や、開発支援ツールの提供を行います。グループ各社のデジタルビジネスへの取り組みと連動しています。

毎年 12 月になると、あちこちの技術コミュニティや会社で「アドベントカレンダー」が公開されます。元々はクリスマスを楽しみにする子供のための、カレンダー型のお菓子箱のことですが、IT 業界では、あらかじめ書いておいたブログ記事が 1 日 1 件づつ公開される、といったかたちになっています。

富士通全体でも 2016 年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げているグループ子会社もあります。そこで、今年は当社でもアドベントカレンダーをやってみたいと思い、作ってみました。

いざ始めてみると、若手からベテランまで幅広いメンバーが参加し、記事もバラエティに富んだものとなりました。ならば、もっと多くの人に読んでもらいたい!ということで、冊子にまとめたのがこの本です。1 記事あたり 2 ページとした都合で、一部の記事は途中までになっています。QR コードから元記事を見られますので、ぜひそちらも読んでみてください。

当社アドベントカレンダーの世界を、じっくりと楽しんでいただけたら嬉しいです。

「株式会社富士通システムズウェブテクノロジー」といいます。ちょっと長いので社内では「FSWeb」という略称を使っています。設立 23 年目を迎える、富士通株式会社の 100% 子会社です。2019 年 4 月現在の社員数は 154 名、平均年齢は 35.9 歳。20~30 代社員の構成比率が高い会社です。

大きな特徴は、「プロフェッショナルな専門技術」で様々なシステム構築プロジェクトに貢献することをミッションとしている点です。システム開発において必須かつ専門性の高いタスクを担う、ちょっと「とがった」会社です。そのため当社社員は、特定の業種・業界に偏らない、様々なプロジェクトに参画しています。

本社は品川港南地区のビルの 27 階にあり、レインボーブリッジや東京タワーも見える開放的なオフィスです。

Page 4: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

5

Inside FSWeb !!!

社内コミュニティ「いのべこ」(=イノベーション人材コミュニティ)「先端技術へのアンテナが高く、自発的に学べる」「ハッカソン等の社外イベントを通じ、情報発信と収集、人脈構築

ができる」ような人材の活動をバックアップし、増やしていくための、会社公認の技術者コミュニティです。コミュニティには誰でも参加でき、オンライン/オフラインでの交流の場を用意しています。

●オフライン(定例 LT 会・定例オフ会)月 1 回の「定例 LT 会」、月 2 回の「定例オフ会」を社内で開催しています。定例 LT 会は、自分の学習成果や社外イベントへの参加報告などが行われ、若手でも気軽に発表できる場となっています。また、定例オフ会はランチミーティング形式で集まって、雑談やイベント情報交換などを気軽に行える場として運営しています。これらは Skype for Business によるリモート参加も可能です。

●オンライン(Mattermost「いのべこチャンネル」)社内チャットシステム「Mattermost」内に、コミュニティのチャンネルを開設しています。気になった技術のことを書いたり、気軽に質問したりと、自由な空気が溢れてます。アドベントカレンダーに取り組むことになったのも、Mattermost チャットでの雑談がきっかけでした。

●いのべこブックシェア技術書やビジネス書など、良書はみんなでシェアしたい!そこでオフィスに「ブックシェア用の書棚」を設置し、自由な貸し借りができるしくみを作りました。「ブクログ」のサービスを活用し、どんな本があるか、どの本が借りられるかを一目でわかるようにしています。現在、約 20 冊が登録されています。

勉強会/ハッカソン参加支援社外の勉強会やハッカソンへ参加すると、人材交流や人脈の構築ができたり、新技術を使ったサービスの開発経験を得ることができます。当社では、社外で開催される各種勉強会やハッカソンへの参加を推奨しています。これは業務として認められ、残業手当や参加の際に必要な旅費・参加費は、一定の基準の元で会社が負担します。ここでは、過去に参加したハッカソンについてご紹介します。

●事例 1:RIZAP ハッカソン(2018/9)RIZAP グループが経営参画している J リーグチーム「湘南ベルマーレ」の「J1優勝」と「ファン層拡大」に向けたアイデアを実装することを目的としたハッカソン。当社からは 3 名チームで参加し「J1 優勝」に向けたアイデアとして

「動画によるコーチング支援システム」を提案しました。チームの監督からは「デモが見てみたい」とのコメントが頂けました。

●事例 2:スポーツ×ヘルスケア×北海道ハッカソン(2018/11)北海道名寄市は雪質を活かした冬季スポーツに強みを持つ街。リソースが少ない地方で IoT を活用し、「スポーツ」「ヘルスケア」の課題を解決するアイデアを求められたハッカソン。当社からは 2 名が参加、計 4 名のチームで「市民のバイタルデータから健康保険料を安くする」ソリューションを提案しました。奇抜なアイデアでしたが「市民に運動を継続してもらうことを考えている」との評価を頂きました。

Page 5: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

6

ウェブテク・デー2019 年度から開始した当社の独自制度で、業務時間内に月あたり 1 日(7.8 時間)の「学習時間と環境」を社員に提供します。学習テーマは業務と関係なく自由に決められます。学習成果は社内イベントでの発表やブログ記事により社内へ共有してもらい、技術の「インプット」だけでなく「アウトプット」の習慣化を狙っています。2020 年 1 月現在、36 件のテーマが申請されています。

●学習テーマ(一例) 「Mattermost で動作するリマインダー機能」→ 12/3 の記事になってます 「M5Stack、GCP を用いたビオトープ環境制御の研究」 「DADock から気軽にビルド・デプロイできる Docker 環境を作る」 「性能テスト作業の品質向上・効率化の施策検討」 「WeChat ミニプログラムの作成」

ウェブテクフォーラム当社は会社設立時より「技術重視の会社」としてプロジェクトにおける技術成果発表のイベントを毎年実施していました。また、ビジネスアイデア発掘を目的とした「アイデアコンテスト」も 2013 年から開始しました。

2019 年度はこの 2 つのイベントを統合した「ウェブテクフォーラム」として年 2 回開催にリニューアルし、成果やアイデアの共有をスピードアップしました。発表内容は「技術成果報告」と「アイデアコンテスト」を中心とし、自由な発表の場として「技術トピックス報告」「ウェブテク・デー成果報告」

「海外出張報告」なども実施しています。またゲストセッションを設け、富士通内外のゲストから様々なテーマの話を聴ける場としても活用しています。2019 年度、優秀賞に選ばれたテーマは下記の通りです。

●「ウェブテクフォーラム 2019 夏」優秀賞 「画像解析技術を用いたレシート認識機能の開発」

●「ウェブテクフォーラム 2019 冬」優秀賞 「日本語の文法や表現を修正するツール」 「AOP を活用した新規ソリューション創出」

海外研修当社では海外研修も活発に実施しています。「Microsoft Build」「AWS re:Invent」「VMworld」などベンダー主催のイベントや「CES」などの展示会には毎年のように社員が派遣されています。また「ウェブテクフォーラム」で優秀賞を獲得した社員には、副賞として深センなどイノベーション先進地への視察研修の機会が与えられており、ビジネス創出に向けての見識を深めています。●深セン AI/IoT 視察(2019/3) 先端イノベーション事例企業を 視察。2018 年度アイデアコン テスト優秀賞の副賞として実施。

● VMworld 視察(2019/8) 仮想化市場のシェア世界一の VMware 社によるイベント。 米国・サンフランシスコで開催。

● CES 視察(2020/1) 家電見本市から総合技術展へ 変貌を遂げた伝統イベント。 米国・ラスベガスで開催。

Page 6: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

7

FSWeb Advent Calendar 2019

日付 記事タイトル 執筆者名12/1 Alexa Gadget Toolkit を試してみた件

(IoT, Alexa)じゅげむ(今井 隆)

12/2 削除後同名のフォルダを作成するとエラーになる(PowerShell)

niku9

12/3 Mattermost でリマインダーを作ってみたよ(Node-RED)

sekiya-don

12/4 Custom Vision Service で機械学習の入り口に立った気になる(Azure)

K_east

12/5 子供とプログラムパート II。アレクサ!じゃんけんしよう! (ペアプログラミング)

タカぽん(吉野多香子)

12/6 Google Cloud Platform で Angular と Spring Boot を動かしてみた!(GCP)

小トロ (花岡 舜)

12/7 VMware Hands On Lab で PKS 環境をさわってみました(Kubernetes)

tk4_oota

12/8 作業を少しでも効率化するために bat や VBA などのツールを作って使う(サクラエディタ , Excel VBA)

中本博晃

12/9 Alexa Gadget Toolkit を試してみた件(その 2) (IoT, Alexa)

じゅげむ(今井 隆)

12/10 アジャイル開発におけるプロダクトの価値はどう測るべきか?(アジャイル)

福井@名古屋支部

12/11 Mattermost に仮想サーバのディスク空き容量お知らせ Bot を作る(Docker, Node-RED)

eight-cotton

12/12 Google Cloud Vision API を使って食べ物の写真を判定してみる(GCP, 機械学習)

m-yuumin

12/13 眠い人を吸い込むブラックホールチャンネルを作った話(Mattermost, Node-RED)

little555

12/14 Ubuntu 18.04 の Kubernetes 環境を構築してみた!(Kubernetes)

zhangyangfeng(張 楊峰)

12/15 scikit-learn でルーン文字の手書き文字認識をやってみた(Python, 機械学習)

近藤 あゆみ

12/16 間違い探しを秒で解いてくれるプログラムを作ってみた(Python, OpenCV)

fujisawa

12/17 SpringBoot を使って Teams にメッセージを投稿してみた。(Teams)

LEViA

12/18 AWS 初心者が CodeBuild と CodeDeploy を使って CI/CD やってみた(AWS, DevOps)

さかーた

12/19 AspectJ が書き換えたコードを無理やり覗いてみた(Java, Aspect 指向)

wataro

12/20 GitLab CI/CD による Docker 環境へのパイプライン考察(GitLab, DevOps)

ikeda.hideya

12/21 Rust をやりませんか?(Rust)

HarakiDX

12/22 ポーズ推定でヴァイオリン演奏のボーイングを可視化してみた(Tensorflow, OpenPose)

筒井 城治

12/23 ぼくのかんがえたさいきょうの開発手法(アジャイル)

曽我 敏行

12/24 Docker で作る、最強の移動型開発環境(Docker, Coder)

ばし

12/25 スマートスピーカーのセキュリティを(ちょっとだけ)考える (Alexa, Google Home)

じゅげむ(今井 隆)

▲記事一覧はこちら

Page 7: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

8

Alexa Gadget Toolkit を試してみた件1

じゅげむ(今井 隆)

小さいデバイスが大好きな元エンジニア、今は経営企画職。本誌の編集も担当しています。2011 年から Windows Phone アプリを趣味で開発するようになり、プログラミングが趣味になりました。

Alexa Gadget Toolkit とはAlexa Gadget Toolkit(AGT) は 2019 年 9 月に発表された、Amazon のスマートスピーカーである Echo デバイスと連携づけて動作させるガジェット(周辺機器)を開発するためのキットとなります。デバイスに Alexa のスマートスピーカー機能を組み込む Alexa Voice Service(AVS) とは異なり、ガジェットはあくまで Echo デバイスの子機として動作し、デバイス連携による多様な機能提供を狙ったものとなります。同じようなガジェットの分野では LINE が LINE Things として 2018 年 11 月に発表していますので、そこから約 1 年遅れで登場した、ということになります(LINE Things はスマートスピーカーでなく LINE Bot と連携して使うガジェットですが)。当初はベータ版として米国、英国、ドイツでのみ利用可能でしたが、11 月には Alexa が販売されている全 15か国(日本を含む)で利用可能となりました。

AGT でできることAGT では、Echo デバイスとガジェットを Bluetooth 接続でペアリングします。それにより、ペアリングした Echo デバイスからの指示をガジェットに伝えたり、ガジェットからの応答をスキルが受け取ることができるようになります。Echo デバイスとガジェットの間の通信インタフェースには、大きく 2種類があります。ウェイクワードの検出やタイマーなど数種類の定義済みインターフェースと、様々な指示やデータ交換ができるカスタムインターフェースです。定義済みインターフェースは Echo デバイス・Alexa 音声サービス(クラウド)とガジェットが直接連携し、スキルは介在できません。スキルを含めた連携アプリケーションを実現したいなら、カスタムインターフェース一択になります。

AGT を使ってみるここからは AGT を実際に使ってみることにします。以下は、下記記事を参考にしました。ありがとうございます。

Alexa のカスタムスキルがガジェットと連携! 〜 Alexa Gadgets Toolkit の Custom Interfaces を試す〜https://qiita.com/youtoy/items/472da6c009a5ee3407ea

ガジェットの登録開発するガジェットは事前に Amazon への製品登録が必要です。登録は Amazon 開発者ポータルから実施します。Alexa スキル (ASK) の開発者は同じアカウントでログインできます。未登録の場合は Amazon.co.jp アカウントを使って、無料で登録できます。登録時の注意点としては「Amazon.co.jp と Amazon.com で同じメールアドレスを使っている場合、パスワードを異なるものにする」こと。パスワードが同じだと、ログイン時に Amazon.com の開発者ポータルに優先的に登録されてしまい、Amazon.co.jp の開発者ポータルが使えなくなります。ログインしたら「Alexa」→右上メニューから「Alexa Voice Service」→「製品」→「製品を作成する」の順で選択し、製品の登録画面を表示します。登録画面での設定項目は下記の通り。 ・製品名:Echo 本体とのペアリング時に表示されるガジェット名となります。全角・半角文字が使えます。 ・製品 ID:システム内で用いる ID で、半角英字・数字・アンダーバーのみ使えます。 ・製品タイプ:「Alexa ガジェット」を選択してください。

以下、製品カテゴリー以降は適当なものを設定してください。登録が終わると「Amazon ID」と「Amazon ガジェットのシークレット」の 2 種類のコードが発行されます。これはガジェットのサンプルコード実行時に使用します。

ガジェットの準備(ハードウェア)AGT には、Raspberry Pi(RPi) を使って Toolkit の機能を試すためのサンプルが用意されていますので、これを使います。RPi は PC と USB 接続してのセットアップも可能ですが、モニタ・キーボード・マウスを接続してセットアップするほうが簡単です。自分は Raspberry Pi Zero WH、モニタ、USB ハブ、USB 接続のキーボードとマウスを使いました。また、無線 LAN 環境が必要です。RPi に Raspbian OS の最新版、Buster をインストールします。サンプルのページには Buster の一つ前のバージョン、Stretch と記載がありますが、Buster で大丈夫でした。インストールには NOOBS3.2.1 を使いました。PC で zip ファイルを展開、microSD カードにコピーし、RPi に取り付けて起動し、画面から Raspbian を選択することでインストールできます。初回起動時の OS 設定で無線 LAN 設定を行います。一旦 DHCP で接続になりますが、後で固定 IP アドレスへと変更します。TextEditor を使い、/etc/dhcpcd.conf に下記の記述を追加することで変更できます。

twitter:@jugemsan / https://pichi.net/jugemsan/

Page 8: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

9

FSWeb Advent Calendar 2019interface wlan0static ip_address=192.168.xx.xx/24 #RPiに付与する固定アドレスstatic routers=192.168.xx.x #無線ルータのアドレスstatic domain_name_servers=192.168.xx.x #上と同じで可

次に OS のメニューバー右側にある Bluetooth のアイコンを右クリックし、削除します。これが残っていると、Echo デバイスとのペアリングの際の障害になりますので、必ず削除してください。設定を反映するため、RPi を再起動します。

ガジェットの準備(ソフトウェア)次にサンプルコードをダウンロードします。ここから先は、RPi でコンソールを開くか、同じ無線 LAN 上の PC からSSH でリモート接続し、/home/pi フォルダに移動している前提とします。git clone でサンプルコードをダウンロードします。git clone https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples.git

サンプルを使うためのセットアップを実施します。cd Alexa-Gadgets-Raspberry-Pi-Samplessudo bash ./setup.sh

実行時に Amazon ID と Amazon ガジェットのシークレットの入力を要求されますので、先程ガジェットの登録時に発行されたコードを入力します。

セットアップには数十分かかります。また、500MB ほどのダウンロードが発生しますので注意が必要です。セットアップが終了すると再起動を促されますので、再起動してください。

Echo デバイスとガジェットのペアリングEcho デバイスとガジェット (RPi) を Bluetooth でペアリングします。Echo デバイスはガジェット対応であること。RPiと同一の無線 LAN ネットワーク上にあること。また、電源は ON にしておく。また Echo デバイスに画面がない場合、スマホの Alexa アプリがペアリングのために必要です。まず、RPi のコンソール上でサンプルコードを実行します。cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Samples/src/examples/wakewordpython3 wakeword_gadget.py

実行すると、ペアリング時にスマホに表示される Bluetooth デバイス名が「GadgetXXX」の形式で表示されます。

次に、Echo デバイスからペアリングの設定を行います。ここでは、画面のない Echo Dot を使用する場合の、スマホの Alexa アプリからの設定例を示します。Alexa アプリを起動したら、メニュー左の「設定」→「Echo・Alexa」→使用する Echo Dot →ワイヤレス内「Bluetooth デバイス」→「新しいデバイスをペアリング」の順で選択し、ペアリング先の検索画面を表示します。ペアリング先として先程表示された Bluetooth デバイス名が表示されたら、それを選択します。「(製品名)をペアリングしました」のダイアログが表示されたら、ペアリング成功です。

ペアリングのテストペアリングができたかどうかの確認を行います。ガジェット側で実行しているサンプルコードは、Echo デバイスに対するウェイクワード(「Alexa、〜して」の「Alexa」)の発話を検知してガジェットに接続した LED を点灯・消灯させるものです。ここでは LED を接続せず、RPi コンソール画面で確認する方法を示します。

Echo デバイスに「Alexa、明日の天気を教えて」と発話します。すると、RPi コンソールにメッセージが表示されます。1 行目は「Alexa」と発話した時、2 行目は「明日の〜」を発話した時に表示されます。このサンプルコードには定義済みインターフェースの「ウェイクワードの検出」が実装されており、Echo デバイスでウェイクワードの発話・続きの発話を認識した際にペアリングされたガジェットへ通知を発行するようになっています。

ソースコードを見てみるサンプルコード (wakeword_gadget.py) のなかを見てみると、案外シンプルでした。初期化などを除いた、主なコードはこれだけ。

続きは元サイトの記事をご覧ください!

Page 9: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

10

削除後同名のフォルダを作成するとエラーになる2

niku9見えないものを理解するのが苦手です。しかし、DXにより今まで見えなかったものが見えるようになってきます。しかしながら、DX自身の内側は見えないものが多く、DX自身を理解するのはかなり難しいです。DXの内側を理解したときはじめてDXを使いこなせるようになると思います。

Windows 機内の一時ファイル置き場に沢山の不要ファイルが溜まってきたので単純に削除するのではなく、せっかくだから今まで使ってこなかった PowerShell を使ってみようとしました。その際、はまってしまったことを整理した記事です。

発生したトラブルフォルダの作成に失敗します。

やりたいこと不要なファイルが入っているフォルダを削除し、新しい同名のフォルダを作成します。

実行環境Windows10 Enterprise バージョン 1809

実行したスクリプト$target = "C:\temp\Trash"

# 不要フォルダを削除するif (Test-Path $target) { Remove-Item $target -Recurse}# 新規にフォルダを作成するNew-Item $target -itemType Directory | Out-Null

エラーの詳細以下の 2 つのエラーのどちらかが発生します。後者はおそらく削除のためにロックをかけているのでしょう。そのタイミングで作成しようとすると発生すると思われます。

C:\Scripts\ > .\Trash.ps1New-Item : 指定された名前 C:\temp\Trash の項目は既に存在します。発生場所 C:\Scripts\Trash.ps1:8 文字 :1+ New-Item $target -itemType Directory | Out-Null+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\temp\Trash:String) [New-Item], IOException + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

C:\Scripts\ >

C:\Scripts\ > .\Trash.ps1New-Item : アクセスが拒否されました。発生場所 C:\Scripts\Trash.ps1:8 文字 :1+ New-Item $target -itemType Directory | Out-Null+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\temp\Trash:String) [New-Item], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

C:\Scripts\ >

Qiita:@niku9

Page 10: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

11

FSWeb Advent Calendar 2019原因PowerShellの Remove-Item コマンドは、別プロセスで実行されるらしく、削除完了を待たずに、次の処理に移行してしまいます。すると、C:\temp\Trashの削除が完了する前に C:\temp\Trashを作成しようとするため今回のトラブルが発生しました。

対応方法対応方法は大きく3つ思いつきました。 1. 削除完了を待ってから作成を行う 2. 削除対象を別名で退避し、作成を行う 3. 外部アプリを使う。

別途削除アプリを作り、PowerShell から待ち受けで実行すればできますが、それは今回の目的から外れるので 1 と 2 を試しました。

「削除完了を待ってから作成を行う」場合Remove-Item コマンドを実行後、Start-Sleep コマンドを使い何秒か経過してから New-Item コマンドを実行しても良いのですが、適切なスリープ時間を決めることは難しいです。そこで、C:\temp\Trash が存在しているかどうかをチェックし、存在しなくなったら作成するようにしたのが、次のスクリプトです。$target = "C:\temp\Trash"

# 不要フォルダを削除するif (Test-Path $target) { Remove-Item $targetBk -Recurse}

# 対象の存在チェックを繰り返すwhile (Test-Path $target) { # まだ存在しているので 1秒待ってから再度チェックを行う Start-Sleep -Seconds 1}

新規にフォルダを作成するNew-Item $target -itemType Directory | Out-Null

削除される対象の量の大小によって、Sleep 時間は増減させればいいでしょう。ただし、このスクリプトにはトラブルが発生しました。while の Test-Path の際に、アクセスエラーが発生することがあるのです。原因はわかりません。

「削除対象を別名で退避し、作成を行う」場合Rename-Item もしくは Move-Item コマンドで対象をリネームすることで削除処理の影響をなくしたのが、次のスクリプトです。$target = "C:\temp\Trash"

# 不要フォルダを削除するif (Test-Path $target) { $targetBk = $target + "Bk" # 一度退避してから削除する Rename-Item $target $targetBk Remove-Item $targetBk -Recurse}

# 新規にフォルダを作成するNew-Item $target -itemType Directory | Out-Null

フォルダを作成と削除を分けることでトラブルを回避します。先の「削除完了を待ってから作成を行う」と異なり、こちらは安定して動作しました。

まとめもともと削除処理は結果を待ち受けません。それを無理に待ち受ける処理にするよりもその動作をそのまま受け入れた方式の方が自然に動作するようです。

Page 11: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

12

Mattermost でリマインダーを作ってみたよ3

本業は VB6 の VB.NET バージョンアップをやっています。最近は Node-RED で遊んでます。

はじめにMattermost には Slack と違い、リマインダーが標準で用意されていない。社内でリマインダー機能が欲しいって意見があったので、「リマインダーくらい直ぐ作ってるよー」って意気込みで作ってみました。※ Slack と同じ使い勝手のリマインダーが一応プラグインとして提供されてるらしい。

用意するもの ・Node-RED ・SQLServer ※データベースを使ってますが、ファイルでも代用可能です。

処理について登録処理:Mattermost のスラッシュコマンドからリマインダーを登録する。 1. ユーザーはスラッシュコマンドを入力する。コマンド:/reminder 2. BOT はリマインダー登録ダイアログを作成し JSON 形式で Mattermost に送信する。 3. ユーザーはダイアログにリマインダーの登録したい情報を入力し、ボタンを押す 4. BOT は入力内容を受け取り、データベースに登録し、登録結果を Mattermost に JSON 形式で送信する。

通知処理:指定した日時になったら Mattermost に通知を投げる。 1. BOT は毎分データベースに DELETE_FLG は OFF のリマインダー情報を SELECT 文で受け取る。 2. SELECT 文実行結果を 1 行ずつ読み込み、ユーザーの指定した日時が現在日時と一致した場合、Mattermost にリマインダー情報を JSON 形式で送信する。

登録処理Mattermost に表示されるダイアログは以下のとおりである。ここにリマインダー情報を入力し、DB に登録される。

■ダイアログテキストボックスに日時のサブタイプがない為、yyyyMMddhhmm 形式でゴリ押しで作成した。とりあえず、日付と時間のところは現在の日時を入れ、必要がある人だけが書き換えれば良いという風にした。

■ソースコード (省略しました。サイトの記事をご覧ください)

ダイアログで必要事項を入力し「SET」ボタンを押すと、コマンドを実行したチャンネルに以下のような通知が BOT から来る。

■ BOT からのメッセージ

通知処理先ほど登録したリマインダーはこんな感じで通知が来ます。

Qiita:@sekiya-donsekiya-don

Page 12: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

13

FSWeb Advent Calendar 2019■通知内容BOT は毎分データベースに DELETE_FLG は OFF のリマインダー情報を SELECT 文で受け取り、条件と一致したリマインダーを Mattermost に送信する。

■ソースコードvar dt = new Date();var WeekChars = [ "日曜日 ", "月曜日 ", "火曜日 ", "水曜日 ", "木曜日 ", "金曜日 ", "土曜日 " ];var wDay = WeekChars[dt.getDay()];var hh = ("0"+dt.getHours()).slice(-2);var mm = ("0"+dt.getMinutes()).slice(-2);var hhmm = hh + "" + mm;var yyyy = dt.getFullYear();var MM = (dt.getMonth() + 1);var dd = dt.getDate();var yyyyMMdd = String(yyyy) + String(MM) + String(dd);

var year = null;var month = null;var date = null;var dayOfWeek = null;var hour = null;var minute = null;var thisInterval = "Weekdays";if (wDay === "日曜日 " || wDay === "土曜日 " ) { thisInterval = "Holiday";}for(i=0;i<msg.database.length;i++){ year = msg.database[i].TARGET_DATE.slice(0, 4); month = msg.database[i].TARGET_DATE.slice(4, 6); date = msg.database[i].TARGET_DATE.slice( -2 ); var targetDate = new Date(parseInt(year), (parseInt(month) -1), parseInt(date)); dayOfWeek = targetDate.getDay(); if(msg.database[i].TARGET_TIME === hhmm) { if (msg.database[i].INTERVAL === "EveryDay") { return createMsg(); //毎日 } else if (msg.database[i].INTERVAL === "None" && msg.database[i].TARGET_DATE === yyyyMMdd) { return createMsg(); //繰り返しなし } else if (msg.database[i].INTERVAL === thisInterval) { return createMsg(); //平日 or休日 } else if (dayOfWeek === dt.getDay() && msg.database[i].INTERVAL === "EveryWeek") { return createMsg(); // 毎週 } else if (date === date && msg.database[i].INTERVAL === "Monthly") { return createMsg(); // 毎月 } }}return null;

function createMsg() { if (msg.database[i].INTERVAL === "None") { msg.payload = { userName: "いつもアシスト ふくまろ ", channel:msg.database[i].CHANNEL_NAME, text:"リマインドします。", attachments: [{ author_name:"REMINDER_ID." + msg.database[i].REMINDER_ID, text:msg.database[i].MESSAGE, }] }; msg.database = { "REMINDER_ID":msg.database[i].REMINDER_ID, "CHANNEL":msg.database[i].CHANNEL_NAME, "INTERVAL":msg.database[i].INTERVAL }; } else { msg.payload = { userName: "いつもアシスト ふくまろ ", channel:msg.database[i].CHANNEL_NAME, text:"リマインドします。", attachments: [{ author_name:"REMINDER_ID." + msg.database[i].REMINDER_ID, text:msg.database[i].MESSAGE, actions:[{ name:"このリマインダーを停止させる ", integration: { url: "http://**.**.**.**:8888/stop/reminder", context:{ "REMINDER_ID":msg.database[i].REMINDER_ID, "CHANNEL":msg.database[i].CHANNEL_NAME, "INTERVAL":msg.database[i].INTERVAL } } }] }] }; } return msg;}

ひとことSlack のコマンドより個人的には使いやすい自分好みのリマインダーを作ることが出来ました。次回はプラグイン化してどこの環境でも使えるリマインダーに出来たらなぁって思ってます。ノシ

Page 13: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

14

Custom Vision Service で機械学習の入り口に立った気になる4

データセンターでサーバ構築の日・・・次はあなたの街のデータセンターで!

以前から気になっていた Azure の Custom Vision Service を使用してみました。敷居が高そうな機械学習の入り口に立った気になれる記事です。

動作環境Azure Custom Vision Service(https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/)Monaca(https://ja.monaca.io/features/) ← API 叩く用

参考にしたサイトCustom Vision API を Javascript から呼び出すhttps://kishaku-kangen.blogspot.com/2018/05/custom-vision-apijavascript.html

Azure Custom Vision Service とはMicrosoft Azure が 提 供 す る 機 械 学 習 関 連 の API 群 Cognitive Service(https://azure.microsoft.com/ja-jp/services/cognitive-services/) の中にある画像分類を得意とするサービス。流れを 3 行でまとめると

・学習用データ ( 画像 ) をアップロードして・学習させて・問題用データを判定させるという大変に便利なサービスとなっております。

事前準備Custom Vision Service にアクセスし Create new project を行いましょう。Name と Description を入力し Resource を選択したら「CreateProject」をクリックします。

Custom Vision Service の学習方法1. 学習用データの準備 今回はスティックタイプのお菓子で有名な「ポッキー」「プリッツ」「トッポ」の画像を各 30 枚ずつ準備しました。※背景は白などで統一すると判定精度が上がります。

2. 学習用データのアップロード 事前準備で作成したプロジェクトにアクセスし、Add images から画像を追加します。追加が出来たら My Tags に自分の付けたいタグ名を入力し Upload を行います。

K_east

Page 14: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

15

FSWeb Advent Calendar 20193. すべての画像がアップロード出来たら画面右上の緑色の歯車マークを押して学習を実行しましょう! 学習が完了すると先ほど画像に付けた Tag 毎の学習度などが表示されます。

API をつかって判定してみる学習が完了したのでさっそく API 用の ID を払い出して簡単なアプリを作っていきます。必要となるのは以下の 4 つの情報です。 ・API へのアクセス用 URL ・Prediction-Key ・Content-Type ・IterationID

Monaca にアクセスして先ほど集めた情報をもとにサクッとアプリを作りました!

実際にトッポの画像を読み込ませて API を叩いてみましょう!判定結果は トッポ 99.926% となりました。

まとめ今回各 30 枚という少ない画像での判定を行いましたが、特徴的な物であれば十分に判定可能という事が分かりました。Custom Vision Service を足掛かりに機械学習に興味を持つきっかけとなればと思っています。

おまけMonaca で作成したソースコード (省略しました。サイトの記事をご覧ください)

Page 15: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

16

子供とプログラムパート II。アレクサ!じゃんけんしよう! 5

わくわくしたい、わくわくさせたい気持ちで仕事を続けてはや 2x 年。40 過ぎでも実装が楽しいお年頃。50 を過ぎても新しいことにわくわくし続けたいものです。

VoiceFlow を使って、息子(小 6)とアレクサのスキルを作ってみる、2 回目の記事です。初回(https://ameblo.jp/takachan-tomochan/entry-12546202131.html)は私ばかりが操作してしまい、息子にあまり操作させなかったことを反省。次は息子に操作を任せて、私は横で・・・何をしたらいいんでしょう?

今回は息子と楽しくプログラムする方法について考えてみました。

2 人でプログラミングといえば、ペアプログラミング(以下ペアプロ)。息子と楽しくプログラミングをする方法の参考になるんじゃないかと期待してペアプロについて調べてみました。

ペアプロの定義>ウィキペディアざっとまとめるとポイントはこんなところでしょうか。  ・ 「ドライバー」「ナビゲータ」に分かれる  ・メソッド単位。日単位などの単位を区切って役割を入れ替える。頻繁に組む人を変える。  ・ドライバーが実装中、ナビゲーターがテストを作るなど相補的な作業をする。

残念ながら今回の試みはユニットテストを作るようなプログラムではないので、テストを作ってあげることはできないようです。簡易に実装・実行ができる VoiceFlow のような開発でナビゲータは相補的な作業として何をすればいいのでしょうか。

ナビゲーターはなんとしょうVoice Flow でナビゲーターをするということは、いうなれば、カーナビ付きの自動車のナビシートにいるようなものであるので、昼寝でもしてるしかないような(誤)

今回に限って言えば、息子も私も voiceFlow 初心者なので息子が実装に困ったときに、どうやったらできるのかを調べる仕事はあるのだけど、それは支援や教える立場であって「一緒にやっている感」が薄い気がします。

ドライバーのためにできることところで、前回 VoiceFlow を使ってみて残念だったのが、各ブロックに定義した内容が見えないことでした。また、家のノートPCでは画面が小さく、全体を見ることが難しいことがあります。

そこで、プログラム内容を付箋を使って見える化してみたらどうかと思いました。

息子をドライバーにしてプログラムを作成する傍らで私がナビゲーターとしてプログラムした内容を付箋に書き起こして見える化する。

実装内容に対する理解も深まるし、それぞれに「成果」ができるのもいい感じです。ちょっとわくわくしてきました。

タカぽん(吉野多香子)

Page 16: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

17

FSWeb Advent Calendar 2019ペアプロについてもう少しここでちょっと息子とのプログラミングから離れて、ペアプロについて調べたことをもう少し。

(今回は Qiita カレンダー向けなので技術色濃いめを目指しています)

まず、こちらの GitHub の「ペアプロの心得」という記事は非常に興味深い内容でした。https://gist.github.com/j5ik2o/2970973

特に、「当事者意識をもつ」のくだりでパートナーの様子を見てキーボードを取り上げたり、散歩に誘ったりという話は、ペアプロという形式でないときにもチームとしてできるようになりたいと感じます。

ところで、ペアプロについてちょっと検索しただけで、生産性が上がったとか、チーム力が上がったという素晴らしい報告がある一方でまだ、私の近辺では「当たり前」になっていません。

なぜだろうと考えたときに、ある案件で「SVN ならわかるけど、Git の使い方がわからないから SVN にしよう」

と言われたことを思い出しました。

ちなみに、Git の使い方に明るくないプログラマというのは少なくなく、それなりに規模の大きい案件で Git を導入する場合はメンバーからの QA を覚悟する必要があります。そんな中、Git の利点をあまり活かせていない現場では、メンバーが「SVN で十分なのに」とぼやくこともありました。一方で、Git の特性を生かしてルールを整備し、展開した現場では、Git の操作方法がわからないという QA が出てくることは変わりませんが、メンバーも Git の有用性を理解して、積極的に使おうと提案までしてくれていました。

閑話休題。

つまり、新しくなにかを導入するにはメンバーにとって実感できるメリットが必要なのだろうかなと。ペアプロについて巷の記事をみればメリットはいっぱいあるのですが、逆にメリットが大きすぎて胡散臭いとか・・・^ ;^社内でもペアプロをやってみようという動きはあるので、とっとと「やって当然」「なんでやらないの」というところまでもっていきたいですね。

最後に、ペアプロについて学ぶために参考にした記事をいくつかリンクします。

「ペアプログラミングで「強いエンジニアチーム」を作る! ヤフーが実践する全てペアプロ開発の手法」https://employment.en-japan.com/engineerhub/entry/2019/11/07/103000

こちらの記事には「ペアプロ導入のハードルを乗り越える方法」なんてのもありました。やっぱりそこが一番大変なんだろうな。

「ペアプログラミングとは?メリットとデメリットをまとめてみた」https://blog.codecamp.jp/programming-pair-advantage-disadvantage

こちらの記事はデメリットもありますね。でも、うーん。メリットに対してデメリット弱いかな

(本当にいいものなんだからしょうがないのかもしれませんが)。

「ペアプロ懐疑派だった僕が、実務でペアプロ導入して 180 度考えが変わった話」https://qiita.com/YudaiTsukamoto/items/06b426f4dbee268d5035

2017 年のカレンダーの記事でした。180 度ってすごい

次回は息子とペアプロ(もどき)を実践した結果をレポートしようと思います。

Page 17: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

18

Google Cloud Platform で Angular とSpring Boot を動かしてみた! 6

小トロ (花岡 舜)

ゲーム、技術、その他いろいろ気になることが好きなエンジニアです!ゲームだと最近はもっぱらスマホゲーム、技術だとアジャイルや DevOps 系です!

はじめに最近では色々な開発で使われるようになってきたクラウドサービスたち (AWS、Azure など ) の中で、私がまだ一度も使ったことがない Google のクラウドサービス「Google Cloud Platform」を使ってみようというのが今回の企画!具体的には、タイトル通りフロントエンドのフレームワークで有名な「Angular」とバックエンドのフレームワークで有名な「Spring Boot」の 2 つを Google Cloud Platform(GCP) で動かしてみたいと思います。

Google Cloud Platform とは?一言でいうと「Google が提供しているクラウドコンピューティングサービス」のこと。インターネットさえ繋がっていれば、Google 社が提供している開発支援のサービス、サーバなどの基盤環境を簡単に利用できる。主要なサービスだけでも 21 個ものサービスを提供している。ちなみに、今回使うのは以下のサービス。 ・Google App Engine ・Google Compute Engine気になったら調べてみてね。

Angular とは?Google と個人や企業のコミュニティによって開発されている TypeScript ベースのオープンソースのフロントエンドWeb アプリケーションフレームワークです。昔は、「AngularJS」という JavaScript 中心のものから始まり、バージョン 2.0以降からアーキテクチャや開発言語を一新して現在の「Angular」という名称になりました。注意ですが、「AngularJS」と「Angular」は全く別物です。実際に使ってみると分かりますが、使える機能や関数が完全に違うので互換性は一切ありません。小ネタですが、このフレームワークは Google が関わっているので、Angular Material Design という Google のサイトやスマホのデザインテーマが使えたりします。

Spring Boot とは?Java プラットフォーム向けのオープンソースアプリケーションフレームワークである Spring Framework が提供する機能の 1 つ。前提として Spring 単体の知識が必要になるが、簡単に言うと Spring 単体だとやらないといけなかった細かい設定作業を省いて、開発者がコーディングに専念できるように特化された開発アプリだと思えば良いかと思います。あと、Spring Boot で作成した Java アプリは、デフォルトで Web コンテナを内包しているので、Tomcat をいちいち用意する必要もなく jar を起動するだけで Java アプリが起動できます。( 通称、組み込み Tomcat)

準備したことAngular と Spring Boot を動かす前に、まず事前にやっておいたことをまとめます。

GCP の利用登録 &GCP のプロジェクト作成今回は個人 google アカウントを利用し、GCP の無料トライアルサービスを使いました。ポイントは以下の点。 ・無料トライアルは 12 ヵ月間、月 300 ドル分の GCP サービスを使える ・300 ドル分以上使ってしまった時点で Google Cloud Platform の無料トライアルは終了する ・月 300 ドル以上のため例えば 1 月に 250 ドル分使用した場合 2 月にはまた 300 ドル分使用できるようになっている

プロジェクトの作成までは、既にある記事のほうがわかりやすいです。【Qiita】これから始める GCP(GCE) 安全に無料枠を使い倒せ

https://qiita.com/Brutus/items/22dfd31a681b67837a74

GCP SDK のインストール資産を GCP のサービスにデプロイするために gcloud コマンドが必要なので、公式サイトを参考にインストールします。https://cloud.google.com/sdk/docs/quickstarts?hl=ja

github:@jenokiller / https://www.shotoro.com/

Page 18: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

19

FSWeb Advent Calendar 2019Angular のサンプル作成今回は Angular7 をサンプルに用意しました。現在 (2019/12) でリリースされている Angular8 だと、Google App Engine でうまく動かない事例があるので Angular7 にしています。Angular の セ ッ ト ア ッ プ は、 公 式 (https://angular.jp/guide/setup-local) に沿って行い、サンプルを作成しました。※ Angular CLI のインストール時、バージョン 7 を明示的に指定する必要があります。

Spring のサンプル作成Spring の サ ン プ ル は、 ベ ー ス プ ロ ジ ェ ク ト を 作 成 で き る Spring Initializr サイト (https://start.spring.io/) を利用しました。RESTful API の設計で、適当に User 情報を返してくれるサンプルで動かしました。

ここまで出来たら、いざ Try!

やってみたどんな感じで、資産を配備できるかを実際のサービスを使って動かしてみました。

Angular を Google App Engine で動かす ・事前準備で実施した GCP SDK のインストールを行い、以下の内容がしっかりできていることが前提  ・開発プロジェクトとの接続設定ができている  ・利用する Google アカウントの設定ができている ・ローカル端末に Angular7 の資産を用意する ・app.yaml ファイルを Angular 資産のルートディレクトリに作成する ※デプロイ時に必要runtime: php55api_version: 1threadsafe: true# サービス名を指定しない場合、defaultになる# service: angularhandlers:- url: / static_files: dist/index.html upload: dist/index.html- url: / static_dir: dist

 ・GCP SDK でコマンドでデプロイする ※ app.yaml が配置されているディレクトリで実行# gcloud app deploy

 ・デプロイ成功すると Google App Engine にサービスが登録される

 ・フロントエンドの URL は、以下のようになる  https://<GCPのプロジェクト名 >.appspot.com

これだけでデプロイできる!!!

Spring を Google Compute Engine で動かすGoogle App Engine でも動かせるっポイが、今回は Google Compute Engine で動かす。続きは元サイトの記事をご覧ください!

Page 19: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

20

VMware Hands On Lab でPKS 環境をさわってみました 7

インフラエンジニア歴 20 年、最近は k8s を勉強しながら時々登山してます。

今年の夏に VMworld に行った時に、会場で Hands On Lab(以下 HOL)環境での研修を受けてみたのですが、そのときに教官から PKS(kubernetes)の教材も近日中にアップされると聞きました。今回の改めて見てみたら HOL に PKS の教材がアップされていましたので、どんな感じなのかお試しで見てみました。因みに HOL 環境には事務所から問題なく接続できます。実際の環境や動作を確認したいときは大変便利ですね。

(私が VMware をさわりまくっていたときにはこういうの無かったです。。。ローカルにせっせと環境つくってました。)

検証コース:VMware Enterprise PKS - Getting Startedさて、まず HOL(https://labs.hol.vmware.com/) に接続します。VMware アカウントの作成等々事前準備あります。

この PKS の HOL はまだ英語と中国語のみ対応してました。英語の勉強を兼ねて読み進めます。

PKS の構成イメージ検証環境に接続すると、自動でこの環境がデプロイされ検証用の疑似仮想クライアントが提供されます。

ネットワーク設定やクラスタは作成済みで提供されるので、すぐにいろいろとさわってみることが可能。そしてネットワーク設定のところもシミュレーションが用意されていて確認することができます。

画面左のところのオレンジでマークされていることころをクリックしてたどっていくと、シミュレーションが進んでいきます。

tk4_oota

Page 20: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

21

FSWeb Advent Calendar 2019PKS と BOSHBOSH の1つの Health monitoring の機能を見てみます。下記コマンドで BOSH で管理されているコンテナの状況を見ることができて、

VMware の vCenter でそのコンテナを確認すると、クラスタやノードとして見えるんですねー。

vCenter 上でそのノードを Power-oFF すると、BOSH 上でも落ちていることがわかります。(しばらくすると自動回復機能で復活してました)

だいぶはしょりましたが、このあと、VMware NSX-T、HARBOR・・・と各機能の研修がつづきます。結構ボリューミーです。(英語だからかも)また他のコースではアプリ配備のところも含めたものがありそうなので、次回チャレンジしてみたいと思います。

所感初期設定のネットワーク仮想化のところは統合された管理ツールはない。NSX-T や PKS などの各管理ツールでのそれぞれ設計、設定していくのが複雑。特に設計が大変そう。

基盤の運用管理ツールが、仮想基盤の vCenter、PKS、NSX-T、Kubernetes と分かれていて運用管理も大変そうです。コンテナの運用機能をもっとさわってみたいと思いました。

非常に簡単に VMware の高額な各機能を検証できる環境ですので、試してみる価値ありと思います。

Page 21: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

22

作業を少しでも効率化するためにbat や VBA などのツールを作って使う8

牛歩戦術で学習、仕事を行わざるを得ない社会人 2 年目。先輩に手伝ってもらいながらなんとかついていけるように努力中

初めに社会人 2 年目の、ただでさえ仕事が早くない自分は、地道に作業してるとまともな業務もできません・・。少しでも直接作業に時間を多く使えるよう(もしくは少しの時間でも作業を遂行できるよう)に、効率化のためのツールを作成しようとしている記事でございます。やっていることは初歩の初歩なので、当記事が参考になる方少ないとは思いますが・・・

現時点でできているもの本格的に実作業系を効率化するのはこれから(どんなことに困っているかを抽出中)なので、とりあえず今までに作った自分が困ったことを対処するツール、およびその作成方法のご紹介。

サクラエディタのタスクキル用 bat人に聞いて回ったところ私だけのエラーっぽいんですが、サクラエディタであるファイルを一般ユーザで開いた後、管理者権限で別のファイルを開こうとするとエラーが起きてしまう(逆もしかり)。先に開いていた方を閉じても、タスクは消えないため、タスクキルしないと管理者権限では開けない。いちいちタスクマネージャ開いてサクラエディタのタスク探してタスクの削除してると時間かかるしストレスもたまるので、せめてボタン一個でタスクキルできないかと考えた結果のツールです。

コードtaskkill /im sakura.exe

これをバッチファイルに書くだけです(ほんとに記事にするようなことかこれ)。taskkill コマンドは、プロセス ID、もしくはイメージ名を指定して、その対象のタスクを終了するコマンド。オプションでどちらを指定するのかを示します。/PID がプロセス ID を指定、/IM がイメージ名を指定するオプションです。今回目的のサクラエディタのイメージ名は上記の通り sakura.exe なので、サクラエディタのタスクを消したいだけなら上記のコマンドで OK。もし「私は絶対にプロセス ID でタスクを消したいんだ」という人がいるのであれば、tasklist コマンドを使うことで、現在動いているタスクのイメージ名、プロセス ID を閲覧することが可能です。ただし、それなりの量が表示されると思うので、要覚悟。

ショートカット作成このツールはコード内容よりこっちのほうが有用かつ大変かもしれ・・いや絶対有用なのはこっちの方です。ショートカット作成ならバッチを右クリックすればいいだけなんで楽なんですが、デスクトップに置くにしろエクスプローラに置くにしろ、ウィンドウの操作が面倒なのでタスクバーに置きたかったのです。しかし、バッチファイルやそのショートカットはタスクバーにはピン止めできない様子。困った。調べたところ、以下の記事に対処法があったので採用。

バッチファイルをタスクバーに登録する方法http://pdat.jp/android-kindle/2012/09/bat/

やり方: ・バッチファイルのショートカットを作成。 ・ショートカットを右クリックし、プロパティを開く。 ・「ショートカット」タブの「リンク先」のパスの先頭に下記を追加(/c と前後のパスの間には半角スペースを忘れない) %windir%\system32\cmd.exe /c ・プロパティを、OK を押して閉じ、ショートカットを右クリックしてタスクバーにピン留めする

バッチファイルのショートカットを作成し、その参照先としてバッチファイルではなくコマンドプロンプトを設定し、そこからバッチファイルを起動させるという形にすることでタスクバーにピン留めできるようになるみたいです。ただし、この場合ショートカットのアイコンがプロンプトのアイコンと被るので、プロンプトをタスクバーにピン止めしている私には紛らわしくてしょうがない。ので、同じくショートカットのプロパティ内の、「ショートカット」タブから、アイコンの変更を行うことで好きなアイコンに変更します。あまり細かく調べていないため、使用できるアイコンは windows がデフォルトで用意しているものに限られますが、見知らぬアイコンにしておけば一応は違いが分かるようになるので。これでサクラエディタのタスクキルがタスクバーからワンクリックでできるようになった・・・と思いきや、サクラエディタを先に管理者権限で開いていると、このままのショートカットではタスクキルできないことが判明。これまたショートカットのプロパティ内「ショートカット」タブから詳細設定を選択、「管理者として実行」をチェックして OK することでやっとこさタスクキルツール完成。

中本 博晃

Page 22: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

23

FSWeb Advent Calendar 2019管理者として実行オプションのせいでワンクリックとはいきませんが、タスクマネージャをいちいち開かなくて済むことを考えればまぁ…

作業管理用 Excel VBA仕事してたらそりゃまぁいろんな作業を振られるわけで、忘れっぽい私には全部巣のままで覚えきることなんてできません。手書きも、メモ帳のコストやメモ帳事態を忘れるリスク ~~、いちいちメモ帳引っ張り出してくるのも面倒 ~~ などなど考え、忘れたらそもそも仕事ができないから忘れないはずの PC で管理できないかと思った結果の Excel での管理です。

シート作成シートの書き方は作業をするのに必要な情報を各々が入れればいいはずなので・・・一応自分が作った管理表を載せておきます(ぼやけてるけど…)。F 列、G 列の「状態」と「優先度」の列には入力規制を設けています(いうまでもなくこの辺も自由)。

コード上記のシートに合わせて以下のようにコードを作成。 Option Explicit

Sub log_manage() Dim log_num As Integer Dim i As Integer log_num = 4

Do While Worksheets(2).Cells(log_num, 6).Value <> "" log_num = log_num + 1 Loop i = 4

Do While Worksheets(1).Cells(i, 1).Value <> "" If Worksheets(1).Cells(i, 6).Value = "完了 " Or Worksheets(1).Cells(i, 6).Value = "立ち消え " Then Worksheets(2).Rows(log_num).Value = Worksheets(1).Rows(i).Value Worksheets(1).Rows(i).Delete log_num = log_num + 1 i = i - 1 End If i = i + 1 Loop End Sub

これまた全体的に簡単。そもそもの書き方は調べてもらうとして、中身についてです。結論から言うとステータスを「完了」または「立ち消え」に設定したタスクを別に作成した履歴シートに送るコードです。変数 log_num には履歴シートに次に書き込む行番号を代入、変数 i は繰り返し文に使う一時変数です。履歴シートへの書き込みは 4 行目から始めているので、まず log_num に 4 を代入。do While 文で履歴シートに既に履歴が書き込まれている行をカウントします。次に、タスク一覧の概要欄が空セルになるまでタスクの状態を上から順に確認していき、「完了」、または「立ち消え」の場合は履歴シートの log_num の行にそのタスクを書き込みます。全体的に簡単な書き方を選択しているため、シートの順番を変えたりするだけで割と簡単に壊れてしまいますので、参考にされる場合はご注意を。

今後に関して現在自分が作成しているツールは以上です。今後は対策する課題を考えて、それに対して新しいツールを作る予定です。現状考えているのは、teraterm と vba を利用したネットワーク機器のログ取得ツールが便利そうかなと言ったところ。

終わりに拙い記事かと思われますが、読んでいただけたなら幸いです。この記事に書いてあるコードの改善方法はいくらでも見つかると思いますので、突っ込んでやろうと言う方がもしいらっしゃればぜひ突っ込んでいただけると勉強になります。

Page 23: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

24

Alexa Gadget Toolkit を試してみた件(その2)9

じゅげむ(今井 隆)

小さいデバイスが大好きな元エンジニア。Windows Phone が残念なことになってしまったので、現在は Alexa スキル開発を趣味にしています。IoT も好き。

前回の続きです1 日目の記事「Alexa Gadget Toolkit を試してみた件」では、二つあるインタフェースのうち定義済みインタフェースを試しましたが、本記事ではカスタムインターフェースを試そうと思います。カスタムインターフェースでは、Echo デバイス、ガジェット、Alexa スキルの 3 つを使ったアプリケーションの構築が可能となっています。

カスタムインターフェースのメリット自作ハードウェアを利用したアプリケーションを作りたい場合、これまでは Alexa スキルから IFTTT 経由で直接ハードウェアを制御するのが主な方法でした。この場合、どのハードウェアを操作するかをスキル側から一意に指定する方法が難しく、スキルをスキルストアから配布して多くの人が使えるような汎用的なアプリケーションにはなっておりませんでした。僕が知る限りでは、Web API を持つ Obniz を使い、スキルから obniz id を設定させる方法くらいです。しかし、Alexa Gadget Toolkit を使えば、ひとつの Alexa スキルから利用者がそれぞれの Echo デバイスに連携させたガジェットを利用できます。そのため、自作ハードウェアの製作方法を公開して多くの人に使ってもらうことも容易になります。

サンプルコードを動かすここでは、RaspberryPi(RPi) 用サンプルから「colorcycler」を動作させたいと思います。

必要なもの前回ガジェットとしてセットアップした RPi と Echo デバイス、Echo アプリを使うためのスマホの他、スキル作成用にChrome ブラウザが利用できる PC/Mac が必要です。

Alexa スキルのプログラムパッケージを作成するまず、ガジェットを使うための Alexa スキルのプログラムの準備を行います。前回使った RPi をそのまま使います。スキルは Node.js と Python で用意されていますが、ここでは Node.js のほうを使います。cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Samples-master/src/expamples/colorcyclercd skill/NodeJS/lambda/custom

Alexa スキルに必要なパッケージは package.json に記載済です。npm を使い必要なパッケージをロードし、AWS Lambda の関数として登録するために zip ファイル化します。npm installzip -r ../../skill-code.zip .

作成した zip ファイルは、メールなどを使って PC/Mac に転送しておきます。

AWS マネージメントコンソールから Lambda に登録するPC/Mac の Chrome ブラウザから AWS マネージメントコンソールにログインします。これは Alexa 管理者ポータルとは別にアカウントが必要です。アカウント登録は無料で、Alexa スキルを普通に開発する範囲であれば特に課金は発生しません。ちなみに、Alexa スキルをスキルストアで公開している開発者については AWS の課金が実質無料になる仕組みもあります。ログインしたらサービス名の一覧から「Lambda」→「関数の作成」を選択し、関数の作成画面を表示します。画面での設定項目は下記の通り。 ・オプション:一から作成 ・関数名:ColorCyclerSkillLambda ※他と区別できれば何でもいいです ・ランタイム:Node.js 10.x ・アクセス権限:基本的な Lambda アクセス権限で新しいロールを作成 ※デフォルトのまま

関数作成が終わると設定画面となります。画面中ほど「関数コード」の「コードエントリタイプ」から「.zip ファイルをアップロード」を選択、先程作成した Alexa スキルの zip ファイルを指定したら、画面上部の「保存」を選択します。

最後に画面上部の「arn:」で始まる文字列をコピーしておきます。これは、Alexa 音声サービス側の設定に使います。

twitter:@jugemsan / https://pichi.net/jugemsan/

Page 24: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

25

FSWeb Advent Calendar 2019Alexa 開発者コンソールからスキルを作成する次は Alexa 開発者コンソールでの作業です。前回、ガジェットを登録した Alexa 音声サービスと共通のアカウントでログインできます。ログインしたら、「スキルの作成」を選択し、新しいスキルの作成画面を表示します。画面での設定項目は下記の通り。 ・スキル名:color cycler ・デフォルトの言語:英語(米国) ・スキルに追加するモデル:カスタム ・バックエンドリソースをホスティングする方法:ユーザー定義のプロビジョニング

「スキルを作成」を選択し、テンプレートを選択の画面を表示したら「最初から開始」を設定し「選択」を押すと、スキルの設定画面が表示されます。呼び出し名(「Alexa、〇〇して」の〇〇」)を決めます。画面右の「呼び出し名」を選択し、「color cycler」とします。

次にインテントを追加します。画面右の「JSON エディター」を選択し、” intents” の配列定義に下記コードを追加します。{ "name": "AMAZON.YesIntent", "samples": [ "yes", "yes please", "sure" ]},{ "name": "AMAZON.NoIntent", "samples": [ "no", "no thanks" ]}

画面上の「モデルを保存」を押し、設定を保存します。次に画面右の「インターフェース」を選択し、「カスタムインターフェースコントローラー」を有効にします。「インターフェースを保存」を押し、設定を保存します。

次に画面右の「エンドポイント」を選択し、「AWS Lambda の ARN」の「デフォルトの地域」に、Lambda 関数の最後でコピーした「arn:」から始まる文字列をペーストします。「エンドポイントを保存」を押し、設定を保存します。さらに、直上の「スキル ID」をコピーしておきます。これは Lambda 関数の設定で使います。最後に画面右の「呼び出し名」を選択し、画面上の「モデルをビルド」を押します。ビルドには数十秒かかります。ここでエラーが表示された場合は、ここまでの設定を見直してください。

Lambda 関数にトリガーを設定する再度、AWS マネージメントコンソールの Lambda 関数の画面に戻ります。「+トリガーを追加」を選択、プルダウンから「Alexa Skill Kit」を選択し、スキル ID 欄に先ほどコピーしたスキル ID をペーストし「追加」を押します。これで、一連の作業は完了です。

スキルの動作テスト(机上)それでは、スキルの動作をテストします。まずは Alexa 開発者コンソールから机上確認します。画面上の「テスト」を選択、「スキルテストが有効になっているステージ」のプルダウンから「開発中」を選択します。次に、Alexa シミュレータの入力欄に「open color cycler」と入力します。「No gadgets found. Please try again…」の表示がされれば、Lambda 関数が呼ばれていますので OK です。この時、画面右には Alexa クラウド→スキル(左側)、スキル→ Alexa クラウド(右側)へ送信されたディレクティブの内容が表示されています。右側のスキル→ Alexa クラウドへ送信された JSON には、ssml で始まる行が一部見えています。これはスキル側で指定した発話内容です。

次に Echo デバイスから試しますが、その前に Echo デバイスの設定の「言語」を「英語(米国)」にする必要があります。これはスキル作成時にデフォルト言語を英語(米国)にしたためです。その後、Echo デバイスに対して「Alexa, open color cycler」と指示を行うことで、スキルが動作します。デバイスの言語を日本語のままにしたい場合は、Alexa 開発者コンソールから言語に「日本語」を追加し、インテント設定で AMAZON.YesIntent、AMAZON.NoIntent から日本語の発話例を追加すれば、とりあえずは Echo デバイスの言語設定を変更しなくとも動作はします(AWS Lambda の側の発話分は英語のままなので、発音のおかしい英語が聞こえてしまいますが ;-))。

Page 25: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

26

アジャイル開発におけるプロダクトの価値はどう測るべきか?10

自社を離れお客様のデジタル変革(DX)実現に向け奮闘中。アジャイル開発で日本の SEをみんな幸せにしたい。

はじめにアジャイル開発を進めていく上で外せない” 価値” という言葉についてすこし考えてみました。

※最初に断っておくと本投稿は完全な読み物です。コード Tips を探している人ごめんなさい。他をあたってください。

品質もスピードも価値に通ずるアジャイル開発を進めていく中で価値があるか?、ないか?は最も重要な指標と言われています。従来であれば QCD のようなプロジェクト管理に近い指標もプロダクトの価値に紐づけて語られます。

品質と価値の関係 狩野モデル狩野モデルは品質の特性を「当たり前品質」、「一元的品質」、「魅力品質」、

「無関心品質」に分類し各カテゴリの充足度からユーザーに与える心象・効果を測り使い分けるべきとする考え方です。アジャイル界隈の人がこの話を出す時、従来型開発においてユーザーの関心が低い部分に対して過剰に品質を追及する姿への dis が込められていたりもしますが、本質的には当たり前品質の確保を自動化などで省力化し、いかに魅力品質(+αの価値)へ注力していけるか?が重要になってきます。

リリーススピードと価値の関係DevOps 界隈では CI/CD などでリリース頻度をどれぐらい上げられるか?に関心が集まっています。開発をすればするだけ価値が高まると仮定すると(実際はそんなことないのですが)開発・リリースのスループットを上げることは価値を継続的に高めていく近道と言えるでしょう。

このように品質もスピードも” 価値” という言葉に集約していくことで、” 価値” が重要な KPI となり、価値を高められるか否か?を判断基準としてより合理的な作業スタイルを確立することができます。

” 価値” って何なんだろう?少し前置きが長くなりましたが、” 価値” という言葉を深く考えずに乱発しているとだんだん” 価値” とは何なのか?がよく分からなくなってしまう気がします。今自分が開発に携わっているプロダクトやサービスの” 価値” っていったい何なのか?どうなったらそれが高まるのか?という自問自答にはまり込んでしまうかもしれません。例えば、ある機能をリリースしたことで以前に比べて 60% 売上が上がったとか 20% 効率が上がったといった具合に、狙いに対して直接的な効果が出るものは比較的分かりやすく価値として捉えることができるでしょう。ですが、そのようなものは稀だと思います。利用者がどのように使い、どのように感じているのか?それがどのような価値に繋がっているのか?把握するのが難しいケースのほうがほとんどではないでしょうか?

視聴率って意外に優秀な KPI なのでは?という仮説いろいろと考えを巡らせた結果、似たような話としてテレビの視聴率にたどり着きました。テレビのコンテンツは私たちが開発しているアプリケーション以上に価値が測りにくいものだと思います。しかしスポンサーになる広告主に対し

福井@名古屋支部

Page 26: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

27

FSWeb Advent Calendar 2019てはこの番組がどれぐらいの価値を持っているかを事前に予測し、事後もきちんと予測した広告的価値が提供できたか?を把握することが必要になります。視聴率があることによって作り手も受け手もスポンサーも一定の基準で価値を把握することができます。時に過激な視聴率競争が批判されたり、視聴率より心に残るテレビドラマが評価されたりすることもありますが、作り手が視聴率という非常に分かりやすい価値指標を血眼になって上げる努力をし、結果に一喜一憂する様はどことなく共感できなくもありません。

視聴率の良いところ(私見)  ・皆が直感的に理解できるシンプルな指標であること  ・視聴率⇒広告的価値がある程度立証されていること  ・作り手が一丸となれる指標であること

アプリケーションの視聴率はどうやって取るべきか?そこでアプリケーションにも視聴率調査に代わる利用量のメトリクスを仕込んでみてはいかがだろうか?というのが今回の記事の趣旨です。ログを取っていないようなアプリケーションは少ないと思われますが、以下のような工夫を入れてメトリクスを取得するとより柔軟な価値分析に繋がるかと思います。是非お試しください。

ベタにログを回収する方式アプリケーションの操作ログを fluentd や datadog などで回収し回数を集計します。最低限、何が何回実行されたか?を識別するための機能や画面、ボタンオペレーションの種類の情報をログへ出力しておくことが望ましいです。

スライス観点を DI 等で注入する視聴率調査をより効果的に活用するために視聴者のセグメントを分析するのと同じように、ユーザーの所属や属性など集まったデータを細分化する条件を取得できるとより柔軟な対応が可能になります。分析の切り口は後から分かることも多いのでログの詳細な実装は DI 等で後から注入できるようにしておくことも効果的です。

AOP の方が優秀かもそもそも操作ログがきちんと実装されていなかったり、必要な情報が取得できる場所にログがきちんと実装されていないケースには、AOP のようなアプローチを使ってアプリケーション上の任意のタイミングに情報取得処理を後付けするような手法も有効になります。

まとめアジャイル開発で作ったプロダクトやサービスの価値を測る方法として視聴率の有効性とその実現方式について書いてみました。まずはシンプルなログの収集・カウントから始めるといいと思います。

DI とか AOP とかよく分かんないし覚えたくないって人は DynamicPULSE で弊社に問合せてくれるともしかしたら良いことがあるかもしれません。

Shall we have a break?

Page 27: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

28

Mattermost に仮想サーバのディスク空き容量お知らせ Bot を作る11

Linux と古代エジプトを愛する SE1 年目。面白いものを作りたくて日々勉強中です。

初めに仮想サーバのディスク容量って気が付いたらいっぱいになっていませんか?コマンドが Tab キーで補完されなくなってから気づくと対応が面倒ですよね。そこで、仮想サーバのディスク容量を指定した日時にチャットツールに通知するBot を作成しました。

前提条件 ・仮想サーバはエクストラネット環境 ・ローカルは Windows10 ・使用 OSS は Docker,Node-RED ・Mattermost のチーム管理者かシステム管理者になる

環境構築まずは環境構築です。Docker 上に Node-RED をインストールして、Node.js を使えるように設定します。

手順以下の URL から Windows10 に Dockers for Windows をインストールします。https://docs.docker.com/docker-for-windows/install/

docker-compose 設定ファイルの docker-compose.yml を作成します。 version: '2'services: nodered: ports: - 8088:1880 volumes: - C:/xxx/Node-RED/nodered-data-pj:/data environment: - TZ=Asia/Tokyo - NODE_RED_ENABLE_PROJECTS=true image: nodered/node-red:latest restart: unless-stopped

Windows PowerShell を管理者として実行します。 docker-compose.yml のあるフォルダ上でバックグラウンドでコンテナを立ち上げ、コンテナ内に入ります。docker-compose up -ddocker exec -it node-red_nodered_1 bash

コンテナ内でコマンドを実行して、node-ssh をインストールします。npm install --save node-ssh

Node-RED の追加モジュールを利用するために、settings.js を編集します。 functionGlobalContext: { sensor:require('node-ssh') // os:require('os'), // jfive:require("johnny-five"), // j5board:require("johnny-five").Board({repl:false}) },

exit コマンドを実行し、コンテナから出ます。docker-compose restart コマンドでアプリケーションを再起動します。

Mattermost にディスク容量を通知する Bot 作成Bot 作成をします。前提としてチーム管理者かシステム管理者でないとウェブフックを追加できないため、権限のある人に依頼しましょう。

事前準備Mattermost のメインメニューから統合機能を選択します。統合機能のメニューから内向きのウェブフックを追加します。ウェブフックを編集します。タイトルと説明を入力してください。※チャンネルはペイロードで制御するため入力不要です。

eight-cotton

Page 28: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

29

FSWeb Advent Calendar 2019手順環境構築の docker-compose.yml で指定したポートを入力して、Node-RED に入ります。※ Node-RED の基本的な使い方に関してはこちらの記事を参考にしました。

Node-RED 超入門https://qiita.com/makaishi2/items/5c7b1b6a72b6938cf3d2

下図は Node-RED の画面例です。inject ノードで Bot を流す日時の設定をします。

function ノードに、仮想サーバ内に SSH 接続してディスク容量確認コマンドを実行するコードを書きます。(ソースコードは省略しました。サイトの記事をご覧ください。)

function ノードに、Mattermost に Bot としてメッセージを流すコードを書きます。(ソースコードは省略しました。サイトの記事をご覧ください。)

http request ノードの、SSL/TLS 接続を有効化チェックボックスにチェックを入れ、Mattermost の証明書を設定します。

すべてのノードをつなぎ、右上のデプロイボタンを押下して終了です!※ debug ノードの対象を msg オブジェクト全体にして動作確認を行いました。

Bot と同じ内容をメールにも送る方法Bot と同じ内容をメールで送る方法についての説明です。

手順画面右上のメインメニューから、パレットの管理を選択します。ノードを追加タブで、mail と入力して検索します。

node-red-node-email を選んでノードを追加し、メール送信ができるようにします。function ノードに送信したい内容や件名等を書き、ディスク容量確認コマンドを実行するノードとつなげます。msg.payload = msg.ssh.stdout;msg.topic = "【Node-RED】ディスク空き容量お知らせ ";

return msg;

接続部が左側にある email ノードを選び、宛先、サーバ、ポートなどを入力し、ディスク容量確認コマンドを実行するノードとつなげます。デプロイして終了!設定した日時にメールが届きます。

Page 29: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

30

Google Cloud Vision API を使って食べ物の写真を判定してみる12

文系出身の SE です。強いて得意な言語を挙げるなら Java です。いろいろ勉強中。

はじめに本記事では Google の画像認識 API「Cloud Vision API」を利用する最低限の手順をまとめています。最後に食べ物の写真の判定を試しています。

余談個人的な趣味がメシテロ(深夜の時間帯などにおいしそうな食事の写真をアップすることで見るものを空腹にさせる行為)でして、「おなかすいたなー」と思わせることを目的に LINE のタイムラインに食べ物の写真を投稿しております。よりおいしそうな写真を撮り、メシテロのクオリティをあげるために画像認識 API で何かできないかと思い、今回はGoogle Cloud Vision API を試すところから始めています。

今回使ったもの ・Google Cloud Platform:Cloud Vision API を利用するにあたり必要なサービス ・Anaconda:Python 本体とよく使われるライブラリを含んだパッケージ

API 利用の事前準備Google Cloud Platform の利用登録まずは Cloud Vision API を使うために Google Cloud Platform の利用登録を行います。以下のサイトで「無料で始める」をクリックすると登録手続きが開始されます。Google のアカウントで利用可能です。※無料で利用する場合にもクレジットカードの登録が必要となります。

クラウド コンピューティング サービス | Google Cloudhttps://cloud.google.com/

プロジェクトの作成登録が完了したらこのような画面が表示され、デフォルトのプロジェクトが作成されています。枠の部分から新規プロジェクトを作成できます。デフォルトのプロジェクトでも API を利用可能ですが、ここでは「Meshitero」プロジェクトを作成しました。

Cloud Vision API の有効化検索フォームに「Visoin API」と入力すると Cloud Vision API がヒットするのでクリックし、遷移後の画面で「有効にする」を選択します。

余談:ちなみに「この API を試す」(https://cloud.google.com/vision/?hl=ja) を選択すると画面上でデモが試せます。

有効化するとこのような画面が表示されます。

Qiita:@m-yuuminm-yuumin

Page 30: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

31

FSWeb Advent Calendar 2019API キーの発行今回は Python で呼び出すので、認証情報を作成します。Cloud Vision API の画面で「認証情報を作成」をクリックすると「API とサービス」の認証情報のページに遷移します。「認証情報の作成」のプルダウン内から「API キー」を選択すると、API キーが発行されます。

不正利用回避のためキーに制限をかけます。上記画面で「キーを制限」をクリックするとキーの制限ができる画面に移動するので、必要に応じた制限をかけましょう。

今回は、IP アドレスで利用の制限をかけ、また利用できるAPI もいったん Cloud Vision API に制限しました。

API を利用するための設定は以上です。

API の呼び出しAnaconda のインストールAPI を Python で呼び出すため、以下を参考に Anaconda をインストールしました。

Anaconda のインストール(Windows 編)https://qiita.com/takanorimutoh/items/ea0a3c73220f37858720

ソースの作成API の Reference(https://cloud.google.com/vision/docs/reference/rest/) の内容を参考にソースを作成します。

API に渡すリクエストデータの作成画像のデータは base64 でエンコードされた文字列として渡す必要があるようです。また、画像分析の種類と、返却する結果の最大数を「features」に指定します。今回はラベル検出(LABEL_DETECTION)を指定します。※画像分析の種類は他には顔検出やロゴ・ランドマーク検出があります

API に渡す際には Json 形式にするため、Json 形式へのエンコードも行います。img_request = []with open(filename, 'rb') as f: ctxt = b64encode(f.read()).decode() img_requests.append({ 'image': {'content': ctxt}, 'features': [{ 'type': 'LABEL_DETECTION', 'maxResults': 10 }] })request_data = json.dumps({"requests": img_request }).encode()

API の呼び出し部分リクエストデータと、前段で出力した API キーを指定し、API リクエストを送信します。API_URL = 'https://vision.googleapis.com/v1/images:annotate'response = requests.post(API_URL, data=request_data , params={'key': api_key}, headers={'Content-Type': 'application/json'})

結果の出力API から帰ってきたデータを出力します。 続きは元サイトの記事をご覧ください!

Page 31: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

32

眠い人を吸い込むブラックホールチャンネルを作った話13

技術で楽しいことがしたいキノコです。楽しいは正義。

実は、私はパートナー会社の者です。書かせていただけるなんて、懐が深くて感謝の限りでございます!本当にありがとうございます!!! タイトルの通りネタ記事です。正直こんな記事でごめんなさい。(先に謝っておくスタイル)ただ、前日の投稿「Google Cloud Vision API を使って食べ物の写真を判定してみる 」が良記事過ぎて、書くのがつらいっす。。。とりあえず全力で頑張りますのでよろしくお願いいたします!

はじめに当記事では、チャットをより楽しくするためのお遊び機能を作ったので紹介しています。真面目に読むよりは息抜き程度にお読みくださると幸いです。

私の職場環境私が働いている場所はチャットが大変普及しています。素晴らしいことに心理的安全性の高いチャットが実現されており、本音のトークがバンバンやり取りされています。ともすると、ポジティブな内容ばかりではなく、ネガティブな発言もあったりする訳です。私自身、仕事がしんどい時は「眠い」「帰りたい」などの発言をしてしまうこともあります。そんなとき、ふと思うのです。

つらいのは私だけなのだろうか…と

いやいや、そんなはずはない。きっと同じように苦しんで頑張っている人もいるはず!皆で分かち合えば、辛さも軽減されて頑張れるはず!ならば作りましょう!同士を集めるブラックホールを!

ブラックホールを支えるツール達 ・Mattermost v5.13.2 (https://mattermost.org/)    Mattermost は OSS のチャットツールです。   Slack ライクな使い心地で Markdown 形式が使えるのが強いところ。   個人的には、Slack より好きです。   詳しくはググってね♡ ・Node-RED v0.18.7 (https://nodered.org/)   Node-RED はブラウザ上で GUI ベースでロジックをゴリゴリ書ける面白ツールです。   「ノード」という形で様々な機能を持ったブロックをつなげることで、簡単にロジックが組めます。   API とかも簡単に作れたりするので、Bot 開発には最適です。   詳しくは (ry

ブラックホールの仕組み「Mattermost のパブリックチャンネルで特定ワードを投稿する」(「眠い」「NMI」など)

→「ワードを検知したら Node-RED のロジック発火」→「Node-RED のロジックで、強制的にブラックホールチャンネルに招待する」

補足:ブラックホールチャンネルは予め用意しておくこと。なるべく、プライベートチャンネルにしましょう。(仕事中に眠い人が集まるので、公開処刑になる可能性が 0 ではない)引き込んだら歓迎しましょう

Qiita:@little555little555

Page 32: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

33

FSWeb Advent Calendar 2019実際の様子

「夕方は NMI」「昼も NMI」「仲間をふやそう」

こんな感じで大盛況です。眠そうなターゲットを引き込めたときの嬉しさはすごいです。

ブラックホールの作り方ここからは真面目に技術のお話です。

事前準備 ・Mattermost の管理者権限を取得 ・ブラックホールチャンネルを作成 ・Node-RED(Docker などを利用すればサクッと建てられます)

Mattemost で眠いを検知する機能を作る眠いを検知する機能は、Mattermost 統合機能の一つ外向きのウェブフックで実現しています。Mattermost のメニューから、統合機能を作成します。(ここに表示されていない場合、管理者が禁止している可能性があります。その場合は管理者にネゴって機能を開放してもらう必要があります)

外向きのウェブフックを作成します

任意の名前、説明を記載しますチャンネルを選択しない(選択しないことで、全てのパブリックチャンネルが対象になります)

補足するために思いつく限りの眠そうなワードを登録します(腕の見せ所です)

続きは元サイトの記事をご覧ください!

Page 33: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

34

Ubuntu 18.04 の Kubernetes 環境を構築してみた!14

zhangyangfeng(張 楊峰)

日本のアニメが好きで、独学で日本語を勉強し、日本で SE をやっています。機械学習、コンテナやクラウド技術に興味を持っています。

部署の業務には関係はないですが、自分の趣味でこの記事を書きました。

必要なものについてVMware Workstation 15 Player のインストールhttps://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html

ubuntu18.04 のイメージのダウンロードhttps://jp.ubuntu.com/download

仮想マシン 2 台の用意&環境構築1.ubuntu18.04 のインストール(master ノードと work ノード)① VMware Workstation で ubuntu18.04 のイメージを使い仮想マシンを作成します※仮想マシンの CPU の個数は 2 以上にする必要があります。それにメモリを 4GB 以上にしたほうがいいと思います。② ubuntu の software をアップデートします

「install Now」を選択します。

③ host 名の変更※ 二 台 の 仮 想 マ シ ン の host 名 が 同 じ の 場 合、 後 で work ノ ー ド を master ノ ー ド に join で き な く な り ま す の で、masterNode と workNode1 に変更、変更後に再起動を行います。

2.Docker のインストール①必要なライブラリをインストール$ sudo apt update $ sudo apt install apt-transport-https ca-certificates curl software-properties-common

②公開鍵のインストールとフィンガープリントの確認$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -$ sudo apt-key fingerprint 0EBFCD88

③ Docker-ce のインストール$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"$ sudo apt update$ sudo apt install -y docker-ce=18.06.0~ce~3-0~ubuntu

④ cgroupdriver の設定$ cat > /etc/docker/daemon.json <<EOF{ "exec-opts": ["native.cgroupdriver=systemd"],

Qiita:@zhangyangfeng1994

Page 34: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

35

FSWeb Advent Calendar 2019 "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"}EOF

$ mkdir -p /etc/systemd/system/docker.service.d

⑤ Docker の再起動$ systemctl daemon-reload$ systemctl restart docker

3.Kubernetes のインストール① kubernetes のキーとリポジトリの登録$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

② Kubernetes のインストール$ sudo apt update$ sudo apt install -y kubeadm

③ swap をオフにします$ vi /etc/fstab

swap に該当する行を # でコメントアウトし、再起動を行います。

クラスターのセットアップ1.masterNode のセットアップ ①クラスターの生成$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

実行結果Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.177.133:6443 --token imzh6v.j1jbcrvc1z5rla31 \ --discovery-token-ca-cert-hash sha256:455e7f5f25a92ff919748f0ae8db5e1948f64b62c20c2fe7edbd9868efe0f30d

②設定ファイルの配備$ mkdir -p $HOME/.kube$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

③ flannel を使用$ sudo sysctl net.bridge.bridge-nf-call-iptables=1$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

※ flannel を適用するために一分ぐらい時間がかかるので、しばらく待つ必要があります。

④ masterNode の状態確認$ kubectl get nodes

実行結果NAME STATUS ROLES AGE VERSIONmasternode Ready master 2m48s v1.17.0

2.workNode1 を masterNode に join ① masterNode で生成したコマンドで join します。$ kubeadm join 192.168.177.133:6443 --token imzh6v.j1jbcrvc1z5rla31 \ --discovery-token-ca-cert-hash sha256:455e7f5f25a92ff919748f0ae8db5e1948f64b62c20c2fe7edbd9868efe0f30d 続きは元サイトの記事をご覧ください!

Page 35: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

36

scikit-learn でルーン文字の手書き文字認識をやってみた15

文系出身の4年目SE。仕事では主に Java などで開発をしています。元気なオタクです。

はじめに本記事では、Python の機械学習用ライブラリである scikit-learn を使用してルーン文字の手書き文字認識をやってみた際の手順と結果をまとめています。本 Advent Calendar の先達がかなり実業務に役立ちそうな凄い機能やノウハウを載せてくださっているなか、ただ自分が楽しいだけのものを作ってしまい、ものすごくいたたまれないです。。さらさらっと見ていただけますと幸いです。また、本記事の作成者が機械学習初学者なため 今更的な内容が多いかも知れないですが同じく python, scikit-learn をこれから触ってみる人にとって手ごろな情報を提供できるように頑張ります。よろしくお願いいたします。

背景普段業務では全く触らないですが機械学習に興味があり、学習や動作の基礎を学びたいと思い scikit-learn に触れてみました。ライブラリが持っているデータセットなどを使って動かしてみてもよかったですが、「どういうデータを用意して何をどうすればしたいことができるのか?」を知りたくデータを用意するところからやってみることにしました。( 余談 ) ルーン文字ってなんだかカッコイイですよね!

使用したもの ・Anaconda : Python 本体とよく使われるライブラリを含んだパッケージです。 ・scikit-learn :Python でニューラルネットワークを簡単に使用できるライブラリです。オープンソースで公開されて  います。今回は、その中でも MLPClassifier という「分類」を行うモデルを使用します。 ・E-cutter : 画像分割のためのフリーソフトです。手書き文字画像の分割に使用しました。

データの準備今回はルーン文字のうち「ゲルマン共通ルーン文字 (24 文字 )」を対象にします。

「機械学習用ルーン文字データ」のような都合の良いデータはなさそうなので、自前で画像を用意します。今回は以下の方法で作成しました。

①等間隔に手書き文字が並んでいる画像を手書きで作成します。 (画像ファイル名を描画した文字一字(例 :「ᚠ.png」)にしておくと後々便利です)② E-cutter( フリーソフト ) で画像を等分します。分割後の画像は「[ 元ファイル名 ]_[ 枝番 ].png」で指定のフォルダに保存してくれるためとても便利でした。

一旦、ルーン文字一種類当たり 18 個の画像データを作成しました。

画像の読み込みここから Python で処理をおこないます。まずは画像を読み込みます。

(ソースコードは省略しました。サイトの記事をご覧ください。)読み込んだ画像を表示してみます。# 1番目のデータを可視化するshowimage = np.reshape(X[0], (50,50)) # reshapeで 50x50の 2重配列にするplt.subplot(121),plt.imshow(showimage),plt.title('Input')plt.show()

50*50 のサイズのデータとして読み込めています。

◆学習と分類をさせてみるデータ数がかなり少ないですが、一旦このデータ (24( 文字 )*18( 枚 )) で学習と分類をさせてみます!データを学習用とテスト用に分ける# データを訓練用とテスト用に分割するx_train, x_test, y_train, y_test = model_selection.train_test_split(X, Y, test_size=0.1, random_state=0)

学習と判定をさせる# 学習clf = MLPClassifier(hidden_layer_sizes=(200,))

Qiita:@kondo-a近藤 あゆみ

Page 36: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

37

FSWeb Advent Calendar 2019clf.fit(x_train, y_train)

# テスト用のデータを分類y_pred = clf.predict(x_test)

#結果の表示print("--- 想定している答え ---")print(y_test)

print("--- モデルが出した答え ---")print(y_pred)

print("--- 正答率 ---")accuracy_score(y_test, y_pred)

```結果正答率がとても低い…!! (7.1%)  orzほとんどが「ᚱ」に分類されていて、それ以外に判定された文字も誤りです…。ただ、「ᚱ」以外に分類されているものは、ルーン文字のなかでも形が類似した文字に分類されているように見えます。知能の萌芽的なものを垣間見られてちょっと嬉しいです(結局間違えてますが)。やはり学習データが不足しているようですが、手書き文字データをさらに追加するのは手間なのでデータの水増し (Data Augmentation) を試します。

データの水増し (Data Augmentation)準備した [ 文字種類 ] × 18 枚の画像だけでは学習用のデータが足りなさそうなので、データを変換してデータ量を増やします。データの水増し (Data Augmentation) については以下の記事が大変参考になりました。https://products.sint.co.jp/aisia/blog/vol1-7#toc-3

手法としては、「ノイズを増やす」「反転」「シフト」「変形」などなどがあるようです。今回はその中の「変形」と「回転」を行います。

変形(ソースコードは省略しました。サイトの記事をご覧ください。)

元の画像と比べて うっすら変形された画像が生成できました。元画像一つにつき二つの変形画像を生成し、学習データに追加します。

回転 さらにデータを増やすために、元画像を 15 度回転させた画像を作って追加してみます。

(ソースコードは省略しました。サイトの記事をご覧ください。)元画像を左右に 15 度回転させた画像がそれぞれ生成できました。この画像も学習データに追加します。

これで、学習用のデータ数は元の5倍となりました(オリジナル、変形①、変形②、右回転、左回転)。

学習・認識 [ 再 ]再び学習とテスト用の画像の認識(分類)をさせてみます!

結果精度が上がった・・・・! (86.9%)

振り返り結局どのデータが有効だったのか

「データを増やしたら分析精度が上がった!やったぜ!」という感じの結果にはなりましたが、結局変形画像がそれぞれどれくらい効いたのかが気になったので、ざっくりですが、学習させるデータの内訳を変えて正答率を検証してみました。画像にバリエーションをもたせるほど正答率が高くなっていることを確認することができました。

今後やりたいことほかの手法(「トリミング」「ノイズ」…)によってさらに精度が上がるのか…を引き続き検証していきたいです。また、今回は 200 固定で進めていたニューラルネットワークの隠れ層のノード数を変更したパターンも検証しようと思います。以上、読んでいただきありがとうございました!

Page 37: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

38

間違い探しを秒で解いてくれるプログラムを作ってみた16

趣味が写真撮影ということもあり、大学時代は画像処理の研究をしておりました。なので人より少しだけ(2mm くらい)画像に詳しいです。

はじめに16 日目の今回は、サイゼリアの間違い探しを自力でクリアしたことがないでお馴染みの私が二枚の画像から差分をとって相違点をぱっとみでわかりやすく表示できるプログラムを作る方法を、拙筆ながら書かせていただきたいと思いますまる

おおまかなイメージ図

実装環境 ・OS  ・MacOS Mojave10.14.5 ・言語  ・python 3.7.4 ・ライブラリ  ・openCV 3.4.2  ・NumPy 1.17.4  ・matplotlib 3.1.1 ・その他   ・jupyter notebook 6.0.1   ・anaconda navigator

事前準備(なんの保証もないですが python と各種ライブラリが使えれば普通に動作すると思うので流し見程度でお願いします)

 ・anaconda navigator とかいう gui でわかりやすく anaconda を扱えるツールを入れます。 ・並行して(別に並行してなくてもいい)python のインストールとかもしとけばいいとおもいます。 ・anaconda navigator 使って jupyter とか各種ライブラリとかをよしなに入れます。

(詳しい導入方法は 'anaconda navigator jupyter インストール ' とかでぐぐれば色々出てくると思います。)

ソース解説ではここからが本番、ソースの内容についてです。パーツとしては大きく分けて 3 つ ・差分のマスク画像を作成 ・マスク画像のマスク部に色をのせる ・マスク画像の透過度を変更し、合成するといった感じになりマウス

import とか変数設定とか(ソースコードは省略しました。サイトの記事をご覧ください。)

差分のマスク画像を作成# 元画像1をカラーで読み込みimg_src01 = cv2.imread(img_01, 1) # 元画像 2をカラーで読み込みimg_src02 = cv2.imread(img_02, 1) # 混合正規分布 (Gaussian Mixture)を基にした前景・背景の領域分割アルゴリズムらしいです。bg = cv2.bgsegm.createBackgroundSubtractorMOG()

fujisawa

Page 38: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

39

FSWeb Advent Calendar 2019# マスク画像を生成mask = bg.apply(img_src01)mask = bg.apply(img_src02)

# マスク画像を出力cv2.imwrite("output/machigai_mask.png", mask)

print("元画像1")display_png(Image(img_01))print("元画像 2")display_png(Image(img_02))print("マスク画像 ")display_png(Image("output/machigai_mask.png"))

ここでの出力結果は以下のようになりました。

マスク画像のマスク部に色をのせるmask_img = cv2.imread("output/machigai_mask.png", 1)

# 画像の白い部分を赤に置き換えるred = [240, 20, 20]white = [255, 255, 255]mask_img[np.where((mask_img == white).all(axis=2))] = red

# BGR to RGBmask_img = cv2.cvtColor(mask_img, cv2.COLOR_BGR2RGB)

# 結果を保存する。cv2.imwrite("output/color_mask_img.png", mask_img)

color_mask_img = cv2.imread("output/color_mask_img.png", 1)display_png(Image("output/color_mask_img.png"))

ここでの出力結果は以下のように。

マスク画像の透過度を変更し、合成する最後にこれができれば完成ですね。# src1 = 元画像 1、src2 = マスク画像、alpha(beta) = あわせて1になるくらいの比率で調整するのが良さそう、gamma = 0 だといい感じになったdiff_image = cv2.addWeighted(src1=img_src01,alpha=0.3,src2=color_mask_img,beta=0.7,gamma=0)cv2.imwrite(outImg, diff_image)

display_png(Image(outImg))```はい、完成です

間違い探しっぽい画像でやってみた

このために間違い探し作ってみました。 続きは元サイトの記事をご覧ください!

Page 39: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

40

SpringBoot を使ってTeams にメッセージを投稿してみた。17

Win95 と同い年の入社 2 年目。実際は古の技術だとしても自分にとって新しければ新しい技術なのだというスタンス。お祭り気分で参加したアドカレが冊子として形になると聞きうれしはずかし状態である。

はじめに入社 2 年目が SpringBoot を使って Teams にメッセージを投稿して遊んでみた記事です。技術力はまだまだだけど、お祭りに参加したぞってのを感じて。まぁ、少しくらいは知識を身に着けて。楽しかったと言えればそれでいいのだ!くらいの気持ちで書きました。ええ。

ということで、遊んでいくゾ

Teams とはMicrosoft 社が開発したチーム間のコミュニケーションを促進するためのツール。

【コンセプト】 チャット機能、音声機能、会議等により、チームのメンバーがどこにいてもコミュニケーションを取ることができる。

Teams の主な機能 ・チーム内でのオープンな会話 ・チームメンバー同士のチャット(コミュニケーションスペース) ・チームのメンバーとの1:1でのチャット ・チーム内でのファイル共有 ・関連サービスまたはシステムとの連携(コネクタアプリ) ・チームの会議のスケジューリング ・音声/ビデオ通話(Skype for Business 機能を活用)

Teams の構成組織/チーム/チャネルの 3 つで構成されている。  組織  ┣ チーム➀ 1 ┃  ┣ チャネル1  ┃  ┣  :  ┃  ┗ チャネルn  ┣ :  ┗ チームn     ┣ チャネル1     ┣  :     ┗ チャネルn

Teams と Slack の違い(開発コンセプト)【Slack】

 メールでのコミュニケーションを不要として チャットツール中心のコミュニケーションを実現すること。

【Teams】 チャットとメールを別のコミュニケーションツールとして棲み分け、 双方を有効活用したコミュニケーションを実現すること。

遊ぶのだー!!まずは、遊ぶための下準備。遊ぶためには準備が必要。しっかりとやっていこう。

前提Teams、JDK11、SpringBoot、Gradle、Teams のアカウントを準備する。公式サイト (https://products.office.com/ja-jp/microsoft-teams/group-chat-software) からサインアップ or サインインをする。※既に Outlook のアカウントを持っている人はサインインでいいゾ。

アカウント作成途中で「会社名は?」とか聞かれたような気がしたが、Sample としておいた。

Sample の配下に「一般」というタブがある。この「一般」こそがチャネルである。

https://levia9071.hatenablog.com/LEViA

Page 40: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

41

FSWeb Advent Calendar 2019コネクタを準備する今回は外部からメッセージ投稿するので、Incoming Webhook を使っていく。

コネクタの設定方法① 外部からメッセージ投稿させるチャネルを選択し、「コネクタ」を押下。② コネクタが一覧で表示されるので、「Incoming Webhook」を探してボタン「追加」を押下。

③ Incoming Webhook の詳細画面に遷移するのでもう一度ボタン「追加」を押下。④ フック名に適当に名前を付ける。今回は sample にした。名前を付けたらボタン「作成」を押下。

⑤ スクロールすると URL があるのでそれをコピー!メモか何かに貼り付けておこう。念のため URL は隠したゾ。

さぁ、メッセージを投稿しようではないか! SpringBoooooooot !Teams の準備もできたところで遊んでいこう。ソースは下記参照。言うても今回は、RestTemplate を使ってメッセージを送信するという簡単なもの。定数 URL の値は【コネクタの設定方法】の手順⑤の URLである。SpringBoot を 起 動 し て、 ブ ラ ウ ザ の URL に「http://localhost:8080/teams」を入れて…。送信できたー!!!!冒頭に書いた目標(楽しかったと言えればそれでいいのだ)は、達成と言ってもいいでしょう!…といったところで今回はここまで!

@GetMapping(path = "/teams") public ResponseEntity<String> teams(){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); Map<String, String> params = new HashMap<>(); params.put("title", "タイトル "); params.put("text", "テキスト "); HttpEntity<Map<String, String>> request = new HttpEntity<>(params, headers); RestTemplate restTemplate = new RestTemplate(); try { return restTemplate.exchange(URL, HttpMethod.POST, request, String.class); } catch (RestClientException e) { throw new RuntimeException(); } }

最後にアドベントカレンダーというイベントに参加できたことを光栄に思います。このような機会を作ってくださったjugemsan さん、ikedahideya さん、相談に乗って頂いた皆様。そしてなにより、こんな拙い記事を最後まで読んでくださった皆様、ありがとうございました。

Page 41: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

42

AWS 初心者が CodeBuild とCodeDeploy を使って CI/CD やってみた18

祝!同人誌化!入社 3 年目で初めて、Qiita に記事を投稿してみました。(まともな記事じゃなくてすいません)ココを原点として、色々やってみようという、意欲が沸いてきたのでやって良かったとおもってます。続編に期待!!ぴえん

AWS で CI/CD やってみようと思った理由 ・せっかくやるなら自動化でしょって思ったから ・クラウドを使って CI/CD をできるってかっよくね?そう思ったから ・ どうせやるなら記録に残った方がいいかな?と思ったから …そうです。ただの自己満です。どうか、わがままにお付き合い下さい。

筆者のレベル ・リージョンの指定方法知らずにずっとオハイヨのリージョンで作業してたぐらいには AWS 初心者です ・CI/CD についてちょっとは分かる ・他のクラウドに触れたことがある ・docker は多少使える ・得意と言えるほどでもないけどできる分野(インフラ < ミドル < アプリの順番)

前提 ・AWS のアカウント発行する ・CI/CD についての説明は省略 ・MVC モデルで構築した Java 言語のソースコードを使用 ・ビルドツールは Gradle を使用(独自 docker image) ・AWS のロールについての説明は無いです ・備忘録的に書いてるだけなので悪しからず

ざっくりな全体構成鉄板構成なんじゃないかと

かる~く使用するツールの説明AWS CodeCommit (https://aws.amazon.com/jp/codecommit/) ・git リポジトリサービス ・Java のソースコードを配備するのに使用しました

AWS CodeBuild (https://aws.amazon.com/jp/codebuild/) ・専用のビルドスクリプトを元にビルドやらテストやらできるやつ ・デフォルトでは 8 種類のビルド環境を用意してくれてる ・AWS 上に構築した、独自のビルド環境(docker イメージ)も使用できる ・ビルド + S3(後述)に成果物を格納するのに使用しました

AWS CodeDeploy (https://aws.amazon.com/jp/codedeploy/) ・専用のデプロイスクリプトを元に成果物を特定のサーバやサービスに配備したり、シェルの実行やらできるやつ ・S3 に配備された成果物を EC2 に構築した VM にデプロイし、成果物の展開やら実行やらをするのに使用しました

EC2 (https://aws.amazon.com/jp/ec2/) ・VM 構築サービス ・OS は色々選べます(今回は CentOS を選びました) ・VM に tomcat をインストールして MVC で作った Java のソースコードを実行できるようにしました

S3 (https://aws.amazon.com/jp/s3/) ・ストレージです ・バックアップファイルやアーカイブなど色々なデータを置くことができます ・成果物(war ファイル)の置き場として使用しました

ECR (https://aws.amazon.com/jp/ecr/) ・Container Registry です(docker イメージ置き場だと思ってもらえれば) ・コンテナベースで作成したサービス等の配備先として使用できます ・今回は独自のビルド環境を構築したのでそちらの配備先として使用しました ・CodeDeploy に必要な agent はインストールしました

さかーた

Page 42: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

43

FSWeb Advent Calendar 2019いざ実践CodeCommit にリポジトリを作成する入力された数値の足し算だけをして次画面に結果を返却するだけのプログラムを作って、CodeCommit 上に格納しただけ。

(ソースは公開してないです。需要があればソース公開します。)

Codebuild でソースコードをビルドする前に ... ECR 上にビルド環境を作成する

(やった後に Dockerfile で書いていないことを非常に後悔 ...)Gradle プロジェクトをビルドするための環境を docker コンテナベースで用意する。 ・ローカルに docker サービスをインストール ・CentOS の docker イメージを Pull + 起動 ・Java + Gradle のインストール ・docker イメージ名を docker tag コマンドで書き換え ・作成した ECR にイメージを PUSHこれだけで AWS 上に自身が作成した docker イメージを格納することが可能

S3 に成果物を格納する領域を作成する※ S3 上に構築するバケット名は重複が認められていない為、独自の名前を指定して作成する。

CodeBuild 上にビルドプロジェクトを作成する ・送信元に上記で作成した CodeCommit のリポジトリを指定 ・環境に上記で作成した ECR 上の docker イメージを指定 ・ビルドの仕様に「buildspecを使用する」を選択する ・アーティファクトに上記で作成した S3 上のバケットを指定

buildspec.yml を作成するCodeCommit 上のリポジトリのルートディレクリに `buildspec.yml` という名前のファイルを作成します。version: 0.2 phases: install: commands: - gradle -v build: commands: - gradle war - tar -cvf sampleJava.tar ./build ./appspec.yml ./deploy.sh artifacts: files: - ./sampleJava.tar

 ・phases タグには install ジョブと build タグを指定 ・install タグでは gradle のバージョン確認コマンドのみ実行(もちろんなくてもいい) ・build タグでは gradle の war ファイル作成コマンドと、成果物を tar に固めるコマンドを実行

ビルドプロジェクトを動かしてみる成功しました!画面をスクロールしていくとログも確認することができます。

成果物が S3 上に格納されたことを確認ログには格納が成功した旨がログ出力されてる。S3 上に無事格納されてました。

続きは元サイトの記事をご覧ください!

Page 43: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

44

AspectJ が書き換えたコードを無理やり覗いてみた19

自社プロダクトをずっとやってます。そろそろ他のこともやりたいなあ。

はじめにこの記事は、Java で AOP を実現する OSS である AspectJ が、どんなコードを生成しているのかを目視確認してみよう!というものです。AOP 自体は昔から使われている技術ですが、個人的にはあまりプロジェクトで使われている印象がありませんでした。が、最近になって自分の周りで AOP を使っているプロジェクトをちらほら見かけるようになり、今後使う人が増えるかも?と思い記事を書いてみました。AOP は使ってみると便利なのですが、正直裏で何が起こっているのかよくわからない部分があります。こういうところの理解を深めるために、本記事では AOP でウィービングした際のコードを覗いてみます。

前提知識AOP ってなんぞや!みたいな話は既にいろんな記事でまとめられているので割愛します。以下の記事はすごいまとまってるのでおすすめ。

時代が来るかも?アスペクト指向プログラミング , AspectJ 言語とは何かhttps://qiita.com/TakagiToru/items/70d8cb038ea59aa0faa1

まずは、本記事を読むにあたって必要な用語だけ簡単に説明します。

ウィービング簡単に言うと、コンパイルして生成したクラスファイルを後から書き換えて、任意の処理を埋め込むこと。例えば、全くログが実装されてないプログラムに、元のソースを書き換えずにデバッグログを埋め込むような芸当ができます。そう、AOP ならね。ちなみに、ウィービングには以下の2種類があります。今回は静的ウィービングを使います。 ・静的ウィービング:Java のクラスファイルに直接処理を織り込む方法 ・動的ウィービング:JVM にクラスがロードされた際、動的に処理を織り込む方法

ポイントカットウィービングを実施する際、処理を埋め込むメソッドなどをポイントカットとして定義します。ポイントカットには様々な種類があり、それぞれがプログラム実行上の様々なタイミングを表しています。代表的なもの: ・execution:特定のメソッドが実行されたとき ・call:特定のメソッドを呼び出したとき ・handle:特定の例外がハンドルされたとき

アドバイスポイントカットで特定したメソッドのどこに処理を埋め込むかを定義するのがアドバイスです。こちらも埋め込む場所に応じていくつかの種類が用意されています。代表的なもの: ・before:前処理 ・after:後処理 ・after returning:後処理(正常時のみ) ・after throwing:後処理(異常時のみ)

ウィービング結果を覗いてみる用語説明はこれくらいにして、ウィービングによって処理がどう書き換えられるのかを見てみます。今回はアドバイスは before, after とし、よく使うポイントカット 3 種でウィービングしました。

使ったもの ・Eclipse ・AdoptOpenJDK 11.0.5.10 hotspot ・aspectj-1.9.5:AspectJ のライブラリやコンパイラなど ・jd-gui-windows-1.6.5:Java のデコンパイラ

サンプルコードウィービング対象のプログラム

(ソースコードは省略しました。サイトの記事をご覧ください。)

Qiita:@watarowataro

Page 44: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

45

FSWeb Advent Calendar 2019ウィービングの定義 (SampleAspect.java)@Aspectpublic class SampleAspect { @Before("execution(public * *..*.Sample.*(..))") public void beforeExecutionPointcut() throws Throwable { System.out.println("execution before process."); }

@After("execution(public * *..*.Sample.*(..))") public void afterExecutionPointcut() throws Throwable { System.out.println("execution after process."); }}

```SampleAspect.java にウィービングのための定義を記述しました。各メソッドのアノテーションでアドバイス、ポイントカットを指定します。今回は Sample クラスの public メソッド全てに処理を埋め込むよう定義しています。

ウィービング結果executionウィービング定義 @Before("execution(public * *..*.Sample.*(..))") public void beforeExecutionPointcut() throws Throwable { System.out.println("execution before process."); }

@After("execution(public * *..*.Sample.*(..))") public void afterExecutionPointcut() throws Throwable { System.out.println("execution after process."); }

デコンパイル結果 public void outputMessage() { try { SampleAspect.aspectOf().beforeExecutionPointcut(); System.out.println("this is sample."); } catch (Throwable throwable) { SampleAspect.aspectOf().afterExecutionPointcut(); throw throwable; } SampleAspect.aspectOf().afterExecutionPointcut(); }

長かったので抜粋しました。元のソースと見比べると、対象に指定したメソッド内に、以下の処理が新たに追加されていることがわかります。 ・前処理での beforeExecutionPointcut メソッド呼び出し ・後処理での afterExecutionPointcut メソッド呼び出し ・処理全体が try-catch で括られている ・追加された catch 句内での afterExecutionPointcut メソッド呼び出し

callウィービング定義 @Before("call(public * *..*.Sample.*(..))") public void beforeCallPointcut() throws Throwable { System.out.println("call before process."); }

@After("call(public * *..*.Sample.*(..))") public void afterCallPointcut() throws Throwable { System.out.println("call after process."); }

デコンパイル結果 private void doProcess() { Sample sample = new Sample(); try { SampleAspect.aspectOf().beforeCallPointcut(); sample.outputMessage(); } catch (Throwable throwable) { SampleAspect.aspectOf().afterCallPointcut(); throw throwable; } SampleAspect.aspectOf().afterCallPointcut(); ~略~ }

デコンパイル結果を見ると、execution では対象のメソッド内に前処理・後処理が埋め込まれていたのに対し、メソッドの呼び出し元に処理が埋め込まれていることがわかります。call は「特定のメソッドを呼び出したとき」を表すポイントカットなので、メソッドの呼び出し元がウィービングの対象となります。

handlerウィービング定義 @Before("handler(Exception)") public void beforeHandlerPointcut() throws Throwable {

続きは元サイトの記事をご覧ください!

Page 45: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

46

GitLab CI/CD による Docker 環境へのパイプライン考察20

・元ウォーターフォールエンジニア・富士通内部でアジャイル、DevOps の普及展開活動に従事中・ミッションステートメント:「すべての SE にゾーン体験を!」

はじめにGitLab CI/CD(https://docs.gitlab.com/ee/ci/) 便利ですよね。Git リポジトリへのコミット等をトリガーに自動処理を実行できます。自由度が高いので何でもできるのですが、逆に自由すぎて迷うことも多々あります。本記事では、Docker環境を活用した CI/CD の型について模索してみたいと思います。この延長で、社員が気軽にアイデアを試せる下記のような環境を作ることを目指しています。 ・Web サービスを動かすマシンを自分で用意しなくていい ・サーバ OS にログインしてインストール・セットアップ作業をしなくていい ・Git リポジトリにコードをコミットするだけで Web サービスが動く※ちなみに筆者は Kubernetes については実践経験がありません。スモールスタート主義なので、Docker だけだと無理だ…と実感してから検討したい派。実はまだ Docker Compose も使っていません。が、Docker Compose はさすがに使いたくなってきたところ…。

環境本記事の試行錯誤の環境は下記のとおりです。 ・GitLab 環境:GitLab.com ・ビルドサーバ (CPU: 2core, MEM: 4GB):CentOS 7.7、Docker CE 19.03.5、GitLab Runner 12.5.0 ・デプロイ先サーバ (CPU: 2core, MEM: 4GB):CentOS 7.7、Docker CE 19.03.5※実際には社内ネットワークからのインターネットアクセスには認証プロキシを突破するための設定が必要ですが、本記事では本質ではないため割愛しています。

CI/CD パイプラインの設計Docker のポータビリティを活かしたい、言い換えると、OS に直接何かをインストールすることを極力避けたいです。 ・Web サービスの構成要素はすべて Docker コンテナにする ・アプリケーションのビルド環境にも Docker コンテナを使うこの路線で CI/CD パイプラインを設計すると下記のようになります。 ・ビルド用コンテナをビルドする ・↑のビルド用コンテナを使ってアプリケーションをビルドし、Web サービスコンテナにする ・Web サービスコンテナを別サーバであるデプロイ先サーバ上に起動する

0. ビルド用コンテナをビルドする準備まずはビルドサーバを構築します。CentOS に Docker をインストールする手順は Docker 本家 (https://docs.docker.com/install/linux/docker-ce/centos/) に詳しく書かれているので割愛します。また、GitLab Runner をインストールする手順についても GitLab 本家 (https://docs.gitlab.com/runner/install/linux-repository.html) をご参照ください。ここでは Docker コンテナを使って自動ビルドできるようにしたいため、Docker Executor モードで GitLab Runner をregister します。(やはり本家の手順書 (https://docs.gitlab.com/runner/register) が参考になります。)

ただ、ちょっと待てよ。ビルド用コンテナをビルドするためのコンテナは何にすればいいのか?そもそも、Docker コンテナの中で Docker イメージをビルドできるのか?など疑問が次々と出てきます。それで色々と勉強したのですが、主に下記記事はたいへん参考にさせていただきました。

コンテナからコンテナを操作するhttps://blog.nijohando.jp/post/docker-in-docker-docker-outside-of-docker/Docker コンテナ内から Docker を使うことについてhttps://qiita.com/esaka/items/37e5d60d66c6061c19d0

まとめると、Docker コンテナの中で Docker イメージをビルドする方法は下記の通り : ・Docker in Docker、Docker outside of Docker、Daemon-less Image Builder の 3 方式がある ・Docker in Docker(DinD) は権限が強すぎて危なそう ・Daemon-less Image Builder はまだあんまり事例がない ・CI で使う時は Docker outside of Docker(DooD) でいいんじゃないか?という情報が多いということで素直に Docker outside of Docker(DooD) 方式を採用することにします。

Docker outside of Docker(DooD) をするには具体的に何をすればいいのでしょうか?どうやら Docker Hub に `docker`という名前のコンテナがあるらしく、このコンテナは Docker の中で Docker を使うためのコンテナのようです (DinD、DooD 兼用 )。素晴らしい!(素晴らしいが名前が極めて紛らわしい!)

ikeda.hideya

Page 46: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

47

FSWeb Advent Calendar 2019この `docker` コンテナを使った上で、「コンテナ側からホストの docker.sock (/var/run/docker.sock) をマウント」すればいいらしいです。(この仕組みについては、まだ人様に説明できるほど理解できていません。)

GitLab Runner の register は下記の手順で実施しました# gitlab-runner register -n \--url <GitLab URL> \--registration-token <token> \--executor docker \--description <サーバ名等 > \--tag-list "docker-build" \--docker-image "docker:latest" \--docker-volumes /var/run/docker.sock:/var/run/docker.sock

- 4 行目 `--executor docker` は Docker Executor として register するという意味- 6 行目 `--tag-list "docker-build"` は `docker-build` というタグ名で登録という意味- 7 行目 `--docker-image "docker:latest"` が Docker の中で Docker を使うためのコンテナを指定- 8 行目 `--docker-volumes /var/run/docker.sock:/var/run/docker.sock` がコンテナ側からホストの docker.sock マウント

1. ビルド用コンテナをビルドするDocker outside of Docker(DooD) の環境ができたので、早速ビルド用のコンテナを作ってみることにします。言語は何でもいいのですが、私が一番馴染みがある Java を Gradle でビルドするコンテナを作ります。GitLab に新規プロジェクトを作成します。ここでは名前を「gradle-container」とします。このプロジェクトには下記 2 ファイルを配置してコミットします。DockerfileFROM gradle:6.0.1-jdk13

.gitlab-ci.ymlstages: - package

package: stage: package tags: - docker-build script: - docker login -u gitlab-ci-token -p ${CI_BUILD_TOKEN} ${CI_REGISTRY} - docker build -t ${CI_REGISTRY_IMAGE} . - docker push ${CI_REGISTRY_IMAGE}

- `tags` に指定している `docker-build` は、register 時に指定したタグ名

これらのファイルをコミットすると自動ビルドが実行され、見事ビルド用コンテナができあがります。※この例は、Docker Hub に置いてある gradle コンテナを持ってきて、そのまま GitLab Registry に格納しているだけですが、ビルド環境にカスタマイズを入れたい場合にこの Dockerfile を修正するだけなので CI/CD の型としては重宝します。

2. ビルド用コンテナを使ってアプリケーションをビルドし、Web サービスコンテナにする上記で作成したビルド用コンテナを使って、次にアプリケーションをビルドします。

GitLab に新規プロジェクトを作成します。ここでは名前を「sampleapp」とします。自動ビルドを制御する下記 2 ファイルを作成してコミットします。

(アプリケーションのソースコードは割愛します。素の Servlet/JSP を想定。).gitlab-ci.ymlstages: - build

build: stage: build image: <ビルド用コンテナの URL>:latest tags: - docker-build script: - gradle war artifacts: paths: - build/libs/*.war

build.gradleapply plugin: 'eclipse-wtp'apply plugin: 'war'

repositories { jcenter()}

dependencies { providedCompile 'javax.servlet:javax.servlet-api:3.1.0' }

sourceCompatibility = '1.8'targetCompatibility = '1.8'

- `build` ジョブの `image` にビルド用コンテナを指定しています 続きは元サイトの記事をご覧ください!

Page 47: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

48

Rust をやりませんか?21

データが好きなエンジニア?です。データサイエンスの勉強をさぼっているのでそろそろがんばっていきたいと日夜思っています。

はじめにこの記事では、Rust(https://www.rust-lang.org/) について勉強したこと思ったことを記載しています。ちなみに私は、Rust について、超初心者です。そんな私が、なぜ Rust について記事を書こうかと思ったのかというと 面白そうだったから!!!それだけです。※モチベーションはこれぐらいがちょうどいいと個人的には思ってます。

Rust とは何かMozilla が支援しているオープンソースのプログラミング言語です。Rust の 1.0 版は、2015 年にリリースされており、比較的新しい言語です。C や C++ の置き換え先として注目されています。動作環境は、Windows や Linux など主要な OS に対応してます。対応環境については、こちら (https://forge.rust-lang.org/release/platform-support.html) にまとまって記載されています。サポートレベルによって、Tier が分かれています。Tier1 を使っておけば、大丈夫。

Rust の特徴個人的に気になった特徴をピックアップして記載します。※以下に挙げた特徴以外にも、沢山の特徴があります。 • 愛されている • 処理速度 • 安全性

愛されているStack Overflow Developer Survey で「最も愛されているプログラミング言語」の 1 位を 2016 〜 2019 年の間獲得しています。コミュニティに愛されてることは大事。ちなみに、2019 年の「最も愛されているプログラミング言語」の 2 位は、Python になります。(https://insights.stackoverflow.com/survey/2019)

処理速度処理速度は、C、C++ に匹敵するほど高速です。Rust は、C や C++ と同様に事前にマシンコードにコンパイルした実行ファイルを実行します。そのため、Java や C# などと異なりバイトコードをマシンコードに変換する処理が無いため高速に動作します。また、メモリ管理方法として、寿命や借用といった概念を取り入れることで安全かつガベージコレクションが不要なランタイムを実現しました。※ガベージコレクションを搭載する言語は、メモリ管理をランタイムが管理するため、ランタイム自体が複雑になる点やガベージコレクションの発生時に処理が一時的に停止するというようなオーバーヘッドが発生します。

安全性Rust は、型安全 (Type Safety) とメモリ安全性の性質を持った言語です。型安全というのは、型が正しいと判断されたプログラムは、プログラミング言語が定義していない動作をすることが無いと保証するものです。メモリ安全性とは、プログラムが不正なメモリ操作をしないことをプログラミング言語の処理系が保証するものです。これらの言語処理系で設計された機能によって、実装者はコンパイルエラーが無いソースコードを書くだけで C や C++よりもセキュアなソースコードを作成することができます。

インストールと Hello world実際にドキュメント (https://doc.rust-jp.rs/book/second-edition/foreword.html) に従ってインストールして、Hello world を実行してみます。

環境情報以下の環境でセットアップを実施しました。 ・Ubuntu 16.0.4(64bit)

インストール手順1. インストールコマンドを実行します。`curl https://sh.rustup.rs -sSf | sh` を実行します。

HarakiDX

Page 48: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

49

FSWeb Advent Calendar 20192. メッセージを読んで、指示に従ってマシンを再起動します。

3. Rust がインストールされていることを確認します。`rustc --version` を実行します。

Hello world の作成 (cargo 使用 )1. cargo がインストールされているか確認します。cargo とは、Rust 用のプロジェクト管理ツールです。`cargo --version` を実行して、インストールを確認します。

2. cargo を使用してプロジェクトを作成します。`cargo new hello_cargo --bin` を実行します。

3. 作成された main.rs を確認します。fn main() { println!("Hello, world!");}

4. `cargo build` を実行して、ビルドします。

5. dist フォルダが作成されているので、その中の `hello_cargo` を実行します。

おまけ Rust を使ったツールの紹介 ripgrep(grep ツール )インストールすれば、無条件で幸せになれる高速な grep ツール。公式はこちら(https://github.com/BurntSushi/ripgrep)。

終わりに初めて記事投稿しました。やってみると意外と楽しくて食わず嫌いは駄目だなーと実感しました。他にも色々書きたかったが、ここでタイムアップ。この記事を読んで、少しでも Rust に興味を持っていただければ幸いです。今後は、Rust と GraphQL、WebAssembly の勉強をしていきたいと思います。今回の記事は全てスマートフォンから作成しました。また、開発環境やソースコードもスマートフォンから作成しています。PC で見ると画像が縦長で見辛いかも…

Page 49: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

50

概要私は趣味でヴァイオリン演奏を嗜んでいますが、ヴァイオリンを弾くは大変なんです。演奏すること自体が困難な事は、しずかちゃんのおかげもあって広く知られていますが、演奏以外にも大変なことがあります。ヴァイオリンを弾くとき、曲を弾く前に決まってやることがあります。それはボーイングといって、上げ弓で弾くのか、下げ弓で弾くのかを楽譜をみながら1つ1つ決めていく作業です。 ・V → アップボウ(下から上) ・ П → ダウンボウ(上から下)

曲のフレーズ感や、弾きやすさなど考慮して、ボーイングを楽譜に書き込んでいくのですが、この作業が結構骨が折れます。ボーイングには、唯一の正解はなく、奏者の感性が現れるものでもあります。また、カルテットやオーケストラで弾く場合、ヴィオラやチェロなど他の楽器とも所々合わせる必要が出てきます。ボーイング自動付け機の開発は、弦楽器奏者の夢といっても過言ではないでしょう。そこで、ボーイング自動付け機までいかずとも、他の人の演奏動画からボーイングを読み取り、それを参考にすることで手間を軽減できないか?と考えました。

作戦作戦はこうです。 ・ポーズ推定可能なオープンソースライブラリを活用、演奏動画から弓を持っている右手首の座標を刻々と記録する。 ・右手首の座標の軌跡を楽譜に重ね合わせる。これで、演奏動画のボーイングがバッチリ分かるはず!利用したライブラリは、OpenPose を Tensorflow 向けに実装したオープンソースの tf-pose-estimation です。

OpenPose とは?OpenPose は、コンピュータビジョンに関する国際学会 CVPR2017 で CMU(カーネギーメロン大学)が発表した、keypoint(特徴点)の検出と keypoint 同士の関係の推定を行う技術です。OpenPose を使うと、以下のように関節の位置など、人の体における特徴点がどの座標にあるかが分かります。

CMU-Perceptual-Computing-Lab/openpose - githubhttps://github.com/CMU-Perceptual-Computing-Lab/openpose

tf-pose-estimation とは?tf-pose-estimation は、OpenPose と同じニューラルネットワークを Tensorflow 向けに実装したものです。今回これ を 利 用 し よ う と 考 え た の は、errno-mmd 様 の tf-pose-estimation 拡 張 (https://github.com/errno-mmd/tf-pose-estimation) が便利そうだったからです。ポーズ推定した二次元の関節位置情報を JSON フォーマットでファイルに出力するオプションを加えていただいており、これを利用したいと考えました。

解析する演奏動画フリーで利用可能なヴァイオリンの演奏動画に心当たりがなかったため、自分の演奏を録画したものを解析に利用しました。演奏した曲は、モーツァルトのアイネクライネナハトムジーク 1 楽章の冒頭 10 小節です。メトロノームを使い一定のテンポで弾きました。

右手首の関節点のみをマーキングするように微修正tf-pose-estimation はデフォルトだと、目、肩、肘、手首、足首など様々な特徴点をマーキングし、それらを線で繋いで表示します。今回は、右手首のみをマーキングするように少しコードを修正しました。(tf-pose-estimation/tf_pose/estimator.py)440 # 右手首のみ円の画像を描画441 if i == CocoPart.RWrist.value:442 cv2.circle(npimg, center, 8, common.CocoColors[i], thickness=3, lineType=8, shift=0)

449 # 特徴点を繋ぐ線描画を無効化450 # cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)

ポーズ推定でヴァイオリン演奏のボーイングを可視化してみた22

クラシックオタクのエンジニアです。筒井 城治

Page 50: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

51

FSWeb Advent Calendar 2019ポーズ推定の実行実行環境は Google Colaboratory を利用しました。https://github.com/errno-mmd/tf-pose-estimationの Read.md に従い、セットアップのコマンドを実行していった後に、下記コマンドを実行します。%run -i run_video.py --video "/content/drive/My Drive/violin_playing/EineKleineNachtmusik_20191226.mp4" --model mobilenet_v2_large --write_json "/content/drive/My Drive/violin_playing/json" --no_display --number_people_max 1 --write_video "/content/drive/My Drive/violin_playing/EineKleine_keypoints_20191226.mp4"

事前に GoogleDrive にアップロードしていた演奏動画をインプットにして、右手首の関節点を描画した動画と、1 フレーム毎の関節点の座標が書かれた JSON ファイルが出力されます。

出力された動画ファイル出力動画を数秒間間隔切り出して gif にしたものがこちらです。これを見る限り、それなりの精度で右手首の関節点をトレースしてくれているように見えます。

出力された JSON ファイル特徴点の座標が記載された JSON ファイルは、フレーム毎(1/60 秒)に出力されます。10 フレーム目の JSON ファイルがこちらです。

(ファイル内容は省略します。サイトの記事をご覧ください。)コードを読むと、pose_keypoints_2d の `13` 番目(0 から振って)の要素が右手首の y 座標の値のようです。上記の10 フレーム目の例だと、`166.95652173913044` になります。

右手首の y 座標をグラフ表示matplotlib でグラフ化をしてみたいと思います。まずは、フレーム毎に出力された JSON ファイルから目的となる値を収集していきます。import jsonimport pprintimport osimport glob

import numpy as np

files = glob.glob('/content/drive/My Drive/violin_playing/json/*')x = list(range(len(files)))y = []for file in files: with open(file) as f: df = json.load(f) y.append(df['people'][0]['pose_keypoints_2d'][13])

変数 x にフレーム数、変数 y に右手首の関節点 y 座標の値を格納しています。

続いて、matplotlib でグラフ化します。x 座標のメモリは、30 フレーム間隔にしました。というのも、アイネクを 4 部音符 =120 のテンポで弾いたので、30 フレームはちょうど 4 分音符 1 拍分に相当することになり、楽譜との対応関係が見やすくなるからです。import numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as ticker

fig = plt.figure(figsize=(120, 10))ax = fig.add_subplot(1, 1, 1)ax.xaxis.set_major_locator(ticker.MultipleLocator(30))ax.plot(x, y, "red", linestyle='solid')

出力されたグラフはこちらです。

重ね合わせ楽譜と重ね合わせた結果がこちらです。重ね合わせは手動で行いました。続きは元サイトの記事をご覧ください!

Page 51: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

52

ごめんなさい。出落ちです。さいつよの開発手法でもなんでもないです。ただの基礎的なアジャイル開発の記事です。たまにはコード書こうかなと思いましたが、時間ない〜。頭の中にだいたいあるようなことを記事にしよう!特にエンタープライズのアジャイルとか新しい事は書いていません。ばっちりアジャイル開発知っているよ!という方ではなくあまりアジャイルわかりません。という方向けです。本投稿はアジャイル開発について、思うところ、よくある疑問に対する個人的な見解というような内容です。

1. はじめにアジャイル開発は、実は 20 年以上前から存在していて特に新しくはありません。しかし、特にここ数年アジャイル開発というワードをよく目にしますし、弊社もそうですが各大手 SIer も組織としてのアジャイル推進に重い腰をあげたようにも見えます。

NTT データ 6000 人で富士通 4000 人、3 年後のアジャイル開発要員https://tech.nikkeibp.co.jp/atcl/nxt/mag/nc/18/013000094/013100008/日立、「アジャイル開発コンサルティングサービス」を提供開始https://japan.zdnet.com/article/35132321/KDDI ら 3 社、アジャイル開発を支援する合弁会社「Scrum Inc. Japan」設立https://cloud.watch.impress.co.jp/docs/news/1173870.html)

※上記例は全部 2019 年の記事。その他大手各社でもここ数年でアジャイルの動きは多数。

中堅以降の方は、いやいやアジャイルなんてこれまでも大きな動きがあったでしょと思うかもしれません。でもまた大きな流れを感じるので過去の試みはうまくいかなったのか ...、あるいはあなたは人生をループしているのかもしれない

2. 昔話私のアジャイルとの出会いは、富士通グループ会社ではなく小さなソフトウェアハウスに在籍していた頃の 2000 年になります。当時私は、まさにデスマーチ案件に従事しており残業が 100 ~ 230h/ 月な状況でした。この案件は医療系の制御システムでウォーターフォール型開発で行っており、以下のような問題がありました。 ・お客様もあるべき姿がわからない。システムテスト後の仕様変更多発 ・医療系の仕様が複雑 ・システム構成が複雑(Socket 通信、ハード制御、マルチスレッド制御(4 プロセス、10 数個のスレッド等) ・開発メンバーの約半数が、新人あるいは新人レベルのパートナー ・開発は分担制で、お互い自分の担当以外の機能はあまり知らない ・可読性の悪いコード(C++ だけど非オブジェクト指向、1 クラスが 1 万 step オーバー、同じ処理のコピペ多数等)などなど。

一か月山奥の工場に開発 / テストで軟禁されました (30 日連続出勤)。今、考えても複雑怪奇なシステムでバグや仕様変更で終わりが見えません。

「悲しいけどこれ仕事なのよね」

という状況でした。そこへ、ケント・ベック (Kent Beck) らによるエクストリーム・プログラミング(以下 XP) という開発手法の提唱です(XP はアジャイル開発手法のひとつ)。バグも仕様追加も変更も見たくない!という状況でしたが、そこに

変化ヲ抱擁セヨです。

この開発手法なら、変化も抱擁して解決してしまうらしい!ケント・ベック様!まさに神!!

このデスマーチ案件では、度重なる修正により変更の難易度がとても高くなったり影響箇所が特定できなかったりと対応工数が誇大化していました。バグがバグを呼びまた元に戻したりと図のようにコストが指数関数的にあがっているんじゃないかと思ったほどです。しかし XP のプラクティスによ

ぼくのかんがえたさいきょうの開発手法23

富士通でマネージャーしております。が、管理よりも技術が好きです。あとアルコールが大好きでございます。曽我 敏行

Page 52: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

53

FSWeb Advent Calendar 2019りこの曲線をなだらかにできるというのです。XP のプラクティスをいくつかあげると、テスティング(テスト駆動)、リファクタリング、ペアプログラミング、共同所有権、継続的インテグレーション、週40 時間(週 40 時間以上働いてはいけない)...

いやいやいや!これ最新の開発手法でしょ?違います!これらが約 20 年前にもう提唱されていたのです。凄くないですか?当時、デスマーチ案件だったこともありますが、XP はとてつもない衝撃でしたよ!もう麻薬レベルです。

そして。。。私は会社を辞めた

って逃げ出したみたいですね。(汗そうではなくて、XP が良いといってもいきなり適用はできません。リファクタリングや共同所有権など部分的に取り入れたり、中心人物としてデスマーチを沈めてからの退職です。バイト時代も含めると 5 年半ぐらいの在職になります。

当時まだ先進的だった Web 開発と、エクストリームプログラムは今の会社では出来ない。そしてこの会社は泥船だ。沈む前に逃げだせ!と判断しての転職になります。こうして私は XP の強烈な印象を胸に刻みこみ別の戦場を求めて旅立ちました。( 曲 .「ドラゴンクエストⅡ」より 遙かなる旅路」(https://www.youtube.com/watch?v=awILbegS3CE)

勇者プログラマー LV5当時影響を受けた本。共に 2000 年出版 ・エクストリーム・プログラミング ( ケント・ベック著)※今は 2nd Edition があります ・リファクタリング―プログラムの体質改善テクニック ( マーティン・ファウラー著)

3.アジャイルとアジャイル開発手法アジャイルとアジャイル開発手法の関係ですが、アジャイルは思想、考え方であり、スクラムや XP がその開発手法です。これらの総称をアジャイル開発といいます。アジャイルソフトウェア開発宣言 (2001 年)(https://agilemanifesto.org/iso/ja/manifesto.html) にアジャイルで重視すべき指針、考え方がまとめられています。(アジャイル開発手法の分野において名声のある 17 人(ケント・ベックやマーティン・ファウラー等)が共通して重要であるとした考え方をまとめたもの)ここではこう謳われています。

 プロセスやツールよりも個人と対話を、 包括的なドキュメントよりも動くソフトウェアを、 契約交渉よりも顧客との協調を、 計画に従うことよりも変化への対応を、 価値とする。すなわち、左記のことがらに価値があることを認めながらも、 私たちは右記のことがらにより価値をおく。

ま た ア ジ ャ イ ル 開 発 手 法 は XP や ス ク ラ ム な ど 複 数 存 在 し ま す が、 現 在 の ア ジ ャ イ ル 開 発 の 傾 向 に つ い て は、VersionOne(https://www.stateofagile.com/) が行っている「annual State of Agile Report」( 年次レポート ) で確認出来ます。例えば、「13th annual State of Agile Report(2019)」(https://www.stateofagile.com/#ufh-i-521251909-13th-annual-state-of-agile-report/473508) によるとアジャイル開発手法採用の内訳は以下の通りです。現在はスクラム開発手法が多く採用されていることがわかります。 1. SCRUM(54%) 2. OTHER/HYBRID/MULTIPLE(14%) 3. SCRUM/XP HYBRID(10%) 4. SCRUMBAN(8%) 5. KANBAN(5%)

しかし、それぞれの開発手法の優劣に意味はないし、それらの開発手法を厳密に真似る必要はありません。実際にアジャイル開発を行いながら、その案件でそのチームに合うやり方を探っていけばよいのです。しかし、そこでアジャイルソフトウェア開発宣言を忘れてはいけないしこの価値観こそが、アジャイルだと私は思います。

これらが、現在でも私の開発の考え方の原点です。

また今回知ったのですが IPA がこんなものを出していました。(私もこれはちゃんと読んでない)アジャイルソフトウェア開発宣言の読みとき方https://www.ipa.go.jp/files/000065601.pdf

なぜ 2018 年に?とても遅いわけですが、DX レポート等もそうですが IPA みたいなところがこういうものを出すことによって世に広まりやすいので良いことではあります。

続きは元サイトの記事をご覧ください!

Page 53: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

54

Docker で作る、最強の移動型開発環境24

普段は DynamicPULSE というアプリケーションモニタリングツールの開発 / 保守をやっています。趣味で golang/scala/node.js(typescript)もやってます

目的皆さん、コーディングは好きですか?私は好きです。ただ、電車での移動中に PC を鞄から取り出して、IDE を立ち上げて・・・は電車の中などではちょっと難しいですし、少し恥ずかしいですよね?そんな時、スマホでコーディングができたらなぁ。なんて思いませんか?そんな時に役立つものをご紹介したいと思います

利用している OSS の紹介 ・coder (https://coder.com/)  ・ブラウザ上でほぼそのままの VSCode が使えるクラウド IDE サービス  ・拡張機能もそのまま使えるものが多い   ・Remote Development は検索しても出てこなかったので、未対応?    (https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)  ・ 公式 Docker イメージが公開されており、手早く利用開始できます。    (https://hub.docker.com/r/codercom/code-server)

環境構成ハイパー雑な構成イメージはこんな感じです。 ・code-server はメインのコンテナ。この上に開発環境をセットアップします ・other container は、その他ミドル(DB など)を動作させるコンテナです

環境を試した PC は以下 ・macOS Catalina 10.15.2 ・docker 19.03.5 ・docker-compose 1.24.1

完成品docker-compose を使用して、デプロイできるようにしてあります。docker-compose.yml の中身です

(ソースコードは省略しました。サイトの記事をご覧ください。)coder/Dockerfile の中身です

(ソースコードは省略しました。サイトの記事をご覧ください。)

実行してみるdocker-compose を実行してみます!% docker-compose up -dCreating network "docker_default" with the default driverCreating docker_coder-server_1 ... doneCreating docker_postgres_1 ... done

% docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc3655e1c8d6a docker_coder-server "code-server --allow…" 48 seconds ago Up 47 seconds 0.0.0.0:8080->8080/tcp docker_coder-server_14803094ccaef postgres:9.6-alpine "docker-entrypoint.s…" 48 seconds ago Up 47 seconds 0.0.0.0:15432->5432/tcp docker_postgres_1

postgres コンテナと、coder-server コンテナが起動しましたね!早速ブラウザからアクセスしてみましょう!

Qiita:@bashdevばし

Page 54: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

55

FSWeb Advent Calendar 2019パスワードの入力が求められるので、PASSWORD に設定したものを入力して、Enter します。

おめでとうございます。あなたの開発環境ができました!

デフォルトで git などもインストールされているため、リポジトリをクローンしてきて、開発を開始することができます!

iPhone から確認iPhone からも確認できるか試してみましょう。以前プロジェクトやフォルダを開いていると、以下のようにワークスペースが自動的に開かれます。

ターミナル操作などもできます。左下の歯車アイコン >Command Palette>Open New Terminal

iPhone のデフォルトのキーボードだと、ショートカットやタブが使用できないので、外付けのキーボードでの使用をお勧めします。

最後に・Maven や Gradle を使った開発をされる方は、Dockerfil の FROM baseImage 以降から、sbt のインストールを除外すれば問題ないでしょう。(リポジトリに wrapper がコミットされている場合) ・wrapper がない場合は、ビルドツールも同時にインストールしてしまえばいいと思います

・その他開発言語の場合でも、Java などと同様にバイナリをダウンロードして展開・パスを通す方法が早いし確実だと思います。 ・.NET Core (https://dotnet.microsoft.com/download) ・golang (https://golang.org/doc/install)

・UserLAnd などを使用して、開発環境を整えている方もいらっしゃったりするようですが、結局 vim しか使えなかったり結構しんどそうなので、使い慣れた VSCode がそのまま使えるっていうのはやっぱりいいなぁと。 ・最悪このままクラウドのサーバ上に IDE を起動しておけばいつでも開発できる?! ・ただし今の設定のままだとセキュリティがザルなので、絶対インターネット公開はしないでくださいね

・ほんとは、Remote Development を使って開発環境は別コンテナにしたかったんだけど、いったいなぜ使用できないのか・・・

((h = (s = "めりくり", n = true, r = Math.floor(Math.random() * s.length), t1 = s.substr(r, 1)) => n ? (rp = 2) => (t1 + h(s.replace(t1, ""), false)).repeat(rp) : t1) => `${h()(1)}${h()(1)}`)()

Page 55: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

56

スマートスピーカーのセキュリティを(ちょっとだけ)考える25

じゅげむ(今井 隆)

小さいデバイスが大好きな元エンジニア。20 年前は同人誌即売会を主催したりしてました。今回、15 年ぶりに同人誌の編集をしましたが、ツールの進化に助けられました。Adobe InDesign 超便利。

はじめにスマートスピーカーがこの世に生まれてから、まだ 5 年ほどしか経っていない(2014 年に Amazon Echo が発売)。そのため、セキュリティに関するトラブルも知見も現在進行形で蓄積されている段階といえる。便利に思われた機能がセキュリティホール、といった事も発生している。本記事では、そのあたりをちょっとだけ振り返ってみる。

ベンダー内での盗聴事例スマートスピーカーは家庭内にクラウド直結のマイクを常時置いているようなもので、会話の内容は見ず知らずのうちに第三者に聴かれている可能性があるのだ、ということを改めて意識することになったニュースが、2019 年 4 月に報道された。

アマゾン『Alexa』に盗聴問題。録音した会話を顧客情報と紐付け&面白い内容は従業員で共有とヤバい – Yahoo!https://news.yahoo.co.jp/byline/shinoharashuji/20190414-00122318/

元々、音声認識の精度向上のためにスマートスピーカーは会話を録音しているが、この件では「アマゾンではアカウント情報と紐づけて録音し、従業員がアカウント番号を知りうる状態にある」「面白い会話が従業員の間で共有されている」ことが大きな問題とされた。(一方、アップルやグーグルでは匿名化した上で利用している)

対処方法アマゾン公式サイトの Alexa プライバシーのページ (https://www.amazon.co.jp/hz/mycd/myx/#/home/alexaPrivacy/home) 内、「Alexa データを管理する」から「Amazon のサービスや新たな機能の開発に貢献するために使用する」「テキスト表示の改善にメッセージを利用する」をオフにすることで防ぐことができる。Alexa プライバシーのページでは、この他に音声履歴やスマートホームデバイスの履歴の削除などができるので、一度見直してみるのも良いかと思う。

また、スマートスピーカーにはカメラ搭載のものも出ているが、Amazon Echo デバイスの新しめの製品には、カメラレンズを物理的に閉じることができるスライド式の物理シャッターが搭載されている。これは、盗撮への懸念を和らげる取り組みといえる。

外部からの攻撃事例盗聴のために作られた不正なアプリが Google と Amazon の審査プロセスをすり抜けられることを、ドイツのセキュリティ研究者らが発見したというニュースで、2019 年 10 月に報道された。

アマゾンとグーグルのスマートスピーカーで盗聴が可能との指摘 – CNEThttps://japan.cnet.com/article/35144293/

スマートスピーカーは通常、無音状態が続くと動作を停止する。Alexa であればユーザーが約 8 秒間応答しないと停止する。それに対し、不正なアプリは「無音の音声ファイルを再生」することで動作を停止したように見せかけ、次にユーザーが話しかけた際にシステムへのログインが必要であるように装い、ユーザーの音声発話からパスワードなどを盗み出そうとする。この攻撃手法については、実証実験もすでに行われている。

twitter:@jugemsan / https://pichi.net/jugemsan/

Page 56: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

57

FSWeb Advent Calendar 2019スマートスピーカー「Google Home」や「Alexa」を悪用して盗聴やフィッシング攻撃を行う手法が実証される – トレンドマイクロセキュリティブログhttps://blog.trendmicro.co.jp/archives/22976

この「無音の音声ファイルを再生」という手法、応答時間を長くするためのテクニックとして開発者の間ではよく知られている手法であったが、悪用されると間接的にセキュリティホールとなってしまうことが明らかとなった。

また、審査フローの根本的な欠陥も悪用の原因となっている。Alexa スキルの場合、一度アマゾンによる審査が通りスキルが公開されると、Alexa クラウド上の音声モデルや設定項目は変更できないが、AWS Lambda などの上にあるバックエンドのコードの変更は自由にできてしまうのだ。上記の実証実験でも、バックエンドに記述する会話内容を後から変更した、とある。

対処方法ユーザー側でできる対処としては消極的方法に限られる。パスワードや暗証番号を確認してくるスキルに注意する、開発元が怪しいスキルを使わない、といったことだ。

根本的な対策は、各スマートスピーカーベンダーで実施することになるだろう。例えば、Alexa スキルであればバックエンド環境を Alexa クラウドから包括的に提供する「Alexa-Hosted スキル」を必須化して、バックエンドコードの更新まで管理する方法が考えられる。しかし、この方法では他のスマートスピーカーとのコード共有化を行うクロスプラットフォーム開発ができなくなるため、実施は難しいだろう。

ベンダー側で定期的に自動テストを行い、会話内容が怪しかったり、文面が変化したスキルを停止させる、といった方法もあるだろう。もしかしたら、無音ファイルの再生はできなくなるかもしれない。いずれにしても、ベンダーの対応を待ちたい。

その他バックエンドでの認証スマートスピーカーのバックエンドは、サーバレスなファンクションサービスで実装するのが一般的だが、これも一つ間違うとセキュリティの危険がある。

Alexa スキルの場合、AWS Lambda との組み合わせであれば、Lambda は直接 Web API を持たないため外部からのアクセスは制限される。だが、Azure など他クラウドと組み合わせて利用する場合は、呼び出し元がスマートスピーカーであるかどうかの認証を必ず実施する必要がある。認証を行わなくてもバックエンドは動作してしまうため、開発者は自衛の意味で取り組むべきと考える。

最後にクレジットカード決済や課金ができるようになり、画面表現がリッチになり、といったようにスマートスピーカーのアプリ開発周りはこの 1 年だけでも格段に進化している。それに伴い、セキュリティリスクが発生する可能性も高まっている。開発者として、十分注意したい。

最後まで読んでくれてありがとうございます!

気に入った記事がありましたら、各記事からコメントをお送りください。

お待ちしています!

Page 57: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている

アドベントカレンダーはじめました。〜さらに同人誌にしちゃいました〜

発行者:株式会社富士通システムズウェブテクノロジー     〒 108-0075 東京都港区港南 1-2-70 品川シーズンテラス     https://www.fujitsu.com/jp/group/fsweb/

発行日:2020 年 2 月 10 日 初版

印 刷:有限会社ねこのしっぽ(https://www.shippo.co.jp/neko/)

表紙イラスト:湊川あい 様(twitter:@llminatoll)

本文イラスト:あっさり 様(https://profile.coconala.com/users/1044317)       あツナ 様(https://profile.coconala.com/users/816553)       ichimatsu1013 様(https://profile.coconala.com/users/1074415)

「かわいいフリー素材集 いらすとや」(https://www.irasutoya.com/) から素材を使用させて頂きました。

inobeko books 01

Page 58: 株式会社富士通システムズウェブテクノロジー · 富士通全体でも2016年から有志によるアドベントカレンダーが作られており、独自のカレンダーを立ち上げている