• このエントリーをはてなブックマークに追加

  • CodeIQ感謝祭「ドワンゴからの挑戦状」についての解説

    2017-09-26 15:15
    ドワンゴ 技術コミュニケーション室の塩谷( @kwappa / @kwappa@friends.nico )です。

    9/16に開催された「学びの秋!エンジニア最先端に触れて学ぶITフェス」というイベントにドワンゴも企業として出展し、私も職務経歴書についての講演を行ってきました。ご清聴いただいた皆様、ありがとうございました!

    さて、企業ブースでは「ドワンゴからの挑戦状」と題したプログラミング課題を用意し、正解者には先着順でアスキードワンゴの技術書をプレゼントする企画を実施しました。「ヒントが欲しい」「解き方を教えてください」という要望も多かったので、解法をJavaScriptによるサンプルコードを添えて紹介します。
    fdc86074325d0845df1fcb641327b7596e9950bf

    解答と解説

    Q1 : 101

    力技で解くなら、2525から1までのループを回し、その数と2525および5252の剰余を求め、いずれも0になる最初の数、ということになります。
    let a0
    for (let i = 2525 ; i > 0 ; i --) {
      if (2525 % i === 0 && 5252 % i === 0) {
        a0 = i
        break
      }
    }

    最大公約数を求める有名な方法に「ユークリッドの互除法」があり、そちらを使えばより計算量少なく求めることができます。

    x <= y , x > 0 , y > 0 の場合、以下のコードで最大公約数が求められます。互いに素な場合は1が返ります。

    function gcd(x, y) {
      let r
      while (y > 0) {
      r = x % y
      x = y
      y = r
      }
      return x
    }
    const a1 = gcd(2525, 5252)


    Q2 : 2859870693

    漸化式なので、設問通りの演算をする関数を再帰的に呼び出せばn項めを求めることができます。ですが、Q3とQ4が同様の数列を利用する問題になっているため、ここで全要素を演算した配列を生成した方が楽でしょう。

    2 ^ 32 はこのあとも使うので、ここで定義してしまいましょう。ES2016からは 「2 ** 32」 と書くこともできます。

    const TWO_POW_32 = Math.pow(2, 32)
    let arr = [a1]
    for (let i = 1 ; i <= 1000 ; i ++) {
      arr[i] = (arr[i - 1] * 2525 + 5252) % TWO_POW_32
    }
    const a2 = arr[1000]


    Q3 : [2355222565, 3890716245, 434637493, 1285940997, 3265016661, 5746901]

    文字コードをindexとして先ほどの配列から取り出し答えとなる配列にpushしていく、という戦略が考えられます。

    文字列を配列に分解するにはスプレッド演算子が使えます。 以前は `'dwango'.split('')` という書き方をすることが多かったようです。

    const a3 = [...'dwango'].map(v => arr[v.charCodeAt(0)])

    Q4 : 2110379477

    ソートして取り出すだけの問題です。500番目はちょうど真ん中なので、昇順 / 降順を間違えても解答は変わらないというボーナス問題です。

    JavaScriptの場合は単純に `Array#sort` でソートすると文字列として辞書順でソートされてしまうので、比較関数を書いて数値でソートする必要があります。

    const sortedArr = arr.sort((a, b) => a - b)
    const a4 = sortedArr[500]

    問題 : 3322

    JavaScriptではreduceというメソッドで畳み込み演算を行うことができます。Q3で作った配列に残りの値を連結した配列を作り、すべての値を合計し、2 ^ 32との剰余を求め、先頭4文字を取り出してみましょう。
    const answerArr = a3.concat([a1, a2, a4])
    const answer = ((answerArr.reduce((a, x) => a + x))% TWO_POW_32).toString().slice(0, 4)

    蛇足

    筆者の趣味でRubyによる解答例も掲載しておきます。 Integer#gcd とか Array#sum (2.4から)など便利メソッドがあることをコードレビューで教えてもらいました。

    a1 = 2525.gcd(5252)
    puts "Q1 : #{a1}"

    arr = [a1]
    1.upto(1000) { |idx| arr[idx] = (arr[idx - 1] * 2525 + 5252) % 2 ** 32 }
    a2 = arr[1000]
    puts "Q2 : #{a2}"

    a3 = "dwango".each_byte.map { |idx| arr[idx] }
    puts "Q3 : #{a3}"
    a4 = arr.sort[500]
    puts "Q4 : #{a4}"

    answer = (a3.concat([a1, a2, a4]).sum % 2 ** 32).to_s[0..3]
    puts "Answer : #{answer}"

    まとめ

    当日会場では「5分で解けた」から「難しすぎてギブアップ」まで、さまざまな感想をいただきました。みなさまはいかがだったでしょうか。

    ドワンゴではエンジニアを積極的に採用しています。「解けた!」という方で、お仕事をお探しの方は、経験者採用の募集情報もぜひご覧ください!
  • ドワンゴのプロダクト開発インターンシップについて(第1クール)

    2017-09-17 12:08
    ドワンゴ 技術コミュニケーション室の塩谷( @kwappa / @kwappa@friends.nico )です。

    8月9月はインターンシップシーズン。ドワンゴでもエンジニア志望の学生さん向けに「プロダクト開発インターン」と「研究開発インターン」の2プログラムを用意し、インターンシップを開催しています。
    a403e47e1318dcf1729ebbda422c8016e765e582
    今回の記事では、プロダクト開発インターン 第1クールの成果についてお伝えします。

    インターン概要

    プロダクト開発インターン 第1クールは7/31から8/25までの4週間、歌舞伎座タワーで実施しました。

    ドワンゴのエンジニアが実際に勤務するフロアに席を設け、周囲のエンジニアと交流しながら、参加者同士でチームを組んでプロダクトを開発するというプログラムです。

    テーマはドワンゴが運営するMastodonインスタンス「friends.nico」。サービスやユーザーの特徴を観察した上で、ユーザーの不満を解決したりよりよい価値を提供するにはどんな機能が必要か?をアイデアから考え、プレゼンし、実装しました。

    3d1aa4c460aea2cc57708ce0ce07c67a7409e866

    実際にユーザーが使っているサービスへの機能追加ですから、無条件で取り込むわけにはいきません。friends.nicoのプロデューサーに「これならユーザーに喜んでもらえる」と認められたらリリースという、実際のサービス開発に近い厳しい条件での開発に挑戦してもらいました。

    成果物

    第1クールは9名の学生さんが参加し、3名のチームを3つ結成しました。friends.nicoのプロデューサーにアイデア立案から実際の機能設計まで指導を受け、3チームとも最終週にはアイデアと実装のプレゼンまで行うことができました。

    それでは、各チームの成果物についてご紹介しましょう。

    anancus

    このチームは「フレニコアンケート」という名前で、friends.nico上でユーザーが自由にアンケートを作ることができる機能を開発し、8/24にサービスへリリースされました。

    2407c0aa33c930c958ab9be1d2e2548d6d425825
    ユーザーは投稿欄に新設されたボタンを押すと、簡単にアンケートを作ることができます。質問文と最大4つの選択肢を入力すると…

    b562588022df22194e490ffe73d1fdda535656ae

    このように、タイムラインに投票ボタンつきの投稿が現れ、30秒のあいだ回答を受け付けます。締め切りを過ぎるとタイムラインに結果が現れるので、ぜひみなさんも試してみてください。

    この機能のポイントは、同意できないが回答したい人のために必ず :thinking_face: という選択肢が入ること、結果のパーセンテージがざっくりで表示されることなどです。friends.nicoのゆるいコミュニケーションの空気にマッチした、楽しい機能を実装してくれました。

    6d39b63fb58101482f9227476b20f92d366e9346

    mahout

    このチームはfriends.nico上でニコニコ動画のコンテンツを楽しむための機能拡張を企画・実装し、プロデューサーにもメンター陣にも大好評を得ています。アンケートと一緒にリリースしたかったのですが、ニコニコ動画チームとの連携が必要だったため保留となっています。

    コードベースはMastodon担当エンジニアによってインターン終了後も最新バージョンに追随しており、もう少しでリリースできそうです。

    PHP

    このチームはElectronを使ってfriends.nico専用のデスクトップクライアントを開発しました。残念ながらリリースには至らなかったのですが、チームみんなで「ユーザーの不満」について考え、それを解決するために企画も開発も4週間頑張ってくれました。チームからはインターンの実習報告を書いてもらいましたので、ここでご紹介します。


    こんにちは。チームPHPです。

    チーム名は、Mastodonが象の祖先ということで、PHPにしました。

    我々がこのインターンシップでどんなことをしたかを報告させて頂きます。

    不満とその解決

    まず、現在のfriends.nicoに対するユーザーが抱える不満を挙げていきました。その結果、「friends.nicoユーザーはローカルタイムラインを中心に見ているのに、ウェブクライアントはPCの全画面で見ることを想定していて、省スペース派、ネイティブアプリ派のユーザーが不満を抱えているだろう」という意見でまとまりました。 

    その不満を解決するために、「frineds.nico専用の省スペースクライアントアプリ」を作ることにしました。ここでいう省スペースとは、画面の端に置いて鑑賞できるようなものを想定しています。また、Mastodonの全てのインスタンスではなく、frineds.nicoに限定したのは、よりユーザーの体験を具体的に想像できて、プロダクトとしての魅力を高められると思ったからです。

     コンセプトを叶えるための機能として

    • 省スペース
    • 高いカスタマイズ性
    • friends.nicoに特化

    の3点を意識しました。省スペースはミニマリズムとして当然です。しかし、どのような省スペース性や機能が欲しいかというのは個人によって結構異なるので、それぞれの需要に応えられるようにカスタマイズできるようにしたいと考えました。

     成果物

     実際に開発したものが、これです。開発はメンバーの技術とマルチプラットフォームでの動作を考え、Electronを使用しました。フロントの実装にはマストドン本家と同様にReactを採用しました。 

    a31dc032f2426cdf8e779c3d3559a28b6d093788
    左が、僕らの作ったアプリのホーム画面です。ウェブクライアントでは別々になっているローカルタイムライン、ホーム、通知を1つのタイムラインで見れるようにして、画面の端に置いておける省スペースアプリとなりました。また、タイムラインの1カラムも出来るだけ細くしました。しかし、friends.nico特有のニコるをしやすいように、ニコるボタンは大きめに設定しています。

    7aee41e22811f31cc7c88929091ce4381b4e6f1f

    これは、設定画面です。他画面が必要な時はドロワーを横から出しています。friends.nicoではトゥートの更新が非常に速いので、画面遷移ではなく画面拡張をすることによって、タイムラインを常に表示し、話題においてけぼりにならないようにしました。設定からは、何をタイムラインに流したり、通知するかを選べたり、アプリのテーマカラーを変えられたりします。

    28e339de62b01f1997f55e63ca98653cd3a93abc

    これは、ホワイトバージョンです。α版を使ってくれた人からは人気がありました。ちなみに、タイムラインの右上のピンボタンをクリックすることで最前面表示もできます。これもレビュー会で好評だった機能でした。

    成果発表会を通して

    成果発表会を行い、メンターの方からフィードバックを頂きました。僕らは、オープンソースとして公開することを目指しましたが、残念ながらそれは叶いませんでした。

    しかし、省スペース性の追求という、自分たちのコンセプトは間違っていないことは開発を通して感じました。しかし、現段階でユーザーが満足に使えるレベルには達していない、コードが汚くて今後誰かが引き継げるような状態ではない、というのが問題でした。反省点としては、開発の全体の構成や、メンバーの技術力を考慮した予定管理ができず、行き当たりばったりの開発になっていたことです。悔しいですが、これからの開発に活かせれば良いかと思います。

    最後に

    他の社員さんと同じ部屋で開発を行い、多くの社員さんが自由に仕事をしているのを肌で感じる4週間でした。僕らも伸び伸びとプロダクトの考案・開発をしながら、的確なフィードバックを受けられて学ぶことの多いインターンシップとなりました。このような機会を提供していただき、本当にありがとうございました。


    まとめ

    どのチームも感想を聞いたら「4週間があっという間だ」と答えていたのが印象的でした。チームで開発すること、実際にユーザーがいるサービスを開発することは、貴重な経験になったのではないでしょうか。
    a68e1c8e71311daafd49c438a03e0c24d772e852
    現在は第2クールの参加者が、同様にfriends.nicoの新機能開発に取り組んでいます。こちらの結果も追ってお届けする予定です。
  • 【ニコニコ生放送】新配信について7【新配信全面移行について】

    2017-08-22 13:0712

    こんにちは、ニコニコ生放送開発の太田です。

    今回は新配信移行の延期、延長と予約の無料化の件についてお伝えさせていただきます。



    ■新配信全面移行を延期しました

    8月24日に予定しておりました新配信全面移行ですが、移行日を延期させていただきました。ユーザーの皆さんからのご意見ご要望にて、新配信で安定した配信や視聴ができないとの多くのお声をいただいておりました。


    新配信の全面移行前にまだ改善出来る余地があり、皆さんに安心して新配信で生放送を配信・視聴していただける状態にするため、延期させていただくこととなりました。

    新配信全面移行の予定日は、現在まだ未定とさせていただいておりますが、確定次第ニコニコインフォにてご案内させていただきます。


    また、新配信は旧配信から仕様が大きく変更されるため、ユーザーの皆さんにはご不便をおかけしてしまい、大変申し訳なく思っております。ヘルプやインフォでの情報の拡充を図って参ります。

    詳細は ユーザー生放送『新配信』への移行延期のお知らせ にてご確認ください。



    ■新配信の延長と予約が無料化されます

    8月24日より新配信での番組の予約が開始されます。前回ご案内差し上げた通り、新配信での番組は予約・延長が無料になります。

    なお、大変恐縮ですが旧配信につきましては無料化の対象外となります。

    まだ新配信をお試しされたことのない方は、この機会に是非新配信をお試しいただければと思います。

    こちらにつきましても詳細は 【8/18更新】ニコニコ生放送の番組延長、配信予約を無料化します にてご確認ください。



    ■最後に

    現在もユーザーの皆さんから新配信に関するご意見ご要望をたくさん頂戴しております。

    私達生放送開発者も毎日拝見させていただき、チーム内で検討をさせていただいております。本当にありがとうございます。


    今後も皆さんの率直なご意見・ご要望をこちらからお寄せ下さい。

    よろしくおねがいします。