株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

USBブート用DBANをノートPCで利用しようとした際にはまった話

こんにちは!
ヘルプデスクのmiです。

弊社はもうすぐ夏季休暇です!
2019年の弊社の夏季休暇期間は8月10日(土)〜8月18日(日)までです。長い^^
長期休暇は弊社の文化でもあるので、この期間を活用して日頃できないことをやっていきたいと思います!
休み明けに社会復帰できるか、少し心配ではありますが…

さて、少し前の話になるのですが、弊社でレンタルしているノートPCを返却することになり、DBANでデータを消去をすることになりました。
その際、ちょっとしたつまずきで作業がなかなか進まなかったので、そのつまずきポイントと解決方法をまとめてみました!

DBANとは

そもそもDBAN(Darik's Boot and Nuke)とは、コンピュータのストレージのデータを完全に消去するフリーソフトです。

DBANはフロッピーディスクやCDから起動するように作られていますが、今回データ消去対象のノートPCにはCDドライブがついていなかったため、USBから起動できないか試してみました!

※DBANのデフォルトのデータ消去方式は、米国国防総省準拠の方式なので復元が難しく、そのためデータ消去の際に利用しています。
※容量にもよりますが、データ消去には1日程度かかります。

つまずきポイントその1:isoイメージの書き込み

最初、USBに直接DBANのisoイメージを書き込む方法をいくつか試していました。
しかし、ノートPCにDBANのUSBをさしてみても何も反応してくれないという結果でした…。

その後、Rufusというインストーラーを使ったら、うまくできたようで、ノートPCが無反応という事象は解決できました。(rufus-3.4.exeを使用)

Rufusを使ってUSBにDBANを書き込む方法は、多少の画面の違いはありましたが、以下のサイトの説明が丁寧でわかりやすかったです。

www.gigafree.net



つまずきポイントその2:バージョン

最初、DBANのバージョン2.3.0(最新バージョン)をRufusでUSBに書き込んだのですが、ノートPCで操作を進めていくと「error cat: can't open '/proc/cmdline': No such file or directory 」という文言で怒られて、先に進めなくなっていました。

色々と調べてみたところ、比較的新しいPCだと、バージョン2.3.0では上記のエラーが出るようです。
バージョン2.2.8、もしくは2.2.7だと上記のエラーは出ないとのことです。

sourceforge.net


今回はバージョン2.2.8をUSBに書き込みし直しました。
すると、ノートPCでエラーが出ることもなく、無事データ消去ができました!

いかがでしたでしょうか?
特殊なつまずきかもしれませんが、私と同じようにはまってしまっている方のお役に立てれば幸いです。
それでは^^


\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

文字列結合スニペット

こんにちは!Czです!

僕はよく科学館にいくのですが、行く理由の一つとしてプラネタリウムがあります。
ある科学館では夏限定で公開しているプラネタリウムがあり、そのプラネタリウムのウリが何と「12K」と超高解像度!

4年前に初めて体験したのですが、その没入感に魅了されて今では夏の恒例行事として家族で月3回観に行くほどです!(家族はあまり乗り気ではないですが...)

ユーザの声としては

「まるで宇宙船に乗って宇宙を旅しているみたい」

「えっ?座席動いてる??」

「あ〜涼しい」

とのこと。※個人の感想です

科学館に許可を取っていないので名前は伏せておきますが、興味がある方は「12K プラネタリウム」で検索!

ふぅ...プラネタリウムの宣伝できたし、これでブログ完了でいいよね?えっ、ダメ?


え〜今回のテーマは「文字列結合スニペット

まぁ大したことないです。今開発中の仕様で以下のようなものがあるのでそれをネタにしようと思います。

  • 選択された項目を「/」区切りで表示
  • 値が選択されていなければ表示しない

今回はこういったあるあるな処理を効率よく書きたいなぁと言う話です。

プログラムを始めたばかりの人の参考になってくれればと思います。

※本プログラムはPHP+Laravelを使用しています。ですが他の言語やフレームワークでも応用が効くと思います。

あまり良くないパターン(sample1)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample1($isNurse, $isManager, $isCertifiedNurse)
{
    $value = '';

    if ($isNurse) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '看護師';
    } else {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= 'その他';
    }

    if ($isManager) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '管理職';
    }

    if ($isCertifiedNurse) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '認定看護師';
    }

    return $value;
}

上記サンプルではif文を使い、条件に当てはまったら文字列を追加すると言う処理をしています。

よく見ると「/」を入れるかどうかの判定はどれも同じなのですが、文字列を順次結合するやり方をとっているため都度判定が必要になっています。

