odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

hatena blogに移行しました。

hatena dialy → hatena blog 重い腰あげました。 コンバート機能よくできてました。

android4アプリを6(marshmallow)対応に

いろいろ調べたことのメモ書きです。 runtime permissionを対応する。 Android Marshmallow対応!Permissions事始め http://qiita.com/chihiro/items/314c1a69d2f2e122aad6googleのサンプルソース https://github.com/googlesamples/android-RuntimePermissi…

androidアプリをビルドしてバージョン別フォルダでサーバーへアップロードするスクリプト

aaptコマンドはパスを通す必要あり。 [androidSDKのパス]/build-tools/[version]/aapt # ビルド ./gradlew assembleStaging ./gradlew assembleRelease # バージョン名取得 versionName=`aapt dump badging app/build/outputs/apk/app-*-staging.apk | sed -…

android google analyticsでbuild flavor対応。

トラッキングIDである設定xmlファイル中のga_trackingIdの値をbuild flavorごとに切り替えたい。 当たり前にできると思ったが標準でできなそうで結局hack地味たことした。 android開発って罠多すぎるんだけど大丈夫かねgoogleさん。。 対処方法 Tracker t = …

sqlでlastIndexOf, rindexを行う

sql

下記でできた。 LENGTH(col1) - INSTR(REVERSE(col1), '#') 指定文字列の前か後の文字列を抜き出す場合 対象文字列 : hoge#hoge2#endendを抜く (最後の#より後を抜くSQL) (簡単) SELECT SUBSTRING_INDEX(col1, '#', -1) FROM (SELECT 'hoge#hoge2#end' col1)…

rubyでmemcachedのキーの一覧を表示する。また特定データを削除する等。

なんで作ろうと思ったか C#のmemcachedセッションライブラリがバグってて無期限データ入れやがったー。 そのまま放置して130万件にもなりやがった。 くそー 消したい。flush_allすると全データ消えて既存ユーザーが強制timeout扱いなるからそれは避けたい。 …

rails3.1で大きいデータ(csv等)をストリーミングで出力する方法

はじめに 管理画面等で膨大なデータをcsvで落としたい時等に そのままDBから文字列を作って返すと反応がないままタイムアウトになると思います。(なんせ全部メモリに落とすのだから) こういう場合の回避方法(2パターン) db等にリクエストをキューイングし…

class_inheritable_accessorからclass_attributeに移行する際の注意点

rails3.1でclass_inheritable_accessorがdeprecatedになりました。 warningメッセージ class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribut…

ActiveModelにある程度機能を組み込んだベースクラス

更新履歴 2011/9/28 rails3.1対応 2011/6/27 ActiveModelImplの継承の継承したクラス対応。 2011/6/23 リリース 概要 ActiveModelを使うとDBに保持しないモデルが作れます(ある程度ActiveRecord互換の機能が動く) ただしそのままでは簡単に使えなそげ。機…

ハッシュの値をアクセサで呼べるようにする

アクセサにしたい理由 viewで[]でアクセスするのはかっこわるい。ARと同様にアクセサがいい! 外部APIを叩いてJSONで返ってきたものをViewで使う場合など 実現方法 HashをStructに変換します 変換コード def self.hash_to_struct(hash) vals = *hash.values.…

rails2.3.8のXSSプラグインでlink_toの表示テキストがサニタイズされない問題直ってました

