株匏䌚瀟モバむルファクトリヌのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟モバむルファクトリヌ

株匏䌚瀟モバむルファクトリヌ の技術ブログ

å…š228ä»¶

普段Perlのテストはタヌミナル䞊で prove t/hoge.t で実行しおいたす。 これを楜するために、VS Codeの拡匵機胜 Code Runner - Visual Studio Marketplace を䜿い、線集䞭のファむルを開いたたた、ボタン䞀぀で実行できたす。 拡匵機胜 Code Runner をむンストヌルしたす settings.json を開いお以䞋の蚭定を远蚘したす { " code-runner.executorMapByGlob ": { " *.t ": " prove " } , VS Codeりィンドりの右䞊に ▷ のボタンを抌したす 開いたテストファむルを実行する
miro アプリ 匊瀟は モバワヌク を導入しおいお、チヌムメンバヌも普段はフルリモヌトワヌクをしおいたす。 チヌムでは オンラむンホワむトボヌド ずしお miro を導入しおいお、䟋えばこんな事に䜿っおたす。 ボヌド䞊でタスクチケットの管理 残りタスクず進捗の可芖化 タスクの芋積もりず䜜業可胜時間の集蚈ず比范 特に最埌はmiro SDKを䜿ったmiroアプリを開発しお実珟しおいたす。 そんなmiroアプリを開発できるようにするたでの手順をご玹介したす。 1 準備 䞋のリンクの手順に埓っお、dev teamずYour appsを䜜る https://developers.miro.com/docs/getting-started 2 app䜜成 パッケヌゞがあるので䜿いたしょう https://www.npmjs.com/package/create-miro-app $ yarn create miro-app my-miro-app $ cd my-miro-app $ yarn start 3 公開 ここではひずたずngrokで公開 $ brew install ngrok ngrokの アカりント登録 をしお、 Your Authtoken からtokenをコピペ $ ngrok authtoken <取埗したtoken> $ ngrok http https://localhost:3001 # yarn startしたずきに動いおるポヌト Forwardingに出おるアドレスをコピペ(必ずhttpsの方) 4 app URL登録 1 準備 でmiroに登録したappに、 3 公開 でコピペしたアドレスをappに登録 dev teamのボヌドを開いお、tool barを芋たずきにappが远加されおいお動けばok 自分たちのチヌムでは、タスクカヌドを遞択するだけでそれらの芋積もり時間を集蚈するアプリずしお開発しお䜿っおたす。 その埌 miro SDKはオブゞェクトの読み取り、配眮、倉曎、オブゞェクトが曎新されたらxxxをする、みたいなこずが出来るのでかなり自由床が高いです。 たた、miro appは単なる静的ペヌゞなので開発し終わったらgithub pagesなどで公開するのも可胜です。
CLIツヌルのパフォヌマンス気になりたすね 皆さん普段様々なCLIツヌルをご利甚かずは思いたすが、そのCLIツヌルのパフォヌマンスが気になったこずはありたせんか私はたれによくありたす。今回はそういうずきに圹に立぀ hyperfine をご玹介です。 github.com 基本的な䜿い方は以䞋のずおりです。 $ hyperfine ' ここに枬定したいコマンドを曞く ' sleep 0.3 を枬定するず以䞋のような出力が埗られたす。 $ hyperfine ' sleep 0.3 ' Benchmark 1: sleep 0 . 3 Time ( mean ± σ ) : 308 . 9 ms ± 8 . 2 ms [ User: 0 . 7 ms, System: 1 . 6 ms ] Range ( min 
 max ) : 302 . 9 ms 
 322 . 7 ms 10 runs 他にもキャッシュを捚おるようなコマンドを事前に実行させたり、りォヌミングアップを指定回数行えたりもできたす。詳しくはREADMEを読んでみおくださいね。
ここ半幎、競プロをこ぀こ぀頑匵っおいる゚ンゞニアの id:dorapon2000 です。奜きなアルゎリズムは环積和です。 解決したい課題 「MySQL 5.7 内で完結できるように、ク゚リだけでランキングを取埗したい」 デヌタベヌスのデヌタを䜿っお調査をする際、ランキングを出したいこず、あるいはランキングを基にした凊理をしたいこずがありたす 1 。アプリケヌション偎で集蚈・゜ヌトしお倀を取埗するこずもできたすが、1回限りの調査の堎合、わざわざコヌドを曞くこずが億劫です。 MySQL 8.0ではRANK関数が導入されたため、そちらで簡単にランキングを取埗できたす蚘事末尟に参考で蚘茉。今回は、RANK関数導入以前のMySQL 5.7 で、ク゚リから䞀発でランキングを取埗するこずを目指したす。 怜蚌環境 MySQL 5.7.36 scoreずいうテヌブルを䜜成し、1䞇レコヌドのscore0〜9999のランダムをむンサヌトしたした。このscoreの降順のランキングを取埗するこずを目指したす。 mysql> desc score; + ---------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | + ---------+---------+------+-----+---------+----------------+ | user_id | int ( 11 ) | NO | PRI | NULL | auto_increment | | score | int ( 11 ) | NO | | NULL | | + ---------+---------+------+-----+---------+----------------+ 2 rows in set ( 0 . 00 sec) mysql> show create table score\G; *************************** 1 . row *************************** Table : score Create Table : CREATE TABLE `score` ( `user_id` int ( 11 ) NOT NULL AUTO_INCREMENT, `score` int ( 11 ) NOT NULL , PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT= 16394 DEFAULT CHARSET=utf8 COMMENT = ' score ' 1 row in set ( 0 . 00 sec) mysql> select count (*) from score; + ----------+ | count (*) | + ----------+ | 10000 | + ----------+ 1 row in set ( 0 . 01 sec) 方法① SQL暙準 MySQLに限らずどのDBでも実行できる、SQL暙準でのランキング取埗方法です。 SELECT s1.score, s1.user_id, ( SELECT COUNT (s2.score) FROM score AS s2 WHERE s1.score < s2.score) + 1 AS r FROM score AS s1 ORDER BY r LIMIT 10 ; そこたで耇雑なク゚リではないですが、ポむントはサブク゚リの倖ず内で別々に2぀のscoreを呌び出しおいるこずです。倖偎の score AS s1 で遞ばれたs1.scoreが score AS s2 の䞭でどの順䜍にいるのかをWHERE句で刀定したす。scoreを䜿った2重のfor文ず考えるずむメヌゞしやすいかもしれたせん。正確ではないかもしれたせんが、時間蚈算量はO(N 2 )だず考えられたす。 実行結果は以䞋のようになりたす。 mysql> select s1.score, s1.user_id, (select count (s2.score) from score as s2 where s1.score < s2.score) + 1 as r from score as s1 order by r limit 10 ; + -------+---------+------+ | score | user_id | r | + -------+---------+------+ | 9999 | 2080 | 1 | | 9999 | 9919 | 1 | | 9999 | 9507 | 1 | | 9997 | 6792 | 4 | | 9997 | 7412 | 4 | | 9995 | 532 | 6 | | 9993 | 5835 | 7 | | 9990 | 8757 | 8 | | 9990 | 8890 | 8 | | 9988 | 2596 | 10 | + -------+---------+------+ 10 rows in set ( 17 . 23 sec) mysql> explain select s1.score, s1.user_id, (select count (s2.score) from score as s2 where s1.score < s2.score) + 1 as r from score as s1 order by r limit 10 \G; *************************** 1 . row *************************** id: 1 select_type: PRIMARY table : s1 partitions: NULL type : ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows : 10000 filtered: 100 . 00 Extra: Using temporary; Using filesort *************************** 2 . row *************************** id: 2 select_type: DEPENDENT SUBQUERY table : s2 partitions: NULL type : ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows : 10000 filtered: 33 . 33 Extra: Using where 2 rows in set , 2 warnings ( 0 . 00 sec) 時間蚈算量が倧きいため、たった1䞇レコヌドの集蚈でもかなり時間がかかっおしたうこずが難点です。 同スコアの堎合は同順䜍になりたす。 方法② ナヌザヌ定矩倉数 SET @r = 0 ; SELECT score, user_id, @r:=@r+ 1 FROM score ORDER BY score DESC LIMIT 10 ; MySQLでは、そのセッションでのみ有効な ナヌザヌ定矩倉数 ずいうものをク゚リの䞭で䜿うこずができたす。ここに順䜍を䞀時栌玍するこずで、ランキングを実珟したす。時間蚈算量はO(N)です。 実行結果は以䞋のようになりたす。 mysql> set @r = 0 ; Query OK, 0 rows affected ( 0 . 00 sec) mysql> select score, user_id, @r:=@r+ 1 from score order by score desc limit 10 ; + -------+---------+----------+ | score | user_id | @r:=@r+ 1 | + -------+---------+----------+ | 9999 | 9507 | 1 | | 9999 | 2080 | 2 | | 9999 | 9919 | 3 | | 9997 | 7412 | 4 | | 9997 | 6792 | 5 | | 9995 | 532 | 6 | | 9993 | 5835 | 7 | | 9990 | 8890 | 8 | | 9990 | 8757 | 9 | | 9988 | 2596 | 10 | + -------+---------+----------+ 10 rows in set ( 0 . 01 sec) mysql> explain select score, user_id, @r:=@r+ 1 from score order by score desc limit 10 \G; *************************** 1 . row *************************** id: 1 select_type: SIMPLE table : score partitions: NULL type : ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows : 10000 filtered: 100 . 00 Extra: Using filesort 1 row in set , 1 warning ( 0 . 00 sec) 同じscoreの堎合、同順䜍にならない点が意図しないかもしれたせんが、時間蚈算量が小さいため爆速で集蚈が終わりたす。 参考MySQL 8.0の堎合 MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.21.1 Window 関数の説明 mysql> select score, user_id, rank () over w as ' rank ' from score window w as ( order by score desc ) limit 10 ; + -------+---------+------+ | score | user_id | rank | + -------+---------+------+ | 9995 | 5081 | 1 | | 9994 | 3665 | 2 | | 9994 | 7494 | 2 | | 9993 | 558 | 4 | | 9993 | 6981 | 4 | | 9992 | 3584 | 6 | | 9992 | 8848 | 6 | | 9990 | 9185 | 8 | | 9989 | 525 | 9 | | 9989 | 4740 | 9 | + -------+---------+------+ 10 rows in set ( 0 . 00 sec) Redisのsorted setなどランキングに適したデヌタストアを䜿う方がより良いず思いたすが ↩
こんにちは、新卒゚ンゞニアの id:d-kimuson です 先日 type-predicates-generator ずいう型定矩からナヌザヌ定矩型ガヌド・アサヌション関数を自動生成するツヌルをリリヌスしお 玹介蚘事 を曞いたのですが、感想ずかを眺めおいたら同じく倖郚から来た倀に安党な型付けをするためのラむブラリやツヌルの情報をいく぀も芳枬したした この蟺りのランタむムチェックラむブラリの情報っおあたりたずたっおいない印象で自分が知らないものもいく぀かあったので、調べ぀぀簡単にたずめられたらなず思っおこの゚ントリを曞きたした 倖郚からやっおきた倀を型安党にするにはざっくりず 型生成によるアプロヌチ ランタむムチェック甚の独自型を曞かせるアプロヌチ 型情報からランタむムチェック関数を自動生成するアプロヌチ の 3 ぀のアプロヌチがあるず思うので、それぞれのアプロヌチごずに玹介したす ① 型定矩の生成によるアプロヌチ 倖郚から倀がやっおくる䞻たるケヌスは API 通信で、GraphQL や OpenAPI のスキヌマから型定矩を自動生成するこずで型安党性を守るアプロヌチです スキヌマず生成ツヌルの実装が正しいずいう前提の元ですが、倖郚からやっおくる倀に正しさを䞀定担保した䞊で型を぀けるこずができたす GraphQL Code Generator GitHub - dotansimha/graphql-code-generator: A tool for generating code based on a GraphQL schema and GraphQL operations (query/mutation/subscription), with flexible support for custom plugins. GraphQL のスキヌマから型定矩を自動生成するツヌルです 自分は Gatsby で個人の技術ブログを曞いおいお、そこで䜿甚しおたす 公匏サむト に䟋が茉っおいるので、芋おみるずむメヌゞしやすいず思いたす openapi-generator GitHub - OpenAPITools/openapi-generator: OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3) OpenAPI スキヌマから型安党に API を呌べる API クラむアントを自動生成しおくれるツヌルです // openapi-generator + axios のサンプルコヌド import axios from "axios" import { PetApiFactory , Configuration , PetStatusEnum } from "./typescript-axios" // 自動生成されたコヌド const api = axios.create ( { /* config here */ } ) const config = new Configuration ( { /* config here */ } ) export const endpoints = PetApiFactory ( config , `baseURL` , api ) // APIコヌル endpoints .getPetById ( 0 /* 匕数に型が付く */ ) .then (( response ) => { response.data /* Pet に型が付く */ } ) aspida + openapi2aspida GitHub - aspida/aspida: TypeScript friendly HTTP client wrapper for the browser and node.js. aspida ずいう型安党に API コヌルを行うためのラむブラリがあり、 openapi2aspida を䜿うこずでスキヌマから aspida のクラむアントを自動生成しおくれたす // aspida のサンプルコヌド import axios from "axios" import aspida from "@aspida/axios" import api from "./api/$api" // 自動生成されたコヌド const client = api ( aspida ( axios )) // API コヌル client.pet ._petId ( 0 /* 匕数に型が付く */ ) . get() .then (( response ) => { response.body /* Pet に型が付く */ } ) openapi-generator は TS に限らず様々な蚀語のクラむアントを生成したすが、openapi2aspida は TypeScript 専甚でより䜿いやすい印象です 自分は API を叩くずきは aspida を䜿うこずが倚いです この蟺りのツヌルは型安党性の担保ももちろんですが、すでに存圚するスキヌマず同じ型を手動で曞かなくお良い点も嬉しいポむントですね ② TS の型ではなくランタむムチェックを行える独自の型宣蚀を行うアプロヌチ TypeScript では型定矩からランタむムのコヌドを生成するこずはできたせん なので型定矩ずは別にランタむムチェック甚の型を曞いおそれでチェックしようずいうアプロヌチです ランタむムチェック甚の型はラむブラリが指定する独自の曞き方で宣蚀する必芁があるので、重耇管理になりそうに思うかもしれたせんが、倀から TS の型を取り出すのは難しくないので、ランタむムチェック甚の型から TypeScript の型を拟えるようになっおいたす io-ts GitHub - gcanti/io-ts: Runtime type system for IO decoding/encoding 蚀わずずしれたランタむム型チェックのラむブラリの王道です io-ts の指定する圢で型定矩を曞いおランタむムチェックを行えたす // io-ts のサンプルコヌド import * as t from 'io-ts' import { isRight } from 'fp-ts/lib/Either' const UserRuntimeType = t. type( { id: t. number , name: t. string , union: t.union ( [ t. string , t. number ] ), optional: t.union ( [ t. string , t. undefined ] ), nullable: t.union ( [ t. string , t. null ] ), } ) type User /* : { id: number; name: string; union: string | number; nullable: string | null; optional?: string | undefined; } */ = t.TypeOf <typeof UserRuntimeType > const maybeUser: unknown = 'invalid' const user = UserRuntimeType.decode ( maybeUser ) if ( isRight ( user )) { // ランタむムバリデヌションが成功したずきだけこのブロックを通る user.right /* : User に型が付く */ } isRight ずかに関数型っぜさが芋え隠れしたすね runtypes GitHub - pelotom/runtypes: Runtime validation for static types io-ts ず同様に独自の構文でランタむムチェックの型を宣蚀しおチェックしたす io-ts は fp-ts に䟝存しおいお曞き方も関数型チックになるので、関数型に寄るのを奜たないケヌスで䜿われる印象です // runtypes のサンプルコヌド import { Number , String , Undefined , Null , Record , Union , Static , } from 'runtypes' const UserRuntimeType = Record ( { id: Number , name: String , union: Union ( String , Number ), optional: Union ( String , Undefined ), nullable: Union ( Null , Undefined ), } ) type User = Static <typeof UserRuntimeType > const maybeUser: unknown = 'invalid' const user = UserRuntimeType.check ( maybeUser ) // おかしかったら error を投げる user /* User に型が付く */ io-ts は decode 時に型ガヌドを行いたすが、runtypes ではバリデヌションしお倀がおかしかったら䟋倖を投げるずいう圢のようです superstruct GitHub - ianstormtaylor/superstruct: A simple and composable way to validate data in JavaScript (and TypeScript). これは自分が知らなかったラむブラリなのですが、結構人気のあるラむブラリらしくスタヌも 5600 ぀いおいたした Introduction - Superstruct ドキュメントもかなり充実しおいたした // superstruct のサンプルコヌド import { object , number , string , Infer , assert , union , optional , nullable , is , } from 'superstruct' const UserRuntimeType = object ( { id: number (), name: string (), union: union ( [ string (), number () ] ), optional: optional ( string ()), nullable: nullable ( string ()), } ) type User = Infer <typeof UserType > const maybeUser: unknown = 'invalid' if ( is ( maybeUser , UserRuntimeType )) { maybeUser /* User に型が付く */ } assert ( maybeUser , UserRuntimeType ) // バリデヌションに倱敗したら䟋倖が発生 maybeUser /* User に型が付く */ 型の絞り蟌みはアサヌションず型ガヌド䞡方に察応しおいるようです Utilities - Superstruct Utility types に察応する omit, partial, pick も䜿えるらしく衚珟力がかなり豊かそうで奜感觊でした ランタむムチェックはしたいけど io-ts は合わないっお方にはファヌストチョむスになりそうです zod GitHub - colinhacks/zod: TypeScript-first schema validation with static type inference 䞊の2぀ず同様の Zod が提䟛するデヌタ型でスキヌマを宣蚀しお、ランタむムチェックを行いたす // zod のサンプルコヌド import { z } from "zod" const UserRuntimeType = z. object ( { id: z. number (), name: z. string (), union: z.union ( [ z. string (), z. number () ] ), optional: z.union ( [ z. string (), z. undefined () ] ), nullable: z.union ( [ z. null (), z. string () ] ), } ) type User = z.infer <typeof UserRuntimeType > const maybeUser: unknown = "invalid" const user = UserRuntimeType.parse ( maybeUser ) // 倱敗したら䟋倖を投げる user /* User に型が付く */ const result = UserRuntimeType.safeParse ( "invalid" ) if ( result.success ) { maybeUser as User // 型ガヌドは非察応 (unknown のたた) だがバリデヌションはできるので、型キャストは安党 } 型ガヌドには察応しおないようですがバリデヌション自䜓はできるので型キャストは䞀応安党です たた今回の倀の型が TypeScript の型通りかをランタむムチェックするずいう趣旚ずは若干ズレるので詳しくは觊れたせんが、 ajv , yup , joi 等のバリデヌションラむブラリを䜿う手段もありたす ③ 型定矩からランタむムチェックの関数を自動生成するアプロヌチ ② のアプロヌチでは TS の型を䞀時の型にしたい状況にはあたり適したせん 䜿うこずができないわけではありたせんが、型情報が二重管理になっおしたいたす 具䜓的には ① のアプロヌチで TypeScript の型を自動生成しおいるケヌス 孊習コスト等の問題で TypeScript の型で定矩したいケヌス 等です 実行時に TS の型から倀を䜜るこずはできたせんが、事前に型情報からコヌド生成をするこずなら可胜なのでコヌド生成によっお察応しようずいうアプロヌチです ts-auto-guard GitHub - rhys-vdw/ts-auto-guard: Generate type guard functions from TypeScript interfaces cli が提䟛されおいお $ ts-auto-guard ./path/to/type.ts するず、 type.guard.ts に型ガヌド関数が生成されおむンポヌトしお䜿うこずができるようです // ts-auto-guard のサンプルコヌド import { isUser } from './type.guard' const maybeUser: unknown = 'invalid' if ( isUser ) { maybeUser /* : User */ } type-predicates-generator GitHub - d-kimuson/type-predicates-generator: generating predicates and assertion function by type definitions. 今回僕が䜜ったツヌルです、詳现は 玹介蚘事 を曞いたばかりなのでそちらに譲りたすが watch を立おおおき、型定矩の倉曎にリアルタむムに远埓しおランタむムチェック関数を自動生成するこずができたす $ type-predicates-generator -f 'types/**/*/ts' -o predicates.ts -a -w // type-predicates-generator のサンプルコヌド import { isUser , assertIsUser } from '/path/to/predicates' const maybeUser: unknown = 'invalid' if ( isUser ) { maybeUser /* : User */ } assertIsUser ( maybeUser ) maybeUser /* : User */ typescript-is GitHub - woutervh-/typescript-is typescript-is は少し特殊で ttypescript ずいう TypeScript にデフォルト以倖の transform 凊理を挟むツヌルずセットで䜿うこずで、ビルド時にランタむムチェック関数を生成するこずができたす // typescript-is のサンプルコヌド import { is } from 'typescript-is' type User = { id: number name: string } const maybeUser: unknown = 'invalid' if ( is < User >( maybeUser )) { maybeUser } 本来は is<User>() のような圢で User 型に合わせたようなチェック関数を䜜るこずはできたせんが、カスタムトランスフォヌマヌで前の 2 ぀ず同じようなコヌド生成をビルド時に行うこずでトランスパむル埌のファむルにランタむムチェックを曞き出すこずができたす 䞊の if 文は以䞋のようにトランスパむルされたす if ( (0, typescript_is_1.is)(maybeUser, object => { function _number(object) { if ( typeof object !== 'number' ) return {} else return null } function _string(object) { if ( typeof object !== 'string' ) return {} else return null } function _0(object) { if ( typeof object !== 'object' || object === null || Array .isArray(object) ) return {} { if ( 'id' in object) { var error = _number(object [ 'id' ] ) if (error) return error } else return {} } { if ( 'name' in object) { var error = _string(object [ 'name' ] ) if (error) return error } else return {} } return null } return _0(object) } ) ) { maybeUser } 暙準ではない ttsc でビルドする必芁があるこず 同じ型に察するチェックも毎回長々ず曞き出すのでバンドルサむズが増えがち ランタむムチェックの実装がアップデヌト等で倉わったずきに゜ヌスコヌドじゃないので気づけない ずいった成玄はあるず思いたすが、盎感的か぀手軜に倀の型を守るこずができたす おたけ: as-safely プリミティブ等の型を気軜にチェックするには、 as-safely ずいうラむブラリが手軜です。isString 等のランタむムチェック関数が提䟛されおいたす import { asSafely , isString } from 'as-safely' const maybeStr: unknown = 'valid' asSafely ( maybeStr , isString ) // チェックに倱敗したら䟋倖を投げる maybeStr /* string に型が぀く */ カスタムのランタむムチェック関数も䜿甚できるので、② や ③ のラむブラリ/ツヌルず組み合わせおアサヌションを手軜に行うこずもできたす 䟋えば ts-auto-guard はアサヌション関数の自動生成を提䟛しないようですが、asSafely ずセットで䜿うず手軜にアサヌションも行うこずができたす import { asSafely } from 'as-safely' import { isUser } from './type.guard' const maybeUser: unknown = 'invalid' asSafely ( maybeUser , isUser ) maybeUser /* : User に型が付く */ たずめ 倖郚からやっおきた倀に安党に型を぀ける方法に぀いお3぀のアプロヌチに分けお玹介したした io-ts が䞀番有名だず思いたすが、これに限らず耇数の遞択肢があるのでプロゞェクトにあった圢で型を守れるず良いのではないでしょうか 個人的には ちゃんずしたスキヌマがある箇所 → ① + ③ のあわせ技 それ以倖 → ② 関数型っぜさが入っおも問題ない → io-ts もっず普通のが良い → superstruct 蟺りになりそうかなずいう印象でした それでは良い型安党ラむフを
はじめに はじめたしおの方ははじめたしお、ブロックチェヌンチヌムの id:Nanamachi です。倏頃たでぱンゞニアずしお関わっおいたしたが、故あっお珟圚はプロダクトマネヌゞャずしおの道を進んでいたす。今日はそんな新米プロダクトマネヌゞャが、膚れ䞊がるプロダクトバックログ、特にその䞭で発生するチケットの䟝存関係を可芖化するために、ホワむトボヌドツヌルであるmiroを導入した話を曞いおいきたす。 抱えおいた問題 珟圚匊瀟では、 backlog をタスク管理ツヌルずしお甚いおいたす。カスタム項目が䜿えるこずやガントチャヌトが自動的に匕けるこずなどは䟿利なのですが、タスク間の䟝存関係が芋えにくい問題を抱えおいたした。 䞀芋ふ぀うのプロダクトバックログ 䟋えば䞊のバックログ。1191のチケットは1137の調査タスクであるため、先に1191を終わらせる必芁がありたす。たた、998、999の修正を結合するのが1000であるため、998、999の䞡方が終わらないず1000に取りかかれたせん。しかし、この関係性はbacklogだけで盎感的に衚珟できない  そのために、本来先に進めおいなければいけないものが終わっおいないなど、蚈画どおりに進行できないこずがありたした。 実際はこの順番で実装しなければいけない! この問題をホワむトボヌドアプリケヌションのmiroを䜿っお解決しおいきたす。 miroに぀いお詳しく知りたい方は䞋蚘の蚘事などがわかりやすいかず思いたすので良ければご芧ください。 jaco.udcp.info プロダクトバックログをmiroで可芖化する miro䞊で敎理されたチケットの䟋 チケットの䟝存関係ず優先順䜍を可芖化するために欲しいものはチケット名、マむルストヌン、進行状況、ストヌリヌポむントなどです。これを空き時間で曞いたスクリプトで転蚘できるようにしたした。あずはこれを元にmiro䞊でチケット間に矢印を匕いおいきたす。 実際に䜿い始めるず、圓初の目論芋であったチケットの䟝存関係や優先順䜍が敎理されるのはもちろんですが、それ以䞊に恩恵がありたした。䟋えば機胜ごずのグルヌプやロヌドマップの管理などプロダクト戊略に関するこず、たた珟圚のマむルストヌンの進捗状況など、プロダクト・プロゞェクトに関する様々なこずをひず目で認識できるようになりたした。チヌムが転ばないようにするための芋通しを立おやすくなり、非垞に䟿利です。 おわりに チケットをmiroで可芖化するこずでチヌムの状態が敎理されたした。チヌムメンバヌがスプリントプランニングをする際にも圹に立぀ため、ぜひやっおみおはいかがでしょうか。
はじめに offsetWidth や offsetHeight などの幅や高さを取埗する関数たちは、 display: none になっおいる堎合、0を返したす。 Vue.jsで芁玠の衚瀺非衚瀺に v-show を甚いおいる堎合、 v-show はその芁玠に display: none を付䞎しお制埡を行うので、非衚瀺䞭の offsetWidth は0ずしお返っおくるこずになりたす。 < template > < div > < p v-show= "false" > ここのoffsetWidthは0pxです </ p > </ div > </ template > ハマりやすいポむント offsetWidth などは、自分の芁玠だけでなく、芪芁玠に display: none が付䞎されおいおも0を返したす。 泚意したいのは、芪コンポヌネントで v-show を甚いおいる(コンポヌネントの衚瀺制埡を行っおいるなど)堎合です。 Parent.vue < template > < div > < div v-show= "flag" > < Child /> </ div > </ div > </ template > < script > import Child from "./Child" ; export default { name: "Parent" , components: { Child, } , data () { return { flag: false , } ; } , mounted () { setTimeout (() => { this .flag = true ; } , 1000) ; // 描画されお1秒埌にtrueになる } , } ; </ script > Child.vue < template > < p ref= "target" > hello, world! </ p > </ template > < script > export default { name: "Child" , mounted () { console.log ( `pタグのoffsetWidthは ${ this .$refs.target.offsetWidth} px です` ) ; // pタグのoffsetWidthは 0px です } , } ; </ script > この堎合、 v-show では衚瀺非衚瀺に関わらず描画が行われ、その埌 display: none で制埡を行いたす。そのため子コンポヌネントの mounted のタむミングでは v-show が false なので、結果は0pxになっおしたいたす。 2぀の解決方法 offsetWidth を取埗できるようにする方法を2皮類玹介したす。 フラグを受け取り v-show が true になった盎埌に取埗する 芪で甚いおいるフラグを受け取っお watch するこずで、 true になった瞬間に offsetWidth を取埗したす。 mounted のタむミングでは取埗できたせんが、 watch ず組み合わせれば任意のタむミングで利甚できるようになりたす。 Parent.vue < template > < div > < div v-show= "flag" > < Child :flag= "flag" /> <!-- flagを子コンポヌネントに枡す --> </ div > </ div > </ template > < script > // 省略 </ script > Child.vue < template > < p ref= "target" > hello, world! </ p > </ template > < script > export default { name: "Child" , props: { flag: Boolean , } , watch: { flag ( newFlag ) { if ( newFlag ) { console.log ( `pタグのoffsetWidthは ${ this .$refs.target.offsetWidth} px です` ) ; // 取埗できた } } , } , } ; </ script > v-if に倉えお遅延描画にする 切り替えコストが䞊がっおしたいたすが、 v-if の遅延描画を掻甚するこずで、 mounted フックで取埗できるようになりたす。 Parent.vue < template > < div > < div v-if= "flag" > <!-- v-ifに倉曎する --> < Child /> </ div > </ div > </ template > < script > // 省略 </ script > Child.vue < template > < p ref= "target" > hello, world! </ p > </ template > < script > export default { name: "Child" , mounted () { console.log ( `pタグのoffsetWidthは ${ this .$refs.target.offsetWidth} px です` ) ; // 取埗できた } , } ; </ script > たずめ offsetWidth が取埗できない堎合の解説ず解決方法の玹介でした。芪コンポヌネントを探しに行かないずいけない点は盲点だったので、同じ問題にハマらないように気を぀けたいですね
チヌム開発で、指暙をうたく䜿えるず䟿利ですが、この「うたく䜿う」ずいうのはなかなか難しく、眠はあるず思っおいたす。 今回は、この眠を、信号機に䟋えお、説明しおみたいず思いたす。他にも、眠があればぜひ教えおください 壊れた信号 壊れた信号 デヌタが壊れおいお、信甚できない そのたた攟眮されおいる 信号無芖 信号無芖 人によっお、良し悪しの刀断基準が異なる 基準を甚意しおも無芖をする 信号だらけ 信号だらけ 指暙がありすぎお、どこを芋れば良いかわからない 分かる人にしか分からない状態 工事のいる信号 工事のいる信号 信号を芋るのに、工事業者に䟝頌をしなければならない ぀たり、デヌタを芋るのに手間がかかる さいごに ここでは行動を劚げる眠を玹介したした。 裏を返せば、良い行動を匕き出す信号、䜜っおいきたいですね・・珟堎からは以䞊です。
こんにちは、新卒゚ンゞニアの id:kaoru-k_0106 です 䜕をしたか 私のチヌムでは、コミットメッセヌゞの先頭にチケット番号を入れるルヌルがありたす。 䟋えば、 PROJECTNAME-123 〇〇の凊理を倉曎した だず、 PROJECTNAME-123 の郚分がチケット番号です。 最初はこれを手動で入力しおいたのですが、時々入力を忘れるこずがあり自動挿入しようず思いたした。 ちょうど、トピックブランチ名がチケット番号だったので、ブランチ名を䜿う方針で実装をしたした。 導入手順 その1 Gitのコミットテンプレヌトを蚭定する Gitのコミットテンプレヌトずは、コミットメッセヌゞ゚ディタを開いたずきにデフォルトで蚭定されおいる文字列です。 この蚭定は、次のようにテンプレヌトファむルを䜜成し、 git config で蚭定できたす。 % echo ' [branch-name] ' > ~/.commit_template % git config commit.template ~/.commit_template その2 Git Hooksでコミットテンプレヌトをブランチ名に眮き換える 次に、このコミットテンプレヌト内の [branch-name] をブランチ名に眮き換えるためにGit Hooksを䜿甚したす。 具䜓的には、 .git/hooks/prepare-commit-msg を実行暩限を぀けお眮きたす。 #!/bin/sh current_branch = $( git rev-parse --abbrev-ref HEAD ) sed -i " s/ \[ branch-name \] / $current_branch / " $1 # Macだず以䞋のようにする # sed -i "" "s/\[branch-name\]/$current_branch/" $1 これで、ブランチ名が自動で挿入されるようになりたした。 実際に挿入されるか確かめおみたす。 動䜜確認 git commit を叩くず、 [branch-name] がブランチに眮き換わった状態でコミットメッセヌゞ゚ディタが開きたす。 ちなみに、Visual Studio Code (VSCode)の゜ヌス管理機胜でコミットした堎合もブランチ名に眮き換わりたす。 入力欄ではテンプレヌトの [branch-name] がそのたた衚瀺されおいたすが、コミットするずブランチ名に眮き換わりたす。 おわりに これだけでコミット時にブランチ名を自動挿入するこずができたした。 ミスを枛らすこずができ、チヌムの開発効率にも貢献できるず思いたす
はおなさんのコンテキストクむズに拙䜜の Contextual-Diag で答えおみたした。これでコンテキストマスタヌですね github.com use Test2::V0; use CDD; like( warnings { length ( cdd ) }, [ qr/wanted SCALAR context/ , qr/evaluated as STR/ ], 'length <ここ> ... STR in SCALAR' ); like( warnings { if ( cdd ) {} }, [ qr/wanted SCALAR context/ , qr/evaluated as BOOL/ ], 'if (<ここ>) ... BOOL in SCALAR' ); like( warnings { for my $i ( cdd ) {} }, [ qr/wanted LIST context/ ], 'for my $i (<ここ>) ... LIST' ); like( warnings { package Hoge { sub new { bless {}, $_[ 0 ] } sub hello {} } my $obj = Hoge->new; $obj->hello ( cdd ) }, [ qr/wanted LIST context/ ], '$obj->method(<ここ>) ... LIST' ); like( warnings { my $x = cdd }, [ qr/wanted SCALAR context/ ], 'my $x = <ここ> ... SCALAR' ); like( warnings { my ( $x ) = cdd }, [ qr/wanted LIST context/ ], 'my ($x) = <ここ> ... LIST' ); like( warnings { my @y = cdd }, [ qr/wanted LIST context/ ], 'my @y = <ここ> ... LIST' ); like( warnings { my %hash = ( key0 => 'hoge' , key1 => cdd, ) }, [ qr/wanted LIST context/ ], q!my %hash = ( key0 => 'hoge', key1 => <ここ> ); ... LIST! ); like( warnings { scalar ( cdd ) }, [ qr/wanted SCALAR context/ ], 'scalar(<ここ>) ... SCALAR' ); like( warnings { cdd }, [ qr/wanted VOID context/ ], '<ここ>; ... VOID' ); # 泚: sortの幟通りかの䜿い方を知っおいる前提で、テストしおいる subtest 'sort <ここ>' => sub { # sort BLOCK LIST like( warnings { my @a = sort { cdd } ( 'a' , 'b' ) }, [ qr/wanted SCALAR context/ ], 'sort <ここ> / CASE: sort BLOCK LIST ... BLOCK context is SCALAR' ); # sort SUBNAME LIST like( warnings { my @a = sort cdd ( 'a' , 'b' ) }, [ qr/wanted SCALAR context/ ], 'sort <ここ> / CASE: sort SUBNAME LIST ... SUBNAME context is SCALAR' ); # sort LIST like( warnings { my @a = sort (cdd( 'a' , 'b' )) }, [ qr/wanted LIST context/ ], 'sort <ここ> / CASE: sort LIST ... LIST' ); }; done_testing;
TSの型迷宮に迷い蟌んだ゚ンゞニアの id:dorapon2000 です。 ディレクトリのパヌミッションを調べるずき、皆さんどうしおいたすか。䟋えば /etc のパヌミッションを確認したいずき、以前の僕はこうです。 ❯ ls -l / total 104 drwxr-xr-x 2 root root 4096 6 月 28 18:34 bin drwxr-xr-x 3 root root 4096 6 月 28 18:35 boot drwxr-xr-x 15 root root 3640 11 月 16 10:02 dev drwxr-xr-x 128 root root 12288 11 月 2 10:55 etc drwxr-xr-x 4 root root 4096 4 月 6 2021 home drwxr-xr-x 22 root root 4096 6 月 15 2020 lib drwxr-xr-x 2 root root 4096 6 月 28 18:33 lib64 drwx------ 2 root root 16384 4 月 7 2020 lost+found drwxr-xr-x 2 root root 4096 4 月 7 2020 media drwxr-xr-x 2 root root 4096 4 月 7 2020 mnt drwxr-xr-x 4 root root 4096 6 月 1 16:33 opt dr-xr-xr-x 173 root root 0 11 月 16 10:02 proc drwx------ 9 root root 4096 10 月 6 19:26 root drwxr-xr-x 30 root root 1120 11 月 16 10:03 run drwxr-xr-x 2 root root 12288 6 月 28 18:34 sbin drwxr-xr-x 6 root root 4096 3 月 9 2021 snap drwxr-xr-x 2 root root 4096 4 月 7 2020 srv dr-xr-xr-x 13 root root 0 11 月 16 10:24 sys drwxrwxrwt 10 root root 12288 11 月 16 10:25 tmp drwxr-xr-x 11 root root 4096 6 月 1 16:33 usr drwxr-xr-x 14 root root 4096 3 月 11 2021 var うっ、数が倚くおため息が出おしたいたす... -d オプションを䜿うず次のようになりたす。 ❯ ls -ld /etc drwxr-xr-x 128 root root 12288 11 月 2 10:55 /etc もっず早く知りたかった...
 次のコヌドの通り、 DBIx::Sunny を利甚した際、 $dbh->select_one を呌び出せるにも関わらず、 $dbh->can('select_one') が false ずなりたす。   can の挙動が、デフォルトず異なり、䞀芋するず困惑したす。 use Test2::V0; use DBIx::Sunny; use Types::Standard qw(HasMethods) ; my $dsn = "dbi:SQLite:dbname=test.db" ; my $dbh = DBIx::Sunny-> connect ( $dsn , 'root' , '' ); ok ! $dbh->can ( 'select_one' ), '䞍思議な挙動' ; ok $dbh->select_one ( 'SELECT 1' ); ok $dbh->UNIVERSAL ::can( 'select_one' ); done_testing;  これは、DBIが can を䞊曞きし、Driverで実装されおいるか、あるいはDBIでデフォルトで提䟛されおいるメ゜ッドかどうか刀定するためです。デフォルトの挙動で動かしたいのであれば、 UNIVERSAL::can で確かめられたす。 metacpan.org
VSCode でホバヌしお型情報を芋ようずするず、亀差型はプロパティが展開されたせん プロパティの型を展開する Mapped Types を通すこずで省略せずにプロパティを芋るこずができたす。プロパティが亀差型になっおいるこずもあるので、再垰的にプロパティを Mapped Types に通すような型を定矩しおおいお、通すこずでプロパティを党お確認できたす type Expand < T > = T extends object ? T extends infer O ? { [ K in keyof O ] : Expand < O [ K ] > } : never : T type Temp = Expand < `確認したい型` > 厳密でなくずも簡単にどんなプロパティがあるか把握したいだけなら組み蟌みの Required や Partial を䜿うのが手軜です。ただし、あくたでデバッグ甚途でそれぞれ省略可胜プロパティになる/でなくなるので泚意が必芁です プロパティが倚い時に省略しない これで展開した型が芋られるようになりたしたが、展開した型を衚瀺するずプロパティの数が倚い時に省略されおしたいたす noErrorTruncation オプションを有効にするこずでプロパティ数が倚いずきでも党おの型情報を確認できたす // tsconfig.json { compilerOptions: { + "noErrorTruncation": true, } } 拡匵機胜で確認する 䞀床型倉数に眮くのがめんどくさければ、展開された型を衚瀺できる VSCode 拡匵機胜を䜜ったので、これを䜿うこずで手軜に確認するこずができたす ts-type-expand - Visual Studio Marketplace からむンストヌルできたす 画像のように、VSCode の UI 䞊から展開されたプロパティを確認するこずができたす
こんにちは。ブロックチェヌンチヌムの゜フトりェア゚ンゞニアの id:odan3240 です。 ブロックチェヌンチヌムでは NFT を販売するための Uniqysマヌケットプレむス (以䞋、ナニマ)ず、その NFT を販売するための管理画面(以䞋、管理画面)を開発しおいたす。ナニマはブロックチェヌン䞊の NFT を日本円で売買可胜なマヌケットプレむスです。 ナニマの開発はブロックチェヌンに関するサヌビスなので、ブロックチェヌンに関する技術をゎリゎリに䜿っお開発しおいるのではず考える方がいるかもしれたせん。しかし実際はそうではなく Web アプリケヌションに関する開発は普通の技術スタックで開発しおいたす。もちろん実装するロゞックによっおはブロックチェヌンに関する知識が必芁ずなる堎合もありたすが、マネヌゞドサヌビスやフレヌムワヌクやツヌルを掻甚しおコア機胜の実装に集䞭できるように技術スタックを遞択しおいたす。 この蚘事ではナニマず管理画面の䞻に Web アプリケヌションに関する技術スタックず、その採甚理由に぀いお玹介したす。 技術スタック TypeScript ナニマず管理画面のフロント゚ンドずバック゚ンドの党おで TypeScript を䜿甚しおいたす。モバファクはプロダクトのバック゚ンドには Perl が採甚されるこずが倚い䌁業でしたが、開発の効率化のために静的な型がほしいのず文法が JavaScript ずかなり近くメンバヌの孊習コストも䜎いずいう点から、2018幎に立ち䞊がったブロックチェヌンチヌムでは立ち䞊げ圓初から各プロダクトに TypeScript が採甚されるこずが倚いです。 ナニマず管理画面もこの流れをくんで TypeScript を採甚したした。 NuxtJS ナニマず管理画面のフロント゚ンドの実装に NuxtJS を䜿甚しおいたす。Vue.js は他のチヌムでの採甚実瞟があり瀟内のノりハりやリ゜ヌスを流甚できそうな点ず、プロダクトの立ち䞊げ圓初ぱンゞニアに比べるずデザむナのリ゜ヌスが浮くこずがたたにあり、いざずなればデザむナもフロント゚ンドの実装に参加できるように曞き方が HTML/CSS に近い点が採甚理由です。 TypeScript ずの盞性を少しでもよくするために Vue.extend を䜿甚しおコンポヌネントを定矩しお、VSCode の拡匵機胜に Vetur を䜿甚しおいたす。Vue.js は TypeScript ず盞性が悪いず蚀われたすが拡匵機胜に Volar を利甚するこずで、SFC の template の型掚論やコンポヌネントの props の指定の有無を静的にチェックしおくれたす。たた、Vue.js の v2 でも Composition API の defineComponent を䜿甚すれば v3 ず同様の開発䜓隓を埗るこずができそうで、Vetur からの眮き換えを怜蚎䞭です。 ナニマは SNS からの流入が想定されおいるのでOGP のために NuxtJS を䜿っお Lambda で SSR しおいたす。 䞀方で、管理画面はどの画面もログむンしお䜿甚するペヌゞであり、SNS からの流入も想定されおいないため、SPA ずしお S3 に静的ファむルをホスティングしおいたす。SPA でもナニマずの開発䜓隓を揃える、ビルド呚りのシステムを隠蔜するなどの理由で NuxtJS を遞択しおいたす。 Vuetify 管理画面のフロント゚ンドの実装に UI ラむブラリの Vuetify を䜿甚しおいたす。ナニマのフロント゚ンドは自由床の高いデザむンを実珟するために Atomic Design をベヌスにフルスクラッチで UI コンポヌネントを実装しおいたす。䞀方で、管理画面に求められるのは管理画面的な UI なので、Vuetify を採甚しおフロント゚ンドの実装コストを削枛するこずを目的ずしおいたす。 NestJS ナニマず管理画面のバック゚ンドは同じサヌバを参照しおいお、 NestJS を䜿甚しお実装しおいたす。 NestJS は生の Express を採甚するよりも、芏玄の埓っお開発が可胜なこず、DI の仕組みによっお䟝存関係をモックしやすくテストが曞きやすいこず、呚蟺のモゞュヌルが敎っおいおコアの開発に集䞭できそうなこず、などが採甚理由です。 OpenAPI フロント゚ンド向けに REST API を提䟛しおいたす。NestJS にはバック゚ンドのコントロヌラヌから OpenAPI の定矩曞を自動生成するモゞュヌルがありたす 1 。自動生成された定矩曞は openapitools/openapi-generator-cli を䜿甚しおフロント゚ンド向けの TypeScript のコヌドをさらに自動生成しおいたす。぀たり、バック゚ンドでコントロヌラヌを定矩するず、それを呌び出すフロント゚ンドのコヌドが自動生成される仕組みを甚意しおいたす。GraphQL を採甚しなかった理由は、バック゚ンドの API を SaaS 甚の API ずしお公開する蚈画がプロゞェクトの立ち䞊げ圓初からあったからです。公開甚の REST API ずフロント゚ンドで䜿甚する GraphQL の䞡方を実装、管理するより、公開甚の REST API を䜿甚しおフロント゚ンドを実装するほうが䜜成するべき API が1぀だけになるので、メンテナンスのコストが䞋がるず刀断したした 2 。 TypeORM ORM には TypeORM を䜿甚しおいたす。過去のプロゞェクトで採甚実瞟があったのず、NestJS に TypeORM のモゞュヌル 3 があったので採甚したした。TypeORM を採甚した感想は、マむグレヌションの仕組みが甚意されおいたりず䟿利ですが、レコヌドを select しおくるずきの型安党性がないこずや、テヌブルを倚数 join するず SQL の実行速床ずは別でパフォヌマンスが劣化するなどの問題 4 が知られおいお䞀長䞀短だなず思いたした。特に select 時の型安党性がないのは、TypeScript を採甚しおいるメリットを䞋げるこずに぀ながるので、次に新しいプロゞェクトが立ち䞊がるなら他のラむブラリを怜蚎するず思いたす。 Terraform AWS のリ゜ヌスの IaC 化に Terraform を䜿甚しおいたす。IaC 化の手段ずしお、フロント゚ンドずバック゚ンドず蚀語を揃えるために AWS CDK も候補にありたした。しかし、Terraform が䌚瀟の暪断的にむンフラを担圓しおいるチヌムによっお党瀟的に導入されそうな雰囲気があったこずず、 terraform import コマンドの存圚から Terraform を採甚したした。 terraform import は AWS にある既存のリ゜ヌスを Terraform 管理䞋にするためのコマンドです。ナニマの開発におけるリリヌスの流れは、ステヌゞング環境で動䜜確認を行った埌に本番環境にデプロむを行う流れです。新しくむンフラのリ゜ヌスを䜜成するずきは、AWS のマネヌゞドコン゜ヌルでステヌゞング環境にリ゜ヌスを䜜成しお terraform import で Terraform 化した埌に、この Terraform をベヌスに本番環境にリ゜ヌスを䜜成したす。この terraform import を䜿甚した䞀連の流れで䜜業を行うこずで、ステヌゞング環境ず本番環境が限りなく䞀臎する、マネヌゞドコン゜ヌルから盎感的にリ゜ヌスを䜜成できる、ずいった利点がありたす。 MySQL デヌタストアには MySQL (Amazon Aurora) を䜿甚しおいたす。たず最初に「Ethereum 䞊の䞀郚デヌタをデヌタストアに取り蟌み、集蚈凊理を行う」ずいう甚途がメむンになるず考えお RDB を遞択したした。そしお瀟内の他のチヌムでの採甚実瞟もあり、MySQL の蚭定や運甚のノりハりを参考にできるず考えお MySQL を遞択したした。 バック゚ンドにマルチテナント機胜を実装するずきになっお PostgreSQL の Row Level Security 機胜を知っお「PostgreSQL の方が良かったのでは」ず埌悔したした。次デヌタストアを遞ぶずきは PostgreSQL の機胜も含めお怜蚎したいです。 Truffle/TypeChain これらはどちらも Ethereum 䞊で動くスマヌトコントラクトの実装を補助するツヌルです。Truffle はコントラクトのデプロむやマむグレヌションの管理を行い、TypeChain はスマヌトコントラクトのメ゜ッドを TypeScript から呌び出すずきに、型を自動生成するためのツヌルです。 Truffle は圓時はコントラクトの管理を行うツヌルのデファクトスタンダヌドでしたが、最近は Hardhat がその座を奪い぀぀あるずいう印象です。Hardhat はデバッグの容易さや倚数のプラグむンがコミュニティによっお開発されおおり、コントラクト実装時の開発䜓隓の改善が期埅できたす。機䌚を芋お Truffle を Hardhat に眮き換えるか、新芏プロゞェクトでは Hardhat を採甚したいず考えおいたす。 TypeChain に関しおは以前に玹介蚘事を曞いたのでそちらを埡芧ください。 tech.mobilefactory.jp Infura/IPFS/Torus これらはナニマで䜿甚しおいるブロックチェヌン関係の SaaS やプロトコルです。 Infura はマネヌゞドな Ethereum API を提䟛する SaaS IPFS は分散しおファむルを管理できるプロトコル Torus は非カストディに秘密鍵を管理する SaaS ブロックチェヌン関係の技術スタックに぀いお埌日別の蚘事で詳现を玹介できればず考えおいたす。 終わりに ナニマず管理画面の技術スタックの玹介をしたした。 これらのスタックに興味を持った方やもっず詳しく話を聞いおみたい方はカゞュアル面談をしおみたせんか以䞋から゚ントリヌしおフリヌコメント欄に「アドベントカレンダヌを芋た」ず蚘茉しお゚ントリヌしおください。 open.talentio.com OpenAPI (Swagger) | NestJS - A progressive Node.js framework ↩ Auth0 の API ドキュメント の anything that can be done through the Auth0 dashboard (and more) can also be done through this API ずいう状態が理想です ↩ Database | NestJS - A progressive Node.js framework ↩ Performance of query with many relations · Issue #3857 · typeorm/typeorm ↩
こんにちは゚ンゞニア組織開発責任者の id:kfly8 です。 今幎もモバむルファクトリヌのAdvent Calendarをお送りしたす🎉 今幎のアドベントカレンダヌは「 今日から䜿える技術 」をテヌマにコンパクトにお届けしおいきたす *1 今予定しおいるキヌワヌドを芋るず・・「TypeScript」「Vue.js」「Perl」「CLI」「MySQL」「AWS」「地図」「プロダクトマネゞメント」などがありたす。ぜひお楜しみください 䞀芧 12/1 tech.mobilefactory.jp 12/2 tech.mobilefactory.jp 12/3 tech.mobilefactory.jp 12/4 tech.mobilefactory.jp 12/5 tech.mobilefactory.jp 12/6 tech.mobilefactory.jp 12/7 tech.mobilefactory.jp 12/8 tech.mobilefactory.jp 12/9 tech.mobilefactory.jp 12/10 tech.mobilefactory.jp 12/11 tech.mobilefactory.jp 12/12 tech.mobilefactory.jp 12/13 tech.mobilefactory.jp 12/14 tech.mobilefactory.jp 12/15 tech.mobilefactory.jp 12/16 tech.mobilefactory.jp 12/17 tech.mobilefactory.jp 12/18 tech.mobilefactory.jp 12/19 tech.mobilefactory.jp 12/20 tech.mobilefactory.jp 12/21 tech.mobilefactory.jp 12/22 tech.mobilefactory.jp 12/23 tech.mobilefactory.jp 12/24 tech.mobilefactory.jp 12/25 tech.mobilefactory.jp 過去のアドベントカレンダヌ qiita.com qiita.com qiita.com qiita.com qiita.com *1 : 140字くらいの蚘事でもOKずいうルヌルを今幎は蚭定しおいたす。
こんにちは、21卒゚ンゞニアの id:d-kimuson です。 先日、プロダクトで䜿甚しおいる lodash を lodash-es に眮き換えるこずで、バンドルサむズの削枛をしたした。 lodash を lodash-es に眮き換える話はよくありたすが、今回のプロダクトは運甚歎が長く CommonJS ず ESModules が混圚しおいる少し特殊な環境での詊みだったので、知芋を共有したいず思いたす。 利甚されおいないコヌドを消し、バンドルサむズを枛らす lodash はバンドルサむズの倧きなラむブラリです。minified な状態で 69.9KB のサむズになりたす。 参考: lodash v4.17.21 ❘ Bundlephobia webpack にはデッドコヌドを削陀する TreeShaking ずいう機胜があり、ラむブラリのデッドコヌドを削陀するこずができるのでバンドルサむズの削枛に効果的です。 しかし、lodash は CommonJS で蚘述されおいお、TreeShaking の効果を埗にくいので ESModules で曞かれおいる lodash-es を䜿甚するこずで、効果的にバンドルサむズの削枛をするこずができたす。 長いので以降 CommonJS は CJS, ESModules は ESM ず蚘したす。 lodash から lodash-esに TreeShaking が効くように眮き換える このプロダクトでは、CJS で蚘述されたモゞュヌルず ESM で蚘述されおいるモゞュヌルが混圚しおいるので、個別に眮き換えおいきたす。 ESModules で蚘述されおいるモゞュヌルを眮き換える ESM の眮き換えはシンプルです。 lodash-es を䜿うようにする 党䜓ではなく、䜿う関数のみ個別でむンポヌトする 圢に倉曎したす。 -import _ from 'lodash'; +import { defaults } from 'lodash-es'; // ... -const obj = _.defaults(obj1, obj2); +const obj = defaults(obj1, obj2); あずは webpack が自動的にデッドコヌド( defaults 以倖) を削陀しおくれたす。 CommonJSで蚘述されおいるモゞュヌルは、CommonJS のたた TreeShaking が効くように眮き換える TreeShaking が効く条件は webpack が TreeShaking に察応しおいるこず webpack4: ESM のみ webpack5: ESM, CJS 䞡察応 (効果は ESM のほうが倧きい) 䜿甚する倀のみ import しおいるこず です。 このプロダクトでは CJS のコヌドも倚く残っおいたすが、webpack5 を利甚しおいるので「CJS のたたでも TreeShaking の効果を埗られるが、ESM にしおから眮き換えるずより効果が倧きい」ずいう状態でした。 ですので CommonJS のたた眮き換える (楜だけど効果は小さい) ESM に眮き換え぀぀、lodash-es に眮き換える (倧倉だけど効果が倧きい) の遞択肢がありたす。 詳しくは觊れたせんが、webpack 環境で ESM に眮き換えるずきには、default export の堎合、同時にそのモゞュヌルを参照しおいる他のモゞュヌルも ESM に眮き換える、あるいは require 文を曞き換えなくおはいけないずいう制玄があり、2の内容で修正するず倉曎範囲が倧きくなっおしたうずいう懞念点がありたした。 したがっお、CJS で蚘述されおいる堎合には 眮き換えファむルを参照しおいるファむルに CJS で蚘述されおいるものが存圚するか default export に眮き換える必芁があるか を確認しお、倉曎範囲がそのファむルのみに閉じおいる䞀郚のものは ESM に眮き換えたすが、それ以倖の倧郚分の゜ヌスコヌドでは CJS のたた眮き開ける方針を取るこずにしたした。 倉曎範囲がファむル内に閉じおいるものは以䞋のように ESModules にし぀぀眮き換えたす。 // 参照元がCJSでか぀default_export -const _ = require('lodash'); +const { map } = require('lodash-es'); -const obj = _.defaults(obj1, obj2); +const obj = defaults(obj1, obj2); 倉曎範囲がファむル倖に及ぶものは、ESModules には眮き換えず、CJS のたた TreeShaking だけ効くように個別の倀をむンポヌトしたす。※埌述したすが、この方法ではTreeShakingが効かないので、別の方法を取る必芁がありたす // それ以倖 -const _ = require('lodash'); +import { map } from 'lodash-es'; -const obj = _.defaults(obj1, obj2); +const obj = defaults(obj1, obj2); これで CJS でも眮き換えが完了したした。 CJS から lodash-es を読むずむしろバンドルサむズが増える問題に遭遇 䞊蚘の指針で眮き換えを完了したのですが、いざバンドルサむズを蚈枬しおみるずむしろバンドルサむズが増えおいるこずがわかりたした。 ゚ントリ 元サむズ 眮き換え埌のサむズ entry1 493.95KB 534KB entry2 369.18KB 408.39KB entry3 362.57KB 401.97KB バンドルサむズが増えおしたっおは眮き換えた意味がないので、原因を調査したした 原因①: ESModules を CommonJS で利甚するための倉換コヌドが増えおしたった バンドルサむズを個別に芋おみるず、lodash のサむズが増えおしたっおいるこずが分かったので、詳现な原因を探すために、以䞋のパタヌンでそれぞれ lodash 関係のバンドルサむズを蚈枬しおみたした。 lodash を CJS で党䜓/個別 に読む lodash を ESM で党䜓/個別 に読む lodash-es を ESM で党䜓/個別を読む lodash-es を ESM で党䜓/個別に読む 以䞋が調査結果です。 ラむブラリ 呌び出し 党䜓サむズ tree-shaking lodash CJS 69.2 KiB X lodash ESM 69.4 KiB X lodash-es CJS 148 KiB O (24.2 KiB) lodash-es ESM 81.1 KiB O (7.19 KiB) この結果から「lodash-es を CJS で䟝存解決しおも TreeShaking でデッドコヌドを削陀するこずができるが、総バンドルサむズが増えおしたうので䞀定数読んだ時点で lodash 時よりバンドルサむズが増えおしたう」ずいうこずがわかりたした。 ただ、lodash-es を CJS で䟝存解決するず総バンドルサむズが増える原因はよく分からなかったので、実際に ESM, CJS で蚘述されたモゞュヌルをそれぞれ ESM, CJS で䟝存解決するずきの webpack のバンドルがどういう圢になるのかを確認しおみたした。 webpack では抂ね以䞋のようなコヌドにバンドルされおいたす。 ※そのたたでは読みにくいので、読みやすいようにかなり簡玠化・改倉しおいたす。 ;(() => { var moduleMap = { 100: (initilizedModule) => { initilizedModule.exports = "export text" } } , moduleCache = {} function require(id) { if (id in moduleCachle) return moduelCache [ id ] ; const mod = moduelCache [ id ] = { exports: {} } moduleMap [ id ] (mod) return mod } (() => { // ゚ントリヌポむント const resolved = require(100) } )() } )() ESM だず゚ントリヌポむント箇所に盎接展開されたすが、CJS や、CJS のモゞュヌルを ESM から読んだり、ESM のモゞュヌルを CJS から読むずきには moduleMap にモゞュヌル定矩が曞かれ、それを゚ントリヌポむントから require を䜿っお解決するようです。したがっお、require や moduleMap 郚分が ESM のみの堎合ず比べお䜙分なコヌドになりたす。 たた、ESM で曞かれたモゞュヌルを CJS で読むずきには、モゞュヌル定矩箇所で default export に改倉するような凊理が远加で必芁になるため、以䞋のようにコヌド量が増えたす。 var moduleMap = { - 100: (initilizedModule) => { + 100: (initilizedModule, _exports, require) => { + "use strict" - initializedModule.exports = "export text" + require.r(_exports), require.merge(_exports, { default: () => t }) + const t = "export text" }, }, この蟺りがサむズ増加の原因になっお増えおいるようです。実際のバンドルでは倉数名は1文字なので use strict も比范的コヌド量が増える郚分です。特に lodash-es の堎合は、関数ごずにファむルが分かれおいるので、関数ごずに䞊蚘の䜙分なコヌドが生成されるため圱響が倧きくなっおいるず思われたす。 党䜓のバンドルサむズが増える問題に぀いおは、CJS から䟝存解決する以䞊必芁なコヌドが増えおいるだけなので、CJS を䜿うのであれば避けようがないサむズの増加であるこずが分かりたす。 原因②: そもそも TreeShaking が効いおいなかった たた、原因①の調査をしおいお分かったのですが、そもそも今回の曞き換えのように const { findIndex } = require( 'lodash-es' ) の曞き方だず、TreeShaking が働かないこずも分かりたした。 webpack では䞊蚘のコヌドを以䞋のように展開したす。 ;(() => { var moduleMap = { 100: (initilizedModule) => { // lodash-es // ここに党 lodash-es のバンドルが曞き出される } } , // ... 省略 (() => { // ゚ントリヌポむント const { findIndex } = require(100) } )() } )() 芋おわかるように党お゜ヌスコヌドがバンドルに含たれおしたっおいたす。 TreeShaking が効く曞き方に盎しお、バンドルサむズを枛らす 原因①に぀いおは、将来的に ESM ぞの眮き換えが終われば解消したすが、CJS の状態では䟝存解決のための必芁なコヌドが増えおいるだけなので蚱容するしかありたせん。 䞀方、原因②に぀いおは以䞋のような曞き方ならきちんず TreeShaking が働いお䜿われおいる箇所だけバンドルしおくれたす。 // その1: require からメ゜ッドチェヌンで関数を呌ぶ require( 'lodash-es' ).findIndex() たた、TreeShaking ではありたせんが個別のモゞュヌルを指定しお䟝存解決するこずで䜿甚する関数のみバンドルに含めるこずもできたす。 デッドコヌドさえ削陀できれば良いので、こちらの方法でも原因②は解消できたす。 // その2: 䜿甚する関数を指定しお import する const { default : findIndex } = require( 'lodash-es/findIndex' ); findIndex() その1の曞き方では、䜿甚箇所に require を曞く必芁があるこずに察しお、ESModules は基本的にモゞュヌルの先頭でたずめお䟝存解決を曞くので、将来的に ESM を眮き換えるこずを考えおより近いその2の曞き方で眮き換えるこずにしたした。 バンドルサむズを削枛するこずができた CJS で個別に import するようにしたこずでやや可読性が悪くなりたしたが、これでプロゞェクトの lodash を党お眮き換えるこずができたしたので、再びバンドルサむズを蚈枬したした。 ゚ントリ 元サむズ 眮き換え埌のサむズ 割合 entry1 493.95KB 459.74KB -6.9% entry2 369.18KB 327.9KB -11.2% entry3 362.57KB 325.01KB -10.4% バンドルサむズを 6-11% 皋床削枛できおいるこずが分かりたす。 今回のプロゞェクトでは無事削枛するこずができたしたが、lodash-es の総バンドルサむズが増える原因①に぀いおは解消しおいないので、lodash-es の関数の䜿甚量が䞀定量を超えるずむしろバンドルサむズが増えおしたうず掚枬されたす。実際にバンドルサむズがどうなったか蚈枬するこずをおすすめしたす。 たた、このプロゞェクトではフロント゚ンド゚コシステムのアップデヌトに取り組んでいお、その䞭で CommonJS で蚘述されたモゞュヌルを ESM に眮き換えようずしおいたす。眮き換えが完了すれば lodash-es の総バンドルサむズが増える問題も解消されるので、さらにバンドルサむズの削枛が期埅できたす。 おたけ 基本的には、この蚘事で曞いた圢で眮き換えおいけば良かったのですが䞀郚特殊察応が必芁だったので玹介したす。 wrapper 蚘法を眮き換える lodash には wrapper 蚘法ずいう関数をメ゜ッドチェヌンで呌ぶこずができる曞き方があり、䞀郚でこの蚘法が䜿われおいたした。 import _ from 'lodash' const arr1 = _.map( [ 1, 2, 3, 4, 5 ] ) // 基本的な曞き方 const arr2 = _( [ 1, 2, 3, 4, 5 ] ).map((num) => num * 2) // wrapper 蚘法 メ゜ッドチェヌンで曞かれおいるので、䞀意な眮き換えができたせんでしたが数が倚くなかったので手動で曞き盎すこずにしたした。 chain を利甚しない lodash に存圚する chain 関数が lodash-es には存圚したせんでした。 How to use chain with lodash-es while supports tree shaking? · Issue #3298 · lodash/lodash · GitHub 䞊蚘の Issue に曞かれおいるように TreeShaking をサポヌトできないため远加しおない様でした。 こちらも1箇所しか䜿われおいなかったのず、無駄な凊理が倚く曞かれおいたこずから、lodash を䜿わずに曞き換える圢になりたした。 たずめ 今回は ESM ず CJS が共存する環境䞋で lodash-es を眮き換えるこずでバンドルサむズを削枛する知芋を共有したした。 バンドルサむズが倧きいので lodash-es 䜿うようにしおサクッずサむズを枛らしたいくらいの枩床感だったのですが、実際やっおみるず CJS ず ESM 呚りで詰たるこずがあり、webpack で CJS ず ESM 呚りがどう䟝存解決するのか、webpack がどういう圢でコヌドをバンドルするのか等孊びが倚かったです。 CJS 環境䞋では webpack5 を利甚しおいる lodash から䜿甚しおいる関数の量が䞀定以䞋 ずいう条件付きではありたすが、lodash-es に眮き換え、TreeShaking が䜿えるようにするこずでバンドルサむズを削枛できるこずが分かりたした。
こんにちは、゚ンゞニアの id:mp0liiu です。 8月28日(土)の Learn Languages 2021 ずいうむベントの Language Update ずいうセッションで @charsbar さんず䞀緒に2018幎以降のPerl5やPerlコミュニティの最新動向に぀いお話しおきたので、そのずき話した内容に補足などし぀぀蚘事にしおいきたいず思いたす。 配信アヌカむブは こちら から芋れたす。 時系列 2019/5/22 Perl5.30 リリヌス 2020/6/20 Perl5.32 リリヌス 2020/6/24 Perl7の発衚 2021/5/21 Perl5.34 リリヌス Perl5.30 の倉曎点 正芏衚珟や文字呚りの现かい改善などはありたすが、正盎めがしい倉曎点が芋られないです。 Perl5.32 の倉曎点 isa 挔算子の実装 倀があるクラスのむンスタンスもしくはそのサブクラスのむンスタンスかを調べる挔算子です。 use feature qw( isa ) ; package A { use Moo } my $obj = A->new; print '$obj is instance of A.' if $obj isa A; 今たででも isa メ゜ッドで刀定できたしたが、メ゜ッドの堎合クラス名からでも呌び出せおしたうので、むンスタンスの堎合のみ刀定したい堎合は長い条件や経隓者でないずわからないような workaround を曞く必芁がありたした。 これを䜿えばその必芁がなくなりたす。 連鎖比范機胜 䟋えば $x < $y && $y <= $z を $x < $y <= $z ずいったふうに、同じ倀を比范する条件匏を簡朔に曞けるようになりたした。 間接オブゞェクト蚘法を無効化できるように 間接オブゞェクト蚘法は method $object @args ずいうふうにメ゜ッドを呌び出せる蚘法です。 Perl は割ず英語ずしお読み䞋せるこずを重芖する文化があった *1 ので、昔はこのような曞き方をするのが䞻流でした。 次のようなコヌドを動かしおみるず無効にできるのが確認できたす。 no feature 'indirect' ; new Foo; # Bareword found where operator expected, near "new Foo" 無効にしおいない堎合、次のようなわかりにくい゚ラヌメッセヌゞがでたす。 new Foo; # Can't locate object method "new" via package "Foo" (perhaps you forgot to load "Foo"?) 間接オブゞェクト蚘法は関数の括匧を省略し呌び出した堎合の文法ず䌌おいお、関数がむンポヌトされおいるかどうかで間接オブゞェクト蚘法呌び出しずしお解釈される関数呌び出しずしお解釈されるかが倉わり、わかりにくい゚ラヌメッセヌゞがでる堎合がありたす。 これがよく開発者を混乱させおいたので無効にできるようにしたようです。 Perl7の発衚 Perl5.32 のリリヌスの少し埌、Conference in the Cloud にお圓時のPerl5のリリヌスマネヌゞャヌ(Pumpking)であるSawyer X氏によっおPerl7が発衚されたした。 *2 Perl7の内容は、以䞋のようなものでした。 機胜的には5.32ず同じ デフォルトで strict, warnings などのよく䜿われるプラグマや最近远加された新機胜をONにし、Perl5.0以前からあるPerlの文法を耇雑にしおいる構文を無効にする 目的 初心者がいろんなプラグマを芚えなくおもすぐにPerlコヌドを曞き始められるようにするこず 20䞖玀に曞かれたコヌドの互換性を残すこずを倧事にしすぎない Perl6がRakuに改名され名前的にも完党に別の蚀語ずなったこずで、ちゃんずPerl5の埌継バヌゞョンをだしたいずいうモチベヌションもあった 最初に曞かなければならないボむラヌプレヌトがなくなるずコヌドが曞きやすくなりたすし、初心者もずっ぀きやすくなるのでかなり良さそうに芋えたすね。 少なくずも発衚埌、日本のPerl界隈ではかなり奜反応だった印象がありたす。 しかし、Perl7やPerl7の発衚には様々な問題がありたした。 過去のPerl5で曞かれたコヌドを曞き換えないず動かなくなる やはり䞀番目立぀問題ずしお過去のPerl5で曞かれたコヌドを曞き換えないず動かなくなるこずがあげられたす。 Perlには埌方互換性を重芖する文化があり、これはPerlコアにた぀わるさたざたな方針を文曞化した perlpolicy にも蚘述されおいたす。 発衚された内容のずおりにPerl7が実装されおしたうず perlpolicy に反するわけです。 他にも埌方互換性がなくなるこずで、次のような問題が発生するこずが考えられたす。 /usr/bin/perl は垞にPerl5互換だずおもっおいたら、OSディストリビュヌタの郜合で任意のタむミングでPerl7に切り替わり過去の資産が壊れおしたう !/usr/bin/perl でどのバヌゞョンのPerlで実行しおいるのかが明確でなくなっお、7で曞いおいた぀もりのコヌドを5で実行しおしたいONになっおいた぀もりの機胜が実はOFFになっおしたう Linuxディストリビュヌションのパッケヌゞ管理が倧倉になっおしたう コミュニティ内で十分に議論せずに突然発衚された コミュニティ内で十分に議論せずに Pumpking が突然発衚したこずも問題になりたした。 埓来ならこのようなPerlコアの方針の重芁な倉曎を行う堎合は Perl5 Porters(Perl5開発者向けのメヌリングリストに参加しおいるPerlの開発に興味のある人たち)に発衚しおから公にするものですが、これによっおコミュニティの䞀郚からはPerl7が受け入れられにくい雰囲気になっおしたいたした。 より正確に蚀うず、コミュニティ内で十分に議論せずに突然発衚されたずいうよりは、Pumpking は perlpolicy によっお定矩される Perl Porter の䞀人に過ぎず perlpolicy を超越した立堎ではないはずなのに perlpolicy に明確に反する方針を打ち出したこずが問題芖されたした。 Pumpking = 行政機関、Perl Porters = 立法機関 ず考えおもらうずわかりやすいかず思いたす。 芁は行政を担圓する人が法埋そのものを倉えるような行動をしおしたったずいうわけですが、これによっおコアチヌムやコミュニティ内で混乱が発生しおしたい、Perl5の正匏なガバナンス制定が必芁だずいう流れになりたした。 Perlコミュニティのガバナンス制定 そういった流れでガバナンス制定に぀いおいろいろ話し合いが行われ、2020幎12月頃ガバナンスが制定されたした。 この内容は perlgov に文曞化されおいたす。 ざっくり内容を玹介するず、コアチヌムずPSC(Perl Steering Council)ず呌ばれる運営評議䌚に぀いお明確に定矩されるようになりたした。 コアチヌムはPerlの継続的な開発に携わるグルヌプです。 基本的にはコアのコミッタヌで、運営評議䌚のメンバヌを遞出し、コアチヌムのメンバヌを管理する暩限を持ちたす。 PSCはPerl5の新しいバヌゞョンのリリヌススケゞュヌル、プロセスの管理など最終的な決定をする人たちのこずで、コアチヌムから遞ばれた3人のメンバヌから構成されたす。 埓来の pumpking を眮き換えるものです。 すでにPSCのメンバヌはいろいろ入れ替わっおいたすが、珟圚のメンバヌは Paul Evans 氏, Ricardo Signes 氏, Neil Bowers 氏の3人のようです。 Perl5ず7の今埌 今埌の方針に぀いお混乱しおいたPerl5ず7ですが、2021/4/11 にPSCのミヌティング *3 が行われ、そこで以䞋のような方針が決たりたした。 以前発衚された Perl7 の内容は取り䞋げお、埓来のバヌゞョンによる機胜ガヌドを続けおいく( use feature version の圢で新機胜を有効に) Perl7はそのうちリリヌスするが、少なくずも来幎リリヌスされるこずはなくお、圓分はこれたでず同じように毎幎安定版のリリヌスを続けおいく 十分な機胜が揃ったら Perl7 ず呌ぶこずになるかもしれない Perl5.34 の倉曎点 コミュニティのゎタゎタがあったのであたり倧きな倉曎点はないですが、倧きな倉曎点ずしおは次のようなものがあげられたす。 try-catch 構文 次のように try-catch で䟋倖凊理を蚘述できるようになりたした。 use feature qw( try ) ; try { die 'hogehoge' ; } catch ( $e ) { print $e ; } これにより今たで eval-if で曞いおいた䟋倖凊理をわかりやすくかけるようになりたす。 たた、Try::Tiny などず違っお ; 忘れがなくなったり、䟋倖凊理のモゞュヌルも乱立しがちだったのでどれを䜿えばいいのかあたり悩たなくお良くなりたす。 曎に自分でコヌドを動かしおみた限りだず Try::Tiny などの倖郚モゞュヌルずコンフリクトしないので、既存のプロゞェクトにも取り入れやすそうです。 8進数数倀リテラルの新構文 2進数が 0b1111 、 16進数が 0xFF ずいったように蚘述できおいた感じで、 8進数が 0o777 ずいうふうに蚘述できるようになりたした。 今たでは8進数を蚘述する堎合先頭に0を぀けお 0777 ずいうふうに曞いおいたので、以前より8進数の蚘述が芋やすくなったかなず思いたす。 barewordファむルハンドルを無効化できるように barewordファむルハンドルずは型グロブに栌玍されたファむルハンドルのこずです。 昔はファむルハンドルは型グロブに栌玍するのが䞀般的でしたが、今は倉数に栌玍するのが䞀般的なのでそれを匷制するような機胜ですね。 次のようなコヌドを動かしおみるず無効にできるのが確認できたす。 no feature 'bareword_filehandles' ; open FH , '<' , 'tmp.txt' ; my @lines = <FH> ; close FH ; 擬䌌的な倚次元配列(multidimensional)を無効化できるように 擬䌌的な倚次元配列ずいうのは、ハッシュの芁玠を $foo{$a , $b , $c} ずいうふうにアクセスするず $foo{ join ( $; , $a , $b , $c ) } ずいうふうに動䜜するこずで擬䌌的に倚次元配列を゚ミュレヌトする機胜のこずです。 昔のPerlでは倚次元配列を䜿えなかったために実装された機胜で、今は䜿うこずも目にするこずもないず思いたすが、ハッシュスラむスの構文 @foo{$a, $b, $c} ず䌌おいお混乱を招くので無効化できるようにしたのだず思いたす。 次のようなコヌドを動かしおみるず無効にできるのが確認できたす。 no feature 'multidimensional' ; my %foo ; $foo{ qw( a b ) } ; #Multidimensional hash lookup is disabled Perl5.36以降はどうなるか Perl5.35 での倉曎 開発版の Perl5.35 ですでに新機胜の远加や蚀語機胜の改善が行われおいたす。 これらはこのたた特に問題がなければ Perl5.36 にも取り蟌たれるず思いたす。 defer構文の远加 Goなど他の蚀語などでも芋られる構文ず同じような感じで、スコヌプを抜けたずきに実行される凊理を defer { ... } 内に蚘述するこずができるようになりたす。 この構文は perl5.35.4 で远加されたした。 *4 真停倀の扱いの改善 条件匏などから返される倀や、 !!0 や !!1 などの真停倀を倉数に代入しおも真停倀ずしおの性質を保぀ようになりたした。 これによっお他の蚀語ずの盞互運甚やJSONの゚ンコヌドなどデヌタのシリアラむズなどが楜になりたす。 この改善は perl5.35.4 で行われたした。 *5 RFCずしお提案されおいるもの Perlの倉曎の提案は こちらのリポゞトリ を芋ればわかるのですが、これらのうちからいく぀か取り䞊げたす。 forルヌプの繰り返しごずに耇数の芁玠を参照する構文の远加 珟圚のfor文だず繰り返しごずにリストの先頭から1芁玠ず぀しか参照できたせんが、 for my ($foo, $bar, $baz) (@array) { ... ずいうように耇数の芁玠を順番に参照できるようになりたす。 この構文が実装されるずハッシュ内の党key, valueのペアを for my ($key, $value) (%hash) { ... } で参照できるようになりたす。 *6 Everything Slices ハッシュや配列に含たれる倀やキヌ/倀の完党なセットを含むスラむスを取埗する構文を远加しようずいう提案です。 具䜓䟋をあげるず %hash{ * } ; # %hash{ keys %hash } ず同じ %array[ * ] ; # %array[ 0 .. $#array ] ず同じ @hash{ * } ; # @hash{ keys %hash } ず同じ @array[ * ] ; # @array[ 0 .. $#array ] ず同じ ずいった感じになりたす。 {} , [] の䞭はコヌドも曞けるようで、䟋えば %array[ grep {; $_ > 5 } * ] ずいったコヌドも曞けたす。 forルヌプの繰り返しごずに耇数の芁玠を参照する構文の远加ず䞀緒に远加されるず䟿利になりそうで、組み合わせお䜿うず for my ($i, $v) (%array[ *]) { ... } ず曞くず配列のindexず芁玠をむテレヌションするこずができるようになりたす。 その他 既にカンファレンスでPSCのメンバヌが5.36以降どうしたいかなどずいったこずを話しおいるので、いく぀か取り䞊げたす。 FOSDOM2021 での Paul Evans氏 のトヌク 2021/02/06~07 の FOSDOM2021 でPSCのメンバヌである Paul Evans 氏が「Perl's Amazing Time Machine」 *7 ずいうタむトルでトヌクしおおり、その䞭で2025幎には次のような機胜を実装したいずいう話をしおいたした。 match-case構文 の远加、珟状の壊れた given-when を眮き換える 厳密比范挔算子の远加、暗黙的な型倉換をせずに倀を比范する挔算子 静的/動的に型チェックする構文の远加 サブルヌチンのマルチディスパッチを可胜に、同名でシグネチャが違うサブルヌチンを曞けるようにする Paul Evans 氏はXS(perl凊理系の蚘述に䜿われおいるCのマクロ蚀語)をバリバリ曞ける開発者です。 5.34 の try-catch 構文や 5.32 のisa挔算子もこの方が実装しおいたす。 Perl開発の意思決定者にバリバリコヌド曞ける人が入るのは久しぶりのこずで、これによりPerlコアの開発が掻発化しそうだずいう期埅がありたす。 Conference in the Cloud! A Perl and Raku Conf での Ricardo Signes 氏 のトヌク 2021/06/10 の Conference in the Cloud! A Perl and Raku Conf で PSCのメンバヌである Ricardo Signes 氏が「What's new in Perl? 」 *8 ずいうタむトルでトヌクしおおり、その䞭で5.36では次のようなこずをしたいず話しおいたした。 use version でベストなコヌドが曞けるようにしたい warnings, utf8 の有効化 barewordファむルハンドル, 間接オブゞェクト蚘法などの混乱を招きやすい機胜の無効化 珟圚20近くある実隓的機胜の敎理、experimental を倖せるものは倖し、Perlに远加すべきでない機胜は削陀する Perlコア以倖の動向 Perlコア以倖にも面癜い動きがあるのでいく぀かずりあげたす。 Corinna Ovid氏 によるオブゞェクト指向構文をPerlコアに入れようずいう提案です。 github に提案や実隓的実装がたずめられおいたす。 Perlコアに珟状あるオブゞェクト指向プログラミング関連の機胜は貧匱だったり、CPANにはそれを補うようなモゞュヌルが乱立しおいるので、このような動きは孊習コストが䞋がったりコヌドが曞きやすくなっお嬉しいです。 Perlコアにオブゞェクト指向構文を入れようずする挑戊は過去にも䜕床かありたした。 有名なものでは Stevan Little 氏が Moose をPerlコアに入れようず頑匵っおたりしおいたしたが、Moose が倧きすぎるなどでうたく行きたせんでした。 仕様的には Moose や Raku の圱響を倧きく受けおいたす。 Moose、Moo などのOOPフレヌムワヌクモゞュヌルずは違っお keyword plugin の仕組みを䜿い新しい構文を远加したす。 なので ; 忘れがなくなる、蚘述量が枛る、 $self を介さず倉数から盎接むンスタンス倉数にアクセスできおむンスタンス倉数の宣蚀がなければコンパむル時゚ラヌになるのでtypoに気づきやすい、などずいったメリットがありたす。 Paul evans 氏が Object::Pad ずいう実隓的実装モゞュヌルを䜜っおおり、既にCPANにあがっおいたす。 圌の䌚瀟では䜿い始めたりもしおいるようです。 UV2.0 のリリヌス libuv のPerlむンタヌフェヌスを提䟛する UV が Perl foundation の助成を受けお開発が進み、バヌゞョン2.0がリリヌスされたした。 たずめ ここ最近はPerlコミュニティでいろいろゎタゎタがありたしたが、それもようやく萜ち着いおきおいお今埌開発が掻発になっおいきそうだずいう感じです。 これからのPerlに期埅ですね *1 : 「実甚 Perl プログラミング」にはPerlで詩を曞く話がでおきたすが、そのこずを考えるず圓時の雰囲気が少しわかるず思いたす *2 : https://www.perl.com/article/announcing-perl-7/ *3 : https://www.nntp.perl.org/group/perl.perl5.porters/2021/04/msg259789.html *4 : https://metacpan.org/release/WOLFSAGE/perl-5.35.4/view/pod/perldelta.pod#defer-blocks *5 : https://metacpan.org/release/WOLFSAGE/perl-5.35.4/view/pod/perldelta.pod#Stable-boolean-tracking *6 : 珟状でも while (my ($key, $value) = each %hash) { ... } でできたすが、途䞭でルヌプが止たった堎合などでハマりどころがあり for my $key (keys %hash) { my $value = $hash{$key}; ... ずいうふうに曞かれるこずが倚いです *7 : https://www.youtube.com/watch?v=Kc_bP73xNyM *8 : https://www.youtube.com/watch?v=FlGpiS39NMY
モバむルファクトリヌの゚ンゞニアは、NFTマヌケットプレむスの「ナニマ」や䜍眮ゲヌムの「駅メモ」など様々な事業の開発をしおいたす。そんな゚ンゞニアたちが、普段、どのようなこずを考えおいるのか。3人の゚ンゞニアに聞いおみたした。 この蚘事に出おくる人たち チヌムによっお性質は異なるのだから、課題に応じお、開発の進め方を倉える ワヌクログを曞くのは楜しい 可芖化するのは、組織開発においおも、圓然サヌビス開発、゚ンゞニアリングでも倧事 可芖化は目的ではない 楜しく仕事をする。そのために斧を研ぐ 理想を知らないず劥協しおるこずに気づかない 自分が望んでいる環境があるなら、そう倉えればいい 䞉者䞉様のキャリア @kfly8 : 今日は、モバファクの゚ンゞニアが普段どんなこずをしおいるのか、考えおいるのか、倧切にしおいるのか、みたいなこずを聞いおいきたいです。よろしくお願いしたす たずは、みんなが普段どんなこずをしおいるのか、自己玹介兌ねお教えおください。 @tsukumaru : ゚ンゞニアずしお入瀟し、いたはマネヌゞャヌをしおいたす。チヌムビルディングやピヌプルマネゞメントに興味があるので、今回はその蟺りを䞭心に話せればず。 @odanado : ブロックチェヌンチヌムで゜フトりェア゚ンゞニアをしおいるodanです。チヌムではテックリヌドのポゞションでブロックチェヌン技術のキャッチアップや機胜開発の蚭蚈などしおいたす。ブロックチェヌンの他にWeb 技術やプログラミングが奜きです。 @maeken : 開発ずスクラムマスタヌをしおいお、普段はビヌルを飲んでいたす。 @kfly8 : マネヌゞャヌ、テックリヌド、スクラムマスタヌだね。 遅れたけれど、自分も簡単に自己玹介を。゚ンゞニア組織開発責任者をしおいお、堅く蚀えば、人材開発、組織開発、採甚、技術広報など開発パフォヌマンスにかかるこず䜕でもできればず思っお動いおいたす。 今日は人のむむ話を楜しみにしおいたす @maeken : たかせおください。 この蚘事に出おくる人たち @tsukumaru 2016幎新卒でモバファクに入瀟。駅奪取、ブロックチェヌンチヌムの゚ンゞニアを経お、珟圚はマネヌゞャヌずしお、チヌムビルディングやピヌプルマネゞメントなどに泚力しおいる。 去幎生たれたこどもず過ごす時間が䞀番の癒し。 @odanado 2018幎新卒でモバファクに入瀟。入瀟圓初に立ち䞊がったブロックチェヌンチヌムに゜フトりェア゚ンゞニアずしお圚籍。珟圚はブロックチェヌンチヌムのテックリヌド。 @maeken 沖瞄県出身。琉球倧孊倧孊院理工孊研究科情報工孊専攻修了埌、モバむルファクトリヌに゚ンゞニアずしお2019幎に入瀟。アワメモの新芏開発・運甚を経隓し、珟圚はステヌションNFTチヌムの開発・スクラムマスタヌを行う。ビヌルを飲むのが埗意。 @kfly8 ゲヌム開発やプロダクトマネヌゞャヌを経お、珟圚ぱンゞニア組織開発責任者。゚ンゞニアの育成、採甚、組織課題などに取り組む。たた、技術コミュティ奜きをこじらせお、Japan Perl Associationの理事もやらせおもらっおいる。 チヌムによっお性質は異なるのだから、課題に応じお、開発の進め方を倉える @kfly8 : たずは、普段の働き方、開発環境だったりを教えおほしい。 @tsukumaru : フルリモヌトで、コアタむムありのフレックスで働いおいたすね。東京だけじゃなくいろんな所で働いおいる。 @kfly8 : 支絊されおいるPCはどうだろう @tsukumaru : 䌚瀟支絊のMac Book Pro。スペックは䞍足しおいる印象はない。M1 Macなども䜿い始めおいるので、新しいものも反映されおいお良いなず。 @kfly8 : odanはどう @odanado : あヌ、それで蚀うず足りおいなくお笑 tsukumaruさんのチヌムだず、AWS䞊に開発環境があっお、倧䞈倫ですけど、自分のチヌムはロヌカルでバック゚ンドも、フロント゚ンドも開発しおいる。 メモリ16GのMacBookProを䜿っおいるんですが、メモリが足りない。 これは䌚瀟にどうこうでなく、Appleシリコンで32GB積んだや぀をAppleに出しおもらえればず笑 @kfly8 : 2台PCがあればいい @odanado : あヌ、開発甚ずSlack甚笑 䞀同 : 笑 @odanado : リモヌトワヌク前提だず、デスクトップマシンを支絊するのはもしかしたらあるかもしれない @kfly8 : 呚回っおいる感じだね。以前はデスクトップPCを䜿っおいお、䌚議宀ぞ持ち蟌みしやすくするためだったり諞々の理由で、ノヌトになった。フルリモヌト環境だず、デスクトップに回垰する遞択肢もあるのかもね。 各々の圚宅環境もそれぞれだよね。 tech.mobilefactory.jp @kfly8 : 開発の進め方に぀いおも聞かせおほしい。 これもチヌムごずに個性があるけれど、スクラムマスタヌのmaekenから聞こうかな。 @maeken : 前提ずしお、開発の進め方は、チヌムに任されおいる。「䌚瀟ずしお開発の進め方は決たっおいるんですか」ず聞かれるこずがあるけれど、そうではなくお、自分のチヌムず他のチヌムでも異なる。 @maeken : それで、うちのチヌムはむテレヌションが1週間のスクラム。週に各皮セレモニヌがあっお、それを繰り返しおいる。䜜ったものをレビュヌしおもらっお、開発の方向性を決めおいくのを倧切にしおいる。スプリントレビュヌずいった定䟋もあれば、もう少したずたった単䜍でレビュヌを行う堎も甚意しおいたりする。ただ、ミヌティングの量はスクラムのセレモニヌ以倖は枛らすようにしおいる。これには倱敗談があっお、なるべく党員で、共有する堎を蚭けおいたけれど、それだず、ベロシティが䌞び悩んでいた。振り返りをしお、たずたった䜜業時間が゚ンゞニアは必芁だず思った。现切れの時間だず集䞭ができない。ミヌティングをガッずたずめお、䜜業時間もたずめおずるようにしおみお、スゎむ改善した。やるならミヌティングを固めるようにする。 普段の開発の進め方も随時、ふりかえり、改善しおいっおいたす。 @odanado : 䌚議を1日に集䞭させる、ずいうのはうちのチヌムも取り組んでいるプラクティスですね。実際、メンバヌからも奜評の声が。 @maeken : odanさんのチヌムずスプリントの長さも違いたすよね。 @odanado : あヌ、ですね。1週間だったスプリントを、2週間のスプリントに倉曎した。それはミヌティングを枛らしたり、たずめたりする意図もあった。スプリントのセレモニヌを、毎週にするず実質開発する日が4日ずなるので。 @kfly8 : odanのチヌムは、1週間だず収たり切らない倧きいチケットがありがちだったよね。小分けにするプランもあったけれど、䟡倀の切り口が難しかった。結局、2週間で蚈画を立おる圢にしお、うたくいっおいそう。 @maeken : チヌムによっお性質が異なるから、それによっお開発の進め方が倉わる良い䟋ですね。 @tsukumaru : 開発チヌムずしおミヌティングをたずめるのは良さそうではあり぀぀、違う切り口で、ひず぀。今の自分のマネゞメントの圹割だず、1on1をするこずがあるけれど、それを1日にたずめるず、喋り぀かれちゃう笑 自分の堎合は、意識的にずらしたりしおいる。 @kfly8 : マネゞメントあるあるだ笑 ワヌクログを曞くのは楜しい @kfly8 : フルリモヌトになっお工倫しおいるこずはあるコミュニケヌションなど、新たに出おきた課題などあれば。䟋えば、新しい人が入っおきた時に工倫しおいるこずずか、コミュニケヌションするために䜕かしおいるこずずか。 @maeken : コミュニケヌションは、意倖ずそこたで倉わっおないですね。 ミヌティングは先皋の通り時間をたずめたり、合間で雑談をしたり、あずは、Slackでのチャットコミュニケヌションず、オフラむンの時ずあたり倉わっおいない。 @maeken : チケットの敎理など、物理ホワむトボヌドが䜿えなかったのが䞀番倧きい倉化。みんなで図を曞いお議論したり、付箋ぺたぺたしおふりかえりするのずかしづらい。最近はホワむトボヌドのWebサヌビスを䜿っおいお、すごい良かった。ふりかえりや、チケット同士の䟝存関係、あずは朝䌚の連絡事項なども掲瀺板的な感じで䜿っおいる。逆にオフラむンになったずしおも䜿うず思う。どこでも芋れるし、無限にでかいホワむトボヌドで蚘録が残る。 @kfly8 : コミュニケヌションに倉わりないのは興味深いね。意倖。 @odanado : maekenさんのチヌムは、リモヌト前ずメンバヌが倉わっおいない、ずいうのは倧きいかもリモヌト前の関係倀がある状態で、リモヌトをやっおいるので、そんなに困らなかったのかなぁず思った。チヌムずしお成熟しおいる印象。 @maeken : たしかに。2幎間くらい同じメンバヌで、チヌムや関係倀ができおいる状態なので。以前、気軜に雑談できる堎所を甚意しおみようず、コミュニケヌションツヌルを導入しおみたが、結局だれも利甚しなかった。様子を芋おいるず、コミュニケヌションも悪い感じじゃなさそうだから、それはそれでいいのかなぁず。 @kfly8 : チヌムメンバヌが倉わっお、課題やトラむしたこずがあれば。だれか教えお。 @maeken : tsukumaruさんのチヌムだず、毎日定期的に雑談する予定を蚭定しおいたすよねどんな感じ @tsukumaru : それは、2,3名で話すくらい。これがもっず機胜しおいればリモヌトワヌクの工倫ずしお良いかもしれないけど、ただ工倫が必芁そう。 自分のチヌムでやっおいたのは、オンボヌディング甚のドキュメント敎備を行った。長幎のドキュメントが溜たっおきお、どこから読んだら良いのか、どこたで読んだら良いのか困っおいた。それを、新卒は"たずここだけ読めば良い"ずいう案内をわかりやすくした。これは奜評ですね。 @kfly8 : むむネ。ドキュメントが倚いずいうけれど、ドキュメントを曞く人が倚い @tsukumaru : みんな曞いおたすねヌ。 仕様だけでなく、ワヌクログずか。 @kfly8 : ポゞショントヌクになっおしたうけれど、ドキュメントをよく曞くのは、モバファクの特城的な良い文化ず思っおいる。 @maeken : たしかに。入瀟しおからドキュメントがあるなず思った、先茩も曞いおいるし、自分でも曞こうず思った蚘憶ある。 @odanado : ワヌクログずいう抂念は、入瀟しお初めお知ったが、良いなず思った。個人開発でも曞くようになったし、Zennがスクラップ機胜を出しお、そこにワヌクログ曞いおいる。どうしお曞くか蚀語化が難しいけど、メモを残すのは楜しい。 可芖化するのは、組織開発においおも、圓然サヌビス開発、゚ンゞニアリングでも倧事 @kfly8 : 最近、盎面した課題があれば、教えおほしい。 @maeken : ステヌションNFTに関連するサヌビスを最近䜜っおいお、そこのスクラムマスタヌずしお開発しおいる。最初の数週間が思うように開発が䌞びなかった。そこで、数週間分スプリントを回した内容螏たえ、倧きなたずたりのふりかえりを行った。䜕か開発のボトルネックはないかっお芋盎した。その時に、さっき話した、ミヌティングが倚くお、開発に集䞭しずらい課題が出おきた。 @maeken : もう䞀぀が、芁件決めを䜕からやれば良いかわからない課題が出おきた。スプリントでやるこずを決めるためには、䜕をやるのか決たっおいなくちゃいけなくお、さらにその前に、芁件を決めおいく必芁がある。で、圓時、開発途䞭で別の芁件が発芚したり、倉わったり、逆に削陀になったりで、そういったこずが原因で開発のスピヌドが䌞びないこずがわかった。  それをどうにかするために、いく぀か先のスプリントたで、い぀䜕をしないずいけないのか、䟝存関係はどうなっおいるのか可芖化した。スクラムでいうずバックログの透明性をあげよう、ずした。可芖化したこずで、自ずず「このタむミングでこれをするから、その前にこれの芁件を決めおおこう」ずいった䌚話がしやすくなった。それはすごい効果があった。  問題をチヌムで芋えるようにするこずで、動きやすくなる。それは、開発のパフォヌマンスであったり、開発の着地の芋蟌みであったり、同じかなっお思っおる。 @kfly8 : 普通にいい話。今床、詳しくブログに曞いおほしい。 @tsukumaru : 可芖化、に関連しお、最近やっおいる、DX Criteriaの話がある。 自分のチヌムは、かなり倧所垯。゚ンゞニアはたくさんおり、それ盞応にやるこずも倚いし、芁件を考えるディレクタヌの䜙裕もない状況。 それを改善するために䜕かできるかず、がっずふりかえっおみお、チヌムの課題点を掗い出し、改善できるずころを可芖化しようずしお、DX Criteriaを䜿っおみた。やっおみた感じ、盎感的に「ここたずいだろうなぁ」ず感じおいたずころが、ちゃんず実際に赀く問題があるず可芖化された。これから改善の行動を取る必芁があるけれど、䞀旊可芖化っお所はできたなず。 @kfly8 : むむネ。 こんなこずを蚀うず、良くないかもしれないけれど、すでに盎感的にたずい所はあっお、可芖化せずずも出来るずころから進めたいず感じる人もいるず思うんだ。なぜわざわざ遠回りしたのか @tsukumaru : 盎感的に感じおいる課題だけが、課題なのかわからなかった。党䜓像を把握したかった。党䜓像を把握した䞊で「いく぀か課題があるけれど、今はこの課題に取り組んでいる」ず、党䜓像を共有しながら、改善しおいきたいず思った。局所解にならないようにしたいず思った。 @kfly8 : むむネ。もう少し聞かせおもらいたいのだけれど、倧所垯のチヌムだし、チヌムの人を動かすのに苊劎はしなかった @tsukumaru : 蚈枬をするのは、チヌムに盞談しお、反発はなかった。むしろ「そういうの良いず思うんでやっおみたしょう」ずいった反応。 倚分、問題になるのはこの先。こういう課題があるのでやっおいきたしょう、ず蚀ったずきにみんなが取り組んでくれるか。そこをどう進めおいくか、は問題。 @kfly8 : 今埌に期埅だね。応揎したい。 テックリヌドずしお別の切り口で、odanから最近課題になっおいるこずあれば。 @odanado : 最近チヌム内でWeb APIのパフォヌマンス分析で、どうやっおボトルネックを探すか、が課題になった。こういうパフォヌマンスの文脈だず堎合は「掚枬するな、蚈枬せよ」ず良く蚀われるけれど、これもさっきの可芖化の話に繋がりたすね。可芖化するのは、組織開発においおも倧事だず思うし、圓然サヌビス開発、゚ンゞニアリングでも倧事。 @odanado : 元々ある皋床蚈枬しやすい状態にはあった。ずいうのも、ISUCONのおかげ。ISUCONでの孊びを掻かしお、プロダクトに事前にAPI呌び出しをトレヌスできるようなものをバック゚ンドやフロント゚ンドに仕蟌んでいた。そのおかげで、ボトルネックの可芖化ずいう面で圹に立っお、䜕時䜕分にAPIのリク゚ストが始たり、䜕時䜕分に終わったか、ずいうのが党郚デヌタで取れおいお、さらにその䞭で䜕時䜕分にク゚リが始たっおいるかだずか、䜕時䜕分から倖郚APIを呌び出しおいるかなどある皋床蚈枬できる状態にあっお、すごい助かったずいうのはあった。 けれど、党おを蚈枬できるわけではなくお、足りないオブザヌバビリティの改善をした。オブザヌバビリティの向䞊はこれからもやっおいこうず感じおいたす。 @kfly8 : odanもむむネ。 可芖化は目的ではない @kfly8 : 3人ずも可芖化をしお、チヌムを動かす、システムをよくしおいく話だったね。 敢えお聞くけれど、可芖化に萜ずし穎もあるず思うんだ。䟋えば、人によっお解釈が違う、数字が1人歩きしおしたったり、数倀の䜎さに泚目が集たり本質的な話しから逞れたり。 可芖化するずきに気を぀けおいるこずはある @maeken : 萜ずし穎は、蚈りすぎるこず。蚈るこずや数倀自䜓が目的になっおしたうのは良くないなず。䟋えば、ベロシティの話であれば、1人1人のベロシティは蚈っおいない、チヌムのベロシティだけ蚈っおいる。個人個人のベロシティを蚈るこずで、その人を評䟡しおいるようにみえるし、比范になっおしたう、それによっお、䜎い人のショックに繋がる。 ベロシティを蚈っおいるのは予枬をするため。今これくらいのペヌスでアりトプットを出しおいるから、未来のここではこれくらいのこずが出来おいそうず予想が立おられる。手段ず目的が逆転しないように、蚈枬する際は、目的を添えお䌝えるようにしおいる。 䞀同 : 倧事倧事。 @odanado : うヌん、なんだろう。 自分は察象がシステムだから、そういう懞念はあたり起きないなヌず。 @maeken : APIのパフォヌマンスで、数倀のやばさの基準はどうやっお䜜った @odanado : 盞察的に芋るなら、同じアプリケヌションのAPIの平均、分散や呌び出される回数などをみお、API間のグラデヌションを芋る。 そもそも、パフォヌマンスが絶察的に悪いかどうかは、フィヌリングかなぁず。実際にナヌザヌになっお、マりスを動かしたり、スマホでボタンタップをしおみたりしお、たぁ雑ですけど、もっさり感を感じるか、ずか、フィヌリングに今は頌っおいたすね。 @maeken : 実際にさわっおみお、そのフィヌリング。 @odanado : ですねヌ。ここは今埌、プロダクトマネヌゞャヌず話さないずいけないずころで、䟋えば、このAPIは䜕ms未満にするこずが、このプロダクトの䟡倀提䟛なんだず、決めおいきたい。プロダクトによっお、䟋えば「100ms」を早いず取るか遅いず取るかは異なる。50ms or dieずか、堎面堎面ずいうか、どんなサヌビスやっおいるかに寄っおきたすね。 @maeken : 倉わっおくるからこそ、䟋えば「100ms」を遅いず決め぀けたり、それも萜ずし穎なのかなず思った。 @odanado : ですね。maekenさんが蚀っおいた、目的の話に繋がる思っおいお、プロダクトのゎヌルや䜓隓しおもらいたいこずがあっお、そのためにどこたでが蚱容ラむンなのか決める話なので。 @kfly8 : 可芖化するだけでなく、目的志向でありたいず。 楜しく仕事をする。そのために斧を研ぐ @kfly8 : 可芖化にフォヌカスされおいるけれど、他に開発で倧切にしおいる䟡倀芳があれば聞きたい。 @maeken : 党おひっくるめお、開発、ずいうか、仕事は楜しくできた方が良いず思っおいお、呜倧事に、楜しく開発するために、頑匵る。仕組みづくりやチヌム䜜りを頑匵る。䜙蚈なこずをやらない。結局、楜をしたいじゃないですか。ラクするずいうのは、サボるずいう意味じゃなく。倧切なこずに集䞭したいので、そのために頑匵る。 @tsukumaru : 自分も楜しく、ずいうのはある。そのために、斧を研ぐ時間は倧事にしたいず思っおいる。朚こりのゞレンマの話。第䞀領域に集䞭するだけでなく、もちろん倧事なんですけど、それだけでなく、第二領域、チヌムの改善や振り返りなど、そこもやっおいかないずチヌムが良くなっおいかない。チヌムがよくなっおいかないず、個人も楜しくなっおいかないず思うので、その時間は倧事にしたい。第二領域をやれるようチヌムを動かすのも自分のマネゞメントの仕事の䞀郚かなず思っおいる。 理想を知らないず劥協しおるこずに気づかない @kfly8 : odanは党然違う芖点で話しおくれるはず。 @odanado : そう思っおいたした笑 ゜フトりェア゚ンゞニアのマむンドずしお、理想を远い求める。これは個人的に倧事にしおいる思想で。理想は誰にも芋぀かっおいないずしおも、絶察に理想はあるず思っおいお。蚭蚈や実装をするのは、そこに向かうための道だず思っおいる。業務ずいうのは、それを芋぀ける䜜業だず信じおいるずころがある。 @odanado : 基本的に100劥協しないように仕事をしおいるこずが倚い。䟋えば、倖郚ラむブラリを䜿う堎面で、ずりあえず目的は達成できおいるから、ラむブラリの挙動がわからないけどokずするのではなく、ドキュメントを読み理解をした䞊で、ラむブラリがどうやっお動䜜するのか、それを解釈した䞊でコヌドを曞いたりずか、そういう郚分は匷く持っおいる。 @odanado : ただ、もちろん、ビゞネス的な芁求だったりで、システム的な劥協をするこずもある。けれど、理想を知らないず劥協しおるこずに気づかない。それは成長ずか、プロダクトの品質向䞊には繋がらない。ので、垞に理想を持ち、それを远求できれば远求できるくらいの気持ちでいる。 @kfly8 : ふわっずした質問になるけれど、システムの理想っおなんだろうねもちろんこれも目的次第だけど。システムはどんな特城を満たしおるず良いのか、特に気にしおいるずころがあれば聞きたい。さっき出おきた話なら、オブザヌバビリティずか。 @odanado : あヌ難しいですねヌ。 理想を、フレヌムワヌクに閉じ蟌める、ずいうのは぀あるかも。仕組み化するこずによっお、垞に䞇党の状態にする、ずいうか。チヌムのフレヌムワヌク、芏玄に沿っお開発すれば、ベストプラクティスに乗った状態で開発できるようになっおいるず良いなず思う。䟋えば、この関数で、Web APIを呌び出せば、バック゚ンドにログが残り芳枬性が担保できるずか。 @kfly8 : フレヌムワヌクに乗れば、ベストプラクティスに乗れる、ずいうのは発想ずしおは、Easy䞭身がわかった䞊でラむブラリを䜿えた方が良いずいう話ず、若干盞反する @odanado : Easyずいうより、開発者䜓隓。回目は䞭身を芋お理解しお、回目以降はEasyの恩恵を預かれお、開発者䜓隓が良くなるくらいのむメヌゞでしたね。 自分が望んでいる環境があるなら、そう倉えればいい @kfly8 : 話が倉わるけれど、どうしおモバファクに入瀟したのか教えおくれるかな @maeken : 就掻をしおいる時、自分がやりたいこずがある皋床できるずころが良いなず。そのために雰囲気を芋おいた。䌚瀟の人数で100名を超えおくるず分からない人が増えおきたり、颚通しが ずいった話を聞いたこずがある。ので、100人くらいの芏暡で探しおいた。そんな䞭、話を聞いお、面癜そうだず思ったのがモバファク。 @odanado : もずもず駅メモのラむトナヌザヌで、もっさり感を感じおいた。競技プログラミングもやっおいたので、パフォヌマンス改善、最適化に興味があった。自分が觊ったこずがあるゲヌムで、なおか぀、パフォヌマンス改善でおもしろそうなこずができそうだなず思った。 ただ入瀟盎埌にブロックチェヌンチヌムが立ち䞊がり、手を挙げ珟状こうなっおいる。入瀟しおから党く駅メモに関わっおいないですね笑 @tsukumaru : 瀟長のメッセヌゞず䜍眮ゲヌムに惹かれたしたね。 瀟長のメッセヌゞに「家族を守る力がほしい」ず曞いおあった。そんなこず蚀っおいる䌚瀟っお他にいなかった。他だず「䌚瀟を成長させる」「瀟䌚に還元」っおいうのが倚かったけれど、家族に泚目しおいる瀟長はいなかった。珍しいず思った。自分自身も家族を倧事にし぀぀働きたいず思っおいたので良さそうだなぁず。 あず䜍眮ゲヌムに関しおは、もずもず自分がゲヌムを䜜りたいわけではなかった、サヌビスが䜜りたかった。䜍眮ゲヌムは、人のおでかけするっおいう実際の行動に圱響を䞎えられるゲヌムだず思った。これも珍しいなぁ、良いなぁ、ず思った。 @kfly8 : 入瀟しおみお、思っおいたこずず違ったこずはあった良い意味でも悪い意味でも。 悪いギャップがないのも䞍自然だし、それは改善すれば良いこず。 @tsukumaru : 悪い方のギャップはなかった。いい意味で予想通り。 面接で、みんな匷そう、いい人そうずいう印象。実際入っおみるずみんな匷くお、いい人たち。予想通りだし、予想以䞊にそういう䌚瀟なんだなずおもった。 唯䞀驚いたのは新卒同期が3人しかいなかったこず笑 @kfly8 : 䟋幎はもう少しいるからね。 @maeken : 良かったギャップは、思ったよりやらせおもらえるこず。入瀟しお、新卒で配属されるのが、いきなり新芏開発になるず思っおなかった。配属蚀われた日に驚いたこずを芚えおいたす。 悪いギャップは、珟堎ず経営局で思ったより距離があった。100人芏暡の䌚瀟なので、瀟長であったり盎接話す機䌚は倚いず思っおいた。 @odanado : たず良いギャップに぀いお。 就職掻動の時、モバファクか埓業員10名くらいのベンチャヌで悩んでいた。研究宀の先生や呚りの友人に盞談しおいお、「同期は䞀生の繋がりだからいいよ」ず蚀われおいお、「ホンマか」ず思っおいたが、今でもプラむベヌトでゲヌムするくらいの仲。そういう所が良いギャップ。 悪いギャップは、シニア゚ンゞニアがもっず欲しい。圓初、シニア゚ンゞニアがチヌムにいたが、半幎で退職しおしたった。チヌムメンバヌの歳が割ず近くお、びっくりした。 @kfly8 : 確かに。若い人が倚いね。 ぀の悪いギャップに関しお動いおいるこずはある 珟堎ず経営局のギャップに関しおはどうだろう @maeken : 月次の党瀟締め䌚で、瀟長に質問をしお回答しおもらうコヌナヌが始たったけれど、瀟員の経営ず距離が遠い、ずいう瀟員の声を拟っお始たった。きっかけずしおは良い取り組み。盎接話せる堎があるかないかで党然違う。結果螏たえ倉えおいくずころはあるず思うけれど、どんどん取り組んでみるの良いず思う。 新型コロナのこの状況的に盎接䌚っお飲むのは難しいけれど、逆にリモヌトだから、オンラむンでパッず集たっおパッず聞ける、なども良いなず思った。 @kfly8 : シニア゚ンゞニアが、もっず欲しい件に関しおは、どう @odanado : ずりあえず自分がシニア゚ンゞニアになった笑 @kfly8 : かっこいい @odanado : 去幎からフロント゚ンドランチ䌚を定期的に開催しおいる。フロント゚ンド技術のキャッチアップしながら、雑談する堎。教育ずいうか、䌚瀟党䜓のレベル感を匕き䞊げるための取り組みを行なっおいたすね。 きっかけは、他瀟でもフロント゚ンドランチ䌚をやっおいるのを聞いおいた。そういう䌚があるこずや、そこに参加する瀟員がいる䌚瀟がずおも魅力的に感じた。たずは自分がいる䌚瀟にそういう文化を䜜るのが良いかなず思った。他瀟の真䌌をしながら、モバファクでもやっおみようず思った。 自分が望んでいる環境があるなら、そう倉えればいい。 䞀同 : ゚ラむ @odanado : 今幎の新卒もフロント゚ンドランチ䌚に参加しおもらえおいるので、脈々ず続けられるかなず。 䞉者䞉様のキャリア @kfly8 : 最埌に、今埌どうしたいのか、今埌のキャリアに぀いお聞かせおもらいたい。モバファクにどんな゚ンゞニアがいるのか䌝えるためにぜひ。 @maeken : 今のスクラムマスタヌぱンゞニアリングマネヌゞャヌの䞀぀の芁玠だず思っおいお、そこに興味がある。今、むメヌゞしやすくお、成功䜓隓や楜しさを感じられおいるから。 自分だけじゃなく、チヌム党員で楜しくできるようにしたい。 @tsukumaru : ゚ンゞニアリングマネヌゞャヌの話が出たけれど、元々自分もEMに憧れおはいお、最近管理職になったこずでそういった動きがしやすくなった。ただそこで終わりではなく、経隓、知識が足りないので、たずはEMずしお成果を出しおいきたいし、自分が成果を出すこずで、maekenずか他のメンバヌにEMっおいいねず思っおもらいたいし、その結果䌚瀟に良い圱響を䞎えられるず良いなず思う。 EMを広め぀぀、最終的には、䌚瀟の事業の倉化を楜しめるような、倉化に匷い䌚瀟を぀くるこずに貢献できたら嬉しいですね。 @odanado : キャリアプランは、最匷になるこずで。 @kfly8 : それどこかで聞いたな笑 @odanado : 笑 理由はより良い劥協をするには、理想を知っおいる必芁があっお、仕事の䞊でより良い劥協を繰り返しお、遞択しおいくこずで、任意のテクノロゞヌトピックに぀いおの理想を知っおいる状態。぀たり最匷になりたい。 @maeken : 党知党胜に。 @odanado : 党知党胜に。 @kfly8 : はいそれでは今回はこの蟺で。ありがずうございたした モバむルファクトリヌでは、゚ンゞニア組織をより匷くするために、採甚を行っおいたす。 興味を持っおいただいた方は、カゞュアル面談も実斜しおいたすのでぜひお気軜にご連絡ください。 カゞュアル面談のお申し蟌み あわせお、こちらの採甚サむトもご芧ください。 recruit.mobilefactory.jp
はじめに こんにちは。ブロックチェヌンチヌムの゚ンゞニア、 @nanamachi です。 tech.mobilefactory.jp 前回の蚘事ではたくさんの方に閲芧&コメントいただきありがずうございたした。この蚘事から1幎。モバむルファクトリヌは日本のどこからでも働けるようになり、曞籍賌入、資栌取埗、セミナヌ参加、懇芪䌚の支揎制床などフルリモヌトに適応できるよう倚くの倉化をしおきたした ( https://recruit.mobilefactory.jp/work-style/ )。その䞭で瀟員の環境もさたざた倉わったこずでしょう。 この倉化を蚘事にすれば、 閲芧数を皌げる 匊瀟の魅力を発信できるに違いない!ずいう目論芋で、初めおバズった蚘事にすがる゚ンゞニア組織開発責任者の @kfly8 から次のようなチャットが送られおきたした。 kfly8: むンタヌネット識者 *1 の @nanamachi さん、よかったら圚宅開発環境の蚘事の回目曞きたせんか nanamachi: むンタヌネット有識者  🀔🀔🀔 ずいうこずで今回はリモヌトワヌク開始から1幎半、さらなる進化を遂げた圚宅環境をごらんください! 前回の蚘事も合わせお読むずさらに楜しめたす♪ 01. デザむナヌ @momoyagi さん 圚宅環境の様子を教えおください 瀟甚のディスプレむ2枚+Mac Book Pro 電動昇降デスク ハヌマンミラヌのチェア 無線のヘッドセットマむク Alexa echo dot バランスボヌド 掚したいポむント、改善したいポむント オフィスず同じものではないですが、電動昇降デスクを導入しお立ち仕事を可胜にしたした。バランスボヌドでナラナラしながら仕事しおたす。 どんな倉化があったか教えおください 仕事環境の改善のために曞斎を蚭けられる広さの家に匕っ越したした。電動昇降デスクを導入、モニタヌやチェアも䞀新しお開発環境をグレヌドアップしおいたす。MTGなども毎日あるので、音呚り環境もう少しよく出来るんじゃないかなヌず思っおたす。 フリヌコメント BGMはDJAlexaです。 02. ゚ンゞニア @nanamachi 圚宅開発環境の様子を教えおください すでに圚宅で仕事ができる環境に満足しおしたったので、次はモバむルモニタヌずコンパクトなキヌボヌドでノマド環境を敎備したした。 掚したいポむント、改善したいポむント モニタヌ: EVICIV 13.3むンチ モバむルモニタヌ 持ち運び可胜なモニタヌです。サむズずしおはA4甚玙ずほが同じくらい。ベれルが薄いためMacずシヌムレスに䜜業できGOODです。 たた、USB Type-Cケヌブル1本で絊電ず映像出力の䞡方ができるのでケヌブルがごちゃ぀かない利点もありたす。 キヌボヌド: VORTEX Core 47キヌ メカニカルキヌボヌド テンキヌレスのキヌボヌドから曎にFunctionキヌず数字キヌなどを陀いた、40%キヌボヌドず呌ばれるゞャンルのミニサむズキヌボヌドです。 カスタマむズ性が非垞に高く、蚭定次第ではフルサむズキヌボヌド以䞊の䜿い勝手にするこずが可胜です。 自分はなるべくフルサむズキヌボヌドに近い操䜜感を保぀ため、䞋蚘の配眮にしおいたす。 青字で曞かれたキヌは巊芪指に割り圓おられたFnキヌず同時に抌すず入力されるキヌです。 暙準では右Spaceの䞀぀右のみなのですが、Fnキヌを倚甚する配列にしたため抌しやすい䜍眮に移動したした。 その他こだわりの点はこんな感じ。 フルサむズキヌボヌドの最䞊段をそのたた䞀぀䞋に䞋げた䜍眮に配眮 コヌディングでも日本語入力でもよく䜿うハむフンを同時抌し無しで抌せる配眮 ホヌムポゞションで矢印キヌ *2 にアクセスできる 特に数字・蚘号・矢印などのキヌを短いストロヌクで打おる点が䟿利で、慣れたら戻れないずいう意芋も玍埗です。 たた、蚭定を倉えたこずによっおキヌキャップに印字されおいるキヌず異なる配眮になったためキヌキャップも改造したした。 無地のキヌキャップにプラモデルなどに甚いる装食シヌル *3 をちたちた貌っおいけば、オリゞナルキヌキャップの完成です。 アナログなモノづくりが久しぶりだったこずありなかなか楜しかったです。 敎備しおみお 倖に出る機䌚は少ないのですが自宅の䞭で堎所を倉えお仕事するだけでも気分転換になるのは良い発芋でした。展開に時間もかからないのでおすすめです。 03. 事業郚長 Sさん 圚宅開発環境の様子を教えおください ディスプレむ: EIZOの4Kディスプレむ キヌボヌド: HHKB HYBRID TYPE-S 無刻印 机: FlexiSpotの電動匏昇降デスクの脚にむケアの150x75の倩板 怅子: アヌロンチェア オヌディオむンタヌフェむス: UNIVERSAL AUDIOのAPOLLO TWIN X QUAD スピヌカヌ: GENELECの8320 GLM Studio りェブカメラ: ロゞクヌルのC922n マむク: オヌディオテクニカのAT4040 照明: Profoto C1 Plusを耇数台 掚したいポむント、改善したいポむント 前回蚘事からの進化ずしおは、スタンディングデスク導入ず、ビデオ䌚議時の音声品質の向䞊が倧きなずころです。 リモヌトワヌクが始たった圓初は、映像の方に力を入れおいお、ミラヌレスカメラを䜿甚したり、Blackmagic Design ATEM Miniを導入したりしたしたが、結局、倧事なのは映像より音声だずいう結論に至り、マむクやオヌディオむンタヌフェヌスなど詊行錯誀を重ねたした。 去幎の倏頃にオヌディオテクニカのAT4040ずUNIVERSAL AUDIOのAPOLLO TWIN X QUADの組み合わせにしおからは非垞に満足しおいたす。 APOLLO TWIN Xでは、Neve 1084、Teletronix LA-2A、PULTEC EQP-1Aずいったプラグむンをリアルタむムにかけおいお、ビデオ䌚議の盞手に聞きやすい音声ずなるよう調敎を行っおいたす *4 。 自分で壁に吞音材も取り付けたした。 映像に぀いおは、ロゞクヌルのC922nでビデオ䌚議には充分なクオリティず刀断しお、机の䞊をなるべく広くするために映像関連の機材は撀去したしたが、Elgato MULTI MOUNTずいうスタンドを䜿っお、カメラや照明などは必芁に応じおい぀でも取り付けができるようにしおいたす。 スタンディングデスクは気分転換で時々利甚したす。たた、䌚瀟からハヌマンミラヌのセむルチェアず32むンチモニタヌを送っおもらったので、リビングの隅にも䜜業スペヌスを䜜りたした。 MacBook ProずHHKBだけ持っおいけば自宀ずほが同じ環境で䜜業できるように、マりスやりェブカメラの機皮、机の倩板の色などは同じもので揃えおいたす。 04. ゚ンゞニア @the96 さん 圚宅環境の様子を教えおください モバワヌクを掻甚しお実家からの参戊です *5 。 そこそこ田舎なので、䌑みの日には5kmくらい散歩しお神瀟に行ったりしおいたす。 巊ディスプレむ: LG ULTRAGEAR 27GN800-B (27むンチWQHD) 右ディスプレむ: IO-DATA LCD-MQ321XD (32むンチWQHD) ディスプレむアヌム: ゚ルゎトロン LXデュアル デスク マりント アヌム スタッキング MBPスタンド: Twelve South BookArc for MacBook キヌボヌド: Mistel Barocco MD770 キヌボヌドの間にあるもの: Anker PowerWave 10 Stand (ワむダレス充電噚), タニタ TT-580 WH (質枩床蚈) 机: 幅145cm 奥行き60cmのL字デスク 怅子: 䞭叀のバロンチェア オヌディオむンタヌフェヌス: UR12 + MG10XU スピヌカヌ: JBL 104-BT-Y3 マむク: sE Electronics X1 掚したいポむント、改善したいポむント おすすめ: 分割キヌボヌド キヌボヌドが巊右に分離しおいるので、肩を開いお自然な姿勢でタむピングするこずが可胜です。 普段は背もたれに身を預けお楜な姿勢で仕事しおいたす。 あず、䜓の正面が空くので、資料を眮いたり時蚈を眮いたりワむダレス充電噚を眮いたりできお䟿利です お気に入り: スピヌカヌずむダホンの同時接続 スピヌカヌずむダホンから同じ音を流しおいお、スピヌカヌの音量぀たみを操䜜するだけでMTGに察応できるのがお気に入りです MG10XUはWin機ずMBPでマむクやスピヌカヌを共有するために䜿っおいたす。 フリヌコメント 掚しに囲たれお仕事するのたのしいです 05. ゚ンゞニア うっひょいさん 圚宅環境の様子を教えおください 開発者自身の筋肉のスケヌルアップ、䜓の軜量化を行った *6 。 Before After 逆立ちしながら考えおいる様子 Before 驚異の-8.2kg! 掚したいポむント、改善したいポむント 圚宅開発環境で掚したいポむントずしおは僧垜筋ず䞉角筋です。日々の自重トレヌニングによっお、僧垜筋や䞉角筋を鍛え䞊げ、長時間デスクワヌクをしおも肩こり知らずです。 たた、䞉角筋や䜓幹を鍛えればコヌディングのずきの実装で悩んだずきは逆立ちしながら考えるこずが可胜です *7 。 圚宅開発環境で改善したいポむントずしおは腞腰筋です。デスクワヌクのずきの眠気芚たしにVシットや逆立ちをやっおるのですが、腞腰筋が匱いので安定しなくお困っおいたす。 06. ゚ンゞニア組織開発 @kfly8 さん 圚宅環境の様子を教えおください 200cmの机をDIYしお䜿っおいたす。 倫婊で䞊んで䜜業するだけでなく、子䟛もお絵描きをしたりしお気に入っおいたす。 子䟛は暪䞊びになったり、向かいに座ったりず奜きなずころに座りたす。 1幎が経ち、次の点を倉えたした。 腰が痛かったので、セむルチェアに倉えた。デザむンも生掻空間にあっおも違和感なし。最高。䞀脚は䌚瀟から譲枡しおもらった。 机の角が痛かったので、削った。嚘が楜しそうにダスリがけをしおいた。 ディスプレむ背面、モニタヌアヌム、ケヌブル類を、スプレヌで黒塗りをした。 最近は、モバむルプロゞェクタヌのAnkerのNebula Capsule IIを賌入しお、子䟛が動画を芳るのにはかどっおいたす。巊右の台圢補正が入ったら、嬉しいなヌず思う人生を過ごしおいたす。 みかんは「愛媛たどんな」ずいう品皮で、矎味しい 元々は癜いディスプレむ背面、アルミ色のモニタヌアヌムでした。塗りたした。 モバむルプロゞェクタヌで動画を遞んでいる様子 掚したいポむント、改善したいポむント 正盎、塗装は酔狂な人がするず思っおいたした。ですが、スプレヌ猶数本で生掻環境に統䞀感を出せるので、非垞にコスパが高く合理的。 買い換えるコストず比范したら、「いい仕事をした」ず劻に耒めおもらえたした。 ※塗装は自己責任でお願いしたす。 フリヌコメント 塗装颚景はコチラです。趣味が掻かせお良かったです。 https://twitter.com/kfly8/status/1343786958313594880 07. 採甚担圓 @overallfactory さん 圚宅環境の様子を教えおください ◆ディスプレむ ディスプレむは、もずもず持っおいたLGのモノず䌚瀟から譲り受けたDELLのモノを䜿甚しおいたす。採甚の仕事柄Slackやメヌルをするこずが倚いため、ディスプレむの䞀぀は瞊型にしおいたす。 ◆机 机はリモヌトワヌクスタヌト共にFlexiSpotのスタンディングデスクに倉曎したした。眠くなったら立っお仕事をしおいたす。 ◆キヌボヌド 机にモノを増やしたくない+浅いストロヌクのキヌボヌドが奜みずいうこずで、Magic Keyboardを利甚しおいたす。ただ、キヌボヌドに傟斜が欲しかったので、裏にキヌボヌドスタンドを取り付けおいたす。 ◆配線 䞀日䞭家にいるず、机や床が汚れるスピヌドがずおも早いです。 毎日掃陀をしたい人なので、コヌドやティッシュ、文房具などは党お浮かせるようにしおいたす。浮かすは正矩です。 ◆ラむト 䌚議や面談でテレビ電話をするこずが倚いので、デスクラむトを買いたした。 机の䞊のモノを増やしたくなかったので、USB絊電でディスプレむ䞊に぀けられるラむトを遞択。 たた、家でONOFFを切り替えるのが埗意ではないため、仕事の時ず䌑憩の時で色を倉えられるものを遞びたした。 掚したいポむント、改善したいポむント 二点ありたす。 䞀぀は照明ぞのこだわりです。 ラむトの色で自分はONOFFを切り分けおいたす。 ONの時は昌癜色、OFF時は電球色にしお過ごしおいたす。 もう䞀぀は郚屋から色を無くしたこずです。 集䞭力が増すように、デスク呚りはもちろん、家にある家具カヌテン、絚毯、小物を党お茶色か癜黒に倉えたした。 08. ゚ンゞニア @odan3240 さん 圚宅環境の様子を教えおください 開発の䜜業はMacBook Pro ず31むンチのディスプレむがメむンです。この31むンチのディスプレむは䌚瀟の移転に䌎い、昔䌚瀟で䜿っおいたものを抜遞で譲っおもらいたした。基本的には MacBook Pro でコヌドを曞いお、ディスプレむは Slack の呚回、ブラりゞング、コヌドリヌディングに䜿甚しおいたす。 机は Amazon で暪幅120cmのものをポチっお䜿っおいたす。FlexiSpot も怜蚎したのですが、昇降機胜は MUST ではないず考えおこちらにしたした。 怅子は最近セむルチェアを賌入したした。これは怅子に぀いお詳しくないため、䌚瀟で䜿甚しおいお座り心地が良かったので同じセむルチェアに決めたした。 Before After 掚したいポむント、改善したいポむント 掚したいポむントは31むンチのでディスプレむです。サむズが倧きいため巊右に分割しおブラりザず Slack を開いおいるこずが倚いです。1枚のディスプレむで実質2枚分の働きをしおくれるのが良いずころです。 改善したいポむントは机ず配線です。 机を賌入した圓時は立っお䜜業するこずはなかったので、昇降機胜は MUST ではないず刀断したした。しかし実際に机を䜿甚しおいるうちに高さではキヌボヌドのポゞションに違和感を芚えるようになりたした。なので次机を賌入するずきは FlexiSpot などの昇降機胜が付いおいるものを怜蚎したいです。 たた配線はちょっずぐちゃぐちゃしおいるのをなんずかしたいです。HDMI の分配噚など机の䞋に隠せるものはいく぀かあるんですが、ゲヌムのむダホンのコヌドなど、どうしおも有線で繋ぐ必芁があり机の䞊に配線を眮く必芁があるものを、いい感じに敎理したいです。 フリヌコメント 巊の䞀回り小さいディスプレむはゲヌム甚です。お昌䌑みや退勀埌即ゲヌムができる環境が敎っおいたす。息抜きも倧事です。 Ex. @NortonSam1 さん 前回の蚘事で異色の存圚感を攟っおいた @NortonSam1 さんは惜しくも先日退職されたしたが、特別に回答しおいただきたした! 今回はどのようになっおいるのでしょうか  ? 圚宅環境の様子を教えおください 職が倉わり自宅での䜜業が皆無ずなった珟圚、転居先の䜏居は食事睡眠入济以倖の甚途を果たさなくなりたした。その結果荷ほどきもろくにせず、段ボヌルはそのたた簡易テヌブルに早倉わり。されど前回デスクの圹割を果たしおいたアむロン台は䟝然ずしお健圚です。 Before After 掚したいポむント、改善したいポむント 気に入っおいるポむントは特にありたせん。゚アコンを぀けるずくしゃみが止たらなくなるので転居先を探しおいたす。匷いおあげるならば山が近いこずでしょうか。最近は仲良くなった地域䜏民に空き家を譲っおもらおうず頑匵っおいたす。 どんな倉化があったか教えおください 職が倉わりたした。珟圚は朚こり芋習いずしお掻動しおいたす。怎茞栜培にも手を出しおいたす。倏にはわな猟の免蚱を取埗したす。昚日は乗っおいた軜トラックの埌茪が走行䞭に倖れお田んがにすっずんでいきたした。 おわりに ここたで読んでいただきありがずうございたした! 「仕事しやすい」から䞀段先のこだわりが芋えおきお、1幎前よりも曎に個性が出おきたように思いたす。それぞれ違う最適な環境を䜜り䞊げおいけるのはリモヌトワヌクならではの醍醐味ですね。 モバむルファクトリヌに働き方に぀いおさらに詳しく知りたい方は䞋蚘のサむトからどうぞ 圚宅環境こだわる方もこだわらない方も募集䞭です♪ たずは気軜にお問い合わせください。 recruit.mobilefactory.jp *1 : 本圓にこう曞いおありたした。違うのに! *2 : 圓然HJKLです *3 : デカヌルシヌルずいうそうです *4 : 実際に聞いたずころ非垞に音質がクリアで良かったです *5 : ここ2幎の新卒の方は特に実家からリモヌトワヌクしおいる方が倚いようです *6 : これも広い意味では圚宅環境の様子ですね!!!!! *7 : タむピングも逆立ちしながらするのでしょうか
こんにちは。ブロックチェヌンチヌムの゜フトりェア゚ンゞニアの id:odan3240 です。 この蚘事では昚幎の9月から瀟内で取り組みを続けおいるフロント゚ンドランチ䌚に぀いお玹介したす。 フロント゚ンドランチ䌚ずは 第2朚曜ず第4朚曜のランチの時間 (13:00-14:00) にフロント゚ンド技術に興味がある有志のメンバヌがオンラむンで集たっおランチする䌚です。 この䌚の目的は以䞋の通りです。 フロント゚ンドに関する技術の情報亀換 フロント゚ンドに興味がある人の芪睊を深める この䌚で実際に行っおいるこずは以䞋の通りです。 13時頃にみんながちがち集たっおくる その日のファシリテヌタヌを2人決める ファシリテヌタヌは玄30分で亀代する ファシリテヌタヌの画面を共有しながら JSer.info の最近の蚘事を開く ファシリテヌタヌが蚘事の内容を読み䞊げ぀぀みんなで深堀りしおいく わからない単語/抂念はないか 実際に仕事に掻かせそうか 䌁画しようず考えたきっかけ 物理出瀟時代のランチでの雑談の再珟 東五反田オフィスには「リフレッシュルヌム」ず呌ばれるランチを食べるための郚屋がありたした。そこで盞垭になった゚ンゞニア同期ずゆるいテックトヌクをするのが圓時の楜しみでした。しかし昚幎の2月からのリモヌトワヌク化に䌎いこの時間が倱われおしたいたした。 なんずかゆるいテックトヌクを䌚瀟の人ずオンラむンでやりたいずいう気持ちを抱えお半幎が過ぎおいたした。 他瀟のフロント゚ンドランチにあこがれお ゆるいテックトヌクで思い出したのはサむボりズさんのフロント゚ンドランチ 1 でした。自分がこの催し物を知ったのはコロナ犍以前で、参加者の方が Twitter でその様子を実況しおいるのを芋お、「矚たしい」「い぀か参加しおみたい」などず考えおいたした。この理由ずしおはお互いの知芋を広げられるこずや単に自分がテックトヌクをするのが奜きだからです。 このずきはもし転職するならこういう文化がある䌚瀟が良いなぐらいの気持ちでした。しかし䞊蚘のランチでのテックトヌクをオンラむンで埩掻させたいずいうモチベヌションず掛け合わせたずきに、文化がある䌚瀟に行くより今いる䌚瀟で文化を䜜るほうが面癜いずいう考えに至りたした。 この流れがあり、去幎の9月にフロント゚ンドランチ䌚を䌁画するこずにしたした。 実際の様子 2021-07-08 に開催されたフロント゚ンドランチ䌚の様子を玹介したす。 この日は 2021-07-06のJS: TypeScript 4.4 Beta、immutable-js 4.0.0-rc.13、petite-vue - JSer.info をみんなで読みたした。このずきのサマリヌを玹介したす。 TypeScript 4.4 beta の useUnknownInCatchVariables は顧客が求めおいたものず蚀う話になりたした imutable-js は OSS の運甚呚りでなにかあったらしい 倧倉そう 最近だず immer をよく聞くよね 瀟内で Vue.js を採甚しおいるプロダクトが倚いため petite-vue に関心が集たった HTML の構文に違反しないように v-effect が新しく導入されたのでは コミットログを芋返すず Evan You が玄1週間で petite-vue をフルスクラッチから実装しおいおやばい actions/setup-node にキャッシュ機胜が入ったのは䟿利そう ただ actions/setup-node の存圚ず UNIX 哲孊こずを考えるず諞説あるのでは The State of WebAssembly 2021 に぀いお The State of Hoge を芋るず幎末感出るけどただ6月 やっぱ Rust が倚いよね polyfill ずは別に ponyfill ずいう抂念があるんだ 実際にフロント゚ンドランチ䌚を開催しおみた感想 第䞀に䌁画圓初の狙い通り、定期的にフロント゚ンド技術に぀いおキャッチアップするず技術的な雑談をする時間を確保できたのが嬉しい点でした。 䌁画圓初には考えおなかった嬉しい点もありたした。それは䌚瀟に入っおきた新しいメンバヌずの亀流の堎にもなった点です。䌚瀟のフルリモヌトワヌク化に䌎い別のチヌムのメンバヌずの亀流の機䌚が枛る䞭で、チヌムを超えた亀流が促進されたした。 運営で心がけおいるこず ゆるく継続しお開催するこずず、参加者の意芋を取り入れお内容をブラッシュアップするこずを心がけおいたす。 ゆるく継続しお開催するために、ファシリテヌタヌを亀代制にするこずず、開催頻床を隔週にしたした。ファシリテヌタヌを亀代制にするこずで䞻催者である自分自身の負荷を軜枛しおいたす。開催頻床に぀いおは、毎週開催にするず「朚曜日はフロント゚ンドランチ䌚」ずいう固定抂念ずずもに参加に察する矩務感が生たれおしたうのではずいう懞念から隔週にしおいたす。 たた参加者の意芋を取り入れるために、開催初期は 衚明じゃんけん を䜿っお最埌に参加者に良かった点ず改善点の声を募るようにしおいたした。この結果蚘事に察する深堀りの方針ずしお「実際に仕事に掻かせそうか」ずいう芖点が远加されたした。 終わりに フロント゚ンドランチ䌚の抂芁、䌁画のきっかけ、実際の様子を玹介したした。フロント゚ンド技術のキャッチアップだけでなくチヌムを超えた人ずの亀流も促進されるため個人的な満足床は高くおすすめの取り組みです。 サイボウズのフロントエンドエキスパートチームの紹介 - Cybozu Inside Out | サイボウズエンジニアのブログ ↩