Cybozu Inside Out | サイボウズエンジニアのブログ

 

(日本語訳) Migrating Garoon codebase to PHP 7

(※注 この記事は2017年8月18日に公開したMigrating Garoon codebase to PHP 7の日本語訳です。)

Garoon開発チームは 一年前にGaroonのソースコードのPHP 7移行作業を開始しました。 Garoonはソースコードも多かったり、もともとPHP 4で書いていたものをPHP 5に移行していたりするので、 移行作業は大変でしたが、移行することで大きな改善が行えました。 メリットの一つは性能改善です。GaroonをPHP 7 で動かしたときのベンチマークは、PHP 5.6と比べると33%改善しました。

そしてまた、php.netによると、PHP 5.6のアクティブサポートは2017年1月19日に終了しています。 ソース: http://php.net/supported-versions.php

この記事では、Garoon開発チームの遭遇した現象と、どうやってPHP 7に移行したかをお伝えします。

互換性のない変更を検出するためのツール

PHP 5から PHP 7に移行するとき、ソースコード全体から"下位互換性のない変更"を見つける必要がありました。私たちのコードがPHP 7で正しく動作することを確認するためです。 ソースコードを調べてPHP 7で動かすために修正が必要なコードを指摘してくれるツールがいくつかあります。その中にPhanとLintがあります

Phan

PhanはPHP用の静的解析ツールです。MITライセンスで公開されています。

環境の準備

PHP 7がインストールされた CentOSマシンを用意します。それから、以下のコマンドでcomposerをインストールします:

curl \-sS https://getcomposer.org/installer \| php \-\- \--install-dir=/usr/local/bin \--filename=composer

Phanとphp-ast拡張のインストール

まず、php-astのソースコードをcloneします:

git clone https://github.com/nikic/php-ast.git

次に、php-ast拡張をビルドして、phpに追加します。以下のコマンドを順番に実行してください。

cd php-ast
phpize
./configure
make install
echo 'extension=ast.so' > /etc/php.ini

それから、Phanをインストールして以下のコマンドで実行してください:

git clone https://github.com/etsy/phan.git
cd phan
composer install
./test
ln \-s /phan/phan /usr/local/bin/phan

Phanを実行して下位互換性のない変更を見つける

私たちは以下の内容のようなbashファイル(例: testPhan.sh)を作成しました:

COMMAND="phan \--backward-compatibility-checks \--ignore-undeclared \--quick"
find /repo/source \-type f \-regex '.*\.\(php\)' \-print0 \| xargs \-0 \-n1 \-P 1 \-I % bash \-c "$COMMAND % "

ファイル中の"/repo/source"をチェック対象のソースコードのパスに変更してください。それから実行します:

sh testPhan.sh

Lint

LintはPHPのコマンドラインオプションです。PHPの文法チェックに使われます。

前述のCentOSのマシンで以下のコマンドを実行し、PHPのソースコードをLintでチェックしました:

find . -name "*.php" -print0 | xargs -0 -n1 -P8 php -l

E_STRICT通知の深刻度の変更

E_STRICT通知の深刻度がPHP 7で変更されています。 すべてのE_STRICT通知がほかのレベルに移動しています。

状況 新しいレベル / 挙動
Indexing by a resource E_NOTICE
Abstract static methods Notice removed, triggers no error
"Redefining" a constructor Notice removed, triggers no error
Signature mismatch during inheritance E_WARNING
Same (compatible) property in two used traits Notice removed, triggers no error
Accessing static property non-statically E_NOTICE
Only variables should be assigned by reference E_NOTICE
Only variables should be passed by reference E_NOTICE
Calling non-static methods statically E_DEPRECATED

私たちのコードでもこれらのいくつかは影響がありました。

Signature mismatch during inheritance

"Signature mismatch during inheritance"通知は以下のようなケースで通常発生します: 一つ目のケースは、関数/メソッドのパラメータの数が継承時に異なる場合です。例:

<?php
class Foo{
    function method($a){

    }
}
class Bar extends Foo{
    function method(){

    }
}

上記の例の出力結果はこちらです:

Warning: Declaration of Bar::method() should be compatible with Foo::method($a) in /in/YoDHq on line 11

この例の実行結果はこちらで確認できます。

二つ目のケースは、関数/メソッドのパラメータの型が継承時に異なる場合です。例:

<?php
class Foo{
    function method($a){

    }
}
class Bar extends Foo{
    function method(array $a){

    }
}

上記の例の出力結果はこちらです:

Warning: Declaration of Bar::method(array $a) should be compatible with Foo::method($a) in /in/fSIbS on line 11

この例の実行結果はこちらで確認できます。

私たちはPhanを使ってコードをチェックし、PhanSignatureMismatch や PhanSignatureMismatchInternal として検知された問題を修正しました。

このタイプの問題の修正方法は、変更対象の基底クラスやサブクラスの中のロジックに依存します。

Only variables should be assigned by reference

例:

<?php
error_reporting(E_ALL);
function foo(){
    return 'string';
}
$temp =& foo();

上記の例の出力結果は以下のようになります:

Notice: Only variables should be assigned by reference in /in/vXUIZ on line 6

この例の実行結果はこちらで確認できます。

上の例では、'&'演算子が"Only variables should be assigned by reference"というE_NOTICEを引き起こしています。PHP 7の環境でコードがコンパイルされた場合は、エラーが検出されてしまうので、以下のように'&'演算子を削除して修正する必要があります:

<?php
error_reporting(E_ALL);
function foo(){
    return 'string';
}
$temp = foo();

しかし、私たちのコードには'&'演算子がたくさん使われており、すべて修正するには時間がかかりそうなことがわかりました。 この問題を解決するため、CentOS上にあるツールを導入しました。 まずはじめに、E_NOTICEメッセージをphp_error.logに出力するため、以下の手順を行います:

1. 以下のスクリプトをwebアプリケーションに追加して、実行します:

set_error_handler(function($errno, $errstr, $errfile, $errline){
  file_put_contents('/tmp/php_error.log', implode(',', [$errno, $errstr, $errfile, $errline]) . PHP_EOL, FILE_APPEND);
});

