カテゴリー: Daily

日々の活動について。

Summer Internship 2019 @ Recruit


「Recruit Internship for Specialist 2019 -ENGINEER/DATA ENGINEER-」に参加してきました。

きっかけ

「リクルートのエンジニアインターンはいい」と聞いたので参加することにしました。

色々見ていると、インターン生に要求されるレベルが高いことがバンバン伝わってくるので参加したらかなり成長できるなと感じた点が大きいです。

選考

基本的な流れは ES -> コーディングテスト -> 人事面接 -> 最終面接 だったと思います。

ESはフォーマットが決まっていたので、時間をかけてちゃんと書きました。辛かったです。

コーディングテスト

CSの知識を問うものからSQLやアルゴリズムの問題がありました。一度使ったことがあるプログラミングテストツールで安心した記憶があります。

面接

人事面接は、作ったアプリについてや趣味など一般的な面接でした。大阪からWeb面接で受けました。

最終面接は東京本社に受けに行きました。詳細は控えますが、今までに受けたことがない形式で楽しかったです。開発アルバイトの実務経験が役に立ちました。

内容

実際に参加する前に、事前面談といった形でどういった案件に参加するかの説明がありました。ESでは「Androidエンジニアとしてやっていきたい」「ソフトウェアアーキテクチャや設計について学びたい」と書いていたので、インターンではモバイルアプリの開発に参加することになりました。ちなみに、参加後も定期的に「やりたかったことをやれてるか?」みたいな質問があるので、案件が合わないなと思っても後から調整してくれるみたいです。すごい。

僕が所属したのはリクルートライフスタイルでじゃらん(にゃらんが可愛い)などのサービスを開発している所でした。

取り組んだこと

具体的には、●●●に●●●を●●●ため●●●を用いてスクラッチで開発するといったことをしていました。●●●に触れるのは初めてだったのでキャッチアップが大変だったのを覚えています。

LT

インターン期間中に社員の方とインターン生が参加するLT会が2回ほどありました。

僕はLTをしたことがなかったのですが、せっかくの機会なので初LTをしました。趣味でやっているMinecraftマルチサーバについて話しました。比較的評判が良かったので嬉しかったです。今後も機会があればLTやっていきたいですね。

過去の参加記を見てるとTシャツとか貰えたみたいですが今回はありませんでした。残念。

ランチ

インターン生には一定額ランチ代が設定されているようで、チームの方に「こんな人と話してみたい」って投げるとシュッとランチが設定されます。すごい。

Androidエンジニア、Backendエンジニア、Mgrなど様々な方と話すことができました。これがめちゃくちゃ面白かったです。

感想

僕がいたのは比較的少人数なチームだったので設計について議論しながら実装できたので非常に面白かったです。また、日頃はAndroidやKotlinしか書いていないので他のフレームワークを使うのは非常に新鮮でした。

また、インターンランチで様々なロールの方にキャリアについて話を聞けたことで自分のなりたい将来像がかなり明確になりました。

この将来像をベースに、どういったキャリアを進めばいいのかを考えれるようになったのは大きな収穫でした。

また、リクルートは部署によってかなり雰囲気が違うみたいなので、そういった雰囲気を知れればよかったかなと思いました。

学んだこと

文章を書くのが辛くなってきたので箇条書きで許してください。

  • 設計を学ぶとは「設計で何を解決したいかを理解すること」
  • MgrとEMは対極にあるものではない
  • リーダーシップは大事、チームを引っ張るようなエンジニアになりたい
  • 組織の特徴によって求められるリーダーシップは違う

最後に

メンターの方、チームの方、人事の方、色々な方にとてもよくして頂きました。インターンに参加した目的を達成できただけでなく、多くの学びを得ることができました。

1ヶ月間、本当にありがとうございました。

Summer Internship 2018 @ mercari

8/1-8/31の1ヶ月間、メルカリのサマーインターンに参加してきました。

動機

学部4年になり、卒論もあるので今年はインターンは参加しないかなと考えていました。しかし、実際にインターンの応募期間が始まって先輩たちが楽しそうにしているのを見て、気がついたらエントリーをポチッと…

