駅から徒歩27分

技術メモとその他なんでも

論文のアブストを毎日slackに流してみた

本記事は 合同会社DMM 23卒内定者 Advent Calendar 2022 の17日目の記事です.

はじめに

こんにちは.DMM.com 23卒 エンジニア職のshikachiiです. twitter.com

最近冷える日が続きますが,この記事をご覧になられている皆様方に置かれましては風邪や流行病に罹らぬよう一層お気をつけください. せっかくなので今回は自己紹介も挟みつつ記事を書ければと思います.

自己紹介

生まれも育ちも長野です. 長野高専を卒業した後に山梨大学に三年次編入し,現在は同大学院でコンピュータビジョンに関する研究をしています.

また,都内のベンチャー起業でエンジニアインターンをしておりフロントエンド(React, Vue, その他諸々...)をガリガリと書いてきました.

趣味は,お酒・バイク・競馬です. 最近はバイスサワーにハマってて居酒屋で見かける度頼んでいる気がします. けっこうレアなので皆さんも見かけたら飲んでみてください!

本題

閑話休題.皆さんは自分の研究分野の最新論文読んでいますか?私は全然読めていません... 自分から論文を探しに行って,翻訳して,読み込んで...というのが億劫で中々できずにいます. そんなとき最新の論文が目の前に流れてくれば怠惰な私でも動向だけでもつかめるのではと思い,slackチャンネルに論文のアブストを流してみました.

はじめの一歩

では論文はどこから探せばよいでしょうか? Google ScholarIEEEなど様々ありますが,今回はarXivを用いたいと思います. また,今回は簡単さ重視のためGAS(Google App Script)を使ってみました.

取得

arXivから論文を取得する方法は こちら にあります. arXiv API 利用規約 に則りレート制限にかからないようにAPIを叩くようにしてください.

では,試しに1件だけ取得してみます.

$ curl http://export.arxiv.org/api/query?search_query=all:%22cs.CV%22&start=0&max_results=1&sortBy=submittedDate&sortOrder=descending
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="http://arxiv.org/api/query?search_query%3Dall%3A%22cs.CV%22%26id_list%3D%26start%3D0%26max_results%3D1" rel="self" type="application/atom+xml"/>
  <title type="html">ArXiv Query: search_query=all:"cs.CV"&amp;id_list=&amp;start=0&amp;max_results=1</title>
  <id>http://arxiv.org/api/ogkPVrpqaNLGAlvJmvDyPJi1Msw</id>
  <updated>2022-12-15T00:00:00-05:00</updated>
  <opensearch:totalResults xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">87248</opensearch:totalResults>
  <opensearch:startIndex xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">0</opensearch:startIndex>
  <opensearch:itemsPerPage xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">1</opensearch:itemsPerPage>
  <entry>
    <id>http://arxiv.org/abs/2212.07422v1</id>
    <updated>2022-12-14T18:59:19Z</updated>
    <published>2022-12-14T18:59:19Z</published>
    <title>ECON: Explicit Clothed humans Obtained from Normals</title>
    <summary>  The combination of artist-curated scans, and deep implicit functions (IF), is