もう少し短くしたいですね。

悪くはないパターン(sample2)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample2($isNurse, $isManager, $isCertifiedNurse)
{
    $values = [];

    if ($isNurse) {
        $values[] = '看護師';
    } else {
        $values[] = 'その他';
    }

    if ($isManager) {
        $value[] = '管理職';
    }

    if ($isCertifiedNurse) {
        $value[] = '認定看護師';
    }

    return implode('/', $values);
}

sample1の時に気になっていた「/」を入れる処理を、PHP標準のimplode()と言うメソッドを使って実現しています。

$valuesに入れるかどうかの判定をif文で行なっている為、ちょっと長くなりがちですね。

値が存在するものだけにフィルタリングするパターン(sample3)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample3($isNurse, $isManager, $isCertifiedNurse)
{
    $values = [
        $isNurse ? '看護師' : 'その他',
        $isManager ? '管理職' : '',
        $isCertifiedNurse ? '認定看護師' : '',
    ];

    return implode('/', array_filter($values, function ($it) {
        return $it !== '';
    }));
}

$valuesに入れる処理を一括で行い、if文を三項演算子に置き換え、値がない場合は空文字を代入しています。

そして、array_filterを使って空文字を排除することで目的を達成しています。

割とスッキリしているかと思います。

一時変数を使わないパターン(sample4)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample4($isNurse, $isManager, $isCertifiedNurse)
{
    return implode('/', array_filter([
        $isNurse ? '看護師' : 'その他',
        $isManager ? '管理職' : '',
        $isCertifiedNurse ? '認定看護師' : '',
    ], function ($it) {
        return $it !== '';
    })); // 「看護師/認定看護師」
}

すごく短くなりましたが、implodeとarray_filterの中で値を作っているので可読性があまり良くありません。

プログラミングに慣れてくるとついついこう書きがちですが、忘れた頃に見直すと何でこんな書き方したんだーとなっちゃうかもしれません。

応用編(sample5)

以下の条件を追加

  • 入力値が配列になり、期待値も配列となる
  • マスターテーブルからidをキーにnameを取得する
# 入力値
$params = [
    [
        'label' => 'A',
        'isNurse' => true,
        'isManager' => false,
        'isCertifiedNurse' => true,
        'categoryId' => 1,
    ],
    [
        'label' => 'B',
        'isNurse' => false,
        'isManager' => true,
        'isCertifiedNurse' => false,
        'categoryId' => 0,
    ],
    [
        'label' => 'C',
        'isNurse' => true,
        'isManager' => true,
        'isCertifiedNurse' => true,
        'categoryId' => 2,
    ],
];

# CategoryMaster::all()の取得結果
[
    [
        'id' => 1,
        'name' => 'ほげ'
    ],
    [
        'id' => 2,
        'name' => 'ふが'
    ],
];

# 期待値
[
    'A/看護師/認定看護師/ほげ',
    'B/その他/管理職',
    'C/看護師/管理職/認定看護師/ふが',
 ]
<?php
# 処理
public function sample5($params)
{
    $categoryMasterById = CategoryMaster::all()->keyBy('id'); // LaravelのEloquentモデルを使ってマスタデータを取得し、idごとの値に変換している

    return array_map(function ($param) use ($categoryMasterById) {
         $categoryMaster = array_get($categoryMasterById, $param['categoryId']);
         $categoryMasterName = (is_null($categoryMaster)) ? '' : $categoryMaster['name'];

        $values = [
            $param['label'],
            $param['isNurse'] ? '看護師' : 'その他',
            $param['isManager'] ? '管理職' : '',
            $param['isCertifiedNurse'] ? '認定看護師' : '',
            $categoryMasterName,
        ];
        implode('/', array_filter($values, function ($it) {
            return $it !== '';
        }));
    }, $params);
}

マスタデータの参照が増えたり、入出力が配列になってもそこまで複雑ではないですね。

if文を使わなくても割とシンプルにかけることがわかると思います。

こういうスニペットを多く覚えておくことで実装速度も上がりそうですね!(実行速度が上がるかどうかはまた別の問題)

ただ、個人的にはメモに貼ったスニペットをコピペして実装するのはおすすめしないですね。常に頭で考えるようにしていただきたいです。

そうすることによりどんどんブラッシュアップされ、よりよいコードが書けるようになると思います。

おまけ

応用編をsample1のように記述して見るとこうなります。