2. "php_error.log"は以下のようになっているはずです:

2048,Only variables should be assigned by reference,/var/www/project/code/xxx1.php,12
2048,Only variables should be assigned by reference,/var/www/project/code/xxx2.php,121
2048,Only variables should be assigned by reference,/var/www/project/code/xxx3.php,26
2048,Only variables should be assigned by reference,/var/www/project/code/xxx.php,194

このツールは以下の手順を実行します:

  1. tmpフォルダの中からsystem-private-から始まるフォルダの最新のものを見つけます。
  2. tmpフォルダ中のphp_error.logから"assigned by reference"という文字列をgrepで検索します。そして、ファイル名と行番号を一時的な結果として出力します。
  3. 2.の結果をもとに、"=&"、"= &"、"= & "を"="に置換します。
#!/bin/bash

systemd_private_name=$(ls -t1F /tmp/ | grep systemd-private-* | head -n1)
php_error_path="/tmp/${systemd_private_name}tmp/php_error.log"

if [ ! -f $php_error_path ]; then
    echo "File is not found"
    exit;
fi


grep "assigned by reference"  $php_error_path  | sort | uniq -c | while IFS=',' read -ra line ; do
    sed -ri ${line[3]}'s/(\$.+)(\s+=\s*&\s*)(.+())/\1 = \3/g'  ${line[2]}
done

Only variables should be passed by reference

PHP 7では、関数のパラメータを参照渡しにした場合、エラーが発生します。 この問題はPHPのフレームワークやユーザ定義メソッドを使用するときに発生します。

この問題を解決するため、私たちは関数の値を保存するための変数を宣言し、 直接呼ばれていた箇所にこれを渡しました。以下がその例です:

例: explodeで作られた配列をarray_popに渡すと、Strict Standards警告が発生する:

<?php
   $fruit = array_pop(explode(",", "Orange,Apple,strawberry"));
   echo $fruit;

修正後のコード:

<?php
   $fruits = explode(",", "Orange,Apple,strawberry");
   $fruit = array_pop($fruits);
   echo $fruit;

この例で注目していただきたいのは、explode関数用に変数を割り当ててからその変数の参照をarray_popに渡すことで、Strict Standards警告を回避している点です。

PHP フレームワークのメソッド

例:

<?php
   $file_name = "abc.txt";
   $file_extension = end(explode('.', $file_name));

上記の例の出力結果はこちらです:

Notice: Only variables should be passed by reference in /in/Cv65t on line 3

この例の実行結果はこちらで確認できます。

修正後のコード:

<?php
   $tmp = explode('.', $file_name);
   $file_extension = end($tmp);

私たちはPhanを使ってコードをチェックし、PhanTypeNonVarPassByRef として検知された問題を修正しました。 しかし、Phanが調べるメソッドはPHPフレームワークのものだけです。 ユーザ定義関数は PhanTypeNonVarPassByRef として検知されません。以下の例をご覧ください。

ユーザ定義メソッド

例:

<?php
function getArray() {
    return [1, 2, 3];
}

function squareArray(array &$a) {
    foreach ($a as &$v) {
        $v **= 2;
    }
}

// Generates a warning in PHP 7.
squareArray((getArray()));

上記の例の出力結果はこちらです:

Notice: Only variables should be passed by reference in in /in/HYONN on line 14

この例の実行結果はこちらで確認できます。

プロジェクト内のユーザ定義メソッドに対して調査する際は、notepad++などのエディタで正規表現による検索が利用できます。

function.*\&\s+\$.*\)$

上記の例の出力結果はこちらです:

E:\yourproject\comment_util.php (3 hits)
    Line 30:     function getFollowByUser( & $user, & $article )
    Line 61:     function _setNameRowSet( & $rowset, $inverse = FALSE )
    Line 119:     function _row2object( & $row )

参照メソッドを検索結果から見つけた後は、手動で関数呼び出しを修正します。

Calling non-static methods statically

staticではないメソッドのstatic呼び出しはPHP 7で非推奨になり、将来的には削除される可能性があります。

例:

<?php
class foo {
    function bar() {
        echo 'I am not static!';
    }
}

foo::bar();

上記の例の出力結果はこちらです:

Deprecated: Non-static method foo::bar() should not be called statically in - on line 8
I am not static!

私たちはPhanを使ってコードをチェックし、PhanStaticCallToNonStatic として検知された問題を修正しました。 一番簡単な修正は、staticではない関数をすべてstaticな関数に変更することです。

PHP 4コンストラクタ

PHP 4コンストラクタは、クラス内で定義されているメソッドでクラスと同じ名前のものです。

PHP 7ではPHP 4コンストラクタが定義されていると、E_DEPRECATEDが発生します。 メソッド名がクラス名と一致し、クラスが名前空間内になく、PHP 5のコンストラクタ(__construct)がない場合、E_DEPRECATEDが発生します。

例:

<?php

class Filter {
    function Filter() {

    }
}

new Filter();

出力:

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Filter has a deprecated constructor in /in/IDpi7 on line 3

この例の実行結果はこちらで確認できます。

以下のように、PHP 5のコンストラクタを使用する必要があります:

<?php

class Filter {
    function __construct() {

    }
}

new Filter();

大きなプロジェクトの場合、手動での修正は時間がかかります。PHP-CS-Fixerという便利なツールがあります。これを使うと自動で修正することができます。 GaroonではPHP-CS-Fixerを使って500以上のファイルを修正しました。

このツールでPHP 4コンストラクタを修正する方法を記載します。下記のコードをPHP-CS-Fixer 2.2.1で実行してください。

1. まず、PHP-CS-Fixerの設定ファイルを作成します

.php_cs
<?php

$source_dir = 'c:\repo\projectX\source';
$finder = PhpCsFixer\Finder::create()
    ->in($source_dir)
    ->files()->name('*.csp')->name('*.php')
;

return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->setRules(array(
        'no_php4_constructor' => true
    ))
    ->setFinder($finder)
;

注意: Garoonでは、PHPファイルの拡張子として".csp"を使用しているので、 ".csp"を設定ファイルに追加しています。

