JavaScript の Array で forEach したときに break するには

jQuery.each メソッドだと、return true で continue, return false で break できます。 しかし、node で普通に array.forEach で同じようにやろうとしたらできない。 node の実装つまり ECMAScript 5 においては、array.forEach に break 処理はない。代わりに some メソッドを使うと意図したことができることがわかった。 1 2 3 4 5 6 7 8 9 array.some(function(item){ if (item.isEmpty) { return false; // continue } if (item.isLast) { return true; // break } }); some メソッドは、要素に対して評価(コールバック)関数を実行し、true になるものが一つでもあれば true を返します。これが本来の用途です。

2012年11月14日 · Toshimitsu Takahashi

iOS 6 の新しいアクションシート機能を UIActivityViewController で実装する (2)

iOS 6 の新しいアクションシート機能を UIActivityViewController で実装する - Tosshi Note で iPhone アプリへのアクティビティ連携の実装方法を書きました。 そのiPad版です。例によって、UIPopoverController を使います。UIActivityViewController をコンテントビューコントローラとしてラップします。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - (IBAction)actionButtonPressed:(id)sender { NSString *ttl = @"Tosshi Note"; NSURL *url = [NSURL URLWithString:@"http://d.hatena.ne.jp/tilfin/"]; NSArray *activityItems = [NSArray arrayWithObjects:ttl, url, nil]; UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; _actionPopover = [[UIPopoverController alloc] initWithContentViewController:actionViewController]; [_actionPopover presentPopoverFromBarButtonItem:_actionButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; [activityView release]; } 上記の _actionPopover はそのまま present して autorelease するとメモリアクセス不正で落ちるので、dismiss以降にリリースをかけましょう。

2012年10月23日 · Toshimitsu Takahashi

iOS 6 の新しいアクションシート機能を UIActivityViewController で実装する

iOS 6 から Safari やカメラロールなどのアクションボタンをタップすると、タイル状に並んだアイコンから [Twitter や Facebook への共有機能などが呼び出せるようになりました。 下記のように、OS標準以外のアプリにもこの機能を簡単に追加できます。 このアクションシートの機能は UIActivityViewController に集約されているので、これを呼び出すだけです。ただ単純にコピペ実装できるエントリが見つからなかったので紹介しておきます。 上記のように、よくある Twitter, Facebook などにテキストとURLを投稿するときの方法です。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - (IBAction)actionButtonPressed:(id)sender { NSString *ttl = @"Tosshi Note"; NSURL *url = [NSURL URLWithString:@"http://d.hatena.ne.jp/tilfin/"]; NSArray *activityItems = [NSArray arrayWithObjects:ttl, url, nil]; UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; [self presentViewController:activityView animated:YES completion:^{ }]; [activityView release]; } UIActivityViewController の initWithActivityItems:applicationActivities: メソッドを使って、activityItems には NSString と NSURL を NSArray にまとめて渡します。 applicationActivities には、独自のアクティビティ(機能)を渡すことでさらに追加できます。今回は、システムの標準に従って表示させるため、nil にしています。 表示させたくないアクティビティは、excludedActivityTypes プロパティに、以下の Built-in Activity Types 定数を使って NSArray でセットします。 http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIActivity_Class/Reference/Reference.html Built-in Activity Types の項には、それぞれアクティビティの説明に activityItems に指定できるリソースが書かれています。

2012年10月12日 · Toshimitsu Takahashi

iOS バージョンとデバイス対応のまとめ

未明に iPhone 5, iPod touch (5th generation) の発表がありました。 開発用に今後の端末のバージョンバリエーションをどうするか考えるため、まとめておく。 最新 iOS 6.0 まで対応するデバイス iPhone 5 *, iPhone 4S, iPhone 4, iPhone 3GS iPod touch (5th generation) *, iPod touch (4th generation) iPad (3rd generation), iPad 2 * ディスプレイ 1136×640 ピクセル 既にバージョン対応が止まっているデバイス iOS 5.1.1 iPad (1st generation) iPod touch (3rd generation) iOS 4.2.1 (マルチタスク非対応) iPhone 3G iPod touch (2nd generation) iOS 3.1.3 iPod touch (1st generation) iOS 5 以上であれば端末のみでアップグレードできるため、既存端末への普及は普通に進むと思われる。零細開発者としては「iOS 5 未満は切り捨て」が現実的なところだろうか。

2012年9月13日 · Toshimitsu Takahashi

Ruby で Google Analytics から直近1時間のページビューランキングを取得する方法

サイトのアクセスランキングを作る方法はいろいろありますが、自前で HTTPサーバのログから計算するのは大変です。Google Analytics の API を使うとアクセス数が Ruby には Google Analytics API を操作できる Garb という便利なラッパーライブラリがあります。今回はこれを使います。 Garbのインストール gemで入れます。プロジェクトは GitHub で管理されています。 https://github.com/vigetlabs/garb # gem install garb Fetching: crack-0.3.1.gem (100%) Fetching: i18n-0.6.1.gem (100%) Fetching: activesupport-3.2.8.gem (100%) Fetching: garb-0.9.1.gem (100%) Successfully installed crack-0.3.1 Successfully installed i18n-0.6.1 Successfully installed activesupport-3.2.8 Successfully installed garb-0.9.1 4 gems installed スクリプト本体 それほど長くないので、まずソースコードを貼っておきます。 #!/usr/bin/ruby1.9.1 # coding: utf-8 require ‘rubygems’ require ‘garb’ require ‘uri’ Garb::Session.login(’<アカウント>’, ‘<パスワード>’) profile = Garb::Management::Profile.all.detect { |p| p.web_property_id = ‘<サイトプロパティID>’ p.id = ‘<アカウントID>’ } class PageTitle extend Garb::Model metrics :pageviews dimensions :hour, :page_path, :page_title end today = Time.now - 3600; start_date = today end_date = today hour = today.hour if hour < 10 hour = “0” + hour.to_s else hour = hour.to_s end cond = { :limit => 20, :sort => :pageviews.desc, :start_date => start_date, :end_date => end_date, :filters => { :hour.eql => hour } } rs = PageTitle.results(profile, cond) rs.each do |r| puts r.page_path # ページパス puts r.page_title # ページタイトル puts r.pageviews # ページビュー end ...

2012年9月5日 · Toshimitsu Takahashi

リバースプロキシの Nginx でバックエンドの X-Powered-By ヘッダを消すには

バックエンドサービスが何で動いてるのかどうしてわかるのか不思議に思っていたら、X-Powered-By という拡張 HTTP ヘッダにフレームワークの情報が入ってることに気付いた。 ということでセキュリティホールがあったときによろしくないので、消すことにした。 Nginx で消すにはこんな感じに定義する。 server { proxy_hide_header X-Powered-By; } 全体にかける。 server { location / { proxy_hide_header X-Powered-By; } } ロケーション別にかける。

2012年8月23日 · Toshimitsu Takahashi

Ubuntu 12.04 に Redmine 2.0.3 を構築した時の Apache + Passenger の設定

Ruby 1.9 で Passenger を動かすために試行錯誤したのでメモしておく。基本的には、アップグレード — Redmine Guide 日本語訳 などを参考にする。 Passenger のインストール $ sudo apt-get install libcurl4-openssl-dev $ sudo apt-get install apache2-prefork-dev $ sudo gem1.9.1 install passenger $ cd /var/lib/gems/1.9.1/gems/passenger-3.0.13 $ sudo ./passenger-install-apache2-module Apache + Passenger の設定 /etc/apache2/mods-available/passenger.load LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-3.0.13/ext/apache2/mod_passenger.so #LoadModule passenger_module /usr/lib/apache2/modules/mod_passenger.so /etc/apache2/mods-available/passenger.conf PassengerRoot /var/lib/gems/1.9.1/gems/passenger-3.0.13 PassengerRuby /usr/bin/ruby1.9.1 #PassengerRoot /usr #PassengerRuby /usr/bin/ruby PassengerDefaultUser www-data VirtualHostの設定 $ ln -s /web/example.local/redmine /web/redmine-2.0.3 上記のようにシンボリックリンクが張ってある。 <VirtualHost *:80> ServerName example.local DocumentRoot /web/example.local RailsBaseURI /redmine <Directory /web/example.local/redmine/public> PassengerAppRoot /web/redmine-2.0.3 ...

2012年8月3日 · Toshimitsu Takahashi

Node + Express + EJS で実行環境に応じて出力を変えるには

クライアントの JavaScript をRAWコードと圧縮版の指定を切り替えたいのが目的です。 単純に min.js だったら .js に置換するように、Nginx などの Rewrite を使うこともできると思ったんですが、複数のファイルを一つに圧縮しているため、それだけでは満たせませんでした。 ということで、EJS に NODE_ENV に相当するフラグを渡すようにして、切り替えるようにしました。 Express - app.js app.configure(‘development’, function(){ app.set(‘view options’, { PRODUCT: false }); }); app.configure(‘production’, function(){ app.set(‘view options’, { PRODUCT: true }); }); 上記のように PRODUCT を「view options」にそれぞれセットします。 <% if (PRODUCT) { -%> <% } else { -%> <% } -%> common.js と detail.js を合わせて圧縮してのが detail.min.js です。

2012年7月21日 · Toshimitsu Takahashi

WordPress をフロント Nginx のリバースプロキシ下で運用する場合に 管理画面を SSL に強制する設定

Nginx をフロントにおいて高速化するのは常套手段ですが、そのときに WordPress の wp-admin(管理画面)は SSL を有効にしたいときの設定方法です。 Nginx の設定 # HTTP server # server { listen 80; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } \# HTTPS server # server { listen 443; ssl on; ssl_certificate ssl/cert.pem; ssl\_certificate\_key ssl/cert.key; ssl\_session\_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl\_prefer\_server_ciphers on; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Proto https; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } 環境変数 HTTP_X_FORWARDED_PROTO を使って Nginx が受けたのは http か https かを後ろのサービスに伝えます。 ...

2012年5月7日 · Toshimitsu Takahashi

Ubuntu のユーザ管理を LDAP Account Manager でするようにした

Ubuntu 12.04 LTS も出たのでさくらVPSで色々とセットアップ中です。Unix のユーザ管理は、LDAPで行うようにし、かつLDIFを一から書くのは面倒なので LDAP Account Managerを使うようにしました。その時のメモです。 諸々のパッケージをインストール # apt-get install slapd # apt-get install ldap-account-manager # apt-get install libnss-ldap # apt-get install ldap-utils LDAP サーバとLDAP Account Managerの再セットアップ時のコマンド 上記インストール時にも同様の設定入力はあります。 # dpkg-reconfigure slapd # dpkg-reconfigure ldap-account-manager LDAP Account Manager 設定で指定したマスターパスワードと標準のlamプロファイル(デフォルトパスワード:lam)の状態でセットアップされます。 Apache2を使うようにインストールしていれば、http://<ホスト>/lam/ でブラウザから操作できます。 右上の「LAM configuration」から「Edit server profiles」で「ldm」プロファイル設定に入ります。 [General settings]では「Security settings」のcn=Manager〜の部分をslapdのセットアップで指定した管理ユーザにします。 [Account types]では Samba は使わないのでこれを Remove します。 その他 dc も自分のドメインに合わせてそれぞれ設定します。 トップページから管理ユーザのパスワードでログインして、Unixで使うグループとユーザーをそれぞれ追加します。 ※ユーザーのパスワードはセットしてからSaveしないと保存されないので注意。 さらにバインドユーザー proxyuserを、「Tree View」から「import」で下記のLDIFを使って作成します。 dn: cn=proxyuser,dc=mydomain,dc=com cn: proxyuser objectclass: userPassword userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ※パスワードは、slappasswd コマンドで生成しておきます。 ...

2012年4月29日 · Toshimitsu Takahashi