astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Databricks Community Edition で Spark に触れる

山縣です。

今回は Spark を無料で手軽に触れる Databricks Community Edition について書きたいと思います。

Databricks Community Editionとは

Databricks は Databricks 社が提供しているSparkサービスで、Community Edition はその無料版にあたります。

無料にもかかわらずメモリ6GBのAWSのインスタンスとNotebook が使えるというなかなか太っ腹なサービスです。

弊社では Cloudera社の CDH のクラスタがありSparkもその上で動かしていますが、個人的にSpark そのものの動作を確認したり、異なるバージョンを触りたいときに時々使わせてもらっています。

Sparkの学習用環境としては十分な機能が備わっていると思いますので、簡単に紹介したいと思います。

ユーザ登録

Community Editionを使用するためにはユーザ登録が必要です。

ユーザ登録はTRY DATABRICKS画面の右側の Community Edition の下にある
START TODAY ボタンを押してフォームに情報を入力します。 クレジットカードなどの課金情報の入力は必要ありません。 フォームを登録後、登録したアドレスにメールが来るのでリンクをクリックしてメールアドレスの確認ができれば完了です。

一般的な Web サービスのユーザ登録と変わらないと思います。

登録が完了したら ログイン画面からログインします。

ログインすると下記のような画面になります。

f:id:astamuse:20170517163345p:plain

左縦にメニューがあります。

クラスタの起動

まずは Spark クラスタを作成・起動します。

左側のメニューの Clusters ボタンを押すと、クラスタの一覧表示の画面になります。 画面上部にある + Create Cluster ボタンを押して新規にクラスタを作成します。

f:id:astamuse:20170517164313p:plain

Cluster Name に適当に名前を入れ、Databricks Runtime Version で起動したい Sparkを選択します。

選択するSparkの一覧は大まかに言ってSpark のバージョンそのものと、Scala のバージョンを 2.10 にするか 2.11 にするかの組み合わせの一覧となっています。

f:id:astamuse:20170517173935p:plain

Sparkのバージョン名は Spark <バージョン>-dbN という形式になっており、<バージョン>の部分は元となるApache Spark のバージョンを、 dbN の部分はdatabricks release番号を示しています。 同じSparkのバージョンに対してDatabricks がbackport や独自機能を加えてリリースしています。

また (Auto-updating) となっているものはdatabricks release が常に最新のものを自動的に選択するようになります。

なおこの記事を書いている時点で Spark2.2 のRC2 が利用可能になっていました。 折角なので “Spark 2.2 RC2 (Experimental, Scala 2.11)” を指定します。

Community Edition の場合、Instance の細かいカスタマイズ等は出来ませんので、あとは AWS の AZ の選択とSpark の Config を指定するのみです。 ここでは何も指定せず、Create Cluster ボタンを押して起動します。

Cluster 一覧画面に戻り、しばらくすると起動が完了します。

f:id:astamuse:20170517164502p:plain

起動したクラスタは Spark のWebUIである、Spark UI にアクセスすることができます。SparkUIを見ると起動したクラスタの詳細が分かります。

f:id:astamuse:20170517164753p:plain

Environment を見てみると spark.master が “local[8]” となっておりlocalモードで起動していることが分かります。

またログを確認することもできます。 起動したクラスタはアイドル状態がしばらくすると自動的に停止します。停止したクラスタは一覧に Terminated Cluster として残っていますので再起動可能です。

Workspace

Workspace はルートフォルダでNotebook やライブラリなどはすべて Workspace 以下に保管することになります。サブフォルダを作ることもできます。 標準で共有用の Shared というフォルダとユーザのホームフォルダである Users/<アカウント> があります。Shared は企業などが複数のアカウント間でNotebook などを共有するためのフォルダのようです。とりあえず今回は Users/<アカウント>以下にNotebook やライブラリを置いていきます。

f:id:astamuse:20170517173542p:plain

Notebook