2. PHP-CS-Fixerを実行します

php php-cs-fixer.phar fix --config=.php_cs --verbose

このツールの詳細はこちらをご参照ください: https://github.com/FriendsOfPHP/PHP-CS-Fixer

内部関数の変更

PHP 7ではいくつかの内部関数が変更されています。substr()関数もその一つです。

例:

<?php
$foo = substr("foo",3);
if($foo !== FALSE){
    echo "PHP 7\n";
    echo gettype($foo); //string
}
else{
    echo "PHP 5\n";
    echo gettype($foo); //boolean
}

上記のコードの$foo変数の型は、PHP 5ではbooleanですが、PHP 7ではstringです

この例の実行結果はこちらで確認できます。

この問題を解決するため、strlen関数で文字長をチェックしました。

<?php
$foo = substr("foo",3);
if(strlen($foo) == 0){
    echo "Run on both PHP 5 and PHP 7\n";
    echo gettype($foo); //boolean on PHP 5 and string on PHP 7
}

この例の実行結果はこちらで確認できます。

まとめ

GaroonではPHP 5.6からPHP 7に移行することでパフォーマンスが向上し、コードも読みやすくなりました: 例えば、社内の性能検証では33%の性能向上が確認できています。 私たちは、移行作業を分けて一つずつ実施していました。これにより、起こりえる問題に対処しながら、短期間で移行作業を完了できました。

 

Safari 11 Intelligent Tracking Preventionについて

はじめまして、開発基盤部フロントエンドエキスパートチームの小林(@koba04)です。 チームメンバーがまだひとりなので、仲間を募集中です!

macOS High Sierra及びiOS11のSafariで導入されたIntelligent Tracking Preventionについて紹介します。

詳細は、下記のWebKitのブログに書かれていますが、Intelligent Tracking Preventionはクロスサイトトラッキングを制限することを目的とした機能です。

クロスサイトトラッキングとは

まず最初にクロスサイトトラッキングとは、複数サイト間でのユーザーの行動をトラッキングすることです。 クロスサイトトラッキングを行うには、トラッキングしたいサイトに、Cookieを設定した共通のリソースを埋め込みます。 これにより、トラッキングしたいサイトでのユーザーの行動を、共通のリソースによって設定されたCookieを通じて紐付けることができます。

また、この時に利用されるCookieを一般的にサードパーティCookieと呼びます。

これまでの挙動

Intelligent Tracking Preventionが導入されるまでは、SafariのCookieに対する設定は「訪問したWebサイトを許可」がデフォルトになっていました。 したがって、これまでもユーザーが一度も訪れていないサイトによるトラッキングはできませんでした。

ただし、リダイレクトなどを用いてユーザーが認識してないうちに訪問させることが可能でした。

Intelligent Tracking Prevention

macOS High Sierra及びiOS11のSafariでは、SafariのCookieに対する設定は「サイト越えトラッキングを防ぐ」がデフォルトになります。 この設定により、Intelligent Tracking Preventionが有効になります。

Intelligent Tracking Preventionは、ユーザーの行動データを収集し、それによってサイト毎にCookieを含むストレージデータの扱いを変更します。

データ収集

Intelligent Tracking Preventionは、リソースの読み込みだけでなく、タップ、クリック、テキスト入力のようなユーザーインタラクションのデータを収集します。 収集したこれらの情報は、サブドメインを含まないトップレベルのドメインごとに集計されます。 blog.cybozu.ioの場合は、cybozu.ioごとに集計されます。

その後収集したデータを元に機械学習を行い、クロスサイトトラッキングを行っている疑いがあるドメインを分類します。 今のところ、次の3つの要素が分類に対して強い影響を与えていることが明らかになっているようです。

  • 多数のユニークドメインに配置されているリソース
  • 多数のユニークドメインに配置されているフレーム
  • 多数のユニークドメインに対するリダイレクト

ただし、分類の詳細については明らかにされていません。

また、これらのデータ収集及び分類は、全てデバイス上で行われます。Appleには送信されません。

分類後

上記の機械学習による分類で、クロスサイトトラッキングを行っている疑いがあると判定されたドメインは、下記のように扱われます。 「分類されてから」や「最後に訪問してから」ではなく、「最後のユーザーインタラクションから」というのがポイントです。

最後のユーザーインタラクションから24時間以内

そのドメインのCookieを、サードパーティーCookieとして利用することが出来ます。 したがって、この段階ではクロスサイトトラッキングが可能です。

最後のユーザーインタラクションから24時間以上30日未満

Cookieなどのデータを、Cookieを発行したドメインとアクセス元のドメインの組み合わせごとに異なる保存領域に保存します。 このドメインは、サブドメインを含まないトップレベルのドメインとなります。 この状態になると、サブドメインを含む同じドメインの中ではサードパーティCookieを共有できますが、別ドメインとは保存領域が異なるためCookieを共有できません。 そのため、クロスサイトトラッキングはできなくなります。

最後のユーザーインタラクションから30日以上経過している

Cookieなどのデータは即時に削除されて、その後追加されるデータも削除されます。 したがって、Cookieやストレージが使えない状態となります。

影響

クロスサイトトラッキングを行っている疑いがあると分類される基準が不明なため、影響範囲を特定するのは難しいですが、下記のような影響が考えられます。

  • サードパーティのCookieに依存した計測が出来なくなる
    • ユーザーが実際に利用するようなサイトでも、クロスサイトトラッキングを行っている疑いがあるドメインと分類されてしまうと、最後のユーザーインタラクションから24時間経過した時点で、サードパーティCookieとして使えなくなります
    • したがって、Cookieに頼らずURLのクエリーとして値をドメイン間で受け渡しするなどの対策が必要となります
  • ログイン情報の共有が出来なくなる
    • 最後のユーザーインタラクションから24時間以上経過するとCookieの共有が出来なくなるため、例えばソーシャルサービスのボタンを別サイトに設置した場合、サービス自体にはすでにログイン済みにも関わらず、ボタンを利用する際に再度ログインが必要となる状況が発生します
  • ユーザーインタラクションのないサイトでCookieやストレージが利用出来なくなる
    • ユーザーインタラクションのないサイトでCookieやWebStorageなどを利用している場合、クロスサイトトラッキングを行っている疑いがあるドメインと分類されてしまうと、これらのデータを保存することが出来なくなります

