2014年6月28日土曜日

iPhoneカンフー #021 ブラウザで一番上に戻る

今日の肝

  • 画面一番上の時刻を(ダブル)タップすると、ブラウザで表示中のページの一番上に簡単に戻れる

iPhoneで結構長いページを表示していて、一番上に戻りたくなるときありますよね。 検索フォームとかが上にあるときとか。

えっちらおっちら上にスクロールするより、時刻の表示されている黒い帯をダブルタップしましょう。

これで簡単に一番上に戻れます。知っていると、とても便利!

ちなみにこのワザはiPadでも使えます。また、ブラウザがChromeの場合はシングルタップで戻りますね。

2014年6月23日月曜日

ビデオ会議アプリappear.inが便利

5月から翻訳講座を始めたのですが、教室にいらっしゃれない方がいるので、なんとか様子を中継して差し上げることはできないかなと思ってアプリを探していました。

そしたらビックリするほど簡単なのが見つかりました。それが appear.inです。

使うにはどうすればいいかというと、ブラウザでhttps://appear.in/xxx と入力するだけ。

xxxは適当な名前で、基本的には他のセッションとぶつかっていなければ大丈夫。中継して欲しい人にappar.in/xxx にアクセスしてもらえば、それで双方向のビデオ会議が開始されます。

翻訳者の方は、必ずしもこの方面に詳しくない人が多いので、「アプリをダウンロードして」「アカウントを取得して」「ログイン名はこれで」とかいう細かい話はできるだけ避けたいわけですが、これなら誰でも使えます。

  • 今のところ、Chrome、Firefox、Operaのみ対応(Windows、Mac、Android)。最近iPhoneアプリもできて、試してみたら2時間つなぎっぱなしでも大丈夫でした。WiFiがなくてもでも大丈夫です(長時間になると帯域制限とかかかっちゃうのかな?)。
  • lockすることで第三者が入ってこられないようにできる
  • 8人まで一度につなげる
  • 今のところまったく無料。メアドの登録も簡単に使う分には必要なし(将来はプロ版とかで儲けるのかな〜)。

誰でも簡単に使えるのがすばらしい! 

Onsen Kung Fu #001 Reisenji Onsen (霊泉寺温泉; Ueda, Nagano)

  • Rating —— ★★★★★ (5/5)
  • Fee —— 200 Yen (Cheep!)
  • Open —— 7:00AM - 9:00PM Every day
  • Map and Official Web Page (in Japanese)
  • Drinkable —— YES (4 persons I asked said "YES", including the receptionist, who is often absent.... And I have had several times and experienced no problem, though I do not find it tasty)
  • Color —— transparent
  • Smell —— none

Be prepared. It is DIRTY. It is not like fancy onsen places everywhere in Japan now.

But it is comfortable, and it seems very good for our health. My wife and son really loves this onsen.

2014年6月15日日曜日

本田、コンディション悪し

ブラジルワールドカップ、日本代表初戦。対コートジボワール戦。1-2で敗戦。

本田も香川もコンディション悪し。長友もイマイチか。決められた2発はいずれも左サイドからフリーでクロスを上げさせていた。誰も相手に行っていないんだもの。それも2分後にまったく同じ失敗をするというのはいただけない。

本田、1点目を決めたのはさすが。勝負強い。

でも、後半はパスミスのオンパレード。ボールを取られて、コートジボワールの攻撃の起点になっていたような気がする。

ザッケローニも不運だなあ。エース二人が、最悪のシーズンを送っちゃったあとだからなあ。それでも二人と心中する道を選んだのね。

内田の詰めがもう一歩速かったら

惜しかったのが前半の内田のシュート。キーパーがはじいたのに詰め切れていなかった。

反応がちょっと遅いんだよね。シュートを打ち終わったら、はじくことを予想して詰めなくちゃダメでしょ。はじいたのを見てから動き出しても遅すぎ!

このビデオ見ても、一瞬、ボーッと見ているよ。すぐ詰めようよ!

思い出すのが、2002年の決勝戦、ブラジル対ドイツ。カーンがはじいたシュートをきちんと詰めて決めたロナウドはやっぱり「一流」。10,000回は「ムダ走り」になっても、10,001回目はムダじゃないかもしれないのだよ。

このビデオでロナウドがひたすら前に詰めているところに注目!

超楽観的なシナリオ

こうなったら、超楽観的なシナリオを描くしかないかな〜。

