2017-02-19

Objective-C で 2 つの配列を比べた時同じ要素で最初に見つかったものを返す方法

2 つの配列がを比べて「同じ要素」があるかないか? あるなら、最初に見つかった要素は何か? を調べたいとする。

これを for 文で書くとこんな風に長いコードを書く必要が出てくる (Goto 文を使う是非は置いといて...)。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = nil;
for (NSNumber *n in numbers) {
    for (NSNumber *m in targets) {
        if ([n isEqual:m]) {
            result = n;
            goto objectFound;
        }
    }
}
objectFound:;
NSLog(@"first object: %@", result);

first object: 3

実は Objective-C には、こういう目的に合ったメソッドが用意されている。それが firstObjectCommonWithArray:。これを使って上のコードを書き直すと、for 文が一行にまとめられる:

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = [numbers firstObjectCommonWithArray:targets];
NSLog(@"first object: %@", result);

first object: 3

もし見つからなかった場合は nil が返る。便利!

2017-02-18

Apple Music でコンサート用プレイリストを作ってみる

明日、荒川区民会館サンパール荒川で無料のクラシック音楽コンサートがある。曲目は次の通り:

  • ドボルザーク作曲交響曲第8番
  • スッペ作曲軽騎兵序曲
  • イバノビッチ作曲ドナウ川のさざなみ
  • サウンドオブミュージックメドレー

楽しみ。

さて、この手のコンサートがあると曲の予習・復習をするようにしている。これがコンサートによっては自分の知らない曲もあったりする。(今回は有名な曲ばかり。どの曲も CD を持っている。) 今までは CD を持っていない曲は予習なしでコンサートに挑んでいた。

最近は Apple Music (もしくはGoogle Play Music) のお陰で状況が一変した。新作やよっぽどの秘曲でもない限り、たいてい Apple Music に曲がある。なので、予習し損ねることがなくなった。

コンサートの曲目順にプレイリストを作っておくと一気に流すことができる。CD だと (コンサートの曲目順に曲が並んでいることはまずないので) 複数のCD を入れ替えないといけないんだよね。予習にも復習にも便利。コンサートごとにプレイリストを作ってるとゴチャゴチャしちゃうので、ぼくは一年分のプレイリストを作ってる。

2017-02-17

少し古い Git コミットを Zip にまとめる

「不具合の出たコード」が欲しいと言われた。

開発中に難しい不具合が出たので対応している時の話。ヘルプを求めていたら、上のようなリクエストが来た。

諸々の事情で Git のリポジトリーを共有できなかったので、Zip に固めて渡すことにした。けれど、手元のリポジトリーは別のコミットが 3 つくらい入っている。今の修正も stash に入れて作業するのは面倒だし、この前記事にした git worktree を使うほどでもない。

そこで使ったのが git archive コマンド。

$ ​git archive --format=zip コミット・ハッシュ値 > failed.zip

コミット・ハッシュ値は git log で調べた。

コマンド一つで .git ディレクトリーとか無視して欲しいファイルを除いて zip ファイルを作成してくれる。ハッシュ値を指定して、古い状態を直接 zip 化できるのもありがたい。

こういう、ちょい面倒な作業をシンプルにしてくれるコマンドはもっと覚えていきたい。

2017-02-15

Objective-C で NSArray から filter した配列を得る

配列を filter して新しい配列を得たい。Swift で言う所の、次のようなコード。

let array = [1,2,3,4,5,6]
let newArray = array.filter { $0 % 2 == 0 }

Objective-C で書こうとするとループを回すしかないのかな? なんて思ってた。こんな感じに。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSMutableArray *tmp = [NSMutableArray new];
for (NSNumber *n in numbers) {
    if (n.integerValue %2 == 0) {
        [tmp addObject:n];
    }
}
NSArray *newArray = [tmp copy];
NSLog(@"even numbers: %@", newArray);
even numbers: (
    2,
    4,
    6
)

