49hack

見習いエンジニアが魔法使いになるまで

nginxでリバースプロキシするときにBasic認証を解除する

例えば、画像へのリクエストをnginxでS3にリバースプロキシしていると、テスト用のBasic認証で閉じられた環境で適用するとS3側で弾かれてしまいます。 サイト全体にBasic認証かけてる。 http { ... auth_basic "Restricted"; auth_basic_user_file "/path/to…

メソッドの引数にアスタリスクをつけると形式を指定できる

rubyのgemをいろいろ試している時に見つけたのでメモ。 methodで引数にアスタリスクを使うといい感じに値を取得することができます。 アスタリスク1つ*だと配列、アスタリスク2つ**だとハッシュを指定できます。 def foo(a, *b, **c) [a, b, c] end こうす…

link_toにconfirmメッセージを追加する

キャンセルやリセットの処理をするリンクにはconfirmを追加したい! Rails4では以下のようにヘルパーで実現できます。 link_to 'キャンセル', "/hoge/fuga", :data => {:confirm => 'キャンセルしてもいい?'} 参考 How to add confirm message with link_to…

railsで使えるメソッドとかハマったところとか

ちょっとたまってきたのでメモがてらまとめます。 1. Hashを逆順にする あるハッシュ h = { "1" => "a", "2" => "c", "3" => "y", "4" => "x" } を逆順の { "4" => "x", "3" => "y", "2" => "c", "1" => "a" } にしたい場合、Arrayのreverseが使えます。 rev…

秩父にキャンプにいってきました

最近キャンプにハマってます。 週末に秩父にある秩父巴川オートキャンプ場に行ってきました。 秩父には東京から都内から車で2〜3時間くらいで行けます。 行きに小松沢レジャー農園に寄り、しいたけ狩りをしてBBQ食材を調達しました。 ここでは、しいたけ狩…

omniauthでfacebook, google+のSNS連携を実装する

作業環境 $ ruby --version ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0] $ rails --version Rails 4.1.1 実装手順 必要なgemのインストール まずはomniauthをgemでインストールします。 gem 'omniauth' gem 'omniauth-facebook' gem 'om…

vimの小技メモ

vim

Vim幼稚園からVim小学校へ - Qiita で書かれていて勉強になった小技を忘れないようにメモっておきます。 W B:移動スピードアップ。 wを打つと次の単語の頭に、bを押すと前の単語の頭にジャンプする。大文字のWとBは記号を単語の一部とみなすのでジャンプ距…

rails4のenumはupdate_allで使うときは注意が必要

Rails4.1.0から使えるようになったenumがめちゃめちゃ便利です。 例えばUserモデルにstatusというINTのカラムがある場合、enumを使うと直感的に管理できるようになります。 class User < ActiveRecord::Base # ステータス: temporary (仮登録), active (本登…

gitをupdateしたら毎回ユーザ名、パスワードを求められるようになったので解消した

git

gitのバージョンが古かったのでbrewでバージョンアップしました。 $ brew update $ brew upgrade git $ git --version git version 2.3.5 すると、常にユーザ名、パスワードが求められるように。。 $ git pull origin master Username for 'https://github.c…

【随時更新】ActiveAdminのカスタマイズあれこれ

ActiveAdminをいろいろカスタマイズしてるのでそのメモです。随時更新しています〜。 セルに表示するコンテンツを増やす セルにはもともとデータが1つしか表示されませんが、+で増やすことができます。 ActiveAdmin.register Post do ... index do column :…

メールのテスト用にmailcatcherを導入する

テストメール用にmailcatcherを導入しました。command not foundと言われてちょっと焦る。。。rbenvを使ってる場合はrbenv rehashが必要です。 $ gem install mailcatcher $ mailcatcher zsh: command not found: mailcatcher $ rbenv rehash $ mailcatcher …

フォームのsubmitで確認ダイアログを表示する

知らない間に:confirmオプションは非推奨となり、dataで記述するようになってました。 <%= form_for(@task) fo |f| %> <div class="field"> <%= f.text_field :content %> </div> <div class="actions"> <%= f.submit "変更", data: { confirm: "ほんまに変更するで?"} %> </div> <% end %> それにしても:confirm…

HTMLEntitiesで特殊文字をencode/decodeする

HTMLEntitiesを使ってエンコード/デコードします。 gem 'htmlentities' HTMLEntities.new.encode("エンコードしたいやつ😃") HTMLEntities.new.decode("デコードしたいやつ&#9825;") 参考 How do I encode/decode HTML entities in Ruby? - Stack Overflow

配列の配列をHashに変換する

pluckで要素を2つ選ぶと配列の配列が生成されますが、このままだとちょっと扱いにくいのでHashにします。 a = User.order(:user_id).pluck(:user_id, :name) -> [[1, "taro"], [2, "jiro"], ...] 今回、user_idがユニークなのは保証されているので以下でOK…

date_selectで生成されるnameを変更する

select_dateでは受け取るパラメータを変更したい場合は、nameを変更する必要があります。 今回はgsubを使ってゴリゴリ置換で解決します(他にもっといい方法があるかもしれない)。 通常パターン select_date(Date.new) <select name="date_year" id="date[year]"> <select name="date_month" id="date[month]"> <select name="date_day" id="date[day]"> gsubを使って修正するパターン dat</select></select></select>…

