hello_world.py

"Doing good is part of our code"

ParseのAndroidStudioでの使い方(前編)


最近クッソお世話になっているParseのAndroidStudioでの使い方のメモ。




MBaaSとは



BaaS 【 Backend as a Service 】 MBaaS / Mobile Backend as a Service
スマートフォン向けのWebアプリケーションが必要とするサーバ側の様々な機能をインターネットを通じてサービスとして提供するクラウドサービスの一種。
提供される機能はサービスにより様々だが、利用者情報の登録・管理や認証、データの保管、プッシュ通知、課金・決済、ソーシャルメディアとの連携などが実装されていることが多い。アプリケーション開発者はこれらの機能のAPIを呼び出すよう設定することで、自らのアプリケーションの一部として取り込むことができる。
出典: BaaSとは 【 MBaaS 】 【 Backend as a Service 】 - 意味/解説/説明/定義 : IT用語辞典

代表的なものの中に、Parse, Google Cloud Platform, Microsoft Azure Mobile Services, niftyとかがある。


Parseとは(めっちゃざっくり)

f:id:tanajun99:20150310022144p:plain


http://www.parse.com/


ParseとはMBaaS(Mobile Backend as a Service)で最も有名なサービスの一つ。基本的なクラウド機能やユーザー登録(email, username, facebook, twitterログイン)はもちろんのこと、プッシュ機能や解析機能もついていて、簡単に導入することができる。30req/sまでは無料で使うことができて、それ以降は10req/sごとに$100/monthずつ上がっていく。MongoDBみたいなNoSQLで、テーブルのカラムを定義しなくてもデータ保存が自由。プラットホームも豊富で、iOS, Android, Windows, Unity, Xamarinまである。有名なあーんな企業やこーんな企業が使っている。2013年にFacebookに買収された。


Android Studioでの使用方法

まずはめっちゃおしゃれなWebサイトからSign up して、Access Dashboardにはいり、Create a new Appで自分の開発するアプリを登録する。すると下のような感じになるので、Quick Startする。

あとは流れに沿ってmobile→Android→Native(Java)→Exist or Newで作成。Install the SDK のページに飛ぶので、Download the SDKからダウンロードする。そのあと、解凍したファイルから.jarのファイルを選び、libsに保存。

build.gradleに以下を追加し、ビルドする。

dependencies {
    compile 'com.parse.bolts:bolts-android:1.+'
    compile fileTree(dir: 'libs', include: 'Parse-*.jar')
}

ビルドが終わると各Parse オブジェクトがimportできるようになる。


AndroidManufest.xmlにNetwork-permissionの二行を追加する。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

ApplicationクラスのonCreate()メソッドに、以下を追加。Application ID とClient Keyはランダムな文字列が自動で生成。

Parse.enableLocalDatastore(this);
 
Parse.initialize(this, "Application ID", "Client Key");

以上がすべておわったら、Activityに以下を追加してテスト。

ParseObject testObject = new ParseObject("TestObject");
testObject.put("foo", "bar");
testObject.saveInBackground();

Congratulation!となると、成功。


ユーザー登録機能

ユーザー登録の実装。activity_sign_up.xmlにeditTextでinputTypeがemail, password, password(again)のものをつくる。SignUpActivityのonCreate()に以下を追加。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        emailEditText = (EditText) findViewById(R.id.email_sign_up);
        passwordEditText = (EditText) findViewById(R.id.password_sign_up);
        passwordAgainEditText = (EditText) findViewById(R.id.password_again_sign_up);
  //----------パスワード等の記入もれをはじくコード書く。今は省略。
        mActionButton = (Button)findViewById(R.id.sign_up_button);
        mActionButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                signup();
            }
        });
