Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2014-07-23

2014年5月〜7月にやったお仕事のまとめ

4月末に書いた「独立して最初の3ヵ月間にやったお仕事のまとめ」という記事から3ヵ月が経ちました。(前にも似たようなこと書きましたが)フリーランスは定期的に自らアピールしていかないと本当に世の中から忘れられてしまうので、またこの3ヵ月やったお仕事についてまとめておこうと思います。


ウェアラブルおもちゃ「Moff」

Moffって何?という方はぜひこちらのムービーをご覧ください。



ざっくりいうと「手に巻いてスマホと連携させて遊べるおもちゃ」です。


Kickstarter で2日間で目標調達額を達成したり、最近予約販売を開始した Amazon では発売前にも関わらず妖怪ウォッチに次ぐ2位にランクインしたりと、とても勢いのあるスタートアップです。


GW明けあたりから、このMoffの、iOSアプリの開発をお手伝いさせていただいてます(現在進行形)。


Moffは現在Amazonにて予約受付中ですので、お子さんがいらっしゃる方はぜひ!



(僕も甥っ子姪っ子自分用等々4つほど購入する予定です)


パーソナルモビリティ「WHILL」

昨年、500 startups に参加 した際に同期だった「WHILL」とも一緒にお仕事させていただいてます。


f:id:shu223:20140723040034j:image:w400


担当してるのは、WHILL と Bluetooth LE で連携する iOS アプリで、BLEモジュールのファーム側にも踏み込んで開発しています。



WHILL本体のファーム側と歩調を合わせる必要もあるので、月に3人日ぐらいのペースでちょっとずつ進めている感じですが、既にWHILLをアプリからリモートコントロール (ベッドにWHILLを呼び寄せて乗るといったユースケースを想定)できるようにはなっていて、あとは、

  • 速度やバッテリー残量等の情報取得・表示
  • シートの前後スライドのコントロール
    • 乗る際に、乗りやすいようにシートを前にスライドさせる
    • 車椅子ユーザにとってかなり重要らしい
  • 細かい速度関係のパラメータチューニング
    • 前進加速度、前進減速度、後進加速度、後進減速度、等々パラメータは20種類ぐらいある
    • デフォルト設定が3タイプ用意されているが、人によって好みが全然違う
    • アメリカは広いので、サービスマンがやってたらコストが半端なくかかる

といったあたりを実装する予定です。8月が山場になる見込み。


真鍋大度さん「music for the deaf」

『情熱大陸』でラストにやってた、「耳の聴こえないダンサーが、電気刺激で音を感じてダンスする」という試み。これ、筆談してるあたりでちょうど葉加瀬太郎さんによるあの名エンディングテーマが流れ始めて、うおーってなった方も多いのではないでしょうか(僕は超なりました)


これを「ヨコハマ・パラトリエンナーレ」というイベントで実際に展示&パフォーマンスするにあたって、電気刺激デバイス(通称ピリピリデバイス)をBLEから制御するアプリ、その他諸々の制作のお手伝いでお声がけいただき、二つ返事でお受けした次第です。


(アプリ動作確認の様子。感電初心者なので毎回ドキドキします。。)


f:id:shu223:20140723042423j:image:w400

(サイトに名前載ってたので記念スクショ)


パフォーマンスの日時等の詳細については、近いうちに公式サイトで告知されると思います。また技術的な話については終了後にでも本ブログに書きたいと思っています。


海外iBeacon案件

iBeaconはリアルな場所に関わるので、仕事で海外出張いけるかも!?という期待もあり関わらせていただいた(ている)案件。


この案件は日本の会社からお話をいただいたものなのですが、クライアントは海外、ディレクターも外国人、ということで基本的にコミュニケーションはすべて英語というところが僕にとってはチャレンジングでした。不自由だしうまく言えないもどかしさはあるものの、自分の得意領域(アプリ開発)では意外となんとかなる、という感覚を得られたのがよかったです。


スケジュールの都合で、最初の仕様検討とプロトタイプ開発フェーズでいったんプロジェクトを離れましたが、引き続きスポットでお手伝いさせていただく予定。


講演

『第37回ワイヤレス技術セミナー 実例から探るiBeaconの勘所』という有料セミナーで講演をさせていただきました。

