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

betahikaruのブログ

まとめる前の頭の内容を吐き出す。まとめた物はQiitaなどで。

Backbone + Marionette

諸事情により使う必要があるので、勉強用リポジトリ立てた。

去年は色々リポジトリ立てたけど、それらのリストアップとか振り返りも後でしたい。

YAPC::Asia Tokyo 2014 Rebuild Meetup と YAPC::Asia Tokyo 2015 と 私

YAPC::Asia Tokyo 2015(ヤップシー エイジア トーキョー にせんじゅうご)

2014年の分も併せて書きました。

全体的に小学生の感想文みたいになりました。。。

※追記:タダ🍺情報に誤りがあったので修正しました。

YAPC::Asia Tokyo 2014

  • 去年は初YAPC::Asiaに行きました。
    • YAPC::Asia Tokyo 2014を知ったのは、rebuild.fmで @yusukebe さんがスポンサーしてたのを聴いたからだったと思う。
    • 生で@naoya さんと@miyagawa さんにお目にかかれたのにまず感動したのを覚えてる。
    • Cloaingの前のTalkとClosingの時には隣に@dankogai さんがいた。質疑応答界の救世主。
    • たしか @941 さんが以下のようなことを言っていて(これは今年のツイートだけど・・・)、体現しているのが@dankogaiさんだなーと思った。
    • 来年はハコないよやばい!という話で、どうなるのかなと思ってました。

Rebuild Meetup

  • 前夜祭 前日
    • 偶然? @miyagawa さんのPodcastRebuild - Podcast by Tatsuhiko Miyagawa ミートアップがあったので参加してきました。
    • 軽率に課金したサポーター勢なので、優先的にチケット取れました。
    • サポーターになると、Live音源のRAWデータ(?)をすぐさま入手できるので、オススメです。
      • rebuild.fm
      • gumroad.com
    • 🍺配布あり!(スーパーードゥルアアアアい)一番搾りでした!🍺)
    • とにかく楽しいMeetupでした。

YAPC::Asia Tokyo 2015

P.S. 彼は実家の犬です。寝転がっています。

以上、よろしくお願い致します。


@betahikaru id:betahikaru

iOSシミュレータでiOS8.1だとHTTP通信がエラーに

1・2年ぶりにiOSアプリの勉強を再開しています。が、早速ヤクの毛狩りに精を出してました。その結果をメモしていきます。

現象

iOSのバージョンによって、HTTP通信がエラーになったり通ったりする。 ログは以下。

