MIXIでインターンした話 in 2023

前年に続いて、今年の夏もMIXI社にてインターンさせていただきました。今回は競輪やオートレースへのインターネット投票を行うことのできるサービスであるTIPSTARのiOSアプリを開発するチームに関わらさせていただきました。 美味しいお肉 取り組んだこと インターンシップ期間中には色々なタスクに取り組みました。以下にいくつかをまとめました。 デッドコードの削除、コンポーネントの移動 TIPSTAR iOSアプリではデッドコードが多く残っていることが課題として認識されており、効率的にそれを削除することをタスクとして取り組みました。 デッドコードを検出するのにはPeripheryというツールを利用しました。このツールはビルドによって生成されるインデックスストアとASTを利用して、使用されていないコードを検出します。残念ながらコードの自動修正は行なってくれないので、そこは基本的に手動で消していく必要があります。シェルスクリプトなどで自動化にも挑戦しましたがあまりうまくいきませんでした。 また現状未使用だが将来的に使われる可能性のあるUIコンポーネントについては、UIコンポーネントを管理する専用のライブラリに移動する対応をとりました。 最終的に、1385個あった警告を146個にまで減らすことができました。 この作業は地道で作業する側もレビューする側も負荷が高く、この手の作業を継続的に行うことの重要性を感じました。 CIワークフローの改善 TIPSTAR iOSアプリのCIにはBitriseが利用されており、そのCIワークフローの改善、およびスピードアップに取り組みました。 BitriseのマシンにはiOS開発でよく利用される多くのツールが最初からインストールされており、同じツールをインストールしおなしている部分が多くありそれを修正するところから始めました。 次に、HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=TRUEを設定しました。これはすでにインストールされているHomebrewフォーミュラのアップデートの確認を行わなくするフラグでこれを設定することでBitrise上でHomebrewでインストールされているツールのアップデートが走らなくなり、大きな時間の節約になりました。 そして、LicensePlistをHomebrewのtap経由でインストールしないようにしました。LicensePlistはすでにHomebrew-core上で管理されており、そちらだとビルド済みバイナリをインストールできるため、若干の時間の節約になりました。 またその他の二重にインストールしていたツールを整理しました。 最後にいくつかのインストールをシェルスクリプト上で並列実行するようにし、時間の節約を図りました。 この変更を行う際にプリインストールツールを使うこと(アップデートを走らせないこと)の良し悪しを検討しましたが、以下の理由から問題ないと判断しました。 最新版の変化に追従できない可能性 比較的良い意味で枯れてきてるツールのため、そもそも最新版である必要性は低め 依存関係が解決できない可能性 Bitriseが提供してるスタックのマシンはすでに依存が解決されているはずなので問題になる可能性は低い ワークフローのポータビリティが下がる そもそもBitriseのyml形式で書いた時点でポータビリティは失われているのであまり関係ない 全体的にばらつきもありましたが体感として5分前後の時間の短縮を達成できました。 その他 その他いくつかの小さめなタスクに取り組みました。 SwiftLintルールの見直し SwiftLintワーニングの修正 Firebase Performanceの追加 UI改善チケット バグチケット インターン期間中楽しかったこと CTOオフィスアワー&1on1 MIXIにはCTOの吉野さんと社員の方々が自由にお話しできるCTOオフィスアワーというものがあるのですが、そこに他のインターン生と一緒に参加させていただきました。インターン生それぞれが興味のある技術の話題やMIXIについての質問をすることができとても楽しい時間になりました。 また1on1で吉野さんとお話しする機会も設けていただき、個人的にキャリアについてのお話しやMIXIについて伺うことができ、それもとても有意義な経験となりました。その中で、いかに自分のニッチを見つけて、その分野においてNo.1になることを目指すところから始めるべきというお話はとても印象に残っています。 社員さんとの交流 インターン期間中に、何度もランチなどで様々な部署の社員の方々と交流する機会を設けていただき、いろいろな事業のお話しを聞くことができてよかったです。

2023-12-23 · 1 分

SwiftでCatコマンドを作る

