やわらかテック

業務を通して得られた知見、知見。個人的に試してみたこと、興味のあることについてアウトプットしています。

特に意味のないデフォルト引数が保守性を低下させるので注意

機能追加の依頼がきた いつものように業務をこなしていると、スケジュール管理機能にとある機能追加の依頼が来ました。 内容としては複数のスケジュールを作成する関数で祝日での場合には、祝日に該当する日にはスケジュールを作成しないようにしたいとのこ…

動的型付け言語(Ruby)でも関数の戻り値の型は可能な限り統一した方が良い

出会いは突然に いつものように眠い目を擦りながらコードレビューをしていると以下のようなコードに遭遇しました。 (※部分的に書き換えてあるので、実際には動作していないコードです) def fetch_companies(setting_id) setting = Setting.find_by(id: setti…

ファシリテーターをまかせたら普通にみんなやってくれた

リモートワークのファシリってつらい 現在、弊社ではコロナ対策として、完全リモートワークに移行しており、よほどのことがない限りは在宅にて勤務をしております。開発業務がメインなのですが、スクラムマスターという立場上、ファシリテーターとして主体的…

【API設計】jsonを返す時はできる限りフィールドのkeyを統一してあげよう

APIの仕様書が送られてきた 外部連携させて頂く企業様から、新規に追加されるAPIの仕様書を頂きました。ユーザーが登録しているカテゴリの総数と、その内訳を取得することが出来るAPIだそうで、新たに追加されたとのことです。しかしながら、蓋を開けてみる…

エンジニアがM1 MacbookAirを購入して2ヶ月使った感想

M1 Macbookを買うかどうか 4年前にずっと愛用していたWindowsからMacbookに乗り換えました。当時、アルバイトしていた開発会社がMacbookをメインに使っていたので、その流れに乗ったという感じです。早いものでMacbookを使い始めてから4年の歳月が流れており…

開発者が複雑だと思う機能はユーザーには使いこなせない

プロジェクトの肥大化 自分が参加しているプロジェクトが早いもので、スタートから2年が経ちました。 ありがたいことにお客様の数は増え続けており、今でも多くのお客様に使って頂いております。初期の頃と比べると、かなり機能がリッチになりました。 元々…

JavaScriptで連番の配列を生成する4つの方法と速度比較

連番の生成に関して 意外と使用する頻度が高かったりします。他言語であればRange(eg: 1..10)のようなClassやデータ構造が定義されており、簡単に連番の配列を作成することが出来ます。しかし、JavaScript には連番の配列を簡単に生成するための機能が提供さ…

【JavaScriptサンプル有り】例外が発生した後の処理を高階関数にまかせる

これは便利 リファクタリング 既存のコードを安全に改善する(第2版)作者:MartinFowlerオーム社Amazon こちらの書籍で紹介されていた、リファクタリングの手法の1つで、例外が発生した後の処理って場面によって何をしたいか違うよねを叶えるた…

ボーイスカウト・ルールが保守開発に役立った話

コードはどんどん汚くなっていく プロジェクトのスタート時にどれだけ入念に設計をしてコードを書き始めたとしても、プロジェクトの年数が経つにつれて、コードの状態は悪くなってきます。 新機能追加 既存仕様の変更 メンバーの入れ替わり リリース日が変更…

ターミナルのパイプの中にElixirの処理を挟む方法を思いついた

きっかけは突然に 弊社のインフラエンジニアの方がデプロイ作業の中でこんなようなperlの処理系をコマンドの中にパイプで渡しているのを発見しました👀 ls | tail -1 | perl -ne 'if (/release command failed/){print 1}else{print 0}' 処理の内容はともかく…

「なのでは」「ではないかと」って言い方やめてくれ

単純に不快 なんでわざわざ「なのでは」とか「ではないかと」っていう文章を送ってくるのか理解出来ません。 これが攻撃的な言い方に感じるのは自分だけでしょうか。日々、マウントをとってくるような人が使っているイメージがあります。 「なのではないでし…

Rubyのコードレビューでよく指摘すること

コードレビューはじめました 昨年の10月から勤務先企業で開発チームのリーダーになりました。元々はコードをガリガリ書くような業務をしていたのですが、ポジションが変わったため、業務の内容も変化しました。大きく変化した点としてコードをレビューしても…

TODOコメントってあんまり意味がないんじゃないか説

とりあえず書き込まれるTODO ある日のことです。新機能開発のためにコードを眺めていると該当箇所に対応するテストコードが全くないことに気づきました。 「TDDでやってるのになぁ」と思っていると、テストコードのファイルだけが作られていて、中にTODOコメ…

またブログを頑張るための振り返りと反省

サボりがちになったブログ 思えば、昨年には一週間に最低でも1記事。一昨年には何と一週間に2、3個の記事を書いていました。 時期としては大学の学部を卒業して新社会人としては働き始めた頃で決して、時間的に余裕があったわけではないはずです。さらに今と…

【Elixir】無名関数で気軽に再帰的にメッセージの送受信を実装する

Elixirでの並行処理 Elixirでは並行処理を行うためにアクターモデルに従ってプロセス間同士でメッセージを送受(メッセージパッシング)し合います。 アクターモデルとは並行処理を効率よく実装するための手法の一つです。Elixirにおいては、アクター(軽量プロ…

GoogleCloudStorageでファイル検索を簡単にする命名方法

あらすじ とあるAPIからのレスポンスの内容が、どうやら仕様書で共有されていたモノと中身が異なっているということで、どういうレスポンスが返ってきているのかを確認してほしいと言われました。とはいえ、本番環境では1時間に約10万回ものリクエストを送っ…

JavaScriptでのスマートな再帰関数の書き方【ECMAscript2015以降対応】

仕事でJavaScriptを書くことが多くなりました。以前より学んできた多くの関数型言語で一般的に使用されている再帰関数をJavaScriptでもスマートに書けないものかなと模索してみました。 「普通にforや、mapを使えば良いのでは?」という問いかけに対する答え…

JavaScriptでawait可能なintervalの書き方

setIntervalが割と使いにくい setIntervalはPromiseのオブジェクトではないため、awaitさせて実行終了を待つことが出来ません。例えば、3秒毎にカウントを1ずつ増やしていく処理をsetIntervalで実装をすると以下のようになります。 gist.github.com 10回分の…

クリスマスプレゼントの交換会にElixirで備える

今年で24歳になりましたが、いつになってもクリスマスってのはワクワクしますね。山下達郎さんのクリスマスイブを耳にすると「もう12月かぁ〜」と胸が苦しくなります。 そんなこんなで友人とクリスマスプレゼントの交換会をすることになりました(唐突)。 誰…

Elixirでモジュール内の関数を動的に呼び出す

パイセンの実装に感動 僕が感動したのはElixirでの実装ではありませんが、Rubyで特定のディレクトリ以下に_____.rbというファイルを作成し、命名規則に従ったモジュールとinterfaceを満たす関数を実装すると、自動でモジュール内の関数が読み込まれて動的に…

気づいたらプロダクト指向な開発者になっていた

仕事の内容が変わって考え方が変わった 数ヶ月程前から、既存の受託案件の開発チームから自社開発チームに移籍して、継続的な開発をしている。 受託案件をゴリゴリ作っていた時は、作って終わりの考えでとにかく速さを重視していた。gitを使ってコードの品質…

Appleのカスタムサポートが神対応だった

相棒のMacBookから焦げた匂いが... ある日のこと、突如、MacBookから「バチンッ!!」という音がして電源が落ちた。一瞬だが、火花も見えた。 あー、これはマザーボードがショートする系のアカンやつだなぁと故障を覚悟した。案の定、電源を長押しして起動を試…

Oauthを簡単なプロセス通信でそれっぽく再現して覚える

ワイ認証が全然分かっていない 認証部分は自分が実装する前にパイセンエンジニアが既におおむね、下地を作った状態で、「これ使ってね〜」状態になっている事が多く、初期の開発に参加出来なかったりする。過去に趣味開発でOauthなりを使用したことはあるが…

ElixirでListMonadを作ってみる

Monad(モナド)の魅力 関数型言語に触れていれば少なからず「Monad(モナド)」という言葉を耳にする。残念ながら私の愛するElixirではMonad(モナド)を大々的に取り扱うことはない(知らないだけなのかも)はないが、純粋関数型言語として有名なHaskellではMonad(…

【作って学ぶフロントエンド】ReactのuseStateの仕組みについて

Hooksについて Reactのバージョン16.8に導入されたHooksという機能によって、class componentを使用せずとも、functional component(以降: FCと記述)にstateを用意することが可能になりました。 FCにstateを用意するのは非常に簡単で以下の構文を記述するの…

並行・並列と並行処理・並列処理の違いについてまとめた

毎回調べているのでまとめた 何気なく「並行処理にすると....」だとか「ここは並列処理にして...」という会話をすることが普段多いが、「並行と並列って何が違うのよ?」と前からよく思っていた。その度に、ググっては「あー。そういうことね」と理解するも…

【Elixirのサンプルコード有り】条件に一致した時に再帰を停止する方法4つを書き比べてみた

なんでbreak_reduceみたいなのはないんだろう 配列(リスト)に対して、各要素を精査する際に、特定の条件にマッチする要素が見つかった時点で処理を停止して、Elixirであれば{:exist, value}のような値を返す関数をよく作成することがある。頻出の処理パター…

【実装コード有り】銀行家のアルゴリズムの実装と検証

今更作った理由 たまたまgoogle scholarで並行処理に関する資料を眺めていたらダイクストラ法で有名なエドガー・ダイクストラさんの名前を見かけた。自分の中では数学者という認識をしていたが、実は分散コンピューティングの分野で、どのようにシステムの信…

【Elixir/supervisor入門】通常のモジュールに対してsupervisorを定義する

なぜ書いたのか Elixirにおいてプロセスの死活管理に用いるsupervisorについて学習を進めていたが、どれもGenServer、すなわちElixirのbehaviorを用いたサンプルばかりだった。また、そのプロジェクトはmix new --sup project_nameとして生成されるもので、…

【収益ほぼゼロ】何の考えもなしにブログ100記事を書き終えたので反省会をしました

100記事を書くことが凄いのか よく著名なブロガーが「まずは100記事書くといいですよ」ということを仰っている。なぜ100件なのかという根拠はないが、意図としては100も記事を書けばブログを書く習慣も身に付き、言葉の扱い方も多少は様になってくる...とい…