iBeaconが発表されてからすでに1年が経とうとしていますが、この新技術をレストランなどの「リアルビジネス」に実際に活用し運用している事例はまだ国内ではほとんど出てきていません。株式会社ウェブクルーは、このiBeaconにいち早く着目し、自社で展開している火鍋専門店チェーン「小肥羊」の実店舗にビーコンデバイスを設置し、対応するiOSアプリを2014年3月にリリースして話題となりました。


本講演では、この実店舗アプリ/サービスの開発に携わった立場から、どのような体制・スケジュールで開発を実施したのか、プロトタイプでの実証実験はどのようなものだったのか、その実験で得た知見を踏まえアプリ/サービスをどのように設計していったか、といった点を中心に詳しく解説していきます。また、リリース後の反響や成果、店舗スタッフの反応などについても最新の状況を報告します。


ウェブクルーさんのご厚意で、非公開情報をふんだんに交えて(ビーコンどこに置いてるとか、管理画面がどうなってるかとか)お話させていただきました。


動画撮影・編集アプリのプロトタイプ開発

発注元の会社のオフィスに1日だけ行って、動画撮影・編集アプリのプロトタイプを開発するお仕事。先方がこれからアプリ開発をはじめるにあたり、そのたたき台となるような位置づけです。 *1


「想像力で補完できる部分はできるだけ端折って、まずはそのアプリの良さがわかる一番重要なポイントだけしっかり実装する」みたいなプロトタイピングの勘所のようなものは、かなりたくさんのアプリをつくってきた中で培われてきている(と思っている)ので、こういう短期ブッコミ案件大歓迎です。


その他

タイムチケット経由のお仕事

最近オープンした『TimeTicket』経由でもちょくちょくお仕事の依頼をいただいてます。


「相談」の方ではなく、本業の「アプリ開発」のチケットで、今日までに実行できたのは2件。


昔つくったアプリのリバイバルヒット

4年ほど前につくった「i聖徳太子」というアプリが謎のリバイバルヒットし、

  • ビジネスカテゴリ1位
  • 無料総合46位

に躍り出てきました。


下記のダウンロード数の推移グラフを見ると、そのスパイクっぷりがよくわかります。


f:id:shu223:20140723035746p:image:w600


火がつく前日が14ダウンロード、ピークが16,426ダウンロードなので実に1000倍


発火元は下記ツイートのようです。なんとリツイート 18,704 件、お気に入り 8,590 件!!



ちゃんと計算してませんが、Macbook Airが買えるぐらいの収益増になってました。


WWDC 2014 参加

仕事というよりは旅行ですが、17日間、つまりこの3ヵ月の約6分の1にあたる期間は、初のWWDCに参加するべくシリコンバレーに行ってました。

WWDC以外にも、WHILL HQ に行ったり、Kinoma Create を開発している Kinoma に行ったり、いろんなスタートアップの方に会ったり、向こうにいるデザイナーともくもく開発したりと非常に充実してました。


(あこがれのあのジャケットをもらいその場で記念撮影)


超楽しかったので来年も行きます!


おわりに

そんなこんなで、おかげさまでこの3ヵ月も楽しく生き延びることができました。フリーランスとしてどう仕事をしていくか、エンジニアとしての自分の強みは何で、どう生存していくか、みたいなものが紆余曲折の中で揉まれてだいぶいい感じになってきた気がします。


で、前回の実績紹介のときに書いた、

  • 目の前のおもしろい仕事にがっちり食いつく
  • → がんばっていい仕事をする
  • → 得られたスキルや実績をブログ等でアピールする
  • → よりおもしろい仕事のお話をいただく

というサイクルをしっかり回していく「わらしべ長者方式」がやっぱり自分にあったやり方であり、生命線だなと。

要は「おもしろく働くために自分が心がけていること」的な内容で、8月26日、下記イベントでお話しさせていただきます。



この話は以前ブログに書いてみたことがあるのですが、イマイチ伝わらなかった気がするので今度こそはしっかり例とか準備して臨むつもりですので、ピンと来た方はぜひご参加いただけると嬉しいです。


*1:この案件は7/23現在ではまだやってないのですが、7末に予定を入れてるので、今回の実績に入れてあります。

2014-07-13

自作iOSアプリで制御できるロボット、Romo のハッカソンに参加してきました

本日 HUB Tokyo にて開催された『iPhone x ロボットハッカソン 大人の夏休みの自由研究 〜Romoで絶対起きられる目覚まし時計を作ろう〜』と題されたハッカソンに参加してきました。



Romo とは?

http://www.romotive.jp/