徐々に調子を上げて、予選リーグを2勝1敗で2位通過。決勝トーナメントで本田も香川も絶好調になって、D組1位のコスタリカを撃破。勝ち進んで、地元ブラジルと大決戦。なんてね。

動きが重かったな〜、最初から。調整の失敗なのか、高温多湿と雨が影響したのか、それとも潜在意識では決勝トーナメントに標準を合わせているのか……。う〜ん。10日後に判明する結果や如何に。

2014年6月12日木曜日

Swiftカンフー #002 標準入力から文字列をもらう

プログラミング言語を覚えるには「実際に役に立つプログラムを作ってみるのが一番」というわけで、翻訳作業で役に立つプログラムを作成してみることにしました。

私が自作するプログラムの多くは「フィルタ」です。ファイル(あるいはキーボード)から文字列を読み込んで、何かを処理して出力する。

標準入力(stdin)から文字列をもらう

フィルタを作るには標準入力からの読み込みができないとなりません。C言語のscanf()とか、C++のcinとかみたいに。

Google大明神にお願いすること数度、何とかできました。出典はstackoverflowです。

// example-01-stdin.swift
import Foundation  // Objective-CのNSFileHandleなどが使えるようになる

func データ読み込み() -> String {
  var 標準入力用ファイルハンドル = NSFileHandle.fileHandleWithStandardInput()
  var 生データ = 標準入力用ファイルハンドル.availableData
  var 文字列データ = NSString(data: 生データ, encoding:NSUTF8StringEncoding)
  return 文字列データ
}

func 何か処理(入力文字列: String) -> String {
  return 入力文字列 + 入力文字列 // 2度繰り返す
}

var 読み込んだ文字列 = データ読み込み()
while 読み込んだ文字列 != "" {
  let 処理後の文字列 = 何か処理(読み込んだ文字列) // ここで処理
  print(処理後の文字列)
  読み込んだ文字列 = データ読み込み()
}

2014年6月11日水曜日

Swiftカンフー #001 関数から複数の値が戻ってきたときの処理

もうじきiOSの本を出版するので、Swiftは避けて通ることができません。

というか、なかなか悪くない言語かなと思っています。

GoogleのDartも悪くないと思ったのですが、やっぱりそう簡単には広まりません。だいいち実行速度が遅すぎるし...。 しかしAppleがiOSやMac用に採用したとなると、強制的に広まることになります。

というわけで、Swiftのお勉強を始めることにしました。

関数は複数の値を返せる

Swiftの関数は複数の値を返せます。たとえば次のように定義します。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

しかし、日本語が変数名や関数名に使えるというのはメチャわかりやすいですね。ふ〜む。変数とテキストの区別がつかなくなるかと心配していたのですが、それは杞憂のような気もします。もっとも、英語ネイティブな人々はいつもこんな風に書いているわけですからね。かえって、funcとかIntとかreturnとか、キーワードが目立ってわかりやすいかもしれませんね。

複数の値をもらうには?

関数から複数の値が返ってくるのは、はっきり言って便利です。 ポインタとか使わなくていいですし、明確です。 JavaScriptでもオブジェクトを返せば複数の値を簡単に返せますが、私はすぐに気がつかなかったです。それに対して、こう明確になっていると明確。もっともPHPは返せましたよね(色々やっていると混乱する...)。

さて、「返ってきた複数の値をどう処理したらいいんだろう?」と思ったら、タプル(tuple)というのを使えばいいのです。あえて訳せば「n組」「n個の組」とでも言いましょうか。Wikipediaを見ると「組」という訳も使われているみたいですね。

じつは関数定義の次の部分は「タプルを返しますよ」という宣言なのでした。この場合は「三つ組み」を返しますということですね。

 ->(灯油: Int, レギュラー: Int, ハイオク: Int) 

それで、受け取る側は次のようにタプルで受け取ればいい。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表()  ## ★★ここ★★ letは定数の定義

println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

実行結果はこちら。

% swift -i example-01-func-multi-value1.swift ## ← -iでファイルを指定できる
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円

% swift  example-01-func-multi-value1.swift ## ←オプションを指定しないと実行ファイルを作る

% ./example-01-func-multi-value1   ## これで実行できちゃう
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円
  • let —— 定数の定義
  • println —— 1行出力。「\(<変数>)」で変数の値を入れられる。ライブラリとかインクルードしなくても使える。

なお、タプルをひとつの変数に代入することもできるようです。最後に、全部まとめてソースを書いておきましょう。

/* ファイル名: example-01-func-multi-value1.swfit */

