iPhone3GSとiPhone4の電話番号とデータをまるごと交換する手順

先日、2009年の10月ころに新規契約したiPhone3GS
つい最近(2010年の7月)に新規契約したiPhone4とで
中身の電話番号とデータをまるごと交換しました。


同じようなことをやろうとしている人の参考になればと思い、手順をメモしておきます。


きっかけはこちらの記事

窓口にiPhone3GSとiPhone4の両方を持って行けば、1時間程度で3GSのSIMをマイクロSIMに「無料」にて取り替えてもらえます

http://d.hatena.ne.jp/masataka_k/20100721/1279692966


なお、おれのケースでは、USIM再発行手数料が掛かりました。(1980円、次回の電話料金の請求に合算)

電話番号を交換する

基本的には、iPhone3GSとiPhone4に挿入されているSIMカードを交換すれば、電話番号が交換できるはずです。
問題は、iPhone4のSIMカードUSIMカードとなっていて、iPhone3GSとは物理的な互換性が無い点です。


iPhone4(USIM) -> iPhone3GS(SIM)については、変換アダプタを使って変換をすることにしました。
とくに問題なく使用できました。 http://www.amazon.co.jp/dp/B003TQVNLC/


iPhone3GS(SIM) -> iPhone4(USIM)については、SIMカードUSIMカードとして再発行してもらうことにします。
ソフトバンクショップに行き、窓口で
iPhone3GSの電話番号をiPhone4で使いたいので、SIMカードUSIMカードに変更してほしい」
と伝えました。


この時点で、かなりの難色を示されました^^;
覚えている限り、以下のことを聞かれたり、脅かされたりしました

  • 聞かれたこと
    • iPhone4の契約状態。本人名義か。それともSIM無しか。
      • 家族名義で契約しているもの、と回答
    • iPhone4の電話番号についてはどうするか。
      • iPhone3GSに入れて使いたい、と回答
  • 脅かされたこと
    • iPhone3GSの「iPhone for everybodyキャンペーン」の契約解除手数料(9000円超)が発生するかも、、、
    • iPhone4でも、何かしらの契約解除手数料が発生するかも、、、(契約者本人の来店ではないので、契約内容の確認はできない、とのこと)


おれのiPhone3GSは「iPhone for everybodyキャンペーン」で購入しています。
そのキャンペーンの契約が、いったん解除されるかもしれない。
解除された場合、9000円超の契約解除手数料がかかる、とのこと。


どうやら、単純に交換できると思っていたのだけども、思っていたほど単純ではないようです。


ただ、本当のところはどうなのかはスタッフさんも知らないらしく、
ソフトバンクのサポートに問い合わせるなどしていただきました。
その結果、今回のケースでは契約解除手数料は免除になり、
USIMカードの再発行手数料のみで大丈夫とのことになりました。


ただ、あくまで「免除」であり、iPhone3GS->iPhone4への機種変更扱いになるっぽいです。*1


手続きは大体1時間くらいかかります。スタッフさんから話を聞くところによると、
普通の携帯電話の手続きであればオンラインで即時処理ができるらしいのですが、
iPhoneの場合は不正防止等の理由でFAXでしか処理ができないことになっているらしいです。


これでSIMカードUSIMカードへの交換が完了です。
USIMカードをiPhone4に挿入、バッチリです。


本来であれば、iPhone4→iPhone3GSについても、逆の手続きが必要とのことです。(USIM->SIMの再発行)
変換アダプタでダメであれば手続きすることにしましたが、変換アダプタでうまく行っているっぽく、
特にソフトバンクショップのスタッフさんから怒られる気配も無かったですので、こちらはこのままにしておきます。


そういや、SIMは借り物だから返却するものと思っていたのですが、
「はい!」と古いSIMを手渡されました。別に返却するものではないようです。


面倒くさい事例にも関わらず、親身になって対応してくださったソフトバンクショップのスタッフさんには感謝いたします。
そして最初に対応してくださった研修生のスタッフさん、ややこしい話で、ごめんなさい^^;

データを交換する

長文つかれたので、こちらはざっとした手順と注意点だけ。
スクリーンショットなどがあればよいのですが、面倒くさいので文章だけで。


手順は以下のとおり

  1. 2台とも、iTunesでバックアップしておく
  2. iPhone4を接続、iTunesで「バックアップから復元...」にてiPhone3GSのバックアップを復元する
  3. iPhone3GSを接続、同様にiPhone4のバックアップを復元する
  4. それぞれ、WifiやE-Mailのパスワードなどの認証情報が消えているため、再認証する