Romo(ロモ)はiPhoneなどで動く「体感型のエデュケーショナルロボット」で、誰でも動かすことが可能です。iPhoneアプリが頭脳の役割になり、様々な感情や動きを表現することができます。楽しみながら子どもの論理的思考や想像力、思考力を育むことができ、遊びや学びの幅がさらにひろがる可能性を秘めています。


僕なりに要約すると、「iOS SDK が用意されてて、いろんな連携アプリがつくれるロボット」です。


Romo SDK の使い方

gihyo.jp の連載が細かい手順まで説明されていてわかりやすいです。


「とりあえず動かしてみたい」場合は第2回を、


「キャラのUIを使いたい」場合は第3回を見ればOKです。


第2回の内容はRomo本体が必要ですが、第3回の内容は本体なしで試すことができます。


つくったもの

お題は「目覚まし時計」で、セットした時間になると Romo が激しく引っ張って起こしてくれる というものをつくりました。


Romo Alarm from Shuichi Tsutsumi on Vimeo.


撮影のため柱にくくりつけてありますが、これを服や布団に繋いでおくイメージです。だいぶシンプルですが、せっかくロボットなので、物理的に動く機能を使った方が良いかなということでこれに至りました。


止めるには iPhone を抜くしかありません。動画からも僕の動揺っぷりが伝わるかもしれませんが、激しく動くのでかなり大変です。


イヤホンジャックが前にビヨーンと出てるのは、繋ぐヒモが手元にイヤホンしかなかったからで、用途としてはただのヒモです。テープで貼り付けてあります。


f:id:shu223:20140713160602j:image:w300



動画にはありませんが、マイルドに引っ張って起こしてくれるモードもあります。


モーター電流値を取得する

「引っ張る」ということを実現するのに、単純に一定時間ごとに前進と後退を繰り返すのだと「引っ張られてる感」がどうしても弱くなってしまう場合があるので、しっかり張力がMaxに達してから後退するよう、モーター電流の値を判定に使用しています。


モーターを示すクラス RMCoreMotor のオブジェクトは DifferentialDriveProtocol よりアクセスできるので、次のようにします。

@property (nonatomic, strong) RMCoreRobot<HeadTiltProtocol, DriveProtocol, LEDProtocol, DifferentialDriveProtocol> *myRobot;

で、drive するときに `driveWithLeftMotorPower:rightMotorPower:` を使用して走らせることで、


[self.myRobot driveWithLeftMotorPower:1.
                      rightMotorPower:1.];

RMCoreRobot オブジェクトの `leftDriveMotor`, `rightDriveMotor` プロパティから、`motorCurrent` の値を取得できるようになります。

float leftCurrent  = [self.myRobot.leftDriveMotor motorCurrent];
float rightCurrent = [self.myRobot.rightDriveMotor motorCurrent];

Romo が引っ張る際にヒモがピンと張って前に進めなくなると、速度を維持しようとモーター電流が大幅に上がることを利用して、 motorCurrent が一定以上になるといったんバックする、ということをやっています。


苦労した点としては、どんな床で使うかによって閾値が全然変わってくる点で、板の上、アスファルトの上だと全然値が違ってました *1


つくったもの その2

上記のをつくりおえて、このブログも書いてしまって時間が余ったので、もうひとつ作成。


アラームの音楽に合わせて Romo が踊る というもの。


動画は撮ってませんが、アラーム開始に合わせ MIDI の楽曲が鳴りはじめ、そのメロディやリズムに合わせて Romo が体を揺らしたり表情を変えたり雄叫びを上げたり、というものです。MIDI再生とかは別件でやってたのと、アラームはひとつめのアプリのを流用したので制作時間30分ぐらい。


総括

Romo SDK ともてよくできていて、シンプルな API のわりにかなり色々なことができるようによく考えられていると思います。興味のある方はぜひ!


日本での正規品は現在予約受付中(2014年7月24日頃の出荷予定とのこと):


(Amazon で現在手に入るのは並行輸入品で、かつ価格が倍以上します。。)



*1:結局、プレゼンのときに調整できるようにキャリブレーションモードを用意しました。

2014-07-09

低レイテンシにシーク&再生可能なライブラリ:EZAudio

ニッチなケースだとは思うのですが、

  • デバイスA(マスター)に対して、デバイスBを同期再生させたい
  • ダンスパフォーマンスなので遅延はNG
  • デバイスBのアプリは、デバイスAの再生の途中で起動されるかもしれない
    • つまり、同期タイミングが曲の頭だけでは不十分
    • ライブパフォーマンスなので一発勝負
  • デバイスBは100台ぐらい

