RAKSUL TechBlog

ラクスルグループのエンジニアが技術トピックを発信するブログです

HackWeek 2023 インターンレポート

こんにちは、HackWeekにインターンチームで参加した井口です。ラクスルでは8/21から8/25にかけてHackWeek2023が開催されました。この記事では、その活動のレポートをお届けします。

イベント・インターン概要

HackWeekは、ラクスルで年1回開催されている、通常業務の開発から離れ、エンジニアが主体となって企画した開発を行う社内ハッカソンイベントです。 サマーインターンとしての側面も持っており、社内のエンジニアがメンターとなり、インターン生もチームで参加しました。 今回、私を含むインターン生13名が、エンジニアメンターのもと、フロントエンド・サーバーサイド・データサイエンスのチームに分かれて参加しました。 今回のHackWeekのテーマがUpgrade Ourselvesということもあり、それぞれ完全に自由な開発を行うというよりは、自分たち自身の生産性や効率向上にフォーカスしたテーマを設定して開発を行っていました。

開発テーマ: バージョン管理の超効率化

私達のチームでは、「バージョン管理の超効率化」と題して、EoL(End of Life)トラッカーをインターン生4名とメンター2名の計6名で開発しました。このトラッカーは、ラクスルの技術スタックのバージョンやEoL情報を効率的に管理するためのツールです。 (他のチームでも2~3名のインターン生に1名のメンターがつく形でした)

背景・課題

現在ラクスルでは、各プロダクトで用いている言語やフレームワークのEoLや現在のバージョンなどをスプレッドシートで手動で管理しています。

  1. 管理が手動であるため、作業ごとにスプレッドシートに追記していかなければならず、エンジニアにとってめんど..負担になる作業となってしまっていました。一部形骸化してしまっている現状もあり、仕組み化が求められていました。
  2. バージョンアップを放置してしまい、後から最新版に対応しようとするとバージョンアップが影響する範囲が広がり、非常に重い作業になります。開発を行うエンジニアだけでなく、Directorなど管理側でも各プロダクト(リポジトリ)の対応状況を把握しておきたいというニーズもあります。

EoLトラッカーによって解決したい課題

アプローチ・解決策

今回は1週間で開発を行うこともあり、上記の背景・課題を解決するため最低限必要な要件を定義しました。

  • GitHubから管理しているリポジトリから言語やフレームワークのバージョン情報を取得する
  • 言語やフレームワークのEoLやEoS(End Of Support)情報取得できるAPIから情報を取得する
  • 一覧で表示できるようにする

まだまだすべての課題を解決することはできていませんが、「手動管理の自動化」は大分進んだと思います!

EoLトラッカーの構成図

技術スタック

メインの言語・フレームワークとして、Ruby on Railsを利用しました。HackWeek以降のメンテナンス性も考え、社内で触れるエンジニアが多いことから、メインの言語・フレームワークとして採用しました。

難しかったところ

  • リモート作業のコミュニケーション

私達のチームは自分を含め大人しい人が多く、リモートで作業する前半2日間は思っているよりも受動的になってしまい作業がうまく進められてませんでした。しかし、2日目でチーム内でさらに2チームに分かれて作業することで能動的に作業ができるようになり、出社してからは相互理解によって自分たちだけで作業を進めることができるようになりました。

  • バージョン情報の取得

現在のプロダクトのバージョン情報をGitHub APIから取得します。 その時、フレームワークのバージョン情報はSBOM(リポジトリのソフトウェア部品表)情報を取得することで確認することができますが、言語のバージョン情報がこれに含まれておらず、.node-version.go-versionといったファイルから直接読み込まなければならず、ハードコーディングになってしまいました。

  • EoL情報の取得

