アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

日本語版「Stack Overflow」のAPIを利用してみた!

こんにちは、渡辺です。
去年12月16日に「Stack Overflow」の日本語版がパブリックベータとして公開されましたね。
公開からちょうど一ヶ月の1月16日(20時現在)の利用状況は下記のとおりで、質問すると高確率で回答がもらえるんですね。

 ユーザー数:5458人
 質問数:782件
 未回答質問:92件

今回は、今後ますます活発化する日本語版「Stack Overflow」をAPIで扱う方法を紹介します。
利用方法は簡単です。Stack Overflowからの情報取得だけであれば、API利用のための登録作業も必要ありません。
また、APIに問い合わせるURLは「StackExchange api」で作成することができます。下記の紹介もStackExchange apiで作成していきます。

■特定のタグを持つ質問を取得する


今回は「javascript」タグを持つ質問を取得したいと思います。
まず、https://api.stackexchange.com/docs/questionsにアクセスして、tagged欄に「javascript」を入力します。



このまま「Run」ボタンをクリックすると英語版「Stack Overflow」の結果が返ってきてしまうので、リンクをクリックして、新規タブを開き、URLの「site=stackoverflow」を「site=ja.stackoverflow」に変更します。

この手順で下記のURLが作成されました。

【リクエストURL】


https://api.stackexchange.com/2.2/questions?order=desc &sort=activity &tagged=javascript &site=ja.stackoverflow


これだけで、「javascript」タグが付いている質問が取得できました。
(※下記はページの都合上1件に絞った結果です。)


{
    items: [
        {
            tags: [
                javascript
                ,css
                ,jquery
            ]
            ,owner: {
                user_type: does_not_exist (string)
                ,display_name: user7487 (string)
            }
            ,is_answered: false (boolean)
            ,view_count: 21 (number)
            ,answer_count: 0 (number)
            ,score: 1 (number)
            ,last_activity_date: 1421460965 (number)
            ,creation_date: 1421459774 (number)
            ,last_edit_date: 1421460965 (number)
            ,question_id: 4715 (number)
            ,link: http://ja.stackoverflow.com/questions/4715/jquery-%e3%81%a7-%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e8%bf%bd%e5%be%93%e5%9e%8b%e3%81%ab%e3%83%a1%e3%83%8b%e3%83%a5%e3%83%bc%e3%82%92%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%81%97%e3%81%9f%e3%81%84 (string)
            ,title: jQuery で、スクロール追従型にメニューをカスタマイズしたい (string)
        }
    ]
    ,has_more: true (boolean)
    ,quota_max: 300 (number)
    ,quota_remaining: 205 (number)
}


■取得する質問件数を増やす


次は、ページングを使って取得件数を変更しようと思います。
APIメソッドで取得できる件数は、初期状態では30件となっていますが、最大件数である100件を取得したいので、「pagesize」を100に設定します。また、次の100件を取得する場合は、「page」を2に設定します。



【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &order=desc &sort=activity &tagged=javascript &site=ja.stackoverflow


■期間を指定して取得する


期間を指定して質問を取得します。今回は、一ヶ月以内の質問を取得するようにしました。
「fromdate」と「todate」を設定するだけです。



【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &fromdate=1418688000 &todate=1421366400 &order=desc &sort=activity &tagged=javascript &site=ja.stackoverflow


■人気順で質問を取得する


apiで用意されているソートを利用することで、
日本語版StackOverflowトップページの「人気」タブと同じ結果を取得することができます。



【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &fromdate=1418688000 &todate=1421366400 &order=desc &sort=hot &tagged=javascript &site=ja.stackoverflow


ソートは6種類あり日本語版StackOverflowの記述に当てはめると、下のようになります。