コードはNotebookに書いていきます。 Databricks の NotebookはIPython と互換性があるそうなのでIpython ベースなのかもしれません。

左メニューの Workspace から Users → <メールアドレス>を選択して Create→Notebook を選択します。

f:id:astamuse:20170518122510p:plain

Name を適当に入れ、 Language で使いたいプログラミング言語を選択します。 言語は Scala, Python, SQL, R が選べます。 ここでは Scala を選びます。

またNotebookを実行するにはSparkクラスタにアタッチする必要がありますので、接続する Spark クラスタとして先ほど作成したクラスタを選択します。

作成後、空のセルが一つだけあるノートブックが表示されます。

空のセルに以下の内容をコピペして Shift + Enter でセルを実行します。

case class T1(id:Int, message:String)
val ds1 = Seq(T1(1, "Hello"), T1(2, "World"), T1(3, "Hello"), T1(4, "Spark")).toDS
display(ds1)

f:id:astamuse:20170519163929p:plain

display() によって結果を表示することができます。

上記のセル実行後に下に空のセルができますので、さらにコードを追加します。

ds1.createOrReplaceTempView("t1")
val ds2 = spark.sql("select message, count(*) as num from t1 group by message order by num desc")
display(ds2)

f:id:astamuse:20170519164242p:plain

Notebook には以下の変数が事前に定義されています。

  • sc:SparkContext
  • sqlContext:HiveContext
  • spark:SparkSession (2.0以降)

結果はテーブルだけでなくグラフとして表示することもできます。 結果の左下のグラフボタンを押すとグラフに変えることができます。

f:id:astamuse:20170519165254p:plain

このNotebook は Scala 用として作成しましたが、他の言語のセルを追加することも出来ます。 上記の Scala で書いたSQLクエリは以下のように直接書くことも可能です。

%sql
select message, count(*) as num from t1 group by message order by num desc

%sql 以外に %python, %r, %scala, %sh(shell), %fs(Databricks Utilities) の指定もできます。

DBFS

Databricks の固有機能としてDBFS(Databricks File System)が使えます。 これは AWS S3上に作れらたファイルシステムでSSDにキャッシュすることで高速化しているとのことです。DBFS は Scala と Python から利用することが可能で、dbutils (Databricks Utilities)というライブラリ経由でアクセスします。dbutils は Notebook にビルトインされているので簡単に利用可能です。

display(dbutils.fs.ls("/"))

f:id:astamuse:20170518174807p:plain

fsのヘルプは以下のようにしてみることが可能です。

dbutils.fs.help()

f:id:astamuse:20170518175022p:plain

sparkのデータの保存先としても利用可能です。 下記ではDataset ds1 を parquet フォーマットで書き込んでいます。

ds1.write.parquet("dbfs:/tmp/ds1")
display(dbutils.fs.ls("/tmp/ds1"))

f:id:astamuse:20170519174223p:plain

Table

Databricks ではテーブルを利用することができます。 テーブルの作成はデータのインポートにより行います。データのインポート元してはファイルのアップロード、AWS S3などいくつかを選ぶことが可能です。

ここでは総務省が運用している統計データダッシュボードサイト のAPI を使って国内の都道府県別、年代別、西暦別の人口データををCSVとしてダウンロードしてインポートしてみます。また都道府県マスタもダウンロードします。

$ wget -O - 'http://data.e-stat.go.jp/dashboard/api/1.0/Csv/getData?Lang=JP&ParentRegionCode=00000&IndicatorCode=0201010010000010010,0201010010000010020,0201010010000010030' |tail -n +31 > jp_population.csv

$ wget -O - 'http://data.e-stat.go.jp/dashboard/api/1.0/Csv/getRegionInfo?Lang=JP&ParentRegionCode=00000'|tail -n +18 > jp_region.csv

$ head jp_population.csv
"indicatorCd","unitCd","statCd","regionCd","timeCd","cycle","regionRank","isSeasonal","isProvisional","value","cellAnnotations"
"0201010010000010010","090","20020101","01000","1975CY00","3","3","1","0","1312611",
"0201010010000010010","090","20020101","02000","1975CY00","3","3","1","0","380218",
...

