【Android】Android Studioでjar生成(gradle)
ブログ書かなすぎですね。はい。
ネタがないんすよ。はい。
自社サービスとか自作アプリとか作ってないとなかなかね。はい。
ソースコードとか出せないんでね。はい。
いっつも忘れるのでAndroid Studioでjar生成
最近だとbuild.gradleに書けばおkみたいなライブラリが多くて助かるんですが。
ソースコードしかない場合ね。
Android Studio起動します。
Welcome画面でImport Non-Android Studio Project→ソースコードのディレクトリを選択
インポート終わったらapp/build.gradleに以下を追記
パスはよしなに書き換えてください。
task clearJar(type: Delete) { delete 'build/libs/' + 'sample.jar' } task makeJar(type: Copy) { from('build/intermediates/bundles/release/') into('release/') include('classes.jar') rename('classes.jar', 'sample.jar') } makeJar.dependsOn(clearJar, build)
syncして
terminalでプロジェクト直下に移動
で、以下のコマンド実行。
./gradlew app:clean app:assembleDebug app:makeJar
上のサンプルの場合だとapp/release/sample.jarができます。
【その他】勝手にIDEランキング
今年入ってからASP.NET MVCとかiOSとかAndroidとかUnityとかCocos2d-xとかいろいろやりすぎて、もはやわけがわからん。
ちなみに最近使ってる言語たち。。
Visual C#
C#
Objective-c
Java
C++
PHP
6言語を使いこなすわたくし。
いや、C++は使いこなしてないから5言語。
あ、ぼくの下で働きたい人募集中。
インフラからサーバーサイドからWebからクライアントサイドからUI/UXまで何でもござれ。
あと自分の食いぶち困らないくらいには営業も。営業職には敵わないけど。
ってことで勝手にIDEランキング
2位 Xcode6
ここ最近ようやくまともになりましたね。
Xcode4とかメモリ食い続ける一方だったらから非力なマシンだと1時間に1回再起動必要だったもんね。
そこそこ軽快になってきたので、あとはもうちょいショートカット充実させてほしいですね。
インテリセンスちょっとお馬鹿。候補出しすぎやねん。
デバッグちょっとしにくいのが難点。
【その他】フリーランスとは
うーん、ひさしぶり。ちょっと多忙。
独立してから思うこと。一口にフリーランスって言っても色々あるんよ。
ここではエンジニアの場合。大きく2つ。
・常駐型
どっかの企業に常駐して月〜金 1日8時間とかで仕事するやつですね。
派遣社員とやること変わらない感じ。
金溜まったら契約切って旅行行ったりと、まさにフリーな感じ。うらやましい。
・法人化してないだけ型
法人化してないだけで、仕事内容は法人と変わりません。
社長って肩書きはないけど、社長みたいなもん。
仕事内容はBtoBだったりBtoCだったりするけど。
まぁなにが言いたいって、一般的にフリーランスって言うと常駐型をイメージする方が多いみたいですが、ぼくは法人化してないだけ型なので常駐型と一緒にしないで欲しいと。普通に考えたら社長が何年も他の会社の正社員やったりしないよねと。自分の事業あるんですけどと。
常駐型と法人化してないだけ型は全然違うぞと。
あ、全然初見とかで社員とかにお誘い頂くのは何とも思わないどころか、普通にありがたいですw
ぼくがこんな考えだってわかるわけないですしねw
さ、仕事すっかー
【C#】【iOS】In-AppPurchaseレシートの検証-Consumableバージョン
あけおめにゃん。
iOS側は省略。ググればあるにゃん。
サーバーサイドはPHPだといっぱいあるんだけど、C#はあんまないから書いとくにゃん。
とりあえずデシリアライズ用のクラスさんたち。
[DataContract] public class VerifyReceiptResult { [DataMember] public int status { get; set; } [DataMember] public string environment { get; set; } [DataMember] public virtual Receipt receipt { get; set; } } [DataContract] public class Receipt { [DataMember] public string receipt_type { get; set; } [DataMember] public int adam_id { get; set; } [DataMember] public int app_item_id { get; set; } [DataMember] public string bundle_id { get; set; } [DataMember] public string application_version { get; set; } [DataMember] public int download_id { get; set; } [DataMember] public int version_external_identifier { get; set; } [DataMember] public string request_date { get; set; } [DataMember] public long request_date_ms { get; set; } [DataMember] public string request_date_pst { get; set; } [DataMember] public string original_purchase_date { get; set; } [DataMember] public long original_purchase_date_ms { get; set; } [DataMember] public string original_purchase_date_pst { get; set; } [DataMember] public string original_application_version { get; set; } [DataMember] public virtual ICollection<Purchase> in_app { get; set; } } [DataContract] public class Purchase { [DataMember] public int quantity { get; set; } [DataMember] public string product_id { get; set; } [DataMember] public long transaction_id { get; set; } [DataMember] public long original_transaction_id { get; set; } [DataMember] public string purchase_date { get; set; } [DataMember] public long purchase_date_ms { get; set; } [DataMember] public string purchase_date_pst { get; set; } [DataMember] public string original_purchase_date { get; set; } [DataMember] public long original_purchase_date_ms { get; set; } [DataMember] public string original_purchase_date_pst { get; set; } [DataMember] public bool is_trial_period { get; set; } }
んで、Appleからレシート情報取得
var serializer = new DataContractJsonSerializer(typeof(VerifyReceiptResult)); VerifyReceiptResult verifyReceiptResult; using (var client = new HttpClient()) using (var content = new StringContent(@"{""receipt-data"":""" + "クライアントから受け取ったレシートデータ" + @"""}")) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = client.PostAsync(@"https://buy.itunes.apple.com/verifyReceipt", content).Result; var resultByteArray = response.Content.ReadAsByteArrayAsync().Result; var resultStream = new MemoryStream(resultByteArray); verifyReceiptResult = (VerifyReceiptResult)serializer.ReadObject(resultStream); } if (verifyReceiptResult.status == 21007) { using (var client = new HttpClient()) using (var content = new StringContent(@"{""receipt-data"":""" + "クライアントから受け取ったレシートデータ" + @"""}")) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = client.PostAsync(@"https://sandbox.itunes.apple.com/verifyReceipt", content).Result; var resultByteArray = response.Content.ReadAsByteArrayAsync().Result; var resultStream = new MemoryStream(resultByteArray); verifyReceiptResult = (VerifyReceiptResult)serializer.ReadObject(resultStream); } } if (verifyReceiptResult.status == 0) { // コイン付与とか }
verifyReceiptResultにデシリアライズされて値が入ってるので、あとはよしなに。
transaction-idは未使用かどうか自前で管理する必要があるぉ。
StringContentはPostAsyncが終わると破棄されるらしーぉ。
【その他】2014年振り返りと2015年目標
気付けばこんな時間っすね。つーか今日大晦日っすね。
もう仕事納めよう。納まってないけど納まったことにしよう。
あんまり仕事、仕事になるのもよくない、うん。
自分で言うのもなんだけど頑張ったから、許して下さいw
前職は運用で土日、深夜関係なく突然仕事が発生。独立してからは仕事、仕事、仕事だったのでたまにはちゃんと休もうと思います。来年は3日まで仕事しません。
とゆーわけで2014年振り返り。
仕事もプライベートも色々ありました。はい。
とりあえず会社員辞めました。
会社員辞めて、独立して、ある日なぜかベンチャーの執行役員 CTOに就任して会社員に舞い戻り。
収入きつくなったので、自営業再開し、今に至る。
2014年よかった点
・引っ越した
新築マンションっていいですね。いい加減養生外れてほしいですが。
・ネットがWiMAX2→光になった
全く何も困ってなかったんだけど、マンションに無料でついてたので。
S3にアップロードするのに6時間掛ってた処理が30分になった。
・PC用品買いまくり
節税という大義名分の元に欲しいものは大体買いつくしました。
・人脈広がった
あんま人脈、人脈言うやつ好きじゃないんだけどね。他に適当な言葉が見つからないので。人脈っていうか仲良くしてくれる人?仲良くしてくれる人大事。
会社員時代じゃ考えられないくらい多くの人と出会った年でした。
・新しい技術にチャレンジした
ってゆーか絶賛チャレンジ中。フリーランスってほんと技術が選べていい。
もちろん結果がついてこないとだめなんですが。結果出せるように頑張ります。
なんか独立してよかったことみたいになっちゃった。仕事しかしてないからしゃーない。
2015年目標
・サービスリリース
うん、CTOの会社のサービスね。
予定より遅れましたが、そろそろ出します。
・貯金
2014年現在まさかの貯金ほぼ0。何に使ったんだろう。
・契約してる仕事を無事終わらせる
がんばるよ。いや、がんばってるよ。
・事業拡大
うん。お陰様で色々お話を頂いているので、今契約してる仕事終わったら真面目に動こうと思っております。
とゆーわけで今年一年お世話になった方々、大変ありがとうございました。
相変わらず適当な感じで過ごしていきますが、来年もどうぞよろしくお願い致しますw
【iOS/Objective-c】Method Swizzling 修正版
ちょっと前にこんなん書きましたシリーズ第二弾
【iOS/Objective-c】Method Swizzling - ふるすたっくえんじにあっぽい人の日記
いや、動くんだけどさ。
[[Hoge sharedInstance] applicationWillResignActive:application];
って呼ぶと、AppDelegate内で定義されているapplicationWillResignActive内の処理が実行されるんすけどね。こんなかでselfは当然AppDelegateのインスタンスは参照してないんすよね。Hogeのインスタンス参照してるわ。そらそうだ。
で、以下のように修正
#pragma mark - swizzled AppDelegate Methods - (void)applicationWillResignActive:(UIApplication *)application { [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillResignActive:)]; [self applicationWillResignActive:application]; [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillResignActive:)]; } - (void)applicationDidEnterBackground:(UIApplication *)application { [[Hoge sharedInstance] swizzleMethod:@selector(applicationDidEnterBackground:)]; [self applicationDidEnterBackground:application]; [[Hoge sharedInstance] swizzleMethod:@selector(applicationDidEnterBackground:)]; } - (void)applicationWillEnterForeground:(UIApplication *)application { [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillEnterForeground:)]; [self applicationWillEnterForeground:application]; [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillEnterForeground:)]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [[Hoge sharedInstance] swizzleMethod:@selector(applicationDidBecomeActive:)]; [self applicationDidBecomeActive:application]; [[Hoge sharedInstance] swizzleMethod:@selector(applicationDidBecomeActive:)]; } - (void)applicationWillTerminate:(UIApplication *)application { [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillTerminate:)]; [self applicationWillTerminate:application]; [[Hoge sharedInstance] swizzleMethod:@selector(applicationWillTerminate:)]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [[Hoge sharedInstance] swizzleMethod:@selector(application:didReceiveRemoteNotification:)]; [self application:application didReceiveRemoteNotification:userInfo]; [[Hoge sharedInstance] swizzleMethod:@selector(application:didReceiveRemoteNotification:)]; }
【iOS】UIWebViewで表示されている要素の高さを取得 バージョン2
ちょっと前にこんなん書きました。
【iOS】UIWebViewで表示されている要素の高さを取得 - ふるすたっくえんじにあっぽい人の日記
だがしかし。なんかびみょーにずれる。いや、divの高さは正しく取れてるんだけどさ。
WebViewの描画領域のサイズ取りたいだけなら、以下で十分w
webView.scrollView.contentSize