という要件の案件があり、曲中にもちょこちょこと同期タイミング(※)を用意して、デバイスBではその度に再生位置を変える(シークする)という方法を取ろうとしました。


※同期方法には Audio Watermark (音響透かし)を使用。この話はまた後日書きます。


で、やってみると、デバイスAとデバイスBの再生音がたまにずれる。常にずれているなら同期方法自体の問題と考えられますが、「たまに」ずれるというのは、AVAudioPlayer の currentTime プロパティを使用したシーク時に遅延が生じているのかなと。(もちろん prepareToPlay とかはやっています)


ググってみると、「AVAudioPlayer も昔はレイテンシがひどかったけど、今はだいぶ改善された」みたいなコメントもあり、「AVAudioPlayerは遅い」という確証はイマイチ持てず。


でもまぁ高レベルAPIなわけだし、もうちょっと低レベルなAPIを使っていて低レイテンシを売りにしているライブラリとか当たってみよう、といろいろ調べてみると、OpenALをラップしてるいくつかのライブラリは、「低レイテンシ」をうたってはいるものの、長めの楽曲については結局 AVAudioPlayer を内部で使ってたり。。(例:ObjectAL)


EZAudio

で、たどり着いたのが、EZAudio という OSS。


https://github.com/syedhali/EZAudio



良さそうと思った点は、

  • 内部では Audio Unit を使用
  • 最近もわりと活発にメンテされている
    • オーディオ系 OSS は古いことが多いので。。
  • スター数が多い
    • すなわちユーザー数が多くてある程度枯れてそう(希望的観測)
  • API は AVAudioPlayer 並に簡単、とまではいかないが Audio Unit を直接使うよりは簡単
  • 波形描画機能もライブラリに含まれていて、OpenGLを用いた高速描画もサポート
    • CoreGraphicsベースも選択可能

実装方法

EZOutputDataSource プロトコルへの準拠を宣言しておく。


再生準備

ファイル読み込み等。

@property (nonatomic, strong) EZAudioFile *audioFile;
self.audioFile                        = [EZAudioFile audioFileWithURL:filePathURL];
self.audioFile.audioFileDelegate      = self;

[[EZOutput sharedOutput] setAudioStreamBasicDescription:self.audioFile.clientFormat];

EZOutputDataSource実装
- (void)               output:(EZOutput *)output
    shouldFillAudioBufferList:(AudioBufferList *)audioBufferList
           withNumberOfFrames:(UInt32)frames
{
    if (self.audioFile) {
        
        UInt32 bufferSize;
        [self.audioFile readFrames:frames
                   audioBufferList:audioBufferList
                        bufferSize:&bufferSize
                               eof:&_eof];
    }
}

- (AudioStreamBasicDescription)outputHasAudioStreamBasicDescription:(EZOutput *)output {
    return self.audioFile.clientFormat;
}

再生開始
if (![[EZOutput sharedOutput] isPlaying]) {
    [EZOutput sharedOutput].outputDataSource = self;
    [[EZOutput sharedOutput] startPlayback];
}

再生停止
if ([[EZOutput sharedOutput] isPlaying]) {
    [EZOutput sharedOutput].outputDataSource = nil;
    [[EZOutput sharedOutput] stopPlayback];
}

シーク

NSTimeIntervalでシーク位置を指定したい場合はこんな感じ。

SInt64 frame = self.audioFile.totalFrames * newTime / self.audioFile.totalDuration;
[self.audioFile seekToFrame:frame];

UISlider の位置でシークさせたい場合は付属のサンプルまんまでOK。


使ってみた所感

実際これに入れ替えてみると、「同期再生のずれ」は大幅に軽減されました。ちゃんと計測してないのですが。


関連記事


2014-07-08

【iOS8】App Extension の実装方法 その2:Custom Keyboard

その1:Action」から1ヵ月以上経ってしまいましたが、「その2」として Custom Keyboard の App Extension 実装手順について書きたいと思います。 *1



キーボードは改善し続けてきた iOS の中でもわりと進化が止まっていた/むしろ使いづらくなるアップデートもあった部分なので、自前でのキーボード実装を可能とする機能追加は期待していた人も多かったのではないでしょうか。


1. ターゲットを作成する

