SourceTree for Windowsで秘密鍵と公開鍵を生成!

前回は SourceTree for Windows をインストールしましたが、それだけではGitは使えません~。
ほとんどのGitサーバーでは、SSHの公開鍵認証を使用しています。

SourceTreeでは「秘密鍵」と「公開鍵」を簡単に生成することが出来ます。
以下手順です。

1、”Tools” > “Create or Import SSH Keys”を選択します。

2、PuTTY Key Generatorが開くので、”Generate”ボタンをクリックし、鍵を生成します。


“Generate”ボタンをクリックすると、鍵が生成されるはずなのですが…


なんだこれ…すっごい遅い…ウ ゴ カ ナ イ !
と思ってたら、乱数を作るためにマウスでこの辺りを


ぐるぐるぐる~ぐちゃぐちゃ~っっとやると、あっという間に終わります(笑)
最初はこれを知らずに、無駄に待ち続けました…。

3、”Save Private Key”をクリックし、秘密鍵を保存します。


私は”id_rsa.ppk”という名前で保存しました。
特に決まりはないそうですが、自分がわかりやすいものでいいと思います。

秘密鍵は、その名の通り自分以外には知られてはいけません。秘 密 で す (*_*)
人に見せたり、紛失したりしないよう管理しましょう。

4、”Save Public Key”をクリックし、公開鍵を保存します。


こちらも特に決まりはないので、”id_rsa.pub”という名前で保存しました。

コメントの記入やパスワードの設定を行いたい場合は
“Key comment”、”Key passhrase”に、それぞれ入力してください。


5、鍵を登録します。
“Tools” > “Launch SSH Agent(pageant)”を選択します。
先ほど保存した秘密鍵(“id_rsa.ppk”)を選択すると、鍵が登録されます。
(パスワードを設定した場合はパスワードの入力を求められます)

サクサクサクっと鍵の設定完了ですー(´∀`)

Facebooktwitterlinkedintumblrmail

VirtualBoxのスナップショットを使おう

開発をしていると、インストール後に有る程度の設定をした状態で色々と試して、駄目だったらその時の状態に戻したい事が有ります。
VirtualBoxで、割と簡単に出来るので使い方を。

保存しておきたい状態にした仮想マシンを一度シャットダウンします。

対象となる仮想マシンを選んで、VirtualBoxメニューにあるスナップショットをクリック。

スナップショットの状態が表示されます。

左上にあるカメラアイコンをクリックしてスナップショットを作成。

名前と説明へ、状態や内容を書いてOKボタンを押します。

今回は名前を変えなかったので、スナップショット 1と表示されています。

色々と試した後、マシンを終了してスナップショットから戻したい場所を右クリックして、スナップショットに復元を選びます。

これで起動すれば、スナップショットを撮った状態まで戻っています。

Facebooktwitterlinkedintumblrmail

SourceTree for Windowsをインストールしました!

SourceTree for Windowsがリリースされたのでインストールしてみましたー。

beta版の試用を申し込んだまま、作業に区切りがつくまでは…とか言ってズルズル放置してましたが
やっとインストールしました~(´∀`;)

GitGuiもGitHubもソースの一部が消失するなどのトラブルが続いたのでもうさよならバイバイ。
Git初心者な私にとっては、トラブルは避けたいところなのです(;´Д`)

ちなみにWindows7以上でないとインストールできないようです。
折角なのでインストールの一連の流れを、私のような初心者のために…。

SourceTree for Windowsをインストールするにあたり、とりあえずGitと名の付くものは
片っ端からアンインストール+削除しました。

さっぱりしたところで、SourceTree for Windowsのインストーラーをダウンロードします。

以下のページからダウンロードできます。
http://www.sourcetreeapp.com/

インストーラーを起動すると「Git本体はどうしますかー?」と聞かれます。

私は既に全部削除しちゃったので、一番上の
“Download an embedded version of Git for SourceTree alone to use”を選択しました。
既にインストールしている場合はスルーされるようです。

Git本体のインストールを行うとセットアップ画面が表示されます。

名前とアドレスを入力し、規約に同意できれば”I agree to the SourceTree license agreement”
にチェックを入れ、”Next”をクリックします。

AtlassianのBitbucket, Stashを使用している場合は、そのままアカウントのサインアップができます。

使用してなければ”Finish”をクリックし、インストール完了です!!

次回は「鍵」を作成します(´∀`)ふっふっふ。