こんな感じで、データが交換できます。MMSの送信ログ等も引き継いでくれます。


注意点としては

  1. Spotlight検索、フォトアルバム、iPodの音楽は、(同期しないかぎり*2)復元前のものが残るようです。


たしか、こんなところ。
今思えば、それぞれ「工場出荷の状態に戻す」してから復元するのがよかったかもしれません。

こんな状況が発生した理由

最後に、こんな状況が発生した理由について。


母親がauユーザー兼、iPodTouchユーザーだったのです。
このたび、au携帯の老朽化によりiPhone4へ乗り換えることになったのです。


そして、「どうせゲームしかしないでしょ」という理由で、
おれがiPhone4を奪い^^;
母親に3GSを使ってもらうことにしたのです。*3

*1:ちょとここは納得できないポイント。んでもまず再発行できたから良いとすることにする。

*2:Spotlight検索は同期できないので、ずっと

*3:もちろん、双方納得してます!

WordファイルやExcelファイルを一括でPDFに変換するRubyスクリプト

年度末ですね!年度末といえば納品の時期です。


おれが現在担当しているお客さんは資料一式をPDFで欲しいという希望なので
大量のWordファイルやExcelファイルを一括でPDFに変換したかったのですが
軽く調べてみても、有料のソフトを使う方法しか見つけることができませんでした。


というわけで、Win32OLE経由でOffice2007のPDF保存アドインを叩き、一括でWord/ExcelファイルをPDFに変換するRubyスクリプトを書いてみました。
少し調べてみた感じでは、多少の需要はありそうでしたので公開しておきます。


仕組み上、Office2007とPDF保存アドインが必要です。

必要なもの

使い方

スクリプトと同じディレクトリにWordファイル(*.doc)/Excelファイル(*.xls)を置いて、スクリプトを実行します。
元ファイルと同じ場所にPDFファイルが作成されます。

Wordファイルを一括でPDFに変換する

#!ruby -Ks

require "win32ole"

word = WIN32OLE.new("Word.Application")
begin
  Dir.glob("*.doc") do |fn|
    doc_fullpath = File.expand_path(fn)
    pdf_fullpath = doc_fullpath.gsub(/\.doc$/, ".pdf")
    begin
      doc = word.Documents.Open(doc_fullpath)
      doc.ExportAsFixedFormat({
        "OutputFileName" => pdf_fullpath,
        "ExportFormat" => 17,
        "OpenAfterExport" => false
      })
      puts "success: #{fn}"
    rescue
      puts "fail: #{fn}"
    ensure
      doc.Close
    end
  end
ensure
  word.Quit
end

Excelファイルを一括でPDFに変換する

#!ruby -Ks

require "win32ole"

excel = WIN32OLE.new("Excel.Application")
begin
  Dir.glob("*.xls") do |fn|
    xls_fullpath = File.expand_path(fn)
    pdf_fullpath = xls_fullpath.gsub(/\.xls$/, ".pdf")
    begin
      book = excel.Workbooks.Open(xls_fullpath)
      book.ExportAsFixedFormat({
        "FileName" => pdf_fullpath,
        "Type" => 0,
        "OpenAfterPublish" => false
      })
      puts "success: #{fn}"
    rescue
      puts "fail: #{fn}"
    ensure
      book.Close
    end
  end
ensure
  excel.Quit
end

さらに便利な使い方

Excelはシートごとに印刷設定がされていて、あるシートは縦印刷、あるシートは横印刷、なんてことになっていがちです。
Excelのほうのスクリプトにて、bookからSheetsを取得して印刷設定を統一してしまえば、より綺麗に簡単にPDF化できます。

ヘッダ行つきCSV(とかTSV)を簡単に扱うライブラリを作った

Excelにて元データを作って、その元データを使って色々するツールをよく書くのだけども
ExcelVBAはめんどいし、かといってrubyを使ってExcelデータを扱うのもめんどい。


よくやるのはシートをコピーしてメモ帳に貼り付けてTSVにしてからrubyに食わせる方法だけども
各行をsplit(/\t/)で分割するだけだと、どの列にどのデータが入っているのかがよくわからなくなる。


そこでscsv(Simple CSV)というライブラリを作ってみた。

インストール

gem install gemcutter
gem install scsv

基本の使い方

a.csv

名前,フリガナ,性別
佐藤,サトウ,男
田中,タナカ,女

a.rb

require "scsv"

SCSV.parse("a.csv") do |row|
  p row
end
#=> {"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}
#=> {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}

p SCSV.parse("a.csv")
#=> [{"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}, {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}]

