あーさーの備忘録

ゆっくり自由に生きてます

グローバルシステム開発研修レポート

2020年3月1日(土)〜8日(土)の8日間、東京工業大学情報理工学院IT特別教育プログラムの「グローバルシステム開発研修」でフィリピンに渡航しました。この記事は本研修プログラムのご報告になります。参加した動機は、4月にフランスの国際学会に行く予定があり(COVID-19により中止)、海外渡航に慣れておきたかったからです。

COVID-19

まずは結論からなのですが、当初2週間を予定していた本研修プログラムは途中で打ち切られ、帰国することになりました。理由はもちろん、今世間を騒がせているCOVID-19です。

実際、帰国後にフィリピンでも急激に感染者数が増え、3月15日からは首都圏封鎖などの厳戒体制が敷かれることとなりました。当初の予定通りだと、慌てて出国しようとする人の混乱に巻き込まれるところでした。

headlines.yahoo.co.jp

今回は1週目の英会話研修だけ行い、2週目に予定していた現地日系企業エンジニアとのリーンスタートアップ研修は、パンデミックの状況が落ち着くまで延期となりました。例年の本プログラムの様子は下記Webサイトからご確認いただけます。

www.titech.ac.jp

入国

日本は冬の終わりですが、フィリピンは年中夏のような気温です。すぐに夏服に着替えられるよう準備をして飛行機に乗り込みました。

f:id:arthur_teleneco:20200301192251j:plain

こちらはフィリピン航空の機内食。ポークを選びましたが、チキンを選ぶと日本食仕様だったみたいです。

f:id:arthur_teleneco:20200301155847j:plain

到着後は入国審査。かなり列が長く、時間が掛かりました。僕は聴力が悪く、さらに気圧の変化に弱いため、入国審査官の「少し下がって」という言葉が全く聞こえませんでした。

食事

Jollibee

フィリピンはファストフードNo.1がマクドナルドではない珍しい国です。ではどこが1位なのかというと、Jollibeeです。可愛いハチのマスコットが印象的ですね。可愛い顔してダンスが上手いみたいです。

f:id:arthur_teleneco:20200308105930j:plain

www.youtube.com

Jollibeeではフライドチキンを食べました。無難といえば無難なチョイス。なんと温かいライスがついてきます。このメニューで日本円350円弱。でも現地の人の収入考えると贅沢な食事かもしれません。

f:id:arthur_teleneco:20200301213727j:plain

Kina Lola

昼食は毎日Kina Lolaというレストランで食べました。結構美味しかったです。Googleの評価で星4.3なだけあると思います。

ただ屋外だったので虫が気になりました。虫除けスプレー必須。

f:id:arthur_teleneco:20200306124523j:plain

街並み

今回滞在したのは、マニラ首都圏最南端のムンティンルパ市アラバンというところです。新興商業地区で大きなショッピングセンターがいくつもあり、アヤラ・アラバン・ビレッジという高級住宅街もある、比較的治安の良いエリアです。

驚いたことは、走っている車のほとんどが日本車だったことです。左ハンドル車なのですが。

f:id:arthur_teleneco:20200302121008j:plain

f:id:arthur_teleneco:20200302194413j:plain

日本でもおなじみのETCもちゃんとあります。

f:id:arthur_teleneco:20200308101239j:plain

ショッピングセンター

Alabang Town Center

アヤラモールが運営する、映画館つきのショッピングセンター。フィリピンにいるとアヤラというワードをちょくちょく聞きますが、これはフィリピン経済を牽引する財閥の名前です。

f:id:arthur_teleneco:20200302121309j:plain

f:id:arthur_teleneco:20200302122828j:plain

スーパーには日本の商品も売っています。

f:id:arthur_teleneco:20200307191251j:plain

Festival Mall

アラバン最大のショッピングモール。

f:id:arthur_teleneco:20200303184037j:plain

f:id:arthur_teleneco:20200303191118j:plain

中にはトロッコが走っています。遊園地みたい。

f:id:arthur_teleneco:20200303190507j:plain

Zumba

フィリピンで大人気のダンスエクササイズ、Zumbaに参加してきました。

有名な洋楽ポップスやEDMに合わせて身体を動かすのはとても楽しかったです。ただし、ブレークタイムは短く、実質1時間半踊りっぱなし。序盤からキレッキレでやろうとするとすぐにバテてしまいます。

f:id:arthur_teleneco:20200304190203j:plain

英会話学校

アラバンの英会話学校に1週間通いました。毎日1時間のグループレッスンと7時間のマンツーマン授業。さらにその後に宿題も。なかなか堪えましたが、お陰様で英語のスキルはかなり成長したように感じます。英語のListeningに苦手意識がありましたが、最終日のTOEIC模擬テストではListeningで380/495点取ることができました。

マンツーマンの授業では、ニュース記事などの教材を読み、それについてディスカッションをしました。日本語だとしても答えるのが難しい内容もあったので、英語だとなおさら難しかったです。

また、イディオムや定型表現の意味を英語で学び、それを使った文章を自分で作る練習をしました。細かいニュアンスの違いや、発展的な使用法など、僕が理解するまでレクチャーしていただきました。