Facebooktwitterlinkedintumblrmail

CentOS 6.3 に Kolab Groupware をインストール。

さてさて、ども初めまして。弊社のKolab翻訳担当です。
2013.03.11 よりスイスはチューリヒの Kolab Systems AG 社とパートナー提携いたしました。

そこで、今の所、英語ソースしかない、Kolab Groupware のインストールについて、
少しばかりインストールのコツなどをば…。

まず、Kolab Groupware の現行バージョンですが、3.0です。CentOS等のレッドハット系では、
el6、kernel 2.6.32 以降に対応しています。(自宅のCentOS 5.4 に入れようとしましたが、パッケージの依存関係等で入りませんでした。)

無料で利用できるのは、コミュニティ版である、Kolab-3.0-release-community です。

準備としましては…

KVNにて、作成してあるx86_64のREHL6 型の仮想マシンにCentOS 6.3をインストールしてあるものを利用しました。パーティションなどはデフォルトです。(こんな感じ…)

[root@kolab ~]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_kolab-lv_root
                      5.5G  2.1G  3.2G  40% /
tmpfs                 499M   20K  499M   1% /dev/shm
/dev/sda1             485M   32M  429M   7% /boot

CentOSは、最小構成(minimal)でインストールして、後から、”Base” “Development Tools” をyumでグループインストールしてます。

[root@kolab ~]# yum -y groupinstall "Base" "Development Tools"

次の準備は…

selinux: 無効化

iptables: tcp 25番、80番、110番、143番、389番、443番、465番、587番、636番、993番、995番 を開けます。

/etc/hosts に FQDN、ホスト名を追加。あと、ローカルIPでの名前解決の行を追加。
(DNS持っていて、ローカルIPでFQDNが参照できる場合はいらないです。)

[root@kolab ~]# diff -urw /etc/hosts.orig /etc/hosts
--- /etc/hosts.orig     2010-01-12 22:28:22.000000000 +0900
+++ /etc/hosts  2013-04-01 16:03:29.663819681 +0900
@@ -1,2 +1,3 @@
-127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
+127.0.0.1   kolab.lancard.com kolab localhost localhost.localdomain localhost4 localhost4.localdomain4
+xxx.xxx.xxx.xxx kolab.lancard.com kolab localhost localhost.localdomain localhost4 localhost4.localdomain4
 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

あと必要なものが、yum-plugin-priorities です。yumにてさくっとインストールしてください。

[root@kolab ~]# yum -y install yum-plugin-priorities

次に、yumリポジトリを追加します。

EPEL リポジトリ

[root@kolab ~]# wget "http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm"

Kolab-3.0-community-release リポジトリ

[root@kolab ~]# wget "http://mirror.kolabsys.com/pub/redhat/kolab-3.0/el6/development/i386/kolab-3.0-community-release-6-2.el6.kolab_3.0.noarch.rpm"
[root@kolab ~]# yum localinstall --nogpgcheck epel-release-6.8.noarch.rpm kolab-3.0-community-release-6-2.el6.kolab.3.0.noarck.rpm

リポジトリが追加されたら、リポジトリの設定を行います。リポジトリ設定の要点は、

CentOS-Base の[extras] を無効化、その他有効リポジトリの優先度を99に設定。
epel の有効リポジトリの優先度を99に設定。
その他Kolab関連(release、develop)のリポジトリの優先度を50に設定。(develop は後で追加し設定します。)

以上、3点です。

CentOS-Base.repo

[root@kolab yum.repos.d]# diff -urw CentOS-Base.repo.orig CentOS-Base.repo
--- CentOS-Base.repo.orig       2013-02-25 17:57:43.000000000 +0900
+++ CentOS-Base.repo    2013-03-29 11:22:09.810968496 +0900
@@ -16,6 +16,7 @@
 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+priority=99

 #released updates
 [updates]
