きときと

日々のあれこれ ソフトウェアエンジニア

Ubie株式会社に入社しました

はじめに

2024年1月にUbie株式会社へソフトウェアエンジニアとして入社しました。
大阪から、フルリモートで勤務しています。
まだ入社したばかりの感覚がありますが、気がつけばもう2ヶ月が経とうとしています。
この機会に、転職を決意した理由や、実際に入社してから感じていることについて書いていこうと思います。

Why Ubie?

Ubieに入社を決めた理由は、「テクノロジーで人々を適切な医療に案内する」に共感し、目指す世界の実現に向き合いたいと思ったためです。
私生活では、犬を飼い始めたり最近子供が生まれたことで、医療の重要性が以前にも増して身近なものになりました。
その中で、医療の体験をより良いものにすることが、身近な人々の生活を豊かにすることができるのではと考えました。
加えて、選考過程でお会いした方々も魅力的だったのもポイントでした。
代表の阿部との面談を通して、一緒に働き、目指す世界の実現に向き合いたいと思ったことを覚えています。

note.com

入ってみてどうだったか

入ってみて驚いたことは熱量の高さです。
Ubieの掲げるIdentityに「Giant Leap」というものがあります。
非連続な未来を実装することを指しており、社内では「ジャイリー」と略され普段使いされています。
正式入社前に全社オフサイトイベントに参加させてもらったのですが、そこでは職種問わずこの「ジャイリー」を実現するためにはどうしたらいいか、という話が繰り広げられており、高い熱量を感じたことが強く印象に残っています。

この熱量を保ち続けるためにUbieではカルチャー構築、浸透に力を入れているのですが、自分のように新しく入った者がそのカルチャーを理解し同じ質感で使いこなすのは大変です。
それを支えるためにカルチャーメンターという仕組みがあります。
メンターとのやり取りを通してカルチャーに対する不明点やこれまでの経験とのギャップを理解し、それを埋めるためのアクションを棚卸し、カルチャー理解を支援する仕組みが整えられています。

地方からの働き方

自分の場合、月に一度は東京の本社へ出社し、チームメンバーとチームイベントをしたり、全社オフサイトミーティングに参加して対面でのコミュニケーションを取っています。
また、自分以外の関西在住メンバーもおり、定期的に関西での交流会も開催し交流しています。
みんな温かく迎え入れてくれるので毎回楽しいです。

普段の開発業務はというと、新しい環境の中でわからないことだらけ、キャッチアップの毎日なのですが、チームメンバーに助けてもらいながら楽しくやっています。
前述のカルチャー面でのメンターに加え、業務面でもメンターが付いてくれる仕組みがあり、日々助けてもらっています。
メンターに関わらず他のチームメンバーも呼びかけたらすぐ相談に乗ってくれ感謝の毎日です。

おわりに

Ubieでは、ミッションの実現に向けて一緒にプロダクトを作っていく仲間を募集しています。
私たちと一緒に、「テクノロジーで人々を適切な医療に案内する」ことに少しでも興味を持っていただけた方はぜひカジュアル面談にお申し込みください!!

recruit.ubie.life

recruit.ubie.life

VSCode での Go 開発環境設定 gopls(Language Server)で設定してみる

VSCode での環境設定について改めて調べたので、内容を備忘録としてまとめます。

これまで VSCode で go のコードを書く際の補完やフォーマットを godoc goimports で行うよう設定していましたが、 Language Server(LSP) で行うよう再設定しました。

環境

$ go version
go version go1.12.7 darwin/amd64

$ code -v
1.36.1

変更前

変更前の settings.json です。
前述の通り補完やフォーマットを godoc goimports で行うよう設定しています。

{
  "[go]": {
    "editor.formatOnSave": true
  },
  "go.autocompleteUnimportedPackages": true,
  "go.docsTool": "godoc",
  "go.formatTool": "goimports",
  "go.formatFlags": ["-w"]
}

変更内容

それでは Language Server で行うようにしていきます。

gopls を インストールする

gopls とは、 go の Language Server Protocol(LSP) の実装です。
github.com

go get します。

$ go get golang.org/x/tools/gopls

settings.jon の更新

下記を参考に settings.jon を更新していきます。

下記の様に更新しました。

{
  "go.useLanguageServer": true,
  "go.alternateTools": {
    "go-langserver": "gopls"
  },
  "[go]": {
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports": true
    }
  },
  "go.autocompleteUnimportedPackages": true,
  "gopls": {
    "usePlaceholders": true
  }
}

詳細