catコマンド catコマンドとは、与えられたファイルパスの中身を標準出力に書き込むコマンドです。今回はそれをSwiftで再現してみたいと思います。 The cat utility reads files sequentially, writing them to the standard output. The file operands are processed in command-line order. If file is a single dash (‘-’) or absent, cat reads from the standard input. If file is a UNIX domain socket, cat connects to it and then reads it until EOF. This complements the UNIX domain binding capability available in inetd(8). 今回は、一つのファイルを読んで出力するところまでを再現します。 Swiftからシステムコールを呼ぶ Swiftからreadやwriteなどのシステムコールを呼ぶために、今回はapple/swift-system: Low-level system calls and types for SwiftというApple製のSwift Packageを利用することにしました。 ...

2023-02-16 · 2 分

MIXIでインターンした話 in 2022

昨年に続いて株式会社MIXIにてDive into MIXIというインターンシップでMIXIのminimo事業部にてiOSエンジニアとしてインターンさせていただきました。 tl;dr みなさんも応募しましょう! 選考について 昨年お世話になった人事の方から今年の夏のインターンにお誘いいただき、自分としても昨年非常に良い経験ができたと感じていたので、今年も応募することにしました。昨年のプロセスと同様に、最初に人事の方との面接、その後エンジニアの方との面接を経て今年のインターンにも合格をいただきました。 待遇、環境、期間等 昨年と同様の待遇で、期間についても全面的にこちらの希望に沿った形にしていただきました。今年は日程のほとんどをオフィスでの勤務ができたので昨年より多くのコミュニケーションを取ることができたのはよかったかなと思いました。 インターン期間中に取り組んだこと メニュー新規作成時に、任意で画像を追加できるようにする 最初に取り組ませてもらったタスクは機能改善形のタスクでした。minimoでは美容師(やその他施術者)のユーザーがメニューを登録するステップがあるのですが、メニュー新規登録時に画像を追加する項目がないということが問題として挙げられておりそれの改善を行いました。この機能の経緯としては以前は必須項目としてあったが掲載のハードルを下げるために無くしたということでしたが、メニューに画像がある状態のほうがお客様は予約しやすいという判断がされてその修正を行いました。修正前では、画像を追加したい場合は、「新規作成」→「作成したメニューを編集」の手順を踏む必要があり、手間がかかるということを変更しました。 最終的におこなった変更自体はとても小さなものになりましたが、作業をする中でデザインファイルと実際の実装との差異を見つけたり、仕様の詳細について確認する必要があったりと、業務の進め方について学びが多いタスクになりました。 Swift Package Manager自動アップデートワークフロー作成 CocoaPods, RubyGemsでは同様の仕組みを運用していたので、Swift Package Managerで管理しているライブラリも同様の仕組みを利用していきたいという動機がありました。またライブラリの管理をSwift Package Managerにできるだけ移行していきたいこともあり将来的には必要になることがわかっていました。 この仕組みを実現する上でXcode内蔵SPMを利用しなければいけないことがトリッキーでしたがxcodebuild -resolvePackageDependenciesをうまく利用することで想定していた動作を実現することができました。最終的にfastlaneのカスタムlaneをBiriseから定期実行して利用します。 SwiftLintルールの改善 minimoではコード品質の維持のためにSwiftLintを利用していました。そこで新たに役にたつと思われるルールを追加しました。追加したのは以下のルールです。 explicit_init trailing_closure redundant_nil_coalescing cyclomatic_complexity(ignores_case_statements = true) xct_specific_matcher SwiftLintの自動フォーマット機能を利用することで比較的簡単にルールを適用することができました。またこれらのタスクを通してSwiftLintへのコントリビューションをすることもでき、面白い経験ができたタスクとなりました。 ビルド時間計測システム構築 iOSアプリのビルド時間を継続的に監視する仕組みの構築を行いました。ビルド時間の増大は開発者の体験を損ねる要素の一つであり、ビルド時間に影響を与えうる変更をいくつか自分で行なっていたこともあり、継続的に計測する仕組みを用意することには意味があると考えてこのタスクに取り組まさせていただきました。簡単に仕組みを説明するとBitriseのワークフローの定期実行機能により、GitHub上にあるコードに対してfastlaneの独自laneを実行します。そのlaneの中ではhyperfineというコマンドを使いxcodebuildがアプリをビルドするのにかかる時間を計測します。そしてその結果をJSONにエクスポートしAWS S3のバケットに保存します。S3に保存されたJSONはrundeckという別のサービスを経由してBigQueryに送られます。最終的にLookerというツールを利用しビジュアライズしました。 このタスクでは、今まで自分が利用したことのない技術を扱うことができ、とても勉強になりました。また多くの社員の方に助けていただき、いろいろな方とコミュニケーションを取りながら進められたのでよかったです。 リファクタリング コンパイル時間が長いところのリファクタ 複数の変数に分ける 型情報の追加 マジックナンバーの定数化 ローカルでは.swiftファイルが変更された時のみSwiftLintを実行 Build Phase Script内で.swiftのファイルの変更時のみ SwiftLintを実行するように変更 感想 今回のインターンでは開発環境の改善に関連したタスクを色々とやることができ新しい経験を得ることができてとても面白かったです。一年ぶりにコードベースを見返すと違った視点で見れることも多く、それもまた面白い経験でした。また去年インターンさせていただいた時よりも多くの方々とコミュニケーションを取ることができたと思うのでよかったです。

