書き置き。

ほぼ勉強の記録みたいなもんです。

家のiTunesに同期されているiPhone/iPadに会社のMacからアプリを入れる簡単な方法

iOSのアプリがAppStoreに掲載手続きをしてからユーザーが検索して見つけられるようになるまで、データの伝搬に数時間かかるようで、昨日もこれで引っかかってしまった。

公式サイトからiTunesを開くとアプリが見つかったのでMacでダウンロード。 iTunesで同期しようと思ったら、インストールしたいiPadは自宅のiMaciTunesと同期されているのだった。 今手元にあるアプリを1つインストールしたいだけなのに、同期設定は変えたくない。

それ、できるよ! Macならね!

普段、スマートフォンアプリの開発に携わっているので頻繁にお世話になっているXcodeのOrganizer。 いつもは自分らで作ったアプリをインストールするのにしか使っていなかった。

f:id:makies:20140128100100p:plain

iPhone/iPadMacに繋いで Xcode.app を起動したら [Window]-[Organizer] を開く。

[ホーム]-[ミュージック]-[iTunes]-[iTunes Media]-[Mobile Applicaitons]
ここに アプリ名.ipa といったファイルがある。

Organizerの左側に繋いだ端末のリストが現れるので、端末名のあたりに、アプリのファイルをよっこらせっ、とドラッグ&ドロップしてやるだけ。

簡単ね☆

【追記】

その後 Twitter 経由で教えていただいた情報によると、Organizer 経由でアプリをインストール出来ない場合もあり、その方の場合は、iPhone 構成ユーティリティからインストールすることができたそうだ。

旧ブログのお引っ越し

我が家にあるもう7年モノのサーバー、最近しょっちゅうストライキを起こしてネットワーク管理者に再起動してもらわなければならない状況になっていた。

昔はこのサーバーで開発もしていたし、ちょっと使ってみたいアプリを入れてみたりするにも全て公開してるサーバーに直接インストールしちゃっていたのでだいぶゴミも溜まっている。 (最近だと開発中のものはすべて VirtualBoxVagrantVM を立てて開発しているので、そういうことはしなくなったな。)

MySQLが5.1系を使い続けていてそろそろバージョンアップ等の対応をしないといけないと思っていた。

というもろもろの事情があり、ようやく重い腰を上げて今もなお必要なサイトの引っ越しを始めた。

引越し先は1年位前に作ってもらったUbuntuサーバー。一度OSは上げたはずだけど、それでも13.04だったので13.10に上げた。

ssh越しに作業してて警告が出るも、ネットワーク管理者はスポーツジムに行ってしまって不在。先に移動したサイトはHTMLのみの静的コンテンツしかなかったから最悪ダメに成ってもダメージは少ないということで、OSアップグレード決行。

Ubuntu

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 13.10
Release:        13.10
Codename:       saucy

PHP

before

$ php -v
PHP 5.3.3-7+squeeze8 with Suhosin-Patch (cli) (built: Feb 10 2012 14:12:26)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with the ionCube PHP Loader v4.0.9, Copyright (c) 2002-2011, by ionCube Ltd.
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

after

$ php -v
PHP 5.5.3-1ubuntu2.1 (cli) (built: Dec 12 2013 04:24:35)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
  with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies
  with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans  

Database

before

$ mysql -V
mysql  Ver 14.14 Distrib 5.1.61, for debian-linux-gnu (i486) using readline 6.1

after

$ mysql --version
mysql  Ver 15.1 Distrib 10.0.7-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1

MySQLだけど、MariaDBにしてみた。

Installing MariaDB .deb Files

Apache

Apacheも2.4にバージョンアップ

Apache.conf の vhost を include するところの記述が変わっていて、 .conf の拡張子になっていないと読み込まない、というところでハマった。