$ head jp_region.csv
"upAreaCd","upAreaNm","upHiragana","areaCd","areaNm","areaLevel","hiragana","fromDate","toDate"
"00000","全国","ぜんこく","01000","北海道","3","ほっかいどう","190001","999912"
"00000","全国","ぜんこく","02000","青森県","3","あおもりけん","190001","999912"
...

上記の方法でダウンロードしたCSVをインポートします。 左メニュー → Tables→ +Create Tables でインポート画面が出ます。インポートのソースとしてFile を選択して jp_popluation.csv をアップロードを行います。

f:id:astamuse:20170519121655p:plain

Preview Table を押して Table name に “jp_population” を入力、First row is headerをチェックします。カラムのデータ型を選べますが、面倒なので String のままにしておきます。 (この辺データを見て自動で推測してくれると楽なのですが。)

最後に Create Table を押します。 なぜか画面にエラーメッセージが一瞬出ますが、問題なく登録できます。 作成したテーブルはSQLからその名前でアクセス可能です。

%sql
select * from jp_population

f:id:astamuse:20170519124844p:plain

同様に都道府県データを jp_region という名前でテーブルに登録します。

f:id:astamuse:20170519124634p:plain

インポートした二つのテーブルをJoinして使いやすいようにしてみます。

val pop = spark.sql("""
select 
  regexp_replace(p.timeCd, 'CY00', '') as Year,
  r.areaNm as Prefecture, 
  case p.indicatorCd
    when '0201010010000010010' then '0~14歳'
    when '0201010010000010020' then '15~64歳'
    when '0201010010000010030' then '65歳以上'
    else 'その他' END as Age,
  cast(p.value as Int) as Population
from jp_population p join jp_region r on p.regionCd = r.areaCd
""")
pop.createOrReplaceTempView("pop")
display(pop)

上記処理によって “prefecture”, “year”, “population” をフィールドとして持つテーブル “pop” を作ることができました。

例えばこのテーブルを使って東京都の西暦、年齢層のグラフを作ると以下のようになります。

f:id:astamuse:20170519151841p:plain

外部ライブラリの利用

外部ライブラリの利用はScala/Javaの場合は JAR ファイルをアップロードするか、Maven Central/Spark Pcakages からダウンロードするかになります。

まず Maven から 自然言語処理ライブラリであるStandford CoreNLPをダウンロードしてみます。

ライブラリの取り込みもNotebook と同じようにWorkspace のフォルダ内のメニューで Create → Library と実行します。

Source として Maven Coordinate を選択し、Search Spark Packages and Maven Central を押します。

検索ボックスに corenlp と入れ、spark-corenlp を、Rleases は利用している Scala のバージョンに合うものを選択します。ここでは “0.2.0_s_2.11” を選択しました。

f:id:astamuse:20170519152750p:plain

元の画面に戻るので Create Library を押すと、選択したフォルダ内にライブラリが作られます。

早速利用してみます。

import org.apache.spark.sql.functions._
import com.databricks.spark.corenlp.functions._

val input = Seq(
  (1, "<xml>Stanford University is located in California. It is a great university.</xml>")
).toDF("id", "text")

