RSS

LINEのデベロッパー向け情報をまとめたポータルサイト「LINE Engineering」公開とBlog更新について

by LINE Engineer on 2017.2.10


こんにちは、日本のLINE Engineer Blogを担当している櫛井です。
LINEのデベロッパー向け情報をまとめたポータルサイト「LINE Engineering」公開と、今後のBlog更新についてお知らせいたします。

技術的な情報などをお知らせしている LINEの公式Twitterアカウント@LINE_DEVにて先行してお知らせしていましたが、LINEのデベロッパー向け情報をまとめたポータルサイト「LINE Engineering」を公開しました。


LINE Engineering

More »

2016年LINE Security Bug Bounty Programの結果について

by LINE Engineer on 2017.1.31


常時運営化について

こんにちは。LINEでセキュリティに関する業務を担当しているMJです。

今回の記事では、2016年の「LINE Security Bug Bounty Program」を振り返り、皆さんにご紹介していきたいと思います。このプログラムは、サービスに潜在的に存在する脆弱性を外部のエンジニアの方々からご報告を頂き、我々が迅速に修正していくことで、皆様により安全なサービスを提供することを目的としています。

まず、2015年に8月24日~9月23日の期間限定で試験的に実施し、そして、(1)プログラム内容の改善 (2)リスクの継続的な管理を目指して、プログラムの利用規約、報告フォーム、報告内容の判定基準、さらに常時運営を前提とした運営体制等のあらゆる側面の改善を準備し、2016年6月2日より「LINE Security Bug Bounty Program」として新たに運営をすることとなりました。

LINE Security Bug Bountyのトップページ: https://bugbounty.linecorp.com/

脆弱性報告フォーム: https://bugbounty.linecorp.com/apply/

プログラムのFAQ: https://bugbounty.linecorp.com/ja/faq/

日付/脆弱性別の受付状況

LINE Security Bug Bounty報告フォームから受付した状況は以下のとおりです。 常時運営の開始日2016年6月2日から12月31日までの約7ヶ月間で、97件の報告を受付いたしました。以下の【図1】は、日別(週別)の受付件数、受付脆弱性名の割合をグラフで表現したものです。

【図1】 日別(週別)受付件数、受付した脆弱性名の割合

国別アクセス

今回受付けた97件のうち、日本国内からは15件、海外からは82件でした。以下【図2】は、常時運営期間、WEBサイトにアクセスした国別アクセスの割合ですが、日本のみならず海外からも高い関心があったことがわかりました。

【図2】 国別アクセス割合

審査について

受付した内容は、1次審査、2次審査に分けて行われました。審査については、前回の記事でも紹介しましたが、 1次審査、2次審査を通ったものが脆弱性として認定され、報奨金の対象になります。認定されると、Hall of fameに報告者の名前、認定された脆弱性のカテゴリなどが公開されます。 審査ステータスは以下のとおりです。

【図3】 審査ステータス

1st ACCEPT:脆弱性報告の提出資料として審査可能と判断した状態です。
1st REJECT:脆弱性報告の提出資料として審査不能と判断した状態です。
2nd ACCEPT:資料の内容を精査して脆弱性として認定された状態です。
2nd REJECT:資料の内容を精査して脆弱性として認定されなかった状態です。
Completed:報奨金の支払いまで完了した状態です。

審査結果

今回のプログラムでは、XSS、CSRFなど合計13件が脆弱性として認定されました。 2016年の常時運営プログラムを通じて発生した報奨金の総額は、27,000 USDでした。 審査結果については、Hall of fameページから確認することができます。 Hall of fameの更新状況はこちらのページでアナウンスを行っています。

審査の結果、利用規約上プログラムの対象ではなかったため、正式には認定できないものがあり、 その中でもLINEにとって有益な情報であった報告については、特別な取り扱いとしてSpecial Contributorsという枠を設け、 2016年には、8人の方を認定させていただきました。

おわりに