2023-01-20 · 1 分

2022年の抱負

2022年の抱負を書き残しておきます。 Rustを学ぶ ずっとSwiftをメインでやり続けてきたのでそろそろ他の言語もしっかり使えるようになりたいと思います。Rustを選んだ理由はなんかかっこいいから! 他の言語を学ぶ 英語以外の外国語の勉強をしたいと思っています。中国語(普通語)かフランス語いいなと思っていますが、決めきれていないです。Duolingoとか使えばどっちもやるのもありかもしれないです。 OSSへの貢献 今年はOSSにもっとコントリビュートしたり、自分のOSSを開発したりしていきたいです。 アルゴリズムの勉強 LeetCode等のコーディングテストとかで出るようなアルゴリズムの問題がすごく苦手なので、今年はしっかり取り組んでいきたいと思います。競プロをやればいいのかもしれない。 年が明ける前に出せなかったブログのネタも出していきたいです。(学校の授業が重すぎて手が回る気がしないですが…)

2022-01-06 · 1 分

HugoのエイリアスでもOGPを適用したい

最近、ブログのジェネレーターをHugoに乗り換えて色々機能を見ていく中で特に便利だと思ったのがエイリアスの機能でした。一つ残念だったのがデフォルトの状態だとエイリアスのURLにはOGPのメタデータが付与されないため、例えばTwitterで投稿されたリンクがTwitterカードとして展開されないという点でした。(自分が利用しているAnubisテーマだと通常のページにはOGPメタデータはデフォルトで挿入されるようでした。) 解決策 エイリアスのテンプレートに独自の変更を入れることでメタデータを伝播させることができました。 1<!DOCTYPE html> 2<html> 3 4<head> 5 {{ if .Page }} 6 {{ template "_internal/opengraph.html" . }} 7 {{ template "_internal/twitter_cards.html" . }} 8 <title>{{ .Page.Title }}</title> 9 {{ else }} 10 <title>{{ .Permalink }}</title> 11 {{ end }} 12 <link rel="canonical" href="{{ .Permalink }}" /> 13 <meta name="robots" content="noindex"> 14 <meta charset="utf-8" /> 15 <meta http-equiv="refresh" content="0; url={{ .Permalink }}" /> 16</head> 17 18</html> 上記のHTMLをlayouts/以下にalias.htmlとして保存することでエイリアスのURLをポストした際もメタデータをうまく伝えてくれます。Card Validator | Twitter Developers でしっかりメタデータが渡せているか確認できます。 ...

2021-12-21 · 1 分

Jumpが便利

最近使い始めたJumpコマンドが便利という話。Rebuild.fmの#313を聴いていて初めてJumpコマンドについて知りました。 インストール macOSであれば brew install jump でインストールですることができる。その他の詳しいセットアップはIntegration)の項目を参照してください。 機能 インストール後、デフォルト設定の場合j somethingでsomethingにファジーマッチする使用頻度の高いディレクトリに移動してくれる。新しいディレクトリ等は一度cdコマンドなどで一度そのディレクトリまで移動しないと候補としてカウントされないので注意が必要です。

