Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【Techの道も一歩から】第24回「高速かつ省メモリな辞書ライクなライブラリDAWG」

f:id:s_yuka:20190621163804j:plain

こんにちは。 DSOC R&D グループの高橋寛治です。

Pythonの辞書オブジェクトは取り扱いやすいため、単語とIDの変換テーブルを作ったり、複合語の結合のためにデータ構造を工夫して簡易なトライ木を構築したりと、自分でコーディングすることがあるかと思います。

上記の場合は、ライブラリDAWGを使うことで省メモリかつ高速に、さらにできることが増えるかもしれません。 今回はそんな便利なライブラリの紹介をします。

辞書ライクなライブラリDAWG

DAWGはDirected Acyclic Word Graphのそれぞれの頭文字をとったものです。 日本語だと有向無閉路単語グラフでしょうか。

英語のWikipediaのページに少し詳しい説明があります。 トライ木に比べて、頂点の数がかなり少なくなるデータ構造であることが特徴のようです。

利用者側としては、省メモリかつ高速に辞書引きや共通接頭辞検索ができるライブラリであるということを押さえておくといいかと思います。

共通接頭辞検索とは、共通の接頭辞を持つキーを見つける検索のことです。 かな漢字変換システムにおける、かなと漢字の対応表を見つける箇所での利用がわかりやすい例です。 「きょういく」というかなを漢字に変換する場合を考えます。候補は「き」「きょ」「きょう」「きょうい」「きょういく」となり、それぞれに対応する漢字があります。 「きょう」で候補を定めたとすると、次は「いく」に対して「い」「いく」に対応する漢字をまた引きます。 このように共通の接頭辞に対して候補を高速に引くことがき、なおかつ省メモリで保持することができます。

DAWGのPython実装の公式ドキュメントはこちらです。 インストールは pip install DAWG で完了します。

公式ドキュメントのUsageに書いているDAWGクラスを簡単に紹介します。

  • dawg.DAWG : ユニコード文字のキーを保持し、検索が可能です
    • dawg.CompletionDAWG : dawg.DAWG のサブクラスであり、共通接頭辞検索などが可能です
      • dawg.BytesDAWG : dawg.CompletionDAWG のサブクラスであり、ユニコード文字のキーに対してbytesオブジェクトのリストを対応させます
        • dawg.RecordDAWG : dawg.BytesDAWG のサブクラスであり、 Pythonのstructでパッキングされたデータをユニコード文字のキーに対応させます
      • dawg.IntCompletionDAWG : dawg.CompletionDAWG のサブクラスであり、ユニコード文字のキーに対して、数値を対応付けます
    • dawg.IntDAWG : dawg.DAWG のサブクラスであり、ユニコード文字のキーに対して、数値を対応づけます
続きを読む

Sansan Labs 開発での Terraform ディレクトリ構成

初めまして。あけましておめでとうございます。
DSOC R&D アーキテクトの鈴木賢志です。

Sansan Labs*1 では、新しい働き方の実現を目指し実験的な機能を一部公開しています。私は普段、それらの開発を中心に、R&D から生まれるサービスの品質改善などに取り組んでいます。
今回は、Sansan Labs で活用している Terraform のディレクトリ構成と、どのような理由でこの形になっていったかを紹介したいと思います。

Terraformのディレクトリ構成

Sansan Labs ではクラウドに AWS をメインで使用しており、昨年からインフラ構成管理のツールとして Terraform の利用を始めました。

初めて Terraform を使い始めた時に、最も悩んだのが .tf ファイルやディレクトリをどのように分けるか、という点でした。
これに対し色々考えた結果*2、以下のように落ち着きました。

terraform_project_root
├── env
│   ├── dev
│   │   └── main.tf
│   └── prod
│       └── main.tf
└── modules
    ├── module_1
    │   ├── main.tf
    │   ├── output.tf
    │   └── variables.tf
    ├── module_2
    │   ├── main.tf
    │   ├── output.tf
    │   └── variables.tf
    ├── ...

簡単にまとめると Terraform の Module という、構成をテンプレート化して再利用できるようにする機能を用いて、 環境ごとに分離したmain.tfファイルに、実際のインフラを表現していくといった戦略です。

*1:Sansan Webサービス内の右上にある、フラスコアイコンから利用できます。

*2:検討する上で一番はじめにヒットし参考にさせていただいたのは、クラスメソッド様のこちらの記事になります。ありがとうございます。

続きを読む