private void signup(){

        String userEmail = emailEditText.getText().toString().trim();
        String password = passwordEditText.getText().toString().trim();
        String passwordAgain = passwordAgainEditText.getText().toString().trim();
        //ParseUserオブジェクトを呼び出してメールとパスワード登録
        ParseUser user = new ParseUser();
        user.setEmail(userEmail);
        user.setPassword(password);
        user.signUpInBackground(new SignUpCallback() {
            @Override
            public void done(ParseException e) {
                // 
                if (e != null) {
                    // エラーメッセージ
                    Toast.makeText(SignUpActivity.this, e.getMessage(),
                            Toast.LENGTH_LONG).show();
                } else {
                    // 次のアクティビティ起動
                    Intent intent = new Intent(SignUpActivity.this, NextActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }
        });
}

この時addFlagsしないと戻るボタン押した時ややこしくなるので注意。





本当はこんなことをまとめたかったのではなくて、Facebook連携とか、ログインとか、データをまとめたかったのですが、時間がないので明日また書きます。


今作成中のandroidSNSアプリをなんとか今週中にストアにあげて、密かに勉強しているSwiftiOSアプリ作成やpythonでの機械学習にもっと時間を使いたい、、、、

春休みもあと少ししかないので、これからもエンジンかけてがんばります。











最近、花粉症を1日で治しました。

検索エンジンの原理 by Python

久しぶりの1日オフです。

最近ずっと会社のほうではAndroidばかりしてたので、かなり久しぶりにPythonとかFlaskとかwebに関するメモを読み返していたら、4ヶ月ぐらい前にUdacity等で勉強してた検索エンジンの内容があったので、復習がてらここにまとめてみようと思います!とりあえず、Webクローラーの原理までまとめて、続きは次回時間あるとき、気が向いたらすることにします!

検索エンジンの仕組み


Googleに代表される検索エンジンは誰でも一度は使ったことがあるとおもうのですが、そのロジック的なことについてかいていきます。

Googleの場合、ユーザーが検索エンジンを使用する時、実はWebをそのまま検索しているわけではありません。Googleの持つwebのindex(索引)、すなわちGoogleが見つけ、情報を集めることのできたものの中から検索しています。

つまり検索処理は、検索キーワードが入力されるはるか前から始まっています。GoogleではWebクローラと呼ばれるソフトウェアロボットを使い、 検索結果に表示するためのウェブページを探します。そしてGoogleのソフトウェアはこれらのページに関するデータをデータセンターに保存し、検索時にはその中から情報を取り出しているのです。

Google のindexは 1 億ギガバイトを超え、indexの構築に費やした処理時間は累積で 100 万時間を超えているらしいです。

多すぎわろた。

そして検索時には、Rank付けのアルゴリズムによって200個以上の要素を瞬時に処理し、ランクずけして、検索画面に表示されます。このアルゴリズムは、改良に改良を重ね、進化していているらしいです。

・Webクローラー

Webクローラーはあるページをクロールした時に、正しくリンクをみつけ、そのリンクをたどっていくのですが、この時に制限をかけないと無限にクロールしてしまうので、深さ(リンクをどの階層までたどるか)を考える必要があります。

# pageというhtmlを文字列化したものの中から、URLを探し出す
def get_next_target(page):
    start_link = page.find('<a href=')
    if start_link == -1:
        return None, 0    
 #pageからURLのみを取り出すためにURLの最初と最後の"を抽出
    start_quote = page.find('"', start_link)
    end_quote = page.find('"', start_quote + 1)
    url = page[start_quote + 1:end_quote]
    return url, end_quote

def print_all_links(page):
    while True:
        url, endpos = get_next_target(page)
        if url:
            print url
            page = page[endpos:]
        else:
            break

#例外で、上で取り出したURLがない場合を処理
 def get_page(url):
    try:
        import urllib
        return urllib.urlopen(url).read()
    except:
        return ""

def union(p,q):
    for e in q:
        if e not in p:
            p.append(e)

#全てのリンク
def get_all_links(page):
    links = []
    while True:
        url,endpos = get_next_target(page)
        if url:
            links.append(url)
            page = page[endpos:]
        else:
            break
    return links

#深さ優先探索。深さを指定することで、効率よくクローリング
def crawl_web(seed,max_depth):    
    tocrawl = [seed]
    crawled = []
    next_depth = []
    depth = 0
"""
 一度クローリングしたページを重複しないようにtocrawlから終了したページをとりだし、crawldに順番に格納
"""
    while tocrawl and depth <= max_depth:
        page = tocrawl.pop()
        if page not in crawled:
            union(next_depth, get_all_links(get_page(page)))
            crawled.append(page)
        if not tocrawl:
            tocrawl, next_depth = next_depth, []
            depth = depth + 1
    return crawled

これが、最低限の機能は持ち合わせているクローラーです。


ブログとして自分の勉強内容をまとめたのは初めてなのでクッソ時間がかかりました。一応これからも自分用の忘備録的な感じで書いていきたいのですが、最後まで見ていただいた方で内容が不明瞭だったり、間違ったことやまずいこと等が書かれていましたら、ぜひぜひコメントしていただきたいです!!

・参考資料

Intro to Computer Science & Programming Course - Udacity
検索の仕組み – 検索サービス – Google
Amazon.co.jp: Google誕生 —ガレージで生まれたサーチ・モンスター: デビッド ヴァイス, マーク マルシード, 田村 理香: 本




Blogを作りました

 

 

はじめまして。深夜の勉強後のテンションでBlogを作りました。大阪や京都にいる駆け出しエンジニアです。大阪にあるスタートアップで働かせていただいております。現在理系の大学二回生です。

 

pythonとか、androidとかをやっています。まだまだなので、はじめはかなりひどい内容になるかも知れないですが、学んだことについて少しずつ書いていきたいです。読み直した時に、「ああ、ちゃんと少しずつ成長してきてるな」と思えるようなブログにしたいです。

 

ブログをつくるのは初めてで、慣れないことですがこれから少しずつ更新していきたいとおもいます。

 

内容が間違っていたり、よく分からないとこ等ございましたら、コメントしていただけるとうれしいです。

 

よろしくお願いいたします。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

どこで改行すればいいのかわかりません。