先生方は非常に優しく、ジョーク交じりに明るく英語を教えてくれました。資金繰りに余裕ができたら、自費でまた行きたいと思える学校でした。

出国

フィリピン政府が厳しい対策を発表する前だったので、混乱もなく比較的スムーズに出国できました。しかし、空港に入る時の手荷物検査でライターを没収されてしまいました。

ニノイ・アキノ国際空港のターミナル2は、フィリピン航空専用となっています。こちらの免税店はあまり大きくなく、土産物も非常に高価でした。あと値段が米ドル表記だったのでフィリピンペソでいくらか分かりにくかったです。お土産はスーパーなどで買ったほうが安くて良いです。

カルチャーショック

Facebook大人気

フィリピン人のネットユーザーはほぼFacebookを使っています。それ故に、フィリピンのモバイル事業者はFacebookをカウントフリーで提供しています。写真が見れないなどの制限がありますが、基本機能はデータ残量消費なしに使うことができました。もっとも、日本でFacebookが不人気なだけ、という感じもしますが。

食器の返却口がない

Jollibeeでも、ショッピングセンターのフードコートでも、食器を返却口に戻す必要はありません。警備員さんや従業員の方が片付けてくれるので、そのまま席を立ってOKです。店を出るとき、毎回申し訳なく思っていました。変な話ですが、人件費が安いからこそできることなのかもしれません。

月と季節の対応を聞かれる

英会話学校で日本のことについて話しているときに、「8月ってどの季節?」などと聞かれることがよくありました。8月は夏に決まってる、と思ってしまいがちですが、フィリピンにははっきりとした四季はありません。熱帯性気候なので、乾期と雨季があるだけです。

まとめ

本研修の最大の目的は「海外に行って無事に帰ってくること」と引率の先生に言われていました。今回はイレギュラーな状況になってしまいましたが、ハプニングも楽しみつつ、良い経験ができたと思います。早くCOVID-19が収束して、安心して渡航できるようになるのを祈っています。

個人的 Best Hit 2019

予定を変えて年末っぽい記事を書きます。とはいっても、今年聞いた好きな曲を列挙していくだけです。

余談

僕はYouTube Premiumをサービス開始時から利用しているのですが、最近学割の存在を知りました。普通に加入するより42%も安いみたいです。

SheerIDという認証サービスを利用して学生であることの証明をするのですが、弊学()の学認システムは対応していないようでした。途中でエラーになってしまいます。仕方ないので学生証の写真を送りました。

最近のYouTubeは広告2回流れるらしいですね。さすがに課金しないとやってられません。

本題

今年たくさん聞いた曲を列挙していくだけです。音楽評論家ではないのでまともなコメントはしません。

ダンスが僕の恋人 / 東京ゲゲゲイ

カワサキハロウィンのパレードで聞いてハマった。ズットスキナヒト、Sense of immoralityあたりも好き。


東京ゲゲゲイ「ダンスが僕の恋人」| Tokyo Gegegay Music Video

黒い羊 / 欅坂46

小池美波が最高。あと最後のてち。角を曲がるがアルバムに入るのを期待して待っていたら、2日前にネット配信された。


欅坂46 『黒い羊』

白日 / King Gnu

最近のドラマの曲どれも良い感じ。


King Gnu - 白日

就寝御礼 / PSYQUI

中盤の転調が良い。ヒステリックナイトガールも良曲。


就寝御礼

Official髭男dism - Pretender[Official Video]

歌詞がブッ刺さる。


Official髭男dism - Pretender[Official Video]

まちがいさがし / 菅田将暉

某高校のフォークソング部に訪問した時にこの曲を演奏してた。


菅田将暉 『まちがいさがし』

チルドレン / BIN

Just the two of us進行エロすぎる。


BIN - チルドレン(MV)

公然の秘密 / 椎名林檎

PV出た瞬間これは踊れるようになろうと思って練習してたら、即教則ビデオ出て感動しました。


椎名林檎 - 公然の秘密

桃源郷とタクシー / Mega Shinnosuke

18歳の曲のPVではない。


Mega Shinnosuke - 桃源郷とタクシー (Official Music Video)

ノーチラス / ヨルシカ

いくつかの曲で1つのストーリーになっているっぽい。


ヨルシカ - ノーチラス (OFFICIAL VIDEO)

FLY AGAIN 2019 / MAN WITH A MISSION

四つ打ち嫌いとか普段言ってますが本当はめちゃくちゃ好きです。


MAN WITH A MISSION 『FLY AGAIN 2019』

幽霊東京 / Ayase

不勉強を恥じてボカロもそこそこちゃんと聞くようになりました。


幽霊東京 / Ayase (self cover)

まとめ

全体的に落ち着いた曲が多くて趣味が変わってしまったなぁと思っています。自分の趣味全開ですがよかったら聞いてみてください。

LINE DEVELOPER DAY 2019で、"Learning Session"を体験してきた

こんにちは、23歳になったArthurです。この歳に両親は5歳の僕を幼稚園に行かせていたと思うと衝撃的だなぁと改めて思います。