VAEに基づくグラフの表現学習

こんにちは。年末年始はファイアーエムブレムで可処分時間が消えてしまった DSOC R&D Group の橋本です。
さて、今回の記事では、変分オートエンコーダ (Variational Auto-Encoder, VAE) [1]に基づくグラフの表現学習について紹介したいと思います。
近年グラフに対する深層学習手法の発展が目覚ましく、応用先としては材料科学(分子や結晶をグラフと見る)*1や、ソーシャルネットワークなどが挙げられます。ここではソーシャルネットワークのようなグラフに対するものに限定して、ノードの潜在表現を得る手法を紹介します。*2

*1: 私はもともと化学を専攻していたというのもあり、材料科学に対するグラフ機械学習の手法にも興味があったりします

*2: VAEを用いたグラフの表現学習において、応用ドメイン先によって発展のアプローチが異なるようです。大規模なソーシャルネットワークについては本記事で紹介するようにノード埋め込みの解釈性向上についての研究が多いです。一方で例えばVAEを材料科学に応用する場合、新規材料の候補を生成することが一つの目的となります。それを達成するためにはできるだけ化合物が化学的に正しいように生成されることが重要となるため、いかに化合物の原子価の規則を守ったまま分子をdecodeするかについての研究などが主に進んでいます[7, 8]。

続きを読む

CSIRTになって思うこと

はじめまして。CSIRTの松田です。 今年の4月からセキュリティエンジニアとしてSansanで働いています。 前職では主にインフラエンジニアとして物理的な配線設計から保守運用まで幅広く携わりました。 インフラと向き合う中でセキュリティ対策装置に触る機会が多く、その奥ゆかしさに惹かれてセキュリティの世界にのめり込み、今に至ります。

私がSansanのセキュリティエンジニアに転身しようと考えた理由は、自身の経験が活かせることはもちろんですが、社としてのセキュリティに対する思いに共感したからです。

セキュリティと利便性を両立させる

これは企業理念「Sansanのカタチ」のPremiseとして、相反するセキュリティ利便性両方に徹底的に向き合うことを掲げています。 この、一見相反する両立が難しい事柄と常に向き合うことで圧倒的に成長できると確信しSansanのセキュリティエンジニアとなりました。

f:id:ss-matsuda:20191222204622j:plain

本記事は、これからセキュリティエンジニアを目指す方、興味のある方、そもそもCSIRTってどんな業務をやっているか謎だという方に少しでも参考になれば幸いです。

セキュリティエンジニアと言っても幅広い意味を持つので、その一要素であるCSIRTに焦点を当てます。私自身、CSIRTに従事するのは今回が初めてだったため、表面的には理解していたものの実際にどのような業務を行うのか理解を深める目的で情報を整理し、まとめてみました。

続きを読む

歴史をたどってディープラーニングを学ぶ 第三回 Cifar10と勾配消失問題についての考察

こんにちは、ニューラルネット老人こと糟谷勇児です。
最近は恐竜に凝っていて化石を買ったりしています。ニューラルネット界の化石と化してしまう前に、今回もディープラーニングを勉強していきたいと思います。

さて、前回はReLUについて自作のプログラムで検証しました。
これまでMNISTを題材にしてやってきましたが、MNISTの認識はディープラーニングより単純な手法のほうがうまくいくと思われるので、いまいち真実味に欠けるところがありました。

そこで、今回はタスクをちょっとだけ難しくするべくCifar10というデータセットに挑戦していきます。
https://www.cs.toronto.edu/~kriz/cifar.html

Cifar-10

ちなみにCifarはCanadian Institute For Advanced Researchの略のようです。暗号を表すCipherと似てるのでいつもわからなくなります。

Cifar-10には、10種類のクラスがあり、airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck がそれぞれ数字でタグ付けされています。
マルチクラス分類は学習データが必然的に増えるのでクイックに検証をまわすために、今回は2クラスに絞ってみます。
やはり一番かわいい猫を選びたくなりますね。

画像を見てみると・・・

f:id:kasuya_ug:20191222181727j:plainf:id:kasuya_ug:20191222181730j:plainf:id:kasuya_ug:20191222182140j:plainf:id:kasuya_ug:20191222182142j:plainf:id:kasuya_ug:20191222182145j:plain
小さいけど猫だ。

f:id:kasuya_ug:20191222181144j:plainf:id:kasuya_ug:20191222181321j:plainf:id:kasuya_ug:20191222181555j:plainf:id:kasuya_ug:20191222181724j:plain
ねこ・・・?