@@ -24,6 +25,7 @@
 #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+priority=99

 #additional packages that may be useful
 [extras]
@@ -31,6 +33,7 @@
 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
 #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
 gpgcheck=1
+enabled=0
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

 #additional packages that extend functionality of existing packages

epel.repo

[root@kolab yum.repos.d]# diff -urw epel.repo.orig epel.repo
--- epel.repo.orig      2012-11-05 12:52:17.000000000 +0900
+++ epel.repo   2013-03-29 11:23:46.412942219 +0900
@@ -6,6 +6,7 @@
 enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
+priority=99

 [epel-debuginfo]
 name=Extra Packages for Enterprise Linux 6 - $basearch - Debug

kolab-3.0-release.repo

[root@kolab yum.repos.d]# diff -urw kolab-3.0-release.repo.orig kolab-3.0-release.repo
--- kolab-3.0-release.repo.orig 2012-08-04 21:58:22.000000000 +0900
+++ kolab-3.0-release.repo      2013-03-29 11:26:20.946866077 +0900
@@ -4,6 +4,7 @@
 enabled = 1
 gpgcheck = 0
 gpgkey = https://ssl.kolabsys.com/santiago.asc
+priority=50

 [kolab-3.0-debuginfo]

kolab-3.0-develop リポジトリの追加

[root@kolab ~]# yum -y install kolab-3.0-community-release-development

前述通り、上記リポジトリと同様に、優先度の設定。release と同じ50にします。

[root@kolab yum.repos.d]# diff -urw kolab-3.0-development.repo.orig kolab-3.0-development.repo
--- kolab-3.0-development.repo.orig     2012-08-04 21:58:22.000000000 +0900
+++ kolab-3.0-development.repo  2013-03-29 11:33:17.334674626 +0900
@@ -4,7 +4,7 @@
 enabled = 1
 gpgcheck = 0
 gpgkey = https://ssl.kolabsys.com/santiago.asc
-
+priority=50

 [kolab-3.0-development-debuginfo]
 name = Enterprise Linux 6 Kolab 3.0 Packages - Debugging Symbols

リポジトリの追加が終わりましたら。Kolab Groupware のインストールを行います。
全コンポーネントを簡単にインストールするには、さくっと一行打つだけです。お手軽です。

[root@kolab ~]# yum -y install kolab

インストールが無事完了したら、Kolabの設定を行います。こちらも簡単。

[root@kolab ~]# setup-kolab

と、セットアップ用のコマンドを打ち、あとは表示されるメッセージに従って、パスワード等を設定していけばOKです。

※※※ setup-kolab に失敗した!! ※※※