LINE DEVELOPER DAY 2019

自分の誕生日に開催される大規模なテックカンファレンスがあるということで、2019/11/20(Wed.)〜21(Thu.)の2日間に行われたLINE DEVELOPER DAY 2019に参加してきました!

本イベントの全体レポートは後日余裕があるときに書きますのでお楽しみに。今回の記事は、その中で行われたハンズオンの参戦記になります。

linedevday.linecorp.com

f:id:arthur_teleneco:20191124055144j:plain

What's "Hands-on"?

そもそも「ハンズオン」とは何なのでしょうか。Google先生に聞いたところ、「実践の、実地の」という意味とのこと。つまり、LINEで使われている技術を実践的なワークショップで学べる企画のようです。

今回は自分の予定と興味をハンドブックと照らし合わせ、伊藤宏幸さんによる「仕事をよりクリエイティブにするための「Learning Session」の実践」に参加してきました。

What's "Learning Session"?

会場に入って見えたのが以下のスライドです。バックでアニソンが流れているのに気になりますが。

f:id:arthur_teleneco:20191124060216j:plain

ラーニングセッションとは、社内で行う勉強会のスタイルのようです。以下にその特徴を挙げます。

  • 30〜60分/日で毎日やる
  • 業務時間中にやる
  • 日々の仕事に関するどんなトピックでもOK
  • モブプログラミングの手法を使用する
  • 批判はせず、楽しむ

実際の流れとしては、トピックを選んだ後、6〜7人でチームを作り、モブプログラミングの方法(すなわち、PCを1台だけを使用)で学習していきます。

1. Decide Team

まずはトピックとチーム決め。宿題として学びたいトピックを決めてくるよう案内がありました。参加者から、PythonやDocker、Kubernetesなどの技術トピックが挙げられました。

私はCircleCIのチームを選びました。自分が趣味で作っているWebアプリはだいたい手動デプロイだからです。そろそろちゃんと自動化したいなと思いセレクト。

このチームには4人集まりました。私を含め3人大学生、もう1人の方も私と同じ年だったので、年代はみな同じぐらいです。まぁこの年だったら普通社会人やってるよな……と現実を突きつけられ少し悲しくなりました。

2. Decide Objective

チームが決まったら次は目的を決めます。私たちは「Webアプリケーションのテスト・ビルド・デプロイをCircleCIで行う」ことを目標としました。

具体的に学習する内容は以下に挙げる通りです。

  • CircleCIにユーザ登録
  • 他のCIツールとの違い
  • CircleCIのConfigurationファイルの書き方

3. 1st Round

ここまで決まったので、いよいよ1st Roundスタート。今回はラウンドを2つに分け、それぞれ40分で行います。

CircleCIの特徴

今回は私のPCとアカウントを使うことに。私がGitHubリポジトリを作っている間に、他のメンバーにCircleCIの特徴を調べてもらいました。

  • SaaS型のCI/CDサービス
  • できること
    • Build
    • Test
    • Deploy
  • メリット
    • 環境構築コストが低い
    • 運用コストが低い
    • configファイルがYAML
  • デメリット
    • 使用量に比例した料金
    • リアルタイムにビルド実行できない

SaaSというのは、提供者側で稼働させるサービスのようです。Jenkinsなどは自前で建てるのに対し、CircleCIはクラウド上で実行します。

Webアプリ作成

Vue.jsでサンプルアプリケーションを作り、リモートリポジトリにpushします。

vue create linedevday19-circleci
cd linedevday19-circleci/
npm run sevre
git remote add origin git@github.com:Arthur1/linedevday19-circleci.git
git push -u origin master

CircleCIの設定ファイル

ここまでできたらやっと本題に入れます。CircleCIがリポジトリにアクセスできるように設定した後、早速 .circleci/config.yml ファイルを作成していきます。テンプレートとしてNodeを選択していたので、ブラウザに表示された設定ファイルをコピーし、Linterを動かすスクリプトを下に追記しました。

# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/node:10.15.3

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/mongo:3.4.4

    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "package.json" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run: npm install

      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}

      # run tests!
      - run: npm run lint 

ここで、working_directoryとは何だろう、という疑問が生まれました。困っていそうな雰囲気を、伊藤さんの他にもう1人いらしたLINEの方に察知していただき、一時ファイルが置かれる場所だと教えていただきました。危うくビルドファイルの置き場/distを指定するところでした。

疑問が解決したところで設定ファイルをcommitしてpush。CIが完了するまで数十秒沈黙。すると、見事CircleCI上でLinterが動きました。チーム内に歓声が上がります。

f:id:arthur_teleneco:20191124065444p:plain

ちょうどよいところで40分経過、1st Round終了です。

4. Break

休憩、というより作戦会議タイムです。最初に立てた予定通り順調に進んでいることを確認し、2nd Roundではデプロイまで進むことにします。

ここで、チームメンバーにZeit Nowというサービスがあることを教えてもらいます。静的なWebアプリケーションを手軽にデプロイできるもののようです。最初はGitHub Pagesにデプロイするのかな〜と考えていましたが、せっかくですのでNowを使用することに決めました。

