giantneco’s blog

技術メモ

Tenka1 Programmer Beginner Contest 2019

1200 点中 400 点獲得。C と D の問題が解けず。

C は簡単かと思い込んでいたが、なかなか通らず。 D を諦めて C を考え直してみるも、自分の間違いに気付いたのは時間切れ近くだった。

うまく処理できてなかったのは次のパターン。

14
...#..###.####

こうするパターンか、

...###########

こうするパターンか、

..........####

いずれかだと思っていたが、考えてみるうちに

......########

となるパターンもあるのに気付いたが、実装は間に合わなかった。

コードがパスしなかったときに、コードが正しくないかばかりを気にしがちだが、 そもそも考え違いに気づかないとつらい。ココらへんのことは覚えておきたい。

D は少し見てみたが、解法の見当もさっぱりつかない。解説待ち。

Google Code Jam 2019 Round 1-A

Pylons の Small Set しか解けず。Large Set の方は制限時間内に実行ができず失敗になってた。

最初はAlien Rhyme から手をつけたが、いい解法が思いつかずに Pylons に切り替えた。

後 Golf Gopherインタラクティブに答えを出す必要があるらしいが、この形式の問題は初めてみた。 手を出す気になれずにパス。

残りのチャンスは B と C の二回あるが流石に実力不足かな。もうちょっと練習しないと。

AtCoder Beginner Contest 124

1000 点中 600 点獲得。400 点の問題が解けず。

良かった点

  • A - C まではスムーズに解けた

反省点:

  • D の問題の読み違え
    • D は結構難しい問題が来るのか?と思ってたので身構えすぎかも

コンテストの終了直後に解けるコードは書いたが、実行結果は時間超過になった。 読み間違えていたのが痛かったのもあるが、難しく考えすぎ。 他の参加者のコードをあとで読んでみると、自分が考えていたよりも遥かに楽に解けるのがわかった。

残念。

外国人との英語での働き方講座

connpass.com

4/5 に行われた外国人との英語での働き方講座を聞いてきた。

内容としては英語よりも、実際に外国人と働く際の心構えの話が多かった。 異文化の人と働くには考えておくこと、知っておきたいことは色々多そう。 また普段から実践できそうなことも多いので、役に立つ話は聞けたと思う。

電子書籍を待っていたが、今回の話は良かったのでさっさと物理本を買ってしまった。後でちゃんと読む。

以下講座の詳細。

グローバル環境で働くための心構え by ロバートアレックス哲也

ロバートさんはコンサル、トレーニングコーチをやっている方で、 普段エンジニアへ助言をしている立場からの発表だっった。行っているアドバイスに近いものにしている。

コミュニケーションに必要なものは次の 3 つの要素がある:

このうち、日本人の英語力はそれほど悪くないらしい。 が上記のように英語力はコミュニケーションの全てではない。

なので、英語に集中しすぎてないかどうかは気をつけるとよい。 本当の目的を見失わないようにしよう。

このうちさらにマインドセットは 5 要素あって:

  • 知的好奇心
  • 社交性: スモールトークできるか、など
  • 自信と印象
  • 異文化理解
  • リーダーシップ: 率先して会話に参加できているか、など

このうちで異文化理解では「日本人はどのように見られているか?」というのを意識するとよい。

紹介された"When Cultures Collide"では、日本人のやりがちなことが挙げられているので参考にするとよい。 「どうみられているか」を理解するのもスターティングポイントとなる。

書籍中の例では例えば次のようなものがある:

  • they are shorton words
  • they deafen you with silence
  • they never look you right in the eye
  • they lack individualism

以上のことに気をつけて英語でのコミュニケーションを学ぶわけだが、 大事なのは勉強よりも練習!知識よりも自信!だとのこと。

また、青山にある英語コミュニケーションスクール SparkDojo の紹介もあった。

www.sparkdojo.jp

英語で伝える力を自分の武器として身につけるプログラムをやっているとのこと。

失敗談と役立つフレーズ

ちょまどさん(@chomado)による失敗談の話とロッシェルさん(@JICRochelle)による解説。

