Hatena::ブログ(Diary)

130単位

2011-10-31

『JavaScript本格入門』の感想とメモ

増刷のキャンペーンをたまたま目にして申し出たところ、書籍を送っていただけました。ありがとうございます!

目次

Chapter 1 イントロダクション

Chapter 2 基本的な書き方を身につける

Chapter 3 基本データを操作する 〜組み込みオブジェクト

Chapter 4 繰り返し利用するコードを一箇所にまとめる

Chapter 5 大規模開発でも通用する書き方を身につける 〜オブジェクト指向構文

Chapter 6 ブラウザを自在に操る 〜ブラウザオブジェクト

Chapter 7 HTMLXMLの文書を操作する 〜DOMDocument Object Model

Chapter 8 サーバ連携でリッチなUIを実装する 〜Ajax

Chapter 9 ライブラリを利用してコードをシンプルにする 〜jQuery

Chapter 10 現場で避けてとおれない応用知識

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで:書籍案内|技術評論社

構成について

Chapter1が導入で、Chapter2-5がコアJavaScript、Chapter6-10がクライアントサイドJavaScriptとその応用の解説になっています。初級者の方はChapter4の関数あたりまで読んだらChapter6以降に進み、ある程度実際に利用する感覚をつかんでからChapter4-5に戻るといいような気がします。また業務でjQueryをメインに扱うのであれば、jQuery参考書でもあらためて学ぶのがいいと思います*1

参考になったところ

自分自身JSに触れた当初からjQueryに頼ってきてたゆとり具合なので、理解の浅かった込み入った部分に関しては非常にためになりました。以下メモとして引用させていただきます。

他書籍との比較

自分が読んだことのあるものとの簡単な比較です。

書籍それぞれで対象読者は異なりますし、プログラミングを学ぶ際にはピンポイントで1冊の書籍を読み込むよりも、複数あたりながら知識を積み重ねていくのも有効な方法だと思います。

『JavaScript本格入門』は、"本格入門"のタイトル通り、基礎から実践的トピックまで幅広くかつ適切な分量の解説があり、最初の1冊としては十分おすすめできると感じました。


4774144665
JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

関連リンク

関連記事

*1:書籍の中でも参考情報としていくつか紹介されています

2011-10-16

iPhone3GSからiPhone4Sへ移行メモ

f:id:deeeki:20111016223347j:image

発売翌日に入手できました。16GBブラック、回線は引き続きソフトバンクです。3GSが初iPhoneだったので、2台目のiPhoneです。

機種変更

  • ソフトバンクショップ
  • プラン変更
  • 一括払い
    • ポイント2100円分をつかっておきたかったため
      • 割賦金と月月割で相殺される16GBでは月の請求でポイントから差し引かれない
    • 請求に合算ではなくその場で支払い
  • 3GS機種変更キャッシュバック
    • 登録完了をもって申し込み完了らしい
    • 後日対象者にソフトバンクから詳細メールが届くらしい
    • 月1000円ずつ6ヶ月間のキャッシュバックらしい
  • 3GSのSIMカードは返却なくそのまま
参考リンク

データ移行

ふつうにiTunes接続すると購入済み全アプリ同期されるので注意です。

f:id:deeeki:20111016224020p:image

f:id:deeeki:20111016224019p:image

f:id:deeeki:20111016224018p:image

f:id:deeeki:20111016224017p:image

f:id:deeeki:20111016224016p:image

参考リンク

ケース

たまごの殻のように薄くて軽いiPhone 4S/4用ハードケース。☆NEW☆eggshell for iPhone 4S/4

いろいろ種類出ていますが、クリアケースに惹かれて選んでみました。4S発売前に別の店舗で予約したんですが、未だ発送されず>< 上記は公式ショップのようですので手に入りやすいと思われます(10/16現在全色在庫あり)。

参考リンク

そんなわけでケース未装着なため積極的に使えないでいますが*1、へたってきてた3GSから快適操作が期待できる4Sに乗り換えることができて満足しています。

*1デフォルトのフィルムもつけたまま

2011-10-06

郵便番号→住所自動入力Ajax API/ライブラリ比較

入力フォームでよくある、郵便番号から住所を自動入力させるAjax。それ用のAPIJSライブラリをいくつか調べてみました。

ajaxzip3

zipdata(
{
-1070051: [
13
"港区"
"元赤坂"
], //省略
}
)