Xcode の [File] > [New] > [Target] から、[Application Extension] > [Custom Keyboard] を選択します。


f:id:shu223:20140606093345j:image

(※NDAに配慮し、Xcode6のスクショではなく、公開情報である App Extension Programming Guide の図3-1 を貼ってあります。)


2 Extension の実装

自動生成されたコードについて

手順1でターゲットを追加すると、UIInputViewController のサブクラス "KeyboardViewController" が自動生成されます。


UIInputViewController のヘッダを見てみると、

@protocol UITextDocumentProxy <UIKeyInput>

@property (nonatomic, readonly) NSString *documentContextBeforeInput;
@property (nonatomic, readonly) NSString *documentContextAfterInput;

@end

NS_CLASS_AVAILABLE_IOS(8_0) @interface UIInputViewController : UIViewController <UITextInputDelegate>

@property (nonatomic, retain) UIInputView *inputView;

@property (nonatomic, readonly) NSObject <UITextDocumentProxy> *textDocumentProxy;

- (void)dismissKeyboard;
- (void)advanceToNextInputMode;

// This will not provide a complete repository of a language's vocabulary.
// It is solely intended to supplement existing lexicons.
- (void)requestSupplementaryLexiconWithCompletion:(void (^)(UILexicon *))completionHandler;

@end

こんな感じでカスタムキーボード用に拡張された UIViewController サブクラスとなっています。


参考:UIInputViewController Class Reference


で、生成されたコード(KeyboardViewController)の中身を見てみると、viewDidLoad で下記のような処理が行われています。

self.nextKeyboardButton = [UIButton buttonWithType:UIButtonTypeSystem];

[self.nextKeyboardButton setTitle:NSLocalizedString(@"Next Keyboard", @"Title for 'Next Keyboard' button") forState:UIControlStateNormal];
[self.nextKeyboardButton sizeToFit];
self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = NO;

[self.nextKeyboardButton addTarget:self action:@selector(advanceToNextInputMode) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:self.nextKeyboardButton];