皆様の高い関心とたくさんの有益な報告のおかげで、LINE Security Bug Bounty Programを通じてLINEは多くの改善を達成することができました。 報告いただいた脆弱性はすべて修正されており、ユーザーの皆様はLINEサービスをより安全に利用することができます。 LINE Security Bug Bounty ProgramがLINEのセキュリティリスクを減らす取り組みの一環のプログラムとして、さらに良質なものへと拡張/発展できるように努力したいと思います。 現在、LINEが提供するサービスの数も増加し、さらにグローバルに拡大している状況であるためプログラムの対象の拡大については特に優先的課題として検討を続けております。 LINE Security Bug Bounty Programサイトでは常時脆弱性報告を受け付けていますので、今後も皆様のご協力とご参加をお待ちしております。

LINE Haskellブートキャンプ

by LINE Engineer on 2017.1.31


こんにちは、LINEでフロントエンド開発を担当しているJunです。

2016年10月24日~28日の5日間、「LINE Haskellブートキャンプ」というプログラムがLINEの渋谷オフィスにて開催されました。今回の記事では、同プログラムに参加した感想を書きたいと思います。

Haskellとは

Haskellは、柔軟性、合成可能性(composability)、安全性を維持しつつ、高性能のソフトウェアの作成を可能にする現代的なアプリケーションプログラミング言語です。ここ最近、Facebookやスタンダードチャータードなど複数の企業でHaskellを導入して商用利用の可能性を検証した例が増えており、数多くの言語・ライブラリがHaskellの方法論を借用して業界から注目を集めています。

LINEでも勉強会を立ち上げてHaskellを学習したり、社内サービスをHaskellで開発したりするなど、Haskellへの関心が高まっています。こうした中、5日間にわたって開かれた「LINE Haskellブートキャンプ」は、Haskellに興味のあるエンジニア同士が集まってHaskellに入門してみるプログラムでした。同ブートキャンプは、Haskellに対する奥深い学術的考察というよりは、誰もがHaskellに興味を持って使い始められるように、初心者レベルから学習することを目標にしました。進行役は、Haskellを使って社内サービスを開発した経験があるHanさんが担当してくれました。

なぜ、Haskellなのか

Haskellで高性能のプログラムを安全かつシンプルに作成する例を紹介します。

import Data.List (isPrefixOf)
  
appendIfNeeded xs ys =
    if xs `isPrefixOf` ys
        then ys
        else xs ++ ys

上記のappendIfNeeded関数の定義にはデータ型を一切明示していません。でも、Haskellの型推論のおかげで、関数の引数であるxsysは比較できるリストであることが保証されます。この関数にリストではない値を入力した場合、またはリストの引数が比較できないデータ型である場合は、コンパイラはエラーを出します。Haskellの型推論は、コードをシンプルに維持しつつ、間違ったコードが実行されるリスクを減らします。

Haskellが保証する安全性は、値の型だけにとどまるものではありません。以下のような型を持つ関数があると仮定してみましょう。

toString :: Integer -> String

上記のtoString関数は、整数を引数として受け取り、文字列を返す一般的な関数で、どの言語でも作成できます。しかしHaskellは、この関数について、「同じ整数が引数として提供されれば、いつ、どこでこの関数が実行されても同じ文字列を返す」ということを保証します。つまり、Haskellの関数は、同じ入力値に対して常に同じ出力値を返すことが保証されます。一般の言語では、ある関数を呼び出したときにどんなことが起きるかは、コードを確認しない限り分かりません。ある関数を呼び出すことで、意図せずにファイルシステムにある特定のファイルをサーバに送信したり、大陸間弾道ミサイルを発射したりすることもあり得ます。しかしHaskellでは、関数の型を見るだけでも、そうした期待外れの動作が発生しないことを確信できます。

readFile :: FilePath -> IO ByteString