・activity – アクティブ
・creation – 質問日時
・votes – 票数
・hot – 人気 (トップページのタブと同じソート(minとmaxは利用できないタイプのソート)
・week – 今週 (トップページのタブと同じソート(minとmaxは利用できないタイプのソート)
・month – 今月 (トップページのタブと同じソート(minとmaxは利用できないタイプのソート)

■質問だけでなく回答も取得する


「フィルター」を利用することによって、回答の取得ができるようになっています。フィルターの「edit」ボタンをクリックして、「answer」→「body」にチェックすることで取得できるようなります。



【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &fromdate=1418688000 &todate=1421366400 &order=desc &sort=hot &tagged=javascript &site=ja.stackoverflow &filter=!9YdnSM68i



また、フィルターには下記の種類が用意されているので、「withbody」を利用することでも回答内容を取得することができます。

 ・default : 各種の型が持っているデフォルトフィルターが適用される
 ・withbody : デフォルトフィルターと各種型のbodyフィールドが含まる
 ・none : 空が返却される
 ・total : totalフィールドが返却される


「withbody」を利用する場合は下記の内容となります。

【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &fromdate=1418688000 &todate=1421366400 &order=desc &sort=hot &tagged=javascript &site=ja.stackoverflow &filter=withbody


「total」を利用すると下のような結果が返ってきました。


{
    total: 63 (number)
}


【リクエストURL】


https://api.stackexchange.com/2.2/questions?page=1 &pagesize=100 &fromdate=1418688000 &todate=1421366400 &order=desc &sort=hot &tagged=javascript &site=ja.stackoverflow &filter=total


ちなみに、本家StackOverflowの利用状況をapiで問い合わせたところ、下の値が返ってきました。ユーザー数が300万人以上いるんですね。そして、1分あたりに約2件の質問と、4件の回答が投稿されているとは、スゴイです。日本語版も期待しています!!それでは!


{
    items: [
        {
            new_active_users: 24 (number)
            ,total_users: 3854376 (number)
            ,badges_per_minute: 3.61 (number)
            ,total_badges: 12258396 (number)
            ,total_votes: 57183608 (number)
            ,total_comments: 40947181 (number)
            ,answers_per_minute: 4.31 (number)
            ,questions_per_minute: 2.55 (number)
            ,total_answers: 14656651 (number)
            ,total_accepted: 4958394 (number)
            ,total_unanswered: 2222839 (number)
            ,total_questions: 8681213 (number)
            ,api_revision: 2015.1.16.13962 (string)
        }
    ]
    ,has_more: false (boolean)
    ,quota_max: 300 (number)
    ,quota_remaining: 183 (number)
}


【リクエストURL】
>>BOXNC
https://api.stackexchange.com/2.2/info?site=stackoverflow

アシアルPHPスクールにて、フレームワークCakePHP、WebAPI、Flex編など新設講座を開設

こんにちは。小林です。

アシアルPHPスクールでは、市場や受講希望者のニーズに合わせて、この度、続々とプログラミング講座を新設しました。

講座の新設にあわせ、講座説明会(無料)も開催しております。次回開催日は6月2日となりますので、皆様、お気軽にご参加いただけたらと思います。

新設・ブラッシュアップした講座は以下のとおりです。

-----
■ モバイル編: 絵文字や固有IDなど携帯特有の開発テクニックを学ぶ
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/8

CakePHPフレームワーク編:フレームワークを利用することで開発効率up
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/12

PHP×Flex初級編: Flex4の基礎的なアプリケーション構築をマスター
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/15

PHP×Flex中級編: Flexスキルを実務レベルまで押し上げる中級編
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/16

■ オブジェクト編: PHPで学ぶオブジェクトの仕組みと使い方
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/10

Linuxサーバ編: Linux コマンド操作やLAMP環境の構築方法について学ぶ
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/9

■ HTML×CSS初級編: Webサイトの制作のベースとなるHTMLをマスターしよう!
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/13

■ HTML×CSS中級編: スタイルシートによる魅力的なデザイン
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/14
-----






-----
以下、本日発表したプレスリリースの内容
-----
アシアルでは、2005年にPHPスクールを開始して以来、Web入門者向けの「初級編」、PHPスキルを実務レベルまで押し上げる「中級編」など、PHP言語を用いた開発のスキルアップをサポートする研修を実施してきました。これらの研修は、アシアルが開発現場で培ったソフトウェア技術をベースとしており、より実践的であることから多くの支持を集め、エンジニア・デザイナーを中心に約1500人に受講頂きました。

現在、Web製作の現場ではPHP言語を開発に利用することが完全に主流となりましたが、Webテクノロジーの進歩、PHP言語の普及と成長に伴い、さらに先を行く下記のようなニーズが高まってきました。

・大規模な開発におけるPHPの利用増加と、それに伴うより効率的な開発体制の構築
・デザインとプログラミング技術の強い連携
Flashなど高い表現力と処理能力を使い高いパフォーマンスのアプリケーション構築
・外部サイトと連携させることによる魅力的なコンテンツの提供

現在のエンジニアには、Webアプリケーションの開発現場の中で、よりフレキシブルに対応できることが求められています。大人数での効率的な開発、サーバ操作、モバイルサイトへの対応、先進的なデザインとの連携をはじめとして、数年前と比較すると、より先に進んだスキル、豊富な知識が求められています。

一方、Webデザイナーも従来のようにサイトのデザインに特化した体制ではなく、Flashの知識、プログラムへの理解、技術を考慮した上でのデザインが重要視されるようになってきました。

このような背景のもとアシアルは、プログラマ、デザイナへのサポート、スキルアップのため新たに講座を開設しました。

開設される講座は、いずれもアシアルが自社サービス及び受託開発で好評を受けたソフトウェア技術をベースとしてり、ハンズオンで実際にアプリケーションを作成しながら進める実践的な内容で、スキルを実務レベルに押し上げる内容です。

【アシアルPHPスクールの特徴】
・講師は現場で活躍する現役のPHPエンジニア
・受講者のスキル・希望にあわせた豊富なカリキュラムを提供
・各種割引制度(継続割引、グループ割引、早期申込割引)
・スクールの雰囲気や講座の内容について把握するための講座説明会(無料)の開催(次回開催 6月2日)

【新たに開設するプログラミング研修】
PHP×Flex 初級編
 Flex入門者を対象にActionScript3、最新版であるFlex4を取り上げ、PHPスクリプトと連携した簡単なアプリケーションを作成

PHP×Flex 中級編
 Flex4とPHPの連携によるRIAアプリケーションの作成、基本コンポーネントの使用法、実践的なカスタマイズ方法

CakePHP フレームワーク
 フレームワークを使用したスピーティかつ効率的な開発

PHP講座 モバイル開発編
 3G方式の携帯端末、3キャリアに対応した開発

PHP講座 Web API
 Twitterなど人気コンテンツとの連動

PHP講座 オブジェクト編
 ソースコードの効率化、デザインパターンへの理解

Linuxサーバ編
 基本的なサーバー知識と操作方法

座標から地名を取得する逆GeocodingAPIのまとめ + サンプル

こんちは。松田です。
トレイン・トレインで使用しているGoogleMapをいじっている時に座標(緯度・経度)から地名を取得する必要が出てきたので、その際に調べた逆Geocoding機能を実装したAPIをまとめてみました。

GoogleMapsAPIなど地図を使ったシステムを使用していると、住所から緯度経度などの情報を取得する方法が必要になります。これはGeocodingと呼ばれる技術で、GoogleMapsAPIではすでに公式なAPIが存在しています。
これとは逆に、ユーザーに登録させたスポットの地名を自動入力させたりする場合など、座標から地名情報を取得したい場合があります。これらは「逆Geocoding」や、「Reverse Geocoding」などと呼ばれていますが、現在のところGoogleMapsのAPIは提供されていません。
この逆Geocoding機能が使えるサービスをいくつか紹介します。

・YahooローカルサーチAPI
http://developer.yahoo.co.jp/map/localsearch/V1/localsearch.html
言わずと知れたYahooのAPI
24時間中1IPアドレスにつき50000件のリクエストまでの制限あり。
本来は座標やキーワードからYahooの持つ周辺情報の検索を行うAPIだが、地名のみに絞って検索することで対応可能。
事前にアプリケーションIDの取得が必要。
取得できる地名は「都道府県・市区町村・番地が連結された文字列」のみ。
そのため、「都道府県名」「町名」を個別に取得する場合は独自の変換が必要。
日本測地系」「世界測地系」の指定が可能。
指定座標からの範囲を指定し、複数の候補地点を取得することができる。
出力はXML形式、JSON形式が選択可。

・ReFITS Lab 逆ジオコーディングサービス
http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.html
出力はJSONP形式、phpでserialize化された文字列形式。
PHPスクリプトに組み込みやすい。
1日あたり10万アクセスまで許可。これを超えそうならば事前に要相談。
つい最近バージョン3が公開されたばかりで、YahooローカルサーチAPIのように複数の候補を取得できるようになった。
都道府県名」「市区町村名」などに加えて、「都道府県コード」「市区町村コード」「町丁目」「番地」なども個別に取得可能。
さらに、「候補地点(代表点位置)の座標」や「検索座標から候補地点座標までの距離」も取得できる。
これを使用したサービスを公開する場合は、以下の文章と同じ趣旨の内容をユーザーに通知しなければならない。


「当該サービス提供者は、当該サービスを無保証で提供しており、当該サービスが原因で発生した損害等について、補償等は一切おこないません。」

また、番地情報まで使用・表示させる場合、以下の趣旨の文章を通知しなければならない。


「番地情報は、実態と異なる場合があり、またプライバシーにも関わることがありますので、特に慎重に扱って下さい。」


・invGeocoder
http://www.knya.net/archives/2005/07/rest.html
利用制限無し。
都道府県名」「市町村名」「町名」「番地」と、「候補地点の座標」「候補地点までの距離」を取得できる。
出力はXML形式。
使いやすいが、作者の言っているようにそのうちサービスが止まるかもしれないのがちょっぴり不安。

・Knecht(クネヒト) 逆ジオコーディングAPI
http://api.knecht.jp/reverse_geocoding/
一日当たりの利用制限等については言及無し。
都道府県名」「市町村名」「町名」の取得が可能。
出力はXML形式、JSON形式が選択可。
今回紹介する中では一番シンプル。

ちず丸 「ここの住所は?」機能
http://www.chizumaru.com/czm/currentadr.aspx?x=502779.393&y=128135.353
ちず丸が提供するAPI?それともただの出力結果画面?
どちらにしろ座標から地名を出せるということで一応ピックアップ。
この機能に関する説明ページを見つけられなかったので、これをシステムに組み込んでいいのかどうかは不明。
これはどこから辿り付けるページなのか誰か教えてください・・・。
座標から郵便番号と地名は取得できるが、HTMLページで返されるので、もし使うのであればパース処理を実装しなければならない。
パラメータのx,yの値の算出方法はこちらのページ参照。
http://q.hatena.ne.jp/1203488398


・海外モノ
http://www.geonames.org/export/reverse-geocoding.html とか、
http://groups.google.co.jp/group/Google-Maps-API/web/resources-non-google-geocoders?pli=1 の下のほうとか。
日本の地名取得は無理なのが大半っぽいのでほとんど調べてない。
「reverse geocoding」でググるといっぱいでる!

※各APIの詳細な利用規約はご自分でお確かめください。



せっかくなので、APIを調べているときに作ったサンプルを公開します。
YahooのローカルサーチAPIを使って座標から地名を取り出しています。

まず必要になるのはYahooAPI用のアプリケーションID。
これは以下のページから事前に取得しておきます。
http://e.developer.yahoo.co.jp/webservices/register_application

パラメータのp(検索キーワード)の欄には必須と書いてありますが、lat、lon、distを指定する場合は省略可能のようです。
また、パラメータのnの値で結果取得件数を指定することができますが、今回はnを1にして表示された地名をそのまま座標の地名として使用しています。
取得した地名の並び順が指定座標に近い順かどうかは不明なので、この方法で最適な地名が取れているかどうかは若干怪しいです。

GoogleMapsは日本地図も世界測地系なので(確か)、「datum=wgs」を指定しています。


APIを使用して実際に地名を取得するPHPスクリプト
・getplacename.php


<?php

// POSTされてきた緯度・経度を取得
$lat = isset($_POST['lat']) ? $_POST['lat'] : null;
$lng = isset($_POST['lng']) ? $_POST['lng'] : null;
if (!$lat || !$lng || !is_numeric($lat) || !is_numeric($lng)) {
  exit;
}

// APIを使用するURLを生成
$url = 'http://map.yahooapis.jp/LocalSearchService/V1/LocalSearch?'
	. 'appid=(アプリケーションID)'
	. ' &lat='.urlencode($lat)
	. ' &lon='.urlencode($lng)
	. ' &dist=3' // 上記指定座標からの検索範囲(km)
	. ' &category=address' // 地名のみ検索
	. ' &n=1' // 検索結果は1つだけ取得
	. ' &datum=wgs' // 世界測地系を使う
	. ' &al=3'; // 丁目、字レベルまで取得

// 結果を取得
$contents = file_get_contents($url);

// 住所部分を取得してecho
$xml = simplexml_load_string($contents);
$address = (string)$xml->Item->Address;
echo $address;
exit;
?>

下で表示しているGoogleMapからAjaxで呼び出しています。


ソース表示
ピンをドラッグした先の座標をgetplacename.phpに送り、その座標をYahooローカルサーチAPIに渡し、取得した地名をInfoWindowに表示しています。

Web APIが熱いですね

このごろ、世の中はWebAPIであふれかえってきましたね。
ということで、Google AJAX Search API (Beta) News Bar Wizardをとりあえず設置してみました。

これの設置はすごく簡単で、ウィザードページで検索ワード・スタイル・サイトURLを設定するだけです。
Googleアカウントを持っていれば、ホント1分くらいで作れると思います。
今回設置したものは検索ワードに「Asial」「PHP」を設定しました。
あとはHTMLタグをブログにコピペするだけで↓のようになります。

Loading...








やっぱり、こういった簡単に設置できるタイプのものはいいですね。
アシアルでも、HTML2PDF.BIZで無料APIを公開していますので、是非つかってみてください。
新規サービス以外にも既存の地図日記2や、PHPプロ!なんかでも、いろいろ出していけるんじゃないかなと思っていますので、お楽しみにしていて下さい。