NSLayoutConstraint *nextKeyboardButtonLeftSideConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
NSLayoutConstraint *nextKeyboardButtonBottomConstraint = [NSLayoutConstraint constraintWithItem:self.nextKeyboardButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
[self.view addConstraints:@[nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint]];

パッと見長いですが、やってることは

  • UIButton オブジェクト生成
  • Auto Layout の制約追加

ざっくりこれだけです。


ポイントとしては、生成した UIButton にアクションとしてセットされている advanceToNextInputMode メソッドです。UIInputViewController のリファレンスに

Switches to the next keyboard in the list of user-enabled keyboards.

とある通り、キーボード切り替えのためのメソッドです。


つまり、この自動生成されたキーはキーボード切り替え用のキー、ということがわかります。


文字入力キーを追加する

独自の文字入力用のキーを追加してみます。

UIButton *customKeyBtn = [UIButton buttonWithType:UIButtonTypeSystem];
[customKeyBtn setTitle:@"@shu223" forState:UIControlStateNormal];
[customKeyBtn sizeToFit];
[customKeyBtn addTarget:self
                 action:@selector(customKeyBtnTapped:)
       forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:customKeyBtn];

上記のように普通に UIButton オブジェクトを生成して、アクション用のメソッドを次のように実装します。

- (void)customKeyBtnTapped:(UIButton *)sender {
    
    [self.textDocumentProxy insertText:@"https://twitter.com/shu223"];
}

これで、キーの押下時(タップして離したとき)に、 UITextView なり UITextField なりの UIKeyInput プロトコルを実装したビューで、かつ First Responder なものに対して指定の文字列が挿入されるようになります。


カスタムキーボードを使用する

作成した App Extension のターゲットを内包するアプリ(Containing App)を実機 / シミュレータにインストールするとそのカスタムキーボードが使えるようになるわけですが、有効にするためにはエンドユーザー側で設定のひと手間が必要です。


NDAに配慮してスクショは控えますが、iOS の「設定」アプリから次の手順でカスタムキーボードを有効にします。

  1. [Settings] > [General] > [Keyboard] > [Keyboards]
  2. [Add New Keyboard] を選択
  3. リストの中に作成したカスタムキーボードがあるはずなので、タップして有効にする

これで、メールアプリなりメモ帳アプリなりを起動して、テキスト入力中にキーボード切り替えするとカスタムキーボードが出るようになります。


参考資料


*1:一応 Extension Point は 6種類全部試してみるつもりでいるので、ゆっくりながらも「その6」まで続く予定。

2014-07-07

TimeTicket で日曜の空き時間が 41,000 円で売れた話

「わたしの30分、売りはじめます。」という触れ込みでオープンした空き時間売買サービス「TimeTicket」、さっそく登録してみたところ、ちょうど空いてた昨日の日曜だけでなんと 41,000円 の売り上げがありました。


f:id:shu223:20140707074629j:image:w600


このサービス、気になってる方も多いんじゃないかと思うので、実際どんな感じだったか書いておこうと思います。


※本記事は申し込み主の方に許可をとった上で書いています。堤のチケットに申し込むとブログに書かれてしまう!ということはないのでご安心ください。


売れたチケットその1:iOSアプリ開発に関する諸々の相談に乗ります。

https://www.timeticket.jp/items/1890

  • 30分500円〜、寄付率50%
  • 場所は目黒にあるコワーキングスペース、HUB Tokyo限定

最初に登録したチケット。受け取れる額は TimeTicket の手数料が30%引かれてそこから寄付が 50% なので、支払額が500円だとすると、


500円 × 0.7 * 0.5 = 175円


というわけで(チケット発行側としては)儲けは度外視。どんなもんか使ってみよう、の値段です。なるべく出かけたくないので、場所は自分が歩いていける&入居しているコワーキングスペースにしています。


売れたチケットその2:iOSアプリを開発します。

https://www.timeticket.jp/items/1903

  • 5時間40,000円、寄付率10%
  • 場所指定は東京都

こっちはフリーランスでやってる本業。まだ TimeTicket でこの金額を支払う人はいないかなーと思ってたら申し込みがきてびっくりしました。仕事としての意識があるので、場所は先方におまかせ。


事前のやりとり

申し込みがあって、チケット発行側(今回のケースでは僕)がOKボタンを押すと、申込者が決済できるようになる、というフローなのですが、どっちのチケットでも、OKボタンを押す前にダイレクトメッセージで

  • 具体的な相談内容/開発内容
  • 期待しているゴール

は確認しました。あまり知らない分野かもしれないし、先方のゴールイメージ次第では30分以内/5時間以内で期待されている成果を出せるとは限らないし、お金の無駄だった、となると先方はもちろん自分もとても哀しいので。


聞いてみて、それならお役に立てそうだ、ということで OK ボタンをポチッと。


当日

相談30分チケットの方は、技術的な質問2つほどと、勉強方法とかざっくばらんな話 *1


(ブログに書いていただきました!)



また、開発5時間チケットの方は、iOSエンジニアの方からの申し込みだったので、開発委託という感じではなく、行き詰まっている部分のソースコードと issue のリストをその場でもらって、僕の手元で issue やバグに対応しつつ解説する、というやり方でした。(受け取ったソースコードは最後に横で確認してもらいつつ消去)


所感

フリーランサーとしての感想

「その2」の方のチケットは自分の本業と同内容なわけですが、自分に入る金額は、


40,000円 × 0.7 × 0.9 = 25,200円


で、寄付額が最低でも10%なので、お客さんが支払う額の 63% が受け取れる率の最大、ということになります。


なのでここをご飯を食べるための主戦場にする(フリーランスとしての活動の場にする)には厳しいですが、「空き時間を売る」という観点では全然アリ、というのが自分の感想です。


格安チケットのメリット

申し込みがあってから気付いたのですが、時間帯を午前中の10時〜10時半にすると、午前中うだうだしがちな自分にとっては「出かけるきっかけ」になって良いなと。仕事に関係する話だからエンジンもかかってくるし、技術的な相談は自分の勉強にもなるし。


要望とか

あったらいいなーと思った機能は、

  • チケットの埋め込みコード生成
    • この記事に埋め込みたかった
  • タイムセール
    • 突発的に暇になって、でも急だから申し込みないだろうな、というときに格安にしたい
    • このために別途チケット発行するのはあまりやりたくない。いいね数とかあるので。
  • チケット一時休止
    • 忙しいときは休止にしたい
  • お気に入り
    • 上記のセール機能や休止機能と関連して、お気に入り登録してくれた人に通知が行くような機能

中の方々、いかがでしょうか!


*1:勉強方法は、せっかく質問していただいたのに的を得た回答をできなかった気がするので、あとで整理しておこう。。

2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 |