質問してみた

冒頭で紹介したブログ記事に質問があったらTwitterで聞いてとあったので、いくつか質問してみました。

  • どのドメインがIntelligent Tracking Preventionで分類されたのかわからないけど何か知る方法はあるのか?

  • 一度機械学習で分類されても、その後頻繁にサイトを利用するようになることで分類から除外されることはあるのか?

参考

 

サイボウズサマーインターン2017 報告その2〜UX/UIデザイナーコース

みなさんこんにちは、デザイングループの西藤です。

先日、Cybozu Summer Internship 2017が開催されました! 今回のサマーインターンのアシスタントをさせていただいた自分からデザイングループのインターンの様子をお届けしたいと思います!

f:id:cybozuinsideout:20171005135258j:plain

インターンの概要

サイボウズサマーインターンは毎年8月から9月にかけて3回開催されます。5日間を通して実際の業務の疑似体験をしてもらうことはもちろん、参加者と企業がお互いをより深く知ることを目的としています。

インターンでは業務体験以外のイベントも多く開催されています。
例えば

  • 歓迎会、懇親会
  • 社員による勉強会
  • 社長とのランチ
  • メンター以外の気になる社員との面談
  • 社内LTイベントに参加 など

f:id:cybozuinsideout:20171005141800j:plain
青野社長と開発本部長とのランチ会の様子

では実際にデザイングループではどういうインターンシップを行ったのか紹介します。

課題について

今回の課題は「デザイングループのマネージャーの柴田さん(以降、柴田さん)がkintoneモバイルの通知処理から解放されるUX/UI」です。

f:id:cybozuinsideout:20171005173140j:plain

課題は「リサーチ」「プランニング」「プロトタイピング」のプロセスで行いました。この3つはデザイングループで大切にしていることで、その部分を体験してもらいました。 「リサーチ」「プランニング」はグループワーク、「プロトタイピング」は個人で作業、最終発表はグループで行ってもらいました。

f:id:cybozuinsideout:20171005142811p:plain

1. リサーチ

kintoneモバイルを触って、そこから自分たちで何をヒアリングしたら良いか考えてもらいました。ヒアリングする時のコツをリサーチャーから伝授してもらい、実際のターゲットである柴田さんにヒアリングを行いました。そこから今回の課題のペインと理想のゴールを考えてもらいました。

質問の仕方がわからずヒアリング中に沈黙してしまうこともありましたが、自分たちで何に困っているのか、どう困っているのかをしっかり聞き出してくれていました。 f:id:cybozuinsideout:20171005143513j:plain

2. プランニング

ぺインとゴールを考えた後は「アイデアの発散」→「アイデアシート作成」→「シナリオコンテ作成」という流れで制作を進めました。 それぞれの段階でメンターや柴田さんにフィードバックをもらいながら改善を重ねていきました。

自分に対するフィードバックだけでなく、他のインターン生に対するフィードバックも参考にしながら改善を考えてくれていたのでより良い案になったと思います。

f:id:cybozuinsideout:20171005143839j:plain
アイデアの発散中
f:id:cybozuinsideout:20171005143922j:plain
アイデアシートの発表
f:id:cybozuinsideout:20171006101126j:plain
実際のシナリオコンテ

3. プロトタイピング

プランニングで決めた案に対して「ペーパープロト作成」→「Sketchを使ったプロトタイプ」→「モーションの追加」という実際の業務と同じ流れで制作してもらいました。 慣れていないFlintoやSketchといった実際の現場で使うソフトにも積極的にチャレンジしてくれました。わからないところはメンターに個別に聞いたりアドバイスをもらいながら、試行錯誤して自分のアイデアの理想形を作っていきました。

インターン生同士で、デザイン案の意見交換を自主的にやっていて、インターン生同士のチームワークが芽生えていてとてもよかったです。

f:id:cybozuinsideout:20171006095707j:plain
プロトタイプ作成中
f:id:cybozuinsideout:20171005150013p:plain
柴田さんからのフィードバック
f:id:cybozuinsideout:20171005150404j:plain
インターン生同士で意見交換

成果発表

英語でスピーチしたり、イラストをふんだんに使ったり、ムービーを作ったりと個性を活かした発表をしてくれました。 また、何よりインターン生同士のチームワークが伝わる発表だったのがとてもよかったと思います。 会場からは、大きな歓声があがっていて最高の発表になったと思います。

f:id:cybozuinsideout:20171005145213j:plainf:id:cybozuinsideout:20171005144337j:plain

インターン生たちの感想

f:id:cybozuinsideout:20171005165843p:plain:w100:left
最初2日間がWSでそのあと個人のワーク2日間という流れはすごくよかったです!特に最初の2日間のWSを3人のインターン生と一緒にできたことで、チームワークが生まれ、個人作業でのツッコミや、パワポの練習を誘い合って開催するなどの良い流れにつながっていたと思います!
f:id:cybozuinsideout:20171005165852p:plain:w100:left
オフィスや社内環境はすごく好きです。開放感あふれていてみなさん問題にチームで取り組んでいる感じ、そしてピリピリしておらず気持ちの面で繋がっているのが垣間見えました。本当にありがとうございました。
f:id:cybozuinsideout:20171005170011p:plain:w100:left
今回のインターンでとても良かったと思う点は、社内の雰囲気を中から体験できたことです。提案的な内容とはいえ、短期間でも充実した体験をすることができました。また、メンターの方々や、人事の方々のフォローもとても手厚く、ストレスなく取り組むことができたのもとても良かったです。
f:id:cybozuinsideout:20171005170058p:plain:w100:left
大学で学ぶデザインと仕事としてするデザインは質の部分で違うということや、受注デザイナーと自社製品デザイナーの働き方の違いなど日頃考えていたことに対する新しい考え方を得られました。
f:id:cybozuinsideout:20171005170117p:plain:w100:left
会議室などではなく、実際にデザイナーやエンジニアが働いているオフィスで社員の方と同じように実践的な作業ができたことはとても良かったです。今回、初めて触れるソフトがありましたが、メンターの方が丁寧に教えてくださったので、とても勉強になりました。5日間、ありがとうございました!
f:id:cybozuinsideout:20171005170136p:plain:w100:left
この夏のインターンに求めいていたこと全てができて、大満足です。新しいスキルも学べましたし、全日程を通してメンターさんも適切なフィードバックをくれて、自分の成長に直結しました。 コミュニケーションを取ることを大事にしていたので、正直な意見をきちんと受け入れて対応してくれたのが嬉しかったです。