そしたら filteredArrayUsingPredicate: というメソッドがあることを知った。上のコードは次のように書ける。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"modulus:by:(SELF, 2) == 0"];
NSArray *evenNumbers = [numbers filteredArrayUsingPredicate:predicate];
NSLog(@"even numbers: %@", evenNumbers);
even numbers: (
    2,
    4,
    6
)

7 行のコードがたったの 2 行になった。頑張れば 1 行でも書けそう。

Swift ほどのシンプルさはないし、NSPredicate を使いこなせないといけないけれど、極めれば便利に使えそう。

modulus:by: は NSExpression.h の中に載っていた。

2017-02-14

AMN 10 周年感謝飲み会に参加してきた

昨日、AMN の 10 周年感謝飲み会があったので参加してきた。

  • 日時: 2017-02-13 (月) 19:30-22:00
  • 場所: AMN 会議室

会社を出たのが 19 時半頃だったので、開始から約 1 時間遅れて到着。

AMN の場所が分からなくてマップで検索。虎ノ門 33 森ビルの中に入って、フロア・リストを見ると... 4F にあった!

Agile Media Network

エレベーターで 4F へ。AMN の受け付けに白い紙。

Agile Media Network

近づいてみると、10 周年記念の会議室の案内。

AMN 10th Aniv.

中に入ると徳力さんが AMN の歩みを話していた。途中入場なので話も後半。2012 年頃が話題になっていた。最初から聞きたかったなぁー。AMN の話でもある「アンバサダー・プログラム」。これを「アンバサダー」と決めるまでに別の案もあったとか。話し合いの末に (徳力さんの案が敗れて?) アンバサダーに決まったとか。裏話も色々聞けた。

巨大なバームクーヘンも登場。参加者がカメラを取り出す。みんなブロガーなんだなぁ。

巨大バームクーヘン

もちろん、ぼくも。

久しぶりな顔、名前だけしか知らないような人。様々。引っ込みじあんで、あまり声をかけられなかったけど、楽しかった。

2017-02-13

The Wikisinger — ロケーションによる天然サウンド・エフェクト付ミュージック・ビデオ

The Wikisinger は 2015 年 7 月に公開されたミュージック・ビデオ。

1 人の男性がオリジナル曲を「いろいろな場所」で歌う。「いろいろな場所」とは、普通の部屋・屋根裏部屋・ホール・トンネル・工事現場... そして無響室。計 15 か所のロケーションで撮影・録音している。場所によって音の響き方が変わるので、シーンが切り替わるたびにまるでサウンド・エフェクトを変更したかのように聞こえてしまう。例えば普通の部屋はいくぶんデッドでホールは反射音が多くリバーブ (残響) が強い。工事現場のように開けた場所では、室内より更にデッドで、無響室に至ってはリバーブが 0 になる。

サウンド・エフェクトを「機器」を使って付与することは難しくないけれど、それをあえて排しているのが、このビデオの面白いところ。

このビデオを他の人に見せたら、「背景(ロケーション)は合成で、実際は機器でサウンド・エフェクトを付けてるんじゃないの?」と疑われた。そこで見つけたのが、このビデオのメイキング。

シーンが切り替わっても、画面に映る調度品が同じ位置に見えるよう、メジャーで位置を測って配置している様子などを見ることができる。

本編とメイキング。二本合わせて見ると面白さが倍になる。

なお、このビデオを良いオーディオで聴くと、ホールで手をパァーンと叩いた音が目の前に広がって行く。オーディオ的な面白さも味わえて楽しい。Bluetooth や AirPlay、Chromecast の使える環境の方は是非観てみて欲しい。

2017-02-12

JVC Kenwood が企業プロモーション・ビデオを作ってた

古巣の JVC Kenwood が企業プロモーション・ビデオ「JVCKENWOODancing」を作っていた。元同僚から教えてもらった。

横浜赤レンガ倉庫 1 号館 (公益財団法人横浜市芸術文化振興財団) との連携による企業・地域プロモーションとのこと。制作の経緯によると、