一方、readFileは、特定のファイルパスを受け取り、そのファイルの内容を読み込む関数です。この関数はファイルシステムにアクセスする必要があり、ファイルシステムはいつでも変化できます。Haskellはこの場合、IOという型で関数をアクションにすることができます。アクションは、実世界とコミュニケーションすることができ、ファイルの入出力やネットワーク通信などの有意味な副作用を作り出すことができます。大事なのは、IO型によって指定されたアクションだけがそのような副作用を作り出せるということです。Haskellでは、副作用に対する例外処理のためにアクション以外のコードを確認する必要がありません。こうした副作用の分離は、コードの構造を改善するだけでなく、メンテナンスにかかる手間も減らす効果があります。

このように、Haskellは型レベルで副作用を管理することで参照透過性(referential transparency)を確保できる言語です。どの関数がどの型の値を引数として受け取って返すのか、時間と空間に関係なく常に同じ値を返すのか、副作用を発生させることができるのか、などをコンパイル時に把握できます。その結果、同時性と並列性が実現しやすくなります。同時性と並列性は、現代のプログラミングにおいて重要なテーマであり、かつ難しいテーマでもあります。ほとんどの言語では、プログラマがより注意を払うことでそのような難しさを克服します。それに対し、Haskellコンパイラは十分な情報を持っているため、独自で同時性を管理できます。

f x + g y

上記は、fという関数をxに適用した結果と、gという関数をyに適用した結果を合計する式です。Haskellの「+」はIOアクションではないので、コンパイラは型を明示しなくてもfgもアクションではないことが分かります。これは、f xg yが時間と空間に関係なく同じ値を返すという意味です。そのため、f xg yが同時に実行されても、他のCPUコアで実行されても結果には影響を与えません。したがって、コンパイラに並列化に関する簡単なヒントを与えるだけでも並列計算を実行するプログラムを作ることができます。

f x `par` g y `pseq` f x + g y

上記のコードにおいて、par関数はf xg yを同時に実行させ、pseq関数は左側の実行が完了してから右側の計算を実行させます。ここで適切なコンパイル引数または実行引数を指定すれば、f xg yが自動的に並列化します。同時性・並列性の実現のためにプロセスやスレッド、スレッドプールなどを使いながら奮闘する必要はありません。

以上のように、Haskellはシンプルなコードで安全性、参照透過性、同時性などを確保できる合理的かつ革新的な設計となっており、性能や合成可能性、コミュニティ、エコシステムなど、様々な魅力を持っています。

Haskellブートキャンプ

ブートキャンプは、月曜日から金曜日までの5日間、午後に2時間ずつ毎日行われました。相当な時間を投入しないといけないプログラムでしたが、たくさんの開発者が集まってくれました。会場がいっぱいになるほどの人数で、Haskellに対するLINEエンジニアたちの熱い関心をうかがうことができました。

同ブートキャンプは、まずHanさんのスライドを見ながらHaskellの基本概念と規則を学習し、その後みんなでライブコーディングを実習する形で行われました。Haskellの文法はシンプルですが、慣れていない初心者には少し難しいかも知れません。実際にHaskellを学ぼうとする人の多くが、この段階でよく諦めてしまいます。LINE Haskellブートキャンプは、Haskellに入門する開発者たちがHaskellのコーディングに慣れることに重点を置きました。

興味深いことに、Haskellブートキャンプに参加した開発者たちの主な担当分野は、クライアント、サーバ、フロントエンドなど多岐に渡っていました。Haskellは、「なんとしても成功を避けよう(Avoid success at all cost)」という非公式のモットーを掲げ、型破りで実験的なプログラミング言語の発展を図ってきました。こうしたHaskellの発展は、他の言語にも良い刺激剤となりました。Javaのラムダとジェネリクス、ScalaのOptionやFuture型、SwiftのOptional chaining、JavaScriptのPromiseやasync/awaitなど、多数の言語の機能がHaskellの影響を受けて誕生しました。これはつまり、Haskellを学習すれば、普段使っている言語への理解も深まることを意味します。Hanさんは、Haskellの概念を説明する際に、それに対応する他の言語の機能も合わせて紹介してくれました。そのおかげで、Haskellの理解を促進することができ、プログラミング分野におけるHaskellの価値を実感することもできました。