まとめ

今回参加していただいた6名とも、実際にプロダクトにとりこんでみたいと思わせるレベルの案を、5日という期間でばっちり出せていてとてもよかったと思います。
またお互いの成果物がより良くなるよう力を合わせ、「チームワーク」で課題に取り組んでいる姿が素晴らしかったと思います。

今年も大成功に終わったサマーインターンですが、来年ももちろんやります! UX/UIデザインに興味のある学生のみなさん、ぜひ来年の夏にお会いしましょう!
インターンシップへの応募だけでなく、新卒採用、中途採用、複業採用への応募も絶賛お待ちしています! デザイングループの採用ページはこちらです!

https://cybozu.co.jp/company/job/recruitment/designgroup/

デザイングループのFacebookページ 「UX Cafe」

デザイングループの活動や、UXに関わる勉強会・ワークショップなど様々なイベントに関する情報を発信しています。

 

サイボウズサマーインターン2017 報告その1〜品質保証・セキュリティコース

こんにちは!品質保証部の中園です。

サイボウズでは今年もサマーインターンシップを開催しました! 昨年好評をいただいたので、今年はどーーーんとパワーアップして5コース用意しました。

  • Webサービス開発
  • モバイルアプリ開発 (New!)
  • UX/UIデザイナー
  • 品質保証/セキュリティ
  • Site Reliability Engineering (New!)

今回は、品質保証/セキュリティコースについて、第1回の内容をお伝えします。

f:id:cybozuinsideout:20170904112051j:plain

インターンの概要

第1回は08月21日~08月25日で開催しました。品質保証/セキュリティコースは2名の学生さんが参加してくれました。

本コースでは、サイボウズ製品の品質保証活動がどのようにして行われているか、品質がどのようなプロセスで確保されているのかを、実際の業務を体験しながら学んでいただきました。

5日間のスケジュールです。

f:id:cybozuinsideout:20170904110451j:plain

製品テスト、セキュリティ、不具合情報公開サイトの運営の業務をほぼ日替わりで体験してもらいました。

今年は品質保証部内で自主的に開催している勉強会に参加してもらったり、品質保証部の部長とざっくばらんにお話しする機会があったりと、かなり内容の濃いインターンシップになったのではないでしょうか。

製品テスト

製品テストでは、kintoneの『アプリのアイコンを変更できる機能』を題材に、テスト設計からテスト設計レビュー、テスト実施までの流れを体験してもらいました。

1日目はテスト設計をしてもらいました。

テスト設計では、kintoneのプログラマが作成した本物の機能仕様書を見ながら、テスト仕様書を作成します。

f:id:cybozuinsideout:20170904111018j:plain

機能仕様書を網羅したテスト仕様書を作成することを意識しながら、目標時間内に無事に完成させることができました。

2日目は、作成したテスト仕様書を学生同士で交換し、レビューを行いました。手順のミスや、抜けている観点を指摘します。

互いにテスト仕様書をレビューすることで、それぞれ新たな視点に気づいていた様子でした。

f:id:cybozuinsideout:20170904112327j:plain

学生同士のレビューが終わったら、答え合わせの時間を設けました。

メンターが作成したテスト仕様書を見せながら、テスト設計のやり方や、よく使っているテスト技法などを紹介しました。

そして、メンターが作成したテスト仕様書をもとに、テスト実施もしてもらいました。 (「手順が分かりやすい!」「スッキリしていて見やすい!」などの声をいただき、大変恐縮でした…!)

また、不具合を見つけて、報告するまでの流れを体験するために、kintoneのアドホックテストも実施しました。 いくつか不具合を報告していただき、kintoneの品質向上に貢献してくれました!

セキュリティテスト

サイボウズ製品のガルーンを対象として、セキュリティテストを体験してもらいました。

まずは、セキュリティテストの位置付けとセキュリティテストに必要な知識の講義を行いました。

セキュリティテストはテストプロセスのサブプロジェクトです。製品のテスト担当者からセキュリティテストを依頼されます。

f:id:cybozuinsideout:20170927144835p:plain

講義が終わり、テストに利用する Burp Suite の設定を行っていきます。通信の内容を確認することで、それぞれのリクエストでどのような情報が送られているのかが分かり、また、テスト時には通信の内容を改ざんすることで、脆弱性がないかを調べることができます。

次は、サイボウズで検証している脆弱性を紹介していきます。サイボウズは CWE 識別子を使って脆弱性を識別しています。採用している脆弱性は、クロスサイト・スクリプティング、SQL インジェクション、CSRF 等様々です。

以前のバージョンで発生しており、現在は改修された脆弱性を使ったハンズオンも行いました。

f:id:cybozuinsideout:20170928133510p:plain

これで検証に必要な知識を得ることが出来ました。準備万端です。

早速、テスト設計を行っていきます。製品テストと同様に機能仕様書を見ながら、ガルーンの新機能がどのようなものかを把握していきます。

機能仕様書と実際の環境を見比べながら、追加された画面でどのようなリクエストが発生するかを洗い出していきます。 インターン生はメンターからのアドバイスを受けながら、無事テスト仕様書を完成させることが出来ました。

テスト仕様書が出来たら、実際の検証作業を実施します。

どのような手順で確認すればよいか・脆弱性の場合どのような挙動になるか・脆弱性ではない場合どのような挙動になるかといった内容が記載されているページを確認しながら検証を進めていきます。

サイボウズでは、セッション・リクエスト・パラメーター単位でテスト項目が決まっています。

f:id:cybozuinsideout:20170927144926p:plain

