Karakuri.com

Fintechではたらくアプリケーションエンジニアの技術録

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

前職は世界中で開発したソフトウェアを販売しており、同じ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などのオブジェクト指向型プログラミング言語に用意されている抽象クラスとインターフェースですが、コード的な違いは理解していても使い分けまでできているケースは意外と少ないです。中級未満のエンジニアだと、そもそも抽象クラスやインターフェ…

SwiftにはByte型がないので戸惑うけれどUInt8がバイトやバイト配列を担っています

むかしむかしのSwiftにはByte型があったと思うのですが、あるとき突然廃止されました。Byte型の配列など使って低級の処理をしていたアプリやプログラムはコンパイルすらできない事態に。C#やJavaからやってきた人も一瞬戸惑うのではないでしょうか。どう調べ…

Swiftでバイト配列(UInt8配列)の変数どうしで論理演算XORを計算する方法

Swiftで[UInt8]のままXORをする必要がありました。しかしSwiftのXOR演算子は「^」であり、下記のように書いてもコンパイルエラーとなります。 let first: [UInt8] = [0xff, 0x10, 0xa0] let second: [UInt8] = [0x01, 0x02, 0x03] let result: [UInt8] = fir…

MacOSにHomebrewでHttpキャプチャソフトFiddlerはインストールできなくなったのでMonoで起動しましょう

HttpでAPIを叩くときに重宝するのがFiddlerです。Windowsアプリ開発では使わせていただいているのですが、iOSアプリ開発でも使えるのでしょうか。どうもMacOSでも使っている人が結構いるみたいなのでインストールすることにしました。 Homebrewでインストー…

Githubにpushできなくなってfatal: could not read Username for 'https://github.com'とか言われる

C#で.Net Frameworkなアプリケーション開発にはVisual StudioとGithub Extension for VIsual Studioを使っています。最近は自宅作業もなかったため、久しぶりに家の環境でpushしてみたら fatal: could not read Username for 'https://github.com' No such f…

XcodeとSwiftでUILabelのテキストのハイパーリンク化は気軽にはできない

HTMLライクなデザインでテキストにハイパーリンクを付けることになりました。 各項目を入力して送信ボタンを押してください。何か分からないことがありましたら、こちらからお問い合わせください。 こんなケースですね。アンダーバーだけハイパーリンク化し…

SwiftでObjective-Cのポインタ型を書き換えるときのUnsafeMutablePointer<T>について

とあるSDKを使ってiOSアプリを開発しているのですが、いただいたSDKのドキュメントに書かれているサンプルコードがObjective-Cでした。僕はObjective-Cは嫌いなのでSwiftに書き換えます。するとこんな関数がありました。 (id)method:(int*)arg; Int型のポイ…

SwiftでiOSアプリのファイルシステムのディレクトリの存在チェックを行う

iOSアプリのDocumentsディレクトリにログを出力しようと思い、Logディレクトリを作成しました。当然このディレクトリはアプリが初めて起動したときに作成され、以降はディレクトリ作成を行う必要はありません。でもSwiftでディレクトリの存在チェックって情…

Swift4でDateの日時を任意のフォーマットでStringで表示する

Swiftの日時を表示するのはDateクラスで簡単に実装できます。 // 2018/01/12 00:00:00 print(Date()) しかしFormatを指定するとなると結構行数を使ってしまうんですよね。 let format = DateFormatter() format.timeStyle = .short format.dateStyle = .shor…