ブートキャンプでよかった点は、果てしなく難しく感じられるかもしれないHaskellを、実用の観点から説明しようとしたことでした。例えば、Haskellというと通常、ラムダ計算、圏論、型クラス、モナドといった、聞くだけで難しくて怖いイメージの概念が思い浮かびます。しかしHanさんは、柔軟性、合成可能性、安全性といった実用面にフォーカスしてHaskellを説明しました。当たり前のことですが、Haskellを使うために圏論の博士号などが必要なわけではありません。Haskellを学習する方法も他のプログラミング言語のそれと大して変わりません。まず触れるレベルになったら、いろいろ作ってみながら少しずつ難しい概念を習得していく。LINE Haskellブートキャンプはその第一歩として重要な役割をしたと思います。

LINE Haskellブートキャンプは、通常のHaskell勉強会とは若干異なるカリキュラムを採用しました。一日目は、Haskellコミュニティで一般的に使われるプロジェクト管理ツールであるStack、パッケージおよびドキュメントのリポジトリとして使われるStackageについての説明がありました。さらに、String型の非効率を解決するTextやByteString、Haskellのメタプログラミングを可能にする拡張のTemplate Haskell、Webアプリケーション・インターフェースであるWAIなど、今すぐHaskellを使って何か面白いものを作るために必要なツールを紹介しました。Haskell勉強会は下手すると学術的になりがちですが、LINE Haskellブートキャンプは多様な分野の開発者に役立つ実用的な内容で構成されていたことが印象的でした。

もちろん、5日間ずっとコードとライブラリの話ばかりしていたわけではありません。ブートキャンプの重要な目的の一つは、Haskellへの興味と意欲を引き出すことでした。そのため、HanさんはHaskellを使うべき理由について様々な例を交えて説明しました。LINEでは、数多くのエンジニアたちが、それよりさらに多くの装置を用いて、それより遥かに多くのユーザーが利用するサービスを開発しています。このような環境で一番重要なことの一つは、サービスの信頼性(reliability)です。他の多数の言語が信頼性を確保するために様々なツールと規約を開発者に強制しているのに対し、Haskellはプログラミング言語レベルでより安全なプログラムを保証します。信頼性が何より重要な状況なら、Haskellはいい選択肢になるはずです。また、Haskellは、プログラミング自体に興味と情熱を持っている人々から大きな注目を浴びています。これはつまり、Haskellを使用すれば、強いモチベーションを持っている優秀なエンジニアたちと一緒に働ける機会が増えることを意味します。LINEのように優秀な開発者の募集に積極的な会社であるほど、Haskellの価値はさらに高く評価されるはずです。

最終日の「モナド怪談」セッションもとても興味深い内容でした。モナドはHaskellを難しく感じさせ、Haskellを学ぼうとする人々を挫折させる概念の一つです。実際に、モナドという概念は圏論からきたもので、これを完璧に理解するには高度な学術的知識が求められます。Hanさんはこれに対し、「モナドを理解することでHaskellプログラマになろうとするのは、『楽器とは何か』を理解することで楽器の演奏者になろうとするのと同じ」という表現を引用しました。楽器の演奏者になるために楽器の哲学的な意味を理解する必要がないように、Haskellを実用ツールとして使用するためにモナドの学問的な意味まで理解する必要はありません。結局、圏論とモナドという単語から感じられる怖さ自体が、Haskellの学習で陥りやすい落とし穴なのです。「モナド怪談」セッションでは、そのような落とし穴の存在をHaskell学習者に事前に知らせ、難しい単語のせいでHaskellへの興味を失ってはいけないと強調しました。

おわりに