このたび「横浜赤レンガ倉庫1号館」から参画をご提案いただいたダンスの楽しさに触れる、「横浜赤レンガ倉庫1号館」という劇場を知る、地域と劇場がつながることを目的とした「企業・地域と劇場をつなぐ 赤レンガ・ダンスプロジェクト」は、当社が「JK3.0」で推進する「新たな企業文化の構築」への取り組みとの親和性が高いため、風土改革活動の一つとして位置付け、“社員自らが表現者(ダンサー)として出演する”企業プロモーションビデオの制作に至りました。

2017年 | ニュースリリース | 株式会社JVCケンウッド より引用

ビデオは 6 分 59 秒。楽曲は広瀬香美の「ロマンスの神様 2016」(新アレンジ)、ダンス振付は伊藤千枝。ビデオはニュース・リリースやダイバーシティページで観ることができる。YouTube にもアップするってニュース・リリースには書いてあったけど、2017-02-12 現在見つけることは出来なかった。

ビデオを見てたら元同僚の姿も見つけることができた。頑張ってるんだなぁ、と感概ひとしお。

2017-02-11

Github で ignore space change 相当の diff を見る方法

過去に Github の Files Changed (diff) で -b (--ignore-space-change) フラグ相当の差分を見る方法を紹介した。

git diff -b と同じような出力をどうやって見るか。

方法は簡単。アドレスバーの URL 末尾に「?w=」というクエリー文字を追加してページを開く (Return キーを押すとページが開く)。これだけ

clmemo@aka: Github の「Files changed」(diff) で空白を無視する より引用

で、最近この方法を使おうとしたら使えなくなっていた。「?w=」だけではダメになっていて、必ず「?w=1」と指定しないといけなくなっていた。

URL のクエリーとしてはこっちの方が正しいので納得は出来る。Github 側が仕様を変えたのかな? それとも Chrome に変更があったのかな?

2017-02-09

Amazon で著者をフォローする

Amazon で著者をフォローすると、新刊情報が届くようになる。著者をフォローするには、Amazon の商品ページから著者名をクリックして「著者」の写真の下にある「+ フォローする」ボタンをクリックする。

Amazon - Follow Author

新刊/新シリーズ・チェックしたい作者とか登録しておくと良さそう。スクショでは、最近ジャンプで体裁している「ワールドトリガー」の作者「葦原 大介」をフォローしてみた。シリーズ再開して新刊が出る時に、気づけるように... と。

著者ページは広いてもほとんどスルーしていたから、「フォロー」ボタンの存在に気づかなかった。

「フォロー」ボタンの存在は、「白依のカノジョ」の作者ブログで知った。

フォローして頂くと新刊情報その他お知らせが届くようですよ。

Amazon著者セントラルというものに登録してみました。 - 日坂水柯(ヒサカミカ)日々ヲ記ス より引用

著者の人は「Amazon 著者セントラル」というのに登録すると、このフォロー・ボタンを出すことができるようになるなしい。他の作者の人達も「フォロー」ボタンを出すようにしてくれると嬉しいな。

※ もちろん、日坂水柯氏もフォローした。

2017-02-08

現在の Emacs のバージョンを調べる方法

Emacs のバージョンを調べる方法について。

一般には変数 emacs-version を参照すれば良い。

emacs-version
"26.0.50.1"

けれども、ぼくのように開発版の Emacs を使っている場合はこの情報だけじゃ不十分。バグを見つけたとしても、数コミット先では修正されているかもしれない。

そんなケースでは Git のハッシュ値を見る。Emacs も Git でバージョン管理するようになったから (数年前まで CVS だったのが信じられない!)

嬉しいことに、コンパイル時の Emacs のハッシュ値を調べる関数がある。

(emacs-repository-get-version)
"308d5962236448a84795f49d775601599688d78d"

すごい!!

ref

emacs-repository-get-version については下記記事で知った。感謝。