<?php
# 処理
public function sample5($params)
{
    $categoryMasters = CategoryMaster::all();
    $categoryMasterById = [];
    foreach ($categoryMasters as $categoryMaster) {
        $categoryMasterById[$categoryMaster->id] = $categoryMaster;
    }

    $values = [];
    foreach ($params as $param) {
        $value = '';
        if ($param['label'] !== '') {
            if ($value !== '') {
                $value .= '/';
            }
            $values .= $param['name']
        }

        if ($isNurse) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '看護師';
        } else {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= 'その他';
        }

        if ($isM) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '管理職';
        }

        if ($isCertifiedNurse) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '認定看護師';
        }

        if (isset(categoryMasterById[$param['categoryId']]) {
            $categoryMaster = categoryMasterById[$param['categoryId']]
            if (!is_null($categoryMaster)) {
                if ($value !== '') {
                    $value .= '/';
                }
                $value .= $categoryMaster['name'];
            }
        }

        $values[] = $value;
    }
}

ながいですねー。応用編が20行に対し、このメソッドは57行もあります。

短い方が良いということではないですが、1メソッドあたりの行数が多いと読む人のコストが高くなってしまうのでそこも考慮して実装したいですね。

まとめ

  • ただ短くするのではなく、後から読む人のことを考え、読みやすさも考慮しつつ実装しましょう。
  • スニペットを使う際はどこからか拾ってきたコードをコピペで使うのではなく、なぜこう書くのかを理解しながら使いましょう。
  • スニペットは時間とともに風化します。常にどうあるべきかを自分自身の頭で考え実装しましょう。

以上!

※ここにあるプログラムは動作確認をしていないのでコピペで動かない可能性があります。ご自分で考え、動作をきちんと確認しましょう。



\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

Googleフォームを使ったアンケートをHTMLメールで送信する【基礎】

日課内で『ピザ会』企画があり、ピザをたくさん食べた後にシメのパスタと闘いました。 サービスプランナーのmkです( ^ω^ )

気づけば早くも入社3年目、3回目の登場です。

今回はGoogleフォームを使ったアンケートを、HTMLメールに載せて弄ってみたのでその紹介をしたいと思います!

今回のゴール↓↓↓↓

記事のタイトルとアイキャッチ画像をメールに反映した結果のイメージ
フォームのイメージ
今回のゴール

やりたいこと:HTMLメール×Googleフォーム

クイックが運営するメディアの1つに「Dybe!」というサイトがあります。

ten-navi.com

メディアに関わっている人は誰しもが気になる、『実際記事に対してどう思われているのだろう......』というユーザーの生の声。

せっかく社内にターゲット層がいるので、率直な意見を聞いてみよう!ということで、アンケートを実施することにしました。


Googleフォームからメールを送信した場合の表示
Googleフォーム上で送信したメール

Googleフォーム上から対象者にメールを送信すると、「タイトルやアイキャッチ画像をみて直感的に回答してください」と書いてあるのに、それを確認するにはサイトかTwitterに行かないといけない状態に。(フォームにとんでもTwitterのリンクのみ)


サイトの特性として「タイトルとアイキャッチ画像をみたときの意見」が重要なので、どうにか実現したい!

※Dybe!はSNSやキュレーションメディアからの流入を想定しているサイト。


しかし、Googleフォーム上でそれを満たすためには、毎回アイキャッチの画像をUPをしなければならない...

フォーム自体を毎回編集して送信するのは手間である...

ということで、メール上に「タイトルとアイキャッチ画像を自動で表示させる!」ことを達成するためにHTMLメールの作成をしてみました( ^ω^ )


やったこと①:GASでHTMLメールを作成

function sendGmail(){
      var to = '送信対象者のメールアドレス';
      var mailTitle = 'メールのタイトル'; 
      var mailText = 'HTMLメールが表示できない相手の場合のテキストを設定';
      var html = HtmlService.createHtmlOutputFromFile("message").getContent();
      
      // オプションでHTMLメールの中身を指定
      var options = { htmlBody: html, from:'送信元アドレスを指定' };
      
      // メールを送信
      GmailApp.sendEmail(to, mailTitle, mailText, options);
}

※HTMLメールの中身は別(message.html)で指定

※送信元のアドレスはGmailの差出人登録をされているメールアドレスのみが有効。 登録されていないメールアドレスを入力しても、反映されませんので注意が必要です。


やったこと②:記事のURLからタイトルとアイキャッチ画像を自動で取得

var url_article = '記事のURL';
var meta_title = /<title>([\s\S]*?)<\/title>/i;
var meta_img = /<meta property=\"og:image\" content=\"(.*)\">/i;
var title = meta_title.exec(UrlFetchApp.fetch(url_article).getContentText())[1];
var img = meta_img.exec(UrlFetchApp.fetch(url_article).getContentText())[1];