5. 2nd Round

Nowの準備

まずNowにユーザ登録します。GitHubと連携することで手軽に登録できました。そして、NowのためにCLIツールを導入します。

npm install -g now
now login

これでnowコマンドが使えるようになったはずなのですが、なぜかbash: now: command not foundと表示されます。そういえばnodenvを導入したときに、globalのnode_modulesにパスを通し忘れていました。仕方ないので今回はフルパスでnowコマンドを実行しつつ、後日export PATH=$PATH:`npm bin -g`.bash_profileに追加しました。

NowをCircleCI上で実行

nowでdeployするコマンドnow --prodをnpm経由で実行するよう、CircleCIの設定ファイルに追記してpushしたのですが、思わぬ落とし穴に。

f:id:arthur_teleneco:20191124072502p:plain

NowのメールアドレスとパスワードをCIのコンソール上で聞かれていますが、答えようがありません。

調べたところ、トークンを取得し、環境変数を利用してコマンドオプションに追加することで解決するとのこと。NowのDashboardからトークンを取得し、CircleCIの環境変数に追加します。

f:id:arthur_teleneco:20191124072938p:plain

npm runにCircleCIの環境変数を渡せるかよく分からなかったので、node_modules/.bin/now -t ${NOW_TOKEN} --prodとnpmを経由しない形でCircleCIに実行させます。

結果は無事成功!サンプルWebアプリをパブリックに公開することができました!

f:id:arthur_teleneco:20191124073736p:plain

f:id:arthur_teleneco:20191124073543p:plain

感想

お互い初めて会った同士でここまでスムーズに勉強会ができるのは感動的でした。モブプログラミングは、なんでも自分でやりたがる私にとって少々つらいものでしたが、チームメンバーの能力を知り、お互いを向上させていく仕組みとして非常に有用であることを知りました。伊藤宏幸さん、チームメンバーのみなさん、ありがとうございました。

次回はlinedevday全体のレポートの予定です。

SECCON Beginners 2019 東京 Write-Up

熱が冷める前に書いたので文章が煩雑かもしれません。ご容赦ください。

2019/10/5(土)に行われたSECCON Beginners 2019 東京に参加してきました。

内容としてはWebとリバースエンジニアリングに関する講義を受けて、その後演習としてミニCTF大会が行われるというものでした。この記事はこのイベントの体験記になります。

先に結論を話すと、参加者のレベル幅が広いな、という感想です。1位の人とか絶対ビギナーじゃないでしょ。参加者の現状のスキルによって、本イベントに対する目線がかなり変わってくると思うので、先に私の個人情報について書いておきます。

私のスペック

前準備

Kali Linuxvmを導入するよう案内があったので、virtualboxを利用して入れました。ところが、僕のMacBook Air 2018にはスペック的に若干厳しかったみたいです。アプリケーション一覧のアニメーションが上手く動作せず、描画が重なってしまいます。軽量化のためにいろいろ試したんですが、当日寝坊しては本末転倒なので断念。

f:id:arthur_teleneco:20191005232954p:plain

f:id:arthur_teleneco:20191005233002p:plain

講義

Web

XSSに焦点を絞っていたのは良かったと感じました。Webがどのような仕組みと決まりによって閲覧できるのか、という基本知識があれば十分理解できる分量だったと思います。最近はCSP(Content-Security-Policy)関連の問題がよく出ているというお話も聞けました。Web系の常設CTFは古いものも一定数あり、比較的新しい仕様が登場しないこともあるので、勉強は怠れませんね。

個人的に一番「なるほど」と感じたのは、「攻撃対象となるユーザをいかに誘導するか」が重要、という話です。XSSできるから危ない!脆弱性がある!という短絡的な思考ではダメだな、と反省しました。ここが崩れると何のためにCTFしているかわからなくなります。

この部分に非常に感銘を受けただけに、気になったことが1つだけあります。XSS悪用の流れの図が分かりにくかったです。XSSを起こす部分と、XSSによって作った落とし穴にどう誘導するかの部分で分ける、とか、なんか上手い方法があるのでは、と素人ながら思っています。

リバースエンジニアリング

講義資料は圧巻の181ページ。ページ数が多いため、超特急で進むのでは、と不安でしたが、講義資料をゆっくり見ながらであれば、講義の内容に追いつけるスピードでした。アセンブリの命令の説明など、リファレンスのような形で使える部分が多かったのでページが多かったんですね。個人的には嬉しいです。大事にします。

大事だな、と思った内容は、リバースエンジニアリングに3つのレイヤーがあるということです。stringsコマンドなどで手軽に行う表層解析、逆アセンブラしたコードを読み解く静的解析、実際に動かしながらレジスタの値などの挙動を見る動的解析の3つです。今までなんとなく手探りでやっていたのですが、作業の見通しがはっきりしました。

少し話が飛びますが、アセンブリ言語はやっぱり人間には読みづらいと思います。大学の某講義のTAが「アセンブリは単純!十分読める!」と言っていましたがそんなことないと思います。各命令が省略されているだけで結構ダメです。lea ならload effective addressとか、覚えるのにはまだまだ時間がかかりそう。レジスタ名も普通に分かりにくい。

