読者です 読者をやめる 読者になる 読者になる

Nullarihyon 1.7

Xcode8にNullability Violationをチェックする機能が入ると聞いて一晩泣き明かしましたが、それはそれとしてちまちま開発を続けています。Xcode8との比較はまたそのうち。 github.com Nullarihyon 1.6では「nonnullなインスタンス変数に代入があるかどうかを…

Objective Cでnilと向き合う

最近のObjective Cでは、クラスやプロトコルの定義をするときに、メソッドの引数・返り値やプロパティがnilになるかどうかを書くことができるようになっています。 @interface Person : NSObject @property (nonatomic, nonnull) NSString *name; @property …

Cのauto

Unix考古学を読んでいて、ちょっと面白い記述を見つけた。 たとえば、Dennis Ritchieのコンパイラは、局所的な自動変数をautoという型で定義したり、あるいは変数定義を省略することを許していましたが、型を明確に宣言するという今日のスタイルに変更されま…

LINTを見直した話

僕は基本的にLINTが大嫌いで、理由は いくつかのLINTはあまり上手く実装されていない いくつかのよくあるルールは、プログラミング言語の設計者がわざと導入したルールを制限するものである という二つが主である。(既に使われているLINTにわざわざ文句は言…

長い文字列をNSDecimalNumberに変換するとおしりが0になる

なにかの金額を入力する画面などで、ユーザーに数字を入力してもらうUIを作ることがある。金額なので、NSDecimalNumberで受けることになる。このとき大きな数字を入力すると、入力とは違う値になることがある。*1 NSDecimalNumber(string: "9999999999999999…

NSDecimalNumber(floatLiteral:)は使ってはいけない

私がSwiftで気に入っている改善として、NSDecimalNumberのインスタンスがちょう簡単に作れることがあります。 let d : NSDecimalNumber = 15.97 すばらしい。Objective Cだとこうなって、辛い。 NSDecimalNumber *d = [NSDecimalNumber decimalNumberWithStr…

特定のMacでビルドできないXcodeプロジェクト

Xcodeに登録されているファイルの名前とファイルシステム上の名前が大文字小文字で違っている場合、Apple Storeから買ってきたばかりのあなたのMacではビルドできるかもしれませんが、Case Sensitiveなファイルシステムに設定しているMacではビルドできませ…

CI完了を待ってPRをマージするbotを作るためのライブラリを公開しました

CIを待って自動でPRをマージするbotを作ると便利だった - soutaroブログで、紹介した、CIが完了したときに自動でPRをマージするbotですが、皆さんが簡単に実装できるようnpm packageにしました。 github.com 動くと良いですね。(npm packageはまだ試してな…

CIを待って自動でPRをマージするbotを作ると便利だった

GitHubを使っている場合「Pull Requestが作られたら自動でCIを実行し、グリーンになることを確認してからマージする」というのは割と広く採用されている開発のフローだと思います。PRごとにCIすることを確実にすることで、うっかりビルドを壊すようなPRをマ…

Swiftでas!と書く場合のガイドライン

as!って言うのは、要するにダウンキャストできない場合にプログラムを終了させるものである。 if let x = expr as? SomeClass { f(x) } else { fatalError() } と書くのであれば、 f(expr as! SomeClass) と、同じことなので、as!で書いた方が良い。その方が…

それでenumとclassのどっちにすれば良いの?

SwiftのenumがObjective Cで欲しいときはどうするか - soutaroブログ この記事には enumが便利なのは ある状態では有効だけど、別の状態では有効ではない値を定義するとき です。 と書きましたが、「それはサブクラスっていうやつではないか」という声があり…

SwiftのenumがObjective Cで欲しいときはどうするか

Swiftではenumという種類のデータ型を定義できます。Cのenumと違って、引数を持てるようになっています。これが便利なのは ある状態では有効だけど、別の状態では有効ではない値を定義するとき です(すごい雑な説明なので、他の使い方も調べておきましょう…

MacでATOKを使っている場合にバックスラッシュを入力する

MacのEl Capitanでは仮名漢字変換が変わっていて、スペースを叩かなくても自動で変換してくれるようになっている。これはこれでなかなか便利なのだけど(今、何ヶ月かぶりにATOKに切り替えてみたら変換を忘れまくるので驚いた)、一つ不満があって、漢字にし…

bundle execを殺す

業務を劇的に改善する3つのスピリチュアルプログラミング技法 「バグの希釈」の項目を見て思い出した。 2015年に書いたコードの中で、一番意味不明で気が利いてたなーと自分では思っているやつは「lib/bundler/setup.rbに空のファイルを置く」というものだっ…

コーディング面接の例

プログラマの面接をするときには実際にコーディングをしてもらうべきという話は良く聞くが、もうちょっと細かくどういうお題を出したら良いかとか、どういう風に評価したら良いかとかの話はあんまり聞かない気がする。せっかくなので、ユビレジでの面接で私…

UX DAY TOKYO 2015

UX Days Tokyo 20152015.uxdaystokyo.com 行ってきた。直接に関係がある話はあんまりしません。 エクストリームプログラミングが発表されたのは1999年だったという(Wikipediaより)。 Amazon.co.jp: XPエクストリーム・プログラミング入門―ソフトウェア開…

ファイルを保存しない人生

スマホに満足してますか??ユーザインタフェースの心理学? (光文社新書)作者: 増井俊之出版社/メーカー: 光文社発売日: 2015/02/20メディア: Kindle版この商品を含むブログ (2件) を見る 私は学生の頃はEmacsを使っていて、何かのときに知ったのがauto-save-…

Rubyの::演算子について

ruby*1では、A::Bという形式の式は、NODE_COLON2という名前になる。::という演算子の式なので、コロンが二つでCOLON2だろうか。とても素直な名前である。::の両端には普通はAとかBとかの定数名を書くが、callメソッドを呼ぶための構文でも使う。 irb(main):0…

Rubyの定数は難しい

ネストしたモジュールとかクラスの定義方法には、まあ二つくらい書き方がある。 バカ正直にネストしたモジュールを並べる方法。 module A module B module C ... end end end ::演算子を使う方法。 module A::B::C ... end この二つは同じだと思っていたのだ…

ヒラギノの縦位置を揃えるちょうべんりなSketchプラグインの紹介

Sketch 3 Advent Calendar 2014の18日目の記事です。 Sketch 3 Advent Calendar 2014 - Adventar Sketchでボタン的なものを作ろうとすると、テキストレイヤーの位置決めに苦労するのはよく知られた話だと思います。ボタンの外側を作って、内側にテキストレイ…

PebbleからNew RelicでWebサービスの状態が確認できるWatchfaceを作りました

インストールはこちらから。ただし、あなたのスマートフォンがiPhoneの場合は、まだインストールできません。自分でPebble用のアプリをビルドできる場合は、GitHubリポジトリからソースコードをアレして$ pebble buildってやってください。 https://apps.get…

4時間かかるバッチ処理に失敗していた

#!/bin/bash set -e PWD=`pwd` cd /var/tmp/data/... ${PWD}/do_something.sh ...${PWD}って、シェルの組み込みの変数で常にカレントディレクトリを返す子。先頭で代入した変数名が悪い。 #!/bin/bash set -e basedir=`pwd` cd /var/tmp/data/... ${basedir}…

WordPressを使いこなせる上司になろう

WordPressは辛い。何が辛いか。 ふとアップデートすると壊れる こまめにアップデートしていると割と大丈夫だけど、ちょっと期間が空くと壊れる WordPressでCSSの変更したら壊れた画面が全世界に配信された プラグインを入れたら画面が見れなくなった 基本的…

ユビレジのサービス状況を監視するためのモニタを作りました

ユビレジではNew RelicとかLogglyとか使ってサービスに問題が生じていないかを監視しているのですが、そうはいってもあんまりちゃんと監視できていないのが問題になっていました。簡単に言うとWebブラウザでいちいちアクセスするのは、明らかにめんどくさい…

privateって書きたくない

まず前提として publicにするべきものはpublicにするべき(公開されたAPIであるもの) privateにするべきものはprivateにするべき(公開すると都合が悪いもの) である。ところが、残念なことにこの二つの間には、どちらとも言いがたいものがかなりの分量あ…

それは話が逆になっている

エンジニアが作るネットサービスのアイデアがしょぼいワケ【連載:えふしん】 - エンジニアtype 種を明かせば簡単で、エンジニアはしょぼいアイディアでも自分で実装できちゃうというだけの話なのですよ、これ。実装を一人でできるので、アイディアの段階で枝…

Cross Origin Resource Sharingのプリフライトの背景を理解する

Ajaxで他のホストのデータにアクセスできるようになるやつについてです。 HTTP access control (CORS) | MDN この辺のドキュメントを読んでいても、どうも今ひとつ納得できなかったりすることがないかと思います。 シンプルなリクエストとプリフライトリクエ…

MacからDELLのディスプレイにきれいに画面を出力させる方法

MacでMini DisplayportからDELLのディスプレイに画面を出すと、とても汚いことがあります。これを直す方法。僕はU2713Hで気づきましたが、U2713HMとかU2711とかでも同じ問題が発生しているはずだし、他のディスプレイでも同じことが起きているかもしれない。…

開発のスループットを犠牲にしてレイテンシを向上させる

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~作者: Mike Cohn,マイクコーン,安井力,角谷信太郎出版社/メーカー: 毎日コミュニケーションズ発売日: 2009/01/29メディア: 単行本(ソフトカバー)購入: 74人 クリック: 764回この…

inputでエンターキーを押しても、formのsubmitイベントが発生しないのはどうすれば良いの?

いつも忘れて混乱するので書いておく。細かいルールを解説したページを前見たんだけど見つけられない……formの中にinput[type=submit]なinput要素がないと、テキストフィールドでエンターを押してもsubmitイベントが発生しない。見えないようにしたsubmitボタ…

テキストフィールドの値の変更の監視にはkeyupイベントではなくてinputイベントを使おう

漢字が読めないがいこくじんやようちえんじにもひらがなならよめるね!アクセシブル!という話ではなくて、keyupイベントを使ってテキストフィールドの変更を監視するとiOSでこんなことになります(多分、変換の確定がキーイベントじゃない)。左上の「かん…

ユビレジで水が飲めるようになるまでの話

水が飲めるようになるまでの例え話にだけ食いついてみる。まあタイトルはちょっと嘘で「お菓子を食べられるようになるまで」の話ですけどね。 権限委譲、リーダーシップ、チーム - naoyaのはてなダイアリー ユビレジは、2010年に始めたスタートアップです。…

テストが通らなくて5時間泣いた話をしようか

class MyError < StandardError attr_reader :exception def initialize(exn) @exception = exn end end begin begin 1/0 rescue ZeroDivisionError => exn raise MyError.new(exn) end rescue MyError => exn p "rescue MyError", exn rescue Exception => …

要望を、忘れることで穏便かつ確実にリジェクトする

先日ちょっと社内で議論をして、ユビレジの改善に関するアイディアの出し方を整理しました。これまでどうやってたかというと、BasecampのTodoリストにリストアップしていた。これを止めることにしました。基本的には、Discussionという機能を使います(要す…

2012年の最後にSSDにしてみた

まあーMacは遅い。メモリ16GBも積んでるのに遅い。XcodeとRubyMineとRailsとAparture起動すると、16GB使い切る。というか「現在非使用中」とか書いてある領域が6GBくらいあって、遅い。レインボーくるくるが始まると遅い。*1たくさんある「現在非使用中」が…

Objective-Cの残念な子なところ

__blockがうざすぎる。 NSArray* a = [object foo]; NSArray* b = [a bar]; NSArray* c = [b baz];とかあったりして、ここいらがどうも遅い気がするので時間を計測したいとしよう。まずはこんな感じ。 NSDate* start = [NSDate date]; NSArray* a = [object …

Cucumberは偉かった

Cucumberを初めて見た人はこんな違和感を感じるんじゃないかと思います。 なんだこれ。変なDSL入れるより、直接Rubyプログラムを書いちゃう方が楽じゃん。便利じゃん。速いじゃん。 僕もそう思っていました。そう思ったプログラマは、Cucumberを使わずにTest…

PABさんのユビレジへのジョインについて

PABさんがユビレジにジョインしました。バリバリScalaでプログラミングされてる方で、水島を採用したときから恐れてはいたとおり、ユビレジがどんどんScalaに汚染されていきます。ああどうしましょう。(あ、念のため白々しく宣言しておきますが、私は引き続…

みずほ銀行のATMのテンキーがおかしい件

あなたが日常的に見ているテンキーには(たぶん)2種類あることに、気づいているだろうか。 画像は、iOS 6に搭載されている「電話」と「計算機」のスクリーンショットである。テンキーの順序が逆になっている。なんで逆になったのか、なんだかよくわからない…

Silent Wednesday

ジェイソン・フリード:なぜ職場で仕事ができないのか | Talk Video | TED.com 【TED Talks】なぜ職場で仕事ができないのか/ジェイソン・フリード | 書き起こし.com オフィスが仕事をするための理想的な環境でないという問題についての、37signalsの社長Json…

複数のプロジェクトでGemfileを共有する方法

require 'pathname' instance_eval (Pathname(__FILE__)+"another_project/Gemfile").read) などとします。 なんでこんなことやりたいの? Railsのプロジェクトをテストするためのプロジェクトを用意して、そっちでもRailsのモデルを読みたいのです*1。さら…

なんでソフトバンクにいかないといけないのか

例えばSquareはSSNを取って契約者の身元の担保にしているわけだと思うのですが、それがない国だとこうなるのかなーという気もします。ソフトバンクのiPhoneが必要なのは、まあソフトバンクの戦略なのかもしれませんが、その辺りの契約者の情報をきちんと確認…

Paypal Hereを買ってきました

https://www.paypal.jp/here/Webページには書いてないけどソフトバンクのiPhoneが必要という噂の、Paypal Hereを買ってきました。(僕のiPhoneはSoftbankなので、auだとダメなのかとかわかりません。)Paypal Hereの購入に必要そうな手続きとか、Softbankで…

第3回 iphone_dev_jp 東京iPhone/Mac勉強会でFrankの紹介をしました

サンプルプログラムとプレゼンテーションを公開します。https://github.com/soutaro/chefpad各方面に(いらん)配慮をした結果、サンプルプログラムは画像リソースを削除してあります。(どの方面かはプレゼンテーションの中に残してあるスクリーンショット…

Core Dataに久々にはまった

ユビレジを使っているお客さんから商品のダウンロードがえらい遅いという報告を受けました。さあ、いったい何が起きている??遅い原因は、二つありました。 インポートの際に手抜きをして、Find-or-Createをナイーブに実装していた saveがめちゃくちゃ遅い …

SelectorKitというライブラリを公開します

http://soutaro.github.com/SelectorKitiOSアプリのViewを指定するためのselectorです。割とCSSセレクタに似た構文にしています。uiQueryというのがあるのですが、これを書くのがかなりしんどいのでかっとなって作りました。ドキュメントに書いてないのです…

FrankでRubyからiOSアプリを操作してテストする

昨日の話の続きです。 iOSアプリのインテグレーションテストに関する問題 - soutaroにっき こんな感じでテストを書くことができます。 ENV['RAILS_ENV'] = 'development' require File.expand_path('../../server/config/environment', __FILE__) require 'r…

iOSアプリのインテグレーションテストに関する問題

iOSにかぎらず、今日のアプリケーションではサーバとクライアントの両方を開発しなくてはいけないことが、決して特別ではありません。その際にややこしいのが次のような事情です。 開発は同時に行われるので、厳密にプロトコルを予め決めておいて、モックだ…

ユーザビリティテストをやってみました

アジャイルユーザビリティ - soutaroにっき 実際にやってみました。テスタは開発チームの友人をたどって、4人に参加してもらいました。私は見てるだけの人で、弊社のデザイナの子が案内役です。次のようなシナリオを用意して、実際に操作してもらいました。 …

アジャイルユーザビリティ

ソフトウェアの開発において、それが使いやすいのかどうかを判断するのは大切なこと。でも、開発チームのメンバー、プログラマやデザイナが見ていても、本当に迷わずに使えるのかどうか調べることはとても難しい。よろしい、それではユーザーテストだ。アジ…