情報系人間のブログ

プログラミング、開発に関することを書いていきます。

cocoapodsにiosライブラリを登録する

普段cocoapodsには非常にお世話になっていて自分も何か公開したいなと思い初めてライブラリを登録した。
手順をメモしておく。

ライブラリのテンプレート作成

始めにライブラリのテンプレートを作成する。

pod lib create "pod name"

この際デモを作成する方が良い。

podspecのバリデーション

ライブラリを作成後、podspecを編集後にlintコマンドでバリデーションを行う。

pod spec lint

動作確認

ライブラリが完成したらローカルからpod installして正常に動作するか確かめる。
テスト用のプロジェクトを作成し、podfileに以下を記述する。

pod "ライブラリ名", :path => 'ライブラリのパス'

pod installを実行して動作を確認する。

開発者登録

次に開発者登録を行う。コマンドを実行後、認証メールが届く。

pod trunk register "email" "name" —description="description"

公開

最後にpushする。

pod trunk push "podspec_file"

登録するとCocoapodsのtwitterから新規登録情報がツイートされる。
これだけの作業でcocoapodsにライブラリを登録可能である。非常に便利。

iosアプリのクラッシュログを解析する

App storeに申請後、クラッシュを理由にリジェクトされたのでその際のログ解析方法のメモ。

必要なファイル

.dSYMファイル
.crashファイル
の2つ

  • .dSYMファイル
/Users/[ユーザ名]/Library/Developer/Xcode/Archives/[yyyy-mm-dd]/[アプリ名].xcarchive

にアーカイブ・ファイルがある。このファイルを「パッケージの内容を表示」で開くとdSYMフォルダがあり、その中に.dSYMファイルがある。

  • .crashファイル

itunes connectのマイApp内、問題解決センターからダウンロード。拡張子は.txtになっている。

解析方法

symbolicatecrashを使用してクラッシュログをシンボル付きのログに変換する。
symbolicatecrashコマンドは結構深いところにあるのでシンボリックリンクを作っておくと良い。

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

そして実行

symbolicatecrash  .crashファイル .dSYMファイル 

これで
変換前

0   Zn1clipboard       0x0000000100059240 0x100044000 + 86592

返還後

0   Zn1clipboard       0x0000000100059240 Zn1clipboard.Groups.load (Zn1clipboard.Groups)() -> () (Groups.swift:0)

のようにアドレスからシンボルが付与されてソースコードのどの部分でクラッシュしたかが分かるようになる。

プロ野球の結果をスクレイピングする

スクレイピングについて勉強したいと思いプロ野球の結果を取得するコードを書いてみました。
データ取得元はこちら
スポーツナビ

Rubyで書いたのですが、nokogiriというライブリが非常に便利でした。
最低限動くだけならかなり簡単に書くことができますし、かなり実用的だと思います。
ですかスクレイピングは法律関係が色々あるので実際使うとなると難しいですね。

scrape.rb

# -*- coding: utf-8 -*-
require 'mechanize'
require 'nokogiri'

date = ARGV[0]

page = Mechanize.new.get("http://baseball.yahoo.co.jp/npb/schedule/?&date=" + date)
doc = Nokogiri::HTML.parse(page.body)

doc.xpath('//table[@class="yjMS mb5"]/tr').each do |node|
  
  # team
  node.xpath('td[@class="today pl7"]/a').each do |elem|
    p elem.text
  end

  # startTime ballPark
  node.xpath('td[@class="today pl7"]/em').each do |elem|
    /(\d{2}:\d{2})(.+)/ =~ elem.text
    p $1
    p $2.gsub(" ", "")   
  end

  # score inning
  node.xpath('td[@class="today ct"]').each do |elem|
    if /(\d+) - (\d+)/ =~ elem.text
      p $1
      p $2
      p elem.text
    end

    elem.xpath('a').each do |inning|
      p inning.text
    end
  end

  # pitchers
  node.xpath('td[@class="today"]/table/tr').each do |elem|
    p elem.xpath('td[@class="w"]').text.gsub(/[[:space:]]/,"")
    p elem.xpath('td[@class="s"]').text.gsub(/S[[:space:]]/,"")
    p elem.xpath('td[@class="l"]').text.gsub(/[[:space:]]/,"")
  end
  
end

使い方
引数に日付をYYYYMMDD形式で指定します。

ruby scrape.rb 20150823

出力

ホームチーム
アウェイチーム
開始時間
球場
ホームチームの得点
アウェイチームの得点
試合のスコア
進行状況
勝利投手
セーブ投手
敗戦投手

が出力されます。