enabling the creation of detailed, clothed, 3D humans from images. However,
existing methods are far from perfect. IF-based methods recover free-form
geometry but produce disembodied limbs or degenerate shapes for unseen poses or
clothes. To increase robustness for these cases, existing work uses an explicit
parametric body model to constrain surface reconstruction, but this limits the
recovery of free-form surfaces such as loose clothing that deviates from the
body. What we want is a method that combines the best properties of implicit
and explicit methods. To this end, we make two key observations: (1) current
networks are better at inferring detailed 2D maps than full-3D surfaces, and
(2) a parametric model can be seen as a "canvas" for stitching together
detailed surface patches. ECON infers high-fidelity 3D humans even in loose
clothes and challenging poses, while having realistic faces and fingers. This
goes beyond previous methods. Quantitative, evaluation of the CAPE and
Renderpeople datasets shows that ECON is more accurate than the state of the
art. Perceptual studies also show that ECON's perceived realism is better by a
large margin. Code and models are available for research purposes at
https://xiuyuliang.cn/econ
</summary>
    <author>
      <name>Yuliang Xiu</name>
    </author>
    <author>
      <name>Jinlong Yang</name>
    </author>
    <author>
      <name>Xu Cao</name>
    </author>
    <author>
      <name>Dimitrios Tzionas</name>
    </author>
    <author>
      <name>Michael J. Black</name>
    </author>
    <arxiv:comment xmlns:arxiv="http://arxiv.org/schemas/atom">Homepage: https://xiuyuliang.cn/econ Code:
  https://github.com/YuliangXiu/ECON</arxiv:comment>
    <link href="http://arxiv.org/abs/2212.07422v1" rel="alternate" type="text/html"/>
    <link title="pdf" href="http://arxiv.org/pdf/2212.07422v1" rel="related" type="application/pdf"/>
    <arxiv:primary_category xmlns:arxiv="http://arxiv.org/schemas/atom" term="cs.CV" scheme="http://arxiv.org/schemas/atom"/>
    <category term="cs.CV" scheme="http://arxiv.org/schemas/atom"/>
    <category term="cs.AI" scheme="http://arxiv.org/schemas/atom"/>
    <category term="cs.GR" scheme="http://arxiv.org/schemas/atom"/>
  </entry>
</feed>

無事論文データ(タイトル,著者,アブスト,etc…)を取得できました! XMLなのが気がかりですが,パーサはたくさんあるため心配御無用です.

解析

GASでXMLを処理する場合は,XmlServiceが便利です. 早速パースしてきましょう.

// データ取得
const url = 'http://export.arxiv.org/api/query?...'
const xml = UrlFetchApp.fetch(url).getContentText();

// XML解析
const xmlDocs = XmlService.parse(xml);
const namespace = XmlService.getNamespace('', 'http://www.w3.org/2005/Atom');
const doc = xmlDocs.getRootElement().getChildren('entry', namespace);

無事パースできたので,各エントリについても処理していきます.

// スムーズな翻訳のため改行を取り除く
const plain = (str) => {
  return str.replace(/\r?\n/g, '');
}

// 各エントリ毎に処理
doc.forEach((d) => {
    const enTitle = plain(d.getChild('title', namespace).getText());

    const enSummary = plain(d.getChild('summary', namespace).getText());
    const jaSummary = LanguageApp.translate(enSummary, 'en', 'ja');

    const url = d.getChild('id', namespace).getText();

    const entry = {
      title: enTitle,
      summary: jaSummary.replace(/。/g, '。\n'),
      url,
    };

    postslack(entry);
});

ここで,英語のアブストをGASのLanguageApp.translateメソッドにより翻訳しています. developers.google.com

投稿

投稿場所は個人の管理するslackチャンネルにしました.通知もすぐ来るので便利です. よしなにslackのWebhookURLを取得できたら,UrlFetchApp.fetchメソッドでPOSTすることにより,指定したチャンネルに論文タイトル(URL)と翻訳されたアブストが投稿されます.

投稿された論文のアブスト

// Webhook URL
const url = 'https://hooks.slack.com/services/{YOUR_SECRET}';

const content = {
  'username': '{YOUR_NAME}',
  'text': `<${entry.url}|${entry.title}>\n${entry.summary}`,
};

const options = {
  'method': 'post',
  'content': 'applications/json',
  'payload': JSON.stringify(content),
};

UrlFetchApp.fetch(url, options);

まとめ

今回はarXivから最新の論文データを取得し,slackに投稿してみました. 最新3件かつ日本語ということでサッと見ることができ,ある程度動向を掴めたような気がします(気だけでも…). 今回は単純に投稿の新しい順に取得しましたが,引用数なども見て新しいかつ人気な論文を流すことができれば更に面白い論文を見つけられる気がしています.

コード全容

今回のコードはこちらのgist から確認できます.

おまけ