気になる設定の詳細を見ていきます。

  • "go.useLanguageServer": true
    Language Server を使用するかのフラグ。
    true の場合、 go.docsTool go.formatTool などの設定は無視される様でした。

  • "go.alternateTools": {"go-langserver": "gopls"}
    どの Language Server の実装を使用するかの設定。 bingo も設定できる様ですが、GitHubを見ると gopls に統合される模様なので、将来的に設定する必要がなくなるかもしれません。
    https://github.com/microsoft/vscode-go#setting-to-change-the-language-server-being-used

  • "gopls": {"usePlaceholders": true}
    補完を行ったとき、メソッドの引数にプレースホルダーを入力してくれます。
    例えば fmt.Printf の場合、下記になります。

fmt.Printf(format string, a ...interface{})

 設定すると↓の様に警告が出ましたが、問題なく動作しました。
 f:id:EF-0512:20190715182709p:plain

まとめ

まだまだ設定内容の詳細が調べきれていないものもありいい感じの設定かはわからないですが、ひとまず自動フォーマットやコード補完が一通り動く様になりました。
ドキュメントなどまだ情報が少ないですが、GitHubリポジトリや issue を見ていると更新の流れも速そうなので、ウォッチしても更新していこうと思います。

参考

github.com
github.com
github.com mattn.kaoriya.net

Visual Studio for Mac・EntityFrameworkCore2.0でPostgreSQLに接続する

EntityFrameworkCore2.0・NpgsqlをつかってMacPostgreSQLに接続して見ます。
Npgsqlの公式に説明があるので、そのように進めていきます。
Getting Started | Npgsql Documentation

環境

今回サンプルを作成した環境です。

dotnet --info
.NET コマンド ライン ツール (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.12
 OS Platform: Darwin
 RID:         osx.10.12-x64

データベース準備

まず接続先のデータベースを用意します。 DockerでPostgreSQL9.6の環境を構築しました。 下記を参考にさせていただきました。

Docker公式イメージで開発用RDBをゲットだぜ(PostgreSQL編) « LANCARD.LAB|ランカードコムのスタッフブログ

データベースへ接続できたら、適当にデータベース・テーブルとテスト用データを作成しておきます。

CREATE DATABASE netcore_ef;

CREATE TABLE members
(
    id serial PRIMARY KEY,
    name character varying(32) NOT NULL
);

INSERT INTO members(name) VALUES('test1');
INSERT INTO members(name) VALUES('test2');

パッケージインストール

VisualStudioを開き、コンソールアプリケーションを作成。
NuGetでパッケージインストールします。

  • Npgsql.EntityFrameworkCore.PostgreSQL:2.0.0
  • Microsoft.Extensions.Configuration.Json:2.0.0
    Database設定情報をJson形式の設定ファイルから取得する際に必要になります。

DbContext作成

データベースへアクセスするためのDbContextを作成します。
データベースの情報は設定ファイルから読み込むようにします。
先ほど構築したデータベースが接続先となるように、設定ファイルappsettings.jsonを作成します。

■appsettings.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=HOST;port=PORT;Username=USERNAME;Password=PASSWORD;Database=DBNAME"
  }
}

■DbContext

using Database.NpgsqlEF.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace Database.NpgsqlEF
{
    public class DatabaseContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            optionsBuilder.UseNpgsql(config.GetConnectionString("DefaultConnection"));
        }

        public DbSet<Member> Members { get; set; }
    }
}

OnConfiguring()メソッド中で、ConfigurationBuilderに先ほど作成したappsettings.jsonの設定をバインドしています。
データプロバイダにNpgsqlを使用する場合、optionsBuilder.UseNpgsql(接続情報)のように設定します。

Entity作成

EntityFrameworkCoreで扱うEntityクラスを作成します。
先ほどデータベースに作成した、membersテーブルに対応するクラスを作成します。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Database.NpgsqlEF.Entities
{
    [Table("members")]
    public class Member
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("name")]
        public string Name { get; set; }
    }
}

DataAnnotationsについて、Table, Column属性 はそのままの通り、データをマッピングテーブル名・カラム名を設定します。
Key属性はプライマリーキーを設定します。 www.entityframeworktutorial.net

実行

それでは実行して見ます。
単純にSelectしてコンソールにデータを出力します。

using System;
using System.Linq;
using Database.NpgsqlEF;

namespace Netcore_EF_Npgsql
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var context = new DatabaseContext())
            {
                var __ = context.Members.ToList();
                Console.WriteLine($"Id:{__[0].Id}, Name:{__[0].Name}"); // Id:1, Name:test1
                Console.WriteLine($"Id:{__[1].Id}, Name:{__[1].Name}"); // Id:2, Name:test2
            }
        }
    }
}