EoL情報はEoL情報を配信しているAPI(https://endoflife.date/api/)から取得します。 取得できるデータが言語やフレームワークごとに形式が異なっており、正規表現による解析を行う必要がありました。

  • 初めてのRuby on Rails

今回、私達のチームのインターン生は全員、Ruby、Railsを触ったことがありませんでした。 当初は慣れない形式に四苦八苦していましたが、メンターのサポートの元、HackWeek期間中に全員慣れていきました(多分)。

プロダクトの今後の展望

最初の設計の段階で、次のような機能があればいいなと話しており、今回の開発ではまだ実装できていないところになります。

  • EoL情報のSlack通知
  • ラクスルの技術スタック以外の言語・フレームワークへの対応
  • EoLやプロダクトのバージョン情報をcronなどで自動取得
  • Directorやマネジメント向けにアップデート計画を設定・表示
  • アップデートで注意する点や作業内容をAIで教えてくれる機能
  • OSS化

このプロダクトは、ラクスルのエンジニアにとどまらず、社外のエンジニア全員に役立つ可能性が秘められています!

結果

ハッカソンイベントということで、参加したエンジニアや経営陣からの投票によってアワードがあります。 私達のチームは、インターン生のチームの中で、プロジェクトの完成度が評価されるINTERN AWARDというアワードの受賞を逃してしまいました。 しかし、"CPO AWARD"というアワードをいただくことができました。 この賞は「テックカンパニーを体現するようなアイデアであるか」という観点で評価されます。 今回のプロジェクトでは、

  • ラクスルのエンジニアにとどまらず、社外のプロダクトを持つエンジニア全体に役立つ可能性が秘められている
  • 広く利用してもらうことで、『ラクスルさんのお陰でバージョン管理が楽になりました!』となり、テックカンパニーとしてアピールできる

という点が評価されました。 今回のHackWeekは全チームのプロダクトの完成度が高く、テーマ・目標で終わらせることなく、実際に実装までできていました!ラクスルのエンジニアの技術力が高いことを象徴している結果となりました。

感想・学び

私は今回初めてRuby on Railsを触りました。MVCアーキテクチャを利用しているため、それぞれの機能ごとにファイルが分かれています。後からシステムを確認したり、初めてシステムを見たとしても処理の中身がわかりやすいと感じました!また、Rubyという言語も直感的に記載できると感じました。 Webアプリケーションの開発に長けていると聞いていましたが、今回のプロダクトも最初の開発に取り掛かるまでに確かに爆速でプロジェクトを立ち上げることができました。

また、実務に携わっているエンジニアは利用者のことを考え、どのように実装すれば価値を届けられるか、ベストプラクティスなコードになるのかということを意識していることを学びました。自分も個人・業務での開発では、このような点を意識しているつもりでしたが、まだまだ全然足りないと感じたので今後研鑽していきたいと思います。

これからHackWeekに参加しようと考えている方は、全力で、能動的に開発できるとさらに良い成果・成長を生み出してくれると感じています!

ラクスル・HackWeekについて

ハッカソン型のイベントに初めて参加しましたが、ラクスルのエンジニアや技術に対してイメージが変わりました!

  • ラクスルのエンジニア

印刷業界に対してアクションを取っているため、どうしてもレガシーなイメージが強く、クールで真面目な印象を強く持っていました。 しかし、実際には専門的な質問だけでなく、日常会話を取ってみてもキーボードの宗派の話で盛り上がれるなどプライベートな話でもコミュニケーションが取りやすいエンジニアが多いんだなと感じました。良い意味でギャップを感じたところです。

  • グローバル化

ラクスルでは日本だけでなく、インドやベトナムなど海外にも拠点があります。HackWeekにもベトナムチームが参加したり、スライドを英語で作成したり、Slackに日本語と英語が併記されていたりと思っていたよりもグローバル感が強いと感じました。

  • テックカンパニー・経営陣の方針

CPOの水島さんもイベント中に仰っていましたが、実はラクスルはテックカンパニーです。自分も面談や逆求人のイベントで「ラクスルってテックカンパニーなんだ!」と深く感じませんでしたが、今回のイベントで新たな技術を用いて積極的に開発を行い、技術に貪欲なエンジニアを見て確かにテックカンパニーだと感じる機会になりました。 また、今後の経営陣の投資方針なども一部聞かせていただき、ラクスルのこれからに期待が持てました!

ラクスルの理念に「仕組みを変えれば、世界はもっと良くなる」というものがありますが、これは経営陣だけでなくビジネス・エンジニアの社員も深く浸透しています。 ハッカソンのテーマも70近く提案されており、それだけテーマが出てくるということはそれだけ日々の現状を良くしていきたい、仕組みを変えてよりよい環境・世界を目指したいという気持ちを持っているからだと感じています。

まとめ

なかなかこのような記事を書いたことがなく、読みにくい部分もあったと思いますが、最後まで読んでいただきありがとうございました!

ラクスルのHackWeekではエンジニア同士でのコミュニケーションの楽しさ、同じレベル感で目標に向かって団結して努力できるところ、プロダクトが完成して、評価されるところがとても魅力に感じました。

また、メンターが業務を止めてつきっきりで成長できるようにサポートしてくれます。実務での開発手法を学びながら、一歩先ゆくエンジニアを目指せます!是非興味を持った方はチャレンジしてみてほしいと思います。

「HackWeek2023 」イベントレポート

こんにちは、ラクスル広報の和田です。
2023年8月21日~25日に社内ハッカソンイベント「HackWeek」を開催しました。

今年のテーマは ”Upgrade Ourselves”
通常向き合っている開発とは異なり、私たち自身の生産性向上・進化に焦点を当て、アイディアだけで終わらず、実際に活用されることまでを想定したプロダクト開発を目指します。

エンジニアの視点から生まれるであろう独創的なアイディアを再考し、具体的なプロダクトとして活用されることにフォーカスしたテーマになりました。

本記事では、HackWeek開催期間中の企画内容や最終日の成果発表会・表彰式に至るまで、イベントの裏側をご紹介していきます。

※昨年度の様子はコチラ

昨年度受賞チームからのエール

HackWeek開催前の8月18日に前夜祭を開催しました。

この前夜祭では、昨年CREATIVE AWARDを受賞したチームとTECHNICAL AWARDを受賞したチームのそれぞれの代表者が振り返りのLTを行い、開発プロセスや学び、反省を通じて得た洞察を共有し、今年の参加者にエールを送りました。

HackWeek2023 カウントダウン

今年もイベント開催の7日前から、Slackで全社横断のカウントダウンリレーをスタート!

「ラクスル」をはじめ、ラクスルグループの「ノバセル」「ハコベル」「ペライチ」のチームもカウントダウンに参加し、一体感が生まれました。

限られた時間での全力開発

参加者たちは、第一日目から最終日まで、限られた期間内でアイデアを具現化し、プロジェクトを完成させるため、解決すべき課題の洗練からアイデアの醸成、そしてプログラミングまでの一連のプロセスに全力で取り組みました。

限られた時間の中で、成果を上げるために数多くのチームがミーティングスペースで開発を実施していたためオフィス全体は熱気に包まれていました。

事務局からもエール

充実した一週間を過ごしてもらうため、事務局からも差し入れ企画を用意しました。

  • 終 日:クラフトビール
  • 月曜日:お菓子
  • 火曜日:コーヒー
  • 水曜日:カスタマイズカレーランチ
  • 木曜日:エナジードリンク
  • 金曜日:おにぎり

多様なチームが挑んだ成果発表会

ハッカソンの締めくくりとなる成果発表会では、全20チームがオフライン会場とオンライン配信のハイブリッド形式で集結。

開発テーマは、ユーザーエクスペリエンスの向上、プライシング最適化と自動化、内部ナレッジのアクセシビリティ向上、GraphQLの最適化など多岐に渡りました。

短期間で魅力的なプロジェクトを完成させ、その成果を発表した各チームの高い完成度にパブリックビューイングをしていた会場と配信ルームは終始歓声に包まれていました。

左:CPO 水島 中:ノバセルCTO 戸辺 右:ラクスルCTO 岸野 
発表を控えるチームのSlackチャンネルでは、緊張する発表者にメンバーがスタンプで応援する様子も。 ※写真はペライチ社イベントレポートより拝借

優れたプロジェクトを讃える表彰式

今年はINTERN、UNIQUE、FEASIBILITY、TECHNICAL、CPO、UPGRADEといった6つの異なる観点から、最も優れたプロジェクトが表彰され、参加者たちはその努力と創造性を讃えられました。

INTERN AWARD
 ”ダンボールアンチーム”(インターン)

ノバセルCTO 戸辺のコメント
今回はChatGPTを利用しているチームが多かったのですが、そのなかでもChatGPTと単発のやりとりだけでなく対話型でユーザーのほしいものにたどりつく設計がよかったと思います。
比較的新しめ機能である Function Calling を使うことにより、難しいTuningをすることなく、データ検索とAIを組み合わせるアイデアが素晴らしかったです。また、ノバセルの得意な技術と、ダンボールワンのデータの連携ということで、事業部を超えた連携も素晴らしかったと思います。新しく触れる技術が多かったにも関わらず、最終的にしっかりと動くところまで作り上げてきたところを評価しました。改めて、おめでとうございます。

UNIQUE AWARD

"CSマトメルチーム"
 

CIO 仲田のコメント
オペレーションとの統合によって価値が生まれるという点が、多くの人から評価されて投票されたように思います。 CSが抱える電話対応時の内容要約したり、録音音声を確認して過去の対話を把握したりするという業務の辛さを、Speech to Text と ChatGPTのText要約という最近進化が著しく、精度も高くなった技術を活用して解消するという内容で、現場解像度の高さが伺えました。また、CSの方からもこのまま導入できそうという声も上がるほどのレベルで、その実現度はまさにラクスルのビジョン「仕組みを変えれば、世界はもっと良くなる」を体現する素晴らしいものでした。皆様、おめでとうございます。

FEASIBILITY AWARD

”ペライチクリエイトアシスタントチーム”

ラクスルCTO 岸野のコメント
今回、全体的に完成度が高く、受賞候補チームがたくさんありました。実際に実用化までを目指して開発しているチームが多かった印象です。結果としても投票も割れてかなり僅差でした。そんな激戦を勝ち抜いたのはペライチのペライチクリエイトアシスタントチームです。
投票コメントでは、作りたいサイトの情報を入力したらすぐにサイトとして使えると言うところまで作り上げていた点が評価されていました。誰でもすぐにホームページを公開できるという価値をUpgradeしている取り組みだったんじゃないかと思います。皆様、おめでとうございます。

TECHNICAL AWARD

”Novelty Editor Realtime Video Previewチーム”

ラクスルベトナム社長 泉田のコメント
多くのチームが最新技術を活用しましたが、最終的には最も現実的なユーザー体験を実現したチームが受賞しました。
事前にプリントされた商品(Tシャツ)の着用イメージを確認する場合、実店舗へ行くことが一般的です。しかし、マスカスタマイジングECプラットフォームで提供し、購入前に確認できるようにすることで、具体的なイメージを持つことができる革新的な開発が行われ、非常に多くの評価を受けました。3Dデータの作成は大きな課題となっており、ここ3年間ではDanball Oneの3Dエディタしか製品化されていませんでした。世界的なマス・カスタマイジング市場、特に新興国市場での成功には、3Dプレビューが大きな役割を果たすと思います。このコンセプトが今後他のプラットフォームでも広まることを楽しみにしています。

CPO AWARD

”EoL Trackerチーム”(インターン)

CPO 水島のコメント
テックカンパニーを体現したチームに送られる賞であり、私の独断と偏見による選出予定でしたが、結果として得票数が高かったチームが受賞しました。 また、インターン部門でも2位に輝きました。
「EoL Tracker」というプロジェクトは、開発者たちが必要とするアイデアを具現化していました。オープンソースソフトウェアとして世の中にぜひ公開したい。この取り組みは社外のエンジニアから感謝され、模範とされるものであり、まさにテックカンパニーの姿そのものです。
ラクスルは顧客向けの事業開発において得意を発揮していますが、今後はこうした価値ある取り組みをさらに増やしていきたいですね。

UPGRADE AWARD

”サチエル/ In-house knowledge Botチーム”

CPO 水島のコメント
今回のテーマである「Upgrade Ourselves」に最も適したチームに送られる賞です。 これは私自身のお気に入りのアイデアでもありましたが、このチームは高い完成度のデモンストレーションを行い、明日からでも実際に利用できる、そしてユーザーのフィードバックを受けながら進化させていけるプロダクトを作り上げました。
これはまさに私たちの日々の働き方を変え、アップグレードしてくれるようなインパクトを持っています。この取り組みが長期的に組織の生産性を大きく向上させる可能性を秘めていると思います。注目すべきは、CorpTechとノバセルの混合チームが協力して取り組んだ点です。 この協力がグループ全体の進化に貢献し、素晴らしい成果を生み出しました。

さいごに

今年のHackWeekも、参加者が新しいアイデアを生み出し、実用的なプロダクトを開発するための貴重な機会になりました。何よりラクスルグループの多様なチームが集まり、異なる視点から課題に取り組むことで、革新的なアプローチと解決策が生まれたため、シナジーを最大限に活かしさらなる成長を目指すラクスルグループらしいハッカソンイベントだったなと感じています。

参加したメンバーからは、常に新しいアイデアや実装に時間を割くべきだとの意見や、業務では難しい挑戦に取り組む機会としてHackWeekの価値を高く評価する声が多く寄せられ、アイデアの発表やコーディングの挑戦、クリエイティビティの促進、実用的なプロダクトの開発など、多彩な魅力に言及する声も多かったです。

事務局の私も、開発メンバーのワクワクや興奮を肌で感じ、充実した5日間を過ごせました。
シンプルに楽しかった・・・(笑) 参加者の皆さん本当にお疲れ様でした!
そして、HackWeek後、今回取り組んだプロダクト開発がこれからも会社を前進させていくことを楽しみにしています。

人生初のコードゴルフやってみた

こんにちは。ラクスルで24新卒として内定者インターンをしている新開です。 早速ですがみなさんは競技プログラミングやハッカソンなどのプログラミングコンテストに参加した経験はありますか?

今回はプログラミングコンテストの1種であるコードゴルフという、アルゴリズムをどれだけ短いソースコードで記述できたかを競う競技に取り組みましたので、自分なりに考えたことをお話ししたいと思います。

コードゴルフをするまでの経緯

ラクスルの24新卒エンジニアのメンバー全員が初めてオフィスで顔合わせする懇親会が開催され、 当日は自己紹介や他メンバーとの共通点を探すゲームなどを通して同期の親睦を深める良い機会になりました。

懇親会のプログラムのひとつにコードゴルフがあり、同期を4つのチームに分けて1時間程度かけてコードを短くすることに取り組みました。

コードゴルフの様子の画像
コードゴルフの様子

どんな問題?

問題は非常にシンプルで以下の文字列(ラクスルのロゴ)を標準出力することです。 表示が崩れている場合があるのでgistで確認することをお勧めします。

                           ###############
                      #########################
                   ################################
                ###########    #####       ##########
              ########         #####           #########
            #######            #####              #######
          #######              #####                #######
         ######                ##### ####             #######
        ######                 ############             ######
       #####                   ###############           ######
      #####                 ####################          ######
     #####               ###########   ###########         ######
    #####             ##############     ###########        #####
   ######          #########   #####       #########         #####
   #####        #########      #####         ######           #####
  ######     ###########       #####        #####             #####
  #####   ##############       #####       #####              ######
  ##############  ######       #####     #####                 #####
  ##########      ######       #####   #####                   #####
 ########         ######       #####  ######                   #####
 ######           ######       ##############                  #####
 ######           ######       ###############                 #####
  #####           ######       #######  ########               #####
  #####           ######       #####     ########              #####
  #####           ######       ####       ########            #####
  ######          ######       ##          ########           #####
   #####          ######                    ########         ######
    #####         ######                     #########       #####
    #####        #######                      #########     #####
     #####      ########            #          #########   ######
      #####    ################  ####            ######## ######
       ###### ######################              #############
        ######      ##############                 ###########
         #######          #######                   ########
           ######                                   #######
            ########                              #######
              #########                        ########
                ###########                ##########
                   ###############################
                       ########################
                            ##############

ルール

  • 言語はオンラインのコード実行環境で実行可能であること
  • 標準ライブラリのみを使用すること

どのような戦略を取るか?

記述言語

まずどの言語で記述するかというところですが、私たちのチームではPython3を選択しました。 理由としては次の2つが挙げられます。

  • チームメンバー全員が理解&記述できる
  • 超高級言語である(≒複雑な処理をシンプルに記述できる)

文字列を圧縮しよう!

今回の文字列は#、改行コードの3種類と少なく、繰り返し箇所が多いです。 この場合にはランレングス圧縮が適切と判断しました。

まずはランレングス圧縮を試してみる

from itertools import groupby

def run_length(logo):
  res = []
  for line in logo.splitlines():
    compressed = [(key, len(list(group))) for key, group in groupby(line)]
    res.append(compressed)
  return res

各行に対して(符号, 繰り返し回数)のタプル型にランレングス圧縮した結果を要素とする配列を作成してみました。

[[(' ', 27), ('#', 15)], [(' ', 22), ('#', 25)], ..(省略)..]

文字列の特徴から符号を省略できる

さらに各行に着目すると、#のブロックが交互に並んでいて最初にが来るというルールがあります。 つまり(符号, 繰り返し回数)のタプル型で表現されるところを、符号を省略した連続回数のみで表現できるようになります。 繰り返し回数の数値同士を、各行を,で区切ることによりランレングス圧縮した結果を1つの文字列へと可逆に変換できます。

"27 15,22 25, ..(省略).."

数値を一文字で表現する

さらにさらに2桁の数値でも1文字で表現できるようになると、繰り返し回数の数値同士を区切る必要もなくなりさらに圧縮できると考えました。

"RF MP JW ..(省略).." (後ほど解説します)

これを実現するには次の2つの方法が考えられます。

  • 10進数とASCIIコードの変換を行う
    • pythonではchr関数↔︎ord関数を用いて実現できる
    • 10進数の33から126までの94種類の数値は1文字のASCIIコードで表現できる
    • 例で先ほど示した最初の27という数値は32を足すと59になるが、10進数の59はASCIIコードで;と表現できる
>>> n = 27
>>> c = chr(n + 32)  # 1~94の範囲の数値を33~126の範囲に並行移動するために32を追加
';'
>>> ord(c)-32  # 9バイトで記述できる
27
  • 出現する最大値をNとしてN+1進数に変換する
    • pythonではnumpyのbase_repr関数↔︎int関数を用いて実現できる(今回外部ライブラリが使えないというルールだが、提出するソースコードはint関数で復元するので外部ライブラリを使用しないのでセーフ)
    • 例として10進数の27は36進数でRと表現できる
>>> import numpy as np
>>> n = 27
>>> c = np.base_repr(n, 36)
'R'
>>> int(c,36)  # これも9バイトで記述できる
27

ここでは圧縮した文字列を復元するときのコードの短さは同じなのでどちらの手法を取っても構わないと判断しました。 今回は出現する数値が35であることを把握して、後者の「36進数に変換する」手法を取りました。 改行を,ではなくとして表現して(これは次節で用いるsplit関数の引数を省くため)、この手法を取ることで次の文字列まで圧縮することができました。

RF MP JW GB457A E895B9 C7C5E7 A7E5G7 96G514D7 86HCD6 75JFB6 65HKA6 55FB3B96 45DE5B85 36A9357995 35896596B5 265B7585D5 253E7575E6 2E267555H5 2A667535J5 18967526J5 16B67EI5 16B67FH5 25B67728F5 25B67558E5 25B67478C5 26A672A8B5 35A6K896 4596L975 4587M955 5568C1A936 654G24C816 761MED 866EHB 97A7J8 B6Z7 C8U7 E9O8 GBGA JV NO SE

シンプルな復元処理を書こう!

ここでは前節の圧縮したラクスルのロゴを用いてできるだけ短いソースコードで復元して標準出力する方法を模索します。

まずは可読性の高いソースコードで記述する場合は次のようになるかと思います。

compressed_logo = "RF MP JW GB457A E895B9 C7C5E7 A7E5G7 96G514D7 86HCD6 75JFB6 65HKA6 55FB3B96 45DE5B85 36A9357995 35896596B5 265B7585D5 253E7575E6 2E267555H5 2A667535J5 18967526J5 16B67EI5 16B67FH5 25B67728F5 25B67558E5 25B67478C5 26A672A8B5 35A6K896 4596L975 4587M955 5568C1A936 654G24C816 761MED 866EHB 97A7J8 B6Z7 C8U7 E9O8 GBGA JV NO SE"

for line in compressed_logo.split():  # 各行に分割
  for i,j in zip(line[::2],line[1::2]):
    print("".join(" "*int(i,36)+"#"*int(j,36)),end="")  # 偶数番目は空白、奇数番目は#
  print()

ここで用いているzip(line[::2],line[1::2])は、文字列lineを奇数番目と偶数番目の要素で分割して#の組み合わせを生成します。 例えばline="GB457A"のとき、line[::2]="G47"と偶数番目の要素を返し、line[1::2]="B5A"と奇数番目の要素を返します。 そしてzip関数をfor文で用いることで、[('G', 'B'), ('4', '5'), ('7', 'A')]のように2つの文字列を同時に反復処理しています。

さて、この可読性の高いソースコードからどのように短くしたかですが、結論を先に述べるとリスト内包表記を用いました。 リスト内包表記は既存のリストの各要素に対してある処理をシンプルに記述できます。

>>> [i*2 for i in range(5)]  # 既存のリストの各要素を2倍にした新たなリストを作成
[0, 2, 4, 6, 8]
>>> [print(i*2) for i in range(5)]  # 新たなリストの作成を目的とせずにprint文の処理を行うということもできる
0
2
4
6
8
[None, None, None, None, None]  # これは標準出力でない

それでは先ほどのソースコードにこのリスト内包表記を用いてみましょう。 まずは2重になっている内側のfor文から取り掛かります。

compressed_logo = "RF MP JW GB457A E895B9 C7C5E7 A7E5G7 96G514D7 86HCD6 75JFB6 65HKA6 55FB3B96 45DE5B85 36A9357995 35896596B5 265B7585D5 253E7575E6 2E267555H5 2A667535J5 18967526J5 16B67EI5 16B67FH5 25B67728F5 25B67558E5 25B67478C5 26A672A8B5 35A6K896 4596L975 4587M955 5568C1A936 654G24C816 761MED 866EHB 97A7J8 B6Z7 C8U7 E9O8 GBGA JV NO SE"

for line in compressed_logo.split():  # 各行に分割
  [print("".join(" "*int(i,36)+"#"*int(j,36)for i,j in zip(line[::2],line[1::2])))]

さらにもう一つのfor文も同様に行うと、、、

compressed_logo = "RF MP JW GB457A E895B9 C7C5E7 A7E5G7 96G514D7 86HCD6 75JFB6 65HKA6 55FB3B96 45DE5B85 36A9357995 35896596B5 265B7585D5 253E7575E6 2E267555H5 2A667535J5 18967526J5 16B67EI5 16B67FH5 25B67728F5 25B67558E5 25B67478C5 26A672A8B5 35A6K896 4596L975 4587M955 5568C1A936 654G24C816 761MED 866EHB 97A7J8 B6Z7 C8U7 E9O8 GBGA JV NO SE"

[print("".join(" "*int(i,36)+"#"*int(j,36)for i,j in zip(line[::2],line[1::2])))for line in compressed_logo.split()]

かなりシンプルになりました!

最後に不要な空白や変数の表現を省き、変数名は1文字で定義するなど、調整を行なって最終的に以下のソースコードで提出を行いました。

[print("".join(" "*int(i,36)+"#"*int(j,36)for i,j in zip(l[::2],l[1::2])))for l in "RF MP JW GB457A E895B9 C7C5E7 A7E5G7 96G514D7 86HCD6 75JFB6 65HKA6 55FB3B96 45DE5B85 36A9357995 35896596B5 265B7585D5 253E7575E6 2E267555H5 2A667535J5 18967526J5 16B67EI5 16B67FH5 25B67728F5 25B67558E5 25B67478C5 26A672A8B5 35A6K896 4596L975 4587M955 5568C1A936 654G24C816 761MED 866EHB 97A7J8 B6Z7 C8U7 E9O8 GBGA JV NO SE".split()]

結果は416バイトでした。 今回作成したプログラムはgistにて共有しています。

最後に

コードゴルフは処理速度や可読性など普段コードを書く際に意識すべきことを度外視した遊びです。 しかし今回取り組んでみて様々な発見があり、いつもとは違う刺激的かつ有意義な時間を送ることができました。

みなさんも一度コードゴルフに取り組んでみてはいかがでしょうか?ここまで読んでいただきありがとうございました。

HackWeek2023 ラクスルサマーインターンシップ体験記

はじめに

神戸大学大学院25卒の水崎祥太です。
今回は自分が参加したラクスルでインターンしたレポートを書きたいなと思います。

想定読者は
  • ラクスルという会社に興味を持っている就活生
  • HackWeekをおもしろうそうと思っている学生
特に読んでほしい人
  • PdMを目指すために、TechとBizが近い距離である会社に行きたい人
  • 一緒に働く仲間が大事だと思っていて、それを大事にする会社に入りたい人

となっているので、もしよかったらご覧ください。

概要

今回のラクスルのインターンであるHackWeekでは、全5日間で、与えられたテーマをもとにチーム開発をしました。
僕たちのチームはインターン生4人に対して、メンター1人という体制でした。(他のチームは2,3人のチームもありました。)
先に感想を伝えておくと、自分にとってはラクスルの雰囲気が知れたことで、ラクスルで働くイメージがついたインターンでした。

参加する前の僕のお話

自分の中で、ぼやっと30才になるまでに、PdMになりたいな~と思っていました。
それは自分自身が、システム開発における上流工程を考えることが好きなこと・プロダクトの企画から売れて運用するまでを一貫して考えたいな~と思っていたことが大きな要因です。
そのために、TechとBizの距離が近い会社に入れたらいいな~とぼんやり思っていました。 また、PdMをするなら、自分が好きだ!これを世に広めたい!と思えるプロダクトを育てたいと思っていました。

そんな中で参加した理由

参加した理由は、大きく3つあります。

1. TechとBizが近いと感じたこと

採用イベントで話した際に、TechとBiz側の距離が近い話だったりを聞いて興味を持ちました。 あと、ラクスルの人事の方が優しくて純粋に会ってみたいな~とか思って参加しようかなとなりました。

2.仕組みを変える、というVisionが好きだったこと

その採用イベントの時に「仕組みを変えれば、世界はもっと良くなる」というVisionを聞いて、自分にとって共感性が高いものでした。世の中を継続的に変えていくためには、なにかの仕組みを変えるべきだしそれこそがインパクトを残すことだと自分の中で思っていたため、共感しました。

3.時給が高かったこと

これは、自分にとっていい話でもあるのですが、それ以上に学生や採用に力を入れており若手の成長に力を注ぐ会社なのかもしれないと感じました。 それなら、自分がラクスルに入社しても成長できる環境が整っていて頑張れるのではないか?と考えました。

上記の話から今回のインターンシップで知りたかったこと

  1. 実際、TechとBizの距離は近く、どちら側でもプロダクトを成長させるという視点で議論できるかどうか

  2. 新卒に対して、どのような立ち位置と思っているのか

  3. 社員さんが自分たちのVisionに対して、どう思っているかどうか

です。

上記に対して知ったこと

TechとBizの距離は本当に近い!

あくまで、僕の感想になってしまいますが、本当に近いと思います。 そもそも、ラクスルがおこなっている事業の特性として、ITシステム上だけでなくリアル(現実世界)のUXの考慮がとても重要になってきます。 例えば、印刷に用いる紙の仕入れ値の上下、商品の運送などリアルとのリンクが大事になってくるため、エンジニアとしても使ってもらえる場面をよりリアルに想像して設計・開発する必要があり、Bizとの距離も自ずと近くなります。 そのため、インターンシップ中でもBizの方を呼んでクロストーク会が行われ、BizとTechの関係性を知ることができました。そもそも、そのイベントをインターンシップ中に設定していることこそが、ラクスルという会社がその近さやプロダクトに向かう姿勢を示していると考えていて、上記のように感じました!

新卒に手厚い環境である

実際に、エンジニアの社員さんから、CTOの方にめちゃめちゃ教えてもらえているという話が聞けたり、そのほかの職種の方も、役員の方から面倒をよく見てもらえる、という話があって、それがエンジニアだけではなくBiz側の方からもあがっており、全社として新卒の育成を大事にしているんだと感じました。

社員さん1人1人が自分がしたいことがある

これは、話してる中でしたいことなどを聞いたときに、エンジニア側からでもVisionに対してしたいことを話してもらえて、なおかつそれが経営目線も合わさって話しているのがすごく印象的でした。

実際にしたこと

グラフデータベースを用いて、競合の可視化を行う内部向けツールを作成しました。 事業成長のため自分たちの競合を広く理解するためのツールとして作成しました。

やったこと

  1. 競合度合いが記入されたファイル(スプレッドシート or CSVファイル)をアプリケーションで読み込みます。
  2. 読み込んだデータをNeo4jのデータベースに格納します。
  3. ユーザーはアプリケーションを通じてNeo4jのデータベースにアクセスすることで競合を出力します。

工夫したこと

  • 競合度合いが分かりやすいように、割合によって色の濃淡を変化させるようにした。またランキングをリスト表示することでよりわかりやすくした。
  • スプレッドシート・CSVファイルなど、営業など技術に詳しくない人材でも気軽に利用できるようにした。

感想

Steamlitが便利すぎる

これのおかげでPythonだけできれいなUIができました。これすごすぎる

グラフデータベース面白かった!

グラフデータベースという今まで触ったことのない技術に触れましたが、色んな関係性が含まれるデータには便利だなと思ったので、これからなにかに使いたい!と思いました。

ユーザーヒアリングめちゃめちゃ大事

途中で、ユーザーヒアリングを行ったのですが、そのヒアリングでこのツールを使う場面や使う人の気持ちへの解像度がものすごく上がりました。

今、応募を迷っている人へ

もし、技術で不安で迷っている人がいたら、心配しなくて大丈夫です。コーディングテストもあって、通ったらそれはできる実力があるということです! なので、まず迷っていたら応募してみるのが大事だなと思います!
そして、メンターが必ずついてサポートしてもらえるので、わからないことは積極的に聞くのがいいなと思います。 何より、同じように就活を考えている人と友達になれます。 僕はこのインターンで出会った人と一緒にサービスを考えたりしています。
学びも、仲間も得ることができる本当にいいインターンなので、ぜひ応募してみてください!

まとめ

ここまで、読んでいただいた方ありがとうございました。 ちょっと先輩として、なにか読んだ方の助けになっていればと思います。
お世話になったメンターさん含め、一緒に開発をしてくれたチームのみんな、いろいろの準備をしていただいた人事の方々、話していただいた社員さんなど本当にたくさんの方のご協力があって、実りのあるインターンとなりました。
楽しかったです、ありがとうございました!

HackWeek2023 バージョン管理ツール「EoL Tracker」【CPO賞受賞】

はじめに

こんにちは、ラクスルに夏のインターンとして参加した松原です! HackWeekはラクスルグループ内で行われているハッカソンで、毎年1週間程度業務を止めて開催されます。私は今回のHackWeekにインターン生として参加しました。チームメンバーは同じインターン生4人に対して、メンターが2人も付くという豪華な布陣でした。

バージョン管理ツール EoL Tracker

私の所属していたチームでは「EoL Tracker」というWebアプリを作成しました。EoL Trackerは、社内のプロジェクトで使われているプログラミング言語やライブラリのバージョン情報に対して、EoL (End of Life) 情報を表示するというツールです。

<ページの説明>
  • Team:プロジェクトのチーム名
  • Repository Name:githubのrepository名(リンク付き)
  • Software:各リポジトリの技術スタック
  • Current Version:Softwareの現在のバージョン
  • EoL:SoftwareのEnd of Life
<機能>

新たなTeam・Repository Nameを手動で追加 Team, Softwareで絞り込み EoLが過ぎているものに対して、赤色で警告

<解決したこと>

今までのEoL Trackerではリポジトリの技術スタックごとに現在のバージョンとEoL情報を手動で入力していましたが、今回作成したEoL Trackerはすべての情報を自動で入力することができます!なんて画期的なんだ......。これにより、エンジニアはより効率的にバージョン管理を行うことができる!

EoL Trackerの詳細

EoL Trackerのダイアグラムは以下のようになっています。

  1. RaksulのGithubリポジトリからAPIを叩いて技術スタックと現在のバージョンを取得し、Databaseに登録。
  2. 1で取得した情報からendoflife.dataという技術スタックのEnd of Life情報が登録されているWeb サイトからEnd of Lifeを取得し、Databaseに登録。
  3. 1、 2で取得した情報をRuby on Railsを用いて表示。
<泣く泣く実装できなかった追加機能>

今回のHackWeekで実装できなかった機能を紹介します。

  • Slackへの自動通知
    • End of Lifeや技術スタックに脆弱性が見つかった際に、EoL Trackerから自動で通知する機能。
  • タスクの定期実行
    • CRONを用いてタスクを定期実行する機能。
  • サポートする技術スタックの拡張
    • 社内で用いられている主要な技術スタック以外にも対応させる。
  • アップデート計画の管理
    • アップデートを必要とする技術スタックについて、各チームでのアップデート計画を管理する機能。

HackWeekでの収穫

今回のHackWeekを通して、技術力とチーム開発能力がぐんっと伸びたと感じています。

技術力について、、、
作成したEoL TrackerではRuby on Railsを使用しましたが、私は経験のない言語だったため新たな挑戦でした。チームメンバー全員がRuby自体を触ったことがありませんでしたが、メンターの方々に補助していただき、なんとか形になるものを作ることができました。Ruby on Railsには様々な機能が用意されていて、かなり勉強のしがいがあるフレームワークだな、と感じました。(メタ関数は黒魔術......)

チーム開発能力について、、、
今回のHackWeekを通して、自分の意見を伝えることと相手の意見を正しくくみ取り、解決案を考えるということを意識しました。初日ではチームでの方針や役割分担を考える際に、あまり自分の意見を伝えるということができず、あまり主体性を持ってプロジェクトに参加できていませんでした。しかし、このままではだめだと感じ、2日目からは自分から行動し、積極的にチームメンバーとコミュニケーションを取るように心がけました。相手の様子が分かりづらくなるリモートワークが増えている中、こういった積極的な行動がより求められていると感じました。

来年の夏インターン参加者にむけて

HackWeekではただのハッカソンと違い、メンターとの距離が近いため技術的なことだけでなく、実際に働くイメージがわいてきます。そのため、とても濃密な夏インターンになることは間違いありません!もし、迷っている方がいたら間違いなく参加したほうが良いです!

まとめ

夏のインターン生としてHackWeek2023に参加し、技術的なことだけでなく、コミュニケーション能力やチーム開発をする際の心得を習得することができました。この学びを今後の開発人生に活かしていこうと思います! 最後に、素敵な夏のインターンをサポートしていただいた皆様、丁寧かつ熱心なサポートをしていただいたメンター、共に走り切ったメンバーに感謝します。