今週末12/18に行われるG1レース(朝日杯FS)の予想を載せてみます. 当たったらうれしいです.

◎ 3(オールパルフェ)
◯ 2(ドルチェモア)
▲ 7(オオバンブルマイ)
△ 12(ダノンタッチダウン),14(レイベリング)

DMM GUILDに参加してきました(2020)

こんにちは、@shikachiiです! 先日合同会社DMM.comにてDMM GUILDに参加してきましたので書き残していきます。 昨今の情勢もあり完全リモートで開催されました。出社したかった…

f:id:shikachii:20200918183027p:plain
DMM.comオフィス写真(行きたかった…)

DMM GUILDって何?

昨年から始まったIssueハント型のインターンです!

hr.dmm-corp.com

参加するまで

書類を書いて面接をして…合格!

貸与PCはMacとWin機を選べました。 Win機は環境構築ダルそうだったのでMacにしました(US配列)。 見た感じほとんどの人がMacだったと思います。

参加

1日目

ガイダンス、オリエンテーションがあり終了。issueをチラ見して終わりました。 timesという文化があるのを初めて知って驚きました。

2〜6日目

issueハントが始まりそれぞれで作業をし始めました。最初の方はまだあまり慣れていなかったということもありワタワタしてましたが、週が終わる頃にはみんなだいぶ慣れてたと思います。 自分のやったissueは具体的な名前は出しませんがdevops系のものを多く取りました。

7日目

チームビルディングということでスクラム開発の研修を受けました。 用語としてはよく聞くのですが実際にチームを組んで実習をするのは初めてだったのでとても有意義な経験ができたと思います。

8〜10日目

issueの続きをしました。 9日目で突然インターネットの調子が悪くなりdiscordの音声がブツブツ途切れたりしたのが辛かったです(リモート勤務のデメリット)

表彰

複数事業部Issue賞とお助けThanks!賞をいただきました!

おわりに

様々な事業部のissueやあまり触ってこなかった技術に触れることができて楽しかったです!

DMM GUILD 参加記 2021

こんにちは @shikachii です。 8/30〜9/10にオンラインで開催されたDMM GUILDに参加しましたので記録を書き残したいと思います。

f:id:shikachii:20210910191700p:plain
DMM社内の様子(会社行きたかった…)

DMM GUILDって何?

DMMの50を超えるサービスから技術的な課題を提示します。 挑戦してみたい課題を選択し解決に導いてください。

課題をクリアするとポイントが付与されます。 あなたの技術貢献がDMMのサービスの一部になるかも? 上位ランカーには豪華賞金もご用意しております!

dmm-corp.com

Issueハント型のインターンです。 インターン生用に用意された課題ではなく現場で実際に出されている課題に取り組めます。 あなたの技術貢献が本当にDMMのサービスの一部になります。 また、issueをたくさん解決してポイントをたくさんゲットすると賞金が出ます!

採用の流れ

  1. エントリー
  2. スキルチェックシートを提出
  3. 人事&エンジニアと面談(1回)
  4. 参加決定!

インターンの流れ

基本的に平日10時に出社して19時に退勤します。 具体的な流れとしては以下の表のようになっています。 10時出社なので前日に多少夜更かししてもなんとかなります😉

(社員の方は11時〜17時コアタイムのフレックスらしいです)

時間 やること
10時 出社
10時〜10時半 昨日の振り返り
10時半〜13時 issue取り組み
13時〜14時 お昼休憩
14時〜18時40分 issue取り組み
18時40分〜19時 今日の振り返り
19時 退社

ちなみに残業はありませんでした。 夜にissue進めてポイント稼いじゃおwみたいなのは不平等なので。

issueに取り組む前に…

2年連続で参加させていただいたのですが、同じことをしてもあまり意味がないだろうと思ったので以下のようなことを心がけてみました。

  • 社内リファレンスを読んでみる
  • あまりたくさんの事業部に散り過ぎない
  • できるissueよりサービスを知ることができるissueに取り組む

やったこと

1日目

