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 については下記記事で知った。感謝。

2017-02-07

Primare I30 が修理から帰って来た

今年頭からノイズ音を出して調子の悪かったアンプ Primare I30 が修理を終えて、今日戻って来た。おかえりなさい!!

2017-02-04 (土) に修理完了の連絡が来て、翌日入金。宅配便で今日の 20:05 に届いた!

Primare I30

二重のダンボール箱に入って到着。梱包材がしっかり詰まって、輸送中にガタガタしないようになっていた。専門店の仕事はしっかりしてる。

Primare I30

えっちら頑張って Primare I30 を箱から取り出した。床に直接置くのはいたみそうなので、座椅子の上に。まだ青いビニールに包まれてる。

Primare I30

シートを取って、さあもうひと頑張り。ラックの中に入れて、各種ケーブルをつないでやる。

Primare I30

かくて Primare I30 は元の場所に戻りけり。

音は気持ち良く鳴ってくれるけど、ノイズ音はもう聞こえない。よかった、よかった。

というわけで CD をかけてみる。最初の一枚はギーゼキングの弾いたバッハのパルティータ集。音楽が楽しい。

あとでスピーカーのセッティングも詰めておこう。No Music, No Life!

2017-02-06

iPhone でワークアウトの月次集計の詳細を見る

今年に入って、朝と夕方に散歩をするようにしている。Apple Watch で「ワークアウト」のウォーキングを起動して、20 分とか 2 km とか目標を決めて歩いている。

ワークアウトの記録は iPhone のアクティビティ・アプリから「ワークアウト」タブを開くことで確認できる。デフォルトで表示されるのは、各月のワークアウトの合計。月を選べば、その月に行なった各ワークアウトの一覧が表示される。

今回は、各ワークアウトではなくて、各月のワークアウトの合計について。

ワークアウトの月次集計

この各月の集計では、ワークアウトをした時間と消費したカロリーの合計と平均、そしてワークアウトの回数が表示される。

全アクティビティ

でも、それだけだと味気ない。せっかく一月頑張ったんだし、色々データを取ってるんだから、もう少し詳しく知ることは出来ないものか。

で、右上にある「フィルタ」から「ウォーキング」を選んだらびっくり。詳細情報が表示された。

ウォーキングのみ

表示された項目は次の通り:

  • 回数
  • 時間 (合計と平均)
  • カロリー (合計と平均)
  • 距離 (合計と平均) NEW!
  • ペース (合計と平均) NEW!

距離とペースの項目が増えた!

これを見てみると、1 月は合計で 100 km 以上も歩いたとか、2 月はまだ 1 月の 1/4 しかワークアウトをやってないとか、1 回のウォーキングに 1 月は 28 分かけていたのに 2 月は 23 分と短めだとか、2 月平均でカロリーも距離も 1 月平均に負けているのはやってる時間が短いからかな、もう 5 分頑張ってみようかな、なんてことが分かる。

あ、でも 2 月は平均ペースが 11'35" で 1 月の平均ペース 11'48" を上回っているな。良いね自分を褒めたい。

と、こんな感じでワークアウトを続けて行く拠り所になってくれる。

詳細項目は「フィルタ」で選ぶものによって変わる。ぼくはウォーキングとランニングとサイクリングしかやっていない。ウォーキングとランニングは「ペース」となっていたけど、サイクリングは「速度」になっていた。他のワークアウトではどんな表示になるのか。ちょっと興味がわく。

2017-02-05

git worktree で別ブランチの参照をこなす

Git 2.5.0 から git worktree コマンドで「今とは別」のブランチを他のディレクトリーに書き出すことが可能になった。

$ git worktree add path branch

例えば、feature/fix-a で作業中に hotfix/2.1.1 のコードが読みたくなったとする。その場合、こんな風にする。

$ cd ~/project/foo
$ git branch
  develop
* feature/fix-a
  hotfix/2.1.1
  master
$ git worktree add ../foo-hotfix hotfix/2.1.1

これで ~/project/foo-hotfix に hotfix/2.1.1 ブランチの内容がコピーされた。

このコマンドの面白いところは、リポジトリーをコピーしているのではないところ。リポジトリーはあくまで一つで、別の worktree を作っている。worktree はリポジトリーにひも付いた作業場のこと。git init や git clone した後に「作業をしている場所」のこと。

リポジトリーが同じなので、worktree コマンドで作った場所 (上の例では ~/project/foo-hotfix) でのコミット等は自動的に ~/project/foo でも参照することができる。git merge など不要。

複数のブランチを参照したい時、複数のブランチをほぼ同時に編集したい時に便利。

2017-02-04

NSArray に subArray を追加した NSArray を返す

Objective-C で NSArray に要素を追加することは出来ない。追加したければ NSMutableArray を使う。

NSArray から NSMutableArray は、mutableCopy で作れる。

NSArray *array = @[@1, @2, @3];
NSMutableArray *mArray = [array mutableCopy];
NSArray *subArray = @[@4, @5, @6];
[mArray addObjectsFromArray:subArray];
NSArray *newArray = [mArray copy];

