アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

プログラミング

RSpec letとcontextを使ってテストの見通しを良くする方法解説

RSpecを始めたばかりの人にとって、letやcontextは最初は少し難しく思えるかもしれません。しかし、letやcontextを使いこなすことでテストの見通しを格段に良くすることができます。このエントリでは、RSpecのletとcontextの使ってテストの見通しを良くする…

Firestore データベースの使い方とルールの設定方法(Web/React)

Firebaseでアプリケーションを作るときは、データベースとしてFirestoreを使うのが便利です。FirestoreはクラウドベースのNoSQLで、FirebaseやGCPから簡単に扱うことができます。このエントリでは、Firestoreの簡単な使い方とFirestoreルールの設定方法を紹…

React コンポーネントのアンマウント時のエラーを修正する方法(componentWillUnmount)

Reactアプリで表示を切り替えるためにコンポーネントをアンマウントしたときに、エラーが出ることがあります。このエントリでは、Reactコンポーネントのアンマウント時のエラーを修正する方法を紹介します。

React URLパスを定義してページ遷移する方法(react-router-dom)

react-router-domを使うと、ReactでURLパスによるページ遷移を実装することができます。しかし、ReactやSPAに慣れていない人にとっては、react-router-domの使い方に少し戸惑うかもしれません。このエントリでは、react-router-domを使ったページ遷移の実装…

React FirebaseでGoogleログインを実装する方法(Authentication)

ReactアプリにGoogleログインを実装したいときは、Firebase AuthenticationとFirebase SDKを使うと簡単です。むしろ、Firebase AuthenticationやGCPコンソールでのOAuthクライアントの設定の方でハマりがちかもしれません。このエントリでは、ReactアプリにG…

Elixir DoS脆弱性になり得るAtom枯渇と対策(Atom Exhaustion)

Erlang/Elixirにおいて、Atomを使うことはよくあります。このエントリでは、DoS脆弱性になり得るAtom枯渇(Atom Exhaustion)とその対策について説明します。

Elixir エラーハンドリング構文try~catchとtry~rescueの違い

エラーハンドリング構文と言えばJavaScriptでは try~catch, Rubyでは begin~rescue, Pythonでは try~except があります。そう、多くの言語でエラーハンドリング構文は1つです。しかしElixirには2種類のエラーハンドリング構文があります(!?)。いったいどんな…

Go言語 配列とスライスの宣言方法(array/slice)

Go言語(Golang)には固定長の配列(array)と、可変長のスライス(slice)があります。このエントリでは配列とスライスの宣言方法についてまとめています。

Go言語 スライスの初期化と要素追加の注意点

Go言語に限らずポインタが存在する言語では「ポインタなのか?値なのか?」ということに常に気を配る必要があります。さらにスライスになると「中身がポインタなのか?」「容れ物がポインタなのか?」「どちらもポインタなのか?」というように、注意すべき…

プリミティブなデータを扱う際の注意点とステートメント「CODE COMPLETE」まとめ

前回のエントリでは、防御的プログラミング、変数、例外などをまとめた。このエントリでは、「CODE COMPLETE」から数値、浮動小数点数、文字列などプリミティブなデータを扱う際の注意点とステートメントについてまとめる。

防御的プログラミングと例外「CODE COMPLETE」まとめ

前回のエントリでは名付け、継承、凝集度などをまとめた。このエントリでは、「CODE COMPLETE」の防御的プログラミングと例外、変数についてまとめる。

継承はできるだけ避ける。名付けと凝集度「CODE COMPLETE」まとめ

「神は細部に宿る」という言葉があるように、洗練されたコードは細部まで無駄がない。洗練されたコードを書きたい人にとって、「CODE COMPLETE」は古いが色褪せないエッセンスに溢れている。このエントリでは、「CODE COMPLETE」の6章「クラスの作成」と7章…

勉強会「実践クリーンアーキテクチャ」参加レポート

5連休初日に開催されたオンライン勉強会「実践クリーンアーキテクチャ」に参加しました。このエントリでは、個人的に勉強になったポイントをまとめます。

Python デフォルト引数の定義タイミングはハマりやすい

言語を問わず、メソッドの引数にデフォルト値を設定しておく「デフォルト引数」はよく使います。しかしPythonでは、デフォルト引数の定義タイミングはRubyなど他の言語とは異なっており、ハマりポイントとなっています。このエントリでは、Python特有のデフ…

Ruby on Rails エンジンにおけるアセットパイプラインの設定方法

Ruby on Railsにおいて、アセットパイプラインはデフォルトで有効になっており、JavaScriptファイルやCSSファイルを圧縮して配布するのに使われます。しかし、アセットパイプラインはライブラリ間のバージョン違いによって躓きやすく、「エンジン」を使う場…

Ruby on Rails エンジンにおけるFactoryBotの設定方法