Haskellに興味のある方は、LINEでHaskellを使用していることや勉強会が開催されたことに驚いたのではないでしょうか。私もかなり前からHaskellに興味を持っていましたが、それを会社で使う機会があるとは思いませんでした。LINE Haskellブートキャンプは、LINEがIT企業として技術とツールの重要性を忘れない会社であり、向上心に満ちた仲間たちと一緒に働ける職場であることを改めて実感できるきっかけとなりました。個人的にもわくわくする楽しいプログラムでした。

同ブートキャンプで得られた最も大きな成果は、Haskellが商用利用に必要な実用性を十分に備えていることを確認できたことでした。Haskellが学界発の言語であることは確かですが、すでに世界有数の企業がHaskellを導入して成功を収めています。これは、Haskellが学界だけでなく、産業界でも有用なツールであることを裏付ける証拠であると、Hanさんは強調しました。ブートキャンプでもHaskellの様々な実用的なツールが紹介されましたが、その中にはソフトウェアトランザクションメモリなど、サービスに実際に導入してもいいと思えるものがたくさんありました。時間の都合上、各ツールに関する詳しい説明は聞けませんでしたが、Haskellの実用性を体験することができました。

今回のブートキャンプをはじめとする様々な取り組みが今後実を結び、次回はさらに面白いニュースを皆さんにお伝えできればと思います。例えば、LINEでのソフトウェア開発にHaskellをより本格的に導入し、それによって開発されたソフトウェアを技術面から詳しく解説できるようになれば何よりです。最後に、ブートキャンプ最終日の「モナド怪談」セッションで使われたスライドを以下に掲載しておきます。

LINE BOT AWARDS API協賛企業のご紹介

by LINE Engineer on 2016.12.29


今回の記事では、ただ今絶賛エントリー募集中のLINE BOT AWARDSに、API協賛企業として参加いただいている各企業の協賛内容をご紹介します。

中には日本マイクロソフト社のMicrosoft Azureなど、本来有償のものをLINE BOT AWARDSにエントリーいただいている方に特別に無償提供しているものもあります。
是非この機会にエントリーください。様々なAPIを上手く活用した、斬新なbotが数多く生まれることを期待しています!

各社のAPI協賛の内容(順不同)

hachidori株式会社

同社のプログラミングレスチャットbot作成プラットフォーム「hachidori」を無償でご利用いただけます。お手続きは以下の通りです。

  1. アカウントを作成します。
  2. botの作成をクリックし、LINEを選択します。
  3. その中で、ディレクションに沿って必要情報を入れていただくと、サーバーレスで、botの作成が完了します。

日本マイクロソフト株式会社

Microsoft Azureを無償でご利用いただけます。
ご利用の詳細な手順は下記をご参照ください。

【コード認証】

  1. Azure Passのアカウントを作成します。
  2. 居住国とLINE BOT AWARDS事務局から発行されたPromo Codeを入力し、Submitをクリックします。
  3. Sign Inをクリックし、マイクロソフトアカウント(個人用でも法人用でも使用可能)に入ります(マイクロソフトアカウントをお持ちでない場合は、新規作成をクリックしてアカウントを作成してからご利用ください)。
  4. 確認ページに飛びますので、記載事項に間違いがないことを確認し、Submitをクリックしてください。
  5. Azure上で提供しているサービス内容を確認後、Activateをクリックします。

More »

セキュリティエンジニアからみたUnityのこと

by LINE Engineer on 2016.12.22


 この記事はLINE Advent Calendar 2016の16記事目です。

 こんにちは、LINEエンジニアの愛甲健二です。所属は「セキュリティ室」の「Application Security Team」というところで、主にリリース前のGames/Appsの診断を行っている、いわゆる一般的なセキュリティエンジニアです。今日はUnityに関するセキュリティ視点の入門記事を書きたいと思います。