val output = input
  .select(cleanxml('text).as('doc))
  .select(explode(ssplit('doc)).as('sen))
  .select(
    'sen, tokenize('sen).as('words)
   )
display(output)

f:id:astamuse:20170519155320p:plain

とりあえずトークナイズはできました。他の機能も使ってみます。

val output = input
  .select(cleanxml('text).as('doc))
  .select(explode(ssplit('doc)).as('sen))
  .select(
    'sen, tokenize('sen).as('words),
    ner('sen).as('nerTags),
    sentiment('sen).as('sentiment),
    lemma('sen).as('lemma)
  )
display(output)

f:id:astamuse:20170519155718p:plain

ner(), sentiment(), lemma() というメソッドを使おうとしましたがエラーとなりました。 language model データが無いのが原因なのですが、Maven経由ではlanguage modelデータを入れられませんでした。 調べてみると Databricks社のほうで、対応方法を記したNotebookが出ていました。

こちらは model の jar ファイルをダウンロードしてSprkContext に直接jarを追加するというやり方です。このやり方を試してみましたが、残念ながらうまく動きませんでした。さらに調べているとクラスローダを取得してそちらに追加する方法を書かれている人もいましたがこちらもうまく行きませんでした。 仕方ないので model の jar ファイルをライブラリとして直接アップロードを試みました。

これは先ほどの Maven経由と同じ手順で方法で “Create” → “Library” としてSource を “Upload Java/Scala JAR” にしてファイルを指定する方法となります。

残念ながらmodel のJARファイルは1GB近くあり、アップロードの途中でエラーとなってしまいました。最終的には model jarファイルを3つに分割してアップロードすることで何とか対応できました。

f:id:astamuse:20170519162054p:plain

ライブラリ登録後、再度実行すると今度は結果を返すことができました。

APIによる操作

Databricks はREST API を提供しており多くの操作がAPI経由で可能です。

APIの認証はBASIC認証で行われ、ユーザとパスワードはWebUIにログインするときと同じものとなります。

APIへのアクセスは以下のURLになります。

https://community.cloud.databricks.com/api/2.0/…

例えばクラスタの一覧を得るには以下のような URL でアクセスします。

https://community.cloud.databricks.com/api/2.0/clusters/list f:id:astamuse:20170519174852p:plain

APIに関する情報はこちらのドキュメントにあるので参照してください。

終わりに

以上、Databricks Community Edition で使える機能について見てみました。無料で使える割にはクラスタの作成、Notebook、データストアと必要な機能が一通りそろっておりSparkの学習をしたい人にはかなりおススメです。

最後に弊社では Spark をはじめとして様々なデータ処理や基盤構築などを行うソフトウェアエンジニアを募集中です。興味のある方はこちらのサイトをご参照ください。

特許とその制度について 出願時に申請できる特例と特殊な出願

お久しぶりです。主に特許関連のデータ処理を担当しているBTと申します。 今回は、出願時に申請できる特例と特殊な出願についてご説明いたします。 宜しくお願いいたします。

出願時に申請できる特例

出願時に申請できる様々な特例について説明します。

新規性喪失の例外

出願する内容についてすでに学会で発表しているあるいは論文誌に載せているといった場合には、新規性の喪失の例外の適用を受ける必要があります。そのためには、特許出願と同時にその旨を記載した書面を提出します。さらに出願から30日以内に証明書の提出を行う場合もあります。これらを行わないと、出願の内容を一般に公開したというこれらの事実を理由に拒絶査定となってしまうためです。

新規性の喪失の例外の適用は、出願の内容を第三者に知られる状態となってしまってから6月以内に出願した場合のみに申請することが可能であるため注意が必要です。また、異なる別個の事象や理由で出願の内容が第三者に知られる状態となっている場合は、その事象や理由毎に申請が必要な点にも注意が必要です。

申請が認められると、出願の内容が出願前に第三者に知られる状態となった事実は無かったものとして扱われます。

かっては新規性の喪失の例外は適用条件がもっと厳しかったため、同じ研究内容について論文の投稿と特許出願または実用新案登録出願をする場合は、必ず論文の投稿より先に特許出願または実用新案登録出願を済ませてしまうようにと言われて苦労したものですが、現在は新規性の喪失の例外の適用条件がかなり緩和されたため使いやすい制度になっています。

優先権主張(パリ優先権主張)

パリ条約の日本以外の同盟国においてにすでに出願済みの内容と同じ内容について出願する場合は、優先権(後述する国内優先権とは別物で、区別するために以下パリ優先権とする)を主張することができます。そのためには、その旨と同盟国の国名と同盟国における出願日を記載した書面を出願から一定期間に提出します。

日本以外の同盟国における出願日から1年以内に同一内容または一部の内容について出願を行う必要があります。

優先権の適用が認められた場合は、同盟国における出願日を基準として判断されるようになります。

国内のみに出願する場合には意味の無い特例ですが、広く海外に事業を展開している企業で海外の国に先に出願したり海外の国において国際出願したりする場合に有効に利用できる特例です。

外国語書面出願

出願内容の記載は日本語で行うのが原則ですが、海外の企業などの場合日本語に翻訳するのにどうしても時間がかかる場合があります。そのような場合に利用できるのが外国語書面出願です。出願で提出するべき書類のうち願書のみ日本語で作成(外国語書面出願であることを願書に明記)して、他の書類は英語をはじめとする外国語で出願することができます。

ただし、出願から1年4月以内に日本語による翻訳文を提出する必要があります。翻訳文の提出をしない場合は出願人に通知がなされますが、それでも翻訳文の提出が無い場合は取り下げという扱いになります。 また、翻訳文は出願時に英語をはじめとする外国語で記載されたもとの内容を超えるものであってはなりません。もとの内容を超えた場合は誤訳訂正書を提出して補正しない限り、拒絶査定となります。

外国語書面出願は以前は英語でしか受け付けてもらえませんでしたが、今では英語以外の外国語でも受け付けてもらえるようになり、英語圏以外の国の出願人にとって便利なものになりました。

参照出願

国内または他の国ですでに特許出願した内容と同じ内容について特許出願する場合に、これを参照するように主張して特許出願することができます。この場合、特許請求の範囲や明細書、図面の提出は省力することができます。参照先が外国語でなされた特許出願の場合は、出願日から4月以内に翻訳文を提出する必要があります。 しかし、この制度は最近になって特許法条約を批准するために設けられた規定で、すでに上記の外国語書面出願や下記で説明する分割出願、変更出願等様々な制度が整っている我が国ではほとんど意味の無い規定となっています。他にもっと有利な条件で出願できる制度がいろいろとあることから、実際にこの方法で出願する人はいないのではないかと思われます。

特殊な出願

通常の出願とは異なる特殊な出願について説明します。ここでいう特殊な出願とは、すでに国内においてなされた何らかの出願をベースとして行う出願のことです。

国内優先権主張を伴う出願

国内ですでに出願(以下、先の出願)済みで、先の出願の内容をさらに発展させた発明や不十分な部分を補った発明について新たな出願を行いたい場合は、国内優先権主張を伴う出願(以下、後の出願)を行うことができます。 国内優先権主張を伴う出願では、後の出願に含まれる内容のうち先の出願に記載されている内容については先の出願の出願日を基準として判断されます(下記に記載する他の特殊な出願と異なり、後の出願の出願日が先の出願の出願日に遡及するわけではありません)。

国内優先権主張を伴う出願、先の出願から1年以内に出願する必要があり、国内優先権主張を伴う出願を行った場合、先の出願はその出願から1年3月経過した後に取り下げという扱いになります。また、先の出願がさらに前の出願に対する国内優先権主張を伴う出願であってはなりません(このような場合は、後の出願の国内優先権主張は無効となって後の出願の出願日で判断されることになります)。

国内優先権主張を伴う出願の目的は、最初に出願した発明や考案を出発点として、この発明や考案をを基本としつつ、その後の改良発明や考案等を取り込んだ十分な内容の出願へと発展させることです。

通常出願とは異なる特殊な出願の中で最も利用されている出願形態だと思われます。この出願制度の表向きの趣旨は出願の内容を充実させることなのですが、権利化された場合は後の出願の出願日を基準として存続期間が発生するため、存続期間を最大で1年延ばす効果を持っていることがよく利用される理由の一つでしょう。

分割出願

2以上の発明や考案を包含する出願(以下、もとの出願)の一部について、1又は2以上の新たな出願(以下、新たな出願)をして、もとの出願を複数の出願に分割することができます。その新たな出願は、分割前のもとの出願の時にしたものと見なされて出願日が遡及し、新たな出願は審査等においてもとの出願の日を基準に判断されることになります。

分割出願はいつでもできるわけではなく、先の出願について補正ができる期間、先の出願について特許査定・登録査定又は最初の拒絶査定の謄本の送達があった日から3月以内に限られ、もとの出願について登録または拒絶が確定している場合も分割出願をすることはできません。 新たな出願において、もとの出願に記載されていない内容が追加されていると認められた場合は、出願日が遡及せず新たな出願を実際に出願した日が出願日として扱われますので注意が必要です。 また、分割出願を行うともとの出願と新たな出願で同じ内容が記載されている状態になりますので、もとの出願については新たな出願に記載した内容を削除する補正を行う必要があります。これを行わないと、もとの出願と新たな出願でそれぞれを引用されて拒絶査定となってしまいます。

分割出願の目的は、大きく2つあります。もとの出願において、全ての請求項で同一の特別な技術的特徴を持たない(単一性を満たさない)と審査で判断された場合、拒絶査定となります。これを避けるため、もとの出願および新たな出願のそれぞれで単一性を満たすようにもとの出願から分割出願を行うことにより単一性を理由とした拒絶査定を回避することができます。さらに、もとの出願に含まれている複数の請求項のうち、一部についてはすぐに特許査定となりそうだが、他については補正や審判等で時間がかかりそうな場合があります。このような場合に分割出願を行ってすぐに特許査定となりそうな発明については早期に権利化を行い、残りについてはじっくりと対応を検討するといったことが可能になります。

分割出願は、特殊な出願の中で国内優先権主張を伴う出願に次いで多く利用される出願形態だと思います。審査の過程で補正をくりかえすことで分割出願する必要が生じたり、さまざまな効果を狙って分割出願をしたりする場合が多いと思われます。

変更出願

すでに行った実用新案登録出願又は意匠登録出願(以下、もとの出願)を特許出願(以下、新たな出願)に、またはすでに行った特許出願と意匠登録出願(以下、もとの出願)を実用新案登録出願(以下、新たな出願)に、それぞれ変更することができます。これを変更出願といいます。変更された新たな出願は、もとの出願の時にしたものと見なされて出願日が遡及し、新たな出願は審査等においてもとの出願の日を基準に判断されることになります。

変更前の変更出願ができるのは、特許出願に変更する場合はもとの出願が特許出願実用登録新案出願又は意匠登録出願の場合と、実用新案登録出願に変更する場合はもとの出願が特許出願又は意匠登録出願の場合のみであり、元の出願が商標登録出願の場合は変更出願することはできません。変更出願は、もとの出願がその出願日から3年を経過するまでに限られ、もとの出願が意匠登録出願である場合はその最初の拒絶査定の謄本の送達があった日から30日以内である場合も変更出願ができます。 新たな出願において、もとの出願に記載されていない内容が追加されていると認められた場合は、出願日が遡及せず新たな出願を実際に出願した日が出願日として扱われますので注意が必要です。 また、変更出願を行うともとの出願は取り下げという扱いになりますので、注意が必要です。もとの出願の一部について変更出願をしたい場合は、先に分割出願をしてその後変更出願するという手順が必要になります。

変更出願の目的は、はじめに特許出願をしたが実用新案登録で十分と判断した場合や、はじめに意匠登録出願をしたが意匠での権利取得が難しそうなので特許出願や実用新案登録出願に変更する場合などが挙げられます。

なお、もとの出願が実用新案登録出願である場合、形式的・基礎的な要件を満たすかどうかチェックする(方式審査)だけで、無審査(実体審査無し)で登録(出願から1月)となるため、通常は分割出願ができる期間はほとんどありません。しかし、仮に実用新案として登録された後であっても次に説明する実用新案登録に基づく特許出願の制度を利用することで特許出願に変更することができます。

特許出願とと実用新案登録出願と意匠登録出願で、出願内容の記載が似通っているのかといわれると、特許と実用新案はその通りなのですが、意匠についてはピンとこないかもしれません。形状が特別なこれまでにない技術的特徴と新規のデザイン性の両方を有している場合ということになるでしょうが、現実にはレアケースだと思われます。

実用新案登録に基づく特許出願

すでに実用新案登録出願を行って実用新案登録を受けている場合に、その実用新案登録の内容と同じか範囲内に含まれる内容について特許出願を行うことができます。その新たな特許出願は、実用新案登録出願のの時にしたものと見なされて出願日が遡及し、新たな特許出願は審査等においてもとの実用新案登録出願の日を基準に判断されることになります。

実用新案登録に基づく特許出願はもとの実用新案登録出願の出願日から3年を経過するまでに限られ、実用新案登録技術評価請求がなされてない(他人から請求された場合で、その旨の通知を受けた場合日から30日以内の場合は除く)など様々な制約があります。ここで、実用新案登録技術評価とは、無審査で登録される実用新案について特許庁がその登録内容について権利が有効か否か客観的な判断資料を提供する制度で、特許における実体審査にかわるものです。実用新案登録技術評価請求がなされているにもかかわらず特許出願を認めてしまうと、同一の内容についてまた特許審査することになってしまうためにこのような制約がかされています。 また、もとの実用新案登録は特許出願時に放棄する必要がありますので、特許出願の後の特許審査で拒絶査定となってしまった場合には一切権利が残らないことを注意する必要があります。

実用新案登録に基づく特許出願の目的は、実用新案権と比較してより強い権利である特許権を取得する手段の提供にあります。実用新案登録は無審査で行われる関係上どうしても弱い権利(権利の行使に上記の実用新案技術評価請求する必要があるなどの制約あり)であり、権利の存続期間も特許の半分の10年と短くなってしまいます。そのため、当初実用新案で十分として、実用新案登録出願をして実用新案登録を受けたが、その後思いのほか有用な技術であることが判明して存続期間を特許と同じように長くしたい、あるいはもっと強い権利にしたいといった場合に対応できるようにするために設けられている出願制度になります。

まとめ

以上、出願時に申請できる特例と特殊な出願について説明をしてきました。次回は、出願公開や審査について見ていきたいと思います。

最後になりましたが、 アスタミューゼでは現在、エンジニア・デザイナーを募集中です。 興味のある方はぜひ 採用サイト からご応募ください。

参考にした資料など

ABalytics.js + Google Analyticsを使ったABテスト

ABalytics.js + Google Analyticsを使ったABテスト

こんにちは。デザイン部でフロントエンドエンジニアをしているkitoです。
今回は、ABalytics.jsを使ったABテストについて書きたいと思います。

ABテストは、アプリケーションのUIを改善していく手がかりとしてとても有効です。
しかし、いざテスト実施しようとするとABテストツールは高額なものが多くコスト面で問題になることがあります。 今回は、ABalytics.js + Google Analyticsを使い無料でABテストが出来る方法をご紹介します。

ABalytics.jsとは

ABalytics.js?誤字じゃないの?と思われるかもしれませんが、誤字ではなくABalytics.jsというピュアなJavaScriptで書かれたオープンソースのABテストライブラリのことです。
htmlやJavaScriptの知識は必要になりますが、シンプルな使い方が可能でカスタマイズして使うこともできます。
ABalytics.jsは、Google Analyticsと連携しており、管理画面からテスト結果を確認するのでGoogle Analyticsの導入は必須です。

使い方

それでは、簡単な使い方からみていきましょう。 まずexpress.jsのインストールしましょう。Express.jsについてはこちらの記事をご覧ください。index.ejsを作成してabalytics.jsをロードします。あとで使うのでbootstrapをCDNからロードします。

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="/javascripts/ab_test.js"></script>

次にABalytics.jsの設定を記述するjsファイルを作成します。名前は任意で、ここではab_test.jsとします。 まずはじめにトラッキングコードを記述します。トラッキングコードは、Google Analyticsの管理画面からプロパティを作成すると自動的に生成されます。

f:id:astamuse:20170509111114p:plain

また、ビューの設定から登録完了画面などのABテストの結果を判定するための「目標」の設定が必要になります。

f:id:astamuse:20170509111122p:plain

次にab_test.jsに戻り、上で取得したトラッキングコードを最上部に記述します。

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
 
  ga('create', 'UA-XXXXX-1', 'sample');
  ga('send', 'pageview');
  

ABalyticsを初期化して、ABテストの設定を記述していきます。 ABalytics.jsはブラウザのcookieで、A案とB案の出し分けを判断しています。 下記コードにある「variant」は、cookieの名前の末尾つき「ABalytics_variant」ということになります。こちらも任意の文字を設定してください。

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
 
ga('create', 'UA-XXXXX-1', 'sample');
ga('send', 'pageview');
  
ABalytics.init({
    variant: [
    {
        name: 'variant1_name',
        "lead": "variant1"
    },
    {
        name: 'variant2_name',
        "lead": "variant2"
    }
]},1);

ga('send', 'pageview');

variantのプロパティにあるname: 'variant1_name'は、 Google Analyticsの管理画面でテスト結果を検証する際に必要になります。こちらも任意の文字が設定できます。 "lead": "variant1"についてですが、"lead"はテスト対象となるhtmlのクラス名、右側の"variant1"はABalytics.jsで変更される要素です。 数字の1は、カスタムディメンションのindex番号になります。事前に以下の画面からカスタムディメンションを作成して設定します。ちなみに、カスタムディメンションの最大数は20個(プレミアム アカウントの場合は 200 個)です。

f:id:astamuse:20170509111126p:plain

index.ejsに戻り、bodyタグの中に以下を記述します。

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">ABalytics.js example</a>
        </div>
    </div>
</nav>
<div class="container">
    <div class="starter-template">
        <div class="lead">
            This content will be replaced by ABalytics
        </div>
    </div>
</div>
<script type="text/javascript">
    window.onload = function () {
        ABalytics.applyHtml();
    };
</script>

ABalytics.jsによって、leadクラス以下のテキストが”variant1”と”variant2”かのどちらかに50%の確率でランダムに置き換わります。

<div class="lead">
    This content will be replaced by ABalytics
</div>

f:id:astamuse:20170509111134p:plain
まず確認すべきことは、chromeのデベロッパーツールを開きcookieのABalytics_variantのvalueが0だった場合variant1と表示されているか、valueが1だった場合variant2と表示されているかを確認しましょう。 cookieのvalueを変更してみて確認してみると良いと思います。

f:id:astamuse:20170509111151p:plain

Google Analyticsの管理画面で、ABテストの結果を確認します。設置してから1日ぐらい経ってから確認してみると良いでしょう。 場所は、少しわかりにくいですが、左のナビゲーションからカスタム→ユーザー定義と進みます。 右カラムに下記のように (not set)というリンクがあるのでクリックします。

f:id:astamuse:20170509111138p:plain

「セカンダリディメンション」というプルダウンメニューから、設定したカスタムディメンション名をクリックすると、ABテストの結果が表示されます。

f:id:astamuse:20170509111145p:plain

まとめ

ABalytics.jsは、テキストだけではなく画像やDOM要素などのテストもカスタマイズすれば可能です。
例えば、複雑なDOM要素のテストは、cookieの値によって表示と非表示を切りかえることで実現できます。スマホ画面とPC画面で別々のテストを実施することもできます。
導入をご検討してみてはいかがでしょう。 アスタミューゼでは、エンジニア・デザイナーを募集中です。ご興味のある方は遠慮なく採用サイトからご応募ください。お待ちしています。

Copyright © astamuse company, ltd. all rights reserved.