Ruby on Railsでの開発において、FactoryBotはもはや切っても切れない存在になっています。しかし、Ruby on Railsでサブアプリを追加する機能の「エンジン」を使う場合には、設定に少し戸惑うかもしれません。このエントリでは、Ruby on Rails 6のエンジンで…

Elixir Ectoで複数IDを指定してレコードを取得する方法

EctoはElixirのORMで、ElixirにおけるActiveRecordのような存在です。EctoとActiveRecordの書き方はよく似ていますが、言語が違うので当然、違いもあります。このエントリでは、Ectoで複数IDを渡してレコードを取得するメモしておきます。

Ruby on Rails リンクを生成するlink_toヘルパーで確認ダイアログ(confirm)を出す

リンクを生成してくれるlink_toヘルパーは、Ruby on Railsの数あるヘルパーのうちでもよく使われます。link_toヘルパーは、リンクの記述をシンプルにするだけでなく、簡単に確認ダイアログ(confirm)を出すこともできます。このエントリでは、Ruby on Rails 5…

Ruby on Rails カスタムバリデーションのエラーメッセージを翻訳する

Ruby on Railsでは、カスタムバリデーションを使って独自のバリデーションを追加することができます。しかし既存のバリデーションと違い、カスタムバリデーションではi18nによる翻訳を自分で追加しなければなりません。このエントリではRuby on Rails 5にお…

新人エンジニアが手戻りのないPull Requestを作るコツ(Web開発)

Webの開発現場では、GitHubのPull Requestでコードレビューが行われることが多いです。このエントリでは、新人エンジニアが手戻りのないPRを作るためのコツを人気スマートフォンゲーム「クラッシュロワイヤル(クラロワ)」のクエスト機能を例に挙げて紹介し…

AngularJS ユーザーの権限によって表示を切り替える方法

AngularJSで、ユーザーの権限によって表示を切り替えるという認可っぽいことをしたいケースがあります。「認可っぽいこと」と言っているのは、データは取得できてしまうものの、非表示にすることでそれらしく見せているためです。このエントリでは、AngularJ…

Python テストでクラスメソッドをモックする方法(unittest.mock)

Python3において、メソッドをモックしてテストしたいときがあります。メソッドのモックにはMagicMockがよく使われますが、MagicMockを使ってクラスメソッドをモックすると、テストケースが終わっても影響が残ってしまいます。このエントリでは、範囲を限定し…

AngularJS テストでAngularFire2のsnapshotChangesをスタブする方法(Firestore)

Angular.js + Firestoreという構成では、クライアントライブラリとしてAngularFire2を使うケースが多いと思います。メタデータを含めたデータを返す`snapshotChanges()`をスタブするのは少し面倒です。このエントリでは、AngularJSのテストでAngularFire2のs…

Python リストを任意の数に分割する(N分割)

PythonでリストをN分割したいときがあります。このエントリでは、PythonでリストをN分割するスニペットを紹介します。

Python 作って楽しい「Slack Bot」で学ぶ初めてのWeb API

天気予報や地図情報など、世の中の多くのWebサービスがWeb APIを提供しています。プログラミング初学者にとって、Slack Botの開発はWeb APIを学ぶのにちょうど良い題材です。このエントリでは、PythonプログラムからWeb APIを経由してSlack Botに発言させる…

Python MFAアカウントでAWS SDK(Boto3)を使う方法(STS)

AWSアカウントにはMFA(多要素認証)を設定している場合が多いと思います。そのため、MFAを設定したアカウントでAWS SDK for Python (Boto3)を使うには、先に認証情報を取得する必要があります。このエントリでは、MFAアカウントでAWS SDK(Boto3)を使う方法を…

Python シェルコマンドを安全にパイプして実行する

Python3でシェルコマンドを実行するにはsubprocessモジュールを使います。このエントリではshell=Falseとしながら、安全にシェルコマンドをパイプして実行するコード例を紹介します。

gRPC サーバー・クライアント異なる言語間で通信するサンプル(Go言語/Ruby)

gRPCはGoogleが公開したRPCフレームワークで、gRPCを使うと、サーバー・クライアントで異なる言語間においてもローカルオブジェクトかのごとくメソッドを呼び出すことができます。このエントリでは、公式サンプルを使ってGoで立てたgRPCサーバーのメソッドを…

Ruby 特異メソッドを定義してインスタンスメソッドを上書きする方法

一般に、継承やMix-inを使わずにメソッドを上書きしてしまうのは推奨されることではありません。読み手にとって何が起こっているかわからないコードは、バグの温床となるからです。しかし、上書きができないというわけではありません。そう、Rubyならね…。こ…

Ruby on Rails リクエストログにユーザーIDを追加する方法(Lograge)

Ruby on Rails 5でAPIを作っていて、デフォルトのリクエストログにユーザーID(user_id)を追加したいということがあると思います。このエントリでは、Ruby on Rails 5でLogrageを使ってリクエストログにユーザーIDを追加する方法を説明します。