郵便番号検索API (CGI's)

<ZIP_result>
<result name="ZipSearchXML"/>
<result version="1.01"/>
<result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1070052"/>
<result request_zip_num="1070052"/>
<result request_zip_version="none"/>
<result result_code="1"/>
<result result_zip_num="1070052"/>
<result result_zip_version="0"/>
<result result_values_count="1"/>
<ADDRESS_value>
<value state_kana="トウキョウト"/>
<value city_kana="ミナトク"/>
<value address_kana="アカサカ(ツギノビルヲノゾク)"/>
<value company_kana="none"/>
<value state="東京都"/>
<value city="港区"/>
<value address="赤坂(次のビルを除く)"/>
<value company="none"/>
</ADDRESS_value>
</ZIP_result>

郵便番号検索API (グルーブテクノロジー株式会社)

{
-zipcode: {
-a1: {
zipcode: "1070052"
prefecture: "東京都"
city: "港区"
town: "赤坂(次のビルを除く)"
prefecture_yomi: "トウキョウト"
city_yomi: "ミナトク"
town_yomi: "アカサカ(ツギノビルヲノゾク)"
}
}
office: { }
}

郵便番号検索API (株式会社アイビス)

{
message: null
-results: [
-{
address1: "東京都"
address2: "港区"
address3: "赤坂"
kana1: "トウキョウト"
kana2: "ミナトク"
kana3: "アカサカ"
prefcode: "13"
zipcode: "1070052"
}
]
status: 200
}

ricollab 郵便番号検索

{
zipcode: "1070052"
-address: {
prefecture: "東京都"
city: "港区"
town: "赤坂(次のビルを除く)"
}
-yomi: {
prefecture: "トウキョウト"
city: "ミナトク"
town: "アカサカ(ツギノビルヲノゾク)"
}
}

まとめ

今回はajaxzip3を導入することにしました。用意されているメソッド引数にフォーム要素のname属性を指定するだけで、非常に簡単でした。サーバーサイドなどAPIとして利用する場合は、株式会社アイビスさんの郵便番号検索APIが総合的にみて良さそうに思います。

参考リンク


477414813X
パーフェクトJavaScript (PERFECT SERIES 4)

4774144665
JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

2011-10-03

Rails3 ISO-2022-JPでメール送信

先人達の知恵がありますが、別のアプローチを考えついたので記事にしてみます。

※検証したものの運用が不十分なため、問題が起きる可能性がありますので参考にされる場合はご注意ください

環境

要点

  • ActionMailerクラスのdefaultやmailメソッドでcharsetを指定しても、メール本文は変換されない
  • 本文を変換させるには、Mail::Bodyのインスタンスのcharsetを直接指定する

上記の記事ではMailライブラリにモンキーパッチをあてていますが、ActionMailerでも同様に、かつすっきり書くことができます。方法は2通りあります。

オーバーライド

app/mailers/application_mailer.rb (※ファイル名は自由)

#require 'nkf'
class ApplicationMailer < ActionMailer::Base
  default :charset => 'iso-2022-jp' #件名はこれでok

  def mail(headers={}, &block)
    mail = super
    mail.body.charset = 'iso-2022-jp' #本文は直接指定
    #mail.body = NKF.nkf('-w -J', NKF.nkf('-j -W', mail.body.raw_source)) #変換エラー対策 (旧)
    mail.body = mail.body.raw_source.encode('iso-2022-jp', :invalid => :replace, :undef => :replace).encode('utf-8') #変換エラー対策
    mail
  end
end

モンキーパッチ

config/initializers/mailer_fix.rb (※ファイル名は自由)

require 'action_mailer/base'
module ActionMailer
  class Base < AbstractController::Base
    default :charset => 'iso-2022-jp'

    def mail_with_fix(headers={}, &block)
      mail = mail_without_fix(headers, &block)
      mail.body.charset = 'iso-2022-jp'
      mail.body = mail.body.raw_source.encode('iso-2022-jp', :invalid => :replace, :undef => :replace).encode('utf-8')
      mail
    end
    alias_method_chain :mail, :fix
  end
end

変換エラー対策 (追記)

例えばWindowsの「〜」が入っていると、標準のencodeメソッドではうまく変換できません。

Encoding::UndefinedConversionError: U+FF5E to EUC-JP in conversion from UTF-8 to EUC-JP to stateless-ISO-2022-JP to ISO-2022-JP

id:ya_maさんの記事にあるようにNKFを使うのがいいようです。さらにActionMailerだけで完結するには、UTF-8ISO-2022-JPUTF-8という二重の変換を行う必要があります(ISO-2022-JPのままだとActiveSupport#blank?でエラーになる)。

Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with ISO-2022-JP string)

さらに追記

丸数字や"はしごだか"は上記では回避できないようです。encodeメソッドのオプションを使う方法がありました。

mail.body = mail.body.raw_source.encode('ISO-2022-JP', :invalid => :replace, :undef => :replace).encode('UTF-8')

留意点としては、機種依存文字が「?」に置き換えられてしまいますので、それを許容する必要があります。

まとめ

mailersの中だけで完結するオーバーライドのほうがわかりやすいと思いますし、複数のMailerクラスがある場合でも継承をうまく使えば1箇所の記述で済みます。ただし、例えばDeviseのようなメール送信を行う他のライブラリへの対応ができません。モンキーパッチだと、ActionMailerの書き換えであるためその点も解消されます。

Appendix

  • mail.transport_encoding = '8bit' とするとBase64エンコードを回避できる
    • これはUTF-8の場合にログでメール本文把握できるというメリットもある
    • via: Rails3レシピブック Recipe158
  • 添付ファイルもmail.parts.eachなどとしてcharsetを指定すればよさげ
  • 最新版Mail 2.3.0でもbodyにcharsetが渡っていないため、同様に使えると思われる
  • 二重の変換が無駄なため、Mail::Body#encoded相当の処理を今回上書きするメソッドに記述したほうがいい気がする

参考リンク


4797363827
Rails3レシピブック 190の技

4797359730
Ruby on RailsによるWebアプリケーション・スーパーサンプル改訂版