失敗談はちょまどさんの実体験による部分が大きく、いかにも日本人がやってしまいそうな感じになっている。

紹介された失敗談は以下のようなもの。

日本人だけでかたまる

英語ネイティブとの打ち合わせ中に、 わからない英単語が出るなどして日本人同士で議論を始めてしまった。

一度日本語で議論を始めてしまうと、会議がだんだん日本語メインになっていくのはありがちである。 しかしこの状況では英語しか話さない人は疎外されていってしまい、不信感が生まれてしまう

対策としては:

  • 完全に日本語は禁止したほうがいい
  • どうしても日本語を使う必要がある場合は
    • 許可を取って礼儀正しくする
    • 3 分程度に納める
    • 日本語ででた結論をまとめて話す

英語が苦手、は恥ずかしいことではないのでわからない単語があってもちゃんとその場で質問するようにしたい。

会議で発言しない

日本人同士の会話だと全員が空気を読んで会話を止めてから誰かが話し始める。 これに対して海外の会議では全員が間をおかずに話し続けるので発言するきっかけをつかむの難しい。

しかしアメリカなどで行われるような会議では各参加者は意見を言うことが期待されている。 なので意見を言わなかったら何しに来たと言う感じになってしまう。 実際にマイクロソフトでは、会議で何も言わない人は次回から呼ばれなくなるらしい(非難しているのでなく、効率のためだとのこと)。

対策としては:

  • 会議の場では積極的になる必要があると
  • 発言するチャンスを掴むには、とりあえず一言を加えて注目を集める
    • 「発言してもいいですか?」
    • 「コメントしたいです?」

英語での例は書籍の方で他にもたくさん紹介している。読もう.

起承転結で話す

起承転結の順番では伝わらない。 結論を最後に持ってくるつもりで、伝えたいことの流れの最初から話を始めるのは

これは結論から話すことが重要で、 英語に限らず日本人の会話でも必要な場合がある。 なんらかの報告をする際には特に当てはまると思う。 自分が新人だった頃によく言われてた。流石に今は改善した(はず)。

Q&A

質疑応答ででたもの。

  • やりやすい質問にはどのようなものがあるか?
    • 日本に来てびっくりしたことはどんなことがあったか?
  • どうやって壁を超えたか?
    • (ちょまど) とにかく実践
  • おすすめの勉強法は?
    • (ちょまど) ゲームも英語設定にして英語を矯正する
    • (ロッシェル) わからなかった単語はメモして単語帳をつくる
    • (アレックス) どういう風に習慣化するかが大事。日常のライフスタイルに英語を組み入れらるかを考えるといい

感想

講座のタイトルとしては外国人との英語での働きかただったが、 英語のテクニック的な話よりもマインドセットの話が主だった。

なので、外国人と働いていなくても一部は普段から実践できるし、したほうがいいものが結構あるんじゃないかと思う。 「結論を先に言う」というのは言われたことがある人も多いんじゃないかと。

後は将来的には日本人は中国人とorの下で働くことになる可能性が多々あるので、その時はまた違ったマインドセットが必要になるのかなと思ったり。

AtCoder Beginner Contest 123

4 問中 3 問解いて、1000 点中 600 点獲得した。

400 点の問題はコードを書ききるところまでは行ったが、一部の答えが合わずに残念ながら失点した。 開始前はとりあえず 3 問はとこうと思っていたので、まあ良しとしたい。 次回は全問解くのを目指そう

良かった点

  • 前回よりは C++ の機能を使えてた
    • 他の参加者のコードを参考にしたのが良かった
  • とりあえずソートしてみたのは良かった
    • 遅いかと思ったが、それでもテストケースは通った。
    • ここらへんの感覚は掴んでおきたい

反省点:

  • 簡単な部分でつまずきがある
    • 境界条件とかはよく読もう
    • 境界条件のテストケースは用意されていないので、書くようにしたい
  • まだ C++ のソートを使いこなせてない
    • なぜかセグメンテーションフォルトが起きたが、対処できずにタイムアップした