2021-12-21 · 1 分

ミクシィでインターンした話

2021年の8/16から9/10までDive into mixi GROUPというインターンシップでmixiグループのminimo事業部にてiOSエンジニアとしてインターンした記録です。 ミクシィのオフィスから見えるG社 tl;dr ミクシィは最高なので全員応募しましょう! 選考 2021年の夏にインターンする先をさがしていたところ、ミクシィのインターンの募集を見つけて応募しました。 書類選考通過の連絡が来て一安心した後、面接の連絡が来ました。今回のインターンシップでは人事の方との面接、社員の方との技術面接、配属候補の組織の方との面接のプロセスがありました。 技術面接までは問題なく進んだのですが、最後の配属先候補の方との面接ではあまり候補の組織とのマッチがないので不合格ということになってしまいました。 ただその後で、技術面接をしていただいた社員の方が所属していたminimoで再面接していただけることになりました。そしてminimoのエンジニアの方との面接ののち、無事に合格をいただき、minimoでのインターンが決定しました。 最初に落ちた時は割と凹みましたが、結果的に自分とあった組織でインターンすることができよかったなとも思います。またインターンとはいえ配属先候補とのマッチをしっかり選考過程で考慮されるのは、お互いの時間を最大限有効に使うという意味でとても良いなと思いました。 環境・待遇 【期間】 2週間以上から応相談 ※ サービスによって異なりますので、面接時に確認させていただきます ※ 開始日は、毎月1日か16日のいずれかになります 【勤務時間】 10:00~19:00(休憩1時間) 【時給】 時給 2,500円 引用元 時給に関して 大学生が応募でき、エンジニア内での職種の制限がないインターンシップの中ではかなり高い方なのではないかなと思います。 インターンシップの期間に関して 自分の都合に完全にあわせていただきました。一つ注意しなければいけないのは入社日が毎月1日か16日だという点です。終わりの時期がずらせない場合は面接の時期によっては二週間近くインターン開始できないまますぎてしまう可能性もあるので、なるべく早く応募して選考プロセスを開始するのがいいと思います。 リモートワーク 今回のインターンシップ中は基本的にリモートで業務を行いました。渋谷スクランブルスクエアのオフィスに行く機会が少なかったのは残念でしたが、それでも綺麗なオフィスに何度か行くことができよかったです。ミクシィでは事業部ごとにリモートワークの方針を決めており、minimoでは週一出社が推奨されていたので僕もそれにしたがい基本的に週一でオフィスに出社していました。他の事業部のインターンの方はまた別のルールで出社していたりと柔軟に対応されている印象でした。 インターン期間中に驚いたこと 研修 入社手続きが済んだ後に、オンラインでのハラスメント、コンプライアンス等に関しての研修がありました。その量が意外と多くて個人的に驚いたことを覚えています。研修項目が多いというのは必ずしも良いこととは限りませんが、僕はミクシィという会社が持つ価値観を知ることができる良い機会だったなと思います。 エンジニア以外の各チームについての紹介ミーティング minimoのチームにジョインした後でまずエンジニアを束ねる立場の方との1on1があり、minimoのエンジニア組織についての説明を受けました。ここまでは自分の予想の範囲内でしたが、その後でエンジニアリングとは関係ない他のチームについて各組織のリーダーの方達から一対一で説明を受けました。インターンに対してここまで時間を割いているのがすごく意外でしたが、それによりminimoという事業やチームについて深く理解することができ、インターンの経験がより良いものになったなと思います。 インターン期間中に取り組んだこと 二つのタスクをメンターの方々と一緒に進め、それと同時にiOSアプリのコードベースのリファクタリングを行いました。 タスク①:誤ったログアウトを防止する 前提 minimoのiOSアプリはAppleの審査の都合上、実際の登録プロセスを経ずに「ログアウト」する動線が存在していました。 課題 「ログアウト」と名乗っているがアカウントを他のSNSアカウント、メールアドレス等に連携していない時は実質アカウント削除と同等の処理になっていました。 アカウント未連携だと、ここでログアウトしてしまうと、ポイントなどが失われてしまう状況。 この事象に伴うサポートも一定数発生していた。 古いデザインのリプレイスが途中までになっていた。 行った改善 「ログアウト」を押すとアラートが出るように変更し、同時にアカウント連携を促すように変更。 ログアウトを押した時も、再確認をするようにアラートを追加。 Google Analyticsとの連携を実装。 アカウント管理画面のデザインを新規のものにリプレイス。 タスク②:予約詳細画面の一部ユーザビリティ改善 課題 予約詳細画面のユーザビリティにiOSとAndroidに差異がある。 予約後、サロンへのアクセスを調べる方法が不足している。 行った改善 予約詳細画面に直接、地図アプリを開く動線を追加で実装。 リファクタリング first(where: ... )を使うように変更 minimoのiOSアプリのコードベースの中には 1 .filter { ... }.first を利用している部分がいくつかありました。これは不必要に配列の全要素をループで見に行くことになるので、常に最悪ケースの時間がかかることになります。これを ...

