超気軽に出来る二時間以内のボランティア、ねこ活に参加してきました
こんにちは、さくらです。あっという間に年末ですね。
体調はいかがですか?風邪などお気をつけ下さい。
猫さんたちも寒さに負けないでほしいです。
先月記事を書きました。
今月も行ってまいりました。
さまで月一で行われているプチボランティア、ネコ活です。
22日に開催だからもう5日前なんですが、なんだかんだでブログに書くのが遅くなってしまいました。
22日も直前までいけるかどうか微妙だったのですが、締切1時間ぐらい過ぎてしまったのにお願いしたら参加させてくださいました。
ネコ活コーディネーター的なTさんは、いつも素晴らしくわかりやすく猫のことを教えてくれる方ですが、私が早く着いたらスカイシェルター(大塚にある東京キャットガーディアンさんの猫カフェ)に居てもよいとメールに書いてくれました。
当日は寄付の物資を持って行ってきました。
寄付の物資はホームページ上で不足している支援物資が載っているので参考にしました。古タオルが余っているのを送るだけで支援になるので、お宅で眠っているものがあれば送ってみてください!
支援物資・支援金の募集 - NPO法人 東京キャットガーディアン〜子猫の里親募集〜
上の写真は自宅から持っていったものです。
・古タオルたくさん
・45リットルゴミ袋100枚入り
・ボトム用ハンガー
・薄いビニール手袋100枚入り
・箱ティッシュ10個
すごーーーーく重かったです。
猫モフを目当てに2時間は早く行きました。
スカイシェルターに入る際に2千円ほど寄付の箱にいれました。
ここの猫達はペットショップとは違って片目が不自由だったり、毛がかなり抜けてしまっていたり、年齢の高めの子も混じっています。雑種が多いですが、血統書がありそうな感じの猫も多いですね。保護猫ですから、殺処分になってもおかしくなかった子ばかりなのですがものすごく可愛い(●´ω`●)
ケージで休んでいるにゃんこも、すきまから手を出してくれたりして
まだまだ我々はこれからの人生なんだ〜〜〜
と叫んでいるようです。
どうかどうか良いご縁がありますように。
猫さんにかまってもらったよ〜
パソコン開いてたらキーボードの上に乗っかる猫さん。
非常に猫らしい行動にきゅんとします。
写真が暗いのは会場が間接照明のみのアダルトな明るさだからです。
猫さんのためを思ってのことと思います。
そして大抵の猫のいる場所では写真のフラッシュが禁止されていますが、こちらもです。
ちなみにここは人間にとっては暑いのですが、猫さんにとっての快適温度を設定しているためだそうです。
おかげで光熱費がすごいらしいですよ。
スカイシェルターに行くときは、脱ぎ着で暑さを調節できる服を着ていくようにした方がいいです。
今回もタオルを小さく切りました。
収納する場所に当然のように入る猫さんです。
15人近いボランティアが集まりました。
動物病院からいらした方もいて、盛り上がりました。
コーディネーターのTさんが猫のことや保護活動のことについて何でもわかりやすくお答えしてくださるので、非常にためになります。
20年近く猫と暮らしていてもまだまだ知らないことがありますねー。
保護活動の経費なんかも教えてくれるんですよ。
すごいと感心したり大変そうだなと思ったり、好奇心を刺激されます。
猫好きの方、一緒に参加しませんか?
東京都豊島区大塚にある東京キャットガーディアンさんのシェルターの1Fはリサイクル店になっており、猫グッズ他がお得に手に入るし運営費の一部になるそうです。
5Fの猫カフェ部分では手作りの猫グッズが販売されており、クオリティ高くて可愛いものがたくさんあります。
この日のネコ活参加の方で手作り品を寄付なさっていた方もいらっしゃいました。
色んな形で支援できます( ´∀`)
ということで、2016年も何かと至らない私でしたがお世話になりました。
来年もよろしくお願いいたします!
【追記】ネコ活の記事はこちらにもございます。よろしければごらんください。
緯度・経度から郵便番号を取得する
Geocoderクラスを使って緯度と経度から郵便番号を取得する方法です。
題名は郵便番号を取得するとなっていますが、住所も取得できます。
自分が郵便番号というキーワードで検索していたため自分用メモです。
developer.android.com
Gercoderを使用して住所(郵便番号)を使用する場合はバックエンドサービスを使用するので、インターネットに繋がっていないと取得が出来ません。
Gercoderが使用可能かどうかはisPresent()メソッドで確認します。
コードのサンプルはこんな感じです。
private String retrievePostalCode(Location location) { final Geocoder geocoder = new Geocoder(getApplicationContext()); if (geocoder.isPresent()) { try { List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); if (addresses != null) { for (Address address : addresses) { if (address.getLocality() != null && address.getPostalCode() != null) { Log.i(TAG,address.getPostalCode()); return address.getPostalCode(); } } } else Log.i(TAG,"No location found..!"); } catch (IOException e) { e.printStackTrace(); } } else { Log.i(TAG,"Geocoder is not present"); } return null; }
Rails + Grapeを使って超単純なapiを作ってみる
初心者の勉強記録です。
「〜らしい」や「っぽい」などの語尾が多くなっています。
手順を書き残すため、主題とは外れた内容も含みます。
間違ったり知識が最新でなかったりすると思いますのでツッコミ大歓迎でございます。
Railsとgrapeを組み合わせる利点はあるのか
いい感じの形式を強制されるので、一度導入すれば後で拡張と保守が楽になりそう
Grape公式サイト
monterail.com
本家のサンプルリポジトリ
rails-grape-example/app at master · monterail/rails-grape-example · GitHub
参考サイト
grapeメモ - Qiita ← ここのサイトさまを見ながら作りますm(_ _)m
[Ruby on Rails]Grapeを使ってWeb APIを作成する | DevelopersIO
http://qiita.com/magaya0403/items/f9cd1340960ab997cf63
http://qiita.com/takusemba/items/a86796aa3c207155c579
公式サイトを拾い読みメモ
・APIバージョンをパスに含める構造を取る
・APIに関するコードベースをAPIモジュール配下に設置する
・format は:jsonが推奨されているらしく、xmlは
# We don't like xml anymore とか言われているが使用不可かどうかまでは調べてない
Controllerの定義は次のような形式になる
# app/controllers/api/v1/hussars.rb module API module V1 class Hussars < Grape::API version 'v1' # path-based versioning by default format :json # We don't like xml anymore resource :hussars do desc "Return list of hussars" get do Hussar.all # obviously you never want to call #all here end end end end end
このコードだとクライアントから呼び出すパスは/v1/hussars.jsonで終わる
/v1/wings.json で終わるパスであればクラスの定義は↓になる。
API::V1::Wings → app/controllers/api/v1/wings.rb
/v2/hussars.json なら
API::V2::Hussars → app/controllers/api/v2/hussars.rb
各APIバージョンについて、すべてのリソースをマウントする集約クラスが必要。
# app/controllers/api/v1/base.rb module API module V1 class Base < Grape::API mount API::V1::Hussars mount API::V1::Wings end end end
v2だと app/controllers/api/v2/base.rb.
すべてのAPIバージョンを集約するクラスが1つ必要。
# app/controllers/api/base.rb module API class Base < Grape::API mount API::V1::Base mount API::V2::Base end end
最後に集約クラスをroutes.rbに記述する
# config/routes.rb Monterail::Application.routes.draw do # ... mount API::Base => '/api' # ... end
config/application.rbを編集
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb') config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
APIクラスを設置する(リソースを集約したクラスでもある)
class API < Grape::API prefix 'api' version 'v1', using: :path format :json helpers do def dummy_code { code: 1 } end def err401 error!('401 Unauthorized', 401) end end resource :dummy_api do get :status do dummy_code end get :secret do err401 end end end
rake routesと実行すると次のように表示される。Controllerのルーティングと違う。
$ rake routes Prefix Verb URI Pattern Controller#Action api / API
このサイト様によると
・「desc〜」で機能の説明を記述できる
・「get」「post」「put」「delete」と、HTTPのメソッドに対応した処理を定義できる
・「params〜」でパラメータを定義し、「require」で必須かを定義している
プライベートメソッドはhelpers内で行うことになっているらしい
検証
ローカルサーバーを立ち上げる
$ rails s
curlコマンドで確認する
$ curl localhost:3000/api/v1/dummy_api/status
{"code":1}
目論見どおり文字列が返ってくる
サーバーにデプロイする
herokuのアカウントを持っているのでそこにデプロイ
$ heroku login
$ heroku create sakurabird1-grape-example
Creating ⬢ sakurabird1-grape-example... done
https://sakurabird1-grape-example.herokuapp.com/ | https://git.heroku.com/sakurabird1-grape-example.git
$ git push heroku master
このようなエラーメッセージが出るので
remote: Make sure that `gem install sqlite3 -v '1.3.12'` succeeds before bundling. remote: ! remote: ! Failed to install gems via Bundler. remote: ! remote: ! Detected sqlite3 gem which is not supported on Heroku. remote: ! https://devcenter.heroku.com/articles/sqlite3 remote: ! remote: ! Push rejected, failed to compile Ruby app.
group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug' gem 'sqlite3' end group :production do gem 'pg’ end
$ bundle install ←記述後に実行しておく
変更をcommitした後、最新のコードをHerokuにpush
$ git push heroku master
デプロイ成功
remote: https://sakurabird1-grape-example.herokuapp.com/ deployed to Heroku
URLはこうなる
https://sakurabird1-grape-example.herokuapp.com/api/v1/dummy_api/status
検証
$ curl https://sakurabird1-grape-example.herokuapp.com/api/v1/dummy_api/status
と実行すると
{"code":1}
とレスポンスが返ってくるので成功