※今回はtitleタグとog:image用のmetaタグから情報を取得

やったこと③:メールにタイトル、アイキャッチ画像、フォームを反映

メールの内容をmessage.htmlに書く。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <style>スタイルはここに</style>
  </head>
  <body>
    <p>お疲れ様です、Dybe!編集部です。<br>記事アンケートにご協力お願いいたします!</p>
    <h2>Dybe!記事アンケート     </h2>
    <!-- ▼▼記事ここから -->
    <div class="post_container">
      <div class="post_block-text">
        <div class="text">
          <div class="in-pict">
            <img src="画像URLが入ります">
          </div>
          <p>タイトルがここに入ります<br>
          <a href="記事URLがここに入ります">記事URLここに入ります</a></p>
        </div>
      </div>
    </div>

    <!-- ▼▼アンケートここから -->
    <div class="form-style">
      <form action="">
        // フォームの中身がここに入ります
        <button type="submit" name="button" value="送信">内容を送信</button>
      </form>
    </div>
  </body>
</html>

※今回は、②で取得した情報をもとにreplaceでHTMLメールに反映しています。

※スタイルはお好みに。

やったこと④:Googleフォームの要素とHTMLメールのフォーム要素を紐づける

初めはGoogleフォームでの運用を開始していたこともあり、送信した情報がGoogleフォームで回答した結果と合わせて残るようにしたい!ということで、地道にGoogleフォームのIDを紐づける作業……

作成したGoogleフォーム(プレビューモード)にアクセスし、ソースからform actionをみつけてHTMLメールのformにaction=""部分を反映し、

<form action="https://docs.google.com/forms/d/e/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/formResponse" target="_self" method="POST" id="XXXXXX">

あとはひたすら各inputのnameを反映させる、、、

メールアドレスだとname="emailAddress"、他のinput要素は”entry.XXXXXX”という形になっているはずです。

紐づけておけば、メール上で送信したデータがきちんとGoogleフォームに送信されます〜


やったこと⑤:複数の対象者、記事にも対応(おまけ)

下記を考慮して、スプレッドシートに入力することで一度で送信できるように!

  • 1日に複数記事がUPされる

  • 複数人の対象者に送信する

  • 送信対象者を気軽に変更できるように

送信対象者・記事URLの入力例
送信対象者・記事URLの入力例


たどりついたもの

記事のタイトルとアイキャッチ画像をメールに反映した結果のイメージ
フォームのイメージ
記事のタイトルとアイキャッチ画像をメールに反映した結果

メール上でタイトルとアイキャッチ画像が確認できるように!

わざわざフォームに行かずに回答もできるので、回答者の負荷の軽減も期待できるはずです。


今回のボリューム少なめのフォームでも要素の紐づけが面倒だったので、簡単なものでの活用がおすすめです〜



気になった方は、ぜひDybe!の記事も読んでみてください!!!

ten-navi.com



\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

【Windows 10 Pro】業務時間外のPCシャットダウン方法について

お久しぶりです。シスアド 兼 情シス担当のスカイ(甘党)です。

夏ですね~!はい、今回も「あるあるPC管理者の悩み」を書かせて頂きます。

第四回あるあるPC管理者ネタは働き方改革で話題になっている、
業務時間外はPCを強制的にシャットダウンしたい」です。

働き方改革の一環で「PCを強制的にシャットダウンする」ツールを導入した結果、
長時間労働が是正されました!って事例を最近よく聞きますよね。

個人的に、いつ導入検討と言われてもおかしくない状況になってきたかと思います。
終業時間が強制される事により生産性があがるのか疑問ではありますが、
本題へと移りたいと思います。

要件

業務時間外になったらPCを強制的にシャットダウンしたい\(^o^)/

  ※Windows 10 Pro環境で検証済です。
  ※前提条件はActive Directory環境がある事です。
  ※あるある管理者ネタなので新規ツールを導入する予算はないものとします。

はじめに

まず要件を細分化して箇条書きにしてみます。

平日(月~金):勤務間インターバルを11時間で設定。
 A.21:00にPCのシャットダウンを実施する。
 B.08:00~21:00はPCにログオンができる。
 C.21:01~07:59はPCにログオンができない。

休日(土日):簡単に説明がしたいので祝日は除外。
 D.24時間PCにログオンができない。

Aはタスクスケジューラとshutdownコマンドで設定ができます。
B、C、DはActive Directoryを利用して設定ができます。
分けて考えてみると、1つ1つの作業が簡単であることがわかりますね。