IncludeOptional sites-enabled/*.conf

さらに2.4から追加された設定の、 Require all denied の設定が効いていてサイトにアクセスすると403になったのもハマった。
ネットワーク管理者に対応してもらった)

<Directory />
        Options FollowSymLinks
        AllowOverride None
       Require all denied
</Directory>

WordPress

WordPress本体のバージョンを最新に更新。 プラグインも更新があるものは全部更新。

特に問題なさそう。

DNS変更

先に家庭内用の設定だけ変更してブログの動作確認した。

久しぶりの更新、ついでだからもうサイトを消してしまったサブドメインをお掃除しておいた。

リバースプロキシ

ここは自分には手がでないところなので、
ネットワーク管理者に設定変更依頼。

Spika-Server がMySQL対応したので動かしてみた

昼に書いた記事に追記しようと思ったら、長くなりすぎたので別記事にした。

developブランチ

MySQL対応版はdevelopブランチで行われているそうなので、developブランチを checkout してくる。

$ git checkout -b develop origin/develop

vm再構築

vmは使い回しでも良かったんだけど、残したいデータもないので一旦破棄して作りなおした。

$ vagrant destroy
$ vagrant up
$ vagrant provision

いきなりのエラー

Class 'Doctrine\DBAL\Configuration' not found

いきなりこのエラーで動かない。

$ cd /vagrant_data
$ php composer.phar install

もちろん実行した。

composer.jsonでは Doctrine/dbal の記述があるものの、vendorディレクトリを開いてみてもDoctrineのディレクトリが見当たらない。もしやと思って composer update をしてみると、無事インストールされてインストーラー画面にアクセスすることができた。
おそらく、 composer.lock ファイルのコミット漏れではないかと思う。

$ cd /vagrant_data
$ php composer.phar update

インストーラー起動

DB設定を入力する画面

  • ホスト名
  • データベース名
  • ユーザ名
  • パスワード

よくあるDBの接続設定入力欄だ。 事前に vmsshしてMySQLにはデータベースを作成しておいた。

同梱されているVagrantfileを使って作ったVMを使うと、MySQLのrootパスワードが設定されていない。そのままパスワードなしでsubmitすると入力チェックで弾かれてしまって進めなかった。

mysql> SET PASSWORD FOR root@localhost=PASSWORD('パスワード');

※rootユーザーを使うべきではないとは思いつつも、動作確認用のvmなのでそこは目をつぶることにした。

インストーラーが最後まで行かない

左サイドに表示された Installation Steps

  • Input information to connect database.
  • Create database schema.
  • Create initial data.
  • Finish.

3つ目の「Create initial data.」で 【Create Initial Data】ボタンを押しても、特にエラーが出るわけでもなく同じページに戻ってきてしまって、Finishに辿りつけなかった。ソースコードを要確認。

アプリからアクセス

iOS版の最新をpullしてきた。
前回の設定が残っているので サーバー側URLの設定等は省略。

iOSシミュレータのアプリ内からユーザを新規登録、そのユーザーでログインするところまでできた。

まだ一般ユーザーが1人(自分自身)しかいないので、フレンドになったり、メッセージのやりとりするところまではできていない。
次回はそのあたりを動かしてみたい。

Spika の MySQL 対応を見てみた

Spika-Server の MySQL対応が終わったということなのでコードを見てみた。

cloverstudio/Spika-Server at develop

MySQL対応 の関連処理

  • init.php
    • MySQLの接続設定をdefineしている
    • クラウドに置くことを想定してか、$_ENV に設定があればそれが使われるようになっている
  • src/Spika/Db/MySql.php
  • 【追記】DB接続まわりは Doctrine/dbal が使われている。
    • 一部のメソッド createUseraddContact等で SQLではなく配列を渡してINSERT文を発行している。

雑感

DB関連

  • お仕事や個人プロジェクトでも、DBを使うときはORMやクエリビルダ的なものを使うことが多かったので、SQL文を直書きしているのが(自分にとっては)斬新だった。
    • それが悪いという意味ではなく、SQLでぱっと見何をしたいメソッドなのかわかりやすかったので、これはこれで良いと思う。
  • DBアクセスを1ファイルに集約
    • 今後ファイルが肥大化して管理が大変そう。
    • 見通しも悪くなってしまう。

その他

  • クラスやメソッドのコメントが殆ど無い
    • 特に個人プロジェクトで、集中して一気に作っているとやってしまいがち。
    • とはいえ数カ月後の自分にグーパンチされないためにも、(オープンソースで公開するならなおさら)コメントはできるだけ書いたほうが良いと思う
  • インデントがバラバラ クラス毎、メソッド毎というわけでもなく、1行の中でタブとスペースのインデントが混在しているのは、統一したほうが良い
  • PHPUnitのインストールが重複
  • composer を使ってインストールするのであれば、Vagrantfile に書かれたセットアップ用シェルスクリプトに書かれている pear でのインストール処理は無くても良さそう
  • インストーラー画面ができてる、イイネ!

初期のサーバー側ソースコードが酷くて話題になってたプロジェクトだけど、その後のフレームワーク導入やMySQL対応、インストーラー作成など、対応早い。この調子で頑張って欲しい。手伝えるとこあったらPR送るかも。

昨日、布団の中で見つけてgithub上でソースコードを眺めながら寝落ち、今会社でお昼休みに書いてるのでまだ動かしてみてない。今晩時間が取れたら動かしてみよう。

[メモ]

Spika 作者の @cloverstudio1 さんにこのブログが見つかってツイートされてた。大したこと書いてないのに申し訳ない、、、、。

Marionette.js のチュートリアル ふたたび

前回ひと通り写経し終わって、消化不足感があったので、もう一度yomenでappをgenerateするところからやり直してみた。

サーバー側ソースの1箇所対応漏れが原因でtitleが保存されてない問題があったので、今回はサーバー側コードは前回のを使い回し。

require.js の読み込み指定が抜けてて前回ハマったのは、少しカンを取り戻してなんとかはまらず切り抜けた。

今回ハマったのが一箇所 、view を new するところでクラス名が間違っていた。
意図しないところで意図しない引数で呼ばれたviewクラスがその後の処理でエラーになっていて、原因を突き止めるのに時間がかかってしまった。

全体の雰囲気は掴めてきたような気がする。
次はこれにもうちょっと機能追加したくらいのものを自力で作ってみようかな。

Marionette.js のチュートリアル その3 終了

ようやく3部作の最後まで写経終了した。

同じようにやってるはずなのになんだかうまく行かなかった原因は、サーバー側のコードが1行間違っていて、titleを送ってもmongoDBに保存されていなかったので画面表示も出ないのだった。validateもかかってないからtitleナシの_idと finished だけのデータが多数登録されてしまっていた。

先週末の#hokkathonを間に挟んだ関係でちょっと時間が開いてしまったのもあって、最後のほう、RouterやControllerが出てきたあたりが駆け足で消化しきれていない感じ。処理の流れが掴みきれていない。

サーバー側はともかく(自分が作るならPHPでやるので)、クライアント部分はもう一度通しでおさらいしたほうが良い気がするな。

HOKKAIDO アイデアソン&ハッカソン2014 に参加してきた ハッカソン編 #hokkathon

「HOKKAIDOアイデアソン&ハッカソン2014セミナー」の開催について|経済産業省北海道経済産業局

HOKKAIDO アイデアソン&ハッカソン2014 - (株)北海道ソフトウェア技術開発機構

前回に引き続き、ハッカソン

昨年は1日目にアイディアソン、2週あけて2日目にハッカソンで2日目の最後に発表会、という構成だった。

今年も1日目と2日目の間に2週間あるのは変わらないが、
1日目に 1st demo & 2nd demo
2日目にも 3rd demo & 4th demoで終了
という4回もdemoを行う構成となっている。

アイディアソンでたくさんアイディアの種を出したあとにその場でチーム編成をした去年に対し、
今年は参加応募時点でチーム単位での申し込みになっていた。(個人でも申し込み可能 という前提条件。

去年は事前に誰が参加するのかもよくわからず参加して、その場でチームを組んだところ、プログラマ2人だったのでずーっと”デザイナーが欲しい” と繰り返し言ってた。

その反省を活かして今年はプログラマではない方を誘ってチームを組んで参加した。

ハッカソンのテーマが "1クリック(タップ)以内で勝ちを生み出すもの" と事前に発表されていて、1周間ちょっと悩んで悶ていた。 でもハッカソン当日アイディア出しをしていたらをしていたら、ほんの十数分で作るものが決まった。

このくらいのペースで作るものを決めて作り始めないと、1st demoまで時間がない。 画面イメージを書きながら考えていると1クリックじゃなくて写真もつけたいからもう1クリックしたい・・・ と訴えたりもした。

お昼ごはんを食べながら、連携するアプリを使ってみたり画面イメージを話合ううちに、前日のセミナーで聞いたコアの部分を小さく作り始めるという話を思い出し方針転換。それまで1クリックでやろうと思っていた部分は既存アプリに任せて、余力があったらこれもみれるようにしたい といっていた、大量に蓄積されているデータの中でほしい部分だけ見るアプリ に特化することにした。

前回のように1年たっても作り終えられないのだけは避けたくて、機能を半分以下に減らしたけど、冷静に自分のチカラを考えると2日間でできるのはこれでも多いかもしれない、と思えたのだった。

早いうちにスモールスタートのコア部分を見つけられたので、1st demo ではまず画面イメージを作るところに注力した。
パートナーにメインの画像を作ってもらいながら、自分は使えそうなjavascriptのライブラリを調査。

時間ギリギリではあったけど、1st demo までにHTMLで画面イメージを作り終え、これから2日間で作るプロダクトのコア部分をプレゼンすることができた。

無事 1st demo が終わったところで、次の 2nd demo の目標をどこに定めようか、と考えた。 ほぼ完成形の画面イメージをすでに出してしまったので、もうあとは実装を始めるしか無いと思って調査を少し進めていた。

途中、最終的にはスマートフォンアプリにして世に送り出したい(少なともパートナーとその他知り合い数人には喜んで付かてもらえるアテがついていた)ので、HTMLで作っていたものスマートフォンアプリにすることを考えた。
そこで以前少し調査していて機会があれば使ってみたいと思っていた PhoneGap を思い出した。数カ月ぶりだったので情報の探し方に苦労しつつも 2nd demo の十数分まえにビルド成功。 2nd demo では PhoneGap の説明少々と 1st demo でプレゼンした画面を シミュレーター上で動くアプリの形になったものをプレゼンすることができた。

最初は無理のように思えた2回のdemoだったけれど、終わってみると時間が決められたこのdemoのお陰で、次までの目標が明確にしないと発表できるものがないというケツに火を付けられた状態で力を発揮出来たように思う。少なくとも切羽詰まらないとやる気がでないタイプの自分にはこれが合っていた。

この先は、自分でもあまりやったことのない jsでOAuth認証という一つ大きなハードルが残っているので、次回のハッカソンまでには乗り越えて挑もう。