読者です 読者をやめる 読者になる 読者になる

MacOSX 10.10.4のHomebewでpangoをインストールをする方法

Homebrewでupgradeしようとしたところ、pangoのupgradeで失敗していました。

$ brew upgrade -all

These open issues may also help:
Pango install fail on 10.11 (https://github.com/Homebrew/homebrew/issues/41086)
pango-1.36.8 failed to build on 10.10.3 (14D136) (https://github.com/Homebrew/homebrew/issues/40853)

Githubのスレッドで議論されていました。

github.com

以下のコマンドを実行して解決しました。

$ brew uninstall --force pango
$ brew rm gobject-introspection
$ brew install pango

JRuby+iTextでフォントを追加する方法

PDFで帳票を作成するプログラムを書いていて、デザイナーの方からニタラゴルイカというフォントを使いたいという話があり、それに対応しました。

以下のように、createFontメソッドに.ttfのPATHを渡すことで、ニタラゴルイカを利用することができました。

java_import 'com.itextpdf.text.pdf.BaseFont'

bf = BaseFont.createFont(Rails.root.join('lib').join('NitalagoRuikaMono-01.TTF').to_s, BaseFont::IDENTITY_H, BaseFont::EMBEDDED)
directcontent.setFontAndSize(bf, 6)
directcontent.setRGBColorFill(0, 0, 0)
directcontent.moveText(100, 150)
directcontent.showText('This is test.')
directcontent.endText

参考:竹形誠司 ブログ:Java+MySQL+Tomcat:iText(PDFライブラリ)で使えるフォント

「SwiftでResearchKit チュートリアル」をやってみた

まだまだ私のまわりでは利用者の少ないResearchKitですが、ちょっと使ってみたい実験フィールドがあり、昨日から勉強をしています。私にとっては公式ドキュメントよりも以下のチュートリアルが役に立ちました。

www.raywenderlich.com

consent, survey, active task

ResearchKitは医学研究のためのライブラリで、調査(アンケート)の質問のための様々な部品が用意されています。また、大きく分けると以下の3種類の質問があります。

  • consent
  • survey
  • active task

consentは調査対象者に同意を取る画面を生成する機能で、調査の趣旨や個人情報の取り扱いについて表示する機能や、クレジットカード決済のように本人に署名してもらう機能が用意されています。

surveyは調査の質問を生成する機能で、自由記述や選択式の質問だけでなく、尺度を聞くような質問もサポートされています。

active taskは調査対象者に特定の行動をしてもらい、その評価結果を取得する機能です。例えば、タブレット端末の画面をタップする反応性などを評価する機能が用意されています。

インストール

まずXcodeでSingle View Applicationを作成します。次に、GitHubからファイルを取得します。

$ git clone -b stable https://github.com/ResearchKit/ResearchKit.git

取得したファイルの中のResearchKit.xcodeprojをプロジェクトにドラッグします。

f:id:kaorumori:20150627010647p:plain

Embedded BinariesにResearchKit.frameworkを追加します。

f:id:kaorumori:20150627010811p:plain

f:id:kaorumori:20150627010838p:plain

同意画面の作成

同意画面を作成していきます。ConsentDocument.swiftというファイルを作成して、以下のように記述します。

import Foundation
import ResearchKit

public var ConsentDocument: ORKConsentDocument {
    
    let consentDocument = ORKConsentDocument()
    consentDocument.title = "Example Consent"
    
    //TODO: consent sections
    let consentSectionTypes: [ORKConsentSectionType] = [
        .Overview,
        .DataGathering,
        .Privacy,
        .DataUse,
        .TimeCommitment,
        .StudySurvey,
        .StudyTasks,
        .Withdrawing
    ]
    
    var consentSections: [ORKConsentSection] = consentSectionTypes.map { contentSectionType in
        let consentSection = ORKConsentSection(type: contentSectionType)
        consentSection.summary = "If you wish to complete this study..."
        consentSection.content = "In this study you will be asked five (wait, no, three!) questions. You will also have your voice recorded for ten seconds."
        return consentSection
    }
    
    consentDocument.sections = consentSections
    
    //TODO: signature
    consentDocument.addSignature(ORKConsentSignature(forPersonWithTitle: nil, dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature"))
    
    return consentDocument
}

次にConsentTask.swiftというファイルを作成します。

import Foundation
import ResearchKit

public var ConsentTask: ORKOrderedTask {
    
    var steps = [ORKStep]()
    
    //TODO: Add VisualConsentStep
    var consentDocument = ConsentDocument
    let visualConsentStep = ORKVisualConsentStep(identifier: "VisualConsentStep", document: consentDocument)
    steps += [visualConsentStep]
    
    //TODO: Add ConsentReviewStep
    let signature = consentDocument.signatures!.first as! ORKConsentSignature
    
    let reviewConsentStep = ORKConsentReviewStep(identifier: "ConsentReviewStep", signature: signature, inDocument: consentDocument)
    
    reviewConsentStep.text = "Review Consent!"
    reviewConsentStep.reasonForConsent = "Consent to join study"
    
    steps += [reviewConsentStep]
    
    return ORKOrderedTask(identifier: "ConsentTask", steps: steps)
}

ViewController.swiftを以下のように編集します。

import UIKit
import ResearchKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func consentTapped(sender : AnyObject) {
        let taskViewController = ORKTaskViewController(task: ConsentTask, taskRunUUID: nil)
        taskViewController.delegate = self
        presentViewController(taskViewController, animated: true, completion: nil)
    }
}

extension ViewController : ORKTaskViewControllerDelegate {
    func taskViewController(taskViewController: ORKTaskViewController, didFinishWithReason reason: ORKTaskViewControllerFinishReason, error: NSError?) {
        //Handle results with taskViewController.result
        taskViewController.dismissViewControllerAnimated(true, completion: nil)
    }
}

あとはボタンを作成して、そのボタンのタップにViewControllerのconsentTappedを関連付けます。これで同意画面が動作するようになりました。surveyとactive taskも基本的なやり方は同様でした。

来月の実験(イベント)に向けて、ResearchKitを利用したアプリの開発を進めていく予定です。

NokogiriでCP932のWebページの処理ができなかった際の対処

以下のサイトの情報を参考にして、CP932のWebサイトをNokogiriで処理していました。

qiita.com

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML.parse(open(url).read, nil, "CP932")

このコードはMacOSXのHomebrew+rbenv環境では動作していたのですが、なぜかLinux上のソースからコンパイルしたRubyでは動作しない状況になりました。

以下のようにencode()を使うことで、Linux上の環境でも動作させることができました。

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML.parse(open(url).read.encode('UTF-8'))

JRuby環境でRailsを動かすためにJavaのJCEをインストール

JRuby環境でRailsを動かすための環境を構築しました。まず、MacOSXにHomebrewでJavaをインストールします。

$ brew cask install java

~/.bash_profileにJAVA_HOMEを設定します。

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8.0_45)"

Javaのバージョンが更新されました。

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

このJava環境のJRubyRailsを動かすと、以下の様なエラーが出力されました。

OpenSSL::Cipher::CipherError in WelcomeController#index
java.security.InvalidKeyException: Illegal key size: possibly you need to install Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for your JRE

Java Cryptography Extension (JCE)のエラーのようで、以下のサイトによると、関連するファイルを更新すれば解決できることがわかりました。

OracleのサイトからJava8のためのファイルをダウンロードします。

ダウンロードしたファイル (ZIPファイル)を展開してJAVA_HOME/jre/lib/securityのファイルに上書きします。この手順でJCEに関するエラーが表示されず、正常にJRuby+Railsが動作するようになりました。

RailsでHTTP_ACCEPT_LANGUAGEの情報から表示言語を切り替える方法

Railsで国際対応のアプリを作っていて、HTTP_ACCEPT_LANGUAGEから表示言語を取得する処理を書くことがありました。HTTP_ACCEPT_LANGUAGEには表示する優先順位の情報があり、その処理を書くのは少し面倒でした。きっと誰かがライブラリを作っているはずと思って調べたら、ありました。

github.com

Gemfileに以下の記述を追加してbundleコマンドを実行します。

gem 'http_accept_language'

application_controller.rbに以下のような記述を追加します。

class ApplicationController < ActionController::Base
  before_action :set_locale

  private
    def set_locale
      I18n.locale = http_accept_language.compatible_language_from(I18n.available_locales)
    end
end

実際に私が書いているコードでは、ユーザの設定した言語を最優先にして、その設定が無ければhttp_accept_languageに処理を渡すようにしています。

Rails4でmailtoのメールアドレスをエスケープする方法

mailtoのリンクの作成する際、Railsではエスケープしてくれる方法があって使っていました。Rails 4ではエスケープしてくれなかったので調べてみたら、Railsの拡張のGemとして切りだされていました。Rails 4で利用するために、Gemfileに以下の記述を追加しました。

gem 'actionview-encoded_mail_to'

www.techscore.com