そこを少しでも解消するために、今回の講義ではIDAというツールを使用しました。分岐がGUIで見えるようになっているのは良いですね。デフォルトでつけられた変数名も自由に変えられるのには感動しました。

演習

ここからが本当の意味でのWrite-upですね。演習の結果は1400ptで8位でした。3位までに入ると賞品がもらえるとのことで、張り切っていましたが入賞ならず。残念です。

f:id:arthur_teleneco:20191005233235p:plain

(上の写真は最終段階ではありません。この後rev2aも解けました。)

解放メモを、だいたい解いた順に載せていきます。が、問題にもうアクセスできない状態で書いているので結構うろ覚えです。ごめんなさい。

welcome [Misc, 100pt]

実は「てけいさんビギナーズ」から解こうと思ったのですが、問題へのリンクが見つからず、スコアサーバーのHTMLを眺めていました。そのときにたまたま見つけたのがチュートリアル問題のflagです。

ビギナーズカンパニー [Web, 200pt]

XSS脆弱性があったので、scriptを埋め込みrequestbinに誘導。リクエストのcookieにflagがある、という講義通りのシンプルな問題でした。

alertme [Web, 100pt]

タイトル通りですね。適当にalert文書いて埋め込んだらflagのalertに置き換わっていました。これどういう仕組みだったのか見ておけばよかった。

この問題を解いたタイミングでは2位だったみたいです。

Can you still do XSS? [Web, 300pt]

Webの講義では時間が足りずCSP関連の演習ができませんでした。この問題はその演習問題ほぼそのまま、という感じでした。Content-Security-Policyselfが設定されており、単純にscriptタグを埋め込んでも動作しません。以下の流れで解きました。

  1. requestbinにリクエストを投げるJavaScriptのコードで記事を作成
  2. 1.の記事のraw textをscriptタグで読み込むような記事を作成
  3. 2.の記事に巡回者がアクセスするとrequestbinにflagが届く(cookie)

実際のサービスでわざわざraw textとして表示する機能はなさそうですが、テキストファイルとしてpublicな場所に保存してしまっていた、などの事例はあるかもしれません。

てけいさんビギナーズ [Misc, 100pt]

見覚えがあるタイトルなのはさておき。ページを開くと、足し算の式と、答えを入れるフォームが。正しい答えを150回入れるとflagが手に入るようです。数弱の私は当然自動化します。

私のChromeにはTampermonkeyを導入しているので、好きなページで自分が書いたJavaScriptを実行することができます。以下のスクリプトを実行するようにしました。

(function() {
    function safeEval(val) {
        return Function('"use strict";return ('+val+')')();
    }
    if (document.getElementsByTagName('h3')[0].textContent == '現在の正解回数 : 150') return false;
    var siki = document.getElementsByClassName('a')[0].parentElement.textContent;
    document.forms[0].answer.value = safeEval(siki);
    document.forms[0].submit();
})();

演算対象の2つの整数の要素には.a .bとclassで名前がついていました。最初は足し算しか出てこないと思っていたので、この2つの要素のinnerTextを取得し足し合わせていたのですが、途中から引き算に……。しかも演算子の部分は独立した要素ではなかったので、取り出すのが結構面倒。そこでこのような形に落ち着きました。作問者結構いじわるですね。

この問題は「てけいさん」で解くことも可能です。もしそれを防ぐなら、一定時間内に送信しないとアウト、という実装を作問者がすればよいのです。でも、そうしないということは、「てけいさん」も意味のない行為ではない、ということだと思います。1位の人も手計算で頑張っていたようですからね。

restricted ビギナーズカンパニー [Web, 200pt]

考えすぎて全然解けなかった問題。「ビギナーズカンパニー」と見た目は同じですが、scriptという文字が入っていると弾かれてしまいます。

解法としては、imgタグのonerror属性を利用することで突破可能です。