はじめに

 そもそも「Games/Appsのセキュリティ診断って具体的に何をするのか」という話ですが、基本的にはアプリの解析と、通信プロコトルの解析/診断をメインに行います。

 アプリの解析にはいくつかのツールを使うのですが、まず.dexを分析するためにJava Decompilerを使います。有名なものにJD-GUIがあります。ただ、デコンパイルに失敗するメソッドがあったりするので、そのときはsmali(AndroidのJavaVM実装)を直接読みます(smali)。smaliはApktoolを使って.apkを展開するとファイルが作成されます。コード分析においてはJava、ARM、そしてIL(Intermediate Language)が読めればほぼ問題ないので、それぞれJD-GUI、IDA、JustDecompile辺りを使います。これらは後ほど改めて解説します。

More »

新語・固有表現に強い「mecab-ipadic-NEologd」の効果を調べてみた

by LINE Engineer on 2016.12.21


LINE の Data Labs(データラボ)で自然言語処理に関連する技術に関わっている @overlast (佐藤 敏紀) です。この記事は、LINE Advent Calendar 2016 の 15 記事目です。

この記事をお読みの方には「LINE と自然言語処理って関係あるの?」と思われる方もいらっしゃる思います。

Data Labs ではデータ収集・解析基盤の開発や機械学習技術の適用だけでなく、自然言語処理に関する実用的な技術の開発・研究を、かなり真面目におこなっており、その成果によって弊社のお客様のお役に立つことは当然として、他社さまや研究者、学生さんにも広く貢献したいと考えております。

はじめに

今回は、私が作っている mecab-ipadic-NEologd とその効果について、このブログで一回も書いていなかったので書きます。

mecab-ipadic-NEologd は形態素解析エンジン MeCab と共に使う単語分かち書き辞書で、週2回以上更新更新され、新語・固有表現に強く、語彙数が多く、しかもオープンソース・ソフトウェアである という特徴があります。

この記事では、mecab-ipadic-NEologd の分書分類タスクにおける有効性を確認する実験をおこない、その結果として「安心して最新版の mecab-ipadic-NEologd を使って大丈夫」という結論を得たことについて書きました。

色々な方々が頑張って下さっているおかげで mecab-ipadic-NEologd は Kuromoji からも使える様になっており、川田さん(@hktechno)による 6 記事目、(Elasticsearch を検索エンジンとして利用する際のポイント)の記事に出てきた「Elasticsearch のすごいところは、大量のドキュメントの中から形態素解析や n-gram など自然言語的な解析を行った上で(略)」という部分にも関係してきます。

この記事は、自然言語処理が必要そうな仕事をなさっているエンジニアさんにオススメの記事ですので、最後まで読んで頂いたり、「新語や未知語が足りない問題」などで困っているお仲間にオススメして頂けると、とても嬉しいです。

例文:「彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。」

More »

Sparkと機械学習と時々MPI

by LINE Engineer on 2016.12.20


はじめに

こんにちは、LINEで機械学習エンジニアを担当している久保です。この記事はLINE Advent Calendar2016の14記事目です。 今回の記事は、機械学習の(勾配などの)基本的な知識を持ち、Sparkにおける機械学習に興味がある人向けの内容となっています。

Sparkは大規模なデータのための分散処理フレームワークとして人気があり、弊社でも機械学習関連の開発において利用しています。 弊社では機械学習の特徴量の元となるデータがHDFSに格納されているため、それらを容易に読み込むことができる親和性の高さと、分散処理のコードが容易に実装できる所がSparkを利用する上での大きな魅力となっています。

具体的な利用方法として、例えば機械学習エンジンに入力する特徴量を作成するためのETL(抽出、変換、ロード)処理に利用しています。 また、LINE STOREにおける着せ替えの商品ページの右枠にあるアイテムベースのレコメンドやLINEアプリ内でLINE NEWSを立ち上げた際にトップ画面に出てくる「FOR YOU」枠のためのユーザベースのレコメンドなどにおいて、Sparkの機械学習ライブラリであるMLlibを用いてモデルの学習を行っています。
More »