それぞれの検証を一つずつ実施していきます。中にはパラメーターが多く、検証に時間がかかるリクエストもあります。

すでに検証済みのバージョンということもあり、残念ながら今回は脆弱性を見つけることはできませんでしたが、検証のやり甲斐や面白さを体感してくれたようでした。

不具合情報公開サイトの運営

サイボウズでは、製品を利用しているお客様や、サイボウズ製品を取り扱っているパートナー様に向けて、 製品の不具合/脆弱性/制限事項に関する情報を不具合情報公開サイトで公開しています。

昨年に続き、今回のインターンでも「不具合」と「脆弱性」の2種類の記事を、ガルーンを対象として作成してもらいました。

始めに、メンターから不具合情報公開サイトの運用や業務体験の内容について説明しました。

その後、インターン生に記事作成を次の流れで実施してもらいました。

  1. 社内の検出情報をもとに、現象(不具合または脆弱性)が発生する手順を把握する。
  2. 実際に製品を操作し、以下の項目を検証する。
    ・現象が発生するバージョン
    ・他の箇所でも同様の現象が起きないか
    ・検出情報以外の再現手順はないか
  3. 検証した結果をまとめ、公開する記事を作成する。

実際に作業を進めると、発生するバージョンの切り分け方や、読者が読みやすく検索しやすい記事に仕上げるにはどうしたらよいかなどで、悩んでいたようです。

そのときには、メンターのアドバイスを受けながら進めてもらいました。

f:id:cybozuinsideout:20170927142048j:plain

記事が仕上がったら、メンターとインターン生全員で記事を確認し、良かった点やもう少し工夫した方がよい点をメンターからフィードバックしました。

最後に、公開した情報がどのように活用されているかを紹介し、不具合情報公開サイトの公開目的を理解していただきました。

サイボウズの品質保証活動の一連の流れを感じながら作業していただけたようで、嬉しい限りでした!

青野社長とのランチ

インターン期間中、社長の青野とのランチの機会も設けました!

f:id:cybozuinsideout:20170928124242j:plain

サイボウズ創業のことから、働き方改革について、更には今後のビジョンについてまで、幅広い話を聞きました。 社長から直々に話を聞けたおかげで、サイボウズについてより深く知ることができた様子でした。

成果報告会の様子

最終日の成果報告会では、他のコースと合同で、サイボウズ社員向けにインターンの成果を発表します。

f:id:cybozuinsideout:20170904114244j:plain

成果報告会では、50人近くの社員が参加しました。他拠点へも、テレビ会議システムを使い中継されていました。 どのコースも社員が驚くような成果で、議論や意見交換も活発に行われました。

成果報告会を終えた後、打ち上げ兼懇親会を開催しました。

f:id:cybozuinsideout:20170904115219j:plain

サプライズでロールケーキタワーを用意していました!

f:id:cybozuinsideout:20170904115223j:plain

大変名残惜しかったですが、これにてインターンの全日程が終了しました。

インターン生の感想

最後に、インターン生の感想を紹介します。

  • 品質保証/セキュリティコースのインターンシップを通じて、品質保証とは製品がお客様からの期待に応えられるかどうかを判断できる最後の確認する場所であることを体感でき、製品がリリースされるうえで最も重要な品質保証の一連の流れを学ぶことができました。 業務内容だけでなく、メンターさんや人事の方、またインターン生みんな親切でいい人だったのでお話することも本当に楽しかったです!長いようで一瞬の楽しい5日間でした。サイボウズで働けたらとても楽しいと心の底から思います!楽しい5日間をありがとうございました。

  • 品質保証部の業務を幅広く体験できたので全体的に良い構成だと思いました。特に実際の自社製品を使ってリアルな体験をできるところが魅力的なところだと思います。自社製品を使って品質管理や脆弱性診断を行うことで、業務に対する感覚を掴むことができました。毎日の内容が濃くて、5日間があっという間でした!本当に充実した5日間でした。メンターの方々に業務のことだけではなく、これからやるべきことなどの相談にも乗っていただけたので本当に感謝です。

まとめ

今回も非常に優秀な学生さんたちに参加して頂き、メンターとしても良い刺激をもらいました。 5日間という短い期間でしたが、サイボウズの品質保証部のこと、サイボウズという会社のことを多く吸収していただけたようでした。 学生の皆さんの今後の活躍を期待しています!

お知らせ

サイボウズではPSIRTの学生アルバイトを募集しています。 セキュリティに興味がある方、ぜひチェックしてみてください。

 

技術顧問に聞いてみた──小崎資広さん、武内覚さんインタビュー

こんにちは。コネクト支援チームの風穴(かざあな)です。

この度、あの小崎資広さん、武内覚さんに、サイボウズの技術顧問に就任していただくことになりました。

小崎さんは、日本を代表するLinuxカーネル開発者の一人です。また武内さんも、Linuxカーネル開発者として知る人ぞ知る存在で、最近では、AMD Ryzenプロセッサの問題を追究したことでも注目を集めました。

ということで、さっそくお二人にお話を伺ってきました。

サイボウズSREチームと、小崎さん、武内さんの集合写真
サイボウズSREチームのメンバーと(前列左から4人目が小崎資広さん、同5人目が武内覚さん)


──そもそも、このお話の経緯は?

小崎さん(以下、敬称略):山本さん(編注:山本泰宇、サイボウズ執行役員・運用本部長)から、「技術顧問になっていただけませんか?」とオファーをいただきまして。

──それまでは、山本とは知り合いでした?

小崎:以前、2、3回、お会いしたことがあり、お名前は認識してました。こちらはすっかり忘れていたのですが、山本さん、沼津の私のオフィスまで来てくれたことがあり、どうもその時打ち合わせで同席していたらしいというのが後から分かって。

武内さん(以下、敬称略):私もいました!

──いきなりでビックリしました?

小崎:そうですね。

武内:不思議な縁ですね。

小崎:それとは並行してサイボウズ社の内田さん(編注:内田公太、サイボウズ・SRE)からOpen Source SummitでWalB(※1)の発表をするので、その資料をレビューしてもらえないか、という相談をいただいていて、内田さんとは一緒に作業をしていました。