その後、趣味で開発したAndroidアプリをフルスクラッチでリファクタリングしていた時期が重なり、「Android+ソフトウェアアーキテクチャを学びたいな」と考えていました。

mercanの記事にiOSのリファクタリングの話が出ていて、もしかしたらAndroid版も新しいアーキテクチャに沿った開発が行われているのでは!?と希望を抱き応募。

あと、一番大きいのが「自分の持っているAndroid知識を全部ぶつけたらどのくらいの成果が出せるか」気になって仕方がない。周りにAndroidエンジニアがいないので、自分の価値が分からないでいました。

選考

募集職種は13種と多く、その中でも自分は、”Software Engineer(Android)”に応募しました。

理由は、自分の中で「Androidが一番詳しく、アウトプットを出せる」かなと。

選考の流れとしては

レジュメ・履歴書提出→技術テスト→面接

でした。特に変わったこともなく、無事合格できました。

印象

一番印象に残っているのは「アウトプットを出す」を求められたこと。1ヶ月と短い期間でいかにアウトプットを出すかを常に考えていた気がします。

他の参加記でも言われていますが、「インターンだから~」といった制約が一切ないので自信を持ってvalueを出せる環境があると感じました。

余談で、オフィスが非常に過ごしやすいのと無限自販機が最高によかった。

内容

配属されたのは、メルカリJPのAndroidアプリのチームでした。

インターン用にタスクが用意されているのではなく、実際に業務を行っていく形です。「実際の開発業務」を行えるのは本当にいい。

具体的には、採用しているアーキテクチャに沿って設計し、実装に落としていく作業をずっと行っていました。ソフトウェアにおける設計だけでなく、「正しいリリースフローはどういったものか」「PRにはレビュワーに対してコンテキストを残す」などチーム開発で重要な多くの学びを得ました。また、Koltinについて新しい知見を得ることができました。一番印象に残っているのはKotlin Fest に参加したことで、非常に感謝しています。

動機としてあった「自分の持っているAndroid知識を全部ぶつけたらどのくらいの成果が出せるか」については、十分達成できたと考えています。Androidについての知識は十分あると思えるようになった一方で、コンテキストを十分残すといった課題も見つけることができました。ソフトウェア設計においては、設計書の作成やレビューを通して多くのインプットがあり、まさに「自分の価値を知る、高める」インターン内容でした。

感想

自分の好きなプラットフォームで業務ができるのは最高に楽しかった。一日中Android Studioを開いてるって最高じゃないですか!?気がつけば1日・1週間が終わってる感覚に陥っていました。

メンターランチやチームビルディングを通して他のエンジニアの方とお話をすることもでき、今後のキャリアを考えていくために非常に参考になりました。また、アウトプット出す1つの方法として「ブログを書くこと」も再確認できたかなと。

今後は、今回得たインプットを積極的にアウトプットしつつ今しかできない様々なことに挑戦していこうと考えています。

メルカリが入っている六本木森ビル

EAGLE Educational License(アカデミックライセンス)を入手する方法

EAGLEにアカデミックライセンスが追加されたと情報を耳にしたのでホームページを確認すると、eagle_plans

。。。!、なんと本当にありました。

 

設計できる基板サイズが160*100mmとフリーライセンスより大きく、学生なら取るしかない。

 

ということで、用意されているフォーラムに情報を入れていると、

eagle_form_err

はい。怒られました。どうやらTLDが「.edu」でないとダメなようです。

ただ、ブログのQ&Aには

We have done what Autodesk does for all educational licenses and dropped the cost to $0!  So if you’re a student or a professor at a school or university & using the software for non-commercial applications, you are now entitled to a free copy of EAGLE!

とあるので学生なら取れる!前置きが長くなりましたがここから入手方法です。

セールスに直接メール

サポートにある「[email protected]」に以下のように英語でメールを送ります。

Dear CadSoft

Hi, Im a student of the National University in Japan.

I dont have a .edu email.
But, May I get the Eagle Educational License?