最初は昔みつけた( https://arthur.hateblo.jp/entry/2018/05/27/185550 ) meta refreshを使ってやろうとしましたが、cookieにあるflagが見れませんでした。他にも、同じ内容で違うactionのフォーム要素を埋め込んだりなど、色々模索して失敗していた気がします。

rev1a [Reversing, 100pt]

バイナリファイルが渡されたので、とりあえずfileコマンドとstringsコマンドを使います。今回の趣旨的にはfileコマンドはいらなかったかもしれませんが。stringsからflagの断片を得たので連結しましたが上手く行かず。IDAも使って眺めていたら、delimを挟んで連結していることが分かりました。中身は_だったので、これでつないでflagを得ました。

rev1b [Reversing, 150pt]

こちらもstringsでflagの断片が出てきました。意味が通るように断片を並び替えたら通っちゃいました。

rev2a [Reversing, 150pt]

2とあってさすがにstringsで分かるような問題ではありません。IDAで静的解析。

input_codecheck_codeという、イカニモな関数を発見。check_codeの中身を見ると、入力した数字と、16進数の6AAC52E...を比較して、等しかったらCorrect!と出るようです。そこでこの16進数を10進数に変換するのですが、ここで悲劇が。この変換がうまくいきません。ネットで適当に調べて出てきたツールを使って答えを出しましたが、得られた数字では通りません。仕方なく手計算しましたが普通に間違えました。原因はコピペミスです。つらいです。しかも、IDA上で右クリックしたら変換できました。

f:id:arthur_teleneco:20191006002719p:plain

初めてReversing問題自力でまともに解けた気がします。これだけで来た価値がありました。それに、終了2分前に通した問題。諦めないの大事ですね。

ちなみに、この問題は演習解説会のときに解説しました。「解けた人手を挙げて」と言われたので手を挙げたら、話すことになってしまいました。Webならもう少し流暢に解説できた気もします。心残りですね。

まとめ

個人的にはReversing解けたので来て良かったです。万人にウケるイベントは無理ですが、もう少しターゲットが明確に絞れるともっと良いなぁと感じました。Beginnerが広すぎるんですよね。本当の初心者はそもそも未経験なので、過去の大会成績などの数値指標を持っていないところも厳しい。

あと私はコミュ障なので交流会が少し辛かったです。劣等感で押しつぶされそうでした。みなさんどうしてそんなに話せるのでしょうか。もちろん交流会は参加必須ではないですが、特に用事がないのに早く帰るのもアレですよね。帰り道に花火大会帰りのカップルと遭遇したのもあってダブルパンチで傷心中です。悲しすぎてセッターカートンやけ買いです。

ぶらつき学生ポータルをリニューアルしました

本記事はぶらつき学生連盟Blogの2019/05/03の記事「ぶらつき学生ポータルをリニューアルしました」 (https://blog.buratsuki.work/?p=68)の転載です。

お久しぶりです。3人目愛人からの君主が上手く決まって気分がいいArthurです。3月4月と体調が悪くなかなか外に出られなかったため、あまりアグリコラができておりません。が、その代わりにアグリコラ関連のツール開発に時間を割くことができました。

今回は、新しく生まれ変わった「ぶらつき学生ポータル」について書き記しておきます。

開発概要

開発のきっかけ

前バージョンのぶらつき学生ポータルは、2017年〜2018年の年末年始に、テレビ特番を見ながら1ヶ月弱で作ったものです。そのため設計が甘く、その後の機能拡張時にかなり苦しい思いをしました。

ぶらつき学生連盟でリバイズドエディションも遊ばれるようになったため、この機会に、と思い1から作り直すことにしました。

前バージョンからの改善点

パフォーマンスの向上

バックエンド・フロントエンドともに高速化させました。その結果、AuditのPerformanceカテゴリで満点の100点をいただきました。その他の項目でも基本的に満点を目指しました。(Accessibilityは使用しているCSSフレームワークの関係でこれが限界)

f:id:arthur_teleneco:20190929104222p:plain

デザインの一部変更

パンくずリンクを用いたり、フラッシュメッセージをトーストにしたりと、細かいところがスタイリッシュになっています。

f:id:arthur_teleneco:20190929104240p:plain

リバイズドエディション

リバイズドエディションのカードにも対応しました。相変わらずカード効果はすべてデータベースに手打ちですので、間違っている箇所があるかもしれません。私までご指摘いただけますと幸いです。

一度入力した戦績の更新が可能に

これはユーザーでないとわからない改良点ですが、一度送信した戦績をあとから編集できるようになりました。逆に言うとこれまではそれができなかったということです。間違えた入力があったら、私がいちいちデータベースにアクセスして直接変更していました。

感想

これだけの規模のWebアプリケーションを一人で作るのはやっぱりしんどいです。コーディングはさておき、合計1700枚以上のカードマスタデータの手打ち作業とか、誰でもできそうな作業に時間を費やすのは精神的に参りました。こういう単純作業は誰かに任せたいところですが、サーバー維持費などは全部自分で持っていて、かつ広告なども置いていません。つまり、このサービスを運営しても赤字でしかなく、人を雇う資金はありません。投げ銭待ってます。

最後のPR

これだけ苦しい思いをして作った「ぶらつき学生ポータルRevised」ですが、実は残念ながらあまり使われておりません。アグリコラが立たないのです。1週間に1回立つか立たないかのゲームにここまで時間と金を投資するのは勿体ないのです。

このツールを作った最大の目的は、拡張アグリコラを攻略するためのデータを集めることです。人狼アグリコラ部さんが出版した「アグリコラ理論」の最後の方に、確かアグリコラ1000戦の統計データが載っていたと思います。どのように集計したのかは分かりませんが、手書きにしろExcelにしろ、入力も集計もしんどいのではないでしょうか。そういった問題を解決するために作ったのがぶらつき学生ポータルです。それなのに、アグリコラが立たないせいでデータが全く集まらない。本末転倒じゃねえか。

そこで、私からこの記事を読んでいるみなさまにご提案です。本ツールをみなさんのコミュニティで運用してみませんか?特に拡張アグリコラをやっている大学のボドゲサークルさんとか!!データを私の個人的研究に使わせていただけるのであればこちらが費用を持ってサーバー建ててもかまいません。拡張デッキに対応しているだけで、旧版EIKしかやらないという方たちにも機能的には申し分ないと思います。ご相談は私のTwitter(@arthur3864)*1のDMにでもどうぞ。

ちなみに、本ツールのソースコードGitHubに上げてあるので、知識とサーバーさえあれば勝手に運用できると思います。サポートはできませんが、そういうのにお強い方はぜひチャレンジしてみてください。あ、マスタデータはないけど。

*1:本アカウントは削除しました。新アカウント@Arthur1__

WordPressでクローズドなWebサイトを作ろう

かれこれ丸一年以上ブログでのアウトプットを怠っていました、Arthurです。心身共に不調を極めています、とても苦しい毎日です。生き地獄という感じです。

一応Webアプリ開発などは続けていて、GitHubに上げているので、気になる人は見てください。こちらでも、近い将来紹介します。

github.com

WPでクローズドなWebサイトを作ろう!

さて、本題です。WordPressは今まであまり使ってこなかったのですが、CMS希望の案件がいくつかあったので遊んでいました。

そこで、私が所属している団体向けにクローズドなWebサイトを作ることにしたのです。メンバー各人にアカウントを発行して、そのメンバーだけがログインして参照できるサイトです。イメージとしては、どのページでもログインしてなかったらWordPress標準のログインページに飛び、ログイン後見たかったページが参照できるという感じです。未ログインユーザに見せるパブリックなページはログインページのみという想定です。ユーザごと別々の会員ホームページみたいなものはありません。

ところが、やり方がよくわかりません。少なくともバニラの状態ではできないようです。Google先生に聞いていろんな方法が見つかったので説明していきます。

Basic認証(WP BASIC Auth)

ja.wordpress.org

BASIC認証を導入するプラグインがいくつか見つかりました。たとえば、WP BASIC Authは、WordPressのユーザ情報と同じものでBASIC認証ができるらしいです。そもそもプラグイン入れなくても.htaccessなりserver.confなりに書けばなんとかなりますが、WordPressのユーザ情報をそのまま使えるのは嬉しいですよね。

ただ、今どきBASIC認証のポップアップが出てくるのは正直ダサいです。また、このプラグインに限った話ですが、最終更新が2015年あたりで止まっているようですWordPressは定期的にアップデートしているので、ちゃんと動くのでしょうか。セキュリティ面も心配ということで今回は採用しないことに。

BASIC認証ってデフォルトのパスワード最大長が8文字ですが、このプラグインではそれ以上も対応しているのでしょうか。気になりますが、ブロガーでもYouTuberでもないので検証はしません。ごめんなさい。

User Access Manager

ja.wordpress.org

次に紹介するのは、WordPressに本格的なアクセス権限管理機能を持たせるプラグインです。機能一覧から抜粋すると以下の通り。

  • ユーザーグループ
  • 閲覧者と、編集者の区別
  • ユーザーグループに基づいたアクセス権
  • アクセス権がない場合に、特定のページにリダイレクトさせる

読んだ感じ、私の掲げる要件を満たしているような感じがします。しかし、使ってみた感想としては、設定が煩雑すぎてWordPress初心者の私には厳しかったです。各ページごとのアクセス制限ができて細かいところに手が届くのですが、トップページのアクセス制限の方法が分かりませんでした。トップから他のコンテンツに遷移するときにはじめてログインページに飛ばされます。これでは今回の要件を満たせません。このサイトやコンテンツの存在自体を隠したいので、トップページ丸ごとアクセス制限を掛けたいです。

きっと私の要件を満たす使い方はできるのでしょうが、設定の方法がわからない以上どうしようもなく、不採用。テーマ書き換えたりすればいけそうだけど、そこまでする気力はありませんでした。

Password Protected

ja.wordpress.org

設定するのはパスワード1つとお手軽な感じなのが魅力です。今回はユーザを識別したいので採用しませんが、これくらい手軽で良いサイトなら十分使えそうだと感じました。ちなみに、画像やアップロードしたファイルは保護の対象外とのこと。

他にも、ページ内の一部の内容だけ隠すプラグインなどが見つかりましたが、Google検索による日本語の記事では、それらしい情報を得ることはできませんでした。

My Private Site

ja.wordpress.org

半ば諦めつつ、WordPressプラグイン検索ツールで、英語でそれっぽい単語を入れていたら、My Private Siteというプラグインに出会いました。

Allows the Administrator to restrict a WordPress-based web site to viewing only by registered users who are logged on. Any attempt, by anyone not logged, to view any Page, Post or other part of the site will display a WordPress login screen.

それっぽいことが書いてあるので導入して設定を弄ります。これが今回の要件にピッタリなプラグインだったのです!

My Private Siteの紹介

インストール

ダッシュボードから、「プラグイン」→「新規追加」→検索窓に"My Private Site"で一番上に出てくるものを「今すぐインストール」→「有効化」で終わりです。どのプラグインも流れは同じなので、画像つけて事細かに説明はしません。

有効化すると、ダッシュボードの「設定」に「Private Site」が追加されます。

設定

設定を開くとわかりますが、このプラグインは日本語対応していません。英語ですが平易なので問題ないと思います。

有効化しただけでは実は本機能は有効になっていません。下のチェックボックスにチェックを入れて「Save Changes」を押すと、一瞬でクローズドサイトの出来上がりです。細かい仕様も弄れますが、今回の要件的にはこのままで問題なし。

f:id:arthur_teleneco:20190922210840p:plain

運用

見るだけのユーザには権限を「閲覧者」としてアカウントを発行します。閲覧者はダッシュボードを見る必要がないと思うので、無効化しておくと良いですね。管理者や編集者も、いちいちログインリンクを踏まなくても強制的にログインに飛ばされるので、クリック数が減っていい感じです。

まとめ

クローズドなサイトを作るには「My Private Site」というプラグインが良いよ、というお話でした。実はこのプラグインに関する日本語のブログ記事が全く見つからなかったんですよね。ブログネタにするのにちょうど良いと思って書いてみました。

ラスト海浜教室

海浜教室

僕の出身高校の1年生がこの時期に行う海浜教室に助手として参加し続けて今年で4回目になりました。現役の頃自分で行ったのを含めて全部で5回も行ったんだなぁと一人で感動しています。せっかくなので振り返ってみます。

第56回(現役)

僕は死ぬほど運動神経が悪いので現役時はE班だった。あの頃は学校の50mプールの半分も泳げなかったし、行きたくないなぁと思っていた。

実際行ってみたけど、現役時嫌いだった行事ランキングダントツの1位だった。2日目3日目雨だったし死ぬほど寒かった。このときはスマホゲームetc一切持ち込み禁止だったので、個人的な思い出の写真も撮れないししんどかった。E班には当時助手はいなかったので他の班が楽しそうにやってるのを羨ましそうに見てた。他にE班誰がいたか全く覚えてないぐらいに影が薄かった。スローガンが「恋海」なのに個人的には恋の要素の一欠片もなかった。

強いて言うなら記念歌づくりが楽しかった。記念歌係メンバーで集まる場所がなくて駅近くの公園でキーボード持って作曲してたら宗教勧誘にあったのを覚えてる。あと、食事のときに水こぼして担任にありえん怒られたのが面白かった。

第59回(助手1年目)

それから3年後、無事大学生になれたので助手として参加した。あれほど海浜教室が嫌いだったのになぜ来ようと思ったかはもう覚えてない。一応現役時の海浜のおかげでそれなりには泳げるようになっていたけれども。

担当だった女子D3は同期の妹etc知り合いが多くて接しやすかったのがよかった。この年は台風が接近していて泳げなかったので、やることはそんなになかった。適当に演劇同好会のときにやってたゲームをやったらそこそこ盛り上がった。泳がずに体力が有り余ったせいでいろいろ問題もあったけれど、それはそれで楽しかった。

第60回(助手2年目)

スマホを家に忘れる大失態をしたので写真がない。ほんの少し金髪残ってた時期だった。女子E班担当。海にすら入れない子もいたけれど、最終日に足のつかないところまで行けたので、みんなの成長にただただ感動した。この年はFDに混ざれたので楽しかった。FDは現役のときから大好き。部活の後輩の妹にその場のノリで「似てる~」とか言ったけど全然似てなくて3秒後に謝った。

海浜前も少し体の調子がよくなかったが、海浜から帰ってきてから体調が急変してしばらく寝たきり生活になってしまった。喉が腫れて呼吸困難になって入院した。

第61回(助手3年目)

4月まで入院していて体も動かず寝たきりの状態が長く続いたので、海浜来れるか心配だったけれど、なんとか通院時を除いて通常の生活に戻ることができた。

だいぶジェネレーションギャップを感じた。この時の1年生はみんな21世紀生まれということに気づいた。今回も女子E班だった。3年目だし大分慣れたと思っていたけれど、訓練の時間管理がうまくいかなくて大変だった。端的に言って時間が足りない。でも、助手として同じ部活の後輩とか知ってる子たちが入ってきたので大分やりやすかった。

第62回(助手4年目)

一番びっくりしたのが、助手1年目で一緒にいた1年生の子がもう卒業して助手として来てること。時間の流れってすごい早い。女子E班3年目。さすがに6歳も離れてると知ってる1年生はいない。いつも途中からE班に来てくれる体育の先生が退職してしまったので、何をやろうか考えるのが大変だったけど、優秀な後輩に投げたらいい感じにやってくれてすごいと思った。はじめて班として写真を撮れた。集いでクラス対抗のレクやってるのはじめて見た。楽しそうだったし来年以降もやるんじゃないかな。

まとめ

なぜこのタイミングで5回分振り返ったかというと、来年からは僕はもう行かないからです。助手同士も含めて、たくさんの人と出会えた海浜教室という行事に感謝しています。本当に楽しかったです。助手としてもいい経験ができるはずなので、ぜひ来てください。

というか普通に高校生に戻りたい人生つらい~~~~。しばらく落ち込んでるので誰か飲みにでもいきましょう。