// 関数の定義
func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表() // タプルで受け取る
println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

let 価格表 = ガソリンスタンドの価格表() // こうすることもできる
println("本日の価格(税込) -- 灯油:\(価格表.灯油)円 レギュラー:\(価格表.レギュラー)円  ハイオク:\(価格表.ハイオク)円");

2014年6月3日火曜日

まさか新しいプログラミング言語Swiftが出てくるとは

アップルのWWDCが始まった。まず言っておきますけど、これは世界「開発者」会議であって、アップルの新製品発表会ではありません。 したがって、この会議で新製品が出てこないのは「あたりまえ」なのです。新製品が出てくることがおかしいのです。

しかし、新しいプログラミング言語が出てくるとは思いませんでしたな。 新しい市場を切り開いてくれますなあ。アップルさん。

おかげで新しいネタはできますが、ついていくのは大変です。

開発者も、みんなそんなにswiftに移行はできないのではないでしょうか。

SwiftはSwiftでも、Jonathan Swiftの『ガリバー旅行記』に出てくる巨人のようになってしまいやしないだろうか。

2014年6月2日月曜日

カンフーマック番外編 #002 「連絡先」への住所の入力

今日の肝

  • Macの「連絡先」への住所ペーストは、「以降の住所」の部分にペーストすると楽。
  • Safariからも右クリック(control+クリック)で登録可能
  • [サービス]で[マップを表示]して、「マップ」アプリ上で["連絡先"に追加]も可能

iPhoneカンフーの目次はこちら

iPhoneでもMacでも「連絡先」の住所の入力は面倒です。たとえばお葬式の会場の住所をウェブページで検索して、「連絡先」に住所をコピー・ペーストしようとしても、一度にペーストはできず、「都道府県」「市町村」などの単位に分けて入力しなければなりません。

郵便番号をコピペして、都道府県をコピペして、市の部分をコピペして、残りをコピペして、電話番号をコピペして、やっと終わり。面倒ったらありません。

じつはMacの「連絡先」に新しい住所をペーストするなら簡単な方法があります。「以降の住所」の部分に、郵便番号を含め全部ペーストしてしまえばよいのです。「都道府県」や「郡/市区町村」のところではなく、「国」の前の「以降の住所」のところです。

たとえば、「〒386-1105 長野県上田市吉田33番地6 」を「以降の住所」のところにペーストすると、386-1105、長野県、上田市、吉田33番地6と自動的に分かれて入力されます。楽ちんです。

これを発見したのは数か月前ですが、それ以来いつもこの方法を使っています。

ここで疑問

でも、なぜ同じことを、たとえば郵便番号欄に入力したときにやってくれないのでしょうか? ほぼ同じ処理をすればよいだけだと思うのですが。この処理をやったからといって「副作用」があるとも思えませんし。

せっかくすばらしい「マイクロインタラクション」を思いついたのに、なぜできるだけ広い場面で利用できるようにしないのでしょうか? 一番自然なのは、郵便番号にペーストしたときか、都道府県にペーストしたときにこの処理を行うことだと思うのですけれど。

Appleのプログラマーの気持ちがわからない。あるいは、プログラマーはそうしようと思ったが、マネージャーに拒否されたとか?

Safariから簡単に追加できる!

この記事を書いて横になっていたら、Safariの右クリックで何かできそうな気がしてきたので試してみました。

住所を選択して置いて右クリック(control+クリック)すると、「"386-1105、長野県、上田市、吉田33番地6"を調べる」という項目が出てきます。それを選択すると、小さなウィンドウに地図とともに住所録風のデータの「住所」部分にきちんと住所が記載されて[新規連絡先]というボタンも表示されます。

[新規連絡先]ボタンをクリックして、名称を入力して[作成]をクリックしてみました。何も起こりませんでしたが、「連絡先」アプリをみてみると、新しいエントリが加わっていました。ありゃりゃ、こっちのほうが楽ですね。

ちなみに、右クリックして[サービス]メニューの[マップを表示]を選択して、「マップ」アプリ上で["連絡先"に追加]を選ぶこともできました。こちらのほうがきちんと「連絡先」アプリが起動されるのでわかりやすいですね。この方法なら、Safari以外のアプリからも使えます。

今日の肝

  • Macの「連絡先」への住所ペーストは、「以降の住所」の部分にペーストすると楽。
  • Safariからも右クリック(control+クリック)で登録可能
  • [サービス]で[マップを表示]して、「マップ」アプリ上で["連絡先"に追加]も可能