ホーム ブログ ページ 11

10分で大体わかる!「Googleオプティマイズ」

0

1.はじめに

はじめまして。2021年新卒の手塚です。手塚健介です。

昨年終わりごろからインターンとしてアピリッツに勤めておりまして、いくつかのサイトのアクセス解析を担当したり、ヒアリングの場に立ち会ってきました。その中で印象深いことというと、クライアントから「サイトをリニューアルして、売上を伸ばしたい」といったお声が多かったことでした。

さて、ECなどのWebサイトのデザインを改善するとき、最も不安になることといえばなんでしょうか。

答えは「作成したページは本当に使いやすいのか」です。

色々時間と費用をかけてサイトをリニューアルしても、いざ公開した際にこれまでよりアクセスが伸びない、ましてや売上が落ちたらリニューアルした意味が無くなってしまいます。先述のクライアントの方々も、そうした不安を抱えていました。

そこでUIやデザインのリニューアルを行ったことでWebサイトが本当に使いやすくなったのかどうかを知りたくないでしょうか?

こういった場合、「A/Bテスト」というサイト改善効果を確かめるWebテストを行うことが有効です。

ただ、「A/Bテスト」を行うには、

  • 訪問ユーザーの振り分け
  • アクセスデータの計測
  • サイトの成果の自動最適化

以上の3つの課題がありました。これらをクリアするには高い開発力やデザイン力、分析能力が求められます。そのため自社内だけでテストを完結させることは難しく、工数も費用もかさんでしまいました。結果として「A/Bテスト」を行うことができた企業は限られていました。

しかし、「Googleオプティマイズ」というツールが登場したことで誰もが簡単に「A/Bテスト」を行えるようになったのです。実際、「Googleオプティマイズ」の導入を現在検討中ないし実装に向けた準備を始めてくださったクライアントもいらっしゃいます。

今回は、「10分で大体分かる」をモットーに新卒の目線から「A/Bテスト」そして「Googleオプティマイズ」の強みについて、これからWebをよりよくしていきたい!という方のためにご紹介します。まだすべての機能を使いこなせているとはいえない勉強中の身ではありますが、よろしくお願いします。

2.「A/Bテスト」とは?

1)「A/Bテスト」の概要

「A/Bテスト」とは、Webサイトを制作、改良する際に行われる工程の一つで、「同じページで複数のパターンを用意し、どちらがより良い結果を得られるか」を検証するテスト手法です。

例えば、あなたはECサイトの管理人で、サイトの売り上げ向上のためにTOPページを改良したいとします。この時、元のページのデザインをパターンA、パターンAから一部を変更したページをパターンBとします。

「A/Bテスト」では、サイトを訪問したユーザーに対してこの複数パターンあるページをランダムに表示します。その結果、ユーザーはパターンB、改良したときの方が購買行動が活発になることがわかりました。これで安心してサイトのリニューアルは効果的だということがわかり、サイトのリニューアル版を自信をもって公開することができました。

まとめると以下のようになります。

  • 「A/Bテスト」とはWebサイトを制作、改良する際に行われる工程の一つ
  • サイトの改案が本当に効果があるのかどうかを検証するために必要な工程

2)「A/Bテスト」の特徴(多変量テスト)

サイトのリニューアルは一部分を変えるだけにとどまりません。特集したい商品の見出しや、商品画像の組み合わせをテストしたいことも多いでしょう。ただし、一つ一つの組み合わせを「A/Bテスト」で判断していては余計な時間とコストがかかってしまいます。

そうした場合におすすめな手法が「多変量テスト」です。

「多変量テスト」は、複数の要素を変更したいときに「どの組み合わせが最良の結果をもたらすか」を検証するテスト手法です。同時に複雑な組み合わせをテストすることができるため、デザインの相互作用により、より多くの情報を得ることが可能となります。そのため、中規模~大規模のサイトリニューアルを行いたい場合で有効なテストといえます。

まとめると以下のようになります。

  • 「多変量テスト」とは複数要素の組み合わせを同時にテストし、最良の結果が得られる組み合わせを検証する手法
  • デザインの相互作用からより多くの情報を得られる

3.「Googleオプティマイズ」とは?

Googleオプティマイズ公式ロゴ。 めっちゃ格好いい。

1)「Googleオプティマイズ」の概要

「Googleオプティマイズ」を簡単に説明しますと、「Googleが提供している基本無料で誰でも利用可能なテストツール」です。Googleのアカウントさえあれば、個人、法人関係なく誰でも「A/Bテスト」を実施することが可能です。

「Googleオプティマイズ」はブラウザ上のレイアウトやテキストなどを、直感的な操作で編集することができ、編集した要素の「A/Bテスト」「多変量テスト」を簡単に行うことができます。また、「テストを行う対象ユーザーのターゲティングが可能」であり、例えば都内からのアクセスに対してのみテストを実行したり、20~30代の年齢層に対してのみテストを実施したり、などが可能になります。こうしてWebサイトの最適化を手軽に行うことが可能です。

よって現在、「Googleオプティマイズ」は「A/Bテスト」を行ううえで広く用いられいる一般的なツールです。

2)「Googleオプティマイズ」のメリット

「Googleオプティマイズ」を使う際のメリットは以下の5つです。

①無料ツールである

「Googleオプティマイズ」は、他のGoogleが提供するGoogleアナリティクスや、Googleタグマネージャーと同様に、Googleアカウントさえあれば基本的に無料で利用可能なツールです。他にもWebテストが行えるツールがありますが、その場合有料になってしまったり、無料ツールだとしても機能が少ない場合が多いです。

無料なのに多機能で使いやすい。これが「Googleオプティマイズ」の大きな強みです。

②Googleが提供する他ツールと連携可能

「Googleオプティマイズ」は、それ単体ではほとんど意味がありません。テストを実施し、結果を得るには「Googleアナリティクス」と連携する必要があります。

Googleアナリティクスとは、Webサイトのアクセス状況を収集する解析ツールです。アナリティクスと連携することでテストの実施、結果の集計が可能となります。他にも、ネット広告の成果の解析や広告管理を行えるツール「Google広告」と連携することでテスト時のターゲットとして広告から訪問したユーザーを指定できます。

このように、Googleの他ツールと連携することで、テストをより効果的に行えるわけです。

③実装に必要な工数・コストを削減

「A/Bテスト」「多変量テスト」を行う際、もし「Googleオプティマイズ」を使用しないと、テストの実施難易度はぐっと跳ね上がります。

例えば

  • テストの度に制作会社に依頼する必要があるため、費用が生じる
  • テストページを用意する必要があり時間がかかる
  • サイト改変による売上低下のリスクがある

以上の課題があり、簡単に実施できるものではありませんでした。

「Googleオプティマイズ」は最初の設定・導入さえ行えば、あとはスムーズにテストが可能となります。そのため、自社内でもテストが行えるようになり、テスト実施までの工数と費用の削減が実現します。

④テスト結果の集計・比較が容易

「Googleオプティマイズ」では実施したテストの結果は自動で集計され、簡単にレポート作成できます。さらに、重要なテストの指標とである「セッション数・コンバージョン数・コンバージョン率」をひと目で比較可能になりました。

⑤SEO・広告スコアに影響しない

「Googleオプティマイズ」は、URLを改変することなく「A/Bテスト」を実施できます。そのため、URL情報が大きく影響する検索結果の順位や、WEB広告にも影響を与えません。テスト中のアクセスはテスト前同様、オリジナルのページに対する評価として集計されます。

3)「Googleオプティマイズ」のデメリット

ここまで、「Googleオプティマイズ」のメリットをご紹介しましたが、いくつかデメリットも存在します。とはいっても、ここで紹介するデメリットは対策可能なものであり、大きな問題になることは基本的にありません。

「Googleオプティマイズ」のデメリットは、以下の2つです。

①テスト中のユーザビリティ低下リスク

ユーザビリティとは、国際規格では「ある製品を、特定の利用者が、特定の目的を達成しようとするにあたって、特定の状況で、いかに効果的に、効率的に、満足できるように使えるかの度合い」として定義されています。Webサイトにおいては、「サイトの分かりやすさ」を示す指標の一つということです。

「Googleオプティマイズ」を用いてテストを行っていると、ページの読み込み速度の低下、画面のちらつき(フリッカー)が生じる恐れがあります。こうした現象がユーザビリティの低下を招き、セッション数や、コンバージョン数などが低下、結果的に適切な計測ができなくなる可能性があります。

この問題の対策は、サイト内に以下のような「アンチフリッカー スニペット」と呼ばれるタグを設置することです。

(例)

このタグを埋め込むことで上記の問題を軽減することが可能になります。

②テスト後の効果検証が不十分となる恐れ

先ほど紹介したメリット④「テスト結果の集計・比較が容易」と一見すると矛盾するこのデメリットですが、実際のところほとんど問題にはなりません。

といいますのも「Googleオプティマイズ」単体ではテスト後の検証が難しいという点は確かにデメリットですが、こちらはGoogleアナリティクスと連携することで定量的な検証が可能になるうえ、設定時にアナリティクスとの連携が必要になるため、ほぼデメリットとは言えないものです。

ここまでデメリットについてお話ししましたが、まとめると

  • テスト中はアクセス時に問題が起きることがあるが、タグ設置により修理可能
  • 「Googleオプティマイズ」単体ではほぼ意味がないが、アナリティクス導入で解消される

以上のように、比較的容易に解消できるものといえます。

4.「A/Bテスト」「多変量テスト」の進行イメージ

ここまで、テストについて、「Googleオプティマイズ」についてご説明しましたが、実際にテストを行う際、どういった流れで進めていくのでしょうか。

今回はアピリッツが過去に「Googleオプティマイズ」を使ってテストした際の流れをアレンジしたものをもとにお話しします。

そのため、以下の工程の期間は案件の規模によって変動します。

1)要件定義

要件定義では

  • テスト対象ページ
  • 実施するテスト
  • 作業工数
  • 各作業担当者
  • テストの目的

を定め、要件定義書としてまとめます。

これが今後の作業のベースとなり、1~2週間程度かけて行います。

2)仮説立案

①と同時に行われることもあります。

この工程では、ユーザビリティ向上のためにどのようにサイトを改善するか、といったより具体的な方向性を定めていきます。

この工程は3~5日程度かかります。

3)パーツ作成

仮説が決まったら次は仮説に応じたデザインパーツや、フレーズを考えます。

この工程は規模にもよりますが、長くとも1か月程度を想定します。

4)実装

ここまでの工程で決めたことを実際に「Googleオプティマイズ」で実行します。

③で制作したデザインパーツをツール用に調整したうえで、「Googleオプティマイズ」の管理画面を設定し、実際にテストを開始します。

この工程は設定、テスト開始までのため、1日で可能です。

5)効果測定

実装からある程度期間をあけて、蓄積したデータに基づき目標を達成したかどうかを分析する工程です。

導き出した結果の要因分析を行い、問題なければテスト終了、さらに改善可能な場合は次のテストに向け、工程②「仮説立案」を再び行います。

テスト期間を含めて、最低でも1か月余はかかる工程です。

こうして②~⑤の工程を繰り返すことでWebページが最適化されていきます。基本的には以上の工程でテストは終了ですが、アピリッツではさらにもう1つの工程を実行いたします。

6)レクチャー

ここまで進めてきた工程や、「Googleオプティマイズ」についてなどの知見を踏まえ、今後類似した「A/Bテスト」「多変量テスト」を行う際はアピリッツを介さずともある程度クライアント内で完結できるようにセミナーを実施いたします。また、アピリッツはその後もテスト実装だけでなく、運用時のサポートデスクとしても対応します。

こちらは任意の1日を期間として設定しました。

ここまでをまとめますと、次の通りです。

  • 要件定義でサイト改善の方針やコストを定める
  • 仮説検討でより具体的な仮説を設定する
  • そののちにデザインパーツを制作する
  • 実際に導入し、テスト開始
  • 本当に効果があったかどうかを検証
  • 最適解が見つかるまで仮説~検証を行う
  • 内省化できるようにサポート体制を整える

5.おわりに

今回は「A/Bテスト」「Googleオプティマイズ」について、なるべくざっくりご紹介しました。

「A/Bテスト」はもともと、複数の企業と連携しながら進行するため、工数も費用も多くかかってしまい、多くの企業で実施することが困難な作業でした。ですがこの課題は「Googleオプティマイズ」の登場によって解消し、多くの企業だけでなく、個人でWebを運用している方にも「A/Bテスト」が浸透するようになりました。

もしこの記事を通して「Googleオプティマイズ」にご興味を持っていただき、実際に始めてくださる方がいらっしゃれば幸いです。そのうえで運用においてご不明点が生じたり、今よりもサイトを改善していきたい、と思われる方はアピリッツにお声がけください。

アピリッツは、Webコンサルタントとして「Googleオプティマイズ」を用いたテストのご提案だけでなく、テスト時に必要なデータ基盤構築、アクセス解析、デザインパーツの制作などもできるメンバーがそろっており、より効率的にWebサイトが改善できるようご支援いたします。

アジャイルソフトウェア開発の奥義

0

はじめに

私は、本を紹介したいと思います。紹介する本は、
アジャイルソフトウェア開発の奥義 オブジェクト指向開発の神髄と匠の技 第2版」です。
この本に出てくるコードは、javaとC++で書かれています。
この本は、アジャイル開発・SOLID原則・デザインパターン・パッケージ設計の原則に
ついて学ぶことができます。

私がこの本を読もうと思ったきっかけは
美しいコードを書けるようにないたいと考えるようになったからです。
というのも、学生時代に作成したコードを見返したときに
「なんて汚い読みにくいコードなんだ!!」と衝撃を受けたのがきっかけです。

この本を読んでのSOLID原則について、私なりに簡単に説明したいと思います。
ただ、プログラミング初心者には、少し難しい内容になっています。
SOLID原則とは、オブジェクト指向に即してコードを整理するための5つの原則で
それぞれの原則の頭文字をとってこう名付けられています。以下、順に紹介していきます。

単一責任の原則(SRP)

クラスを変更する理由は1つ以上存在してはならない

こちらは、SRPに違反しているコードです。

public class Employee {
	String itsName;
	int itsAge;
	FileWriter fileWriter;

	public void setName(String name) {
		itsName = name;
	}

	public String getName() {
		return itsName;
	}

	public void setAge(int age) {
		itsAge = age;
	}

	public int getAge() {
		return itsAge;
	}

