Karakuri.com

ベンチャー企業で働くソフトウェアエンジニアの技術録

CloudFormationでAmazon SQS metricsのDimensionsは何を書けばいいのか?

Serverless FrameworkでSQSのCloudWatch Alarmを作成しようとしたときに情報が全然なかったので整理します。Serverless FrameworkではSQSはサポートしていないため、CloudFormationで記述することになります。そしてSQS CloudWatchメトリクスについてはここ…

TerraformでAurora MySQLに対してEC2のみアクセスを許可するセキュリティグループを作成する

Aurora MySQLとその周りのインフラをTerraformで構築していたのですが、VPC内のEC2からのみAuroraへのアクセスを許可するセキュリティグループの作成に少し手間取ったのでメモを残しておきます。 module "vpc" { source = "terraform-aws-modules/vpc/aws" v…

Serverless Framework+Lambda+Node.js+TypeScriptで別のAWSアカウントのDynamoDBにアクセスする

いわゆるAWSのクロスアカウントでリソースにアクセスする方法についてのメモです。方法はいくつかあるのですが、STSを使った方法が汎用的に見えたので採用しました。 const sts = new STS(); const roleResponse = await sts .assumeRole({ RoleArn: ROLE_AR…

WPFと.Net FrameworkでPasswordBoxを簡単に自分で作ってみる

WPFに標準で用意されているPasswordBoxはWinForms時代のものなので機能が貧弱です。一番イケてないのはPasswordBoxに入力したパスワードをViewModelにBindingできないこと。実際にはEventTriggerなどを使えばBindingできることはできるのですが、MVVMパター…

WPFのTextBoxがソフトウェアキーボードと被ってしまわないようにXAMLだけで自動で最上位に移動させてみる

TextBoxがソフトウェアキーボードと被ると入力ができなくなってしまうので、ソフトウェアキーボードが表示されたら自動でTextBoxは画面の最上位に移動して欲しいケースはタッチパネルPC向けのアプリケーション開発では必ず出てくるかと思います。ただこの自…

AWS OrganizationsのAWSメンバーアカウントを別のOrganizationに引っ越ししました

会社が大きくなった結果、1つのAWS Organizationsに複数の組織のAWSメンバーアカウントが同居する状況が発生し、管理部側で請求を整理するのが大変になってきました。このため、新たな組織(Organizations)を作成してAWSメンバーアカウントを移動することに…

AWS Organizationsで作成したAWSアカウントのルートアカウントを取得する方法

AWS

AWS OrganizationsからAWSアカウントを作成することができますが、このときルートアカウントは自動生成されたパスワードが設定された状態になっているそうです。このパスワードは特に通知されないため、通常はログインすることができません。ただ何等かの理…

CloudFlareで2段階認証もバックアップコードも紛失してしまったので無効化・復旧した話

先日メンバーからCloudFlareにログインできないと相談を受けました。アカウントの2FAを強制オンにしていたのですが、2FAを紛失してしまったとのこと。バックアップコードも保管した記憶がないということで、メンバーのアカウントの復旧を試みました。 CloudF…

言語設定によって小数点や桁区切り文字が違って海外で不具合が起きる話

前職は世界中で開発したソフトウェアを販売しており、同じWindowsでも日英中韓台独仏伊と8か国くらいの言語版でテストしてたりしました。するとドイツ版で変な挙動をするという報告を受けました。どうも数値がおかしくなるんだそうです。それで当時調べてみ…

Ruby on RailsでTimeとDateTimeとPostgreSQLのTimestampの精度の差でRspecが失敗した話

言わずもがな保守運用をやってるレガシーシステムで時刻で使っている型がバラバラでして、ちょっと不具合修正をしたらジェンガのように音を立ててRspecが失敗するようになってしまいました。原因を調べていくと、DBで使用しているPostgreSQLのTimestamp型ま…

PostgreSQLのintervalを使えばselectのtimestampの年を加算できた

DBに保存されている日時から有効期限などを求めるような場合、SQLで計算後の日時でまとめてしまいたいケースに遭遇しました。調べてみたらPostgreSQLなら簡単にできるらしい。PostgreSQLって日時操作が強いんですね。 select created_at + interval '1 year'…

Ruby on RailsとPostgreSQLとHerokuのタイムゾーンの設定と関係で混乱したので調べました

会社のWebサービスがRailsでPostgreSQLを使っているのですが、DBで保存されているタイムスタンプのタイムゾーンがよく分からず小一時間調べて複雑だったのでメモ。 それぞれのタイムゾーン設定状況 Ruby on Railsのタイムゾーン設定 config.active_record.de…

Swiftで暗号ライブラリCommonCryptoを使ってAESや3DESなど導入する

WindowsやAndroidは暗号ライブラリが豊富にあるので困らないのですが、iOSのSwiftだと暗号ライブラリが少なくとても大変です。有志が様々なライブラリを作ってはいるのですが、例えば3DESだと対応しているライブラリは皆無です。結局iOSに標準で入っているCo…

テスト仕様書の書き方とフォーマットが分からない人のためにテンプレートを作成しました

テスト仕様書を書いてくれと言われてもそのフォーマットは多種多様なものがあります。IPAなどの機関がフォーマットを定義していることもないため、新卒の新人でも渡されたテスト仕様書のフォーマットを見て「こんなフォーマットで良いのか…?」と戸惑う人も…

Swiftで一部の画面の回転禁止を導入したらiOS9はsupportedInterfaceOrientations was invoked recursivelyと例外が飛んでクラッシュする

iOSアプリ開発で、デザインの問題で一部の画面だけ回転を禁止にする必要が生じました。この一部の画面だけ回転を禁止するというのはUX的に問題があるのはそうなのですが、同時にAppleとしても推奨していないことのような気がします。案の定、iOS9でクラッシ…

VirtualBoxのUbuntu(ゲストOS)で起動したRails ServerにWindows(ホストOS)やLAN内のスマホでアクセスする方法

VirtualBoxのUbuntu上でRuby on Rails開発環境を構築したのは良いのですが、Rails ServerにホストOSのWindowsやスマホからアクセスするのに苦戦してしまったので忘れないうちにメモ書きしておきます。 VirtualBoxのネットワーク設定を変更する ネットワーク…

Windows10にVirtualBoxでUbuntuをインストールしてRuby on Rails開発環境を構築しました

Windows10にRuby on Rails開発環境を自宅に構築したので忘れないうちにメモ書きしておきます。

C#でcsharp2nemを使ってXEMやモザイクを任意のウォレットへ送金する

先日はcsharp2nemを使ってNEMのウォレットの情報を取得する方法について書きました。 www.k-karakuri.com 今回はcsharp2nemを使ってXEMやモザイクを送信する方法について書きます。 csharp2nemを使って送金の準備をする 接続するネットワークを選択する 前回…

XcodeのFrameworkでBridging Headerは使えないのでmodule.modulemapを追加してエラー回避する

外部ライブラリをラップするライブラリを作成して社内で使いまわすということをWindowsやAndroidでは当然のようにやってきたのですが、iOSでは簡単にできない場合があります。それはObjective-Cで書かれたライブラリをSwiftのFrameworkでラップする場合です…

C#でcsharp2nemを使ってNEMのウォレットの残高などの情報を取得する

NEMはRESTFulな思想で開発が容易という特徴がありますが、さらに各言語にライブラリが公開されているので、NEMのブロックチェーンから情報を取得するのが容易になっています。今回はC#向けのライブラリであるcsharp2nemを使ってNEMのウォレットの情報取得を…

C#のTaskを使った非同期処理のタイムアウトの実装方法について

C#

データ量に比例して処理時間が増えるコードを非同期処理で実行していたのですが、データ量が少ないとプログレスリングがすぐ消えて画面のチラつきになってしまうことがありました。このため、処理時間が一定以上の場合はプログレスリングを表示し、一定未満…

SwiftとiOSで定期的なバックグラウンド処理の実行は不可能なので諦めるべき

AndroidやWindowsではバックグラウンドで定期処理を実行することは比較的容易です。これと同様にiOSでも同じ機能を実装しようとすると問題に直面します。直面するというか、その機能はiOSでは実装できません。 iOSのバックグラウンド処理 UILocalNotificatio…

レガシーコードの特徴を具体的な4つの例を示して問題点をまとめます

C#

新卒で入社した企業では20年物のソースコードが現役で動いていたりしました。しかも協力会社に丸投げした部分やインドにオフショアした部分などが入り混じってカオスとなっていました。エンジニアも玉石混在で、カオスに練度の低いエンジニアが保守拡張した…

SwiftのisEmptyやCountはnilを返す可能性があることを忘れてしまう

C#でstring.Emptyを多様しているせいか、SwiftのisEmptyがnilとなることを想定せずにクラッシュさせてしまったことが昔ありました。そのときPlaygroundで挙動を確認したことがあったので、その結果を載せておきます。 nilの可能性を忘れてしまう変数 isEmpty…

C#でもvarを使うべき3つの理由|Microsoftも使用を推奨

C#

前職でコーディング規約を整備しましょうという話になり、配られたコーディング規約にC#の型指定でvarを使うという内容がありました。新卒の研修の際にはvarはネガティブな説明だったので驚いたのですが、採用した理由はMicrosoftのコーディング規約を参考に…

TryParseを例外発生の防止に使うのは間違った使い方

C#

C#でTryParseは安全な型変換のために使われますが、単に例外を回避するためだけに使っているケースがあります。今回はTryParseのアンチパターン(悪い使い方)と正しい使い方について書きます。 TryParseの間違った使い方 問題回避の先延ばし string str = n…

ViewBoxの中に設置したWrapPanelを親の親であるScrollViewerの横幅でレスポンシブルにさせる

XAMLのViewBoxを使うとViewのズームやズームアウトを導入することができます。このScrollViewerの中にViewBoxを配置し、更にViewBoxの中にWrapPanelを配置したときにWrapPanelをWindowやPageのサイズに合わせて機能させる方法について書き残します。 問題の…

XAMLのBindingが途中で動かなくなる現象の原因を調べてみました

XAMLにBindingしていたプロパティが、あるタイミング以降に変更が反映されなくなる現象に遭遇しました。原因はBindingしているプロパティに値を直接代入するコードが実行されていたためでした。 問題の現象の詳細 問題のコード <TextBlock Text="{Binding Message}" Name="Message"/> XamlでViewModelのプロパティ</textblock>…

はてなブログのフォトライフにアップロードした画像を一括ダウンロードするWPFアプリケーションをC#で開発しました

はてなブログにはブログのバックアップサービスがありますが、残念ながら画像ファイルのバックアップはできません。アップロードした画像はフォトライフというサービスで管理されているのですが、ブログと違うサービスのせいなのか、連動してバックアップを…

抽象クラス(Abstract)とインターフェース(Interface)の違いと実装の使い分けについて

C#やJavaなどのオブジェクト指向型プログラミング言語に用意されている抽象クラスとインターフェースですが、コード的な違いは理解していても使い分けまでできているケースは意外と少ないです。中級未満のエンジニアだと、そもそも抽象クラスやインターフェ…