<%= link_to "<b>あいうえお</b>", :action => :index %> 2.3.8+XSSプラグインの結果 <b>あいうえお</b> 2.3.5+XSSプラグインの結果 あいうえお bタグが適用されてます (ちなみにlink_toの問題を把握してない人のために言うと、XSSプラグイン関係なく2.3.5以前のrailsでも…

ActiveRecordのDBコネクションの接続切れと再接続について。reconnectオプションは危険だなーとかも

ActiveRecordは基本ずっと接続をはりっぱなしにします。なので長時間接続をはりっぱなしにするため タイムアウト等で接続がきれると問題がでます。 MySQLでDBの接続がきれるタイミング 状況別 Railsの場合 HTTPリクエストのあるたびに接続が切れてないかを確…

MySQLでDBの接続がきれるタイミング

接続がきれるタイミング(環境によってはもっとあるでしょうが) MySQLのtimeout my.cnfのwait_timeout デフォルト値は8時間 SLBを経由してDB接続している場合はSLBのtimeout ipvsadm --set tcp tcpfin udp (set connection timeout values) デフォルト値は5…

composite_primary_keysのバグ修正で思ったこと。

見たくもないレガシーDBにアクセスする用事があるんですよこれが。(あー触りたくない) railsでは使うことのない複合プライマリキーが使われてたので これに対応するためにプラグインのcomposite_primary_keysを使いました。 ただちょいとバグがありで、rai…

classをカスタマイズするために再定義じゃなくてaliasしないとだめな場合がある話

当たり前といえば当たり前なaliasの挙動の話です。 わかってたはずなのに、とある状況だと気づかなかったのでメモります。 今回はまった部分は以下の部分の修正 ・railsでdb保存した場合に自動でcreated_at列に現在の時間が入る機能。 これををレガシーDBの…

set_primary_keyではまった。というかRailsレシピのあほー。set系メソッドでやっちゃった話

昔のアプリのDBにActiveRecordで繋げる必要がでたので プライマリキーの名前を変更するset_primary_keyというメソッドを使いました。 そしたら動かない。。idはない列ですとでる。 なんでだろ。。 Railsレシピの通りに書いてたのに。 (間違い版) set_prima…

複数プロセスからのファイル書き込み(追記の場合)における注意点

実行条件 100プロセス同時に5000行の書き込みを行う。 テストコード 100.times do pid = fork do open(File.join(File.dirname(File.expand_path(__FILE__)),"aaaaaaaaa.log"), 'a') do |f| f.sync = true # syncしないと文字列が途中でおかしくなる…

rubyでデコメのパース

前書き 受信したデコメをパースしたいと思います。 パーサーにはTMailを使用します。 Railsは使用しません。 空メの受け取り部分については書いてません。空メの内容を受け取った後の処理になります。 別にデコメに限らずただのテキストメールのパース、携帯…

rubyのバージョンアップでcapistranoの設置がうまくいかなくなった

最近rubyを1.8.6p369にアップしたんですが capistrano2.5.5+ruby1.8.6p369 だと複数の設置先がある場合に固まりました。 (パスワード入力までいかなかったり、パスワード入れれてもその後で固まったり。設置先が1箇所の場合は問題なくできました) rubyをr…

railsバッチの作り方

作り方 例えば検索インデックス登録用バッチとしてcreate_search_indexというバッチを作る場合 ファイル構成 app/ batch/ ← このフォルダを追加 create_search_index/ create_search_index_batch.rb - railsバッチを定義する create_search_index.sh.sample …

capistranoで複数のデプロイをしたい場合

設置の単位を分けたい場合があります。 例えばステージングと本番環境(プロダクション)や、ウェブアプリとバッチ等です。 やり方 deploy.rbファイルを用途別に作成する。 config/deploys/staging_web.rb(ステージングweb) config/deploys/production_web.r…

capistranoでssh越しのサーバーに設置する場合

sshでgatewayに接続した後、そこを踏み台として他のpc(Webサーバー,DBサーバー等)に繋いで作業する場合があると思います。 (設置先が自社サーバーではなく、外部のサーバーを使う場合やレンタルサーバー等で仮想環境を使用している場合等でしょうか) capis…

cronで秒単位でアプリを起動させたい。

ご存知の通りcronでは一番短い単位で1分ごとにしかアプリを実行できない。というわけで秒単位で起動できないかをググったら 30秒おきに稼動させたいならこうするらしい。 * * * * * myapp & sleep 30; myappけどこれだと5秒おきとかはcronの設定が大変なこと…

セッションがタイムアウトしてる状態でpostした場合

セッションをdbに格納してる場合は注意しないといけなそうです。例えば検索フォームを表示したままで放置して その後タイムアウトしてるのに検索をした場合(postする) InvalidAuthenticityTokenになりました。 挙動 セッションのストア先により動作が変わ…

willcomの高速化サービスでIP spoofing attackエラー

問題 rails2.1のサイト(リバースプロクシ使用)をwillcomの高速化サービスのプロクシ(フロントプロクシ)を使うと IP spoofing attack?! というエラーになってしまいました。 (恐らくこのエラーを出すようになったのは2.1からっぽい。) 理由 ソースをお…

単純にメンテナンス画面を出したい場合

routesで切り替えられます。(本当は上流のリバプロとか、アプリに機能を組み込むのがいいと思いますが。簡易的な技ということで)routes.rbの上のほうに下記追加(上に書くのは一番最初に判定してもらうため) #map.connect "*anything", :controller=>"mai…

クッキーを使わないでリクエストパラメータ(params)でセッションIDを渡す場合

諸事情でセッションIDがクッキーで渡されなく、リクエストパラメータ(クエリーストリングやpost等) で渡される場合がたまーにあります。 (外部アプリとの連携をする場合等に発生するケースが多いかなと思います。) こういう場合はsessionメソッドで:cook…

dbのマスタースレーブに対応するためにacts_as_readonlyableを使ってみる

日本最大規模のrailsを使ったサイトのクックパッドで改良して 使ってるとのことなので、そこそこ使えるのだろうとのことで 改良するの覚悟でチャレンジしてみました。下記がオフィシャルページ?(ただのblogの1ページだけども) http://revolutiononrails.…

mysqlでのdbのマスタースレーブに対応するのは厳しいねぇ。

先にいうと、あることはあるけど メンテされてなくて最新のrailsでは動きませんでし。 そのうち使えるようになるだろうと信じてのメモ書きです。 急いで使うなら自分で作るか、改良する必要になります。 magic multi connections findする際にモデルの頭に接…

thinでswfを扱う場合

前書き publicフォルダにswfをおいた場合に thinだとcontent-typeがtextになってしまうようです。 これだと携帯でのflash表示が失敗するので(mimeが違うとau,softbankは見れないっぽい。docomoは無視して表示するみたいだが) そのためflashのmimeをきちん…