KaminariでページングのURLにカスタムパラメータを追加する

Kaminariでページングを行う際、他のパラメータも追加したい場合はparamsオプションにハッシュを渡してあげればOKです。 基本的に現在のページのパラメータを引き継ぎたいことが多いのでこんな感じ。 <%= link_to_next_page @objects, "次ページへ", params:…

秘密鍵のパスフレーズを削除する

パスフレーズ入力するのが面倒なので削除することにしました。 一応名前を変えて保存。 $ mv ~/.ssh/id_rsa ~/.ssh/id_rsa.with_phrase パスフレーズなしで鍵を生成。 $ openssl rsa -in ~/.ssh/id_rsa.with_phrase -out ~/.ssh/id_rsa ちゃんと権限も更新し…

UILabelで文字に枠をつける

文字に枠を付けてくっきりさせます。 UILabelのカスタムクラスをつくってdrawTextInRectをオーバーライドします。 - (void)drawTextInRect:(CGRect)rect { CGSize shadowOffset = self.shadowOffset; UIColor *textColor = self.textColor; CGContextRef c =…

レスポンスにリレーションがない場合にCoreDataからも削除する

たとえば、次のようにcommunityとtopicにリレーションがあり、 RKEntityMapping *communityMapping = [RKEntityMapping mappingForEntityForName:@"HogeCommunity" inManagedObjectStore:managedObjectStore]; [communityMapping addAttributeMappingsFromDi…

「小さなチーム、大きな仕事」を読みました

読書再開しました。気になった点をメモがてらまとめます。 失敗から学ぶことは過大評価されている 失敗から学ぶ必要はない。してはいけないことについては学べるが、次になにをすべきかがわからない。一方で、成功から学ぶことは、次の手段を与えてくれる。…

iOSシミュレータでキーボードが表示されない

Xcode6にしてからなにかと変更点が多くてヤキモキしております。 iOSシミュレータが表示されない場合は以下で解決します。 iOS Simulator -> Hardware -> Keyboard 「Connect Hardware Keyboard」のチェックを外します 以前はハードウェアもソフトウェアも両…

UICollectionViewCellでAutoLayoutが効かない

iOS8SDKの既知の不具合として認識されているようです。 iOS8SDKをiOS7上で動かしたときに発現します。 CellのcontentViewのサイズが変更されていないのが原因なので、UICellectionViewCellのサブクラスに以下のコードを追加して対応します。 - (void)setBoun…

文字列をblowfish暗号化する

文字列を暗号化する方法のメモ。今回は可逆暗号化が目的なのでblowfishを使います。 Security.frameworkが必要なので、Build Phasesで追加してください。 #import <CommonCrypto/CommonCrypto.h> // 文字列をblowfish暗号化する + (NSString *)encodeBlowfish:(NSString *)str { NSData *k</commoncrypto/commoncrypto.h>…

iPhoneのWebViewでカスタムフォントを使う

アプリ全体のデザインを崩さないためにも、アプリ内のWebViewでも積極的にカスタムフォントを使いましょう。 使用したいカスタムフォントがアプリ内に入っている場合とそうでない場合で方法が若干異なります。 (カスタムフォントがmplus-1c-medium.ttfの場…

iOS7でUIViewアニメーションが機能しない

iOSの違いでUIViewアニメーションの挙動が違うので注意が必要です。 とりわけ「iOS6では動くのにiOS7では動かない」といった状況に陥ります。 iOS7ではUIViewアニメーションに関して変更があり、viewがまだ表示されていない状態(viewDidLoad, viewWillAppea…

脱獄端末のチェックをする

結局イタチごっこなのですが、、、脱獄対策のメソッドを書きました。 BreakThroughで脱獄回避のメソッドをすり抜けられちゃうので、BreakThroughそのもののチェックをしてみたり。 /* * 脱獄端末のチェック */ +(BOOL)isJailBreak { #ifdef DEBUG // デバッ…

ViewControllerがpresentされたのかpushされたのか判定する

ViewControllerがモーダルされたのかプッシュされたのか判定したい場合がしばしばあります。(例えば、モーダルのときは「閉じる」ボタン、プッシュのときは「戻る」ボタンに変更したいときとか。) if(self.presentingViewController != nil) { // モーダル…

cocos2d-xでダイアログを表示する

単純にダイアログを表示するだけであればCCMessageBoxを使えばいいですね。 CCMessageBox("メッセージ", "タイトル"); ただ、ボタンのタイトルは「OK」で固定されてるし、delegateはnilで受け取れません。 そのため、ダイアログからさらにアクションを起こし…

アプリがFacebookに認証済みかどうか判定する

Accounts.frameworkが必要です。 まあ、認証終わったあとにNSUserDefaultsにユーザIDなんかを保持しておくだけでもいい気がしますが、正式(?)な方法があるので一応メモしておきます。 ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAcco…

UIAlertViewを表示しているかどうかをチェックする

ユーザとして、ダイアログが複数回出てくるのはかなりストレスに感じます。 UIAlertViewの表示チェックを行うことで、それを回避します。 -(void)showDialog { // ダイアログを表示中かチェックする for (UIWindow* window in [UIApplication sharedApplicat…