Thanks,
名前

署名

英語弱者で、残念な英文なので適当に書き直して下さい。。

学生だけどアカデミックライセンス欲しいという内容が伝われば大丈夫です。

返信がくるので返信する

しばらくすると、以下のテンプレメールが返ってきます。

Dear Mr 名前!

Thank you for your request for the EAGLE educational license! We are now a part of Autodesk and per policy are pleased to offer free educational licenses to students and accredited educational institutions.

To request your license, please provide us with the following information so I can register and send your license.

First Name:
Last Name:
School Name:
Department:
Title:
Address:
Address:
City:
State:
Country:
Email:
Contact Number:
Postal Code:

各項目を埋めるのですが、おおまかには

First Name 名
Last Name 姓
School Name 学校名
Department 学部or専攻
Title → Student
Contact Number +81電話番号
Postal Code 郵便番号

です。

CadSoft Vertriebからメールがくる

PDFが添付されたメールが来るので、そのPDFのリンクを踏みます。

eagle_pdf

インストールコードのキーファイルをダウンロード

リンクを踏むと

eagle_l_agree

このようなページに飛ぶので、「I agree」します。

eagle_l_code

 

すると、インストールコードを教えてくれるので、↑の黒塗りのコードをコピーして保存して下さい。

次のページでkeyファイルをダウンロードします。(スクショ撮り忘れました)

Eagleのライセンスをあてる

eagle_l_accept

あとは、上記のようにライセンスキーとコードを入れると認証されます。

 

やったね!

eagle_l

UnityのuGUIで文字間隔(カーニング)を行う方法

デフォルトでは、実装されてないようなのでメモ。

海外の公式ユーザーフォーラムにスクリプトが落ちてました。(バージョン5.3に対応しています。)

http://forum.unity3d.com/threads/adjustable-character-spacing-free-script.288277/

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

/*
 
Produces an simple tracking/letter-spacing effect on UI Text components.
 
Set the spacing parameter to adjust letter spacing.
  Negative values cuddle the text up tighter than normal. Go too far and it'll look odd.
  Positive values spread the text out more than normal. This will NOT respect the text area you've defined.
  Zero spacing will present the font with no changes.
 
Relies on counting off characters in your Text compoennt's text property and
matching those against the quads passed in via the verts array. This is really
rather primative, but I can't see any better way at the moment. It means that
all sorts of things can break the effect...
 
This component should be placed higher in component list than any other vertex
modifiers that alter the total number of verticies. Eg, place this above Shadow
or Outline effects. If you don't, the outline/shadow won't match the position
of the letters properly. If you place the outline/shadow effect second however,
it will just work on the altered vertices from this component, and function
as expected.
 
This component works best if you don't allow text to automatically wrap. It also
blows up outside of the given text area. Basically, it's a cheap and dirty effect,
not a clever text layout engine. It can't affect how Unity chooses to break up
your lines. If you manually use line breaks however, it should detect those and
function more or less as you'd expect.
 
The spacing parameter is measured in pixels multiplied by the font size. This was
chosen such that when you adjust the font size, it does not change the visual spacing
that you've dialed in. There's also a scale factor of 1/100 in this number to
bring it into a comfortable adjustable range. There's no limit on this parameter,
but obviously some values will look quite strange.
 
This component doesn't really work with Rich Text. You don't need to remember to
turn off Rich Text via the checkbox, but because it can't see what makes a
printable character and what doesn't, it will typically miscount characters when you
use HTML-like tags in your text. Try it out, you'll see what I mean. It doesn't
break down entirely, but it doesn't really do what you'd want either.
 
*/