2021-12-17 · 1 分

zinitを導入した

macOSでのデフォルトのシェルがzshになって久しいですが、それに合わせて.zshrcを適当運用してきたことのつけがzshの起動速度に影響してきたのでどうにかしようとした記録です。 zinitとは zsh用のプラグインマネージャーであり、zshの高速化ができるらしいという話を聞いたので試してみることにしました。自分は主に https://zenn.dev/xeres/articles/2021-05-05-understanding-zinit-syntax https://watiko.net/2021/12/05/renew-zshrc/ の記事とGitHubのREADMEをみながら進めました。 計測 hyperfine 'zsh -i -l -c exit'で計測してみたところ起動に約2秒かかっていることがわかりました。次にこの記事で紹介されているzprofの機能を使って関数毎にかかっている時間を調べました。その結果、補完機能関連の部分に多く時間がかかっていることがわかりました。 zsh-users/zsh-completionsのインストール方法の変更 まず自分はローカルにインストールされているcompletionのファイルをzinitが、見に行くように設定しましたが、それだと補完がうまく効くコマンドと効かないコマンドが出てきてしまいました。その原因は自分がzsh-completionのディレクトリに関係ないサードパーティの補完ファイルを入れていることでした。なのでそのサードパーティの補完ファイルをsite-functions/以下に移動させた後、Homebrew経由でインストールされていたzsh-users/zsh-completionsをzinit経由でのインストールに切り替え遅延ロードすることにより、起動時間の短縮を達成しました。 結果 hyperfine 'zsh -i -l -c exit'でもう一度計測したところ、1秒を切るくらいの時間で起動できるようになっており、無事に高速化に成功したようです。 参考 https://watiko.net/2021/12/05/renew-zshrc/ https://unix.stackexchange.com/questions/26555/fpath-in-zsh-functions-and-site-functions https://zenn.dev/xeres/articles/2021-05-05-understanding-zinit-syntax

2021-12-14 · 1 分

HexoからHugoに乗り換えた

今まではHexoを使っていたがなんかいけてない気がしたので乗り換えることにした。 Publishとの遭遇 最初は自分がSwiftをメインに使っているということもあってSwift製の静的サイトジェネレータであるPublishを使おうとしたがユーザー直下のGitHub Pagesでの運用しか想定されていないようでレポジトリ単位のGitHub Pagesにデプロイするとルーティングがぶっ壊れたので断念。 このごたごたの中でGit管理してない元mdをファイルを消してしまい、生成されたhtmlからなんとか復元する羽目になってしまった。 Hugoとの出会い そんなことをして最終的にたどり着いたのがHugoだった。個人的にはかなり使いやすく、今のところはなんの問題もなく運用できている。本家サイトのQuick Startに従うだけでGitHub Actionsを利用したデプロイ環境を整えるにまで来れたので満足。 デフォルトの機能でエイリアス(URLのリダイレクト)を設定できるのがすごい便利だと思ったが、他のジェネレータにも同様の機能があることはあるようだった。