	public void save() {
		try {
			fileWriter = new FileWriter("employee.csv");

			fileWriter.append(itsName);
			fileWriter.append(",");
			fileWriter.append(String.valueOf(itsAge));
			fileWriter.append("\r\n");

			fileWriter.flush();
			fileWriter.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

このコードは、変更する理由を2つ持っています。

  • 「従業員情報管理」と「従業員情報をcsv出力」という2つの役割
  • この2つの役割は、それぞれ別の理由で変更される

これが、SRPに違反している状態です。
このクラスを複数のクラスが利用していて従業員情報に変更があった場合

  • saveメソッドだけを使用しているクラスもリビルド、再テスト、再ロードすることになる
  • うっかり忘れると、アプリケーションの振る舞いが予測不可能な状態になる

では、どのようにすれば良いか。

public class Employee {
	String itsName;
	int itsAge;

	public void setName(String name) {
		itsName = name;
	}

	public String getName() {
		return itsName;
	}

	public void setAge(int age) {
		itsAge = age;
	}

	public int getAge() {
		return itsAge;
	}

	public return getExcelString() {
		return itsName + "," + String.valueOf(itsAge) + "\r\n";
}


public interface EmployeeSaveInterface {
	public void save(Employee employee);
}

public class EmployeeSave implements EmployeeSaveInterface{
	public FileWriter fileWriter;

	public void save(Employee employee) {
		try {
			fileWriter = new FileWriter("/employee.csv");

			fileWriter.append(employee.getExcelString());

			fileWriter.flush();
			fileWriter.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

このようにすることで、従業員情報を変更するときは、Employeeクラスを変更して
saveメソッドを変更するときは、EmployeeSaveクラスを変更するようになります。
それぞれのクラスの変更理由が1つになります。

そもそも、役割とは、何なのかという人もいると思います。
「変更理由=役割」ということです。
いくつか機能を持っているクラスでも、同じ変更理由で変更されるのであれば
そのクラスの役割は、1つということになります。

オープン・クローズドの原則(OCP)

ソフトウェアの構成要素(クラス、モジュール、関数など)は拡張に対して開いて(Open)いて、
修正に対して閉じて(Closed)いなければならない

こちらは、OCPに違反しているコードです。

public class DrawingTool {
	public void drawAllShapes(ArrayList<String> list) {
		Circle circle = new Circle();
		Triangle triangle = new Triangle();
		for(int i = 0; i<list.size(); i++) {
			switch (list.get(i)) {
				case "Circle":
					circle.drawCircle();
					break;
				case "Triangle":
					triangle.drawTriangle();
					break;
			}
		}
	}
}

public class Circle {
	public void drawCircle() {
		System.out.println("Circle");
	}
}

public class Triangle {
	public void drawTriangle() {
		System.out.println("Triangle");
	}
}

このコードは、修正に対して閉じていません。
注目してほしいのは、drawAllShapesメソッドのswitch文です。
ここに新しい図形クラスを追加しようとすると以下のようになります。

  • switch文に新しい図形クラスに対応する処理を追加
  • 機能を拡張しようとすると、既存のクラスを修正しなければならない状態
  • 図形を追加する度にswitch文を修正するのは、手間が掛かる

これが、OCPに違反している状態です。
では、どのようにすれば良いか。

public class DrawingTool {
	public void drawAllShapes(ArrayList<Shape> list) {
		for(Shape shape : list) {
			shape.draw();
		}
	}
}

public abstract class Shape {
	public abstract void draw();
}

public class Circle extends Shape {
	@Override
	public void draw() {
		System.out.println("Circle");
	}
}

public class Triangle extends Shape {
	@Override
	public void draw() {
		System.out.println("Triangle");
	}
}

このコードは、修正に対して閉じています。
このように各図形のクラスに共通のメソッドを継承させることで、新しい図形を追加する場合

  • 新しい図形クラスでShapeクラスを継承して
    新しい図形クラスでdrawメソッドをオーバーライドするだけで済む
  • drawAllShapesメソッドに変更を加える必要はない
  • 既存のクラスへの影響を気にせず、クラスを追加するだけで機能を拡張できる

これが、OCPに準拠している状態です。

リスコフの置換原則(LSP)

派生型はその基本型と置換可能でなければならない

こちらは、LSPに違反しているコードです。

public class Rectangle {
  private int itsHeight;
    private int itsWidth;

    public void setHeight(int height) {
    	itsHeight = height;
    }
    public void setWidth(int width) {
    	itsWidth = width;
    }

    public int getArea() {
    	return itsHeight * itsWidth;
    }
}

public class Square extends Rectangle {
	private int itsHeight;
	private int itsWidth;

	public void setHeight(int height) {
		itsHeight = height;
		itsWidth = height;
	}

	public void setWidth(int width) {
		itsHeight = width;
		itsWidth = width;
	}

	public int getArea() {
		return itsHeight * itsWidth;
	}
}

Rectangle.setHeight(20)    Square.setHeight(20)
Rectangle.setWidth(30)     Square.setWidth(30)
Rectangle.getArea() => 600  Square.getArea() => 900

このコードは、Rectangle(基本型)とSquare(派生型)のgetAreaの振る舞いが変わっています。

  • SquareとRectangleでgetAreaを同じ方法で呼び出した結果が同じにならない
  • Squareは、Rectangleと置換が不可能

これが、LSPに違反している状態です。
では、どのようにすれば良いか。

 public interface Shape {
	public void setHeight(int height);
	public void setWidth(int width);
	public int getArea();
 }

 public class Rectangle implements Shape {
	private int itsHeight;
        private int itsWidth;

        public void setHeight(int height) {
    	         itsHeight = height;
        }
        public void setWidth(int width) {
    	         itsWidth = width;
        }

        public int getArea() {
    	        return itsHeight * itsWidth;
        }
 }

 public class Square implements Shape {
	private int itsHeight;
	private int itsWidth;

	public void setHeight(int height) {
		itsHeight = height;
		itsWidth = height;
	}

	public void setWidth(int width) {
		itsHeight = width;
		itsWidth = width;
	}

	public int getArea() {
		return itsHeight * itsWidth;
	}
}

RectangleとSquareを継承を使わずに分離します。
しかし、似たような性質を持っているため、完全には分離しないようにします。

  • 派生型が基本型に置換可能ということは、拡張に対して開いており、
    修正に対して閉じていることを表している

LSPに準拠することでOCPを準拠することができます。

インターフェース分離の原則(ISP)

クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない

こちらは、ISPに違反しているコードです。

 public interface Motion {
	public void fly();
	public void run();
	public void swim();
 }

 public class Human implements Motion {
	public void fly() {
		System.out.println("飛ぶ");
	}

	public void run() {
		System.out.println("走る");
	}

	public void swim() {
		System.out.println("泳ぐ");
	}
 }

このコードは、Humanクラスを作成したときにMotionを実装すると、
Humanクラスでは、必要としないメソッドの実装を強制されます。
必要としないメソッドは、flyメソッドです。
人は、空を飛びませんよね? 

  • 利用しないメソッドを実装していると、そのメソッドの変更の影響を受ける可能性がある
  • 利用しないメソッドであれば、本来その変更に無関係なはずだが、それを実装していると不用意に影響を受けてしまう

これがISPに違反している状態です。
では、どのようにすれば良いか。

 interface MotionFly
 {
     public void fly();
 }

 interface MotionRun
 {
     public void run();
 }

 interface MotionSwim
 {
     public void swim();
 }

このように、必要としないメソッドがある場合は、インターフェースを細かくして、
分離することです。そして、必要なメソッドだけを実装するようにします。

  • 無関係なメソッド、クラスからの変更の影響を受けることがない

これが、ISPに準拠している状態です。

依存関係逆転の原則(DIP)

a. 上位のモジュールは下位のモジュールに依存してはならない
どちらのモジュールも「抽象」に依存すべきである
b. 「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである

こちらは、DIPに違反しているコードです。

 public class Button {
	private Lamp itsLamp;

	public Button(Lamp lamp) {
		itsLamp = lamp;
	}

	public void pull() {
		if(!itsLamp.getStatus()) {
			itsLamp.turnOn();
		} else {
			itsLamp.turnOff();
		}
	}
 }

 public class Lamp {
	private boolean itsStatus = false;
 
 	public void turnOn() {
 		itsStatus = true;
 		System.out.println("ON");
 	}

 	public void turnOff() {
 		itsStatus = false;
 		System.out.println("OFF");
 	}

 	public boolean getStatus() {
 		return itsStatus;
 	}
 }

このコードは、Buttonクラスは、Lampクラスに依存しています。
Lampクラスは、「実装の詳細」であり、「抽象」ではありません。

  • ButtonクラスがLampクラスという「実装の詳細」に依存していると、
    ButtonクラスはLampクラスしか扱えない
  • Buttonクラスを他のクラスで使用することが出来ない

これが、DIPに違反している状態です。

では、どのようにすれば良いか。

 public interface ButtonInterface {
	public void turnOn();
	public void turnOff();
	public boolean getStatus();
 }

 public class Button {
	private ButtonInterface itsLamp;

	public Button(ButtonInterface lamp) {
		itsLamp = lamp;
	}

	public void pull() {
		if(!itsLamp.getStatus()) {
			itsLamp.turnOn();
		} else {
			itsLamp.turnOff();
		}
	}
 }

 public class Lamp implements ButtonInterface {
	private boolean itsStatus = false;

	public void turnOn() {
		itsStatus = true;
		System.out.println("ON");
	}

	public void turnOff() {
		itsStatus = false;
		System.out.println("OFF");
	}

	public boolean getStatus() {
		return itsStatus;
	}
 }

このように抽象クラスであるButtonInterfaceクラスを作成して、
ButtonクラスをButtonInterfaceに依存させることで「抽象」に依存させることができます。

  • ButtonInterfaceクラスを実装することで、どのクラスでもButtonクラスを利用できる

これが、DIPに準拠している状態です。

おわりに

私自身もまだ完全に理解はできていませんが、自分がコードを書くとき
コードレビューをするときに、ただコードを書く、読むだけではなく
どのように書いているかを見るようになりました。

プログラミングを一通り経験した方でしたら、とても参考になり、
コードの見方やコードを書く時の意識も変わります。ぜひとも購入してみてください!

参考資料

オブジェクト指向設計の原則
SOLID原則について簡単に書く

社内勉強会のご紹介:Linux初心者向け読書会「サーバの基本 勉強会」

0

アピリッツの22期のテーマは「DX推進&デジタル人材育成」です。組織の成長と社員の育成のために、各職種の勉強会を推進しています。今回はそのなかのひとつ、「サーバの基本 勉強会」についてご紹介します。こちらはLinuxを基本としたサーバ技術を学ぶための初心者向け読書会で、社内のエンジニアが続々と参加しています。(2021年4月 取材)

Linuxを基本としたサーバ技術に明るくなるための楽しい勉強会

「サーバの基本 勉強会」はデジタルイノベーション部のエンジニア・渡辺さんが主催です。こちらの勉強会の目標や対象は以下の通り。

「サーバの基本 勉強会」とは

Linuxを基本としたサーバ技術に明るくなるための、楽しい勉強会です。
目標:自信を持ってサーバ管理に取り組めるPRO(プロフェッショナル)になること
指標:LPIC lv1の教科書を理解できるぐらいになること
対象:Linuxのなんらかのコマンドを打ったことがない人、なくはないけどサーバに障害が起きたとき切り分けであわててしまう人

毎週木曜日の19時~20時で開催し、基本オンラインでの参加となります。課題図書・各回の担当者を決め、担当者が事前準備をおこない、読書会にのぞみます。(なお、課題図書の購入では会社の書籍購入支援制度を利用できます。社員のみなさんはどんどん活用してくださいね!)

事前準備の情報共有や参考になりそうな書籍の紹介、そのほか勉強に役立ちそうなTipsは、社内のSlackチャンネルでやりとりしています。

読書会形式を選んだ理由は?

ところで、どうして「サーバの基本 勉強会」は読書会形式なのでしょう? 主催の渡辺さんと、第4回の発表者の一人だった栗山さんにお話を聞いてみました。

実際の発表会の様子。

渡辺:まず、この勉強会の目的は、若手エンジニアが運用・保守の業務に自信を持って取り組めるようになってもらうことです。サーバ管理を落ち着いて自信を持ってできるようになってほしいなと考えて企画しました。

栗山:サーバ周りの知識は、業務でも自己学習でも必ず求められます。自分はまだ初心者なので「勉強が必要だな、いつどうやって始めよう?」と考えていたところ、社内のSlackで「こんな勉強会があるらしいよ」と教わって、参加することにしました。

―― Webソリューション事業のエンジニアが続々と参加していますね。

栗山:はい。私はプログラミングスクールを卒業してアピリッツに入りました。ですから、もっと知見を広げていきたいですし、社内のいろんなエンジニアとつながりを持ちたかったので、そういった意味でも勉強会はいいなと思いました

渡辺:やる気もりもりの参加者のみなさんが進んで発表をしてくれるので助かっています。

栗山:どういう風に発表資料を作ったらわかりやすいかな? どういうトーンで話せば耳に残りやすいかな? など、聞き手のことを考えながら準備に取り組んだので、社内の勉強会とはいえ緊張感がありました。

渡辺:勉強会のために事前に準備をし、質問に対して答えたり、問題解決を行う、という手順は、じつは本番作業とも共通しています。自由課題形式やその場でハンズオンする形式などと比べ、よりリアルな経験を安全に積んでもらう、という意図で読書会形式を選びました。

―― 一人で勉強することと、読書会で勉強することの違いはどんなところでしょう?

栗山:自分一人で参考書を読んで勉強するよりも、疑問を投げかけて、みんなと一緒に考えながら読み進められる読書会は心強いです。

そして、実際に発表してみると「読んで覚えることも、話して覚えることもできる」ってとても良いことなんだなと感じました。理解がより深まります。それまで簡単だと思ってきた内容でも、発表ではうまく説明できなかったり、わかっていなかったところが浮き彫りになったんです。

基礎的な内容でも副読本で深堀り

―― 栗山さん、発表は緊張しましたか?

栗山:はい。笑 準備をしていたのに、思っていたより全然言葉が出てこなくて。特に実際にコマンドを打って挙動を確認する部分はみんなに見られてると思うとあたふたしました。

実行画面を見ながら「ここは、こう書いたらどうなる?」「実際の業務だと、みなさんどうしていますか?」など渡辺さんからのアドバイスや問いかけが入ります。

渡辺:「自分も学ぶぞ」という意識で参加しています。勉強会で取り扱うのは基礎的な内容なので、予習する側は、その範囲のテキストをただ読んで実施するだけならばすぐに予習が済むんです。ですが、副読本を4冊くらい併読して深堀りすると、必ず知らないことが出てきます

読書会直前の渡辺さん。たしかに副読本でフル装備でした。

渡辺:ですから、勉強会の参加者の中で自分がすべてにおいて一番詳しいということはないんですよね。学んだことは新鮮な気持ちでメンバーにも伝え、さらにフィードバックをもらうことが重要だと考えています。

栗山:自分の認識が正しいのか確認してもらえる場なので、参加してよかったです。身につけた知識をより強固なものにできますし、ちょっとした疑問を解決できます。

業務や部署を越えて社員が参加していますし、日常の業務で質問するタイミングがないなと感じているエンジニアがいたら、ぜひ参加してほしいです。

渡辺:今はWebソリューション事業のエンジニアが中心となって勉強会をおこなっていますが、ゆくゆくはオンラインゲーム事業のエンジニアとの相互交流も進めていきますので、楽しみにしていてください。

「業務よりもちょっとだけ未来の技術」を見せたい

―― 「サーバの基本 勉強会」はこれからも続きます。次のステップではどんな勉強会を開きたいですか?

栗山:サーバーのことがわかってきたら次はDockerをみんなで勉強したいですね。Webソリューション事業の開発環境ではDockerを使うことが多いので、よりよい使い方を身に着けたいです。

ゆくゆくは学んだ知識を活かしてみんなで社内アプリ製作&サーバー構築・デプロイまでできたら、部活みたいで楽しいかもなと思います。

―― 楽しそうです。渡辺さんの次の構想を教えて下さい。

渡辺:もちろん、いろんな領域の勉強会を計画中です!

BaaSを駆使したサービス開発、UI/Xの高速プロトタイピング、現場に即したER図や業務フロー図などのドキュメンティング、チームビルディングやモチベーティングなど、我々が習得すべきこと、また言語化して社内に浸透させていくべき知見はたくさんあります。

業務で挑戦したことよりもちょっとだけ未来を見ることができる機会になるはずです。

【IT新卒】私服通勤、浮きたくないならコレを着ろ!

はじめに

「会社に適切な私服って?」

「周りから変な目で見られたらどうしよう…」

「ジーパンは?スニーカーは?どこまで大丈夫なの?」

私服通勤にあたり、こんな悩みを抱えている人も多いと思います。

そこで今回、私服OKなアピリッツの新入社員がどんな服装で出社しているのかをご紹介します!

登場人物紹介

アピリッツ新一(新卒1年目)

フラットな社風の企業、アピリッツの新卒一年目。

大学時代からインターンでアルバイトをしていて、入社後は研修の傍ら、業務にも参加している。

服装マヨイ(新卒1年目)

新一とは大学の同級生。大学卒業後、服装自由のIT企業に就職。

リモート研修が終わり、いざ出社!となったが、会社で浮かない服装が分からず、明日の服装選びで迷っている最中。

会社に適した私服とは?

はぁ…明日から私服で出勤かー…

どうしたんだい。迷い君

私服出勤ってどこまでOKなのか分からないんだよ

確かに、毎日何を着て行くか考えるのは大変だね

じゃあ、僕の会社の新卒がどんな服装で来てるのか、参考に見てみよう。


キレイめコーデ

1. 職業 エンジニア

 コーデ 

紺色のセットアップにオレンジのインナーとスニーカーを合わせた、オシャレと真面目の融合スタイル

 服装を選んだ理由 

『天気が悪いから服装は明るく、あと楽なんで』

2. 職業 営業・コンサル

 コーデ 

グレーのYシャツと紺のチノパンにスニーカーを合わせた動きやすいスタイル

 服装を選んだ理由 

『寒くないような格好で』

3. 職業 デザイナー 

 コーデ 

ホワイトのインナーとカーディガンにマスタードカラーのパンツを合わせたかっちりスタイル

 服装を選んだ理由 

『外部の人に会う設定で、少し真面目な感じに』

キレイめなスタイルだと、
男性はセットアップやYシャツ、女性はカーディガンで、
割とオフィスカジュアルな服装+スニーカーっていうパターンが多いね。


結構皆ちゃんとした服装なんだなぁ…
逆に不安になってきた…

心配しないで!実はもっとラフな服装の人も多いんだ。
こっちの写真も見てごらん。


カジュアルコーデ

1. 職業 営業・コンサル 

 コーデ 

柄物のTシャツの下にレイヤード、ジーンズにスニーカーを合わせたラフなスタイル

 服装を選んだ理由 

『特に考えてない、そこにあったから』

2. 職業 エンジニア 

 コーデ 

パーカーにジーンズとスニーカーを合わせた、ゆったりスタイル

 服装を選んだ理由 

『暑すぎず、寒すぎず』

3. 職業 デザイナー 

 コーデ 

白のデニム生地のセットアップに黒のインナー、革靴を合わせたボーイッシュなスタイル

 服装を選んだ理由 

『気温が高いから薄めの格好で、それに合うように、靴を選んだ』

カジュアルなスタイルだと、
男性はパーカーやTシャツにジーンズ + スニーカー、女性はデニム生地のセットアップなど、休みの日でもそのまま遊びに行けそうな服装が多いね。


Tシャツとかパーカーの人もいるんだね!安心したよ!

節度さえ守れば服装は基本自由なんだ。
だから、そんなに不安にならなくても大丈夫!

ありがとう新一くん!

結論

 襟付きのシャツを着れば、無難!! 

 あとは周りの様子を見ながら好きな服、楽な服を着ていこう!!

MacBook初心者必見!おすすめ機能3選

0

はじめに

21新卒の河野です。
入社後支給されたノートPC「MacBook Pro」について、初めてMacを触る人にとって知っておくと便利な3つの機能を紹介します。

MacBook Proの性能

使用しているMacは、こちらのプロセッサはIntel Core i7、ストレージが512GBのものです。 画面はRetinaディスプレイ搭載なので解像度が高くて綺麗ですし、Core i7でメモリは16GBなので、Webプログラマが使うPCの性能としてはかなり良いものだと思います。

Macbookの使い方

Macに限らず、PCを利用するには欠かせないキーボード、 ノートPCでは基本的にマウスの代わりにトラックパッドを使います。
基本的な使い方のみならず、便利な機能も知っておくことで快適に業務をこなしましょう。

1. トラックパッドの機能

ノートPCを使う際、マウスポインターを動かすためのパッド部分の事をトラックパッドと言います。 平面上で指を動かすとマウスポインターが動きます。
トラックパッドでできる操作は結構あります。どんな操作で何ができるかを確認するには、環境設定から機能を見ることができます。
画面左上のリンゴマークから、 → システム環境設定 → トラックパッドで確認できます。

初期設定でのクリック動作は、トラックパッドを1本指で押し込むことになります。
頻繁にクリックして指が疲れる…という人は「タップでクリック」の項目にチェックを入れておくと軽く触れるだけでクリックできるのでおすすめです。

「その他のジェスチャ」の欄にも様々なトラックパッドの操作が確認できるので、便利そうだと思った機能は使って覚えてみてはいかがでしょうか。

ちなみに、私は「ページ間をスワイプ」と「フルスクリーンアプリケーション間をスワイプ」と「Mission Control」の設定をよく使います。「ページ間をスワイプ」はブラウザのページ切り替えがスムーズになります。
アプリケーションをフルスクリーンで使うことが多い時には「フルスクリーンアプリケーション間をスワイプ」を使うことでアプリケーションの切り替えが容易になり、逆に一つのデスクトップでアプリケーションを多数起動している場合には「Mission Control」で画面上にパッと表示させられるため非常に便利です。


2. キーボードの機能

MacBookで使うキーボードはWindowsと違ってキーボードの配置や、ショートカットキーが異なります。

commandキー

Windowsではコピペなどの操作は「Ctrl」キーを使いますが、Macでは「command」キーを使います。

主に使うcommandショートカットキー

ショートカットキー 機能
command + C コピー
command + V ペースト
command + W ウィンドウを閉じる
command + A 全選択
command + Z 直前の動作の取り消し
command + F 検索

ついでに、スクリーンショットのショートカットキーも覚えておくと良いでしょう。私が主に使うのは次の3つです。
撮影した画像はデスクトップに保存されます

ショートカットキー 機能
command + shift + 3 画面全体の撮影
command + shift + 4 画面一部の撮影
command + shift + 5 スクリーンショットの操作画面を開く

画面全体の撮影はショートカットキーを押した瞬間、画面一部の撮影はショートカットキーを押したあと撮影する範囲をドラッグすると撮影されます。
スクリーンショットの操作画面を開くショートカットは、画面全体と一部の撮影の他、画面の収録も可能な操作画面を開きます。
撮影箇所を正確に選択したい場合や画面収録をしたい場合に使いますが、基本的にはすぐに撮影できる上2つのショートカットキーを使い慣れておくと良いでしょう。

スクリーンショットの操作画面

controlキー

Macにはcontrolキーというものがあります。
このキーは、テキスト入力時などカーソル移動が多い作業をする際に非常に便利です。
移動にはカーソルキーがありますが、controlを使う利点はキーボードを操作する手がホームポジションからあまり離れずに入力できるということです。慣れると作業効率がかなり上がるので覚えていくと良いでしょう。

ショートカットキー 機能
control + P カーソルを上の行に移動
control + N カーソルを下の行に移動
control + F カーソルを1つ右に移動
control + B カーソルを1つ左に移動
control + A カーソルを現在の行または段落の先頭に移動
control + E カーソルを現在の行または段落の末尾に移動

また、文字の削除や行の挿入などもできます。

ショートカットキー 機能
control + D カーソル右側の文字を削除
control + H カーソル左側の文字を削除(deleteキーと同じ)
control + O カーソルの後ろに1行挿入
control + K 現在のカーソル右側の文字から、行または段落の末尾までを削除

これはオープンソーステキストエディタであるemacsのキーバインドと同じものです。
VSCodeでも使えますし結構汎用性が高いです。知っておくと役に立つかもしれません。


3. スクリーンセーバの設定

PCで作業中、数分もしくは数十分離席するときに、そのまま離席していませんか?
ロックの掛かっていない、作業中の画面が丸見えの状態で席を立つのはプライバシー的にもセキュリティ的にも危険です。 安全のためにもスクリーンセーバは設定しておき、すぐに動作できるようなカスタマイズをしておきましょう。
Macにはcommand + control + Qで画面ロックするショートカットキーがありますが、いまいち押しづらいですし、間違ってcommand + shift + Qを押すとシステムが終了してしまうので危ないです。
今回はホットコーナーを使った設定とタッチバーを使った設定を紹介します。

ホットコーナーの設定

ホットコーナーの設定は → システム環境設定 → デスクトップとスクリーンセーバのスクリーンセーバーのタグを選択し、使いたいスクリーンセーバーを選択してから右下のホットコーナーをクリックします。
画面のコーナーへの機能割り当てから、画面4隅のいずれかにマウスポインターを移動したときの動作を設定できます。 「スクリーンセーバーを開始する」という項目を設定することでマウスポインターを設定した画面隅に移動させることでスクリーンセーバーが開始するようになります。

タッチバーの設定

Macbook proに搭載されているタッチバーを使うことでもスクリーンセーバを設定することができます。
タッチバーの設定は → システム環境設定 → キーボードのキーボードのタブからControl Stripをカスタマイズをクリックするとタッチバーに追加する項目を選択できます。スクリーンセーバ以外にも便利機能を追加できるのでよく使いそうな項目はタッチバーに追加しておくといいでしょう。

*スクリーンセーバ解除時のパスワード入力

スクリーンセーバは、起動してから一定時間はパスワード入力不要で解除できる設定があります。これではいくらスクリーンセーバを使用しているといっても安全とは言い難いです。
 → システム環境設定 → セキュリティとプライバシーの一般タブから「スリープとスクリーンセーバの解除にパスワードを要求」の項目にチェックを入れ「開始後すぐに」に設定しておきましょう。
これで、スクリーンセーバ解除時には必ずパスワード入力が必要になります。

おわりに

仕事でも日常生活でも、現在社会において円滑な暮らしを実現するための情報端末は必須アイテムと言えるでしょう。
本記事で紹介した機能はMacbookを扱うために必ずしも覚えておく必要はありません。しかし、知っておくと確実に役に立ちます。この記事が業務の効率化・日常での作業の効率化の一助となれば幸いです。

ゲーム会社のデザイナー職で正社員になる方法:実録編

0

アピリッツのエクスペリエンスデザイン部に所属するかめです。アピリッツのデザイナー職で、アルバイトとして入社し、数カ月後に正社員となりました。「どうやってなったの?」と質問されることがあったので、お話したいと思います。

前編はこちら「ゲーム会社のデザイナー職で正社員になる方法:素養編」

やったこと1「正社員の仕事を手伝いまくった」

アルバイトとして入社した時、隣の席にいた私の上司(正社員)がとても忙しそうにしていました。見たところ、他の人でもできそうな内容の仕事をしていたので、「その仕事、XXさんがやるのおかしくないですか? 私がやりますよ!教えてください!」と仕事を進んで手伝うようになりました(仕事を取った、ともいいます)。

ここで教えていただいた開発ツールの覚えが早かった、出来そうな範囲を把握してどんどん仕事を貰っていった事が結果的には社員への近道になったかと思います。

私自身が正社員となった今は、忙しすぎる時期に入ると当時の私のようにアルバイトのメンバーに手伝ってもらうことがあります。ここで活躍してくれる人は、やはり正社員になる可能性が上がっています!

やったこと2「正社員になりたい」と宣言した

正社員の仕事をどんどん手伝うことで、今までの仕事では目に留まらなかった方々にも自分の業務を見ていただく機会が増えていきました。

これらがある程度評価されてから、上司に私は正社員になりたい意思がある事を伝えました。全てのアルバイトの方が正社員になりたがっているわけではないので、これは伝える必要があるかなと思います。

私の場合はこの他に業務・業務外問わず様々な社員の方と関わりをもっていたので、私の人柄を知ってくれている人は部内に多く、これも後押しになったかなと思います。これはリモートワーク中だと少し難しいことかもしれません。

ただ、リモートワーク中でも、直属の上司との関係構築は問題なく築けるはずです! 現在アピリッツではリモートワーク中のアルバイトスタッフも多くいますが、その人達の仕事のクオリティや姿勢を、社員はちゃんと見ています。それらが評価されれば正社員への道も見えてきます!

やったこと3 イラスト以外のスキルを身に着けた(みんな絵を描きたがる)

デザイナー職を志す人の多くは「絵を描きたい」人です。ただ、ゲーム会社のデザイナー職は絵を描くだけが仕事じゃないんです。エフェクト、モーション、UI、3D……いろんな仕事があります。

だからイラストだけがめちゃめちゃ上手くて正社員になる人は、アピリッツではごくわずかです。というのも、イラスト制作はイラスト専門会社にお願いすることが多いですし、フリーランスで活躍する優秀な方も大勢いらっしゃいます。そんな人達と業界で渡り合えるくらいの高い技術を持っていない限り、「イラストがいいから採用!」とはなりません。

私は背景イラストをメインで描いていましたが、背景イラストは描ける人が少なく、部の需要とちょうど合わさっていたようです。そこに合わせてアルバイト入社後に新しく開発ツールを勉強していきました。

正社員を目指すなら、イラスト以外のスキルも身につけることをおすすめします。

(でもイラストを描きたい気持ちはよくわかりますよ!)

正社員になって大きく変わったこと

私の場合は正社員になるとアルバイトの頃とまるっきり業務内容が変わりました。主にイラストを自分で書くことは少なくなり、代わりに他のアルバイトさんが作成した物の監修をするようになります。自分の下に作業者が付いて、進行管理やクオリティ管理をするようになりました。

他にも開発ツールでの作業がメインとなり、よりプロジェクトに深い部分にふれるようになります。受けた指示をこなすだけではいられなくなっていきました。

アルバイトの時に、自分の上司がしてくれていた仕事を自分がするようになる、というのが 分かりやすいかもしれません。

デザインの仕事をするうえで、プロジェクトやデザイン制作物に愛を込めるのは必須のことです。ただ、その愛が深すぎて周囲が見えなくなってしまう人は、苦労する場面が多いかもしれません。

正社員になるには推薦制

以上が私の正社員になるまでのお話です。仕事を積極的にたくさん引き受けたり、正社員になりたい!とアピールしたり。ずっと絵を描いているだけでは、たぶん正社員になるまでに数年かかっていたと思います。

正社員に上がるときには必要な技術はもちろんですが、上の社員からの推薦が必須かなと思います!社員にする話が出た際に話題に上がりやすく目を向けてもらえる可能性が増えるので、チャンスが多くなります!

多くの人に仕事と人柄共に信頼されているほうが一緒に働きたいと思ってもらい、推薦してもらえる可能性が増えるので、仕事を頑張る、新しい仕事にもどんどん挑戦するのが一番の近道かもしれませんね。

ゲーム会社のデザイナー職で正社員になる方法:素養編

0

アピリッツのエクスペリエンスデザイン部に所属しております、あさりです。日頃、アルバイトの成果物チェックや監修などの業務を行っています。

エクスペリエンスデザイン部では、アルバイト採用から実務経験を積み、正社員に登用される人が多数います。この記事では「どういった素養があればゲーム会社のデザイナー職で正社員になれるのか?」ということについて、私が見てきた範囲の内容ではありますがお伝えできればと思っております!

正社員になる「意欲」と「素養」が必要

まず最初に2つの条件があります。ひとつめ、そもそもご本人が正社員になりたいという「意志」があるかどうか。意欲がある方にだけ正社員登用を提案しています。ふたつめは、その人に正社員としての「素養」があるかどうか。この「素養」って、一体なんでしょう?

「絵が上手いこと」は「素養」なの?

実は「絵が上手い」だけではゲーム会社の正社員になれません。イラスト制作会社であればそれだけで良い場合もありますが、ゲーム会社はそうではありません。以下のような人材は「正社員になっても活躍してもらえそうだな」と判断しています。(※必ずしもこれだけに限りません)

締め切りを守る人

当たり前じゃない? と思う方もいるはずですが、非常に大切なことです。たとえば「2日後が締め切りです」と伝えた仕事があるとします。これが遅れた場合、社内はどう考えるでしょう?

2.5日で上がってきたら、クオリティによっては許容されるかもしれません。
3日なら「忙しい時期はこの人には任せられないな」と判断します。
4日、予定の2倍の工数がかかってしまうのはもう論外です。(その分野の仕事をするのがはじめて、という場合以外ではほぼほぼありえないことです)

そして、締め切りを破り続けると「もう別の人に任せたほうがいいかな」と考えます。なぜなら、どれだけいいものを作っても、想定よりも工数がかかってしまうと採算がとれないからです。制作のスピードとクオリティのバランスを保つことが大切です。

また、ゲームは様々な職種の方との協力があり形になっています。一人の仕事の遅れが、全体に影響を及ぼすことも少なくありません。原則として、締め切りを厳守することを心掛けましょう。

報連相ができる人

これも社会人としては当たり前のことではありますが、仕事の報連相をきちんとできる方には安心して仕事を任せることができます。

任されていた仕事の進行が遅れている場合は、「遅れます。いつまでにできます」と事前の連絡が欲しいんです。締め切り日当日になってから「まだ完成していません」というのは厳禁です!

事前に伝えてもらえれば、なんらかの対策をとったりスケジュールを調整したりと柔軟に対応することができます。どんなに目の前の仕事が忙しくても、進捗報告は忘れないようにしましょう。

また、仕事が遅れる原因は「何かに悩んでいる」場合がほとんどです。それをきちんと伝えて欲しいと思っています。わからないことや悩んでいることを自分の中だけで抱えてしまう人がいるのですが、だれかに聞けば一瞬で解決できるようなことかもしれません。

新しい技術を学ぶ意欲がある人

ゲーム開発の現場は日々進化しています。プロジェクトごとに必要なツールも変わりますし、新しい開発ツールもどんどん登場します。そのため、新しいものを積極的に学習していける人はさまざまなプロジェクトで活躍することができます。仮にそのツールや技術に興味がなくても、「興味を持つ努力」が出来る方は強いです。

また、円滑に仕事を進めるためには学習意欲だけではなく、中学レベル程度の基礎学力が必要になります。それの有無でツールの習熟速度が大きく変わります。

愛を持って仕事ができる人

制作者自身が楽しんで作っているものは自然とクオリティが高くなり、見ている人の目を惹きます。日頃多くの成果物のチェックを行っていますが、楽しんで作ってくれたであろうクリエイティブは一目でわかります。逆もまた然りです。

愛ってつまり、制作の対象に対して興味を持つことです。なにか仕事を任されたとき、渡された資料だけを見て作るのではなく自分でもネット検索などを活用して追加の参考資料をさがしてみたり。なにを参考にしていいかわからないときは、気軽に相談してくれればいいんです。

だれかに楽しんでもらうには、まずは自分が楽しんで制作に取り組むことから!

ジョブローテーションを行い、色んな人と仕事をする

上述のような意欲と素養がある方には、正社員登用を目指してトレーニングに入ってもらいます。

UI、エフェクト、モーションなど…デザイナーの業務にもさまざまな分野があります。上司やプロジェクトをローテーションし、いくつかのスキルを実務レベルまで身に着けていただきます。

スキルの幅が狭く、特定のプロジェクトでの活躍しか期待が出来ない方は、正直なところ会社としても正社員として長くお付き合いすることが難しいです。そのため、さまざまな上司の下に付きスキルの幅を広げ、どのプロジェクトでも一定以上の活躍が出来る人材になることが求められます。

また、スキルの幅だけでなくどんな人間とも円滑なやり取りができるようなコミュニケーション力も正社員には必要とされています。

ゲーム会社ではさまざまなタイトルを開発します。それぞれデザインや、求められる知識やツールが違います。そのため、多様な現場に対応できることが重要な素養なんです。色々な分野の仕事ができて、仕事上でのコミュニケーションを積極的に取ることができる。あと一押しとして、持っているスキルの中で何か一つ特出したものを身につけることができれば正社員への道が開かれます。

今回は基礎中の基礎をお伝えしましたが、次回は実際にアルバイト採用から正社員になった「かめ」にどうやって正社員になったかを説明していただきます。

4月入社の新人がAWS Certified Solutions Architect-Professionalに合格した話

0

21新卒の串田 匠彌です。先日2021/4/10にAWS認定 Solutions Architect-Professional(以下、AWS-SAP)を受験し、合格することが出来ました。今回は資格勉強を通じて経験したことについて、書き起こしたいと思います。

僕がAWS-SAPを受験した理由

「AWSの受験勉強をするにつれて、クラウドが好きになったから」……と書くと余りにも大雑把なので、自分なりに深堀りしてみました。

・クラウド特有の「元からあるものは使う」という思想に共感したため

・好きな技術を題材として、自助努力の習慣をつけたかったため

前者後者共に語りたいことは多いのですが、今回は後者に関する話と勉強して得た知見を書いていきます。

AWS-SAPでは最も広範な知識が求められるという噂です。

自助努力の有意性

ではなぜ自助努力が必要なのでしょうか?

理由は多々あるかと思いますが、僕は「仕事というものを遊びに変えたかったから」です。日常会話において、聞かれたことに対して適切に返答するということは、然程難しくないし努力する必要はないかもしれません。しかし仕事(特に技術)の話となると、そうも言っていられないと僕は考えています。例えばお客様からの、

お客様「オンプレからクラウドに移行しようと考えているんだけど、そのついででPostgreSQLからMySQLにDBエンジンを変える予定なんだよね。これで何か注意点ってある?」

といった疑問に対して、自分の知識が不足している場合、

ぼく「あーそうですね!完全に理解しました!(分かってない」

という返答になるでしょうし、「わからないことだらけの仕事なんてつまらない」と思う機会も増えることでしょう。これは相手にとっては勿論のこと、自分にとっても大きな損失です。僕はこれを防ぐために、「好きな分野一つで良いから詳しくなれば仕事への理解も深まり、楽しくなるんじゃないか」と考え、AWSの勉強を始めました。

色々とやってきましたが、最近は専らAWSです。

自分の勉強法

SAP本を読み込みました(多分10周くらいしたと思います)。途中で解く問題が足りなくなったのでUdemyもやってみましたが、基本的には書籍です。

AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説

AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集(全5回分375問)

1周目 巻末の模擬試験以外を読む。問題の正誤よりも、何故この選択肢が正解なのかを理論づけて考える。

2~3周目 上記範囲をテストし、書籍で言及されているサービス事例に関しては理論立てて答えられるようにしておく。覚えられていない部分は付箋を貼る。

4~5周目 書籍で間違っている選択肢や参考程度に書かれているサービスを検索、概要やユースケースを把握し書籍に書き込む。巻末の模擬試験を解いてみる(60%)

ここでAWSの模擬試験を受験する(60%)

  • 6~9周目 基本的には4~5周目と同じだが、書籍の内容は殆ど覚えたため書籍に書き込んだ内容を深堀りする。Udemyの模擬試験を解いてみる(50%~60%)
  • 10周目 試験当日、付箋を貼ったページと書き込みを軽く見直す

最初はどんなサービスがあって、ユースケースは何かということを学習すれば十分と思っていたのですが、勉強していくうちに「あれ……?これ今受けたら受かるかも?」と感じ、途中から受験したいと思うようになりました。ちなみに自分がCLF、SAAを受験した時は、対策本に関して分からない部分が無くなったら1週間後に申し込むという明確な基準があったので、不合格が怖くて先延ばしするということはなかったです。

いざ試験が開始すると、自分でも驚くくらい冷静に挑めました。明確な理由は不明ですが、おそらく「出来る範囲のやれることは全てやったから、合格でも不合格でもそれは完全に正確な今の実力」という認識があり、「全ての知識を総動員させて、悔いなくやってから受かるかな?落ちるかな?とか考えよう」という意識で3時間取り組んでいたからだと思います。

スコアは824でした

勉強した後の変化

・先述のお客様との会話例では、

ぼく「DBエンジンを変えるとなるとAWSではSchema Conversion Toolというスキーマ変換ツールが用意されているので、それを通してからRDSに移行しましょう。もし処理性能に不安があるようでしたら、いっそAuroraに移行するのも手かもしれませんね」

 といったことを考えられるようになった。

・「S3のライフサイクルの設定でコストカット、DDoSにはShield」といった、ベストプラクティスを学習することが出来た

・継続した学習と、難しい課題の達成が出来たという自信に繋がった

あとがき

僕の好きな言葉に、「勝負事を本当に楽しむためには強さが要る」というものがあります。全く以ってその通りだと思います。当たり前の話ではありますが、僕もAWSの知識に関して無敵ではありませんし、毎日わからないこととの格闘です。時々、「自分の努力の成果はIT知識全体の0.001%で、99.999%も知らないことがある。意味ないんじゃないか」と諦観したこともあります。

ただ、その「わからないこと」に直面したときに、深堀りし続けるその場をやり過ごすかによって、数年後大きな差が出ると確信しています。現に2ヶ月前の自分と今の自分で大きく差をつけられましたからね。

「自分は万能でないと悟り、わからないことに苦悩し、それでも自助努力をし続ける」という心構えは、仕事を今より楽しくする一つの在り方ではないでしょうか。

知識を増やし、仕事を「遊び」に変えていきます

次はAWS-SCS(セキュリティの専門知識)でも受験しようかな〜

—(備考)勉強時間—

※下位の資格である、AWS-SAAの知識がある前提での勉強時間です

平日:通勤の1h、家での自習1h

休日:カフェ(9割ドトール)で4~5h

期間:約2ヶ月(2/1~4/10)

追記:せっかくなので全部勉強します

AWS認定資格コンプリートを本格的に目指すことにしました。→ 新卒1年目エンジニアAWS認定フルコンプを目指す その1:Cloud Practitioner 、Solutions Architect – Associate 、Solutions Architect – Professional編

よくわかるAndroid API30のACCESS_BACKGROUND_LOCATION

0

はじめに

Androidアプリのバックグラウンド位置情報取得について説明します。この機能には最近のSDKアップデートによりさまざまな制限が加わり、アプリ設計・開発時に考慮すべきことが増えている一方で、Google Playでは定期的にリリース可能なSDKバージョンの見直しが行われており、SDKバージョンがそれに満たない場合アプリリリース時にSDKアップデートを行わないと配信できなくなるため、無視しつづけることもできません。

Android10(API29)から、アプリがバックグラウンドに入っている時に位置情報を扱う場合に必要となるパーミッションACCESS_BACKGROUND_LOCATIONが追加されました。Android10(API29)の場合は以前と同じように ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION など、既存の位置情報パーミッションと同時に ACCESS_BACKGROUND_LOCATION をリクエストすることが可能でした。

しかし、Android11(API30)にてセキュリティ向上のために既存の位置情報権限と同時に ACCESS_BACKGROUND_LOCATION をリクエストすることが不可能となりました。

ACCESS_BACKGROUND_LOCATIONは、行動記録アプリやナビゲーションアプリなど行動記録を残したり常時位置情報を取得するアプリなどで利用されます。

また、アプリから本体のWi-Fi関連機能へアクセスする場合にも位置情報権限が必要となるため、弊社がアプリ開発を担当している エヌ・ティ・ティ・ブロードバンドプラットフォーム株式会社様の「Japan Wi-Fi auto-connect」のような、アプリがバックグラウンドにいる状態でもWi-Fiへの接続をサポートするアプリでも用いられます。

この記事では、大きく変更が加えられたAPI30にSDKバージョンを引き上げることで発生する位置情報権限にOSバージョンごとの差異を簡単にまとめます。

OSバージョンごとの挙動の違い

Android9(API28)以下での動作

  • 影響ありません。しかし、ACCESS_BACKGROUND_LOCATION の取得状況を checkSelfPermission で確認すると「取得済み」の扱いとなります

Android10(API29)での動作

  • Android9以下からアップデートした場合、アップデート前に位置情報権限を許可していたなら自動的に ACCESS_BACKGROUND_LOCATION も取得扱いになる
  • ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION と一緒に ACCESS_BACKGROUND_LOCATION のリクエストをまとめて行うことが可能です
  • 後述のAndroid11の動作と同じように、ACCESS_FINE_LOCATION・ACCESS_COARSE_LOCATIONを取得した後、ACCESS_BACKGROUND_LOCATION を単品でリクエストして取得する動作も可能です。この場合、「常に許可」を選択できるダイアログが表示されます。

Android11(API30)での動作

  • API29までは、ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONと一緒にACCESS_BACKGROUND_LOCATIONのリクエストをまとめて行うことが可能でしたが、API30に引き上げることで、一括ですべてを取得することができなくなりました
  • まとめてリクエストをした場合、ダイアログ等出ずにonRequestPermissionsResultへ失敗の扱いでレスポンスが返されます。そのため、ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONを取得した後、別途ACCESS_BACKGROUND_LOCATIONをリクエストする必要があります。
  • ACCESS_BACKGROUND_LOCATIONのリクエストを行うと、ダイアログではなくアプリの権限詳細画面へと遷移し、そこで「常に許可」を選択して貰う必要が生まれました。
  • ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION をリクエストした際、「アプリ使用時のみ」「今回のみ」「許可しない」の3つの選択肢が提示されるが、「今回のみ」を選択した場合は一時的にACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONを取得できたような挙動をするが、
  • アプリをタスクキルしたり一定時間経過した場合は「許可しない」の扱いになるため、後から「常に許可」の権限を取得しようとしたり、位置情報の取得を試みる場合に注意が必要となる
  • 「アプリ使用時のみ」を選択した場合と「今回のみ」を選択し、「今回のみ」の権限が生きている状態ではどちらが選択されたか判別をつけることができない

上記のことから「常に許可」を取得する場合以下のような対応が必要となります。

  • Android9以下・10・11それぞれで動作差分が生まれることのケア
  • 「常に許可」を取得する場合Android11における、別画面が起動する動作が発生することをユーザーへ注意を行う
  • Android11で「今回のみ」を選択した場合に後から権限が破棄される動作のケア
  • 「常に許可」を取得することの必要性をユーザーに説明をする。
  • ACCESS_BACKGROUND_LOCATIONを使用するアプリをストアへリリースする場合、別途それ専用の審査が必要となる。
  • 審査では適切なACCESS_BACKGROUND_LOCATIONの使用や、その権限が必要であることの説明を正しくユーザーへ告知しているかなどが審査の対象となる。

画面遷移で発生してしまう挙動差異を軽減する

OSバージョンごとに差が生じるため、権限取得時の画面遷移や取得手順で悩むことがあるかもしれません。とくに、Android10でBACKGROUND_LOCATIONのが必須になりはするが、挙動的にはAndroid11と違う挙動をしてしまうため混乱の原因にもなります。しかし、その特性を活かすことでざっくりと「Android9/10に合わせた取得」と「Android10/11に合わせた取得」の2パターン分けられると思います。

「Android9/10に合わせた取得」

「Android9/10に合わせた取得」だと、Android9で1動作で位置情報権限をリクエストしているように、Android10でも1動作でBACKGROUND_LOCATIONを取得してしまおうという動作です。この場合、9以下と10で画面の説明文等変える必要がありますが、すでに9用の権限リクエスト画面がある場合再利用が可能になりお得です。

「Android10/11に合わせた取得」

「Android10/11に合わせた取得」の場合、Android9で1動作で位置情報権限をリクエストするのはそのまま、Android11で必須となるACCESS_BACKGROUND_LOCATIONを分けてリクエストする動作を、Android10でも動作させることが可能なようにAndroid11と同じくACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONを取得した後、別画面でACCESS_BACKGROUND_LOCATIONを取得するようにしてしまおうという動作です。こちらのパターンは権限の説明等を細かくユーザーへ周知でき、セキュリティ的には良い実装かもしれません。しかし説明内容が複雑になりユーザーの混乱や権限の拒否を誘発したり、Android10の場合は「Android9/10に合わせた取得」に比べて画面数が増えてしまうので少し面倒かもしれません。

最後に

バックグラウンドで位置情報を取得する動作を実装することは珍しいことになるかと思います。また、ストアリリース時の審査では特別な対応も必要となるので手間も増えます。実装に当たる場合、この記事で予め差や動作の特徴について知っていただき、開発の手助けになればと思います。

今回の記事でも使用した動作の確認をそれぞれ試せるようなテストアプリのソースコード(Kotlin)をGitHubにて公開しているのでこちらも合わせて御覧ください。

GaikiKuroda/location_permission_app (AndroidProject Kotlin)

2021年度 アピリッツ入社式、今年は対面で実施しました

0

新年度となり、アピリッツは本日30人の新入社員を迎えました。新型コロナウイルス下で2回目の春。昨年は入社式を控えましたが、今年は感染防止に何が必要であるか、対策がわかってきました。そして、同期や社員と直接会うことでモチベーションを高めてもらいたい。このため、本年度は対面方式の入社式を実施しました。当日の様子をお伝えします。(2021年4月 取材)

今年の入社式は昨年11月に増床した新オフィスのカフェスペースで執り行いました。

感染拡大防止のために間隔をあけて座ってもらいました
会場の飾り付けと入社式の司会進行をおこなった人事チーム

代表取締役社長の和田から新入社員の皆さんにご挨拶。

「競争社会を生き抜く心構え」を呼びかけました

つづけて各役員からもそれぞれメッセージを伝えました。

Webソリューションセグメントの執行役員・西脇は「今日の気持ちをみんなわすれないでね」とエールを送りました
ゲームセグメントの執行役員・八木のごあいさつ。「みなさん、前半に登壇した役員が何言ってたかなんて、もう忘れてるでしょ?」と陽気に切り出し、アピリッツがサービス開発において重視する「ナッジ」について語りました
新入社員からも一言ずつ抱負を語ってもらいました
最後に全員で集合写真。撮影の瞬間だけマスクをはずしました
撮影係の村上さん。これは脚立に登って集合写真を撮ったあと、画像チェックしているところです

ということで、無事入社式が終わりました。これから数週間の研修ののち実務に入ります。どうぞよろしくお願いいたします!

「コードが書けたらオッケーじゃないぞ!」デジタルイノベーション部 西脇・渡辺・浅田 鼎談

0

2021年2月にアピリッツのWebソリューションセグメントは大きな組織改編を行いました。このとき新設されたデジタルイノベーション部(以下、DI部)は、スマートフォン事業、フロントエンドエンジニアリング事業、そしてAIの研究開発チームで構成されています。なぜこの組み合わせでDX推進支援をおこなうのか? 執行役員兼DI部部長の西脇とグループマネージャの渡辺、浅田に今後目指すことを聞きました。(2021年3月 取材)

DXに効く “スマートフォン事業”と“AI事業”

―― DI部の事業内容は「スマートフォン事業、フロントエンドエンジニアリング事業、AIを中心とした技術開発・活用コンサルティング事業」です。なぜAI技術開発がDIに含まれているのでしょうか。

西脇:社内から見ても「なんで渡辺と浅田が西脇のチームにいるんだろう?」と不思議に映るかもしれません。具体的な案件がイメージしづらいのでしょう。ですが、このチームは元々僕が目指していた原点でもありますし、スマートフォン事業とAI事業をサービスとしてお客様にご提供するなら、近い将来、お互いがお互いを必要とするだろうと考えています。

お客様のビジネス上の課題に対して、ちゃんと答えを出せる体制なのです。

たとえば、「ユーザーが快適に使えるサービス」ってどういうものでしょう?  答えは、「人によって違います」です。どれだけターゲティングを絞ったとしても、サービスのユーザーの属性は多様になっているから、一義的な正解を押しつけて、「このカタチについてこい!」という時代ではないですよね。

ユーザーごとの「快適さ」を叶えるためには、ECなら気の利いた商品サジェストだったり、学習なら目標に応じた進度提案だったりといった、コンテンツ面でのカスタマイズが不可欠です。

でも、そうやってコンテンツが多様になるなら、その見せ方の切り口だって多様にしなくちゃいけません。提案コンテンツを、最適な見せ方で、ただし一定の世界観・マインドセットに沿うように……って広く考えると、AI開発が取り組む課題とフロントエンド開発が取り組む課題は、じつは分けて考えないほうがいいんです。

渡辺:はい。そういった大きな視点からのアプリ開発を目指しています。というのも、アプリ開発だけですと価格競争に巻き込まれるからです。個人で活躍する開発者さんも多いですし、プログラミング不要でアプリ開発できるサービスもあるので。

じゃあアピリッツはどう戦うか。

まず、個人開発者ではなく企業にアプリ開発を依頼したいお客様もいらっしゃいます。そういったお客様に対して「アプリ開発もやります、運用保守もバックエンドもやります、データ分析も改善もやります」とアピリッツならではの形でご提案できると、価格競争から距離を置けます。

西脇:そうだよね。で、フロントエンドを開発するうえで「ユーザにとって一番快適なフロントエンドを実現する」と考えると、ただの「わかりやすいUI」では物足りない。見た目や触り心地だけを追求しても、それは「ユーザーにとって一番快適なフロントエンド」とは呼べません。だってユーザーは一人一人違いますから。

パーソナライゼーションやレコメンドが必要になります。そこで「一般的なAI」の出番なんですよね。

AIの得意とすることがDXにつながる

西脇:ちなみに、“AI”って大雑把にいうと「それはAIじゃないよ!」とAI研究者の浅田さんは気になるでしょうが……(笑) 

浅田:いや(笑) もちろん、現在よく使われるパーソナライゼーションもレコメンドもAIだと思っています。ただ、AIという言葉だと意味するところが広すぎてしまって、例えば人間が決めたルールによって判断するプログラムも広義の意味ではAIと言えます。ゲームのAIなどその典型ですね。その一方で「データをもとにアクションを最適化および自動化する」という仕組みであれば、機械学習と呼んだほうが色々誤解がないかなとは思いますね。

つまりキーとなるのはデータであって、データとアクションを紐づけて価値を生み出していくという点が、AIがDXにとって必須だと言われている所以だと思っているんですよね。

渡辺:アプリの挙動については、人間が係数を仕込んで調整する部分も多いですが、そこをAIが行うと速いです。とくにファジーな入力をファジーな出力にするのはAIの得意分野だと思いますね。

浅田:いわゆるABテストは昔からありますが、「フロントが動的に変わって、ユーザーごとに出し分けて、この効果はどのくらいあるか?」といった領域まで設計するとなると、AIでないと難しいでしょうね。

西脇:ですね。そして「このボタンをめちゃくちゃ大きく出したい!」とAIが考えたら、それをちゃんと出力できないといけません。そこで渡辺さんたちのチームの出番なのです。

……ということで、とても理にかなったメンバー構成となっています。

左から浅田、西脇、渡辺。みんな笑顔!

「フロントエンドやりたいっす!」「AIやりたいっす!」って人は多い。でも……?

―― それぞれどんなメンバーがいますか。

浅田:AIラボはいろんな経歴の開発者がいます。スマホ系、ゲーム系、クラウド系……得意分野プラスαが出しやすい環境です。

西脇:そうですね、何かしら経験を積んだ人が集まっています。スマートデバイスチームも、「フロントエンドだけができる人」というのは、いませんよね。

渡辺:あまり意識してませんでしたが、確かにそうなんです。アーキテクチャの使い方がわかる人、または勉強する意欲がある人のチームです。

西脇:ユーザーのワークフロー、データフローを成立させるためのフロントエンドとシステムを作る必要がありますからね。

渡辺:自然と身についてしまうんでしょうね。あと、スマホの開発は他のWebエンジニアリングよりもトライアンドエラーがわかりやすいです。自分が書いたものがデータモデルとの連携含めて成功しているのか、失敗しているのか、成功していてもワークフローとして違和感があるのかないのか、手元ですぐわかる。そこはWebエンジニアリングと大きく違う点ですね。

西脇:よくも悪くもね、スマホで「動いた!」ってわかると、そこで満足しちゃう人がいるんです。もちろん「動いたらうれしい!」ってエンジニアの原点としてはとても大切なことですが、仕事にするなら、その「動いたらうれしい!」にとどまってちゃダメです。だってコマンドが成功しただけですから。データフローのことを考えられない人は、フロントを作るべきではないですね。

浅田:新卒面接でも「フロントエンドやりたいです」という方は多いですね。

西脇:そこを僕らも見誤らないようにマネージメントしていく必要があります。「コードが書けたらオッケー!じゃないんだよ!」ってのは、エンジニアすべてに言えることではありますが。最適なサービスを考えて、作ることがプロです。

渡辺:マネジメント側は、コーディングからアプリ設計、アプリ設計からサービス設計、そうやって地続きに仲間を「プロ」へと導いていきたいです。それって自分の足元だけを見ていると到達できない地点だと思います。

今「普段の生活では興味がないアプリを使って、見つけたことを報告する」というワークをチーム内で毎週やっています。書ける人としてのスキルと同時に、サービスを考える引き出しを増やすためです。

西脇:建築やってる人だって、街で建物みたら「基礎はどうなってるんだろう?」とか構造をみますもんね。

渡辺:はい。「どうやっているんだろう?」ってサービスのキモを考えることは大切です。すぐに真似はできなくても、考えているとやがて閃く。

(このあと、西脇、渡辺、浅田でいろんなサービスの話になる)

新オフィスのフリーアドレスゾーンの電源が気になる三人

技術を何に活かすか?

―― これから、どんな人を仲間として求めますか。

渡辺:自分で仮説を立てて、動けて、実現できる人が向いています。ということは失敗もたくさん経験するということです。そこでへこたれずに泥臭い作業を厭わない人が活躍できます

浅田:「フロントエンドをやりたい」という話に近いかもしれませんが、AIを志望する人は多いです。いま話題ですし、年収も高くなりそうなイメージもあります。でも「なんのためにAIをやりたいか?」を考えてほしいです。突き詰めればAIも単なる技術なので、それを何に活かすか、という視点が重要だと思います。

西脇:機械学習だけで、いいモデルが使えなかったら話にならないもんね(笑)

浅田:そうですね。たとえば機械学習なら、機械学習を使ってどういうことをやりたいかが明確だといいでしょうね。何の分野でもそうでしょうけど、決して楽しい事ばかりじゃないですし、何かしんどい壁にぶつかったときに頑張れるのは明確な目的を持っている人かなと思います。

西脇:昔っから僕は「コードが書けたらオッケー、じゃないよ!」ってしつこく言い続けてきましたけど、同じ志を持ってる浅田さんと渡辺さんが脇を固めてくれたので、もう言わなくても大丈夫ですね。よいサービスを作っていきましょう!!

インサイダー情報の取り扱いに関する社内教育のご紹介

0

アピリッツでは「インサイダー取引」に関する社内教育を定期的に実施しています。こちらの狙いやテストの様子について、CFOの永山と法務の松竹に話を聞きました。(2021年2月 取材)

上場企業の社員として理解しておくべき非常に大切なこと

―― 上場に先立って「インサイダー情報の取り扱いについての研修」と「理解度テスト」を2月上旬に実施しました。こちらの受験率や回答結果はいかがでしたか

永山:「インサイダー情報の取り扱いに関するテストをしますよ!」と社内にお知らせをして48時間経過しました。この時点で300人近くがテストを受け、みなさんほぼ満点を取っています。正直、「えっ、もうこんなに受けてくれたの!?」って思いました。あらためて、アピリッツの社員は協力的だなあと……。

松竹:「はい・いいえ」で回答するタイプのテストで、正解の場合も不正解の場合も「解説」を読んでもらうフローにしました。今回初めてのテストでしたが、こちらが想定していた以上にテストの結果が良かったので、うれしいです。

今後もパブリックカンパニーとして求められる法令順守のための知識を周知するために定期的に「インサイダー情報の取り扱い」や「コンプライアンス研修」など、法律に関する研修をおこなっていきます。

研修資料の一部

永山:労働基準法や業務委託契約の法解釈など、知っておくべきことは沢山あります。なかでも、インサイダー情報の取り扱いは、上場企業の社員として理解しておくべきとても大切な内容です。しかも「インサイダー取引規制関連法令」は意外とわかりづらいし、悪意なく違反してしまうことも多々ある。

「そんなつもりじゃなかった」が通用しない

―― 悪意なくやってしまったことが処罰の対象になる?

永山:そうです。「そんなつもりじゃなかった」が一切通用しないんです。

松竹:自分ではない誰かに売買を委託しても罰則の対象になります。当社株式の場合でも他社の株式でも、情報漏洩した側でも知った側でも、同様に罰せられます。

これからも定期的に法律に関する研修をおこなっていきます

永山:ですから、まずは、社員全員に「みなさんが日常業務で携わっているの情報にはインサイダー情報が満載ですよ」という周知からおこないました。

ほら、友達や恋人や家族に近況報告がてら「いまうちの会社でこんなお客様と取引があるよ」とか「こんどこんなサービスが出るよ!」なんて言いたくなっちゃいますよね。それを聞いた相手が「よーし、じゃあ、業績もあがりそうだし株価があがる前に買って株価が上がったら売却してお小遣いでもかせいじゃおうかな」って株を買うと、アウトです。

―― バレるものなんですね。

永山:バレますね。どうやってその取引に違法性があるかをキャッチしているかまではわかりませんが、「証券取引等監視委員会」がウォッチしています。過去に摘発された事例をみますと、取引金額の大小は関係ありません。しかも、インサイダー取引の調査対象になると、大変やっかいかつ、自分も周りもしんどいです。啓蒙ポスターに「あそこまで調べられると知っていたら絶対に手を出さなかった」というものがあるのですが、正にそれですね。

啓蒙ポスター。メッセージ性強し!

調査対象になると何が起こるか?

―― 調査対象になると、どうなっちゃうのですか。

永山:過去に私が間近で経験した実際にあった“とある人”の例をお話しますね。その人が勤める会社でIR的に大きな発表があった数日後のことです。突然ノーアポで「証券取引等監視委員会」の捜査員が会社にやってきました。いつもどおり会社に出社したら、朝イチで捜査員も会社に来てて、「XXさん、会議室に来てください」と呼び出すわけです。

―― 自分の会社の会議室に、捜査員が待ってる。

永山:はい。数人で待ってました。で、本人は何も知らずに「なにかなー?」って会議室に入ると「我々は証券取引等監視委員会のものです。インサイダー取引規制の調査のためにお話を聞かせてください。調査終わるまでここから出ないでください。携帯電話もすべて出してください」と言われます。

―― あ、いきなり閉じ込められる。

永山:そうです、自分の会社なのに。そして調査が始まるのだそうです。

会社のPCも、プライベートの携帯も、すべてが捜査対象

―― 取り調べで色々と聞かれて「関係ありませんよ」と説明しても部屋から出してもらえない?

永山:出してもらえないでしょうね。根掘り葉掘り、問い質されます。「何月何日に誰にあって何を話しましたか?」とか。「この情報を社内の関係者に共有したのは何月何日でどこの会議室で共有しましたか?」とか。

取り調べの厳しさは、インサイダー取引をやったなという自覚があってもなくても同じです。

もし身に覚えがあるなら、正直に白状しろ!って話ですけど、覚えがない場合が最悪。痛くもない腹を探られるんですからね。

しかも、この取り調べのあいだに、捜査員方がその方のメール履歴、チャット履歴、スケジュールのデータを提出してくださいとなりすべてのものを調査としてもっていきます。個人の手帳やノートもだそうです。

―― 私物も?

永山:はい。「そんなもの、インサイダー取引と絶対関係ないだろうに!」って誰もが思うようなものすら容赦なく持っていかれます。会社のメールも、プライベートのメールも、LINEも、全部捜査されます。PCの中身もフル捜査されますので、音楽の趣味も、動画の閲覧履歴も、まるごと他人に見られます。もうホント丸裸。

ホント丸裸!!

―― はずかしいですね

永山:はずかしいでしょうね。しかも、この捜査のやっかいなところは、捜査結果は教えてもらえないところです。後日逮捕されたら「クロ」ですが、「シロでした!」というお知らせはないんだそうです。「捜査の結果、あなた無罪でしたよ、疑ってごめんなさいね」なんて連絡は一切ないそうです。

―― じゃあ、社内でも疑心暗鬼になる……?

永山:そうです。上司から「お前、インサイダー取引をやったのか?」とか言われちゃう。言われる側も「自分じゃない! じゃあ誰かこの中にインサイダー取引規制に違反した人がいるのか……?」と疑い深くなる。モヤモヤがずっと続きます。仕事どころじゃないでしょうね。

ちなみに、有罪となったらどうなるかも考えてみましょうか。罰金が課せられますし、当然、会社でも処分されます。パブリックカンパニーとしては処分をしないわけにはいかないですから「懲戒解雇」ってこともあり得ます。そして記録が残ります。万が一わたしが逮捕されたら(もちろん絶対やりませんが)、狭い業界ですから、即刻「あいつはインサイダー取引で捕まった」と噂が回ります。ですから再就職は難しいでしょうね。

松竹:履歴詐称は発覚すると解雇されるケースが多いですし、近年は、社員の経歴を調査する会社さんもあると聞きます。

どんなに大切な仲間でも処罰の対象になる

―― 「悪気なくやってしまうケースが多い」のですよね。切ない。

永山:切ないですよ。「ああ、酔っ払って彼女にちょっと話しちゃったんだなあ」とか「親御さんが買っちゃったんだなあ」って、違反者に悪意がないことを会社がわかっていたとしても、どんなに仕事を頑張ってる優秀な社員だとしても、大好きな仲間だとしても、パブリックカンパニーである以上、罰しないといけません。後味がとても悪い。

松竹:しかも法律の条文は複雑ですし、パッと読んで理解できるものではありません。ですから、今回の社内教育では、まず「やってはいけないこと」をわかりやすく伝えました。

永山:法律を完全に暗記しなくても、とにかく意識してほしいんです。「ああコレ会社で言われてたな、気をつけよう」って。

―― 未然に防ぐって大切ですね。

松竹:大切です。トラブルを未然に防ぐという意味では、法務が契約書の条文をチェックすることも同じ役割を担っています。「そんなこと起こるわけがない」に備える必要があるのです。

永山:コンプライアンス遵守のルールや内部統制については「こんなに厳しくして、なんの意味があるの? 面倒だな、チッ」とか言われがちなんですが、その「未然に防ぐ」ことが僕らの仕事です。なにごともない場合はこういった取り組みはなかなか評価されませんが(笑)、何かトラブルが起きたら会社や従業員への負のインパクトは計り知れないんですよね。この手のことは「発生可能性が低いからOK」ではなく、手は抜けません。 パブリックカンパニーである以上、大切なんです。ですからみなさん、これからもご協力よろしくお願いします!

もしインサイダー情報の取り扱いについて不安がある場合は、永山や松竹に相談してくださいね。

大手ECサイト構築|カテゴリページをスマートフォン表示させる方法|

0

※この記事は、楽天市場、Amazon、Yahoo!ショッピング、BASE、Shopifyといった、大手ECサイトの店舗構築に関わる「web担当者・技術者」の方向けの内容です。

デジタルエクスペリエンス部所属、webディレクターの伊與田です。

最近、大手ECサイトの店舗構築に携わる機会がありました。
噂には聞いておりましたが、やはり管理システムや店舗運営システムにはかなり苦戦をしました。

その中でもダントツで苦戦をしいられたのが、とあるECモールで

カテゴリページをスマートフォン表示させる

ことです。

スマートフォンで閲覧しても「PCのレイアウト」が小さく表示されるだけで、
スマートフォン表示が正しく出来ないのです。

スマートフォン表示イメージ


他のWeb制作者のサイトを参考に、
商品ページの紐づけ・商品ページへの遷移・反映までの24時間待機
を行いましたがなぜかうまく行きませんでした。

その後、再三にわたる公式サポートチャットへの
問い合わせの結果、たどり着いた原因は

カテゴリに紐づけした商品ページが「倉庫」の中にあったから

というモノでした。

つまり、

カテゴリに紐づけした商品ページは「販売中」に

する必要があるそうです。

そうしないと商品ページがECプラットフォームのサーチに引っかからず、
「カテゴリに紐づけされてる商品」扱いがされず、
「なんの商品も無いカテゴリ」と判断され、
「カテゴリページがスマートフォン表示されない」といったコトのようです。


ちなみに「販売中」にしていても、
「サーチ非表示」にチェックが入ってしまっていると、
同様に「カテゴリページがスマートフォン表示されない」のでご注意ください。

大抵の不明点は、公式に提供されている膨大なマニュアルや
有識者のブログ記事で解決出来ましたが、

そんなの分かるワケない

という仕様が、大手ECサイトの管理システムにはちょこちょこ存在しています。

なので、

そんなの分かるワケない

と苦戦しているweb担当者様は、是非一度、
ECサイト構築実績のある弊社までお声がけください。

アピリッツのEC構築支援とソリューションに関する詳細はこちらです

アピリッツ(証券コード:4174) 東証JASDAQスタンダード市場 新規上場!当日はこんな感じでした

0

アピリッツは2021年2月25日に東証JASDAQスタンダード市場へ新規上場しました。証券コードは4174です。上場日当日の様子をCFO永山のコメントを交えつつお伝えします。(2021年2月取材)

緊急事態宣言発令中。でも、ちゃんと上場しました

新規上場日の朝8時半、アピリッツの和田、永山、魚谷、三原が主幹事証券会社であるみずほ証券株式会社様に上場のご挨拶に伺いました。こちらで初値のマーケットアップデートを見学します。

エントランスに集合した監査役の三原と、取締役の魚谷。スーツがすてきです
社長の和田。「緊張はしてないよ」とのことでした

本来であれば盛大に……となるところですが、今は緊急事態宣言が発令中。よって、東証でのセレモニー(鐘をカーンと鳴らすアレです)や会社での祝賀会は、ありませんでした! ですので、「せめて……」ということで、みずほ証券さまがセレモニーを開催してくださいました。

みずほ証券株式会社の吉田さまと記念撮影
新規上場を見届けたあと、みんなで記念撮影
記念品の地球儀。「セカイに愛されるインターネットサービスをつくり続ける」というアピリッツのスローガンにあわせて選んでくださったそうです。すてきな贈り物です

このときどんな気持ちだったか、CFOの永山に聞きました。

セレモニーがないのは残念でした。「上場した」といっても実感はなかなかなわかないものですが、役員だけでなく過去から当社の歴史を築いた人たちみんなでセレモニーに参加して今までの苦楽を思い出しながら、未来に思いを馳せることで心機一転するのですが、その機会がなかったので。ただ、みずほ証券のセレモニーを通じて、初値のマーケットアップデートを見て注文が入っていく様は正に今までと違うステージにきたんだなあと感じることができました。

オフィスはお花と祝電と記念品がたくさん

ちょうどそのころオフィスでは朝からお祝いのお花や電報が続々と届いていました。ありがとうございます!

受付に入りきらず、廊下の奥までずっとお花がならんでいます。ありがとうございます!
みずほ証券さまから真っ白で大きな胡蝶蘭、そしてみずほ銀行さまからはブルー(みずほカラー!)の胡蝶蘭
帰社後、新規上場の記念品として東証から贈られるレリーフと木槌ではしゃぐ和田とCFOの永山

そして東証へ。ストックボイス出演、記者会見

午後から東京証券取引所に移動し、和田がTV番組「ストックボイス」に出演し、番組出演後は和田と永山の両名で「兜倶楽部」にて記者会見をおこないました。どちらでもアピリッツの事業内容と成長戦略についてお話しました。

木槌と盾で盛り上がったあと、東証に向かう和田と永山
放送終了後

今回は記者会見やストックボイスの出演でしたが、今後も様々な機会に投資家やそれ以外の人へも当社が知れ渡っていきます。正に上場した事がきっかけですね。
また、記者会見の質疑応答や、日々IRへ問合せが入ってくる中で感じるのは世の中のDX化の波の中で、Webソリューション事業が果たす当社の役割、またオンラインゲーム事業では新作などへの期待感など、当社への期待値は非常に高いです。

やりきった感あり。でもここからがスタートです

アピリッツのみんなに知ってほしいのは、非常に当社は期待されていること、また期待の裏側には求められるものが高くなっていくこと、またそういった会社に在籍しているんだって自負と自覚を知ってくれたらうれしいですね。
お客様や投資家などの様々なステークホルダーの高い要求に答えていく中で実は会社も個人も成長していきます。これが経験できるのはまさにこのステージの会社ならではですからお客様も投資家もひいては社員のみんなもハッピーになれるように航海を楽しんで進んでいきたいですね。

これからもアピリッツは「ザ・インターネットカンパニー」という理念に基づき、「セカイに愛されるインターネットサービスをつくり続ける」ことを目指し、企業のDX推進のラストワンマイルを支援してまいります。

「上場して、より良い会社をみんなで作っていきたい」アピリッツ社長 和田順児 インタビュー

0

アピリッツは2021年2月25日に東京証券取引所JASDAQスタンダード市場へ新規上場しました。環境が大きく変わりつつあるアピリッツについて、代表取締役社長執行役員CEOの和田にインタビューしました。(2021年2月取材)

今後10年、急成長が見込める事業環境

―― アピリッツの社長として考える「アピリッツの魅力」は何でしょうか。

まず、事業環境の魅力が挙げられます。

Webソリューション事業からお話しますと、現在はDX(デジタル・トランスフォーメーション)の潮流によって問い合わせが増えています。

我々アピリッツがご提供しているのは、企業のDXのラストワンマイルに対する支援です。

ラストワンマイルとは「企業と顧客との接点」を指します。通常の企業内システムを作るシステム会社さんは多くいらっしゃいますが、この「企業と顧客との接点」に特化した会社は少ないのではと考えています。ですから引き合いが非常に強いです。そういう外部環境の良さがあります。

それにともない、今後10年、会社は急成長していくと考えています。社員数も増えるでしょう。その中において、投資家の皆様には「事業の拡大をご期待ください」とお伝えできます。

そして、社員に対しては「成長する企業の一員として、自分も成長しキャリアを築いてゆく」ことを魅力として感じてもらえれば、よい循環がうまれるのではと期待しています。

次に、オンラインゲーム事業について。ゲーム業界全体で今後10年どうなるかを考えますと、強いIPを持つ大手ゲーム会社は、このまま成長していくでしょう。ですが、スマートフォン用のソーシャルゲーム事業だけの会社がこれからも成長していくかというと疑問です。

当社は、その不透明なオンラインゲーム事業で、受託開発とクリエイター派遣事業に力を入れて、成長と安定化を図ってきました。おかげさまでこの4年間、受託開発やクリエイター派遣事業は、売上が毎年30%増で成長しています。そういった観点で見ると、不透明な環境ではありますが、暫くは安定的な成長が継続できる可能性は高いと考えています。

上場によって成長速度が変わる

―― 上場することで、会社にどんな変化があると考えていますか。

実は、個人的には上場しても仕事や環境に大きな変化はないんじゃないかと考えていました。ですが、いざ上場が決まってからは成長速度が変わってきたのを感じます。「これならもっと大きく成長できる」と思う瞬間が増えているのです。

たとえばお客様からのお問い合わせや、採用の直応募が急増しています。これらは間違いなく成長の源泉となるものです。

―― 和田さんは今後どのようにアピリッツを舵取りしていきたいですか。

当初からの大きな目標として「会社の桁をひとつ上げる(売上、利益、従業員の数)」ことを社内のメンバーと社外の方々にお伝えしてきました。そして、今回の上場によって、その環境が整いつつあると思います。

当初の目標である桁を上げるまでは、自分が責任を持って舵取りを行うつもりですが、そのあと更に大きく成長させるのは、次の誰かに託すかもなと考えています。

「自分だったら会社をもっと大きくできる」という自信を持つ人こそが社長にふさわしいと考えています。ですから、過去の実績や経験に裏打ちされた確かな自信のあるリーダーを求めます。新しい役員体制も必要でしょう。

自分がいたほうがいいのか、他の誰かにバトンタッチしたほうがハッピーなのか、見極めていきます。

―― アピリッツの一員となってもらいたい人物像を教えて下さい。

ポジティブかつ成長意欲のある人ですね。アピリッツでやりたいことが明確にあって、意見交換ができる方に来ていただきたいです。

「自分が頑張れば、自分に返ってくる環境」

―― 今いる部長やGMといったリーダー層にどのようなことを期待していますか。

おそらく数年以内にアピリッツは1000人規模の会社になります。1000人規模の会社で自分たちはどういう仕事をしていたいか。ビジョンを描きつつ、逆算して今から動いてほしいです。

規模の拡大と共に、すべての社員の給与等の待遇を上げていきたいですし、上がっていくべきだと心の底から思っています。そして、給与が上がれば求められる責任や能力が上がります。リーダー層の社員には、そういったキャリアアップの示しとなってもらいたい。

―― 社員全員には何を求めますか?

今の自分たちが高度経済成長期のような環境にいることを意識してほしいです。DXとアフターコロナのなかで、インターネット業界は伸びしろがまだありますし、私達の業績も伸びていくでしょう。つまり社員全員にチャンスがあるのです。

より多くの人が上を目指す環境を作るために評価制度を整えました。「自分が頑張れば、自分に返ってくる環境」としたいのです。先日のオフィス増床の準備を新卒入社の社員たちに任せたのも、そういった意図からでした。受け身ではなく自ら働きかけて良い環境を作っていく。

そうやってより良い会社をみんなで作っていきたいです。やっていきましょう!

※ 2021年2月25日18時追記
投資家向け動画メディア「IRTV」にてアピリッツ代表和田のインタビューが公開されました。当社のビジネスモデルやビジョンについてお話しします。ぜひご覧ください。

masterデータ入力のExcelのポイントと便利機能

0

こんにちは、ゲームデザイン部プランナーの堀井です。
ゲームプランナーには企画書や仕様書の作成、データ入力等の様々な業務があります。この記事では私が行っているデータ入力の業務について取り上げて、作業に慣れていく過程で経験した作業のポイントをお伝えしたいと思います。

私は現在運営プロジェクトにて、masterデータの入力作業を主に行っています。そもそもmasterデータとは、ゲーム内での表示や数値を設定する表形式状のデータのことを指します。基本的にはExcelデータで管理されていることが多いです。データが入力されたExcelデータはCSVファイルに変換されゲームのデータベースに反映されます。

実際の入力ではExcelを使用するのですが、私はExcelが超得意!……というわけではなく、かなりのExcel初心者だったため、作業に慣れるまでとても時間がかかりました。その中で慣れるまでに経験したExcelで作業を行う3つのポイントがありました。

その1.セル同士の関係を知る
その2.シート内外の範囲参照を知る
その3.ファイル間のリンクを知る

この3つのポイントについて、自分が作業する際に使われた便利なExcelの機能を合わせて説明していきます。

その1.セル同士の関係を知る

まずはExcelで何をしているのかを知るために各箇所のセル内を見て回りました。そうすることで中の関数からセルが何をしているかが分かるからです。でも中には関数だらけでぱっと見での理解が難しいことや、そのセルがどこで使われているまでは中の関数を見るだけでは分かりません。そういったセル同士の関係を知る際にとても役に立ったのが「参照先/参照元のトレース」という機能です。

この機能を使うと選択しているセルの参照元及び参照先がシート内に矢印で確認することができます。

選択していたセルから矢印が表示され一目瞭然に

またシート外の参照は矢印の先にある表アイコンを選択すると、リストが表示され確認できます。

選択しているセルの参照先がリストで表示された

これを活用することで複雑な関数や、セルがどこに参照されているかを素早く確認することができました。

その2.シート内外の範囲参照を知る

masterデータは基本複数のデータを管理するものであるため、セル単体だけでなく、列や行、シート単位で範囲的にセルが何をしているのかを理解する必要があります。そんな範囲的な理解の際に一つのプルダウンが障害となりました。プルダウンの機能は任意の範囲に入力されているデータをリストで表示するものですが、担当したmasterでは「名前の管理」という別の機能がプルダウンと併用されていため障害となってしました。

この「名前の管理」という機能は指定した範囲に対して「名前」を設定する機能です。一つの範囲を複数個所で利用する際に範囲の管理を楽にすることや、応用することで1つのプルダウンから数種類のリストを表示することもできます。

応用例である複数のリスト表示:E列の入力で名前を参照できるように入力規則を設定した

この機能を知ることで弊害なくセルの確認ができ、さらには機能の活用によって簡単に範囲的にセルが何をしているのかを知ることができました。

その3.ファイル間のリンクを知る

実際作業する際には関連しているファイルを開き、正しいファイルを参照させる必要があります。ですが関連しているファイルがどれとどれなのかExcelデータを触り始めた初心者には簡単にわかりません。ましてや1つ1つのセル内の関数を確認して関連しているファイルを見極めるのはとても面倒です。そんなファイル間の関係を一目で確認するために使うのが、「リンクの編集」です。

選択したファイルのリンクを確認でき、間違ったファイルのデータを参照していないかなどの確認ができます。間違えたファイルを参照してしまっている場合、ファイル名が同じであれば「リンク元の変更」でリンクを置き換えることも可能です。作業の際に役立つこととして、「ちょっとしたデータを別ファイルでもらったから反映しなきゃ」などのデータのコピペをする際にコピペミスがないか確認できるので便利です。

リンクしているファイルをリストで確認できた

以上3つのポイント

その1.セル同士の関係を知る
その2.シート内外の範囲参照を知る
その3.ファイル間のリンクを知る

をおさえながら作業を行った私は素早くExcel作業に慣れることができました。機能でデータの見方を覚えれば作業自体にも応用が効くはずですし、Excelを改修する際に役に立つはずです。Excelでmasterデータの入力をする際にはぜひ思い出していただければと思います。

読んでいただきありがとうございました。

Flutterによるアプリ開発 <Firebase連携編>

0

ゲームデザイン部中村です。

引き続きFlutterによるアプリ開発について記載していきます。前回・前々回については以下のリンクからご覧ください。

Flutterによるアプリ開発<導入編>

Flutterによるアプリ開発<ウィジェットレイアウト編>

Flutterの導入とウィジェットレイアウトについて説明してきましたが、SNSやショッピングサービスなどではアプリのみですべてのサービスを完結させることはできません。サーバ上にユーザ情報を格納し、SNSではサーバから友達の情報を取得しなければならず、ショッピングサービスでは商品の在庫があるかをサーバに問い合わせなければなりません。このようなとき、サーバ側の環境構築をすべきなのですが、非常に面倒です。

そこで今回は幅広くサーバ側にサービスを用意している、Flutterと非常に相性の良いFirebaseとの連携を行います。

今回は画像多めでお送りします。

Firebaseとは

Googleが提供するアプリケーション開発プラットフォームです。代表的な6つのサービスがあり、その特徴は「クロスプラットフォーム」「インフラ構築不要」ということにあります。

Authenticationはユーザ認証を手軽に導入できます。メール/パスワードだけでなく、Google・Twitter・Facebook・Appleなどのユーザ認証を一つのソースコードで行うことができます。

CloudFirestoreはスケーラブルなNoSQLデータベースです。MySQLやPostgreSQLとは異なり、データを保存するドキュメントがあり、コレクションの中に複数のドキュメントが存在します。

RealtimeDatabaseはJSON形式のデータを保存するNoSQLクラウドデータベースです。保存されたデータは接続しているすべてのクライアントで同期され、リアルタイムに更新されます。

Storageは写真や動画などを保存、提供するストレージサービスです。

HostingはWebコンテンツホスティングサービスです。Webアプリ、静的コンテンツ、動的コンテンツをCDNに配信することができます。

CloudFunctionsはサーバレスにHTTPSリクエストをトリガーとしてバックエンドコードを実行します。マネージド環境で実行されるため、個別のインフラ構築が不要です。

以上6つのサービスから、今回はCloudFirestoreにデータを格納しStorageに画像を保管するという流れを説明していきます。

Firebaseプロジェクトの作成

まずはFirebaseコンソールへ移動しましょう。

「プロジェクトを追加」ボタンから作成を開始します。

「まずプロジェクトに名前をつけましょう」と表示されるので今回は「mTest」と名付けました。「続行」します。

「このプロジェクトで Google アナリティクスを有効にする」のチェックがありますので、ONのままにして「続行」します。

「Google アナリティクスの構成」では「新しい構成」から名前をつけ、アナリティクスの地域を日本にしました。

以上でプロジェクトが作成されます。

iOS構成設定

プロジェクト画面が開いたら、iOSでFirebaseを利用するための構成を進めます。

「アプリにFirebaseを追加して利用開始しましょう」からiOSを選択します。

「アプリの登録」ではバンドルIDを登録します。今回は「com.sample.mtest」としました。その他の項目は空欄で「アプリを登録」。

「設定ファイルのダウンロード」が表示されますので、GoogleServices-Info.plistをダウンロードします。SDKの追加、初期化コードの追加は行いませんのでそのまま「次へ」と進み「コンソールに進む」で完了です。

CloudFirestoreの初期設定

Flutterで表示するための仮データを作成していきましょう。

まずは左側メニューからCloudFirestoreを選択し、「データベースの作成」をクリックしましょう。

データベースの作成では「テストモードで開始する」にしておきます。作成後にセキュリティルールを設定しない限り30日間ユーザ認証なしに誰でも参照できるようになるので、ここままサービスリリースできない点はご注意ください。

「CloudFirestoreのロケーション」はasia-northeast1にしておきます。テストのうちは特に気にする必要はありませんが、普段から同じロケーションに設定しておくと忘れなくて良いと思います。

しばらく待つとデータベースが作成されるので、「コレクションの追加」を行います。今回は仮データとして食べ物を5つ用意します。

必要なデータとしては「name」「price」「image」を用意します。imageには後で用意する食べ物画像のファイル名を指定します。

同じ要領でうどん、パスタ、カレーライス、ピザを用意しました。

Storageの初期設定

続いてStorageに食べ物の画像を設置します。こちらはすでにファイルストレージとして利用できるようになっていますので、「ファイルをアップロード」から5枚の食べ物画像をアップロードします。これらの画像はいらすとやさんからお借りしました。

また、今回はFirebaseAuthを利用したユーザ認証については省略しているため、Storageのルールを以下のように編集します。これによって、ユーザ認証なしでStorageのファイルを読み書きできます。

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

FlutterとFirebase連携

Firebaseでの仮データができたのでFlutterからFirebaseにアクセスするための設定を進めていきます。

FlutterにFirebaseSDKを導入

ウィジェットレイアウト編でも登場したpubspec.yamlにプラグインを記述します。

dependencies:
  flutter:
    sdk: flutter
  http: ^0.12.2
  # 以下を追加
  firebase_core: ^0.5.0
  cloud_firestore: ^0.14.0
  firebase_storage: ^5.2.0

pubspec.yamlに追記をするとホットリロードが動作するので問題なくアプリが動くことを確認します。

続いて、FirebaseにバンドルIDをcom.sample.mtestと登録したので、アプリ側のバンドルIDも変更します。FlutterアプリはVSCodeからプロジェクトを生成すると自動でcom.example.{プロジェクト名}というバンドルIDに設定されます。そのため、VSCodeの文字列検索からこのバンドルIDを探し、全て差し替えます。

続いて、iOS構成設定でダウンロードしたGoogleServices-Info.plistをプロジェクト内に配置します。このファイルにはiOSアプリからFirebaseへアクセスするための認証情報が含まれています。その内容はFirebaseのプロジェクト毎に異なるので注意してください。

また、このファイルの追加にはXCodeが必要です。MacのFinderからプロジェクトを開き、ios/Runner.xcodeprojをダブルクリックしてXCodeを起動しましょう。配置位置は以下の画像を参照してください。

FlutterにてFirebaseからデータを取得する

初期化コード

以上でFirebaseとの連携準備は完了しましたので、ソースコードの方を編集してFirebaseからデータを取得しましょう。

まずはFirebaseを利用するための初期化を行います。main.dartの上部でFirebaseをimportします。

~~~
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart' as cloud_firestore;
import 'package:firebase_storage/firebase_storage.dart' as firebase_storage;

これら3行でFirebaseのコア、Firestore、Storageをimportできます。FirestoreとStrageについてはasオプションで別名利用できるようにしています。

さらに、もともとあったvoid main()関数を以下のように書き換えます。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

main関数をFutureにすることで、内部でawaitが使えるようになります。これによって、アプリの起動直前にFirebaseの初期化を行ない終了まで待つことができます。ただし、アプリが起動しないとFlutterで用意されたメソッドが呼び出せないため、WidgetsFlutterBinding.ensureInitialized();でFlutterの機能を呼び出せるようにしています。これはおまじないと思っていただいて問題ありません。

ここまでの書き換えではまだFirebaseの機能を呼び出していないため、前回作成した天気のリスト表示が同じ用に表示されることを確認してください。

CloudFirestoreから食べ物リストを取得

続いて、CloudFirestoreからデータを取得してきましょう。Scaffoldを以下のように編集します。

Scaffold(
  body: Padding(
    padding: const EdgeInsets.all(8.0),
    child: StreamBuilder<cloud_firestore.QuerySnapshot>(
      stream: cloud_firestore.FirebaseFirestore.instance.collection('items').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return LinearProgressIndicator();
        return ListView(
          children: snapshot.data.docs.map[1]e)=>ListTile(
            title: Text("${e.get('name')}"),
            subtitle: Text("${e.get('price')}円"),
          .toList(),
        );
      },
    )
  )
);

ここではStreamBuilderが登場します。

ウィジェットレイアウト編ではFutureBuilderを利用してHTTPレスポンスを画面に描画しました。FutureBuilderは一度の呼び出し結果を待ち、レイアウトに反映します。

それに対してStreamBuilderstreamに指定したsnapshotに変更がある度、自動でレイアウトに反映します。CloudFirestoreはこの機能を利用してデータの変更を検知しレイアウトを更新できるようになっています。

上記Scaffoldの書き換えによって以下のようなレイアウトができたと思います。

それでは実際にStreamBuilderの効果を確認しましょう。ブラウザのCloudFirestoreとiOSシミュレータを画面上に並べて表示し、食べ物名や金額を編集してみましょう。ブラウザでデータを編集すると即座にiOSシミュレータに反映されることが確認できます。

Storageから画像を取得

CloudFirestoreに用意した食べ物について、それぞれのアイコンを表示するためにStorageから画像を取得しましょう。

アイコンのファイル名をCloudFirestore内のデータにimageとして指定してあるため、このファイル名でStorageに画像の問い合わせを行います。まずはHTTPリクエストで画像を表示するために以下のプラグインを追加します。

dependencies:
  ~~~~
  cached_network_image: ^2.4.1

また、このプラグインをmain.dartにimportします。

import 'package:cached_network_image/cached_network_image.dart';

また、main.dartの最下部に以下のクラスを追加します。このクラスではFuture<String>を指定して、そこで受け取る文字列を画像のURLとしてCachedNetworkImageに渡すFutureBuilderとして機能します。

~~~~
class NetworkImageBuilder extends FutureBuilder {
  NetworkImageBuilder(Future<String> item)
  : item = item,
  super(
    future: item,
    builder: (context, snapshot) {
      if(snapshot.hasData) {
        return CachedNetworkImage(
          imageUrl: snapshot.data,
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
        );
      } else {
        return CircularProgressIndicator();
      }
    },
  );
  final Future<String> item;
}

上記クラスをListTile内で以下のように利用します。

ListTile(
  leading: NetworkImageBuilder(firebase_storage.FirebaseStorage.instance.ref().child(e.get('image')).getDownloadURL()),
  title: Text("${e.get('name')}"),
  subtitle: Text("${e.get('price')}円"),
)

ここでStorageから画像を取得するURLをNetworkImageBuilderに指定しています。firebase_storage.FirebaseStorage.instance.ref()でStorageにアクセスするリファレンスを取得し、child(e.get('image'))で該当のファイルを指定、getDownloadURL()でファイルにアクセスするURLを取得しています。このときgetDownloadURL()Future<String>を返却するため、一旦FutureBuilderでURLを待ち、その後CachedNetworkImageで画像の取得を待つ、という流れが必要となります。

以上の編集によって以下のようなリストが確認できると思います。これでStorageから画像を取得することができました。

以上、三回に渡ってFlutterによるアプリ開発を記述してきました。

導入編ではFlutterのSDKを用意しアプリ画面が表示されるまで説明しました。

ウィジェットレイアウト編ではアプリらしいレイアウトを作るための方法と、HTTPを通してサーバからデータを取得する方法を説明しました。

そして今回はFlutterと相性の良いFirebaseとの連携について、FirestoreとStorageを用いて説明しました。FirebaseについてはAuthenticationを導入してユーザ認証の実装をおすすめします。

ここまで記述してきた情報によって様々なアプリ開発が可能かと思います。是非アプリ開発を行ってみてください。

References

References
1 e)=>ListTile( title: Text("${e.get('name')}"), subtitle: Text("${e.get('price')}円"),

open-jtalk で日本語の読み上げをさせる

0

やること

PCに日本語テキストを音読させてみます。
mac と fodora33 で試したので
インストールのコマンドと簡単なスクリプトを記載します。

mac版

環境

uname -a
Darwin macbook1010390.local 19.6.0 Darwin Kernel Version 19.6.0: Thu Oct 29 22:56:45 PDT 2020; root:xnu-6153.141.2.2~1/RELEASE_X86_64 x86_64

brew --version
Homebrew 2.7.5

afplay -h
    Audio File Play
    Version: 2.0

インストール

brew install open-jtalk

バージョンやファイルパスなど表示されるので確認します。

以上、あとはスクリプトを書いて実行するだけです。Homebrew ありがたや。

スクリプト

cat ~/bin/mei 
#!/bin/bash

OJT_DIC=/usr/local/Cellar/open-jtalk/1.11/dic
OJT_VOICE=/usr/local/Cellar/open-jtalk/1.11/voice/mei/mei_normal.htsvoice
OJT_TMP=/tmp/out.wav
if [ -p /dev/stdin ]; then
    cat -
else
    echo $@
fi | open_jtalk -x $OJT_DIC -m $OJT_VOICE -ow $OJT_TMP
afplay $OJT_TMP

実行例

chmod u+x ~/bin/mei
mei 厳密に言うとトマトは果物です。
mei その家には人間と豚と犬と鶏と家鴨が住んでいたが、まったく、住む建物も各々の食物も殆ど変っていやしない。

fedora33版

環境

uname -a
Linux kiwi.kadosawa6 5.10.11-200.fc33.x86_64 #1 SMP Wed Jan 27 20:21:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

ffmpeg --version
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers

インストール

# いろいろ取ってくるので適当なアーカイブ置き場へ移動します。
cd /usr/local/src
# 音声作成エンジンをインストールします。
 wget https://downloads.sourceforge.net/project/hts-engine/hts_engine%20API/hts_engine_API-1.10/hts_engine_API-1.10.tar.gz
 tar zxvf hts_engine_API-1.10.tar.gz
 cd hts_engine_API-1.10/
 make
 make install
# open-jtalk本体をインストールします。
cd /usr/local/src
wget https://downloads.sourceforge.net/project/open-jtalk/Open%20JTalk/open_jtalk-1.11/open_jtalk-1.11.tar.gz
tar zxvf open_jtalk-1.11.tar.gz
cd open_jtalk-1.11/
./configure --with-charset=UTF-8
make
make install
# 音響モデルをインストールします。
cd /usr/local/src
wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.8/MMDAgent_Example-1.8.zip
unzip MMDAgent_Example-1.8.zip
# 呼び出し易いようにシンボリックリンクを作成しておきます。
cd /usr/local/share/
ln -s /usr/local/src/MMDAgent_Example-1.8/Voice hts_voice

スクリプト

cat ~/bin/mei
#!/bin/bash

OJT_DIC=/usr/local/src/open_jtalk-1.11/mecab-naist-jdic
OJT_VOICE=/usr/local/share/hts_voice/mei/mei_normal.htsvoice
OJT_TMP=/dev/shm/out.wav
if [ -p /dev/stdin ]; then
    cat -
else
    echo $@
fi | open_jtalk -x $OJT_DIC -m $OJT_VOICE -ow $OJT_TMP
aplay $OJT_TMP

実行例

chmod u+x ~/bin/mei
mei 季も桃も桃のうち
mei 裏庭には二羽鶏がいる

所感

目が疲れているとき、こういうのを使ってドキュメントなどを確認するのも良いかもと思って試してみました。読み方の選び方やイントネーションをカスタマイズできないかなぁと思うこともありますが、未来を感じつつ現実に直面している感じがして楽しいです。

【2021年度版】GDPR/CCPA対策!Googleアナリティクスのプライバシー保護最新情報

0

デジタルビジネス部コンサルタントの関です。

主にGoogleアナリティクスを用いたデータ解析基盤構築を支援しております。近年、欧州をはじめとした地域でプライバシー保護がトレンドとなり、国内の顧客でも海外展開されていらっしゃる企業では「GDPRはどうか、CCPAはどうか」と話を伺うことが多くなりました。

もちろんGoogleさんも活発に仕組みづくりを働きかけておりますので、今回はGoogleアナリティクスを取り上げてGDPR/CCPAに対する取り組みとそのために設定すべきポイントをご紹介させていただきます。

GDPRとは

皆さんご存じかと思いますが、GDPRとは欧州で2018年6月に施行された法律「General Data Protection Regulation」の略で、日本では「EU一般データ保護規則」と呼ばれることもあります。

生活者の個人データを自分自身でコントロールできるようにするために、Cookieなどの個人情報を取得する際は「暗黙的ではない同意」を得ることが求められるようになりました。最近Webサイトを見ると、「Cookie取得を同意していただけませんか?」とポップアップが出てくることがありますよね。あれがまさにGDPRを意識した対策の一環となります。

違反した企業に対しては罰金制裁の事例もあり、Googleフランスではターゲティング広告の透明性や説明責任の欠如ということで約62億円の罰金が科せられたことは記憶に新しいかもしれません。

CCPAとは

2020年1月施行と真新しい話となりますが、米国カリフォルニア州で施行された法律「California Consumer Privacy Act」についても取り上げていきましょう。

GDPRに比べて消費者の知る権利に比重を置いており、「私の情報がどう使われているか教えてほしい」と求められたときに開示が義務化されるということが重要な部分となります。つまり、消費者から預かった情報は適切に「管理」「運用」してくださいねという法律です。

最近では、米国全土への波及、連邦法への統一が求められているなど盛んになっており、主要ブラウザがこぞってCookie制御の動きを示しています。SafariのITP対応しかり、ChromeもCookieを取得やめるかもという話が出てましたね。

Googleアナリティクスは安全か?

GDPRおよびCCPAの文脈から見た時に、Googleアナリティクスで取得された情報の管理体制には問題がないのか、というのが気になるポイントです。結論から申し上げると、サイト運営者がしっかりと仕様理解して必要な対策ができれば現行法では問題ない、と考えられます。

理解しておくべき仕様①:データ設定管理

Googleアナリティクスではデータの収集・保持・共有に関する設定をある程度調整することができます。

前提として、Googleアナリティクスなどのアクセス解析ツールでデータ取得を行う際には、サイトポリシーやプライバシーポリシーにその旨を記載する必要があります。ただ、企業によっては法的リスクなどの理由でポリシーを厳密に指定する必要があるため、その設定をツール側で調整できるのはGoogleアナリティクスの利点と言えるでしょう。

具体的にできることとして、以下の項目があります。詳細についてはそれぞれの記事で紹介予定となりますので更新をお待ちください。

  • データ処理規約に同意するか否かの選択
  • WebプロパティのIPアドレス匿名化
  • データ収集を一部またはすべて無効化
  • データ保持期間の設定
  • Googleと共有するデータの指定
  • Googleシグナルの設定確認

理解しておくべき仕様②:データ連携管理

Googleアナリティクスの特徴のひとつに、Googleエコシステム上の他ツールとの連携がしやすいという面があります。

その中でもGoogle広告のパーソナライズは、マーケティングを行う上で欠かせない機能となっていますが、ここにもGDPR/CCPAのリスクが存在いたします。最近になって、このパーソナライズの範囲を細かく管理できるようになりました。

これまでもプロパティ単位でGoogle広告との連携有無は指定できたのですが、地域単位(基本は国、アメリカは州別)でオンオフができるようになったのは明らかにGDPR/CCPAを意識した改修といえますね。

また、ユニバーサルアナリティクス(UA、従来のGAプロパティ)はもちろんのこと、GA4プロパティにおいてもイベントやユーザープロパティ単位で広告パーソナライズを管理することができます。例えばCookie同意を拒否するユーザーに対して広告パーソナライズを除外するといった設定を行うこともでき、法的リスクを回避できるのは大きいですね。

理解しておくべき仕様③:データ削除管理

さて、CCPAで求められているプライバシーの権利には「削除権」というものがございます。「Googleアナリティクスで個人情報を取得してしまった!簡単に削除できないだろうし、どうしよう…。」と枕を高くして寝られない日々を送るサイト運営者もいたかもしれません。

Googleアナリティクスで収集されたデータは、無償版の場合Googleに所属し、有償版の場合企業に所属するというルールがありますが、不適切なデータ収集をしてしまったときの対処方法としてサーバーからデータ削除するためのリクエスト機能が備わっています。

具体的な方法としては主に3つ。詳細については別記事で順次更新を予定しています。

  • プロパティごと削除する
  • 特定期間データの削除をリクエスト ※UAのみ
  • 特定ユーザーデータの削除 ※UA/GA4対応

まとめ

今回はGoogleアナリティクスにおけるプライバシー保護対策を紹介させていただきました。意外とGoogleアナリティクスデータは簡単に削除できてしまうのですが、反面ミスって消すと貴重な資源の損失につながりうるので注意も必要ですね。

とはいえ、プライバシー保護のためには事前承諾が重要です。Cookie同意ツールを利用したり、法律とGoogleアナリティクスの仕様を理解することでリスクヘッジを取りましょう。

アピリッツでは、Googleアナリティクスを用いたデータ基盤構築サービスをご提供しています。本記事の内容に限らず、困ったことや相談したいことがございましたらお気軽にお問い合わせください。

「DX時代にデジタル領域のユーザー体験設計を提供する」デジタルエクスペリエンス部 長谷 亘 × デジタルビジネス部 飯場俊耶 対談

0

アピリッツは企業のDX(デジタルトランスフォーメーション)推進を今後さらに支援するために、2/1に新組織編成を行いました。今回あらたに立ち上げたデジタルエクスペリエンス部を率いる長谷が、Webコンサルティングの現場で感じたDXの課題についてデジタルビジネス部の飯場と話します。(2021年1月取材)

業務プロセスの改善から顧客体験の創造まで

―― はじめに、アピリッツのDX推進における活動内容を教えてください

長谷:アピリッツでは以前からお客様のDX推進を助けるために様々なアプローチを取っています。

具体的には、お客様のビジネス構想の具現化に向けたデジタル技術やマーケティングのコンサルティングを生業にしている「デジタルビジネス部」を2018年より推進してきました。

また、去年の動きでいいますと、オンプレミス環境からAWSやGCPといったクラウド環境への移行を通して、お客様を支援する「クラウドインテグレーション部」を2020年に新設しています。(関連:マイグレーション後もDX推進のお付き合いを。クラウドインテグレーション部設立記念、西脇学 × 剣持大介 対談

そして次はということで、DX推進でも重要となる顧客体験の領域でも事業に力を入れようと考え、組織編制ラッシュではありますが、あらたに「デジタルエクスペリエンス部」を立ち上げました。ユーザーに触れるフロント側の体験向上をテーマに、DX推進およびデジタル人材を育成していくためのトリガーとなります。

―― DXという言葉をよく耳にするようになりました。飯場さんは、コンサルタントとしてアピリッツのお客様との対話を重ねていますが、お客様のDXへの関心度や進み具合はいかがでしょうか?

飯場:多くのお客様がDXを経営の目標に掲げていらっしゃいます。ですが「何をすれば?」というところで止まっている印象ですね。せっかく実店舗でよいサービスや商品を提供しても、それをどうシステム化・デジタル化するか? といったところが各業界共通の課題であると感じています。

たとえば、数千点の商品をただズラッと紙のカタログのように並べただけのECでは、ユーザーは何を買えばいいかわからないので売れません。実店舗で提供するサービス・商品が持つ良さとオリジナリティが、デジタルにフルで活かしきれていないのが現状だと考えています。

長谷:IT化でも頭を悩ませているのにDX化が来ててんやわんやなイメージはあるね。大変です。

競争も激化していく中でそれぞれの企業努力でサービスが多様化・複雑化しているってことなのかな。そして、デジタル領域において、ユーザーがわかりやすくサービスを体験する仕組みや表現が難しいと。

飯場:そうですね、その業界でトップを取るための戦略として、顧客に寄り添ったサービス・商品を作っていらっしゃいますが、それをデジタルでどうつくり上げるかに頭を悩ませています。

デジタル領域でも「また使いたい」をつくる

―― サービスが複雑化するとどういうことがおこるのでしょうか?

長谷:すごく単純な話なんですが、そのユーザーにとって良いサービスのはずなのに気づけないということが起きてしまいます。せっかくの素晴らしいサービスなのに伝わらないって悲しいですよね。

ですので、複雑でも自然とファンになってくれるわかりやすさや伝え方の仕組みが求められています。「顧客」となってくれるファンをいかに増やしていくかを徹底的に分解して再現していくわけです。

―― 売上数値を伸ばす従来のマーケティングとの違いはあるのでしょうか?

長谷:定義が難しくて、どっちもビジネス成長といった目的は同じです。ただ「数値」を満たすか、「顧客満足度」を満たすかといったアプローチに違いがあります。

今までは、ビジネス上の具体的な数値を作るためのマーケティングや、デジタル技術によって業務を効率化していくことが注目されてきました。売上やコスト最適化といった感じです。

これからも必要なアプローチ方法です。ですが、コロナ禍といった世の中の常態が変わる出来事は今後も起こりますし、目の前の数値を追うだけでは業界で生き残れないと、お客様も不安に思っています。

その中で、サービスと顧客との間に信頼関係を築き、「長くファンになってくれる顧客」を作ることが大事で、何度も何度もサービスを通して「良かったな」と思う体験を増やすような「顧客主義」の考え方を私たちはプロジェクトに取り込んでいます。

―― なるほど。体験を良くするアプローチを担うのがデジタルエクスペリエンス部なわけですね。

飯場:そうですね。「デジタル領域のビジネス構想と戦略の立案や、数字計画を立てる」のがデジタルビジネス部の役割。

そして、ユーザーにその戦略をどのように届けるのかといった「デジタル領域でのタッチポイントを設計する、良い体験を創る」のがデジタルエクスペリエンス部の役割かなと。

長谷:まさに、そんな感じですね。同じような名前の部署名でややこしいですが(笑)

ただ、完全に分ける必要はないです。お互い重なるところも実際は多く、「数字と顧客体験の向上」を行き来しながらサービスを提供していくイメージです。

誰が、どこで、どのような場面で、何に興味をもって、気が付いたら習慣になって、良いなと思ってもらう、といった体験全体を設計し、定量的なデータも参考に作っちゃうというのが勝利の方程式です。

もともと、アピリッツは10年以上前からマーケティングやデザインのサービスを提供していますし、デジタル技術やエンジニアのサービスも提供していく中で、顧客主義のニーズが潜んでいることはキャッチしていました。

近年は特にDX推進や経産省のDXレポートでも「ユーザーエクスペリエンスが重要である」「作ったサービスを使ってもらわないと意味がない」ことが述べられています。

これらの経緯をふまえ、デジタル領域でユーザー体験を作ることに特化したチームが必要でした。それが「デジタルエクスペリエンス部」です。

ユーザー体験つくりは顧客とデジタルをつなげる伴走力

―― アピリッツがユーザー体験を考えて実現できる理由を教えて下さい。

長谷:ユーザー体験の向上に必要な実行プランを社内で完結して持っているワンストップソリューションの体制ですかね。

ユーザー体験を実現するうえでは、総合的なアプローチが必要で、学問をまんべんなく修めないとどこかで穴が空いてしまう。周辺サービスに穴が空いてしまうと、顧客に的確に届きにくくなる。アピリッツはその穴を埋めることができる会社です。

飯場:それは現場でも強く感じています。デザイン制作、システム開発、マーケティングといった知識に加えてお客様の業界知識、お客様のユーザーはどういった人たちなのか?、お客様の競合他社はどこで、そこと差別化できるのはどういう点か?などの観点を凝縮してデジタルを作っていけるなと。

長谷:長くアピリッツにいるので慣れてしまっていますが、ビジネス構想とかフロント側の設計について社内の開発陣に断られることってほとんどなくて、シンプルにすごいなといつも思います。同じ会社で一気通貫で作ることの強さや心強いメンバーがいるって素晴らしいです。

―― ユーザー体験について大事にしていることはどのようなことでしょうか。

長谷:当たり前の話かもしれませんが、その業界やサービス、顧客の特性を知ることが大事だと思っています。

その際に、複雑化したビジネスをお客様に教えていただくことも大切です。ユーザー体験を「お客様の情報」と「デジタルな実行」で伴走してつなげていく感じです。難しいのですが、だからこそ価値があるわけですし、やりがいがあります。

飯場:お客様のメンバーへの理解も大事ですよね。私達からのご提案は、技術や顧客体験と同じくらいお客様の社内にいるメンバーの仕事上の体験にも影響が及びます。ですから、5年後10年後にどこを重要視するか、そういった理念を対話によって汲み取り、それを貫きます。

3,000の企業があれば3,000のセカイがある

―― お客様の顧客も、お客様自身の未来も大事にする。そのための対話が重要であると。

飯場:何度も重ねます。プロジェクトは対話のなかで出てきたものを実現する手段なのです。もちろんプロジェクトが始まったあとも対話は継続します。

そうすることで新しい領域を開拓できると信じていますし、ちょっとした悩みもご相談いただけるようになることが寄り添うことの結果だと思います。

たとえば5年間で数億円かけるプロジェクトの場合、5年間も一緒にお付き合いがあるわけですから、ゼロベースで関係を構築するのは双方ともに怖いものです。そのため、日頃からお客様の持っているサービスや理念を知ること、ビジョンやミッションから新しいサービスを提案します。

長谷:今まで培ってきた情報や知識を総動員しないとできない仕事ですよね。特にお客様のサービスが世界で愛されるためには、お客様の理念を我々が先に愛していくというのが大事。

飯場:アピリッツのミッションである「セカイに愛されるインターネットサービスをつくり続ける」と重なりますね。3,000の企業があれば3,000のセカイがあって良いと思っています。

長谷:それ、いい言葉だね。お客様がイメージするセカイについて私達が色を付けることに賛同して、具現化していくような仕事。ってなんだかかっこつけた感じになっちゃいましたが(笑)

飯場:でも、ミッションってかっこいいほうがいいですよね(笑)

―― 最後にDX推進への抱負をお願いします。

長谷:お客様のサービスをいかにデジタルで実現するか、企業価値を上げてゆくかといったDXの構想は、お客様ご自身だけで描くのは難しいですし、私たちだけでも厳しい。だからこそ、アピリッツがお客様と共に伴走し、様々な意見を出しあうことでつくりあげることができると思っています。

インターネットの時代がまた変わろうとしている稀有なこの瞬間を、お客さんと社内のメンバーと楽しんで進めて共に成長できるような企業でありたいです。がんばります。

―― 長谷さんと飯場さんの顧客への情熱が伝わってきました。ありがとうございました!

バンディットアルゴリズムで複数案を効率的に評価!

0

はじめに

データイノベーション部の浅田です。

文章を書くときに、何度も構成や表現を練り直すことを推敲といったりします。この推敲という言葉は中国の故事に由来します。

唐代の賈島という詩人が詩を作っていた際に、「僧は推す月下の門」という句を考えつきますが、「推す」という表現を「敲く」という表現としたほうがいいのではないか、と迷い始めます。彼は考えに夢中になってるうち、韓愈というお偉いさんの行列に突っ込んでしまい咎められますが、韓愈が漢詩の大家だったので、「”敲く”のほうがいい」とアドバイスをもらうなど詩についておおいに語り合った、というのがこの故事の顛末です。

アイデア評価手法としてのA/Bテスト

詩を書くことはないにしても、ビジネスにおいても複数のアイデアを比較・評価するということはよくあります。

前述の賈島の例では、自分のセンスであったり、大家の意見を頼りにアイデアを評価したわけですが、統計学の力を借りてアイデアを評価することもできます。

例えば、Webサービスなどのデザインの比較・評価でよく利用される手法にA/Bテストというものがあります。これはA案とB案という二つのデザイン案があったとして、ユーザをランダムにA案、B案に振り分けて、そのデザイン案に対する反応を比較し、その結果どっちかの案が優れていると統計的に実証できれば、その案を全面的に採用する、というものです。

それをどう評価するかですが、二つの案を望ましい結果(たとえばクリック行動)を確率的に生み出すモデルとみなします。多数のユーザに対してランダムに提示して、その反応結果をデータとして集めることで、それぞれの案が望ましい結果を生み出す確率を推定し比較します。

どれぐらいデータを集めればいいのか

確率モデルのパラメータを推定するにあたって、一番確実なのはとにかくデータを集めることです。データを集めれば集めるほと、より正確なパラメータ、つまり望ましい結果を生み出す確率を推定することができます。

では、どれぐらいデータを集めればいいのでしょうか。100件?1000件?残念ながら、明確にこれだけあれば大丈夫という基準はありません。明らかに確率が違うなら100件でも十分なケースもあるでしょうし、どちらも甲乙つけがたいケースでは10000件でも十分ではないかもしれません。

問題になるのは件数だけではありません。データをたくさん集めればいいのは間違いないですが、データをたくさん集める、つまり長期間テストを実施するということは、ある一定のユーザには劣る案を提示し続けるということになります。例えば二つの案のうち、A案が改善案、B案が現状維持案であるとして、A案がより優れた案であったならばトータルとしてはB案だけでやっていた場合よりも良い結果になる可能性があるので、それほど問題にならないかもしれません。ただ、A案が実際には劣っている案だったとしたら、トータルの結果としては悪くなる可能性があります。つまり、続ければ続けるほど、損失が生まれる可能性があります。

多腕バンディット問題

多腕の画像

そこで、複数の案を試す際に、なるべく損失を少ないように試すアルゴリズムとして、バンディットアルゴリズムというものがあります。

バンディットとは、ギャンブラーから金を奪い取る様子から盗賊に連想された「スロットマシン」の俗称です。複数のあたりの確率が異なるバンディット(スロットマシン)が存在する際に、どのように複数のアーム(レバー)を引けば得られる総額を最大化できるか、という問題を多腕バンディット問題と呼び、そのためのアルゴリズムがバンディットアルゴリズムになります。なので、多腕バンディットといっても、盗賊に腕がたくさん生えているわけではありません。

バンディットアルゴリズムの概念

バンディットアルゴリズムをイメージしやすくするために、こんな設定を考えてみましょう。

あなたは魔王を倒しにいく戦士です。魔王を倒すための武器を手に入れるため、武器屋に行きました。武器屋の主人に「この店で一番良い剣を買いたい」と伝えると、三つの剣を提示されました。武器屋の主人曰く「この三つの剣はどれも最強クラスの切れ味なんだが、時々しかその切れ味を発揮しない魔剣なんだ。切れ味を発揮すれば鉄だって簡単に切れる」ということです。

予算の都合上、三つの剣を全部買うことはできないので、切れ味を発揮する確率が一番高い剣を選ぶ必要があります。そこであなたは武器屋の主人にこう持ち掛けます。

「一回ごとに多少の料金を支払うから、それぞれの剣で試し切りをさせてほしい」

武器屋の主人は言いました。

「わかった。鉄を切れたら(切れ味を発揮できたら)、祝儀としてその回の試し切りの料金はタダでいい」

さて、この時に「切れ味を一番発揮しやすい剣をあまりお金をかけずに選び出すための戦略」というのがバンディットアルゴリズムとなります。

ε-greedy(イプシロングリーディ)アルゴリズム

バンディットアルゴリズムの筆頭格が、このε-greedyです。εはギリシャ文字でイプシロンと読みます。ここではεはある一定の小さい確率を意味します。

ε-greedyにおいては、

  • εの確率でランダムに案を選びます。
  • (1-ε)の確率で、それまでに得られたデータの平均値が最も高い案を選びます。

例えば先ほどの剣の例で説明すると、例えば10%の確率でランダムに剣を選んで試し切りを行います。そして、90%の確率でそれまでに一番鉄を切れた確率の高い剣を選んで試し切りを行います。

つまり、基本的には今まで試したなかで一番有望そうな案を試すけれども、一定確率において、別の案もランダムに試してみる、という戦略になります。

複数の案の中で優れた確率を持つ案があるのであれば、その案が大部分で選択されるように収束されるアルゴリズムです。

一方で、小さい確率とはいえ、ある一定確率で見込みがない案を最初から最後まで平等に試行してしまうアルゴリズムでもあります。

例えば、3回試した際に1回しか鉄を切れなかった剣Aと3回試した際に3回とも鉄を切れた剣Bがあった場合に、剣Aのほうはたまたま運が悪く、剣Bのほうはたまたま運が良かった可能性はあるので剣Aもまだ試す価値はありそうですが、もしこれが剣Aが100回中10回と剣Cが100回中50回という結果であれば、剣Aが剣Cよりも優れている可能性はあまりなさそうだと直感的に思うのではないでしょうか。

そのような時にもε-greedyは、平等に剣A, 剣B, 剣Cをランダムに選んでしまうので、結果が収束するのに時間がかかりますし、一定確率であまり見込みのない案を選んでしまいます。

トンプソンサンプリング

ε-greedyの問題点の一つは、複数の案を試す際にすべての案を常に平等に試そうとする点にあります。この問題点を改善するために、ベイズ統計の仕組みを利用したアルゴリズムがトンプソンサンプリングです。

ベイズ統計学についてはベイズ統計学の世界への誘いで記載したように、その特徴の一つとして確率モデルのパラメータを確率分布で表現します。

トンプソンサンプリングでは以下のような手順を踏みます。

  1. 各案の確率モデルのパラメータを確率分布で表現します。
  2. それぞれの確率分布から乱数を生成(サンプリング)します。
  3. サンプリング結果のうち一番よい乱数を生成した確率分布をもつ案を次に試す案として採用します。
  4. 得られた結果を使って、その案の確率分布をベイズ更新して事後分布を計算し、その案の新たな確率分布とします。
  5. 2~4を繰り返します。

前述の記事において述べていますが、何回中何回成功したというデータを観測することにより、その成功確率をベータ分布という確率分布として表すことができます。

剣の例で言えば、各剣ごとに試行回数のうち何回鉄を切れたかのデータを観測することによって、鉄を切れる確率をベータ分布として表現できます。

確率分布が定義できれば、乱数をサンプリングすることができます。ミソとなるのは、期待値よりも大きい値がたまたま得られることも、期待値よりも小さい値がたまたま得られることもあり得ますが、確率的にあまりあり得ない値はサンプリングされにくいということです。

なので、「採用される案が偏る」という状態が発生するのは、それぞれの確率分布の期待値において統計的に有意差があるということでもあります。

このようにトンプソンサンプリングは、統計的に有望な案を効率的に試しつつ、損失を抑えるアルゴリズムとなっています。

コード例を挙げておきます。

from matplotlib import pyplot as plt 
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st


class Sword:
    def __init__(self, p):
        self.p = p
        self.a = 0
        self.b = 0

    def slash_count(self):
        return self.a + self.b
        
    def slash(self):
        result = np.random.random() < self.p
        if result:
            self.a += 1
        else:
            self.b += 1
        return result
            
    def beta(self, x):
        return st.beta.pdf(x, a=self.a + 1, b=self.b + 1)
    
    def sampling(self):
        return np.random.beta(self.a + 1, self.b + 1)

    
class ThompsonSampling():
    def __init__(self, swords):
        self.swords = swords

    def _next_sword(self):
        samples = [sword.sampling() for sword in self.swords]
        return samples.index(max(samples))

    def do(self, counts):
        for _ in range(counts):
            self.swords[self._next_sword()].slash()


swordA = Sword(0.8)
swordB = Sword(0.5)
swordC = Sword(0.3)
swords = [swordA, swordB, swordC]

ThompsonSampling(swords).do(1000)

theta = np.arange(0, 1.01, 0.01)
plt.plot(theta, swordA.beta(theta), label="swordA")
plt.plot(theta, swordB.beta(theta), label="swordB")
plt.plot(theta, swordC.beta(theta), label="swordC")
plt.legend(bbox_to_anchor=(0, 1), loc='upper left', borderaxespad=1, fontsize=10)

# それぞれの剣を振った数
for sword in swords:
    print("振った数:{}, 鉄を切れた数: {}".format(sword.slash_count(), sword.a))

可視化で表示されたグラフは以下のようなものです。

また、参考までに剣を振った数と鉄を切れた数は

剣A 振った数:77, 鉄を切れた数: 58  
剣B 振った数:14, 鉄を切れた数: 6  
剣C 振った数:9, 鉄を切れた数: 3

となっています。

一番確率の高い剣Aを一番多く試せていることがわかります。

試しに試行回数を1000回にした場合には

剣A 振った数:974, 鉄を切れた数: 780
剣B 振った数:17, 鉄を切れた数: 7
剣C 振った数:9, 鉄を切れた数: 3

となりました。有望案である剣Aの回数は増えている一方、それ以外の案の試行回数はほとんど増えていません。

終わりに

さて、トンプソンサンプリングのアルゴリズムによって、あなたは予算内に一番切れ味を発揮できた剣を選びだすことに成功し、感嘆の声をあげます。

念願の魔剣を手に入れたぞ!

この後どうなったかはご想像にお任せしますが、このようにバンディットアルゴリズムを使うことで、複数のアイデアを効率的に評価することが可能になります。ちなみに、バンディットアルゴリズムは強化学習において最適な方策を選択するためのアルゴリズムとしても使用されます。

なお、剣の例におけるトンプソンサンプリングでは、ほぼ一番有望な剣が選択されるように収束していますが、一番有望な剣でも鉄を切るのに失敗するケースが一定数存在します。なので、何も考えずにランダムに選択するケースや、ε-greedyに比べれば損失を少なくできていますが、さらに損失を少なくするためには、試行回数が十分であると判断した段階で打ち切る必要があります。試行回数が十分かどうかを判断するのはバンディットアルゴリズムの範疇を超えますが、一案としては、各案ごとの期待値に対して仮説検定を行って判断するといったことを行っても良いかと思います。仮説検定に関しては、またの機会にご紹介できればと思います。

以上、この記事が皆様の意思決定の一助にでもなれば幸いです。

最近人気な記事