ガイダンスやインターン生同士の交流を経てissue確認をして終了。 今年も強い人多いな〜って布団の中で震えてました🥺

2日目〜5日目

2日目にはissueハントがスタート。 あまり詳しくは言いませんが1週目はReactのコード軽く修正したりCircleCIでゴニョゴニョするissueを触りました。 環境構築に時間かかったり、触ったことない技術が連続してけっこう手こずりました😂 また、5日目にはオンラインコラボレーションの体験としてmiroを使ってインターン生同士でさらに交流を深めることができました。

6日目〜10日目

2週目はReactで新規画面つくったりAWSのCDKでIaCしたりPHPからRedisにエイヤっとしたり様々な技術のissueに関わることができました。 普段Vue.jsばかりシバき倒していたのでReactを触ったりバックエンドのコードを触って脳が活性化した気がします✨ 🧠 ✨ また、9日目と10日目には実際のチームビルディングの様子を見学させていただき、issue取り組みだけでは知ることができない内部の開発状況を知ることができました!

おわりに

あっという間の2週間でした! 作業が詰まったときに助けてくださった社員の方やインターン生に感謝!ありがとうございました! オフライン出社できなかったのが悔やまれますが、また落ち着いたら伺いたいです😊

vimからmarkdownのプレビューをしたかった話

こんにちは、@shikachiiです。 vimからmarkdownのプレビューをしたかったけど失敗したという話です。

この記事を見ても何も解決しないと思うのでvimからmarkdownをプレビューしたいって人はブラウザバックしてください。何も残りません。

6/8 追記

vimのバージョンを8.2に上げてもう一度最初の3つのプラグインをインストールしたところプレビューできました。すみませんでした。

shikachii.netのREADME.mdを書きなおしていたときに、手元でプレビューできる環境が欲しくなったのでいい感じのプラグインが無いかと思っていろいろやりました。

まあvimプラグインが充実してますし誰かが何か出しているでしょうということで「vim markdown プレビュー」で検索。

トップに出てきたサイトに従い、tpope/vim-markdownkannokanno/previmtyru/open-browser.vimをインストールしましたが、ダメ。 previmのエラーということでissueなどを探しましたがすぐに有力な情報は得られずそこまで深堀して解決するものでもないと思い即アンインストール。

他にも何か便利プラグインが無いか探していると、見つけました。 github.com (なんかアーカイブされてて不穏ですね。) うおお!これだけでできるのかと喜びREADME.mdを参考にインストール…がしかし、またダメ。 エラーが出れば良いのですがコマンド(:PreviewMarkdown)を叩いてもエラーが出なくなってしまい、もう……

ですがREADME.mdをよく読んでみると冒頭に

Note: PLEASE USE markdown-preview.nvim INSTEAD

と書かれています。なんだこっちは開発が終わってるからアーカイブされてたのかと思いmarkdown-preview.vimをアンインストールしmarkdown-preview.nvimをインストール。 が、しかし、また、ダメ。

次はなんだとエラーからissueを探るとvimのバージョンが足りていないとのこと。 よくREADME.mdを読んだら

It only works on vim >= 8.1 and neovim

と書いてありました。私のvimのバージョンは7.4なのでそりゃ動かないだろうと。 まずREADME全体をよく読まなきゃなって思いました。当たり前ですが。

なんやかんやでvimのバージョンも8.2になり、意気揚々とコマンドを叩きました。 しかし、

該当するautocommandは存在しません

とだけ。もうダメだなって思いました。

別にホットリロードしたりエディタのカーソル位置とプレビュー位置が同期するようなものが欲しかったわけではなかったのでローカルのmarkdownを表示してくれるChrome拡張を適当に追加して終わりました。

まとめ

ググって適当なサイトのコピペして動かない〜><ってそんな方法で今までやってきたんですか? もうちょっとリファレンス読むなりissue探してみるなり上手なやり方があったと思います。

参考

vimでマークダウンのプレビューが見たい - Qiita

コンソールでJUnitによるテストを行う(さよならEclipse)