namespace UnityEngine.UI
{
    [AddComponentMenu("UI/Effects/Letter Spacing", 14)]
#if UNITY_5_2 || UNITY_5_3
    public class LetterSpacing : BaseMeshEffect
#else
    public class LetterSpacing : BaseVertexEffect
#endif
    {
        [SerializeField]
        private float m_spacing = 0f;

        protected LetterSpacing() { }

#if UNITY_EDITOR
        protected override void OnValidate()
        {
            spacing = m_spacing;
            base.OnValidate();
        }
#endif

        public float spacing
        {
            get { return m_spacing; }
            set
            {
                if (m_spacing == value) return;
                m_spacing = value;
                if (graphic != null) graphic.SetVerticesDirty();
            }
        }
#if UNITY_5_2 || UNITY_5_3
        public void ModifyVertices(List<UIVertex> verts)
#else
    public override void ModifyVertices(List<UIVertex> verts)
#endif
        {
            if (!IsActive()) return;

            Text text = GetComponent<Text>();
            if (text == null)
            {
                Debug.LogWarning("LetterSpacing: Missing Text component");
                return;
            }

            string[] lines = text.text.Split('\n');
            Vector3 pos;
            float letterOffset = spacing * (float)text.fontSize / 100f;
            float alignmentFactor = 0;
            int glyphIdx = 0;

            switch (text.alignment)
            {
                case TextAnchor.LowerLeft:
                case TextAnchor.MiddleLeft:
                case TextAnchor.UpperLeft:
                    alignmentFactor = 0f;
                    break;

                case TextAnchor.LowerCenter:
                case TextAnchor.MiddleCenter:
                case TextAnchor.UpperCenter:
                    alignmentFactor = 0.5f;
                    break;

                case TextAnchor.LowerRight:
                case TextAnchor.MiddleRight:
                case TextAnchor.UpperRight:
                    alignmentFactor = 1f;
                    break;
            }
            for (int lineIdx = 0; lineIdx < lines.Length; lineIdx++)
            {
                string line = lines[lineIdx];
                float lineOffset = (line.Length - 1) * letterOffset * alignmentFactor;

                for (int charIdx = 0; charIdx < line.Length; charIdx++)
                {
                    int idx1 = glyphIdx * 6 + 0;
                    int idx2 = glyphIdx * 6 + 1;
                    int idx3 = glyphIdx * 6 + 2;
                    int idx4 = glyphIdx * 6 + 3;
                    int idx5 = glyphIdx * 6 + 4;
                    int idx6 = glyphIdx * 6 + 5;

                    // Check for truncated text (doesn't generate verts for all characters)
                    if (idx4 > verts.Count - 1) return;

                    UIVertex vert1 = verts[idx1];
                    UIVertex vert2 = verts[idx2];
                    UIVertex vert3 = verts[idx3];
                    UIVertex vert4 = verts[idx4];
                    UIVertex vert5 = verts[idx5];
                    UIVertex vert6 = verts[idx6];

                    pos = Vector3.right * (letterOffset * charIdx - lineOffset);

                    vert1.position += pos;
                    vert2.position += pos;
                    vert3.position += pos;
                    vert4.position += pos;
                    vert5.position += pos;
                    vert6.position += pos;

                    verts[idx1] = vert1;
                    verts[idx2] = vert2;
                    verts[idx3] = vert3;
                    verts[idx4] = vert4;
                    verts[idx5] = vert5;
                    verts[idx6] = vert6;

                    glyphIdx++;
                }

                // Offset for carriage return character that still generates verts
                glyphIdx++;
            }
        }

#if UNITY_5_2
        public override void ModifyMesh(Mesh mesh)
        {
            if (!this.IsActive())
                return;
 
            List<UIVertex> list = new List<UIVertex>();
            using (VertexHelper vertexHelper = new VertexHelper(mesh))
            {
                vertexHelper.GetUIVertexStream(list);
            }
 
            ModifyVertices(list);  // calls the old ModifyVertices which was used on pre 5.2
 
            using (VertexHelper vertexHelper2 = new VertexHelper())
            {
                vertexHelper2.AddUIVertexTriangleStream(list);
                vertexHelper2.FillMesh(mesh);
            }
        }
#elif UNITY_5_3
        public override void ModifyMesh(VertexHelper vh)
        {
            if (!this.IsActive())
                return;

            List<UIVertex> vertexList = new List<UIVertex>();
            vh.GetUIVertexStream(vertexList);

            ModifyVertices(vertexList);

            vh.Clear();
            vh.AddUIVertexTriangleStream(vertexList);
        }
    }
#endif

}

