リーズナブルでクオリティの高いデザインをクラウドソーシングで。
mowe, inc.のメンバーはCEO と自分の2名なので、サービスやプロダクトの制作ではデザインをいつもアウトソースしています。
知り合いのデザイナーさんや、知り合いの知り合いなど、周りの方にお願いすることが多いのですが、日程の調整や、デザインのテイストで適当な方が見つからないこともあります。
そんな時はここ数年で定着しつつある、クラウドソーシングを利用したりしています。
最近、日本、オーストラリアの2つのクラウドソーシングサービスを利用したので、両者の特徴や「ほんとうに使えるの?」といったところをご紹介します。
1. LancersとFreelancer.com
利用したサービスは日本のアウトソーシングサービス Lancersと、世界各国のデザイナーや開発者が集まるFreelancer.comです。
まずはこの2つのサービスについて簡単にご紹介します。
Lancers (ランサーズ)
- http://lancers.jp
- 2008年12月よりサービス開始
- 登録人数 : 約75,000人
- 仕事実績 : 約46,000件
- プロジェクト式、コンペ式の他、単純な作業を依頼するタスク式がある
つい先日、運営会社名がサービス名と同じ「ランサーズ株式会社」に変更となっているところなど、サービスの好調さを伺わせます。
Freelancer.com
- https://freelancer.com
- 2004年2月よりサービス開始
- オーストラリアの会社が運営
- 登録人数 : 約3,500,000人
- 仕事実績 : 約1,600,000件
- 世界234カ国のユーザーが登録
さすがにワールドワイドに展開しているだけあって、数字上はLancersとは桁が違います。
2. 仕事の依頼の方法と決済
どちらのサービスも登録すると、「仕事を依頼する」「仕事を探す」と2つのモードがあります。
仕事を依頼する主な方法として、「コンペ式」「プロジェクト式」の2つの方法があり、「コンペ式」では依頼者の指定した金額でロゴやWebデザインカンプなどの提案をしてもらい、そのうち1つを最終的にえらんで、細かい修正をしたあと、納品となります。
一週間ほど募集すると、20件くらいは応募が来ます。以前、Freelancer.com で10日間ほどロゴデザインを募集したところ、100件以上の提案がありました。
「プロジェクト式」では依頼主は仕事内容や条件を提示します。仕事の内容から予算や納期と提案者のポートフォリオを提案してもらい、依頼主は提案の中から条件にあった人にその仕事を依頼することになります。
仕事を依頼する時の料金の決済方法は、料金の決まり方により異なります。
コンペ式の場合、依頼者は先に料金をカードで決済します。決済した料金はサービス内で保留にされ、最終的に選択した提案の方に納品後に支払われることになります。
プロジェクト式の場合、提案者によっては納品前に一部、または全部の料金の支払を要求してくることがあります。その場合、その提案者を選択した時点で半分が提案者に支払われ、納品後に残りの半分が支払われる。といったことになります。
依頼者が支払った料金の10%がサービス事業者に入り、残りの90%が提案者の手元にはいることになります。
3. 今回の案件
今回はそれぞれのサービスで異なる内容で、異なる方法で依頼してみることにしました。
ホームページの作成
日本語のホームページ作成のため、Lancersで依頼しました。また、デザインカンプの作成を「プロジェクト式」で依頼し、HTMLコーディングを「プロジェクト式」で依頼しました。
ホームページのデザイン
- 37,500円に設定
- 5日ほどで20件くらい提案があった
- 1番良いと感じた1名のデザイナーさんに細かい修正を依頼し、3日ほどで修正完了した
- 3-4回、修正をお願いしたが対応はとても良かった
デザインしたホームページのコーディング
- HTML5/CSS3を使い、HTML/CSS完全分離、基本的なSEOなど、一応しっかり要求してみた
- 最高が70,000円最低が125,500円くらい
- ポートフォリオ、納期を確認して、32,500円でお願いした
- 非常に綺麗にコーディングしてもらうことができ、修正にも柔軟に対応してもらえた。
iPhoneアプリのデザイン作成
メイン4画面をもつiPhoneアプリのデザインをプロジェクト式で依頼しました。
- 5日間くらいで20件の提案があった。
- 平均$480くらい
- 最低は$125、最高は$700
- 選択した基準は
- ポートフォリオをみて
- だいたい真ん中くらいの値段の人
- ちょっと不安だったので、決済が先払いじゃない方
- 結果、選択したのはルーマニアの方。その他、アメリカ、インドや、よく知らない国旗の人もいた
- だいたい10回ちょっとのやり取りの末、10日間で4画面のデザインが完成
- 英語のやり取りは終始友好的で、細かい依頼も含め、しやすかった。
4. まとめ
今回、2つのサービスで3つの依頼をして見た感想としては以下の感じでした。
クオリティ
自分自身、とてもセンスが高いとかではないのですが、今回の制作物は満足の行くものでした
- どちらのサービスもクオリティの高い制作物が期待できる
- 提案の中には割りとクオリティの低いものもあり、ある程度は選択する目が必要
- 制作物のクオリティだけではなく、提案者の対応も非常に良い
使い方
「コンペ式」「プロジェクト式」の2つの方法を使ってみて、この使い分けはとても重要だと感じました。
- 「コンペ式」は実際の制作物を確認、比較することができるので、有効に使いたい
- 特に比較についてはそれほどセンスが良くない自分としては助かった
- 逆に、「プロジェクト式」で提案者が送ってくるポートフォリオを確認しても、ある程度以上のレベルの人を判断するのは難しい
- 全10ページのWebサイトのデザインが必要でも、まず、1-2ページのみコンペしたほうがいい
- コンペ+プロジェクトで作業してもらうと数ページのホームページでも2-3週間は見ておくと良い
- 実際に会って話すわけではないので、ホームページのデザインを初めて依頼するといった場合はイメージの伝え方など難しいかもしれない
- Freelancer.comは英語でのやり取りになるため、ある程度英語でのコミュニケーション力が必要
料金
- どちらのサービスも一般的な日本の会社に依頼するよりはリーズナブル
- Freelancer.comの方がLancersよりも数割リーズナブル
どの提案も、実際にあって話すことができなかったため、細かい修正やイメージの伝達で工夫したところはありましたが、自分が割いた時間は会って話すより少なかったです。
また、今回依頼した方はとてもいい方だったので、今後も機会があれば依頼できればなという感じでした。
iPhoneアプリ開発 (23日目)
今日も細かい修正、ただ、「修正できないのでは。。」と思う箇所がでてきて、半日ほど費やしてます。
デザインは随分完成に近づいているので、そろそろプログラムの方もバグを修正してデザインのみという状態に持って行きたいところです。
- イベントの削除を実装
- 設定画面の入力方法を修正
- TableViewとトップ画面が重なる問題の修正
イベントの削除を実装
今更ながら、イベントの削除機能がないことに気がついたので、実装しました。
なぜ今まで気が付かなかったかというと、お手本にしているサービスには削除機能がなかったせいでした。削除機能を付けないという選択肢もありましたが、今回のサービスは自分の意図しないイベントが残っていることは好ましくないため、つけることにしました。
実装自体は簡単でイベント詳細画面にボタンをつけて、ボタンを押したら、確認ダイアログ、そのあと、削除を実行して、もとのTableViewに戻る。という形です。
設定画面の入力方法を修正
最初に作った設定画面ですが、自分の知識の向上とともにデザインに合わせる意図で入力方法の修正をしました。
各項目はUITextFieldを使って表示し、項目のタップで変更が出来るようにしていましたが、編集用のアイコンを別に設置し、項目をタップできないようにしました。
また、編集ボタンタップ時に表示するDatePickerやキーボードをアニメーションするようにして、表示をスムーズにしました。
TableViewとトップ画面が重なる問題の修正
イベント一覧を表示するTableViewの上にお気に入りの写真が表示されるようにしたのですが、イベント詳細画面から戻ってきたときにTableViewと写真がかぶったり、間が開いたりすることがあることがわかりました。
UITableViewのなかにUIImageVIewを入れて表示しているため、UITableViewのframeを操作して修正するといったことはできなさそうです。
メイン画面からTableView画面への遷移では同じ現象が発生しないので、画面のリフレッシュ方法がイベント詳細画面からの遷移とでは異なるのかと思い、調べましたが、不明のまま今日は終了しました。
今日参考にしたページ
- UIViewController Class Reference
- View Controller Programming Guide for iOS: The View Controller Life Cycle
- iphone - UIViewController. viewDidLoad vs. viewWillAppear: What is the proper division of labor? - Stack Overflow
- C開発者によるiPhoneプログラミング: UIViewの追加・削除
- UITableViewを再描画する方法 « iPhoneアプリ練習帳
- UITableView Class Reference
iPhoneアプリ開発 (22日目)
今日も細かい調整とバグ修正です。
- イベント詳細画面の編集モードの修正
- TableViewのスライダーの位置修正
イベント詳細画面の編集モードの修正
イベント詳細画面にはTextField, TextView, DatePickerと3つの編集があります。これらの編集をする際にキーボードやDatePickerのサイズによって、画面の表示位置を補正するようにしました。
キーボードを日本語、英語と切り替えるとキーボードの高さが変わるため、切替時にも表示位置の補正をしなければいけません。
地味すぎる作業で、これが2012年のソフトウェア開発かと疑ってしまいました。
TextViewのプロパティで3種類の入力遷移/入力解除遷移のアニメーションが選べるくらい簡単にしておいてもらいたいものですね。
TableViewのスライダーの位置修正
トップ画像が横長の場合、スライダーの表示位置がずれるという問題が見つかったため修正しました。
こちらも地味な話で、トップ画像のサイズからスライダーを表示する位置を計算して、スライダーの表示位置を補正するようにしました。
今日参考にしたページ
- https://developer.apple.com/jp/devcenter/ios/library/documentation/UIScrollView_pg.pdf
- IPhoneアプリ開発 - 文具堂 Wiki三昧
- 画面いっぱいのUITextViewがキーボードに隠れないようにする « LANCARD.LAB|ランカードコムのスタッフブログ
- UITextView をキーボードと連携させる « runLoop run];
- iOS5でのUITextFieldやUITextViewでのキーボード処理(UIKeyboardWillShowNotification)の注意点と対策 - k2ダイアリー
- はっそうし UITextViewがキーボードの下に隠れないために
- iOS5でキーボード表示時にViewがずれる問題の対処法: iPhoneアプリ開発備忘録
- アプリ開発(13) UIView & UIImageViewでAnimation!:iPad/iPhoneアプリ開発:So-netブログ
- 現在のFirstResponderを取得する | iPhone開発ブログ
- iphone - KeyboardWillShow with UITextView - Stack Overflow
- iphone - How to pass a NSString object to stringByAppendingFormat: - Stack Overflow
iPhoneアプリ開発 (21日目)
今日は午前中にテストをして、いくつかのバグが見つかったため、修正をしています。
今日やったこと
- 結合テスト
- [バグ修正] 写真サイズが正しく表示されいない場合がある
- [バグ修正] TableViewの内容をフィルタした時にそこから遷移する詳細が正しくない
- イベント詳細画面にScrollViewを実装
結合テスト
実装が終了した機能の結合テストをしました。この段階でテストした目的はデザインを当てればいつでもリリース出来る状態にしておいて、残った時間でできるだけ追加実装していくことにしたためです。
いくつか確認できたバグはバグ管理システムに登録して、順次修正していくことにします。
[バグ修正] 写真サイズが正しく表示されいない場合がある
写真の横幅はiPhoneの画面サイズで決まるため、アップされた写真の縦横比により、伸びたり縮んだ写真が表示される箇所があったため修正
[バグ修正] TableViewの内容をフィルタした時にそこから遷移する詳細が正しくない
TableViewを写真のみ表示にした時に表示されているTableViewCellとViewControllerが持っているデータセットにずれが生じてしまっていることがわかりました。
フィルタ表示の際、データセットも更新するように修正
イベント詳細画面にScrollViewを実装
イベント詳細画面で写真サイズの表示を修正したところ、すべての要素が表示できない状況が発生することがわかりました。
具体的には縦長の写真をアップした時に、画面内に写真が収まらず、写真下に表示されるべきキャプションや登録日時が画面外に押し出されます。
イベント詳細画面にScrollViewを追加し、解決しようとしていますが、更新時の表示など、根本的な修正が必要なようで、明日に持ち越し。
今日参考にしたページ
iPhoneアプリ開発 (20日目)
今日は招待機能を実装をしました。デザインの方も徐々にできてきているので、デザイナーの方とのやり取りも増えてきました。
今日やったこと
- 招待メール送信画面の実装
- 招待メール送信送信後、上限写真数の更新
- アプリ名の決定
招待メール送信画面の実装
招待メールの送信は MessageUIを使って実装していっていますが、招待メールをどこに送ったかを収集しておかないと、同じ人に何度も送ることで、写真数の上限がどんどんアップされてしまいます。
MessageUIのインターフェイスは送信の準備までが主な任務らしく、送信された時の情報を取得するスマートな方法がないのですが、UIViewを地味に探していくことで送信先を取得するというコードがネットで公開されていたので参考にしました。
ただしこの情報も送信された時に表示されている情報ということで、表示が短縮されていた場合、正しいアドレスが取得できないなど、結構穴がありましたが、厳密なチェックを必要としているわけではないので、スルーしました。
招待メール送信送信後、上限写真数の更新
招待メールを送信したときに、送信先アドレスを確認し、未送信の送信先の場合、上限写真数をカウントアップします。
招待メールをModalで開くポイントが設定画面から「招待する」を選んだ時と、上限以上に写真をアップしようとした時に表示されるアラート画面と2ヶ所あるため、これらのコードを1つのクラスにまとめておきました。
アプリ名の決定
アプリの名称は購入時に表示されるものや、ホーム画面に表示されるものなどあるようですが、やっぱり購入時に表示されるものが重要ですね。
アプリ完成後、リリースの直前に決定しようと思っていましたが、デザイナーの方から決めてもらったほうがやりやすいというご意見があったため、決めることにしました。
文字数など配慮しながら決めました。
今日参考にしたページ
- iPhoneアプリ開発: アプリの名前に関する設定項目まとめ | 情熱とスキルと市場
- [iPhone] アプリ名をローカライズする方法 | Sun Limited Mt.
- 【ネーミング】名前を決める時に気を付けたいこと « ジェネシックスブログ
- iOSな日々: iOSアプリ開発者への道(13):iOSアプリ名について
- 目指せ!iPhoneアプリ開発エキスパート:第10回 App Storeでアプリを公開|gihyo.jp … 技術評論社
- Office L: ホーム画面のアプリ名を決める
- iPhoneのホーム画面に表示されるアプリ名の変更方法|WinPod! -iPhoneの脱獄情報紹介
- UIAlertView Class Reference
- いろいろな UIAlertView | アカベコマイリ
- objective c - Core-Data iPhone: could not locate an NSManagedObjectModel - Stack Overflow
iPhoneアプリ開発 (19日目)
iPhoneアプリ開発19日目はまたはまり気味です。
今日やったこと
- 招待メール送信画面の実装(未完成)
そうです。ほぼ進んでいません。
招待メール送信画面の実装(未完成)
招待メール送信をするためにアプリ内でメールをたちあげて送信できるようにしました。
メールを送信することで、アプリ内で写真を利用できる回数が変わってくるので、メール送信先が重複しないようにアプリ内に保存したいのですが、メールの送信先を取得する方法がありません。。
そんな訳で、試行錯誤しているうちに終了となりました。。
今日参考にしたページ
- Blog | saryou.jp
- アプリ内にメール機能を追加する | コノルブログ
- mikamiz|MFMailComposeViewControllerでメールを送信する
- 艶やかな雨: MFMailComposeViewController で送信されたアドレスを取得する方法
- iLessons iLearned: Easy Way to Debug UIView Hierarchy
- ARC環境下で非公開APIを実行する | Prototype
- ビュー (UIView) の階層構造をダンプする非公開の便利メソッド - 24/7 twenty-four seven
- Technical Note TN2239: Technical Note TN2239
- iLessons iLearned: How to Find MFMailComposeViewController Email Addresses
iPhoneアプリ開発 (18日目)
iPhoneアプリ開発18日目はデザインの方とのやり取りが増えてきました。
これから本格的にデザインをお願いして、アプリに実装していくことになります。
今日やったこと
- 利用規約画面の追加
- 招待機能の追加 - 1日にアップする写真数の上限を追加
- 招待機能の追加 - 写真アップ時に写真数の上限をチェック
- 招待機能の追加 - 招待画面の追加
利用規約画面の追加
利用規約画面の追加はStoryboardで画面を追加して、画面遷移を追加するだけです。
Modalで実装しました。
規約の表示をi18nする方法が気になるところですが、今回はスルーでその部分はまとめて作業することにします。
招待機能の追加 - 1日にアップする写真数の上限を追加
ユーザープロフィールに1日にアップする写真数を追加しました。
この数字を写真アップ時に確認し、上限を超えたら、その日はアップできないようにします。
次に実装する友達招待をすると、この上限をカウントアップして、写真を沢山アップできるようにしていきます。
招待機能の追加 - 写真アップ時に写真数の上限をチェック
写真アップ前に上限値をチェックして、上限を超える場合はAlertを表示することにしました。
その日にアップされた写真の数をCoreDataから取得する条件は
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"createdAt > %@", today];
[request setPredicate:predicate];
のようになりますが、このとき、today はNSDateなんですね。”2012-05-07” のような文字列を渡した場合、エラーになりました。
招待機能の追加 - 招待画面の追加
招待画面はメール送信画面として実装しますが、この作業の途中で今日は終了でした。
今日参考にしたページ
- 【iPhoneアプリ開発ドリル】テーブルとナビゲーションを理解する(2)|テン*シー*シー
- UITableViewの使い方その2:編集モード編
- UITableViewの使い方その1:基本編
- iphone - How to print or log the value of CGSize object? - Stack Overflow
- objective-cのintとStringの変換 - Life is Really Short, Have Your Life!!
- UIAlertView - iPhoneアプリ開発の虎の巻
- NSDate Class Reference
- NSPredicate Class Reference
- Cocoaの日々: [Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本
- Cocoaの日々: [Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本(訂正〜サブクエリーの利用)
- アプリからメール送信する方法 - あらきんぐのiPhoneアプリ開発ブログ
- Xcode4の使い方 - フレームワークを追加する方法 - あらきんぐのiPhoneアプリ開発ブログ
- iPhoneとTwitter/Facebookを連携させるサンプルに「iPhone Facebook Twitter Connect Easy Integration Tool」 - MOONGIFT|オープンソース・ソフトウェア紹介を軸としたITエンジニア、Webデザイナー向けブログ
- Blog | saryou.jp
- MessageUIのインポートの仕方 « 寺子屋サルでき旧館 | iPhoneアプリ開発をもっともっと楽しく!困ったらみんなで解決!
iPhoneアプリ開発 (16日目)
iPhoneアプリ制作も16日目ですが、このところ進みが悪いので、何とかしたいところです。
今日やったこと
- CoreDataの更新
これだけです。。
CoreDataデータの更新
昨日、CoreDataの更新ができていないバグに気がついて、いろいろ調べましたが、うまく解決することができず、今日こそ解決しようと思い調べました。
managedObjectや、managedObjectContextをCoreDataのドキュメントを読みながら確認しましたが、正しい方法は分かりませんでした。
managedObjectを変更して、そのmanagedObjectが格納されているmanagedObjectContext のsaveメソッドをCallすることで保存できるというのはわかりましたが、そのmanagedObjectContextをどうやって取得するのか。。で困ってましたが、managedObject にmanagedObjectContextメソッドがあるというオチ。。。
お陰様でCoreData周りの理解が少しは深まったような気がします。
今日参考にしたページ
- Core Data Core Competencies: Managed object
- CoreDataの使い方 - noborunrunのiPhoneアプリ開発してアメリカにでも行きますか - iPhoneアプリ開発グループ
- NSKeyValueObserving Protocol Reference
- https://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneCoreData01.pdf
- A-Liaison BLOG: Core Data では モデルの delete - insert をしない方が良い
- CoreDataでCRUD - ちくわプログラマにっき
- iPhone版LINEのデータ構造 : Core data in LINE « NAVER Engineers’ Blog
- Second Flush:Persistence(17)〜Core Dataでの保存(4)
- CoreDataの使い方 - noborunrunのiPhoneアプリ開発してアメリカにでも行きますか - iPhoneアプリ開発グループ
- NSFetchedResultsController Class Reference
iPhoneアプリ開発 (16日目)
今日はベトナムは休日ではないので、iPhoneアプリ開発を進めてます。が、進みません。
今日やろうとしたことは、
- TableViewのスライダーを作る
- TableViewセルの更新時にTableViewの対応セルがずれる問題の修正
でしたが、残念ながら、両方完成せず。。
TableViewのスライダーを作る
TableViewの右はじにUIViewを追加して、そのUIViewをドラッグすると、TableViewが進むようにしようと考え、実装方法を調べました。
最初にスライダー部分にtouchesBegan を実装し、ドラッグ可能にしましたが、うまくイベントを取ることができず。
次にTableViewの継承クラスを使って touchesBeganを使おうとしましたが、スライダー部分の判別でうまく行かず。。
最後にスライダー部分に乗っているUITextViewにtouchesBeganを実装して、UIViewを動かしたところ、なんとか動きました。
ただ、TableViewが普通にスクロールしてしまうため、touchイベントがスライダーからずれて、すぐにイベントが終了してしまうということになりました。
さらなる方法を試そうと思いましたが、結構時間をとったので、そこで終了。
TableViewセルの更新時にTableViewの対応セルがずれる問題の修正
イベントの登録時間を変更するとTableViewのセルをタップした時に表示するイベント詳細がタップしたセルと異なるものになってしまうという問題があり、修正をこころみました。
TableViewの更新が正しくできていないのかと調査していましたが、結局、イベントの更新がCoreData上で反映されていないのが原因と判明。
原因がわかったところで、今日の作業は終了しました。
今日参考にしたページ
- [iPhone 開発メモ] 画像をドラッグする | Sun Limited Mt.
- iPhoneアプリ開発、その(63) タッチングゥウウウ|テン*シー*シー
- [iOS][Youtube]オブジェクトをドラッグで移動する方法 | iPhone/iPadアプリ開発ブログ by @cococchi
- [XCODE]iPhone上の画像を簡単にドラッグする - YoheiM技術やらずに終われまテン
- iPhoneアプリ開発、その(124) オートスクロール|テン*シー*シー
- UIResponder Class Reference
- iphone - UIView drag (image and text) - Stack Overflow
- iphone - How to get touch event on a CALayer? - Stack Overflow
- A-Liaison BLOG: CALayer を使って UIImage を描画する
- UITableViewで座標を取得する | 6oolab
- https://developer.apple.com/jp/devcenter/ios/library/documentation/EventHandlingiPhoneOS.pdf
- https://developer.apple.com/jp/devcenter/ios/library/documentation/UIScrollView_pg.pdf
- UITableView 上の touchesBegan は UIViewController まで上がってこない - プログラマのページ
- iPhoneアプリ開発、その(122) UIScrollViewはイリュ〜ジョ〜ン|テン*シー*シー
- iphone - Catch a subview touch event - Stack Overflow
- iPhoneアプリ開発、号外 propertyをちょっと調べてみた|テン*シー*シー
- UIScrollView のタッチイベントを取得する - happy lie, happy life
- Koike ToolBox 2010/01/12
- [iPhone] UITableView を所定の位置までスクロールさせる | Sun Limited Mt.
- UIScrollViewDelegate Protocol Reference
- UIScrollView Class Reference
- サルでもわかる Core Data 入門【実装編】 - A Day In The Life
- yoo-s.com
- Study CoreData 19 ~最悪のシナリオ~ | Everything was born from Love
- UIViewController Class Reference
iPhoneアプリ開発 (15日目)
昨日に引き続き、今日もベトナムは休日なんですが、ちょこっと開発を進めたので、進捗です。
今日やったことは
- 写真をアップしたあと、自動的にTableView画面を表示する
これだけです。まあ、今日は休みってことで。
写真をアップしたあと、自動的にTableView画面を表示する
これはすでに実装しているスワイプによる画面遷移のコードと同じ動作を写真アップ後に実装することで実現できました。
まあ、休みってことで。。