解答方法はわかっているが、まだコードに落とすのがぎこちない感じ。 とりあえず一通りのコードはかけたのでそこら辺は評価したい。

また他の参加者のコードを読んでおこう。

Google Code Jam 2019 Quorification Round

とりあえず参加。

久々の参加だったので、ちょっとインターフェースが変わってたのに驚いた。

AtCoder が同日にやるので、簡単な問題を終わらせてすぐ切り上げた。

JJUGナイトセミナー GraalVM とその要素技術

2/27 に行われた 【東京】 JJUGナイトセミナー「JVM言語を作ろう! GraalVMで遊ぼう!」 - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper に参加してきた。

以下メモ。

JVM 言語の動き方・動かし方 by @miyakawa_taku

speakerdeck.com

言語処理系の基礎知識の話。 JVM 言語の話としてまとまっているので良い資料になっている。

インタプリタの種類としては次が紹介されていた。

Meta-cricular インタプリタは名前を知らなかったが、AST などの木構造再帰的に手繰って計算する方式らしい。 ホスト言語の制御構造を利用できると同時にその制約も受けてしまうとのこと。

Kink の紹介

引き続き自前の JVM 言語処理系の話。

Kink 言語の特徴としては:

  • 継承なしのオブジェクトシステム
    • trait 付きのプロトタイプベースのような感じ?
  • 限定継続(限定=範囲付きの継続)
  • Qcode というバイトコードを用意して JVM の上のインタプリタで実行
  • GCJVM のものを利用

性能は現状ではいまいちだが、次のような性能改善が考えられるとrのこと:

GraalVM で使われている、他言語をJVMに実装する仕組みを学ぼう by @jyukutyo

www.slideshare.net

GraalVM は Hostspot VM を基にしたもので、次のものから構成されている:

GraalVM でできることはたくさんあって、 すでに JavaScript,Ruby,R,LLVM,sulong は GraalVM で動かせるようになっている。 かつ R はかなり早くなっているらしい。

Truffle で言語実装入門 @kis

後半は Truffle の話。 Truffle は動的なプログラミング言語を作るライブラリで、AST のインタプリタ。 一度 AST ができれば、後は Graal と JVM に任せられ、ランタイムを構築する必要はない。

Truffleのメリット:

  • 言語が高速に実行できる
  • Truffle には Interoperability 相互呼び出しができる

Truffle での言語実装は次のように行う。

    1. AST 用ノードクラスを用意
    2. com.oracle.truffle.api.nodes.Node を継承
    3. アノテーションで Truffle DSL API をクラスに設定する
    1. Truffle の言語実装に必須のクラスを実装
    2. parseSource() で字句解析、構文解析を実装するなど
    1. 入出力の準備
    2. 要するに Truffle を呼び出す部分も作る

現状 Truffle を学ぶには、現状コードを読むしかない。 なかでは SimpleLanguage がおすすめ、というかそのための言語になっている。

Truffle + PHPぽい言語 by @kis

speakerdeck.com

Truffle で php っぽい言語を作った話。

パーサは jparsec(https://github.com/jparsec/jparsec) を利用して、php の一部だけを実装している。

Truffle のコンセプトは「動的な値だけ受け取るインタプリタ」で静的な部分は前もって取り込んでおく。 Truffle がやることは Specialization

  • 最適な評価方法を選んでくれる
  • メソッド呼び出しの最適化

Truffle で書いた言語は書いたとおりには動かず、かなり最適化されるとのこと。 例外、オブジェクト生成も最適化され、jmp になったり、そもそも生成されなかったりする。

おすすめの Truffle 学習方法:

感想etc

この話を聞いてから自分でも SimpleLanguage のコードを見てみたがなかなか分かりづらい。 いわれてたようにコピペから始めたほうが良さそう。

話を聞く前はもうちょっと簡単にできるんだろうかと思ったが、コンパイラフロントエンド相当の部分はがっつり書く必要がありそうだ。 それとそもそも Java がつらい部分はある。

あと Java だとパーサーは Antlr 使うことになりそうなので、やるんだったら Antlr も抑えておいたほうが良さそうだなあ。