武内:その会話を小崎さんがTwitterでしているとき、私が巻き込みリプライをされて。

小崎:「何でこの人が@に入ってるんやろ?」と(笑)。今あらためて見直したら武内さんがWalBの話をしたところに星野さん(星野喬、サイボウズ・ラボ)と山本さんがJoinする形で会話をしてて、そこになにも考えずに返信してたんです。

武内:えー、ひどい話だ(笑)。でも僕は、風穴さんの書籍プロジェクトで内田さん、星野さんとは知り合いだったし、面白そうだからと議論の輪に入りました。

──お二人にたくさんレビューしていただいたおかげで、WalBの発表は大成功でした。ありがとうございました!

武内:そのWalBの発表が終わった頃に、山本さんから連絡があって、技術顧問としてやっていただけませんか、と。私は、春に会社を辞めたばかりで、しばらくは就職せずに、家に籠って自己鍛錬するつもりだったんです。そしたら、そんな私にピッタリの契約が提示されて。

──すごいタイミングですね!

武内:ホントに(笑)。なので、そういう形なら全然いいです、やります、と返事しました。

──その後、小崎さんも所属元とサイボウズの間での調整が終わり、サイボウズの技術顧問をやっていただけることになったわけですが、ちなみに、サイボウズにはどんな印象を持ってました?

小崎:僕は元々、風穴さんとか、サイボウズ・ラボの西尾さんとかと付き合いはありましたし、そういう印象でした。

──おー、そうなんですね。武内さんは?

武内:サイボウズの印象は2段階あって、最初は、サイボウズ・ラボの印象でした。セプキャン(編注:セキュリティ&プログラミングキャンプ、現在のセキュリティキャンプの前身)の講師をしていたので、そこで竹迫さん(元サイボウズ・ラボ)、川合さん(サイボウズ・ラボ)と知り合いました。なんかずいぶん元気な、というか、楽しそうに仕事している人がいるな、と(笑)。

小崎:わたしも同じ年にセプキャンに参加していたので、このあたりの方々とは面識がありました。

──ラボの印象だったんですね。

武内:次が、例の書籍プロジェクトで星野さん、光成さん(サイボウズ・ラボ)、内田さんと出会って、みんなゴリゴリの技術屋で、やっぱりすごく楽しそうだなと。しかも、すごく社内の風通しが良くて、なんて仕事がしやすそうなんだ、と。そういう印象です。あと最近では、働き方の話で、ずいぶん攻めたことをする会社だなと(笑)。

小崎:そうそう。働き方改革とかでもサイボウズがすごくバズってるなと。あの広告(※2)とかで。

──そうですね。ここ1年ぐらいは特にそうですね。

武内:他に例がないというか、いろんなことをされていて、すごいな、という印象はありましたね。

話題になったkintoneの広告ポスターの画像
話題になったkintoneの広告ポスター


お二人の「伝説」

──小崎さんって、いつ頃からすごい人になったんでしたっけ?

小崎:何をいきなり(笑)。

──カーネル読書会で、glibcのmallocについて発表したのがコミュニティデビュー?

小崎:ですね。それより前は、すごく昔に、RELAX(REgular LAnguage for XML)というスキーマ言語のJISテクニカルレポートに、Special Thanksとして名前が出たぐらいかな。なので、Linux系では、あれが最初。

──カーネル読書会で、mallocの発表をされたときは、まだLinuxカーネルはお仕事じゃなかったんですよね?

小崎:そうなんですよ。

──私も、そのときのカーネル読書会に参加していましたが、ホント衝撃的でしたね。

小崎:あの後、社内で仕事をしてると、何か知らんけど、代わる代わる社内の人がやって来て、柱の向こうから私を指差して帰っていくんですよ。ものすごい、感じ悪い(笑)。

武内:それは、感じ悪いですね〜(笑)。

小崎:オマエもやってたやないか!(笑)

武内:私も4人ぐらい連れて行きましたよ。あれが小崎さんだ、って。当時、「Linuxカーネルやglibcが専門じゃない部署の人が何でこんなにglibcのmallocに詳しいんだ?」って、社内で話題になって、見に行きました(笑)。それからが縁ですね。それまでは、同じ社内にいても、小崎さんの存在すら、僕らは認識してなかったですから。

──カーネル読書会の発表が、そんなことになってたとは。

武内:でも、あのときはまだ「普通のすごい人」という感じでしたよね。

小崎:それ、形容詞が矛盾してるような(笑)。

なお、もはや伝説となっている、カーネル読書会での小崎さんの発表「mallocの旅(glibc編)」は、以下で見ることができます。


──武内さんは、まずインターンで富士通に行ったんですよね。

武内:そうです。どうしてもLinuxカーネルがやりたいと思って探したら、富士通がインターンを募集していたので、そこでちょっと頑張ったら、そのままLinuxの開発をやってる部署に採用されて、12年かな、勤めました。

小崎:この人は、インターンの頃から伝説を持っていて。

武内:僕は、大学の学部が情報系じゃなかったので、何か印象を残さないとダメだなと思って、当時触ったことのなかったIA-64 Linux上でハードウェアデバッガを使ってファームウェアがOSに渡したテーブルを書き換えたり、色々やりましたね(笑)。

小崎:何学部でしたっけ?

武内:材料工学。

小崎:それでよくインターンの書類選考が通ったよね。

武内:そうそう(笑)。何か、いろいろ書いた気がします。無茶なことを。

──大きな会社だと、やりたいと言っても、なかなかその通りには配属されないことも多いですからね。

武内:いやぁ、奇跡ですよ。すごく良い巡り合わせでしたね。入社してからは、Linuxカーネルのプロセススケジューラの改善というのをやってました。さらに、社内のOS教育もやることになり、その流れで、セプキャンの講師に呼ばれて……。それが社外への認知の第一歩ですね。

──小崎さんも、大学は情報系じゃないんですよね?

小崎:物理屋さんです。大学を卒業したときが、ちょうど就職氷河期だったので、あまり選べずに家電メーカーの子会社に進みました。ちょうど家電にOSが入り始めた頃で、最初はまだITRONだったけど、その後、Linuxになって。