設定方法

シャットダウン時間をタスクスケジューラに登録する方法(箇条書き:A)

 ①タスクスケジューラから「タスクの作成」をクリックします。
   [名前]を入力し[セキュリティオプション]を変更します。
  f:id:aimstogeek:20190711155113p:plain

 ②トリガータブを開き「新規」をクリックします。
   [毎週]、[21:00]、[曜日]を変更します。
  f:id:aimstogeek:20190711160033p:plain

 ③操作タブを開き「新規」をクリックします。
   [プログラム]に「C:\Windows\System32\shutdown.exe」と入力し、
   [引数]に「-s -f -t 30」と入力します
  f:id:aimstogeek:20190711155508p:plain

ログオン時間制限設定手順(箇条書き:B、C、D)

 ①Active Directoryで対象ユーザーのプロパティを開きます。
  f:id:aimstogeek:20190711150152p:plain

 ②[アカウント]タブの[ログオン時間]をクリックします。
  f:id:aimstogeek:20190711150208p:plain

 ③月~金の21:00~8:00、土日の全時間を「ログオン拒否」に設定します。
  f:id:aimstogeek:20190711150219p:plain

設定時の動作

業務時間外にログオンを試みますと以下のようになります。
  f:id:aimstogeek:20190711150632p:plain

さいごに

最低限の要件を満たしていますが注意点があります。
Active Directoryを利用する為、社内NWに接続している環境である事が条件です。
 =キャッシュでログオンする際には設定の影響なくログオンができます。

わかりやすく言いますと抜け道があります/(^o^)\
ノートPCであれば自宅に持ち帰りPCを起動しログオンする事が可能です。
※上記で述べたキャッシュでログオンしている為。

ローカルにデータがある状態であれば自宅で仕事ができますので、
データを持ち出される事でセキュリティリスクが高まってしまいます\(^o^)/

PCの持ち出しができない環境のみで有効である手法でした....(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)

今回の案は運用検討時にボツとなりました!失敗あるある~~!!

おまけ

私個人の持論ですが、働き方改革における情シスの役割とは
ITを利用して業務改善を手伝い、便利にしてハッピーにする事だと思っています。



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

デザインの領域から考えるこれからのデザイナーのあり方

f:id:aimstogeek:20190704153930j:plain

こんにちは、デザイナーのachanです。

昨今、グラフィックデザイン・プロダクトデザイン・UIデザイン・UXデザイン・インタラクションデザイン・サービスデザインなど、たくさんのデザインが存在し、 デザイナーに求められる範囲が非常に広くなってきていて、これからのデザイナーのあり方はどう変化するのかと色々考え始めました。

そもそもデザインって何?

一般的に「デザイン=見た目」という意味として捉えている人が多いと思います。
しかし、デザインをめぐる解釈は決して一様ではないので、それは正しい認識だとは言えないと考えています。

デザインについて大辞源ではこう解説されています。

1 建築・工業製品・服飾・商業美術などの分野で、実用面などを考慮して造形作品を意匠すること。「都市をデザインする」「制服をデザインする」「インテリアデザイン」
2 図案や模様を考案すること。また、そのもの。「家具にデザインを施す」「商標をデザインする」
3 目的をもって具体的に立案・設計すること。「快適な生活をデザインする」

大辞林では、

作ろうとするものの形態について、機能や生産工程などを考えて構成すること

Wikipediaでは、

デザインは日本語では「設計」にもあたり、「形態」や「意匠」と訳されてきたが、それだけに限らず、人間の行為(その多くは目的を持つ)をより良いかたちで適えるための「計画」も意味する。

上記の解説の共通点からみると、
デザインは目的意識を持って機能や形態を設計・計画していくということがわかります。

また近年では、「デザイン思考」*1や「スペキュレイティブデザイン」*2などという考え方をよく耳にするので、そこで色々学んだ結果として、
私は「デザイン= 問題解決 + 価値創出」という自分なりの結論に至りました。
f:id:aimstogeek:20190704154116j:plain

デザインの領域

デザインの領域と言えば、一般的には下記のようなものを思い浮かべるでしょう。

  • 建築、インテリア、ステージなどの空間デザイン
  • 乗り物、家電・電子機器などの工業製品のインダストリアルデザイン
  • 広告、エディトリアル、インフォグラフィックなどのグラフィックデザイン
  • 縫製や服飾造形などのファッションデザイン

しかし、これらはまだ伝統的な分野のデザインだと言えます。

