RedmineのWikiでハマった
Wikiで日本語使ったページ作るとInternal Server Error
ほんとにInternal Server Errorとしか出ず。まぁたぶん文字コードかなとググること20分。
↓これで解消
community.bitnami.com
これですね。
file\apps\redmine\htdocs\vendor\bundle\ruby\2.0.0\gems\actionpack-4.2.0\lib\action_dispatch\middleware\static.rb
from "path = File.join(@root, p)"
to "path = File.join(@root, p.force_encoding('UTF-8'))"
【Android】debug hash key
ターミナルなんて使う必要ないねん。
PackageInfo info; try { info = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md; md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String something = new String(Base64.encode(md.digest(), 0)); Log.e("hash key", something); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
【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が終わると破棄されるらしーぉ。