2021-12-12 · 1 分

数学を好きになるために読んだ本

こんにちは、@Kotarong1 です。突然ですが、皆さんは数学好きですか? 自分は高校の頃から、数学が苦手科目で、一番嫌いな科目と言っていいほどでした。しかし、プログラミングを学んでいく上で、数学をもっと理解しなければいけないと思い、まずは数学を好きになることから始めることにしました。今回は、そのために読んだ本などを紹介します。 数学ガール 一つ目は「数学ガール」です。この本はこの界隈では知らない人がいないというほど有名なのではないでしょうか。 「数学ガール」シリーズは、 高校生の「僕」が数学ガールたちと数学に取り組む物語です。 読み物形式でありながら、取り扱う数学的内容は本格的。 ひとあじ違う数学にチャレンジしてみませんか。 学生さんから社会人まで大人気! コミックスも英語版もあります。 もちろん、電子書籍も! (引用元) 僕はこの本を読んで様々な大学数学に出てくる概念に初めて触れることができました。そのおかげで、自分がやっている数学がどう発展した内容へと繋がっていくのかというのかを知ることができてとても面白かったです。このシリーズは扱っている内容が高度なので(少なくとも僕にとっては)全てを理解しつつ読むのは時間がかかりすぎると思ったので、僕はわからないところは飛ばしてとりあえず全体を読み切るという方針で読み進めました。これから勉強を進めたら、また読み直してみるのが楽しみです。 数字であそぼ。 二つ目は「数字であそぼ。」という漫画です。 「一度見たものは決して忘れない」ほどの超人的な記憶力を持ちながら、微分積分がさっぱり分からず留年する主人公、パチスロにハマって単位が取れない友人、問題を考え過ぎてパンツ一丁で路上を歩く教授……。 こんなキャラクターたちが登場する「数字であそぼ。」(月刊flowers/小学館)は、大学数学の世界を描いたコメディー漫画。一見ぶっ飛んだ話にも見えますが、実は元・京大生への取材をベースに制作された作品で、ネット上ではリアルだと共感する声も現れています。(引用元) 自分のことを頭が良いと思っていた主人公が大学に入って初めての数学の授業が理解できず挫折し留年してしまうという漫画です。 僕がこの漫画が好きなところは、主人公が自分と同じく数学が苦手ということです。(とはいっても、驚異的な映像記憶能力によって試験はこなせてしまうという天才。)主人公が大学数学の世界に飛び込んでいくのと一緒に学んでいける気がするのが良いところだと思います。 紹介記事 はじめアルゴリズム 三つ目は「はじめアルゴリズム」という漫画です。 関口ハジメ(小5)はみんなが見えない世界を数学で解き明かしたい。そんな彼は老数学者・内田豊と出会った。天才的な才能があるハジメは内田に導かれ、才能を広げていく・・・。数学がちょっとやりたくなり、世界の見え方が変わってくる漫画、スタート。 老数学者・内田豊は出身地である米作島での講演後、ふらりと立ち寄った母校で数字と楽しく遊ぶ関口ハジメ(小5)に出会った。彼は独自の式や考えで、世界を解こうとしていた。雲の動き、木の枝の分かれ方、トンボの翅脈、自動車ナンバー、学級委員決め・・・。ハジメは見えない世界を数学で解き明かしたい。読めば、数学が少し好きになる。天才が少し好きになる。世界の見え方が変わってくる。(引用元) この物語は、天才型の数学大好き少年が老数学者と出会い数学の才能をより開花させていくお話です。この漫画はお話の中でいろいろな数学の概念に触れて主人公が理解していくので、それとともにいろいろな数学的概念に触れることができて楽しいです。 結論 もちろん、これらの本を読むだけでは数学力は上がりませんが、数学が苦手な人にとってはこういう優しい本で様々な概念に触れるところから入ることで数学を勉強するモチベーションを上げていければなと思います。 もし、このブログを読んだ方でおすすめの本がある方は是非Twitter等で是非教えてください!

2019-12-25 · 1 分