コンピューター(計算機)の誕生・発展とともに、デザインの対象は「モノ」から「コト」にシフトしてきました。即ち今まで通りのサービスや製品を提供するだけでは、ユーザーに感動を与えられない時代になっています。
そのため、デザインは下記のような領域に広がっています。

  • UIデザイン(ユーザーインターフェース)
    ユーザーと機械、コンピューターの接触面のデザイン、および接触面において行う操作方法の設計のこと。
  • インタラクションデザイン
    システム開発において、ユーザーの入力操作に対するシステムからの適切な反応を設計すること。利用目的に合致した画面遷移や、GUI 要素の自然な振る舞いをデザインすること。
  • UXデザイン(ユーザーエクスペリエンス)
    ウェブサイトやアプリ、電化製品など、単一のシステムや商品、モノなどを対象としてユーザーが使用する前、使用している間、使用した後までを含めた体験をデザインすること。
  • CXデザイン(カスタマーエクスペリエンス)
    広義のUXデザインと呼ばれている。ウェブサイトやアプリといったプロダクトだけでなく、コールセンターの対応やリアル店舗での接客など、人に関するものも対象となる。
  • サービスデザイン
    基本的にはUX設計に加え、リサーチやアイディア展開、試作等を通してサービスの体験を改善すること。
  • ビジネスデザイン
    デザイン思考という概念を具体的ビジネスに落とし込み、市場分析や財務分析、ビジネスモデルを策定すること。
  • ソーシャルデザイン
    どのような社会を築いていくのかという計画。
    ...

これからのデザイナーのあり方

次々と広がるデザインの領域。
現場では求められる能力が広く複雑になり、何を学び、どんな経験を積んでいけばいいか分からないのが正直なところではないでしょうか。

以前、私自身もデザイナーとして、将来像を見通すことはなかなか難しいと感じていて、今後、実装まで含めたエンジニアリングの部分を強化していくのか、ビジネスレイヤーから思考力を鍛えていくのか、それとも感性や造形の美を追求していくのかを悩んだ時期がありました。

その中で、デザインとテクノロジーの融合を追求する第一人者として知られるジョン・マエダ氏の「Design in Tech Report 2016」からヒントをもらいました。
彼は、これから必要とされてくるデザインとして、 「クラシカルデザイン」「デザインシンキング」「コンピュテーショナルデザイン」の3つを上げています。 f:id:aimstogeek:20190704154253p:plain

  • クラシカルデザイン
    グラフィックやプロダクトといった世間一般認識としてのデザイン。
  • デザインシンキング
    サービスやリサーチといったビジネス領域に踏み込んだデザイン。
  • コンピュテーショナルデザイン
    UIやインタラクションデザインのようなテクノロジー領域のデザイン。

上記の資料から見ると、
デザインはただ美しいものではなく、関連性や有意義な結果をもたらすものが必要だということがわかりました。
特に人間の欲求が日々高次元化していく中、感情意味といったこれまであまり重視されてこなかった部分での差別化が必要になるのではないかと考えています。
即ち、デザイナーは見た目をデザインしていくだけでなく、より体験と絡ませたデザインを提供することが必要になるでしょう。

もちろん、デザイナーは万能ではありません。万能にもなれません。
他の分野のプロはデザイナーがあまり持ち合わせていない考え方をたくさん持っているので、それぞれの強い部分を互いに認識し、組み合わせること(越境するチーム)がビジネスにおいて肝要だと思います。

まとめ

デザインの地位向上に伴って、その役割も複雑化している。
今後、デザインとビジネスの関係性はより深く、より濃くなっていく中、これからのデザイナーにとって、 デザインのイロハというよりも「ユーザー、サービスや事業、組織に対してどのようにデザインで価値を提供するのか」を常に考え、発信、実践すべきではないかと思っています。

ちなみに、弊社はデザイナーを絶賛募集中です!


\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

参考記事

デザインの世界への招待状 #3 拡張するデザイン領域|三宅佑樹 / FORCAS(UZABASE GROUP)|note

クラシカルデザイナーの生きる道|Takamasa Matsumoto|note

*1:デザイン思考とは、経営やマーケティングなど、いかなる種類のビジネスにおいても活用できる「デザイナー的」思考の事を言います。1→10

*2:スペキュレイティブデザインとは、問題解決型のように「未来はこうあるべきだ」と提唱するのではなく、「未来はこうもありえるのではないか」という憶測を提示し、問いを創造するデザインの方法論。0→1

Kibanaでアクセスログをグラフ化してみた

SREのmatsBです。