──スタートは組み込み系だったんですね。

小崎:そう。組み込みでソフトを書いていると、何でこう動くんだろうと、OSのカーネルのコードを読まないといけないことが多々あって……。さらに、周りにそれを説明する必要もあったので、カーネルやらglibcやらの資料を山ほど書いて、説明するということに慣れました。なので、その後エンタープライズに移ったら、そこでは激しく分業が進んでいて、みんな自分の専門以外は知らないということに、ものすごく驚きました。

武内:あるある(笑)。

小崎:結局、最初に就職したところで、たまたま、大きなプロジェクトに入って、大量のソースコードに触れたっていうのが転機になった気がしますね。家電って、ユーザがリモコンを操作して動かない、となったら「リモコンを押したけど動きませんでした」というバグチケットが切られるんですけど、その犯人捜しが困難を極めるわけですよ(笑)。するといつも貧乏くじを引く人がいて、横断的にコードレビューをして突き止めたりする必要があるわけ。そういうのを繰り返して、すごく大きいソフトウェアに対して、何とかしてコントローラブルにするっていうのが、だんだん得意になってきて、それが後々、だいぶ役に立ちましたね。

小崎資広さんの写真
小崎資広さん


技術顧問としての抱負

──今後、どうする、こんなふうにしたい、みたいなのはありますか? 個人的なことと、それから技術顧問としての2つの視点で。

武内:個人的なことで言うと、私、退社の寸前までBtrfsの開発をやっていました。それを、今でいうext4みたいに、あらゆるユーザが使うファイルシステムにしたいです。なので、またその開発に戻ったり、資料を書いて広めたりして、何とか流行らせたいなと。これはすごく良いものだと、自分では思っているので。

──Btrfs! 私も、個人的にBtrfsには期待してるので、ぜひ頑張ってください!

武内:技術顧問として何ができるかというと、何だろなぁ、やっぱり、アプリケーションより下のレイヤ、特にglibcとかカーネルとか、その辺の低レイヤのことをもっと知ってほしいかなと。当たり前のように話せるようになってほしいので、そのお手伝いができればと。

──なるほど。それもぜひ!

武内:あと、わたしは前職では障害が発生したら社会インフラが止まるし、すぐに原因究明をして対策を考えないといけないシステムを扱っていました。その経験を共有し、サイボウズのサービスをより良くしていくことに貢献できたらなと思ってます。

──ありがとうございます! では、小崎さんは?

小崎:なんか、美味しいところ全部取られちゃって言いにくいんですけど(笑)。私はLinuxカーネルのdevelopmentのほうにいたというのが、特色としてあると思ってます。ネットで検索できるLinux記事は、特にトラブルシューティングの記事が結構間違ってたりするんです。動作原理を知らないからそうなってしまうんですけど。ですからLinuxの設計や、なぜそう動作するのかといったところも含めて共有しつつ、一緒に最高のサービスを作っていきたいです。

──小崎さんご自身は、いま、技術的にはどの辺に興味あります? Linuxカーネルだとメモリ管理ですよね?

小崎:そうですね。私はメモリ管理周りが専門です。ただ、カーネルの中の活動をする前はHPC屋さんで、パフォーマンスチューニングをやってました。そのあたりはそれなりに知識があるので、そういうところもSREの領域に生かせると思っています。

働き方は変わった?

──ちなみに、生活というか、働き方みたいなものは、技術顧問就任で変化はありますか?

武内:僕は、しばらくは仕事をしないつもりだったので、適度に仕事が入るかな、というぐらいですね。どっちかというと、小崎さんのほうが変化はあるんじゃないですか?

小崎:忙しいは忙しいんですけどね。だいぶ配慮していただけているので、それで回せてますね。サイボウズさん以外だったら、こういうのは無理だったかもしれないですね。

──そういう面はあるんですね。

武内:私もそうですね。さっきも言いましたが、こっちの都合に会社のほうが合わせてくれるっていう……なんて会社だとビックリしましたよ(笑)。すごく助かりましたね。

武内覚さんの写真
武内覚さん


最後にひと言

──最後にひと言、お願いします。

武内:サイボウズのエンジニアの方々って、みんなすごい優秀なんですけど、「サイボウズがオープンソースソフトウェアに、こういうコントリビュートをしました」みたいなのが、外にはまだそれほど見えてきていないので、それは何とかしたいですね。サイボウズは、働き方はすごい、というのに加えて、こんなにすごいエンジニアがいるっていうのを、ラボの面々だけでなく、サイボウズ本社のほうからも、どんどん出ていくといいのかなと思ってます。

小崎:その辺は、我々もだいぶ、何と言うか、empowerするのは得意なので、ぜひやりたいですね。

武内:例えば、WalBをアップストリームに持っていくとか、その他の機能改善とか開発とか、何でもいいですけど、それをOSSに持っていくというときに、どうやればいいのかといった点は、我々はまさに得意技なので、外に出るお手伝いはできると思いますね。

小崎:我々、文化が違うところから来てるので、お互いに学びあっていけるといいな、と。それを通じて、ぜひとも新しい価値をお互いに作っていくことができたらなと思っています。よろしくお願いします!(了)

kintoneゲーストスペースの画面
お二人とのやり取りは、kintoneのゲストスペース(kintoneの利用ユーザー以外の人が、ゲストとして参加できるスペース)で行っています。


文責・写真:風穴 江


※1:「WalB」(ワルビー)は、サイボウズ・ラボの星野を中心に開発されている、Linux用のバックアップおよび非同期レプリケーションのためのシステムです。ブロックデバイス層でWrite-Ahead Logging(ログ先行書き込み)を行っているのが大きな特徴で、オープンソースソフトウェアとして公開されています。

WalB v1.0 リリース

※2:鉄道駅などで展開された、kintoneの広告。皮肉な「煽り」広告として、BuzzFeed(「ノー残業、楽勝!予算達成しなくていいならね」 サイボウズの煽り広告がよくぞ言ってくれた!──上司の皆さんは耳が痛いのでは)などでも話題に。