オプション

SCSV.parseメソッドにはオプションを渡せます。

:header ヘッダを指定します。
  • true ... ファイルの1行目をヘッダとみなします。
  • 配列 ... その配列をヘッダとみなします。
  • false ... ヘッダを使用しません。(ハッシュではなく、配列を返します)

デフォルトはtrueです。

SCSV.parse("a.txt", {:header => ["a", "b", "c"]})
#=> [{"a" => "名前", "b" => "フリガナ", "c" => "性別"}, {"a" => "佐藤", "b" => "サトウ", "c" => "男"}, {"a" => "田中", "b" => "タナカ", "c" => "女"}]

SCSV.parse("a.txt", {:header => false})
#=> [["名前", "フリガナ", "性別"], ["佐藤", "サトウ", "男"], ["田中", "タナカ", "女"]]
:col_sep 列の区切り文字を指定します。


デフォルトは","です。


デフォルトが"\t"であるSTSVクラスも使えます。
むしろExcel使い的にはSTSVクラスのほうが使用頻度が高いかと。


a.tsv

名前\tフリガナ\t性別
佐藤\tサトウ\t男
田中\tタナカ\t女

a.rb

require "scsv"

STSV.parse("a.tsv") do |row|
  p row
end
#=> {"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}
#=> {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}

p STSV.parse("a.tsv")
#=> [{"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}, {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}]

制限事項など

クオートは考慮しません。

保存ができるようになった (HTA GUI Editor)

いい感じ。


あと最低限やりたいこと

  • 保存したHTAを読み込んで再編集する機能
  • id等のプロパティ編集機能
  • HTAタグ編集機能

できればやりたいけど難しいこと

  • コピー&ペースト
  • 複数選択

壁は乗り越えた (HTA GUI Editor)

今日は定時退社日。
このあいだの壁は乗り越えた。無理やりっぽいけども。


スクリプトから「contentEditable = true」した要素でIMEが使えない件は、「contentEditable = true」した後に「focus」してやればOKだった。

Rubyだけで起こる現象なのか、Javascriptでも起こる現象なのかは調査していない。
調べても出てこなかったところをみると、Rubyだけで起こる現象なのか。それとも誰もやってないことなんだろうか。

  def elements_ondblclick(e)
    e.srcElement.contentEditable = true
    e.srcElement.focus
  end

  def elements_onfocusout(e)
    e.srcElement.contentEditable = false
  end


現状。こないだよりもちょこっとWindowsアプリっぽいくなった。

HTA GUI Editor


かなりHTA+Rubyが好感触なので、先日ついに実践投入。

その結果、DBと繋がる仕事ツールもさくさく作ることができて、ますますHTAが気に入りました。


そのときにはVisual Web Developerを使って画面回りを作ったんですが

もっともっとHTAに最適化されたGUIエディタがほしい!

というわけで、でっちあげようとしてみました。


んだけども壁にぶつかって先に進まなくなったのでいったん日記にメモ。。。

element.offsetWidthとelement.style.pixelWidthの関係

現象は、テキストボックスを移動すると移動するたびにテキストが太る、というもの。

原因は、移動のたびにoffsetWidthの値をstyle.pixelWidthに代入し直していること。


offsetWidthはHTML要素のBorderとPaddingの値を含めた幅を取得できる、ReadOnlyなプロパティ。

一方で、style.pixelWidthはBorderとPaddingの値を含まない幅を取得・設定できるプロパティ。


んで、たぶん

offsetWidth =style.pixelWidth + ボーダー幅 + パディング幅

っていう関係が成り立つ、と思っている。参考


ここでボーダー幅とパディング幅はそれぞれ

  • style.borderLeftWidth (とかborderRightWidthとか)
  • style.paddingLeft (とかpaddingRightとか)

で取得できるんだけども、(少なくともHTAでは)このプロパティにはデフォルトスタイルシートの値は入っていない。


そのため、デフォルトでパディングやらボーダーやらが設定されている要素に関しては、offsetWidthとstyle.pixelWidthとの関係を定義できない。


…と、ここまで書いてふと思ったけども、もともとoffsetWidthじゃなくてpixelWidthを使えばいいんじゃないか?

あ、でもそれだとリサイズハンドルの位置がズレちゃうのか。うーん。

スクリプトからcontentEditable = trueにした要素でIMEが使えない

現象は、見出しのとおり。

原因は、不明。


HTML要素のcontentEditableは初期状態でfalseにしており、ダブルクリックされたときにtrueにする制御を入れているんだけども。

何でだろう。。。