さてさて…ここまではすんなり進んでも…このsetup-kolab で引っ掛かる人がおそらくいるのではないでしょうか。
ええ…私も実は、引っかかったクチです (・w・;

私の場合は…「間違ったパスワードを設定してしまい思い出せなくなった。」「ホスト名、ドメイン名が変更になった。」
という事で、再度 setup-kolab を実行したら、エラーが発生して再設定が出来なくなった事です。

そういう時の対処方法です。

・まず、389 Directory Server のサービスを停止します。

[root@kolab ~]# service dirsrv stop

・次に、389 Directory Server の設定ファイル(slapd-ホスト名)を退避or削除します。

[root@kolab ~]# mv /etc/dirsrv/slapd-kolab/ /etc/dirsrv/bk_slapd-kolab

・MySQLのデータベースの削除
(もし…MySQLのrootパスワードがわからなくなってた場合は…MySQLの解説サイトで調べてください(-w-; )

[root@kolab ~]# mysql -u root -p
Enter password:

データベースの一覧を見て、kolab、roundcube というデータベースがある事を確認してください。
この2つのデータベースを削除します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kolab              |
| mysql              |
| roundcube          |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> use kolab;
mysql> drop database kolab;
mysql> use roundcube;
mysql> drop database roundcube;

これで、再度 setup-kolab が走るようになります。
ホスト名やドメイン名を変更して、setup-kolab を実行してみましょう。

※ちなみに…Kolab Groupware に登録していたユーザやグループ、各ユーザのメールやその他データなどは、
もちろん、吹っ飛んでしまいますので、あくまで、初期導入時にのみ使用できる方法です。

ではでは。

Facebooktwitterlinkedintumblrmail

IronPythonでもRequestsが使いたい

Requests: 人間のためのHTTP
http://ja.python-requests.org/en/latest/

Pythonの便利なHTTPライブラリ Requests を IronPython でも使いたいわけです。
こんなことを書いているということは素直には使えないわけです。

一応動作してるかな〜、というところまで行けたのでメモしときます。IronPython は 2.7.3 で、Requests は 1.1.0 です。

ポイントは2つ。

まず一つ目。

sys._getframe が必要なので ipy.exe (or ipy64.exe) に -X:Frames オプションを付けて起動する。

オプションはこんな感じで確認できます。

C:\Users\murave>ipy -help
Usage: ipy.exe Usage: ipy [options] [file.py|- [arguments]]
 <前略>
 -X:Frames                Enable basic sys._getframe support
 <後略>

2つ目。IronPython には idna エンコーディングがないので回避する。

requests の models.py で使用されているので取り敢えずコメントアウト。

idnaで検索すると290行目あたりで使用されてます。

#        try:
#            netloc = netloc.encode('idna').decode('utf-8')
#        except UnicodeError:
#            raise InvalidURL('URL has an invalid label.')

netloc = netloc.encode(‘utf-8’).decode(‘utf-8’) に書き換えてみたりもしたのですが馬鹿らしい気がするのでコメントアウトしました。
おそらくこの影響で「ドメインとURLの国際化」は未対応になってしまってますが、動かないよりはいいかと。

C:\Users\murave>ipy -X:Frames
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.18010 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import json
>>> r = requests.get('http://172.16.191.1:8001/api/v1_0/poll/')
>>> r.text
u'{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_cou
nt": 3}, "objects": [{"id": 1, "pub_date": "2013-03-05T13:51:15", "question": "W
hat\'s up?", "resource_uri": "/api/v1_0/poll/1/"}, {"id": 2, "pub_date": "2013-0
3-06T10:01:35", "question": "\u65e5\u672c\u8a9e\u30c6\u30b9\u30c8", "resource_ur
i": "/api/v1_0/poll/2/"}, {"id": 3, "pub_date": "2013-03-06T13:51:15", "question
": "\u3044\u3044\u3044", "resource_uri": "/api/v1_0/poll/3/"}]}'
>>> res = r.json()
>>> print res['objects'][1]['question']
日本語テスト
>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "どうかね?"}
>>> r = requests.post('http://172.16.191.1:8001/api/v1_0/poll/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r 

>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "putは?"}
>>> r = requests.put('http://172.16.191.1:8001/api/v1_0/poll/1/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r

>>> r = requests.delete('http://172.16.191.1:8001/api/v1_0/poll/1/')
>>> r

と、requests.get、requests.post、requests.put、requests.delete 動いているようです。

Facebooktwitterlinkedintumblrmail

EclipseからPhpStormに乗り換えました

しばらくPhpStormを仮運用していたのですが、ライセンスを購入してもらい、Eclipseから乗り換えました。

乗り換えた理由

Eclipseに比べてだいぶ軽い

これが一番の理由です。非常にお世話になったIDEで、Eclipseと戯れた時間は多かったです。ただし重い。何年経っても重い。チューニングしようが重いものは重い。この点、PhpStormは大変軽快です。ステップ実行しようが、ファイルの検索、置換、ジャンプ等の全ての操作が軽快です。こういうところを放置しておくと、生産性にじわじわ効いてくるので、今ここで乗り換えないと、だいぶ損する気がしました。

Eclipse(PDT)でできていたことは全部出来る

WEBアプリケーションの実行は当然、Coverage、XDebug、PHPUnitのなど、Eclipse(PDT)で出来ていたことは全て出来ます。

私の心境の変化

そもそもEclipseを使い続けていた理由は、言語によって開発環境を変えなくてもプラグインがあるから、Eclipseならほぼ対応できるという点でした。しかし最近はそれぞれに特化しているモノのほうが良いという考えに変わってきています。WEBアプリケーションよりもスマホネイティブアプリのほうが良い、マルチプラットフォームで動作するアプリよりも、ネイティブで書かれたMacアプリのほうが良い、と。だったらIDEもある言語に特化したものが良い。となったわけです。ちなみに矛盾しますがPhpStormはマルチプラットフォームで動きます。

インストール後

ここからはやった設定などの覚えがきです。

設定

  • Appearance > UI Options > Look and feelをDarculaに
  • Editor > Colors & Fonts > Schema nameをSolarized Darkに
    • https://github.com/braver/PhpStorm-Solarized
    • https://github.com/cweagans/PhpStorm-solarized
  • FontはやっぱりMonacoで
  • PHPのパス設定
  • XDebugするためのサーバ設定
  • KeymapをMac OS Xに(Command + Cとかでコピーできるよう)

よく使うであろうショートカット等

キー 内容
Ctrl + →← エディタータブの切り替え
Ctrl + ↑↓ 前 or 次のメソッドにジャンプ
Commnad + Shift + N ファイルを名前であいまい検索して開く
Command + D 現在行の複製
Command + Y 現在行の削除
Command + Shift + ↑↓ 選択行のコードを移動
Command + B キャレット位置にあるメソッドなどの定義にジャンプ
Command + Option + →← ジャンプした履歴を辿る
Command + Option + T 選択範囲をif,forなどで囲む
Command + Option + Shift + T 選択範囲をリファクタリング(名前変更、メソッド抽出など)
Command + J テンプレート(スニペット)呼び出し

あとがき

これで開発スピードが上がるので、もっと他のことに時間を割けそうです。

ちなみにPhpStormのライセンスは、PhpStorm良いなーとTwitterで呟いていたら、その翌朝には代表がライセンス買ってくれました。そんな会社ランカードコムをよろしくお願い致します。(とか宣伝ぽく)

 

Facebooktwitterlinkedintumblrmail

Eclipseでプロジェクトが表示されなくて翻弄される

Netbeansが好きなmuraveです。おはようございます。ご無沙汰しております。

Eclipseさん、苦手なのですが、強力なので使うことも多いです(DBモデリングでERMasterとか)。
今回は主にPythonの開発環境としてPyDevを使いたくて環境をつくりました。

最初、PyDevプラグインだけをいれて作業していたのですがHTMLエディターがなかったのでAptana Studio全部を入れたほうがいいなと(PyDevが入っていると依存性エラーがでてインストールできなかったので)PyDevをアンインストールしてからAptana Studioをインストールしました。

すると、作業していたプロジェクトが見えなくなりました。 ギャーー!

File > Import > Existing Projects into Workspace

で読み込もうとしても

「Some projects cannot be imported because they already exist in the workspace」

プロジェクトはあると言われててます。見えないのに。

いろいろと試しましたが結局昨日は解決できませんでした。

今朝、試しに別途新しいプロジェクトを作ったのですがそれも見えなくて「これはPyDevの問題か?」とJavaパースペクティブに切り替えたところプロジェクトが見える! 設定の問題? それとも壊れてる?

結論は Packege Explorer の Top Level Elements が Working Sets になっていたためでした。

Projectsに変更すると

表示されました。ほっ。

基本的なことなのでしょうが、絶望的な気分になりました。

Facebooktwitterlinkedintumblrmail

Objectve-Cでクラスのインスタンスメソッドを書き換える

つい最近までiOS用のコードを書いていたのですが、その中でとあるオープンソースのライブラリを使用しています。でその中のとあるインスタンスメソッドの処理を書き換える必要がありました。
カテゴリ使って書き換えようと思ったのですが、その処理自身がカテゴリで定義されていたため無理でした。

まあライセンスに問題なければソースを直接修正すれば良いのですが、ライブラリのアップデートとかに備えておきたいとこです。
そこでclass_replaceMethodを使って書き換える方法に落ち着きました。

//ExampleClassのexampleMethodを書き換える例

#import 

...

id class = [ExampleClass class];//クラス定義取得
SEL sel = @selector(exampleMethod);//セレクタ取得

void (^block)() = ^{
  //処理を書き換える
};

IMP imp = imp_implementationWithBlock(block);//BlocksからIMPを生成

Method method = class_getInstanceMethod(class, sel);//元のインスタンスメソッドを取得
char* types = method_getDescription(method)->types;//インスタンスメソッドの引数の型を取得
class_replaceMethod(class, sel, imp, types); //書き換え!

これをAppDelegateなんかで実行しておけばOKです。

Facebooktwitterlinkedintumblrmail

Androidアプリのメモリリークを調査する

Androidでメモリリークを調査することがあったので手順を記述します。

1.Eclipseをダウンロードします。
    そこから!?と思うかもしれませんが一応書いておきます。

    http://www.eclipse.org/downloads/

    ここからEclipse Classic 4.2.1をダウンロードします。

    (※http://developer.android.com/sdk/index.htmlここから、
    EclipseとSDKが一括のものがダウンロード出来ますが
    プラグインが上手く入らなかったのでこれは使いませんでした。)

2.ADTをインストールします。
    1)Help→Install New Software
    2)addボタンを押して、以下のように設定します。
    3)適当に必要なものをインストールします。