f:id:kasuya_ug:20191222181422j:plain
ねこ・・・だけど・・・。

今回のような認識タスクでは、人がミスったものを目で見て「これはしょうがないでしょ」とか「これはなんで認識できないんだろう」など分析するんですが、結構判断に困る画像が出てきそうなので、比較的わかりやすそうな飛行機と船を題材にすることにします。

飛行機
f:id:kasuya_ug:20191222182351j:plainf:id:kasuya_ug:20191222182354j:plainf:id:kasuya_ug:20191222182357j:plainf:id:kasuya_ug:20191222182400j:plainf:id:kasuya_ug:20191222182402j:plain


f:id:kasuya_ug:20191222182254j:plainf:id:kasuya_ug:20191222182256j:plainf:id:kasuya_ug:20191222182259j:plainf:id:kasuya_ug:20191222182301j:plainf:id:kasuya_ug:20191222182304j:plain

なお、Pythonの場合はPickelした画像が用意されているのですが、C#にはないのでファイルに落としてから、OpenCvSharpというC#用のOpenCVのラッパーを用いて読み込むようにしています。

続きを読む

新卒データアナリストの9ヶ月

こんにちは、CPO (Cheif Product Officer) 室でデータアナリストをしている佐々木です。

私は今年の 4 月に新卒で Sansan のデータ統括部門である DSOC(Data Strategy and Operation Center)*1 に配属され、10 月の異動により現在は CPO 室に所属しています。実は Sansan がデータアナリストを新卒で採用したのは私の入社した年が初めての試みでした。
今回は、新卒データアナリストとして入社してからの 9 ヶ月間の振り返りを書いていきたいと思います。

CPO 室のご紹介

まず簡単に現在所属している CPO 室がどんなところかを紹介します。CPO 室の業務については先日 CPO 室の新卒同期の佐藤が書いています。
buildersbox.corp-sansan.com

要約すると、CPO 室は

  • プロダクトについて中長期目線で考え、あるべき姿を提案する
  • あるべき姿が定まった時に、現状とのギャップを把握し、その差を埋める

という 2 つの大きな役割を担っている部署です。

その仕事内容は、プロダクト戦略の策定から、既存機能の改善、新規施策の提案と評価、KPI設計、分析基盤作り、ユーザ調査*2 など多岐にわたります。

軽く現在の業務を紹介したところで、入社当初から振り返りたいと思います。

*1:https://sansan-dsoc.com/research/

*2:弊社では NPS という顧客ロイヤリティ指標に本気で向き合っています。https://buildersbox.corp-sansan.com/entry/2019/08/06/113748

続きを読む

管理者がSansanスマートフォンアプリの端末パスコードロックを必須化出来るようになりました

こんにちは!Sansan事業部プロダクト開発部所属の赤城です。SansanのAndroidアプリ開発を担当しております。

2019年12月上旬から、管理者が端末パスコードロックを必須化する機能が使えるようになりました! 今回はこの機能について、実装するに至った背景から実際の使い方、そしてAndroidアプリ開発時の裏話を紹介させて頂きたいと思います。

背景

Sansanスマートフォンアプリには、パスコードロックの機能があります。これは、スマートフォン自体のパスコードロックとは別に、Sansanアプリを起動するたびに4桁の認証コードの入力を求める機能です。正しい認証コードを入力しない限りアプリを使用できないため、仮に「端末を紛失し、第三者に端末のロックを突破された」「端末のロックを解除して放置した隙にスマートフォンを操作された」等の事象が起こってしまった際にも、Sansanアプリ内の情報が第三者に漏れることを防ぐための機能です。

f:id:ginyolith:20191220182244g:plain:h400
パスコードロック時の動き

今までのSansanスマートフォンアプリにおいては、上記のパスコードロックの設定は利用者個人に委ねられていました。 その性質上、一部のユーザー様から下記のような要望をいただいていました。

  • セキュリティに関する施策の一環でパスコード設定をマストにすることを検討しており、管理者側で一斉にONにできるようにしたい

  • スマホアプリのパスコード設定について、管理者側で設定の必須/不要を選んで、強制的に設定させたい

上記の背景から、 個人のセキュリティ意識に依存せず、企業のセキュリティポリシーとしてパスコード設定を利用できるようにする仕組み として、管理者がパスコードロックを必須化できる機能を開発するに至りました。

続きを読む

© Sansan, Inc.