ただし、「元の NSArray に subArray を追加した NSArray」が欲しいだけなら、mutableCopy を使う必要はない。arrayByAddingObjectsFromArray: というメソッドが使える。上のコードをarrayByAddingObjectsFromArray: を使うとこう書き直せる。

NSArray *array = @[@1, @2, @3];
NSArray *subArray = @[@4, @5, @6];
NSArray *newArray = [array arrayByAddingObjectsFromArray:subArray];

NSMutableArray を一度作らなくて良いので手間が省ける。関数型っぽく書ける点も気に行っている。

2017-02-03

WiMAX 2+ の速度制限が「3 日で 10 GB」に緩和された

2017-02-02 (木) から、WiMAX 2+ が速度制限の条件緩和と適用時間変更を行なった。変更点は次の通り:

  • (旧) 3 日で 3 GB 使うと制限がかかる
    • (新) 3 日で 10 GB 使うと制限がかかる
  • (旧) 翌日の昼から翌々日の昼まで、最大 1 Mbps (?) に制限
    • (新) 翌日の 18 時から 26 時まで、最大 1 Mbps に制限

あとがき

3 日で 3 GB だと、iTunes などの動画配信サイトで映画を 1 本ダウンロードすると一発で制限に引っかかってしまう。映画を見たら、翌日は映画を観ることができなかった。3 日で 10 GB なら、映画 2 本は借りられる。制限に引っかかるの前提なら、3 日で 3 本借りて、翌日休んで、また 3 日で 3 本借りる。というのもアリかな。正月とかお盆とか、映画を借りたくなる日って続くんだよね。

ロゴヴィスタが「痛風に効く」レシピ・アプリをリリース

「広辞苑」や「リーダーズ英和辞典」など、辞書系アプリをリリースすることで有名なロゴヴィスタがレシピ・アプリをリリースした。その名も「法研 通風に効くおいしいレシピ 200」。

アプリの説明の前半を抜粋する:

健診で「尿酸値高め」と指摘された人
「痛風」を治したい人に
料理研究家「20人」による厳選レシピ一挙200点!!

  • 痛風対策に役立つ選りすぐりの200レシピを集めました。
    数多い料理のなかからバラエティーに富んだ献立を立てることができます。
  • 掲載レシピは20人の料理研究家による、味も量も満足の料理ばかり。
    痛風が心配な人だけでなく、家族みんなの健康を考えた食事作りにお勧めです。
  • 献立が立てやすいように、レシピは「主菜」「副菜」などのジャンルや食材別に掲載。
    それぞれにエネルギー量、塩分量、食物繊維量を記載しています。
  • 全料理のイメージをひと目で見られる写真入りインデックスを収集。
    作りたい料理・食べたい料理をすばやく選んで、目的のページへジャンプすることができます。
  • 「痛風とは」「尿酸値とは」「痛風を治す食生活のポイント」などの
    知っておきたい知識を、図解入りでわかりやすく解説。
  • レシピ名、食材別インデックスからレシピを検索できます。

元本を出版している法研は「家庭医学大全科」とかを出している会社なのね。初めて知った。

健康診断で尿酸値が高かったとこぼしてる同僚が居るので、このアプリを知らせてみよう。

2017-02-01

Primare I30 の修理見積りが出た

修理に出したアンプ Primare I30 の見積りが、昨日出た。3 万円程度で直りそうとのこと。

壊れていたのは、プリアンプ部のミュートリレー電源カップリング・コンデンサーが 8 つとボリューム・ロータリースイッチ。ここら辺が壊れていたので、プリ出力からノイズが出ていた。あと、ぼくが確認したわけじゃないけど、パワー部へ信号が流れなくなり、Primare I30 のスピーカー端子からは音が出なくなっていたそうな。ここ数年はプリ出力しか使っていなかったから、気づかなかった。

Primare I30 のボリュームはリモコンと本体の両方で変えることができる。ボリューム回りを見た人によると、ぼくはリモコンでばかりボリュームを変えていたらしい。たまには本体のつまみも回してあげると、良いですよ、とアドバイスを伝えられた。返って来たら、本体のボリュームつまみも時々回すようにしよう。

あとどれくらいかかるのか分からないけど、早く修理が終わってくれると嬉しい。

アクティビティで 2017 年 1 月の「完璧な 1 か月」を達成した

Apple Watch のアクティビティ・アプリで「完璧な 1 か月」を達成して、バッチをもらった。

Apple Watch Activity Badge

バッチ獲得の説明は下記の通り:

2017 年 1 月はムーブゴールを毎日達成したので、このバッジを獲得しました。

説明にある通り、目標カロリーを消費する「ムーブ」を 1 か月毎日達成した。ぼくが設定している目標カロリーは 220 キロカロリー。かなり低目だけど、それでも今まで毎日達成することが出来ていなかった。

今年は「謹賀新年チャレンジ」獲得を最初の目標に「ムーブ」達成を行なった。「謹賀新年チャレンジ」バッジを獲得できた後も、失速しなかった。毎月三日坊主になってたアクティビティを、1 か月間ちゃんと続けることができた。ある程度ペースが出来ると、アクティビティを続けることも難しくなくなる。このまま毎日運動を続けて行きたい。小さな成功をコツコツ重ねたい。

ref