下記のように出力されました。
問題なくSelectできています。

Id:1, Name:test1
Id:2, Name:test2

まとめ

非常に簡単に実践できました。
. NET Framework、EntityFramework6.Npgsql よりも、依存関係によるエラーなどもなくお手軽に試すことができる気がします。
次はコードファーストによるマイグレーションを試してみようと思います。

サンプルプロジェクト

今回作成したサンプルをGitHubにアップしています。
github.com

参考

NpgsqlとEntityFramework Coreを使ってPostgreSQLをCRUDする - け日記
.NET Core(Entity Framework Core)でCode Firstする - ryuichi111stdの技術日記

ASP.NET Core 1.1 のWebアプリケーションを ASP.NET Core 2.0 にマイグレーションする

公式に.NET Core マイグレーションの方法があがっているので、実践してみます。 docs.microsoft.com

シンプルな.NETCore1.1のWebアプリケーションをASP.NETCore2.0にマイグレーションして見ます。 Visual Studio 2017を操作してやっていこうと思います。

ターゲットフレームワークをアップデートする

対象プロジェクトを右クリック > プロパティ > ターゲットフレームワーク
.NET Core 1.1 → .NET Core 2.0へ変更する。
f:id:EF-0512:20170911212717p:plain

NuGetパッケージ更新

.NET Core 2.0 に伴い、パッケージの依存関係が整理され、
参照が1つのパッケージに統一されたようです。
それにあわせて依存関係を整理します。
docs.microsoft.com

  1. 依存関係を右クリック > NuGetパッケージの管理 からNuGetパッケージマネージャーを開く

  2. “インストール済み"タブ を開き、不要なパッケージをアンインストール
    f:id:EF-0512:20170911212910p:plain
    これを↓のような感じに
    f:id:EF-0512:20170911214129p:plain

  3. Microsoft.AspNetCore.Allをインストール
    検索してインストールする。
    f:id:EF-0512:20170911215218p:plain
    “インストール済み"タブは↓の様になります。
    f:id:EF-0512:20170911220122p:plain

.NET Core CLI tools を更新する

こちらはVisual Studio上からの更新方法がわからず、.csprjを直接更新しました。
私の環境では下記の様に更新しました。
■変更前

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" />
</ItemGroup>

■変更後

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>

PackageTargetFallbacの更新

こちらも直接.csprjを更新しました。
■変更前

<PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
</PropertyGroup>

■変更後

<PropertyGroup>
    <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
</PropertyGroup>

Program.csの更新

公式ドキュメントを確認して更新する。

Startup.csの更新

公式ドキュメントには記載がなかったですが、 ASP.NET Core 2.0 への更新によりStartup.csの内容も変更されています。
Configurationの設定、configのバインド周りやロギングの設定記載が削除されています。
この辺りはもう少し詳細まで内容を確認しないとなと思っています。
コードは下記のように変更しました。
(新規にASP.NET Core 2.0アプリケーションを作成した場合と同じ内容です。)

public class Startup  
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

デプロイ・実行

ローカルIISにサイトを構築、実行してみました。
普通にいけるかと思いきやエラーが出て少しはまりました。
(レスポンスが500だったのですが、ASP.NET Coreアプリでの、IIS詳細詳細エラー表示が上手くいかず、原因特定に時間がかかりました・・・)

dotnet run実行 → localhostへアクセスしてみると↓スタックトレースが。

Unhandled Exception: System.InvalidOperationException: No service for type 'Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionGroupCollectionProvider' has been registered.

■エラー原因

NuGetパッケージ参照からMicrosoft.ApplicationInsights.AspNetCoreアンインストールしたため、_Layout.cshtml内のメソッド呼び出しで例外が発生していた。
https://developercommunity.visualstudio.com/content/problem/50735/applicationinsights-javascriptsnippet-exception-wi.html

■対応

_Layout.cshtmlから下記2行削除で正常に表示されました

@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet

@Html.Raw(JavaScriptSnippet.FullScript)

■再実行

f:id:EF-0512:20170912214652p:plain
正常に表示されました。
デフォルトままのWebアプリケーションだったので特筆することはなかったですが、ASP.NET Core 2.0での変更点などを確認・整理できてよかったです。

参考

Exploring Program.cs, Startup.cs and CreateDefaultBuilder in ASP.NET Core 2 preview 1
ASP.NET Core RC2でHelloWorld~EntryPointとStartupも探る - ryuichi111stdの技術日記

デブサミ関西2017・Scala関西 Summit2017に行ってきました