3.BIRTプラグインをインストールします。
    1)Help→Install New Software
    2)Work withで「Juno – http://download.eclipse.org/releases/juno」を選択します。
    3)BIRTEnginをチェックします。
    4)インストールします。

4.Memory Analyzerプラグインをインストールします。
    1)Help→Install New Software
    2)Work withで「Juno – http://download.eclipse.org/releases/juno」を選択します。
    3)Memory Analyzerをチェックします。(Generale Purpose Toolsの中にあります。)
    4)インストールします。

5.DDMSのPerspectiveを開きます。
    1)対象のプロセスを選択して、「Dump HPROF file」を押します。
    2)表示されたダイアログで「Leak Suspects Report」をチェックし、「Finish」を押します。

メモリリークの詳細が表示されます。

Facebooktwitterlinkedintumblrmail

NSDictionaryのdictionaryWithObjectsAndKeysが辛い

iOS開発をやっていて、NSDictionaryでよく使うdictionaryWithObjectsAndKeys、NSArrayのarrayWithObjectsですが、下記のように入れ子になってくると何のこっちゃ分からなくなります。

NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"Taichiro", @"firstname",
                             @"Yoshida", @"lastname",
                             [NSArray arrayWithObjects:
                              [NSDictionary dictionaryWithObjectsAndKeys:
                               @"twitter", @"type",
                               @"dataich", @"id",
                               nil
                               ],
                              [NSDictionary dictionaryWithObjectsAndKeys:
                               @"facebook", @"type",
                               @"dataich", @"id",
                               nil
                               ],
                              nil],
                             @"accounts",
                             nil
                             ];

NSLogで出力した結果を見ると、下記のようなシンプルな内容なのですが。

{
    accounts =     (
                {
            id = dataich;
            type = twitter;
        },
                {
            id = dataich;
            type = facebook;
        }
    );
    firstname = Taichiro;
    lastname = Yoshida;
}

これをもう少し簡単にかける方法があります。
dictionaryWithObjectsAndKeysには @{}
arrayWithObjectsには @[]
というリテラル?が用意されてます。
これを使って書き直すと下記のようになります。

NSDictionary *dictionary2 = @{
                              @"firstname" : @"Taichiro",
                              @"lastname"  : @"Yoshida",
                              @"accounts"  : @[
                                                @{
                                                    @"type" : @"twitter",
                                                    @"id"   : @"dataich"
                                                },
                                                @{
                                                    @"type" : @"facebook",
                                                    @"id"   : @"dataich"
                                                }
                                             ]
                              };

ちょっとは見やすくなりますね!

Facebooktwitterlinkedintumblrmail