前回のブログでは、AWSKinesisとElasticsearch Serviceを使ってアクセスログの可視化方法の記事を書きました。
今回はElasticsearchに付随しているKibanaでグラフ化させたいと思います。
初心者向けの記事になっているので、複雑なことはやりません。ご容赦ください。


まずは前回のおさらいです。
Elasticsearchに飛ばすまではこの記事に書かれています。
aimstogeek.hatenablog.com

はじめに

「Index Patterns」など、可視化する上で最低限の設定は出来ているものとします。
今回はSREらしく下記2つのグラフ作成方法を紹介します!

また、弊社がどのようにKibanaを活用してるかの例も紹介します。

ステータスコード「5xx」の発生率をグラフ化

visualizeで新規グラフ作成

「visualize」から新規でグラフを作成します。
今回は割合を見たいので「Pie」を選択します。

f:id:aimstogeek:20190629171602p:plain
Select visualization type


使うIndexを選択

可視化したいIndexを選択します。
諸事情でIndex名を出せないのですが、弊社サービスのアクセスログを選択しました。

f:id:aimstogeek:20190629172112p:plain
Select Index


グラフを定義

割合を出したいので「Metrics」の「Aggregation」を「Count」にします。
「Buckets」は「Split Slices」にします。
「Aggregation」の「Range」を選択。*1
「Field」の「status」を選択
1つ目のfromは「200」を入力し、toは「499」*2を入力
2つ目のfromは「500」を入力し、toは「599」*3を入力

f:id:aimstogeek:20190629173553p:plain
New Visualization


グラフを出力

入力が終わったら、再生ボタンみたいなマークを押します。
入力に問題がなければそのままグラフが表示されます。
「Options」で円の形を変えたり出来ますし、画面右上で「Last 7 days」などの対象の期間を選ぶ事が出来ます。

f:id:aimstogeek:20190629174036p:plain
グラフ完成


グラフを保存

グラフを確認する度にこの作業をするのも現実的ではないので、一度作ったら保存します。
「SAVE」タブを押せば保存画面になるので、自分にとって覚えやすい名前を入力して保存します。
これで「Visualize」に保存されるので、好きなタイミングでステータスコード「5xx」の発生率を見ることが出来ます。

f:id:aimstogeek:20190629174449p:plain
save


レスポンスタイム1秒以上のリクエスト発生率をグラフ化

操作手順については「ステータスコード「5xx」の発生率をグラフ化」とほとんど同じです。
なので、唯一違いがある「グラフを定義」するところだけ紹介します。

グラフを定義

「Field」の「response_time」を選択
1つ目のfrom「0」を入力し、to「999999」*4を入力
2つ目のfrom「1000000」を入力し、toは空欄*5にします。

f:id:aimstogeek:20190629175646p:plain
response_time

「グラフを保存」して、完了となります。
※「ステータスコード「5xx」の発生率をグラフ化」と同じ

オリジナルのDashboardを作る

各グラフを1つ1つ見るのもいいのですが、一つの画面で複数のグラフを見たい場面も多いと思います。
複数Visualizeを1箇所で見るためにDashboardを作ります。


Dashboardを新規で作成

Dashboard画面に移って、新しいダッシュボードを作成します。
「Add」を押すと好きなVisualizeを追加出来ます。

f:id:aimstogeek:20190629180500p:plain
New Dashboard


Visualizeを追加

表示させたいVisualizeを選択します。
選択すると画面の下の方に作成したVisualizeが追加されていきます。
ここでの説明は割愛しますが、ダッシュボードもVisualizeと同じように名前を付けて「SAVE」できるので、作ったら保存しましょう。
弊社では各サービス毎に「ステータスコード「5xx」の発生率」と「レスポンスタイム1秒以上のリクエスト発生率」を出しているので、サービスの数だけグラフを作っています。

f:id:aimstogeek:20190629181222p:plain
Editing New Dashboard

保存が完了するとDashboard画面に作成したDashboardが表示され、いつでも見られるようになります。
f:id:aimstogeek:20190629181813p:plain
Dashboard


Dashboardの完成

Dashboardのオプションで「Use dark theme」というのがあり、無意味にチェックを付けてみました。
SLOやSLAを考える上で年間を通しての稼働率を重視するので、見る期間を「Last 1 year」にしています。

f:id:aimstogeek:20190629182202p:plain
稼働率計測


まとめ

簡易的ではありますが、年間どのぐらいの障害が発生しているのかを見られるようになりました。
このデータやグラフを元になんの対策をするのかなどを決めて、順次対応していくようにしています。
まだまだ簡易版なのでこれからもっとちゃんとした計測を進めていく予定です。