このスクリプトを追加後、「Add Component」>「UI > Effects」から「Letter Spacing」を追加してください。

できたてサーバー 総合施設完成!

 

spawn_f01

できたてサーバーにようやく総合施設が出来ました!

ここには、サーバー初心者さんへの案内やイベントへの移動などが入ります。

また、アドミンショップも入っています!!

そのため旧アドミンショップは閉店…

 

ぜひ、ログインの際は中を覗いてみてください!。

 

では。

SRC2015 Remisserious手動機 まとめ

まず、SRC2015お疲れさまでした。

SRCで初めてのロボコンを経験できました。

 

で、私(@ken_kentan)は手動機の制御(回路)を担当したのでその部分の説明をさせていただきます。

足回りについて

手動機の足回りは3輪オムニホール(ウレタン)を使っています。

2輪ではなくオムニにした理由は、姿勢を保ったまま全方向に移動できるので資材を掴む際の位置合わせがしやすいと考えたからです。

上の動画が、手動機足回りv1の制御テスト動画です。

DCモーターの出力は最大80%での動作です。制御には一般的な式を使っています。

SRC2015_Bteam_Manual/src/main.cpp (249~252行)

オムニは重心など様々な要因によってズレが生じるのでそれを6軸ジャイロを使い補正をかけています。

SRC2015_Bteam_Manual/inc/machine/machine.h (261~289行)

ノイズによって静止している状態でも値が加算されていくのでそれをmachine.hのGyroクラス・set()で除去しています。(かなり大雑把)

築城機能について

当チームの作戦では、実機内でお城を完成させることによって移動によるタイムロスをなくすというものでした。

そのため、資材を掴むアームハンドと完成したお城を押し出す上下機構のお皿を搭載しました。

・押し出しテスト

ハンド、お皿ともに上下する必要があり、これらを手動で動かすのは操縦者の技量に依存しすぎると判断しそれぞれの工程をボタン一つで行うように自動化しました。

・自動化

(一部、取得に失敗しているのはサーボ基板の不具合です。)

上下機構にそれぞれポテンショメータを付け、現在の高さを取得するようにしてそこからP制御で指定の位置までなめらか(?)に上下させました。

築城機能はmachine.hのBuilderクラスにぶちこんであるので適当にご覧ください。

プログラムでは、if(completed_arm == false || cnt_ture_arm < 5) break;というように指定の位置に移動が完了するまでサーボを動かさないようにしています。

本番で、押し出せなかって原因がここにあります。

上下機構のモーターがゆるみで空回りしたため指定位置まで上がずcompleted_plateがfalseのままで押し出すことができなかったのです。。。

自動化を行うなら自動化した全ての動作を手動でも行えるようにしなければならないと身をもって知りました。

サーボの制御はメイン基板から指示をArduinoに投げています。

2015-08-20 20.11.33

 

本来は、CAN通信を行う予定だったのですが上手くいかずOnとOffの信号を3本線で送り、3bitで通信(?)しています。

 

と、制御っぽいことは以上です。

SRC前日に手動機が石垣を持ったままエリアに侵入できないと判明(見逃していた)ため急きょハードと制御を改造したためウンコードが生まれてしまいました✌

次にロボットを作るときは1か月ぐらいの練習期間が必要だと実感しました。

ここまで読んでいただきありがとうございました。

マイクラに影MODを入れた

マイクラの影MOD、一度は入れてみたいと思っていました。

導入時にOptiFineの設定で躓いたが無事導入することができました。

シェーダーパックは「SEUS-v10.1-Ultra-DOF」を使用しました。

OptiFineとGTX970 SLIのおかげで、導入後も~60fpsで安定動作をしてくれています。

おまけに、我サーバーである「できたてサーバー(猫)」のスポーン地点で夕焼けをパシャリ

2015-07-19_00.31.11

 

予想以上に綺麗で大満足です。

それと、スポーン地下に地下鉄を整備しました。

 

ではでは。