何?

Eclipseでの開発がつらいのでコンソール上だけでなんとかしたくなった。
でもテストはできるようにしたい。う〜ん。

やる

JUnit4リポジトリのDownload and Installからjunit.jarとhamcrest-core.jarをダウンロード。

github.com

$CLASSPATHの場所に適当に置いておく。無かったら作る。(自分は無かったので作りました)

実行

コンパイルは通常どおりjavacで行うことができる。

実行についてはjava org.junit.runner.JUnitCore クラス名とすることで可能。

結果

TmpTest.java

import static org.junit.Assert.*;
import org.junit.Test;
public class TmpTest {
  @Test
  public void tmp() {
    int a = 1;
    assertEquals(a, 1);
  }
}

出力

JUnit version 4.13-beta-3
.
Time: 0.007

OK (1 test)

参考

コマンドラインから JUnit を使う方法 | Futurismo

junit-4.11.jar が単独で使えない - 日々常々

nuxt-i18nで言語の切り替えをしたときに翻訳されない問題について

nuxt-i18nを使ってi18nしていたサイトでsetLocaleしたにも関わらず言葉が切り替わらない部分があったのでメモ

やったこと

翻訳する部分をdata関数内で定義したものを渡すとsetLocaleしたときに切り替わらないので算出プロパティ内で定義することで解決。

  • 失敗例
<template>
  <div id="hoge">
    {{ item }}
  </div>
</template>

<script>
// setLocale時にitemの内容が翻訳されない(ページ遷移を行うと翻訳される)
export default {
  data() {
    return {
      item: this.$t('翻訳')
    }
  }
}
</script>
  • 成功例
<template>
  <div id="hoge">
    {{ item }}
  </div>
</template>

<script>
// setLocale時にitemの内容が同時に翻訳される
export default {
  computed: {
    item() {
      return this.$t('翻訳')
    }
  }
}
</script>

なぜ?

算出プロパティcomputedはリアクティブな要素に変更があった際に更新される(?)らしく、setLocaleによりthis.$root.$i18n.localeが変更されるためそこでthis.$t('翻訳')が呼び出されて翻訳が行なわれると考えられます。 また、data関数内で定義した際はVueインスタンスが生成された段階でこれ以上再計算は行なわれないため、再描画(別のページから遷移)しなければ翻訳がされないと考えられます。

まとめ

今回の例程度であればtemplate内で{{ $t('翻訳') }}とするのが良さそうですが、子コンポーネントにプロパティとして渡す場合などにdata関数内で定義してしまい詰まったのでcomputedの中に書くといいというやつでした。

参考にしたサイト

jp.vuejs.org

jp.vuejs.org

Linux版Slackでリンクを開こうとするとchrome://newtabになる問題

新しいワークスペースにログインできなかったり、 チャンネルに貼ってあるURLをいちいちコピーしてブラウザに貼り付けなければならないのでつらい

環境

バージョン
Ubuntu 16.04 LTS
Google Chrome 75.0.3770.90
Slack 3.4.2 64bit

解決できなかった方法

  • Chromeのバージョンアップをすれば良い
    →既に最新版

  • /usr/share/applications/google-chrome.desktopExex=/usr/share/applications/google-chrome.desktopExec=/usr/share/applications/google-chrome.desktop %uに変更する
    →既に%uがついている状態

解決できた方法

~/.local/share/apllications/google-chrome.desktop内のExec=/opt/google/chrome/chromeExec=/opt/google/chrome/chrome %Uに変更

追加

~/.local/share/applications/UbuntuやUnity、/usr/share/applications/KDEやMATEとかのデスクトップエントリーを管理するファイル群らしい
今回追加した%U、これは.desktopファイルにおけるURLのArgumentらしく%uで1つ、%Uで複数のURLを引数として持って起動するとあった

参考にしたサイト

google chrome - Slack fails to open links in Ubuntu 14.04 - Ask Ubuntu
What does “%U” mean when calling a command? - Ask Ubuntu