さいごに

弊社の開発チームがいつも見ているKibanaの画面を紹介します。
とあるサービスのアクセスログをグラフ化したものですが、状況の把握などに使います。

  1. インスタンスステータスコードのカウント
  2. サービス全体での5xxエラーカウント
  3. インスタンス毎の平均レスポンスタイム
  4. サービス毎のステータスコード
  5. サービス全体で発生した5xxエラーリクエストの詳細
  6. サービス全体で発生したレスポンス1秒以上のリクエストの詳細

f:id:aimstogeek:20190629183550p:plain
Dashboard
とても便利!これがあればリリース時に問題が発生してもすぐに対応できるはず!!
これからも、より良いサービスを作るための環境や土台に全力を尽くそうと思います。


\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

*1:statusを数値型にしています

*2:ステータスコードの200~499の意味

*3:ステータスコードの5xxの意味

*4:マイクロ秒表記で1秒未満の意味

*5:マイクロ秒表記で1秒以上の意味

基幹システム改修プロジェクトのカットオーバーを迎えたのでKPTで振り返ってみたよ

こんにちは。
サービスプランナーとして日々成長させていただいてます、コッティです。

ブログを書いている本日6/20は東京五輪のチケット抽選結果発表の日ですね!
皆さんは応募されましたか?

私は総額15万円分のチケットに応募しましたが、全部外れてしまいました・・
悲しさしかない。

さて、少し前の話にはなるのですが、表題にあるとおり、
基幹システム改修プロジェクトのカットオーバーを迎えました。
カットオーバー直後は問い合わせやら何かしらバタついたところもあったのですが、
少し収束してきたところで振り返りのKPTを実施しました。
seleck.cc
せっかくなので、プロジェクトとKPTで挙がった話について少し紹介したいと思います。


プロジェクトの概要

  • 基幹システムの改修プロジェクト
  • システム全体の大部分のプログラムに対して何かしら変更が発生
  • 全体の実績工数 23人月
  • 業務や基幹システムに関する知見の浅いメンバーが大半


開発期間

  • 2018年9月~2019年5月

KPTの実施結果

Keepの内訳

f:id:aimstogeek:20190620170133p:plain

keepの7割以上を占めたのがコミュニケーションでした

  • 週次での共有会を実施して情報の格差を最小限にした
  • 気軽にチャットや口頭ベースでの共有、相談が出来ていた


会話のハードルを下げたことが振り返りに現れたかと思います。

また、プロジェクトを通して、メンバー間で開発を前向きに楽しみながら、
実施できていたように感じました。

Problemの内訳

f:id:aimstogeek:20190621085414p:plain

4割が開発の進め方について、3割がプロジェクトの管理についてという内訳でした。

  • 開発を進める上でボトルネックが発生していた
  • プロジェクト管理ツールを活用する意識が低かった
  • 全体像を把握するのにツール以外の方法で実施していた


上記3点が主な要因かと思います。
属人化の課題はわかっていてもなかなか修正しきれなかったです。
特にプロジェクト管理のところは管理者しか見えていないところがたくさんあって、
もっと上手く見える化すべきだったと反省しているところです。


Tryの内訳

f:id:aimstogeek:20190620170237p:plain

Problemでも多かった、プロジェクト管理や開発の進め方のところが主に挙げられておりました。
今後に向けて日々精進ですね。


まずはこの辺から着手していきたいなと思ってます。

最後に

改めてプロジェクトを振り返ってみると、
メンバーに恵まれて楽しく物事を推進することが出来たなぁとしみじみ思います。

プロジェクトを円滑に進めるためには王道ですが
下記2点がほんとに鍵になると実感しました。

  • コミュニケーションのハードルを下げる
  • いかにボトルネックを無くすか


カットオーバーを迎えられたことでほっとした感はありましたが、
KPTでもあるように、まだまだ改善点もたくさん見えました。

また、プロジェクトのゴールはカットオーバーではなく、
その先にある目的を達成することだと思います。

カットオーバーはあくまでもスタートライン。
そこから目的達成に向けていろんな仕掛けをしていきたい、
そんなことを日々考えています。

おまけ

個人的にはこの2つのコミュニケーションがとても楽しかったです。

ブランチ切り替え時にチャット上で叫ぶ

なにげにKeep事項にも挙げられてました!
f:id:aimstogeek:20190620170837p:plain

要所で謎ポエムを入れる

探したのですが、ブログに載せられそうなのがこれぐらいしか無かった・・・


f:id:aimstogeek:20190621085621p:plain



\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp