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

サーバに触れてみる(1)【仮想環境にサーバ建ててssh接続】

サーバで遊び始めることにしました

前回までのandroidアプリはmstdnクライアントとして作ろうと思ったんですけどレイアウトを整えてたらモチベーションが死んだので開発も一緒に死にました

サーバに自力でマストドンを建てて遊ぶまでやってみたいと思ってます

今回は題名のところまでです

仮想環境を整える

今回はVMwarePlayer+CentOS7にしました

それぞれダウンロードして起動するまでは流れで何とかなります

今回は簡易インストールを止めにしましたがかなり簡単でした

lino.hatenablog.jp

ただ起動するとネットにつながりません

これはどうやらブート時にネットを設定するあれこれがデフォルトで起動しないかららしいです

webird-programming.tech

ここに書いてあるようにONBOOTをyesにするだけで解決しました

SSHで接続してみる

起動はうまくいったのでsshで接続してみたいと思います

VMwareだし直接いじればいいかもしれませんが、まぁ気分です

今回はsshクライアントにTeraTermを使いました

セットアップが簡単でいいですね

webkaru.net

ただ、パーミッションには気を付けたほうがよさそうです

takuya-1st.hatenablog.jp

なんとかできました

f:id:ymzkmtfm:20170525194002p:plain

実はいろんなところにハマってたんですけどね…

Androidに触れてみる(4)【ブラウザ経由で認証してもらうマストドンクライアントを作ってみた】

マストドンへのブラウザ経由の認証及びtootが成功しました。

せっかくですので少しづつ解説してみようと思います。

このアプリはネットにつなぐので当然必要になってきます

intent-filterに関してはよくわかりませんがとりあえずあとから開くものにはactionにVIEWを、categoryにDEFAULTを、ブラウザから開くものにはBROWSABLEをつけておけばよさそうです。

andante.in

またdataはブラウザからデータが送られる場所を設定するタグで、scheme://hostという場所に送らるそうです。利用するときにはそこを参照するようですが、なんでブラウザがそこにデータを送るのかとかなんでそこからデータが取れるのかとかはよくわかりませんでした。知っている人がいたら教えてください。

これは前回も使ったRetrofit2ですね。非同期処理を裏に回したいのでsubscribeOn(~)を使ってます。subscribe()の中身はメインで処理したいのでobserveOnで指定してます。

アプリの名前、リダイレクトURI(AndroidManifest.xmlで設定したshemeとhostをsheme://hostと並べる)、スコープ(read write followをスペース区切りで並べる)をパラメータとして渡してあげるとクライアントを登録できます。ただ、起動するたびに新しいクライアントとして登録するのはかなりまずいのでいつか直さないといけません。成功すると

github.com

 ここに書いてあるものがJSONで送られてきます。今回はGSONを使っている(addConverterFactory(~)の部分)のでクラスのようにデータを扱えます。

この部分でブラウザを起動してます。ブラウザを呼び出すときもパラメーターを渡さないといけませんマストドンOAuth認証にDoorkeeper gem for OAuthなるものを使っているようです。そのため、接続する場所はhost/oauth/authorizeまたはhost/auth/sign_inになるはずです。

github.com

 ブラウザから帰ってくると

こいつが呼ばれます。ここでsetIntentしてあげないとブラウザから送られてきたデータが使えません。ちなみにもらえるデータはcodeと呼ばれるよく理解できていない文字列でsheme://host?code=hogeという形式で送られてきます。onNewIntentの次はそのまま

こいつが呼ばれてきます。ブラウザからもらったcodeを抽出してAccessTokenを入手します。scopeも渡してますが、もしかしたらいらないかもしれません。必要なパラメータと帰ってくるデータについてはここをご参照ください。

github.com

subscribeではもろもろの必要なデータを渡しながら投稿用のアクテビティを起動しています。

tootにはヘッダが必要なのでRetrofitさんに作ってもらうようお願いしています。"toot"の部分につぶやきたい内容を入れればつぶやけるはずです。

Androidに触れてみる(3)【Retrofit2+RxAndroid(RxJava)で初めてのWebAPI】

色々あってWebAPIをandroidから叩いてみることにしました。

出来上がったものはこちらです

たったこれだけですがここに至るまでに結構時間がかかってしまったので同じような初心者に向けてここに至るまでの経緯を残しておこうかと思います

第一章 OAuth2がわからない

マストドンクライアントを作ろうとしているわけですがそもそもなにをどうすればいいのかわかりません

そんな時に出会ったのがこのページです

thr3a.hatenablog.com

こちらのページに書いてある通りOAuthなるものをまず最初にやればいいらしいのですがこれが全然理解できません。

murashun.jp

こんな記事とか

qiita.com

こんな記事を見ても全然ピンときません。

OAuthライブラリとかも探してはみましたがなんだかよくわかりません

結局OAuth認証をライブラリとかでパパッとやったり、そもそも仕組みを理解したりすることはあきらめました

ただ、いろいろ調べてわかったことはOAuthはWebAPIだということです

第二章 WebAPIがわからない

正直私はまともにプログラムを作ったことがないのでWebAPIなるものがなんなのか全然わかっていませんでした

qiita.com

この記事は個人的にはわかりやすいものだと思っています。

最終的にほんの少しだけWebAPIを叩いた経験と少しの調べた知識から推察するに、WebAPIとはちょっとリッチなhttp通信のことであり、少なくとも使う分には何ができるのかがわかっていればなぜできるのかを考えなくていいシステムなんだと思います。APIって名前がつくくらいだから当然なんでしょうけど。

ではこれを使うためにhttp通信をandroidで実装してやりましょう

第三章 AndroidでHTTPがわからない

アンドロイドではApachHTTPClientとHttpUrlConnectionなるものが標準で搭載されているらしいのですが、どちらを使えばいいのかよくわかりませんでした。

調べているうちに流れ着いたページをみると、どうやらApachHTTPClientは削除されたらしくHttpUrlConnectionなるものを使ってみることにしました

blog.riskfinder.co.jp

qiita.com

techbooster.jpn.org

しかし書いてみるとどうもしっくりきません

というか私はエラーハンドリングがあんまり好きではありません

AsyncTaskを継承したクラスを作成する必要があるのもなんだか嫌で、どこか胸がときめかないようなコードになってしまいました。

そんなときにいろいろ探し回った結果見つかったのがRetrofit2+RxAndroid(RxJava)でした

第四章 初めてのWebAPI

 最初に挙げたプログラムですが、大体ここら辺を見て作りました

dev.classmethod.jp

qiita.com

コードを見れば何しているのかわかりやすく、なによりエラーハンドリングとかAsyncTaskとかが現れなくて気持ちがいいですね。

 ただし導入紹介されているものはバージョンの関係で競合みたいなものが発生します。

stackoverflow.com

2をつけると解決するのですがいまいちわかりにくく結構ハマりました。

あと、どうやらマストドンjava用ライブラリが現在開発中っぽいですね

github.com

まだ安定していなさそう&エラーハンドリングがめんどくさそうなので今回は避けました

余談ですがこの方のスライドがRxをわかりやすく説明しているように感じたので載せておきます。

speakerdeck.com

Androidに触れてみる(2)【MVPモデルとかMVVMモデルとか】

<追記>

この記事に書いてある多くは私の誤解だったようです

このブログの記事は全般的に私用メモ的な意味合いが大きいので削除はしませんが読むことはお勧めしません

 

ちょっとMVPモデルだかMVVMモデルだかMVCモデルだかを試したくなってしまったのでサンプルプログラムを改造してみます

MVPとかそのあたりの話はここらへんで

qiita.com

実際にいろいろ改造したんですけど最終的に出来上がったものが何モデルになっているかは僕にもよくわかりません。

ちなみに出来上がったものはこちらです

youtu.be

github.com

Rxを導入してみる

Unityでも使ったRxをandroidでも導入してみます。

RxJavaとRxAndroidみたいなものがあるようですがUniRxとは少し感じが違いそうです。(というか、UniRxもよくわかってなかったんですが…)

どうやらObservableを使用するには

Obserbable x = Observable.create(observer/*発生源*/ -> {observer.onNext(hoge)/*発生処理*/});

みたいな感じでやるっぽいです。

でもなんかめんどくさいんでSubjectを使うことにしました

qiita.com

クラスの関係

今回はMVPモデルで作るつもりなので

Activity ← Presenter →Model(持ってる人→もたれてる人)

という感じにしました。ただしViewに相当するものがActivityなので生成順が

Activity→Presenter→Model

となってしまいます。そこで適当なインターフェースを作ってActivityはそれを継承してもらうことにしました

 

感想

本当にこれでいいのかよくわからない…(小声)

Androidに触ってみる【環境整備】

突然ですがAndroidアプリでも作ってみようかと思います。鬼ごっこゲームは前回でひと段落としておきます。

とりあえずmstdnクライアントのコピー品を目指します。playストアで入手できるやつですね。

play.google.com

 

Android Studioの入手とインストール

指示されたとおりにすれば問題ないです

 

初めてのアプリ作成

とりあえずここに書いてあるアプリを作りました

developer.android.com

今回はAndroid6.0を対象としました。自分の環境で動けばそれでいいのです。

まぁ最終的にはエミュレーター使ったんですけどね。

特に書くべきこともありません。

ラムダ式を導入する

ここを参考にRetrolambdaなるものを導入してみました*1

qiita.com

buld.gradleにちょこちょこ書いてSync Nowとか押せば本当にそれだけで使えるようになるんですね。もっとダウンロードとか解凍とかするものだと思ってました。ただlambdaをlamdaと書いたせいでかなりの時間を取られました…

あと、こういうやつのバージョンってgithubCHANGELOG.mdに書いてあるんですね。恥かしながら新しい知見でした。

実際に使ってみる

 コードはごく単純ですね(もちろんそのためのラムダ式ですが…)

実行結果はこんな感じです。

きちんと動いてますね

f:id:ymzkmtfm:20170422194534p:plain

次からはもうちょっとアプリの設計とか実装とかに入ろうと思います

 

*1:本当は何も導入しなくてもJava8以降であれば標準でラムダ式が使えるみたいです。ただしその場合対象androidは7.0以降になってしまう(はずな)ので今回はあきらめることにしました。

Unityに触ってみる(6)【Behaviour Treeを実装する】

キャラクターを自分で動かせるようになったのはいいんですけどコンピュータが動かないんじゃ鬼ごっこになりません。

というわけでコンピュータのAIを実装しようと思います。

といってもまさかディープラーニングがーとか人工知能がーとかをやりたいわけでもないのでもっと対戦ゲームっぽいものを探していたらBehaviourTreeなるAIがあるらしく、面白そうだったのでそれを使ってみることにしました。

ただ、BehaviourTreeを作るためのassetが有料だったため自分で実装することになりました。

BehaviourTreeってなんぞ?

大体ここに書いてあります(環境によってはスライドを見るためにブラウザのスクリプト実行を許可させてあげないといけないかもしれません)

幻塔戦記グリフォンの AI で使っている Behaviour Tree | Aiming 開発者ブログ

とりあえず

・子を持たず、とりあえずアクションするActionNode

・子を一つ持ち、指定された条件が真のときに子を実行するDecoratorNode

・子を複数持ち、成功するまで子を実行するSelectorNode

・子を複数持ち、失敗するまで子を実行するSequencerNode

の四種類が存在しているようです。

出来上がったものがこちらになります

そしてそれを利用したものがこちらになります

そういえばすっかりお見せするのを忘れていたgithubもこの際だからリンクを張っておきます

github.com

読みずらい…

実装としてはそれっぽいインターフェースを作っておいてラムダ式を使って実際の動作を決めてる感じです。

挿入のために一意に識別できるkeyが必要だと思ったのでstring型でKeyを持っています。これにはルートノードを"/"としてファイルシステムみたいな感じで名前をつけておけばいいかなーって思ってます。ただし一意であることは保証してません。

SequencerNodeは必要なさそうなので作りませんでした

これでおおむね出来上がったのでここを参考に作ったものを公開してみました

qiita.com

↓これです

Unity WebGL Player | Tag

よかったら遊んであげてください

Unityに触ってみる(5)【キャラクターを自分で動かしてみる】

今更だけどキャラクターを操作してみました

今まではUnityの標準装備でなにも操作用のスクリプトを書いてなかったんですよね

やってみてハマったのはcolliderとかrigidbodyとかをつけると回転したり倒れたりするってことだったんですけどrigidbodyのfreez rotationを全部つけると直りました

calmery.hatenablog.com

また、モーションをトリガで管理するのが面倒だったのでBrendTreeを使いました(といっても結局作ったのはIdleとRunの二つだったんですけどね)

kan-kikuchi.hatenablog.com

基本的には入力した方向にまっすぐ進んでほしかったので

・入力方向から角度を計算してその方向にRotateする

・アニメーションは直進

というだけのスクリプトにしました