2015-01-19 01:07:51.739 NetworkTest[11594:478081] error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7fdcb270bd70 {NSUnderlyingError=0x7fdcb266a910 "The network connection was lost.", NSErrorFailingURLStringKey=http://api.tiqav.com/search/random.json, NSErrorFailingURLKey=http://api.tiqav.com/search/random.json, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=57, NSLocalizedDescription=The network connection was lost.}

HTTP/HTTPS通信の可否とiOSのバージョンの対応。色々試した感じ、こうなった。iPhone6/plusはiOS8以降しか無いので、iPhone5sと同じだった。

2015/03/28 追記

原因は、ウイルスバスター for Mac でした。

これで解決!

Thanks for ... ios.steppers-hi.net

環境

検証ソース

(NSString)getHttpDataWithUrl:(NSString)url メソッドを見てください。

NetworkTest/ViewController.m at master · betahikaru/NetworkTest · GitHub

Qiita情報

明らかに以下と同じ現象だが、ウイルスバスター for Mac を一時的に切ってもうまくいかなかったりした。もう少し、(シミュレータ、XcodeMacの再起動、シミュレータ内のAllow HTTPS なんとかオプションのきりかえを)試してみようと思う。

iOS SimulatorでiOS8を動作させるとHTTP通信ができない - Qiita

経緯

そもそもは、iOSで非同期通信をしてJSONを読む処理を、以下の記事を参考に実装したかった。

SwiftでWebAPIアプリを作った時の要点 - Qiita

たまたま既存のObjective-Cのアプリがあったので、そこに書くために必死こいてObjective-C化した。 そしたらエラーになったので、原因が分かるまで(厳密にはまだ特定できてないが)大変な時間がかかった。。。

まとめ

むずかしいっすよiOSアプリ。

parse.com のrubyラッパー

Parse.com を使いたい。 Parse.comのSDKとして用意されているのは以下。

また、Parse.com 上で処理するCloud Code (Node.js with Express)もある。

ただ、Parse.comのSDKは、アプリ固有のキーを使って初期化する必要があるので、Javascriptのように外部にキーが公開されるのはよろしくない。やっぱりサーバサイドで処理を書きたい。。。

javaな人なのでrubyは勉強中ですが、今回SDKを組み込みたいソフトウェア(拙作のaws-portal)がruby製なので、Parse.comのREST APIrubyラッパーがないか?と探してみた。

Parse.comのrubyラッパー

たぶん以下の2つが主なGEMだとおもう。GitHubのページ見たら、作者が同じだった。

parse_resource

RailsActiveRecordのようなインタフェースでREST APIを使えるActiveResourceというgemのがあるのだが、ActiveResourceのインタフェースっぽくParse.comのAPIを使える。というものらしい。最新versionは 1.8.0(2013年リリース...)。

README.mdから、使い方を引用します。

modelはこんな感じに定義したり、検索したり、保存できるらしい。

class Post < ParseResource::Base
  fields :title, :author, :body

  validates_presence_of :title
end

p = Post.new

# validations
p.valid? #=> false 
p.errors #=> #<ActiveModel::Errors:0xab71998 ... @messages={:title=>["can't be blank"]}> 
p.title = "Introducing ParseResource" #=> "Introducing ParseResource" 
p.valid? #=> true 

# setting more attributes, then saving
p.body = "Ipso Lorem"
p.date = Time.now
p.save #=> true

# ActiveRecord style find commands
Post.find_by_title("Uncrunched") #=> A Post object

# batch save an array of objects
Post.save_all(array_of_objects)

ユーザ作成(Sign up)とログイン・ログアウトはこんな感じ。

# app/models/user.rb
class User < ParseUser
  validates_presence_of :username
  fields :name, :bio
  fields :email
end

# create a user
user = User.new(:username => "adelevie")
user.password = "asecretpassword"
user.save #=> true

# check if a user is logged in
User.authenticate("adelevie", "foooo") #=> false

# A simple controller to authenticate users
class SessionsController < ApplicationController
  def new
  end
  def create
    user = User.authenticate(params[:username], params[:password])
    if user
      session[:user_id] = user.id
      redirect_to root_url, :notice => "logged in !"
    else
      flash.now.alert = "Invalid username or password"
      render "new"
    end
  end
  def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Logged out!"
  end
end

すごく、"Railsっぽい"という印象。

parse-ruby-client

今多分一番使われている?っぽいGEM。公式のSDKと同じような使用感になっているっぽい。ところどころ"TODO: Implement this!"となっているのがやや気になるが…。 こちらも、README.mdから、使い方を引用します。

オブジェクトの作成は以下。

#ruby
game_score = Parse::Object.new("GameScore")
game_score["score"] = 1337
game_score["playerName"] = "Sean Plott"
game_score["cheatMode"] = false
result = game_score.save
puts result

これ、Javascript SDKとかiOSAndroid SDKのものと凄く近い。

// JavaScript
var GameScore = Parse.Object.extend("GameScore");
var gameScore = new GameScore();
 
gameScore.set("score", 1337); 
gameScore.set("playerName", "Sean Plott");
gameScore.set("cheatMode", false);
gameScore.save(null, {
  success: function(gameScore) {
    // ...
  },
  error: function(gameScore, error) {
    // ...
  }
});
// Ojbective-C
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = @1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore saveInBackground];

ユーザの作成(Sign up)、ログイン・ログアウトは以下。

# sign up
user = Parse::User.new({
  :username => "cooldude6",
  :password => "p_n7!-e8",
  :phone => "415-392-0202"
})
user.save

# login
user = Parse::User.authenticate("cooldude6", "p_n7!-e8")

# sign up by twitter o-auth
twitter_user = Parse::User::Twitter.new({
  "id" => "12345678",
  "screen_name" => "ParseIt",
  "consumer_key" => "SaMpLeId3X7eLjjLgWEw",
  "consumer_secret" => "SaMpLew55QbMR0vTdtOACfPXa5UdO2THX1JrxZ9s3c",
  "auth_token" => "12345678-SaMpLeTuo3m2avZxh5cjJmIrAfx4ZYyamdofM7IjU",
  "auth_token_secret" => "SaMpLeEb13SpRzQ4DAIzutEkCE2LBIm2ZQDsP3WUU"
})
twitter_user.save

あれ、ログアウトは、userをnilにすればいいのかな。 関係ないけど、rubyのnullってnilだっけ?swiftnilだけど。

まとめ

とりあえず parse-ruby-client を使えばいいんじゃないかな。