どちらも、去年に引き続き2度目の参加。
デブサミ関西は平日でしたが、会社から近いので業務を中抜けさせてもらい参加してきました。
event.shoeisha.jp summit.scala-kansai.org

参加したセッション

デブサミ関西

Scala関西

  • ゼロから始めるScala文法
  • 【ハンズオン】ゼロから始めるScalaプロジェクト
  • Scala on Docker(AWS ECS)
  • グラフを知って理解するAkka Stream
  • Reladomo in Scala

感想

Scalaについては、社内でGitBucketを導入していることもあり、個人的に気になっており去年に引き続き参加しました。
業務のどこかで使おうとしていますがなかなか・・・
(普段の業務はC# ASP.NET, JavaScript)

個人的には、"Scala on Docker(AWS ECS)“での、Scala入門書として↓を読んだら辛かったという話が印象に残っています。
(自分も同じなので・・・共感できて面白かったです。)

デブサミでは、スクラム・マイクロサービスアーキテクチャ・LINE APIと普段の業務でも取り組みたい内容が多く、参考になりました。

スクラムについては、 リモートでのカジュアルなコミュニケーションの重要性などより意識していこうと重しました。
“司会役の人がコントロールすべきは会議の進行 、答えを出すことではない 。”
という内容が1番記憶に残っています。

社内ではエンジニアマネージャーな役割を担っているので、いろんなメンバーと振り返りや打ち合わせをする機会が多いのですが、口を出しすぎてしまったり、判断を待ちきれなかったりすることがよくあります。
議論を促し、判断できる場をより意識して作っていこうと思いました。

LINEに関しては直近業務でAPIに触れる機会があり、具体的なイメージを持ってセッションをきくことができました。
業務では .NET Framework 4.0で動作するLINEAPI周りの処理を実装しました。
(使用するサーバーの関係で.NETのバージョンが古い)
HttpClientで書きたいなーと思っていたので、.NET Standard 2.0 で実装しているものをあげています。(色々途中)
github.com

公式リファレンスをみていたところC#SDKは無いと思っていたら、
↓のようなものがありました。まだ中身はちゃんと見られてません。
GitHub - kenakamu/line-bot-sdk-csharp: SDK of the LINE Messaging API for C#
C# で LINE Bot | Ken’s Tech Blog
GitHub - line/line-bot-sample-ms

どこかでC#で LINE BOTを作ってみたいと思います。

その他

3セッション特典で書籍もいただけました。
ありがたやありがたや。

Windows Server 2016にDockerをインストールしてWindows Containersを動かしてみる

概要

公式ドキュメントや参考サイトを見ながら進めていきます。
docs.microsoft.com

Dockerインストール

まずDockerをインストールするために、プロバイダーをインストールします。

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

インストール済みパッケージプロバイダの一覧に、先ほどインストールしたDockerMsftProviderが表示されています。

Get-PackageProvider -ListAvailable
Name                     Version          DynamicOptions
----                     -------          --------------
Chocolatey               2.8.5.130        SkipDependencies, ContinueOnFailure, ExcludeVersion, ForceX86, PackageSave...
DockerMsftProvider       1.0.0.1          Update
msi                      3.0.0.0          AdditionalArguments
msu                      3.0.0.0
NuGet                    2.8.5.208        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag...
PowerShellGet            1.0.0.1          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, ...
Programs                 3.0.0.0          IncludeWindowsInstaller, IncludeSystemComponent

Dockerをインストール

Install-Package -Name docker -ProviderName DockerMsftProvider

インストール完了後、再起動をかけます。

Restart-Computer -Force

再起動後、windows serviceを確認するとDockerが表示されています。

f:id:EF-0512:20170906020821p:plain

Hello World

公式Dockerレジストリからイメージ取得とコンテナの展開。

docker run microsoft/dotnet-samples:dotnetapp-nanoserver

f:id:EF-0512:20170906154527p:plain

チュートリアルの通り簡単に実行できました。

IISイメージを展開して、IISデフォルトページを表示する

イメージをpullして実行。

docker pull microsoft/iis

イメージは4GBほどあり、なかなかに時間がかかりました。

docker run -d -p 80:80 microsoft/iis

ホストの80番ポートをコンテナに割り当てアクセス。

f:id:EF-0512:20170906161459p:plain
無事デフォルトページが表示されました。

まとめ

次はASP.NETのアプリをコンテナ上で実行してみようと思います。

参考

Windows Server 2016 の Windows Containers と Docker を使って IIS と ASP.NET を動かしてみた - しばやん雑記
Windows 版 Docker クライアントのインストールと Linux上の Docker デーモンへの接続 - Qiita
Windows 10 のパッケージ管理エコシステムについて整理する。 - Qiita