├── sample ├── .gitignore ├── src │ └── main │ │ ├── ic_launcher-web.png │ │ ├── res │ │ ├── drawable-hdpi │ │ │ └── ic_launcher.png │ │ ├── drawable-mdpi │ │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ │ └── ic_launcher.png │ │ ├── drawable-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ └── dimens.xml │ │ ├── values-w820dp │ │ │ └── dimens.xml │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ └── list_item_entry.xml │ │ └── menu │ │ │ └── main.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── rejasupotaro │ │ └── example │ │ └── asyncrssclient │ │ ├── adapters │ │ ├── EntryAdapter.java │ │ └── BindableAdapter.java │ │ ├── HotEntryClient.java │ │ ├── models │ │ └── Entry.java │ │ └── MainActivity.java ├── proguard-rules.txt └── build.gradle ├── AsyncRssClient ├── .gitignore ├── src │ ├── androidTest │ │ ├── assets │ │ │ ├── assets_utils_test.txt │ │ │ └── feeds_rebuild_fm.xml │ │ └── java │ │ │ └── rejasupotaro │ │ │ └── asyncrssclient │ │ │ └── test │ │ │ ├── AssetsUtilsTest.java │ │ │ ├── AssetsUtils.java │ │ │ └── RssParserTest.java │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── rejasupotaro │ │ └── asyncrssclient │ │ ├── AsyncRssResponseHandler.java │ │ ├── RssElement.java │ │ ├── MediaEnclosure.java │ │ ├── RssParser.java │ │ ├── AsyncRssClient.java │ │ ├── MediaAttributes.java │ │ ├── MediaThumbnail.java │ │ ├── RssFeed.java │ │ ├── RssItem.java │ │ ├── RssHandler.java │ │ └── ElementSetter.java ├── repository │ └── rejasupotaro │ │ └── async-rss-client │ │ ├── maven-metadata.xml.md5 │ │ ├── maven-metadata.xml.sha1 │ │ ├── 0.0.1 │ │ ├── async-rss-client-0.0.1.aar.md5 │ │ ├── async-rss-client-0.0.1.pom.md5 │ │ ├── async-rss-client-0.0.1.aar.sha1 │ │ ├── async-rss-client-0.0.1.pom.sha1 │ │ ├── async-rss-client-0.0.1.aar │ │ └── async-rss-client-0.0.1.pom │ │ ├── 0.0.2 │ │ ├── async-rss-client-0.0.2.aar.md5 │ │ ├── async-rss-client-0.0.2.pom.md5 │ │ ├── async-rss-client-0.0.2.aar.sha1 │ │ ├── async-rss-client-0.0.2.pom.sha1 │ │ ├── async-rss-client-0.0.2.aar │ │ └── async-rss-client-0.0.2.pom │ │ ├── 0.0.3 │ │ ├── async-rss-client-0.0.3.aar.md5 │ │ ├── async-rss-client-0.0.3.pom.md5 │ │ ├── async-rss-client-0.0.3.aar.sha1 │ │ ├── async-rss-client-0.0.3.pom.sha1 │ │ ├── async-rss-client-0.0.3.aar │ │ └── async-rss-client-0.0.3.pom │ │ ├── 0.0.4 │ │ ├── async-rss-client-0.0.4.aar.md5 │ │ ├── async-rss-client-0.0.4.pom.md5 │ │ ├── async-rss-client-0.0.4.aar.sha1 │ │ ├── async-rss-client-0.0.4.pom.sha1 │ │ ├── async-rss-client-0.0.4.aar │ │ └── async-rss-client-0.0.4.pom │ │ ├── 0.0.5 │ │ ├── async-rss-client-0.0.5.aar.md5 │ │ ├── async-rss-client-0.0.5.pom.md5 │ │ ├── async-rss-client-0.0.5.aar.sha1 │ │ ├── async-rss-client-0.0.5.pom.sha1 │ │ ├── async-rss-client-0.0.5.aar │ │ └── async-rss-client-0.0.5.pom │ │ ├── 0.0.6 │ │ ├── async-rss-client-0.0.6.aar.md5 │ │ ├── async-rss-client-0.0.6.pom.md5 │ │ ├── async-rss-client-0.0.6.aar.sha1 │ │ ├── async-rss-client-0.0.6.pom.sha1 │ │ ├── async-rss-client-0.0.6.aar │ │ └── async-rss-client-0.0.6.pom │ │ └── maven-metadata.xml └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── .travis.yml ├── gradlew.bat ├── README.md └── gradlew /sample/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /AsyncRssClient/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':AsyncRssClient', ':sample' 2 | -------------------------------------------------------------------------------- /AsyncRssClient/src/androidTest/assets/assets_utils_test.txt: -------------------------------------------------------------------------------- 1 | Hello World! -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/maven-metadata.xml.md5: -------------------------------------------------------------------------------- 1 | 437f0976e43d4634986fe447f95c4742 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/maven-metadata.xml.sha1: -------------------------------------------------------------------------------- 1 | 57b3ee3203b5db09c3adff4f33500b941569e7eb -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.aar.md5: -------------------------------------------------------------------------------- 1 | 88e7c4286eb45d6f4ca37031263ed08e -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.pom.md5: -------------------------------------------------------------------------------- 1 | 0fe5610d67f696336e826bd77d374470 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.aar.md5: -------------------------------------------------------------------------------- 1 | 1013c35e8148edfc74b13a45ae266633 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.pom.md5: -------------------------------------------------------------------------------- 1 | a1f5effc559ac2b753fd332dcf4ca3cb -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.aar.md5: -------------------------------------------------------------------------------- 1 | 9e99e92da1691375a100005279364f6b -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.pom.md5: -------------------------------------------------------------------------------- 1 | 9d392063d7213fce847b74e1bb35ee42 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.aar.md5: -------------------------------------------------------------------------------- 1 | 966eb483da74de982121b2bc7de4a29f -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.pom.md5: -------------------------------------------------------------------------------- 1 | 34d340b636dd5ba88b331fad5b4820c7 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.aar.md5: -------------------------------------------------------------------------------- 1 | a211ae628e1e9c1e264ace53db4a9211 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.pom.md5: -------------------------------------------------------------------------------- 1 | 21e485d2bd5ead8437d240ab386e79ab -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.aar.md5: -------------------------------------------------------------------------------- 1 | be397f6092b44a8b74726d6ef8d60fe3 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.pom.md5: -------------------------------------------------------------------------------- 1 | f5a141d1e34cf59eb9b08a09b2d06099 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.aar.sha1: -------------------------------------------------------------------------------- 1 | 4781baffe1cc08a317e211d017bcda3d7a0d202d -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.pom.sha1: -------------------------------------------------------------------------------- 1 | 597dd0f9aa4bd8054fe63659d0cd196dbf4ac0b7 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.aar.sha1: -------------------------------------------------------------------------------- 1 | fa04d4d668e014421924cb2172c91df1f6dac2d4 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.pom.sha1: -------------------------------------------------------------------------------- 1 | 05b4303e848d04c6819488f823434ff436039ca4 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.aar.sha1: -------------------------------------------------------------------------------- 1 | bffb1ed688e0d57440a9a2f11fa4ea32f61d2dc1 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.pom.sha1: -------------------------------------------------------------------------------- 1 | 4ea2635e80c239ed299119ff5a5702ea00a806f6 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.aar.sha1: -------------------------------------------------------------------------------- 1 | e17d7305756a272fd7d0f01f5b6579cfd1fd6c07 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.pom.sha1: -------------------------------------------------------------------------------- 1 | 107857191d1658752be1da0bf7c69663dbad1f9b -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.aar.sha1: -------------------------------------------------------------------------------- 1 | 3405b76e75c9589e4daead111cadfc1a7bf7c12c -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.pom.sha1: -------------------------------------------------------------------------------- 1 | d0edae5d024420c694e525e4195cde9db2bc6522 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.aar.sha1: -------------------------------------------------------------------------------- 1 | 207d12025d5526df7f8f8d1a1f0ed3c4c924f142 -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.pom.sha1: -------------------------------------------------------------------------------- 1 | 12d17df4e2bb18ff9de9391a57498aede7250c23 -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /sample/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/sample/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /sample/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/sample/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/sample/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/sample/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/sample/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.iws 3 | *.ipr 4 | .idea/ 5 | .gradle/ 6 | local.properties 7 | 8 | */build/ 9 | 10 | *~ 11 | *.swp 12 | .DS_Store 13 | 14 | build 15 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.aar -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.aar -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.aar -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.aar -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.aar -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rejasupotaro/AsyncRssClient/HEAD/AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.aar -------------------------------------------------------------------------------- /sample/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | AsyncRssClient Sample 5 | Settings 6 | 7 | 8 | -------------------------------------------------------------------------------- /sample/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jun 15 16:38:18 JST 2014 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip 7 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/AsyncRssResponseHandler.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import org.apache.http.Header; 4 | 5 | public interface AsyncRssResponseHandler { 6 | public void onSuccess(RssFeed rssFeed); 7 | public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error); 8 | } 9 | -------------------------------------------------------------------------------- /sample/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /sample/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | 20sp 7 | 12sp 8 | 9 | 12dp 10 | 11 | 12 | -------------------------------------------------------------------------------- /sample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /AsyncRssClient/src/androidTest/java/rejasupotaro/asyncrssclient/test/AssetsUtilsTest.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient.test; 2 | 3 | import android.test.AndroidTestCase; 4 | import android.test.InstrumentationTestCase; 5 | 6 | public class AssetsUtilsTest extends InstrumentationTestCase { 7 | 8 | public void testRead() { 9 | String text = AssetsUtils.read(getInstrumentation(), "assets_utils_test.txt"); 10 | assertEquals("Hello World!", text); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sample/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/maven-metadata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | rejasupotaro 4 | async-rss-client 5 | 0.0.1 6 | 7 | 8 | 0.0.1 9 | 0.0.2 10 | 0.0.3 11 | 0.0.4 12 | 0.0.5 13 | 0.0.6 14 | 15 | 20141101035654 16 | 17 | 18 | -------------------------------------------------------------------------------- /sample/proguard-rules.txt: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the ProGuard 5 | # include property in project.properties. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.1/async-rss-client-0.0.1.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.1 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.2/async-rss-client-0.0.2.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.2 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.3/async-rss-client-0.0.3.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.3 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.4/async-rss-client-0.0.4.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.4 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.5/async-rss-client-0.0.5.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.5 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /AsyncRssClient/repository/rejasupotaro/async-rss-client/0.0.6/async-rss-client-0.0.6.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | rejasupotaro 6 | async-rss-client 7 | 0.0.6 8 | aar 9 | 10 | 11 | com.loopj.android 12 | android-async-http 13 | 1.4.4 14 | compile 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /sample/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenCentral() 4 | } 5 | dependencies { 6 | classpath 'com.android.tools.build:gradle:0.12.2' 7 | } 8 | } 9 | apply plugin: 'com.android.application' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | android { 16 | compileSdkVersion 21 17 | buildToolsVersion '21.0.2' 18 | 19 | defaultConfig { 20 | minSdkVersion 9 21 | targetSdkVersion 21 22 | versionCode 1 23 | versionName "1.0" 24 | } 25 | buildTypes { 26 | release { 27 | runProguard false 28 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 29 | } 30 | } 31 | } 32 | 33 | dependencies { 34 | compile 'com.android.support:appcompat-v7:21.0.0' 35 | compile project(':AsyncRssClient') 36 | } 37 | -------------------------------------------------------------------------------- /sample/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /AsyncRssClient/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenCentral() 4 | } 5 | dependencies { 6 | classpath 'com.android.tools.build:gradle:0.12.2' 7 | } 8 | } 9 | 10 | apply plugin: 'com.android.library' 11 | apply plugin: 'maven' 12 | 13 | uploadArchives { 14 | repositories { 15 | mavenDeployer { 16 | repository url: "file://${projectDir}/repository" 17 | pom.groupId = 'rejasupotaro' 18 | pom.artifactId = 'async-rss-client' 19 | pom.version = '0.0.6' 20 | } 21 | } 22 | } 23 | 24 | repositories { 25 | mavenCentral() 26 | } 27 | 28 | android { 29 | compileSdkVersion 21 30 | buildToolsVersion '21.0.2' 31 | 32 | defaultConfig { 33 | minSdkVersion 9 34 | targetSdkVersion 21 35 | } 36 | } 37 | 38 | dependencies { 39 | compile 'com.loopj.android:android-async-http:1.4.4' 40 | } 41 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/RssElement.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | public abstract class RssElement { 6 | 7 | void setTitle(String title) { 8 | } 9 | 10 | void setDescription(String description) { 11 | } 12 | 13 | void setContent(String content) { 14 | } 15 | 16 | void setLink(Uri link) { 17 | } 18 | 19 | void setPubDate(String pubDate) { 20 | } 21 | 22 | void addCategory(String category) { 23 | } 24 | 25 | void setLastBuildDate(String lastBuildDate) { 26 | } 27 | 28 | void setTtl(String ttl) { 29 | } 30 | 31 | void setMediaEnclosure(MediaEnclosure mediaEnclosure) { 32 | } 33 | 34 | void addMediaThumbnail(MediaThumbnail mediaThumbnail) { 35 | } 36 | 37 | void setSubtitle(String subtitle) { 38 | } 39 | 40 | void setDuration(String subtitle) { 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sample/src/main/res/layout/list_item_entry.xml: -------------------------------------------------------------------------------- 1 | 7 | 16 | 22 | 23 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: oraclejdk7 3 | before_install: 4 | # Install base Android SDK and components 5 | - sudo apt-get install -qq libstdc++6:i386 lib32z1 6 | - export COMPONENTS=build-tools-19.0.1,android-18,sysimg-18,extra-android-support,extra-google-google_play_services,extra-google-gcm,extra-google-m2repository,extra-android-m2repository 7 | - curl -L https://raw.github.com/embarkmobile/android-sdk-installer/version-1/android-sdk-installer | bash /dev/stdin --install=$COMPONENTS 8 | - source ~/.android-sdk-installer/env 9 | 10 | # Create and start emulator 11 | - echo no | android create avd --force -n test -t android-18 --abi armeabi-v7a 12 | - emulator -avd test -no-skin -no-audio -no-window & 13 | 14 | install: 15 | # Without TERM=dumb, we get mangled output in the Travis console 16 | - TERM=dumb ./gradlew assemble 17 | 18 | before_script: 19 | # Make sure the emulator has started before running tests 20 | - wait_for_emulator 21 | 22 | script: 23 | - TERM=dumb ./gradlew connectedInstrumentTest 24 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/MediaEnclosure.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | public final class MediaEnclosure { 6 | private final Uri url; 7 | private final int length; 8 | private final String mimeType; 9 | 10 | /** 11 | * Returns the URL of the enclosure. The return value is never {@code null}. 12 | */ 13 | public Uri getUrl() { 14 | return url; 15 | } 16 | 17 | /** 18 | * Returns the length of the enclosure. 19 | */ 20 | public int getLength() { 21 | return length; 22 | } 23 | 24 | /** 25 | * Returns the mime type of the enclosure. The return value is never 26 | * {@code null}. 27 | */ 28 | public String getMimeType() { 29 | return mimeType; 30 | } 31 | 32 | /** 33 | * Internal constructor for RSSHandler 34 | */ 35 | MediaEnclosure(android.net.Uri url, int length, String mimeType) { 36 | this.url = url; 37 | this.length = length; 38 | this.mimeType = mimeType; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /sample/src/main/java/rejasupotaro/example/asyncrssclient/adapters/EntryAdapter.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.example.asyncrssclient.adapters; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import java.util.List; 10 | 11 | import rejasupotaro.example.asyncrssclient.R; 12 | import rejasupotaro.example.asyncrssclient.models.Entry; 13 | 14 | public class EntryAdapter extends BindableAdapter { 15 | 16 | public EntryAdapter(Context context, List episodeList) { 17 | super(context, episodeList); 18 | } 19 | 20 | @Override 21 | public View newView(LayoutInflater inflater, int position, ViewGroup container) { 22 | return inflater.inflate(R.layout.list_item_entry, container, false); 23 | } 24 | 25 | @Override 26 | public void bindView(Entry item, int position, View view) { 27 | TextView entryTitleTextView = (TextView) view.findViewById(R.id.entry_title); 28 | entryTitleTextView.setText(item.getTitle()); 29 | 30 | TextView entryDescriptionTextView = (TextView) view.findViewById(R.id.entry_description); 31 | entryDescriptionTextView.setText(item.getDescription()); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/RssParser.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import org.apache.http.protocol.HTTP; 4 | import org.xml.sax.InputSource; 5 | import org.xml.sax.SAXException; 6 | import org.xml.sax.XMLReader; 7 | 8 | import java.io.ByteArrayInputStream; 9 | import java.io.IOException; 10 | 11 | import javax.xml.parsers.ParserConfigurationException; 12 | import javax.xml.parsers.SAXParser; 13 | import javax.xml.parsers.SAXParserFactory; 14 | 15 | public class RssParser { 16 | public RssFeed parse(byte[] data) throws IOException, SAXException, ParserConfigurationException { 17 | return parse(new String(data, HTTP.UTF_8)); 18 | } 19 | 20 | public RssFeed parse(String data) throws ParserConfigurationException, SAXException, IOException { 21 | SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 22 | SAXParser saxParser = saxParserFactory.newSAXParser(); 23 | XMLReader xmlReader = saxParser.getXMLReader(); 24 | RssHandler handler = new RssHandler(); 25 | 26 | xmlReader.setContentHandler(handler); 27 | InputSource source = new InputSource(new ByteArrayInputStream(data.getBytes(HTTP.UTF_8))); 28 | xmlReader.parse(source); 29 | 30 | return handler.getRssFeed(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sample/src/main/java/rejasupotaro/example/asyncrssclient/adapters/BindableAdapter.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.example.asyncrssclient.adapters; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ArrayAdapter; 8 | 9 | import java.util.List; 10 | 11 | public abstract class BindableAdapter extends ArrayAdapter { 12 | 13 | private LayoutInflater mInflater; 14 | 15 | public BindableAdapter(Context context, List episodeList) { 16 | super(context, -1, episodeList); 17 | setup(context); 18 | } 19 | 20 | private void setup(Context context) { 21 | mInflater = LayoutInflater.from(context); 22 | } 23 | 24 | @Override 25 | public final View getView(int position, View view, ViewGroup container) { 26 | if (view == null) { 27 | view = newView(mInflater, position, container); 28 | if (view == null) { 29 | throw new IllegalStateException("newView result must not be null."); 30 | } 31 | } 32 | bindView(getItem(position), position, view); 33 | return view; 34 | } 35 | 36 | public abstract View newView(LayoutInflater inflater, int position, ViewGroup container); 37 | 38 | public abstract void bindView(T item, int position, View view); 39 | } 40 | 41 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/AsyncRssClient.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import com.loopj.android.http.AsyncHttpClient; 4 | import com.loopj.android.http.AsyncHttpResponseHandler; 5 | 6 | import org.apache.http.Header; 7 | import org.apache.http.protocol.HTTP; 8 | 9 | public class AsyncRssClient { 10 | 11 | private static final AsyncHttpClient sClient = new AsyncHttpClient(); 12 | 13 | private static final RssParser sHandler = new RssParser(); 14 | 15 | public static void setUserAgent(String userAgent) { 16 | sClient.setUserAgent(userAgent); 17 | } 18 | 19 | public void read(String url, final AsyncRssResponseHandler handler) { 20 | sClient.get(url, new AsyncHttpResponseHandler() { 21 | @Override 22 | public void onSuccess(int statusCode, Header[] headers, byte[] body) { 23 | try { 24 | RssFeed rssFeed = sHandler.parse(body); 25 | handler.onSuccess(rssFeed); 26 | } catch (Exception error) { 27 | handler.onFailure(statusCode, headers, body, error); 28 | } 29 | } 30 | 31 | @Override 32 | public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 33 | handler.onFailure(statusCode, headers, responseBody, error); 34 | } 35 | }); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/MediaAttributes.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | public class MediaAttributes { 4 | 5 | private MediaAttributes() {} 6 | 7 | /** 8 | * Returns the RSS 2.0 attribute with the specified local name as a string. 9 | * The return value is {@code null} if no attribute with such name exists. 10 | */ 11 | static String stringValue(org.xml.sax.Attributes attributes, String name) { 12 | return attributes.getValue(name); 13 | } 14 | 15 | /** 16 | * Returns the RSS 2.0 attribute with the specified local name as an integer. 17 | * The {@code defaultValue} is returned if no attribute with such name exists. 18 | */ 19 | static int intValue(org.xml.sax.Attributes attributes, String name, int defaultValue) { 20 | final String value = stringValue(attributes, name); 21 | if (value == null) { 22 | return defaultValue; 23 | } 24 | 25 | return Integer.parseInt(value); 26 | } 27 | 28 | /** 29 | * Returns the RSS 2.0 attribute with the specified local name as an 30 | * integer. The return value is {@code null} if no attribute with such name 31 | * exists. 32 | */ 33 | static Integer intValue(org.xml.sax.Attributes attributes, String name) { 34 | final String value = stringValue(attributes, name); 35 | if (value == null) { 36 | return null; 37 | } 38 | return Integer.parseInt(value); 39 | } 40 | } -------------------------------------------------------------------------------- /AsyncRssClient/src/androidTest/java/rejasupotaro/asyncrssclient/test/AssetsUtils.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient.test; 2 | 3 | import android.app.Instrumentation; 4 | import android.content.Context; 5 | import android.content.res.AssetManager; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.io.InputStreamReader; 11 | 12 | public class AssetsUtils { 13 | 14 | public static String read(Instrumentation instrumentation, String fileName) { 15 | String data = ""; 16 | 17 | try { 18 | BufferedReader bufferedReader = null; 19 | try { 20 | AssetManager assetManager = instrumentation.getContext().getAssets(); 21 | InputStream inputStream = assetManager.open(fileName); 22 | bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 23 | 24 | StringBuilder stringBuilder = new StringBuilder(); 25 | String line; 26 | while ((line = bufferedReader.readLine()) != null) { 27 | stringBuilder.append(line); 28 | } 29 | 30 | data = stringBuilder.toString(); 31 | } finally { 32 | if (bufferedReader != null) { 33 | bufferedReader.close(); 34 | } 35 | } 36 | } catch (IOException e) { 37 | e.printStackTrace(); 38 | } 39 | 40 | return data; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sample/src/main/java/rejasupotaro/example/asyncrssclient/HotEntryClient.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.example.asyncrssclient; 2 | 3 | import org.apache.http.Header; 4 | 5 | import android.util.Log; 6 | 7 | import java.util.List; 8 | 9 | import rejasupotaro.asyncrssclient.AsyncRssClient; 10 | import rejasupotaro.asyncrssclient.AsyncRssResponseHandler; 11 | import rejasupotaro.asyncrssclient.RssFeed; 12 | import rejasupotaro.asyncrssclient.RssItem; 13 | import rejasupotaro.example.asyncrssclient.models.Entry; 14 | 15 | public class HotEntryClient { 16 | 17 | private static final String TAG = HotEntryClient.class.getSimpleName(); 18 | 19 | private static final AsyncRssClient sClient = new AsyncRssClient(); 20 | 21 | private static final String HOTENTRY_RSS_URL = "http://b.hatena.ne.jp/hotentry?mode=rss"; 22 | 23 | public static interface HotEntryResponseHandler { 24 | 25 | public void onResponse(List rssItemList); 26 | 27 | public void onErrorResponse(); 28 | } 29 | 30 | public void request(final HotEntryResponseHandler handler) { 31 | sClient.read(HOTENTRY_RSS_URL, new AsyncRssResponseHandler() { 32 | @Override 33 | public void onSuccess(RssFeed rssFeed) { 34 | List rssItemList = rssFeed.getRssItems(); 35 | handler.onResponse(Entry.fromRssItem(rssItemList)); 36 | } 37 | 38 | @Override 39 | public void onFailure(int statusCode, Header[] headers, byte[] responseBody, 40 | Throwable error) { 41 | Log.e(TAG, "Request hot entry failed", error); 42 | handler.onErrorResponse(); 43 | } 44 | }); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/MediaThumbnail.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | public class MediaThumbnail { 6 | private final Uri url; 7 | private final int height; 8 | private final int width; 9 | 10 | /** 11 | * Returns the URL of the thumbnail. 12 | * The return value is never {@code null}. 13 | */ 14 | public Uri getUrl() { 15 | return url; 16 | } 17 | 18 | /** 19 | * Returns the thumbnail's height or {@code -1} if unspecified. 20 | */ 21 | public int getHeight() { 22 | return height; 23 | } 24 | 25 | /** 26 | * Returns the thumbnail's width or {@code -1} if unspecified. 27 | */ 28 | public int getWidth() { 29 | return width; 30 | } 31 | 32 | /* Internal constructor for RssHandler */ 33 | MediaThumbnail(android.net.Uri url, int height, int width) { 34 | this.url = url; 35 | this.height = height; 36 | this.width = width; 37 | } 38 | 39 | /** 40 | * Returns the hash code of the thumbnail's URL. 41 | */ 42 | @Override 43 | public int hashCode() { 44 | return url.hashCode(); 45 | } 46 | 47 | /** 48 | * Compares the URLs of two thumbnails for equality. 49 | */ 50 | @Override 51 | public boolean equals(Object object) { 52 | if (this == object) { 53 | return true; 54 | } else if (object instanceof MediaThumbnail) { 55 | final MediaThumbnail other = (MediaThumbnail) (object); 56 | 57 | /* other is not null */ 58 | return url.equals(other.url); 59 | } else { 60 | return false; 61 | } 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /AsyncRssClient/src/androidTest/java/rejasupotaro/asyncrssclient/test/RssParserTest.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient.test; 2 | 3 | import android.net.Uri; 4 | import android.test.InstrumentationTestCase; 5 | 6 | import rejasupotaro.asyncrssclient.RssParser; 7 | import rejasupotaro.asyncrssclient.RssFeed; 8 | import rejasupotaro.asyncrssclient.RssItem; 9 | 10 | public class RssParserTest extends InstrumentationTestCase { 11 | 12 | public void testParse() throws Exception { 13 | String testData = AssetsUtils.read(getInstrumentation(), "feeds_rebuild_fm.xml"); 14 | assertNotNull(testData); 15 | 16 | RssParser rssParser = new RssParser(); 17 | 18 | RssFeed rssFeed = rssParser.parse(testData); 19 | assertNotNull(rssFeed); 20 | assertEquals("Rebuild", rssFeed.getTitle()); 21 | assertEquals("ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。", rssFeed.getDescription()); 22 | assertEquals(Uri.parse("http://rebuild.fm"), rssFeed.getLink()); 23 | assertEquals(24, rssFeed.getRssItems().size()); 24 | 25 | RssItem rssItem = rssFeed.getRssItems().get(0); 26 | assertNotNull(rssItem); 27 | assertEquals("24: Go, Mavericks, LinkedIn Intro (typester)", rssItem.getTitle()); 28 | assertNotNull(rssItem.getDescription()); 29 | assertEquals("Thu, 31 Oct 2013 00:00:00 -0700", rssItem.getPubDate()); 30 | assertEquals(Uri.parse("http://rebuild.fm/24/"), rssItem.getLink()); 31 | assertEquals(Uri.parse("http://tracking.feedpress.it/link/1949/5437/podcast-ep24.mp3"), rssItem.getMediaEnclosure().getUrl()); 32 | assertEquals("Daisuke Muraseさん (@typester) をゲストに迎えて、Go, OS X Mavericks, Safari Notifications, LinkedIn Intro, Tweetbot などについて話しました。", rssItem.getSubtitle()); 33 | assertEquals("51:34", rssItem.getDuration()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sample/src/main/java/rejasupotaro/example/asyncrssclient/models/Entry.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.example.asyncrssclient.models; 2 | 3 | import android.net.Uri; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import rejasupotaro.asyncrssclient.RssItem; 9 | 10 | public class Entry { 11 | 12 | private String mTitle; 13 | 14 | private String mDescription; 15 | 16 | private String mContent; 17 | 18 | private Uri mLink; 19 | 20 | public String getTitle() { 21 | return mTitle; 22 | } 23 | 24 | public String getDescription() { 25 | return mDescription; 26 | } 27 | 28 | public String getContent() { 29 | return mContent; 30 | } 31 | 32 | public Uri getLink() { 33 | return mLink; 34 | } 35 | 36 | public Entry() { 37 | } 38 | 39 | public Entry(String title, String description, String content, Uri link) { 40 | mTitle = title; 41 | mDescription = description; 42 | mContent = content; 43 | mLink = link; 44 | } 45 | 46 | public static Entry fromRssItem(RssItem rssItem) { 47 | if (rssItem == null) { 48 | return new Entry(); 49 | } 50 | 51 | Entry entry = new Entry( 52 | rssItem.getTitle(), 53 | rssItem.getDescription(), 54 | rssItem.getContent(), 55 | rssItem.getLink()); 56 | return entry; 57 | } 58 | 59 | public static List fromRssItem(List rssItemList) { 60 | List entryList = new ArrayList(); 61 | if (rssItemList == null || rssItemList.isEmpty()) { 62 | return entryList; 63 | } 64 | 65 | for (RssItem rssItem : rssItemList) { 66 | entryList.add(fromRssItem(rssItem)); 67 | } 68 | return entryList; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/RssFeed.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class RssFeed extends RssElement { 9 | private String title; 10 | private String description; 11 | private Uri link; 12 | private String pubDate; 13 | private String lastBuildDate; 14 | private int ttl; 15 | private List categories; 16 | private List rssItems; 17 | private String subtitle; 18 | 19 | void setTitle(String title) { 20 | this.title = title; 21 | } 22 | 23 | public String getTitle() { 24 | return title; 25 | } 26 | 27 | void setDescription(String description) { 28 | this.description = description; 29 | } 30 | 31 | public String getDescription() { 32 | return description; 33 | } 34 | 35 | void setLink(Uri link) { 36 | this.link = link; 37 | } 38 | 39 | public Uri getLink() { 40 | return link; 41 | } 42 | 43 | void setPubDate(String pubDate) { 44 | this.pubDate = pubDate; 45 | } 46 | 47 | public String getPubDate() { 48 | return pubDate; 49 | } 50 | 51 | void setLastBuildDate(String lastBuildDate) { 52 | this.lastBuildDate = lastBuildDate; 53 | } 54 | 55 | public String getLastBuildDate() { 56 | return lastBuildDate; 57 | } 58 | 59 | void setTtl(int ttl) { 60 | this.ttl = ttl; 61 | } 62 | 63 | public int getTtl() { 64 | return ttl; 65 | } 66 | 67 | void addCategory(String category) { 68 | if (categories == null) { 69 | categories = new ArrayList(); 70 | } 71 | categories.add(category); 72 | } 73 | 74 | public List getCategories() { 75 | return categories; 76 | } 77 | 78 | void addRssItem(RssItem rssItem) { 79 | if (rssItems == null) { 80 | rssItems = new ArrayList(); 81 | } 82 | rssItems.add(rssItem); 83 | } 84 | 85 | public List getRssItems() { 86 | return rssItems; 87 | } 88 | 89 | void setSubtitle(String subtitle) { 90 | this.subtitle = subtitle; 91 | } 92 | 93 | public String getSubtitle() { 94 | return subtitle; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/RssItem.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class RssItem extends RssElement { 9 | private String title; 10 | private String description; 11 | private String content; 12 | private Uri link; 13 | private String pubDate; 14 | private List categories; 15 | private MediaEnclosure mediaEnclosure; 16 | private List mediaThumbnails; 17 | private String subtitle; 18 | private String duration; 19 | 20 | void setTitle(String title) { 21 | this.title = title; 22 | } 23 | 24 | public String getTitle() { 25 | return title; 26 | } 27 | 28 | void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | public String getDescription() { 33 | return description; 34 | } 35 | 36 | void setContent(String content) { 37 | this.content = content; 38 | } 39 | 40 | public String getContent() { 41 | return content; 42 | } 43 | 44 | void setLink(Uri link) { 45 | this.link = link; 46 | } 47 | 48 | public Uri getLink() { 49 | return link; 50 | } 51 | 52 | void setPubDate(String pubDate) { 53 | this.pubDate = pubDate; 54 | } 55 | 56 | public String getPubDate() { 57 | return pubDate; 58 | } 59 | 60 | void addCategory(String category) { 61 | if (categories == null) { 62 | categories = new ArrayList(); 63 | } 64 | categories.add(category); 65 | } 66 | 67 | public List getCategories() { 68 | return categories; 69 | } 70 | 71 | void setMediaEnclosure(MediaEnclosure mediaEnclosure) { 72 | this.mediaEnclosure = mediaEnclosure; 73 | } 74 | 75 | public MediaEnclosure getMediaEnclosure() { 76 | return mediaEnclosure; 77 | } 78 | 79 | void addMediaThumbnail(MediaThumbnail mediaThumbnail) { 80 | if (mediaThumbnails == null) { 81 | mediaThumbnails = new ArrayList(); 82 | } 83 | mediaThumbnails.add(mediaThumbnail); 84 | } 85 | 86 | public List getMediaThumbnails() { 87 | return mediaThumbnails; 88 | } 89 | 90 | void setSubtitle(String subtitle) { 91 | this.subtitle = subtitle; 92 | } 93 | 94 | public String getSubtitle() { 95 | return subtitle; 96 | } 97 | 98 | void setDuration(String duration) { 99 | this.duration = duration; 100 | } 101 | 102 | public String getDuration() { 103 | return duration; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /sample/src/main/java/rejasupotaro/example/asyncrssclient/MainActivity.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.example.asyncrssclient; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.util.Log; 8 | import android.view.Menu; 9 | import android.view.MenuItem; 10 | import android.view.View; 11 | import android.widget.AdapterView; 12 | import android.widget.ListView; 13 | import android.widget.Toast; 14 | 15 | import org.apache.http.Header; 16 | 17 | import java.util.List; 18 | 19 | import rejasupotaro.asyncrssclient.AsyncRssClient; 20 | import rejasupotaro.asyncrssclient.AsyncRssResponseHandler; 21 | import rejasupotaro.asyncrssclient.RssFeed; 22 | import rejasupotaro.asyncrssclient.RssItem; 23 | import rejasupotaro.example.asyncrssclient.adapters.EntryAdapter; 24 | import rejasupotaro.example.asyncrssclient.models.Entry; 25 | 26 | public class MainActivity extends Activity { 27 | 28 | private ListView mHotEntryListView; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_main); 34 | 35 | findViews(); 36 | requestHotEntry(); 37 | } 38 | 39 | private void findViews() { 40 | mHotEntryListView = (ListView) findViewById(R.id.hotentry_list_view); 41 | } 42 | 43 | private void requestHotEntry() { 44 | HotEntryClient client = new HotEntryClient(); 45 | client.request(new HotEntryClient.HotEntryResponseHandler() { 46 | @Override 47 | public void onResponse(List rssItemList) { 48 | setupListView(rssItemList); 49 | } 50 | 51 | @Override 52 | public void onErrorResponse() { 53 | showToast("An error occured while requesting feed"); 54 | } 55 | }); 56 | } 57 | 58 | private void showToast(String message) { 59 | Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); 60 | } 61 | 62 | private void setupListView(List entryList) { 63 | final EntryAdapter entryAdapter = new EntryAdapter(this, entryList); 64 | mHotEntryListView.setAdapter(entryAdapter); 65 | mHotEntryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 66 | @Override 67 | public void onItemClick(AdapterView parent, View view, int position, long id) { 68 | Entry entry = entryAdapter.getItem(position); 69 | openBrowser(entry.getLink()); 70 | } 71 | }); 72 | } 73 | 74 | private void openBrowser(Uri uri) { 75 | startActivity(new Intent(Intent.ACTION_VIEW, uri)); 76 | } 77 | 78 | @Override 79 | public boolean onCreateOptionsMenu(Menu menu) { 80 | getMenuInflater().inflate(R.menu.main, menu); 81 | return true; 82 | } 83 | 84 | @Override 85 | public boolean onOptionsItemSelected(MenuItem item) { 86 | int id = item.getItemId(); 87 | if (id == R.id.action_settings) { 88 | return true; 89 | } 90 | return super.onOptionsItemSelected(item); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/RssHandler.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import org.xml.sax.Attributes; 4 | import org.xml.sax.helpers.DefaultHandler; 5 | 6 | public class RssHandler extends DefaultHandler { 7 | /** 8 | * Constant for XML element name which identifies RSS mRssItems. 9 | */ 10 | private static final String RSS_ITEM = "item"; 11 | 12 | /** 13 | * Reference is never {@code null}. Visibility must be package-private to 14 | * ensure efficiency of inner classes. 15 | */ 16 | private final RssFeed mRssFeed = new RssFeed(); 17 | 18 | /** 19 | * Reference is {@code null} unless started to parse <mRssItem> element. 20 | * Visibility must be package-private to ensure efficiency of inner classes. 21 | */ 22 | private RssItem mRssItem; 23 | 24 | /** 25 | * If not {@code null}, then buffer the characters inside an XML text element. 26 | */ 27 | private StringBuilder mStringBuilder; 28 | 29 | private boolean mHasSetter; 30 | 31 | /** 32 | * Identify the appropriate dispatcher which should be used to store XML data 33 | * in a POJO. Unsupported RSS 2.0 elements are currently ignored. 34 | */ 35 | @Override 36 | public void startElement(String uri, String localName, String qName, Attributes attributes) { 37 | mHasSetter = ElementSetter.contains(qName); 38 | if (!mHasSetter) { 39 | if (RSS_ITEM.equals(qName)) { 40 | mRssItem = new RssItem(); 41 | } 42 | } else if (ElementSetter.containsInAttributes(qName)) { 43 | ElementSetter.setAttributes( 44 | qName, 45 | (mRssItem == null ? mRssFeed : mRssItem), 46 | attributes); 47 | } else { 48 | // Buffer supported RSS content data 49 | mStringBuilder = new StringBuilder(); 50 | } 51 | } 52 | 53 | @Override 54 | public void endElement(String uri, String localName, String qName) { 55 | if (isBuffering()) { 56 | ElementSetter.setContent( 57 | qName, 58 | (mRssItem == null ? mRssFeed : mRssItem), 59 | mStringBuilder.toString()); 60 | mStringBuilder = null; 61 | } else if (RSS_ITEM.equals(qName)) { 62 | mRssFeed.addRssItem(mRssItem); 63 | 64 | // (re)enter scope 65 | mRssItem = null; 66 | } 67 | } 68 | 69 | @Override 70 | public void characters(char ch[], int start, int length) { 71 | if (isBuffering()) { 72 | mStringBuilder.append(ch, start, length); 73 | } 74 | } 75 | 76 | /** 77 | * Determines if the SAX parser is ready to receive data inside an XML element 78 | * such as <title> or <description>. 79 | * 80 | * @return boolean {@code true} if the SAX handler parses data inside an XML 81 | * element, {@code false} otherwise 82 | */ 83 | boolean isBuffering() { 84 | return mStringBuilder != null && mHasSetter; 85 | } 86 | 87 | /** 88 | * Returns the RSS feed after this SAX handler has processed the XML document. 89 | */ 90 | RssFeed getRssFeed() { 91 | return mRssFeed; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AsyncRssClient [![Build Status](https://travis-ci.org/rejasupotaro/AsyncRssClient.png?branch=master)](https://travis-ci.org/rejasupotaro/AsyncRssClient) 2 | ====== 3 | 4 | Simple Asyncronous RSS 2.0 reader library for Android. 5 | 6 | Installation 7 | --------- 8 | 9 | Add dependency in your build settings. 10 | 11 | ```groovy 12 | repositories { 13 | mavenCentral() 14 | maven { url 'https://raw.github.com/rejasupotaro/AsyncRssClient/master/AsyncRssClient/repository' } 15 | } 16 | 17 | dependencies { 18 | ... 19 | compile 'rejasupotaro:async-rss-client:0.0.6' 20 | } 21 | ``` 22 | 23 | Example 24 | --------- 25 | 26 | ### Sample Feed 27 | 28 | ```xml 29 | 30 | 31 | 32 | 33 | Rebuild 34 | ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。 35 | Jekyll 36 | http://rebuild.fm 37 | 38 | 39 | tech,technology,programming,perl,ruby,mobile,web,miyagawa,apple,google,android,development,software 40 | Technology 41 | Tatsuhiko Miyagawa 42 | no 43 | 44 | tech,technology,programming,perl,ruby,mobile,web,miyagawa,apple,google,android,development,software 45 | A Podcast by Tatsuhiko Miyagawa. Talking about Tech, Software Development and Gadgets. 46 | ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。 47 | 48 | 49 | Tatsuhiko Miyagawa 50 | miyagawa@bulknews.net 51 | 52 | ja 53 | 54 | 55 | 24: Go, Mavericks, LinkedIn Intro (typester) 56 | ... 57 | ``` 58 | 59 | ### Request Feed 60 | 61 | ```java 62 | AsyncRssClient client = new AsyncRssClient(); 63 | client.read("http://feeds.rebuild.fm/rebuildfm", new AsyncRssResponseHandler() { 64 | @Override 65 | public void onSuccess(RssFeed rssFeed) { 66 | rssFeed.getTitle(); // => Rebuild 67 | rssFeed.getDescription(); // => ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。 68 | 69 | RssItem rssItem = rssFeed.getRssItems().get(0); 70 | rssItem.getTitle(); // => 24: Go, Mavericks, LinkedIn Intro (typester) 71 | } 72 | 73 | @Override 74 | public void onFailure(int statusCode, Header[] headers, byte[] responseBody, 75 | Throwable error) { 76 | ... 77 | } 78 | }); 79 | ``` 80 | 81 | License 82 | --------- 83 | 84 | ``` 85 | Copyright 2013 Kentaro Takiguchi 86 | 87 | Licensed under the Apache License, Version 2.0 (the "License"); 88 | you may not use this file except in compliance with the License. 89 | You may obtain a copy of the License at 90 | 91 | http://www.apache.org/licenses/LICENSE-2.0 92 | 93 | Unless required by applicable law or agreed to in writing, software 94 | distributed under the License is distributed on an "AS IS" BASIS, 95 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 96 | See the License for the specific language governing permissions and 97 | limitations under the License. 98 | ``` 99 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /AsyncRssClient/src/main/java/rejasupotaro/asyncrssclient/ElementSetter.java: -------------------------------------------------------------------------------- 1 | package rejasupotaro.asyncrssclient; 2 | 3 | import android.net.Uri; 4 | 5 | import org.xml.sax.Attributes; 6 | 7 | public enum ElementSetter { 8 | TITLE("title", new ContentSetter() { 9 | @Override 10 | public void set(RssElement element, String value) { 11 | element.setTitle(value); 12 | } 13 | }), 14 | DESCRIPTION("description", new ContentSetter() { 15 | 16 | @Override 17 | public void set(RssElement element, String value) { 18 | element.setDescription(value); 19 | } 20 | }), 21 | CONTENT("content:encode", new ContentSetter() { 22 | @Override 23 | public void set(RssElement element, String value) { 24 | element.setContent(value); 25 | } 26 | }), 27 | LINK("link", new ContentSetter() { 28 | @Override 29 | public void set(RssElement element, String value) { 30 | element.setLink(Uri.parse(value)); 31 | } 32 | }), 33 | CATEGORY("category", new ContentSetter() { 34 | @Override 35 | public void set(RssElement element, String value) { 36 | element.addCategory(value); 37 | } 38 | }), 39 | PUB_DATE("pubDate", new ContentSetter() { 40 | @Override 41 | public void set(RssElement element, String value) { 42 | element.setPubDate(value); 43 | } 44 | }), 45 | LAST_BUILD_DATE("lastBuildDate", new ContentSetter() { 46 | @Override 47 | public void set(RssElement element, String value) { 48 | element.setLastBuildDate(value); 49 | } 50 | }), 51 | TTL("ttl", new ContentSetter() { 52 | @Override 53 | public void set(RssElement element, String value) { 54 | element.setTtl(value); 55 | } 56 | }), 57 | MEDIA_THUMBNAIL("media:thumbnail", new AttributeSetter() { 58 | 59 | private static final String MEDIA_THUMBNAIL_HEIGHT = "height"; 60 | private static final String MEDIA_THUMBNAIL_WIDTH = "width"; 61 | private static final String MEDIA_THUMBNAIL_URL = "url"; 62 | private static final int DEFAULT_DIMENSION = -1; 63 | 64 | @Override 65 | public void set(RssElement element, Attributes attributes) { 66 | final int height = MediaAttributes.intValue(attributes, MEDIA_THUMBNAIL_HEIGHT, DEFAULT_DIMENSION); 67 | final int width = MediaAttributes.intValue(attributes, MEDIA_THUMBNAIL_WIDTH, DEFAULT_DIMENSION); 68 | final String url = MediaAttributes.stringValue(attributes, MEDIA_THUMBNAIL_URL); 69 | 70 | if (url == null) { 71 | // ignore invalid media:thumbnail elements which have no URL. 72 | return; 73 | } 74 | 75 | element.addMediaThumbnail(new MediaThumbnail(android.net.Uri.parse(url), height, width)); 76 | } 77 | }), 78 | ENCLOSURE("enclosure", new AttributeSetter() { 79 | 80 | private static final String URL = "url"; 81 | private static final String LENGTH = "length"; 82 | private static final String MIMETYPE = "type"; 83 | 84 | @Override 85 | public void set(RssElement element, Attributes attributes) { 86 | final String url = MediaAttributes.stringValue(attributes, URL); 87 | final Integer length = MediaAttributes.intValue(attributes, LENGTH); 88 | final String mimeType = MediaAttributes.stringValue(attributes, 89 | MIMETYPE); 90 | 91 | if (url == null || length == null || mimeType == null) { 92 | // Ignore invalid elements. 93 | return; 94 | } 95 | 96 | MediaEnclosure enclosure = new MediaEnclosure( 97 | android.net.Uri.parse(url), length, mimeType); 98 | element.setMediaEnclosure(enclosure); 99 | } 100 | }), 101 | ITUNES_SUBTITLE("itunes:subtitle", new ContentSetter() { 102 | @Override 103 | public void set(RssElement element, String value) { 104 | element.setSubtitle(value); 105 | } 106 | }), 107 | ITUNES_DURATION("itunes:duration", new ContentSetter() { 108 | @Override 109 | public void set(RssElement element, String value) { 110 | element.setDuration(value); 111 | } 112 | }); 113 | 114 | private String mQName; 115 | 116 | private Setter mSetter; 117 | 118 | private ElementSetter(String qName, Setter setter) { 119 | mQName = qName; 120 | mSetter = setter; 121 | } 122 | 123 | private static Setter getSetter(String qName) { 124 | for (ElementSetter elementSetter : ElementSetter.values()) { 125 | if (elementSetter.mQName.equals(qName)) { 126 | return elementSetter.mSetter; 127 | } 128 | } 129 | return null; 130 | } 131 | 132 | public static void setContent(String qName, RssElement element, String content) { 133 | Setter setter = getSetter(qName); 134 | if (setter instanceof ContentSetter) { 135 | ((ContentSetter) setter).set(element, content); 136 | } 137 | } 138 | public static void setAttributes(String qName, RssElement element, Attributes attributes) { 139 | Setter setter = getSetter(qName); 140 | if (setter instanceof AttributeSetter) { 141 | ((AttributeSetter) setter).set(element, attributes); 142 | } 143 | } 144 | 145 | public static boolean contains(String qName) { 146 | return (getSetter(qName) != null); 147 | } 148 | 149 | public static boolean containsInAttributes(String qName) { 150 | return (getSetter(qName) instanceof AttributeSetter); 151 | } 152 | 153 | /** 154 | * Interface to store information about RSS elements. 155 | */ 156 | public static interface Setter {} 157 | 158 | /** 159 | * Closure to change fields in POJOs which store RSS content. 160 | */ 161 | public static interface ContentSetter extends Setter { 162 | /** 163 | * Set the field of an object which represents an RSS element. 164 | */ 165 | void set(RssElement element, String value); 166 | } 167 | 168 | /** 169 | * Closure to change fields in POJOs which store information 170 | * about RSS elements which have only attributes. 171 | */ 172 | private static interface AttributeSetter extends Setter { 173 | /** 174 | * Set the XML attributes. 175 | */ 176 | void set(RssElement element, Attributes attributes); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /AsyncRssClient/src/androidTest/assets/feeds_rebuild_fm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Rebuild 6 | ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。 7 | Jekyll 8 | http://rebuild.fm 9 | 10 | 11 | tech,technology,programming,perl,ruby,mobile,web,miyagawa,apple,google,android,development,software 12 | Technology 13 | Tatsuhiko Miyagawa 14 | no 15 | 16 | tech,technology,programming,perl,ruby,mobile,web,miyagawa,apple,google,android,development,software 17 | A Podcast by Tatsuhiko Miyagawa. Talking about Tech, Software Development and Gadgets. 18 | ウェブ開発、プログラミング、モバイル、ガジェットなどにフォーカスしたテクノロジー系ポッドキャストです。 19 | 20 | 21 | Tatsuhiko Miyagawa 22 | miyagawa@bulknews.net 23 | 24 | ja 25 | 26 | 27 | 24: Go, Mavericks, LinkedIn Intro (typester) 28 | <p>Daisuke Muraseさん (<a href="https://twitter.com/typester">@typester</a>) をゲストに迎えて、Go, OS X Mavericks, Safari Notifications, LinkedIn Intro, Tweetbot などについて話しました。</p> 29 | 30 | <h3>Show Notes</h3> 31 | 32 | <ul> 33 | <li><a href="https://toolbelt.heroku.com/">Heroku Toolbelt</a></li> 34 | <li><a href="https://github.com/heroku/hk">Heroku Client in Go</a></li> 35 | <li><a href="http://dave.cheney.net/2012/09/08/an-introduction-to-cross-compilation-with-go">Cross compilation with Go</a></li> 36 | <li><a href="https://github.com/mattn/gom">mattn/gom</a></li> 37 | <li><a href="https://github.com/rosylilly/gondler">rosylilly/gondler</a></li> 38 | <li><a href="http://qiita.com/advent-calendar/2013/go/participants">Go Advent Calendar 2013</a></li> 39 | <li><a href="http://arstechnica.com/apple/2013/10/os-x-10-9/">OS X Mavericks Review</a></li> 40 | <li><a href="https://developer.apple.com/notifications/safari-push-notifications/">Safari Push Notifications</a></li> 41 | <li><a href="http://engineering.linkedin.com/mobile/linkedin-intro-doing-impossible-ios">LinkedIn Intro: Doing the impossible with iOS</a></li> 42 | <li><a href="http://www.marco.org/2013/10/25/linkedin-intro-insecurity">LinkedIn Intro&#39;s security nightmare</a></li> 43 | <li><a href="http://www.theverge.com/2013/10/24/4987422/tweetbot-3-for-iphone-app">Tweebot 3 is a paid upgrade</a></li> 44 | <li><a href="http://lifehacker.com/bypass-falcon-pros-twitter-token-limit-with-this-chea-754679503">Falcon Pro&#39;s Twitter Token Limit</a></li> 45 | <li><a href="http://unknownplace.org/archives/start-new-company.html">unknownplace.org:独立しました</a></li> 46 | <li><a href="http://im.kayac.com/">im.kayac.com</a></li> 47 | </ul> 48 | 49 | Thu, 31 Oct 2013 00:00:00 -0700 50 | http://rebuild.fm/24/ 51 | http://rebuild.fm/24/ 52 | Tatsuhiko Miyagawa 53 | 54 | no 55 | Daisuke Muraseさん (@typester) をゲストに迎えて、Go, OS X Mavericks, Safari Notifications, LinkedIn Intro, Tweetbot などについて話しました。 56 | Daisuke Muraseさん (@typester) をゲストに迎えて、Go, OS X Mavericks, Safari Notifications, LinkedIn Intro, Tweetbot などについて話しました。 57 | 51:34 58 | 59 | 60 | 61 | 62 | 63 | 23: iPad, Mavericks and Macbook Pro (Kenn Ejima, Hakuro Matsuda) 64 | <p>Kenn Ejimaさん (<a href="https://twitter.com/kenn">@kenn</a>), Hakuro Matsudaさん (<a href="https://twitter.com/hak">@hak</a>) をゲストに迎えて、iPad, OS X Mavericks, Macbook Pro などについて話しました。</p> 65 | 66 | <h3>Show Notes</h3> 67 | 68 | <ul> 69 | <li><a href="http://www.apple.com/apple-events/october-2013/">Apple Special Event October 2013</a></li> 70 | <li><a href="http://www.theverge.com/2013/10/23/4867502/why-would-anyone-buy-an-ipad-2">Why would anyone buy an iPad 2 now?</a></li> 71 | <li><a href="http://www.apple.com/ipad/compare/">Apple iPad Compare iPads</a></li> 72 | <li><a href="https://squareup.com/stand">Square Stand</a></li> 73 | <li><a href="https://itunes.apple.com/us/app/status-board/id449955536?mt=8">Status Board</a></li> 74 | <li><a href="http://www.theverge.com/2013/10/23/4947704/t-mobile-makes-free-ipad-data-offer-official">T-Mobile makes tablet data free</a></li> 75 | <li><a href="http://www.macrumors.com/2013/10/23/13-inch-2013-macbook-air-gets-up-to-15-hours-of-battery-life-with-mavericks/">2013 Macbook Air Gets 15 hours of Battery Life with Mavericks</a></li> 76 | <li><a href="http://news.cnet.com/8301-13579_3-57608550-37/apple-makes-ilife-iwork-free-with-new-ios-or-mac-purchase/">Apple makes iLife, iWork free with new iOS or Mac purchase</a></li> 77 | <li><a href="http://www.apple.com/macbook-pro/">Apple Macbook Pro</a></li> 78 | <li><a href="http://www.apple.com/logic-pro/">Logic Pro X</a></li> 79 | <li><a href="http://www.theverge.com/2013/10/22/4867386/apple-releases-ios-7-0-3-update">iOS 7.0.3 released with cures for motion sickness</a></li> 80 | </ul> 81 | 82 | Thu, 24 Oct 2013 00:00:00 -0700 83 | http://rebuild.fm/23/ 84 | http://rebuild.fm/23/ 85 | Tatsuhiko Miyagawa 86 | 87 | no 88 | Kenn Ejimaさん (@kenn), Hakuro Matsudaさん (@hak) をゲストに迎えて、iPad, OS X Mavericks, Macbook Pro などについて話しました。 89 | 90 | Kenn Ejimaさん (@kenn), Hakuro Matsudaさん (@hak) をゲストに迎えて、iPad, OS X Mavericks, Macbook Pro などについて話しました。 91 | 92 | 58:23 93 | 94 | 95 | 96 | 97 | 98 | 22: The Weird Gadgets: Qi, Google and SONY (drikin) 99 | <p>drikin (<a href="https://twitter.com/drikin">@drikin</a>) をゲストに迎えて、Qi充電、Chromebook, QX-100 などについて話しました。</p> 100 | 101 | <h3>Show Notes</h3> 102 | 103 | <ul> 104 | <li><a href="http://weblog.bulknews.net/post/62842510902/wireless-charging-now-becomes-real">Wireless Charging now becomes real</a></li> 105 | <li><a href="http://www.amazon.co.jp/dp/B00DZFHDGG/bulknews-22?ie=UTF8&amp;qid=1380666636&amp;sr=8-1&amp;keywords=ravpower+qi">RAVPower Qi 2-in-1</a></li> 106 | <li><a href="http://blog.drikin.com/2013/09/iphone-5sqi.html">iPhone 5sを無線充電Qi対応にするケースで失敗した件</a></li> 107 | <li><a href="http://www.theverge.com/2013/10/1/4791848/wireless-charging-war-qualcomm-power-matters-alliance">Qualcomm joins Power Matters Alliance</a></li> 108 | <li><a href="http://www.google.com/intl/en/chrome/devices/hp-chromebook-11/">HP Chromebook 11</a></li> 109 | <li><a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo?hl=ja">Secure Shell Chrome extension</a></li> 110 | <li><a href="http://www.theverge.com/2013/9/29/4783132/the-amazing-products-of-weird-sony">The Amazing Products of Weird SONY</a></li> 111 | <li><a href="http://blog.drikin.com/2013/09/qx-100-1.html">ソニーの新発想レンズカメラ QX-100</a></li> 112 | <li><a href="http://www.engadget.com/2013/09/25/sony-qx100-lens-camera/">Sony&#39;s QX100 is fantastic, impractical</a></li> 113 | <li><a href="http://www.sony.co.jp/SonyInfo/News/Press/201309/13-109/">ソニー Camera Remote API</a></li> 114 | </ul> 115 | 116 | Fri, 11 Oct 2013 00:00:00 -0700 117 | http://rebuild.fm/22/ 118 | http://rebuild.fm/22/ 119 | Tatsuhiko Miyagawa 120 | 121 | no 122 | drikin (@drikin) をゲストに迎えて、Qi充電、Chromebook, QX-100 などについて話しました。 123 | 124 | drikin (@drikin) をゲストに迎えて、Qi充電、Chromebook, QX-100 などについて話しました。 125 | 126 | 44:25 127 | 128 | 129 | 130 | 131 | 132 | 21: On the Launch of iPhone 5s and iOS 7 (Naoya Ito) 133 | <p>Naoya Ito さん (<a href="https://twitter.com/naoya_ito">@naoya_ito</a>) をゲストに迎えて、iPhone 5s, iOS 7などについて話しました。</p> 134 | 135 | <h3>Show Notes</h3> 136 | 137 | <ul> 138 | <li><a href="http://techcrunch.com/2013/09/20/apples-iphone-5s-and-5c-launch-draws-big-crowds-including-biggest-ever-line-at-nyc-flagship-store/">iPhone 5s and 5c Launch</a></li> 139 | <li><a href="https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html">Apple Notification Center Service</a></li> 140 | <li><a href="https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSAttributedString_Class/Reference/Reference.html">NSAttributedString</a></li> 141 | <li><a href="https://developer.apple.com/news/?id=9182013a">Apple: Managing Availability of Your Apps&#39; Previous Versions</a></li> 142 | <li><a href="https://mixpanel.com/trends/#report/ios_7">MixPanel iOS 7 upgrade report</a></li> 143 | <li><a href="http://www.macworld.com/article/2048947/itunes-11-1-brings-itunes-radio-genius-shuffle-podcast-stations-more.html">iTunes 11.1 ships with Podcast stations</a></li> 144 | </ul> 145 | 146 | Sun, 22 Sep 2013 00:00:00 -0700 147 | http://rebuild.fm/21/ 148 | http://rebuild.fm/21/ 149 | Tatsuhiko Miyagawa 150 | 151 | no 152 | Naoya Ito さん (@naoya_ito) をゲストに迎えて、iPhone 5s, iOS 7などについて話しました。 153 | 154 | Naoya Ito さん (@naoya_ito) をゲストに迎えて、iPhone 5s, iOS 7などについて話しました。 155 | 156 | 20:19 157 | 158 | 159 | 160 | 161 | 162 | 20: iPhone 5s (Kenn Ejima, Hakuro Matsuda) 163 | <p>Kenn Ejima さん (<a href="https://twitter.com/kenn">@kenn</a>), Hakuro Matsuda さん (<a href="https://twitter.com/hak">@hak</a>) をゲストに迎えて、iPhone 5c, 5s, A7, Touch ID について話しました。</p> 164 | 165 | <h3>Show Notes</h3> 166 | 167 | <ul> 168 | <li><a href="http://www.apple.com/apple-events/september-2013/">Apple Special Event</a> </li> 169 | <li><a href="http://www.apple.com/iphone/">Apple iPhone 5c/5s</a></li> 170 | <li><a href="http://daringfireball.net/2013/09/iphone_5c_5c_event">Thoughts and Observations on Today&#39;s iPhone 5C and 5S Introduction</a></li> 171 | <li><a href="http://news.cnet.com/8301-1035_3-57602372-94/the-real-reasons-apples-64-bit-a7-chip-makes-sense/">The real reasons Apple&#39;s 64-bit A7 chip makes sense</a></li> 172 | <li><a href="http://www.theverge.com/2013/9/10/4714814/apple-iphone-5s-camera-specs">iPhone 5s camera specs</a></li> 173 | <li><a href="http://www.macworld.com/article/2048514/the-iphone-5s-fingerprint-reader-what-you-need-to-know.html">iPhone 5s fingerprint reader</a></li> 174 | <li><a href="http://www.nytimes.com/2013/09/10/business/the-border-is-a-back-door-for-us-device-searches.html">The Border Is a Back Door for US Device Searches</a></li> 175 | </ul> 176 | 177 | Thu, 12 Sep 2013 00:00:00 -0700 178 | http://rebuild.fm/20/ 179 | http://rebuild.fm/20/ 180 | Tatsuhiko Miyagawa 181 | 182 | no 183 | Kenn Ejima さん (@kenn), Hakuro Matsuda さん (@hak) をゲストに迎えて、iPhone 5c, 5s, A7, Touch ID について話しました。 184 | 185 | Kenn Ejima さん (@kenn), Hakuro Matsuda さん (@hak) をゲストに迎えて、iPhone 5c, 5s, A7, Touch ID について話しました。 186 | 187 | 52:03 188 | 189 | 190 | 191 | 192 | 193 | 19: Accents, Git Workflow, Logging (sekimura) 194 | <p>Masayoshi Sekimura さん (<a href="https://twitter.com/sekimura">@sekimura</a>) をゲストに迎えて、エンジニアの英語、Github Enterprise, Phabricator, Kibana などについて話しました。</p> 195 | 196 | <h3>Show Notes</h3> 197 | 198 | <ul> 199 | <li><a href="http://www.kitkat.com/">Android KitKat</a></li> 200 | <li><a href="http://www.theverge.com/2013/9/3/4690744/kit-kat-mocks-apple-with-android-parody-video">KitKat mocks Apple with Android 4.4 Parody Video</a></li> 201 | <li><a href="https://twitter.com/NokiaUS/status/375418228622630912">Have a break. #KitKat</a></li> 202 | <li><a href="http://arstechnica.com/gadgets/2013/09/balky-carriers-and-slow-oems-step-aside-google-is-defragging-android/">Slow OEM step aside: Google is defragging Android</a></li> 203 | <li><a href="http://paulgraham.com/accents.html">Founder&#39;s Accents</a></li> 204 | <li><a href="http://www.yamdas.org/column/technique/accentsj.html">創業者の訛り</a></li> 205 | <li><a href="http://volgarev.me/blog/60053519752">Why knowing English is important for every software developer</a></li> 206 | <li><a href="http://antirez.com/news/61">English has been my pain for 15 years</a></li> 207 | <li><a href="http://ymotongpoo.hatenablog.com/entry/2013/09/04/180103">英語は私にとって15年にわたって悩みの種です</a></li> 208 | <li><a href="http://phabricator.org/">Phabricator</a></li> 209 | <li><a href="http://www.pivotaltracker.com/">Pivotal Tracker</a></li> 210 | <li><a href="https://github.com/cookpad/kage">cookpad/kage</a></li> 211 | <li><a href="http://three.kibana.org/">Kibana 3</a></li> 212 | <li><a href="http://exploringelasticsearch.com/book/elasticsearch-at-scale-interviews/interview-with-the-github-elasticsearch-team.html">Interview with the Github Elasticsearch team</a></li> 213 | <li><a href="http://www.splunk.com/">Splunk</a></li> 214 | <li><a href="http://www.slideshare.net/penguinana/solrelasticsearch">SolrとElasticSearchの比較</a></li> 215 | <li><a href="http://www.nintendo.co.jp/3ds/interview/streetpass_relay/vol1/index4.html">任天堂社長が訊く「すれ違い通信中継所」</a></li> 216 | <li><a href="http://aws.amazon.com/cloudsearch/">Amazon CloudSearch</a></li> 217 | <li><a href="http://karma-runner.github.io/0.10/index.html">Karma</a></li> 218 | </ul> 219 | 220 | Fri, 06 Sep 2013 00:00:00 -0700 221 | http://rebuild.fm/19/ 222 | http://rebuild.fm/19/ 223 | Tatsuhiko Miyagawa 224 | 225 | no 226 | Masayoshi Sekimura さん (@sekimura) をゲストに迎えて、エンジニアの英語、Github Enterprise, Phabricator, Kibana などについて話しました。 227 | 228 | Masayoshi Sekimura さん (@sekimura) をゲストに迎えて、エンジニアの英語、Github Enterprise, Phabricator, Kibana などについて話しました。 229 | 230 | 53:36 231 | 232 | 233 | 234 | 235 | 236 | 18: Las Vegas, Coworking, JOBS (Kenn Ejima) 237 | <p>Kenn Ejima さん (<a href="https://twitter.com/kenn">@kenn</a>) をゲストに迎えて、ラスベガス、サンフランシスコ、Coworking, Apple, Microsoft などについて話しました。</p> 238 | 239 | <h3>Show Notes</h3> 240 | 241 | <ul> 242 | <li><a href="http://kenn.hatenablog.com/entry/2013/08/28/032353">ラスベガス生活がはじまって</a></li> 243 | <li><a href="http://www.huffingtonpost.com/2013/08/20/coffee-shop-wireless-ban_n_3786622.html">Coffee Shop Limited Wireless</a></li> 244 | <li><a href="http://areyouabrogrammer.com/">Are You A Brogrammer</a></li> 245 | <li><a href="http://tomdale.net/2013/07/san-francisco-i-love-you-but-youre-bringing-me-down/">San Francisco, I Love You But You&#39;re Bringing Me Down</a></li> 246 | <li><a href="http://blog.sfgate.com/techchron/2013/07/30/rideshare-drivers-cite-at-sfo-for-trespassing/">Rideshare drivers cited at SFO for trespassing</a></li> 247 | <li><a href="http://jobsthefilm.com/">JOBS</a></li> 248 | <li><a href="http://www.theguardian.com/film/filmblog/2013/aug/21/ashton-kucher-steve-wozniak-jobs-biopic">Ashton Kutcher and Wozniak at odds over Jobs biopic</a></li> 249 | <li><a href="http://collider.com/steve-wozniak-steve-jobs-movie-aaron-sorkin/">Aaron Sorkin hired Steve Wozniak as a Consultant</a></li> 250 | <li><a href="http://www.microsoft.com/en-us/news/press/2013/aug13/08-23announcementpr.aspx">MS CEO Steve Ballmer to retire within 12 months</a></li> 251 | <li><a href="http://kotaku.com/microsofts-adam-orth-the-always-on-tweeter-no-long-472244698">Microsoft&#39;s Adam Orth, The &quot;Always-On&quot; Tweeter, No Longer With The Company</a></li> 252 | <li><a href="http://bits.blogs.nytimes.com/2013/07/01/xbox-chief-is-leaving-microsoft/?_r=0">Zynga Hires Xbox Boss to Initiate Turnaround</a></li> 253 | <li><a href="http://venturebeat.com/2013/08/24/iphone-5c-captured-in-high-def-video-red-yellow-green-blue-white/">iPhone 5C captured in HD video</a></li> 254 | <li><a href="http://www.engadget.com/2013/08/27/nexus-4-8gb-price-drops-to-199/">Nexus 4 price drop by $100</a></li> 255 | <li><a href="http://sportsbeta.ladbrokes.com/Specials/Microsoft-Specials/Next-Microsoft-CEO-N-1z0z7huZ1z0z1etZ1z0ys9q/">Next Microsoft CEO</a></li> 256 | <li><a href="http://www.bloomberg.com/news/2013-08-22/yahoo-tops-google-in-u-s-for-web-traffic-in-july-comscore-says.html">Yahoo! Tops Google for US Web Traffic</a></li> 257 | <li><a href="http://lifehacker.com/apple-tv-update-breaks-plexconnect-but-you-can-bring-i-1214467689">Apple TV update Breaks PlexConnect</a></li> 258 | <li><a href="http://www.theverge.com/2013/8/25/4657202/google-blocks-chromecast-app-that-let-you-stream-own-videos">Google blocks Chromecast app</a></li> 259 | </ul> 260 | 261 | Fri, 30 Aug 2013 00:00:00 -0700 262 | http://rebuild.fm/18/ 263 | http://rebuild.fm/18/ 264 | Tatsuhiko Miyagawa 265 | 266 | no 267 | Kenn Ejima さん (@kenn) をゲストに迎えて、ラスベガス、サンフランシスコ、Coworking, Apple, Microsoft などについて話しました。 268 | 269 | Kenn Ejima さん (@kenn) をゲストに迎えて、ラスベガス、サンフランシスコ、Coworking, Apple, Microsoft などについて話しました。 270 | 271 | 43:55 272 | 273 | 274 | 275 | 276 | 277 | 17: Carton, YAPC and Perl 6 (tokuhirom) 278 | <p>Tokuhiro Matsunoさん (<a href="https://twitter.com/tokuhirom">@tokuhirom</a>) をゲストに迎えて、Carton 1.0 リリース、YAPC::Asia, Perl 6 などについて話しました。</p> 279 | 280 | <h3>Show Notes</h3> 281 | 282 | <ul> 283 | <li><a href="http://weblog.bulknews.net/post/57356232719/carton-1-0-is-released">Carton 1.0 is released</a></li> 284 | <li><a href="https://speakerdeck.com/miyagawa/carton-1-dot-0-at-oscon-2013">Carton at OSCON 2013</a></li> 285 | <li><a href="http://blog.64p.org/entry/2013/08/06/112350">Carton 1.0 時代の Web アプリケーション開発フロー</a></li> 286 | <li><a href="https://github.com/rejeep/cask.el">cask.el</a></li> 287 | <li><a href="http://peatix.com/event/11775">YAPC::Asia 2013 tickets</a></li> 288 | <li><a href="http://miyagawa.github.io/yapcasia2013/">YAPC::Asia Mobile schedule</a></li> 289 | <li><a href="http://blog.64p.org/entry/2013/06/08/124125">Future Perl - YAPC::NA 2013 に参加して</a></li> 290 | <li><a href="http://6guts.wordpress.com/2013/05/31/moarvm-a-virtual-machine-for-nqp-and-rakudo/">MoarVM: A VM for NQP and Rakudo</a></li> 291 | <li><a href="https://github.com/tokuhirom/pvip">tokuhirom/pvip</a></li> 292 | <li><a href="https://github.com/perl6/roast">Perl6 Roast</a></li> 293 | <li><a href="http://rubyspec.org/">RubySpec</a></li> 294 | <li><a href="https://github.com/antirez/linenoise">linenoise</a></li> 295 | <li><a href="https://github.com/tokuhirom/Caroline">Caroline</a></li> 296 | </ul> 297 | 298 | Fri, 09 Aug 2013 00:00:00 -0700 299 | http://rebuild.fm/17/ 300 | http://rebuild.fm/17/ 301 | Tatsuhiko Miyagawa 302 | 303 | no 304 | Tokuhiro Matsunoさん (@tokuhirom) をゲストに迎えて、Carton 1.0 リリース、YAPC::Asia, Perl 6 などについて話しました。 305 | 306 | Tokuhiro Matsunoさん (@tokuhirom) をゲストに迎えて、Carton 1.0 リリース、YAPC::Asia, Perl 6 などについて話しました。 307 | 308 | 48:51 309 | 310 | 311 | 312 | 313 | 314 | 16: Designing new Rebuild.fm (Naoya Ito, nagayama) 315 | <p>伊藤直也さん (<a href="https://twitter.com/naoya_ito">@naoya_ito</a>)、長山武史さん (<a href="https://twitter.com/nagayama">@nagayama</a>) をゲストに迎えて、Rebuild.fm リニューアル, Middleman, Bootstrap, iOS アプリデザインなどについて話しました。</p> 316 | 317 | <h3>Show Notes</h3> 318 | 319 | <ul> 320 | <li><a href="http://rebuild.fm">Rebuild.fm</a></li> 321 | <li><a href="http://yapcasia.org/2013/06/miyagawa-decal.html">miyagawa デカール</a></li> 322 | <li><a href="http://jekyllrb.com/">Jekyll</a></li> 323 | <li><a href="http://middlemanapp.com/">middleman</a></li> 324 | <li><a href="http://yeoman.io/">Yeoman</a></li> 325 | <li><a href="http://gruntjs.com/">Grunt</a></li> 326 | <li><a href="http://getbootstrap.com/">Bootstrap</a></li> 327 | <li><a href="http://blog.getbootstrap.com/2013/07/27/bootstrap-3-rc1/">Bootstrap 3 RC1</a></li> 328 | <li><a href="http://fortawesome.github.io/Font-Awesome/">FontAwesome</a></li> 329 | <li><a href="http://feedpress.it/">FeedPress</a></li> 330 | <li><a href="https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments">Task Lists in GFM</a></li> 331 | <li><a href="http://hbfav.bloghackers.net/">HBFav2</a></li> 332 | <li><a href="http://d.hatena.ne.jp/naoya/20130801/1375357430">HBFav2 をリリースしました</a></li> 333 | <li><a href="https://www.iconfinder.com/">Icon Finder</a></li> 334 | <li><a href="http://www.pixate.com/">Pixate</a></li> 335 | <li><a href="http://joshsymonds.com/blog/2013/06/26/why-im-not-using-rubymotion-in-production/">Why I&#39;m Not Using RubyMotion in Production</a></li> 336 | <li><a href="http://www.quora.com/What-does-the-term-full-stack-programmer-mean">What does the term &quot;full-stack programmer&quot; mean?</a></li> 337 | <li><a href="http://iroirodesign.com/">いろいろデザイン</a></li> 338 | <li><a href="http://yapcasia.org/2013/talk/show/c6b08f02-f293-11e2-ba15-895a6aeab6a4">YAPC::Asia Rubyの良いところ語ってください</a></li> 339 | <li><a href="https://itunes.apple.com/us/app/pdx-bus-max-streetcar-and-wes/id289814055?mt=8">PDX Bus</a></li> 340 | </ul> 341 | 342 | Thu, 01 Aug 2013 00:00:00 -0700 343 | http://rebuild.fm/16/ 344 | http://rebuild.fm/16/ 345 | Tatsuhiko Miyagawa 346 | 347 | no 348 | 伊藤直也さん (@naoya_ito)、長山武史さん (@nagayama) をゲストに迎えて、Rebuild.fm リニューアル, Middleman, Bootstrap, iOS アプリデザインなどについて話しました。 349 | 350 | 伊藤直也さん (@naoya_ito)、長山武史さん (@nagayama) をゲストに迎えて、Rebuild.fm リニューアル, Middleman, Bootstrap, iOS アプリデザインなどについて話しました。 351 | 352 | 46:11 353 | 354 | 355 | 356 | 357 | 358 | 15: After Google Reader, DIY Blogging, The Go language (typester) 359 | <p>村瀬大輔さん (<a href="https://twitter.com/typester">@typester</a>) をゲストに迎えて、RSS リーダー, blosxom, Jekyll, Go などについて話しました。</p> 360 | 361 | <h3>Show Notes</h3> 362 | 363 | <ul> 364 | <li><a href="http://www.feedly.com/">Feedly</a></li> 365 | <li><a href="http://reader.livedoor.com/">livedoor Reader</a></li> 366 | <li><a href="http://ifttt.com">IFTTT</a></li> 367 | <li><a href="http://getpocket.com">Pocket</a></li> 368 | <li><a href="http://googledevelopers.blogspot.com/2013/07/pubsubhubbub-feeds-and-feed-api.html">PubSubHubbub, Feeds and Feed API</a></li> 369 | <li><a href="http://blosxom.sourceforge.net/">blosxom</a></li> 370 | <li><a href="http://jekyllrb.com/">Jekyll</a></li> 371 | <li><a href="http://unknownplace.org/archives/blosxom-and-this-site.html">unknownplace.org このサイトのBlosxomの構成</a></li> 372 | <li><a href="https://github.com/laurilehmijoki/s3_website">s3_website</a></li> 373 | <li><a href="https://github.com/movabletype/Documentation/wiki/PSGI-Plack%E7%92%B0%E5%A2%83%E3%81%A7Movable-Type%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99">Movable Type on PSGI</a></li> 374 | <li><a href="http://golang.org/">The Go Programming Language</a></li> 375 | <li><a href="http://blog.disqus.com/post/51155103801/trying-out-this-go-thing">Trying out this Go thing - DISQUS</a></li> 376 | <li><a href="http://unknownplace.org/archives/golang-editing-with-emacs.html">EmacsでのGo言語編集環境</a></li> 377 | <li><a href="http://tour.golang.org/">A Tour of Go</a></li> 378 | <li><a href="http://lingr.com/room/golang">lingr/golang</a></li> 379 | </ul> 380 | 381 | Sun, 07 Jul 2013 00:00:00 -0700 382 | http://rebuild.fm/15/ 383 | http://rebuild.fm/15/ 384 | Tatsuhiko Miyagawa 385 | 386 | no 387 | 村瀬大輔さん (@typester) をゲストに迎えて、RSS リーダー, blosxom, Jekyll, Go などについて話しました。 388 | 389 | 村瀬大輔さん (@typester) をゲストに迎えて、RSS リーダー, blosxom, Jekyll, Go などについて話しました。 390 | 391 | 40:20 392 | 393 | 394 | 395 | 396 | 397 | 14: DevOps with Docker, chef and serverspec (naoya, mizzy) 398 | <p>伊藤直也さん (<a href="https://twitter.com/naoya_ito">@naoya_ito</a>), 宮下剛輔さん (<a href="https://twitter.com/gosukenator">@gosukenator</a>) をゲストに迎えて、Docker, chef, serverspec, Travis CI, Vagrant, サーバプロビジョニング、テスト などについて話しました。</p> 399 | 400 | <h3>Show Notes</h3> 401 | 402 | <ul> 403 | <li><a href="http://www.docker.io/">Docker</a></li> 404 | <li><a href="http://lxc.sourceforge.net/">LXC Linux Containers</a></li> 405 | <li><a href="http://en.wikipedia.org/wiki/Aufs">aufs</a></li> 406 | <li><a href="http://www.slideshare.net/mizzy/inside-sqales-backend-at-sapporo-ruby-kaigi-2012">Inside Sqale backend</a></li> 407 | <li><a href="https://devcenter.heroku.com/articles/cedar">Heroku Cedar Stack</a></li> 408 | <li><a href="http://progrium.com/blog/2013/06/19/dokku-the-smallest-paas-implementation-youve-ever-seen/">Dokku</a></li> 409 | <li><a href="https://devcenter.heroku.com/articles/buildpacks">Heroku Buildpacks</a></li> 410 | <li><a href="http://docs.docker.io/en/latest/use/builder/">Dockerfile</a></li> 411 | <li><a href="https://github.com/miyagawa/docker-plenv-vanilla">miyagawa/docker-plenv-vanilla</a></li> 412 | <li><a href="http://www.vagrantup.com/">Vagrant</a></li> 413 | <li><a href="http://serverspec.org/">serverspec</a></li> 414 | <li><a href="http://foodfightshow.org/">Food fight show</a></li> 415 | <li><a href="http://shop.oreilly.com/product/0636920030973.do">Test-Driven infrastrcture with Chef</a></li> 416 | <li><a href="http://www.opscode.com/blog/2012/08/17/announcing-test-kitchen/">Test Kitchen</a></li> 417 | <li><a href="https://github.com/ansible/ansible">ansible</a></li> 418 | <li><a href="https://github.com/kenn/sunzi">sunzi</a></li> 419 | <li><a href="http://www.cloudfoundry.com/">CloudFoundry</a></li> 420 | <li><a href="http://colabv6.dan.co.jp/lleval.html">lleval</a></li> 421 | <li><a href="https://github.com/r7kamura/autodoc">autodoc</a></li> 422 | <li><a href="http://www.amazon.co.jp/dp/4774157198/bulknews-22">WEB+DB PRESS Vol.75</a></li> 423 | </ul> 424 | 425 | Sat, 22 Jun 2013 00:00:00 -0700 426 | http://rebuild.fm/14/ 427 | http://rebuild.fm/14/ 428 | Tatsuhiko Miyagawa 429 | 430 | no 431 | 伊藤直也さん (@naoya_ito), 宮下剛輔さん (@gosukenator) をゲストに迎えて、Docker, chef, serverspec, Travis CI, Vagrant, サーバプロビジョニング、テスト などについて話しました。 432 | 433 | 伊藤直也さん (@naoya_ito), 宮下剛輔さん (@gosukenator) をゲストに迎えて、Docker, chef, serverspec, Travis CI, Vagrant, サーバプロビジョニング、テスト などについて話しました。 434 | 435 | 1:02:13 436 | 437 | 438 | 439 | 440 | 441 | 13: WWDC 2013 (Kenn Ejima, Hakuro Matsuda) 442 | <p>Kenn Ejima さん (<a href="https://twitter.com/kenn">@kenn</a>), Hakuro Matsuda さん 443 | (<a href="https://twitter.com/hak">@hak</a>) をゲストに迎えて、Apple WWDC 2013 Keynote, iOS 7, OS X 444 | Mavericks, Mac Pro, Macbook Air などについて話しました。</p> 445 | 446 | <h3>Show Notes</h3> 447 | 448 | <ul> 449 | <li><a href="http://www.apple.com/apple-events/june-2013/">Apple WWDC 2013 Keynote</a></li> 450 | <li><a href="http://allthingsd.com/20130529/apples-tim-cook-the-full-d11-interview-video/">Tim Cook Interview at All Things D</a></li> 451 | <li><a href="http://www.apple.com/ios/ios7/">iOS 7</a></li> 452 | <li><a href="http://www.apple.com/osx/preview/">OS X Mavericks</a></li> 453 | <li><a href="http://old-releases.ubuntu.com/releases/maverick/">Ubuntu Maverick</a></li> 454 | <li><a href="http://arstechnica.com/apple/2013/06/new-haswell-based-macbook-airs-offer-faster-graphics-all-day-battery-life/">New Haswell-based Macbook Airs offer faster graphics, all-day battery life</a></li> 455 | <li><a href="http://techcrunch.com/2013/06/06/report-nsa-collects-data-directly-from-servers-of-google-apple-microsoft-facebook-and-more/">NSA Collects Data Directly From Servers of Google, Apple etc.</a></li> 456 | <li><a href="http://www.apple.com/mac-pro/">Mac Pro</a></li> 457 | <li><a href="http://www.amazon.co.jp/dp/B0018NRM9U/bulknews-22">ideaco New TUBELOR ゴミ箱</a></li> 458 | <li><a href="https://twitter.com/gruber/status/344179342764568577">If you don&#39;t think iOS 7 is beautiful, I don&#39;t know what to say to you.</a></li> 459 | </ul> 460 | 461 | Tue, 11 Jun 2013 00:00:00 -0700 462 | http://rebuild.fm/13/ 463 | http://rebuild.fm/13/ 464 | Tatsuhiko Miyagawa 465 | 466 | no 467 | Kenn Ejima さん (@kenn), Hakuro Matsuda さん 468 | (@hak) をゲストに迎えて、Apple WWDC 2013 Keynote, iOS 7, OS X 469 | Mavericks, Mac Pro, Macbook Air などについて話しました。 470 | 471 | Kenn Ejima さん (@kenn), Hakuro Matsuda さん 472 | (@hak) をゲストに迎えて、Apple WWDC 2013 Keynote, iOS 7, OS X 473 | Mavericks, Mac Pro, Macbook Air などについて話しました。 474 | 475 | 46:55 476 | 477 | 478 | 479 | 480 | 481 | 12: Perl 5.18, YAPC::Asia (lestrrat, tokuhirom) 482 | <p>牧大輔さん (<a href="https://twitter.com/lestrrat">@lestrrat</a>), Tokuhiro Matsuno さん 483 | (<a href="https://twitter.com/tokuhirom">@tokuhirom</a>) をゲストに迎えて、Perl 5.18, YAPC::Asia 484 | などについて話しました。</p> 485 | 486 | <h3>Show Notes</h3> 487 | 488 | <ul> 489 | <li><a href="http://www.nntp.perl.org/group/perl.perl5.porters/2013/05/msg201940.html">Perl 5.18.0 is released</a></li> 490 | <li><a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1667">CVE-2013-1667 rehash flaw in Perl</a></li> 491 | <li><a href="http://www.nntp.perl.org/group/perl.perl5.porters/2013/05/msg202130.html">Deprecating CGI.pm in perl core</a></li> 492 | <li><a href="http://twitter.com/kraih/status/336362823712141312">Perl 5.18 has 10% performance gain with mojolicious apps</a></li> 493 | <li><a href="https://github.com/tokuhirom/plenv">plenv</a></li> 494 | <li><a href="http://www.yapcna.org/yn2013/">YAPC::NA</a></li> 495 | <li><a href="http://yapcasia.org/2013/">YAPC::Asia</a></li> 496 | <li><a href="http://www.atmarkit.co.jp/ait/articles/1305/21/news128.html">カンファレンスカンファレンス</a></li> 497 | <li><a href="http://yapcasia.org/2013/05/yapcasia-2013-venue.html">YAPC::Asia 会場</a></li> 498 | </ul> 499 | 500 | Mon, 27 May 2013 00:00:00 -0700 501 | http://rebuild.fm/12/ 502 | http://rebuild.fm/12/ 503 | Tatsuhiko Miyagawa 504 | 505 | no 506 | 牧大輔さん (@lestrrat), Tokuhiro Matsuno さん 507 | (@tokuhirom) をゲストに迎えて、Perl 5.18, YAPC::Asia 508 | などについて話しました。 509 | 510 | 牧大輔さん (@lestrrat), Tokuhiro Matsuno さん 511 | (@tokuhirom) をゲストに迎えて、Perl 5.18, YAPC::Asia 512 | などについて話しました。 513 | 514 | 56:06 515 | 516 | 517 | 518 | 519 | 520 | 11: Google I/O 2013 (kenn, mootoh) 521 | <p>Kenn Ejima さん (<a href="https://twitter.com/kenn">@kenn</a>), Motohiro Takayama さん 522 | (<a href="https://twitter.com/mootoh">@mootoh</a>) をゲストに迎えて、Google I/O, Google Glass, Google 523 | Play Game Services などについて話しました。</p> 524 | 525 | <h3>Show Notes</h3> 526 | 527 | <ul> 528 | <li><a href="https://developers.google.com/events/io/">Google I/O</a></li> 529 | <li><a href="http://www.theverge.com/2013/5/15/4334634/best-of-googles-i-o-2013-keynote-hangouts-google-galaxy-s4">The best of Google I/O 2013 keynote</a></li> 530 | <li><a href="http://www.forbes.com/sites/roberthof/2013/05/16/google-reveals-how-to-hack-google-glass-device-and-void-your-warranty/">Google Reveals How to Hack Google Glass Device</a></li> 531 | <li><a href="http://www.theverge.com/2013/5/16/4338418/glass-privacy-fireside-chat-google-io-2013">Google on Glass Privacy</a></li> 532 | <li><a href="https://itunes.apple.com/app/id643496868?mt=8">Hangouts for iOS</a></li> 533 | <li><a href="http://www.engadget.com/2013/05/14/microsoft-adds-google-talk-to-outlook-dot-com-skydrive/">Microsoft adds built-in Google Talk to Outlook</a></li> 534 | <li><a href="http://www.theverge.com/2013/5/15/4318830/inside-hangouts-googles-big-fix-for-its-messaging-mess">Hangouts do not support XMPP</a></li> 535 | <li><a href="http://googleappsdeveloper.blogspot.com/2013/05/introducing-actions-in-inbox-powered-by.html">Gmail Actions in the Inbox</a></li> 536 | <li><a href="http://developer.android.com/sdk/installing/studio.html">Android Studio</a></li> 537 | <li><a href="http://gengo.com/">gengo - Translation Service</a></li> 538 | <li><a href="http://www.rdio.com/">Rdio</a></li> 539 | <li><a href="https://www.everpix.com/">everpix</a></li> 540 | <li><a href="https://developers.google.com/games/services/">Google Play Game Services</a></li> 541 | </ul> 542 | 543 | Fri, 17 May 2013 00:00:00 -0700 544 | http://rebuild.fm/11/ 545 | http://rebuild.fm/11/ 546 | Tatsuhiko Miyagawa 547 | 548 | no 549 | Kenn Ejima さん (@kenn), Motohiro Takayama さん 550 | (@mootoh) をゲストに迎えて、Google I/O, Google Glass, Google 551 | Play Game Services などについて話しました。 552 | 553 | Kenn Ejima さん (@kenn), Motohiro Takayama さん 554 | (@mootoh) をゲストに迎えて、Google I/O, Google Glass, Google 555 | Play Game Services などについて話しました。 556 | 557 | 46:22 558 | 559 | 560 | 561 | 562 | 563 | 10: RailsConf, Ruby 2.0, Rails 4 (mrkn, r7kamura) 564 | <p>Kenta Murataさん (<a href="https://twitter.com/mrkn">@mrkn</a>), Ryo Nakamuraさん 565 | (<a href="https://twitter.com/r7kamura">@r7kamura</a>) をゲストに迎えて、RailsConf, Ruby 2.0, Rails 4, 566 | Chanko 2.0, RubyKaigi, YAPC などについて話しました。</p> 567 | 568 | <h3>Show Notes</h3> 569 | 570 | <ul> 571 | <li><a href="http://railsconf.com/">RailsConf</a></li> 572 | <li><a href="http://martyhaught.com/articles/2013/05/03/blind-reviews-at-railsconf-2013/">Blind Reviews at RailsConf 2013</a></li> 573 | <li><a href="http://rubykaigi.org/2013/schedule">RubyKaigi 2013</a></li> 574 | <li><a href="http://www.justin.tv/confreaks/c/2246896">DHH keynote at RailsConf 2013</a></li> 575 | <li><a href="http://twitter.com/ruralocity/status/328922112221925377">Not sure if I should be offended by the Kansas barbs</a></li> 576 | <li><a href="http://www.youtube.com/watch?v=VOFTop3AMZ8">DHH RailsConf 2012 Keynote</a></li> 577 | <li><a href="https://twitter.com/rtomayko/status/286909814951522306">gist.github.com launched with Rails 4</a></li> 578 | <li><a href="http://railscasts.com/episodes/400-what-s-new-in-rails-4">What&#39;s new in Rails 4.0</a></li> 579 | <li><a href="http://techlife.cookpad.com/2013/04/09/ruby200/">Cookpad の本番環境で使用している Ruby が 2.0.0-p0 になりました</a></li> 580 | <li><a href="https://blog.engineyard.com/2012/ruby-1-8-7-and-ree-end-of-life">Ruby 1.8.7 and REE End of Life</a></li> 581 | <li><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/47201">Ruby 1.8.7 EOL expected this June</a></li> 582 | <li><a href="https://speakerdeck.com/mrkn/what-a-hard-work-to-make-the-recipe-sharing-service-available-on-ruby-1-dot-9-3">What a hard work to make the recipe sharing service available on Ruby 1.9.3!</a></li> 583 | <li><a href="https://bugs.ruby-lang.org/issues/7892">MIME encoding bug of NKF.nkf</a></li> 584 | <li><a href="https://github.com/rails/rails/issues/9813">Rails 3.2.13 default_scope breaks chained scopes</a></li> 585 | <li><a href="https://github.com/rails/strong_parameters">rails/strong_parameters</a></li> 586 | <li><a href="http://reed.github.io/turbolinks-compatibility/">Turbolinks Compatibility</a></li> 587 | <li><a href="http://www.exhilent.com/blog/android-new-ie-6">Android Is The New IE 6</a></li> 588 | <li><a href="http://cookpad.github.io/chanko/">Chanko: Rapidly &amp; Safely prototyping your rails application</a></li> 589 | <li><a href="http://techlife.cookpad.com/2013/04/10/chanko200/">プロトタイプ開発用のRailsプラグイン「Chanko」を2.0.0にアップデートしました</a></li> 590 | <li><a href="https://github.com/haml/haml/pull/610">Use Erubis when available for faster startup</a></li> 591 | <li><a href="https://travis-ci.org/">Travis CI</a></li> 592 | <li><a href="https://coveralls.io/">Coveralls</a></li> 593 | <li><a href="https://codeclimate.com/">Code Climate</a></li> 594 | <li><a href="http://rubygems.org/gems/travis">rubygems travis</a></li> 595 | <li><a href="http://d.hatena.ne.jp/naoya/20130417/1366173359">Coveralls + Perl</a></li> 596 | <li><a href="http://yapcasia.org/">YAPC::Asia</a></li> 597 | <li><a href="http://info.cookpad.com/jobs/?affcd=dy24k">クックパッド採用情報</a></li> 598 | <li><a href="http://info.cookpad.com/24contest4">第4回 開発コンテスト24</a></li> 599 | </ul> 600 | 601 | Sat, 11 May 2013 00:00:00 -0700 602 | http://rebuild.fm/10/ 603 | http://rebuild.fm/10/ 604 | Tatsuhiko Miyagawa 605 | 606 | no 607 | Kenta Murataさん (@mrkn), Ryo Nakamuraさん 608 | (@r7kamura) をゲストに迎えて、RailsConf, Ruby 2.0, Rails 4, 609 | Chanko 2.0, RubyKaigi, YAPC などについて話しました。 610 | 611 | Kenta Murataさん (@mrkn), Ryo Nakamuraさん 612 | (@r7kamura) をゲストに迎えて、RailsConf, Ruby 2.0, Rails 4, 613 | Chanko 2.0, RubyKaigi, YAPC などについて話しました。 614 | 615 | 47:42 616 | 617 | 618 | 619 | 620 | 621 | 9: Making your own keyboard (Jesse Vincent) 622 | <p>Jesse Vincent (<a href="https://twitter.com/obra">@obra</a>) joins me to discuss his recent experiments to build his own keyboard.</p> 623 | 624 | <h3>Show Notes</h3> 625 | 626 | <ul> 627 | <li><a href="http://osdc.tw/">OSDC.TW</a></li> 628 | <li><a href="https://speakerdeck.com/miyagawa/cpanm-1-dot-6-at-osdc-dot-tw">cpanm 1.6/1.7 at OSDC.TW</a></li> 629 | <li><a href="http://www.slideshare.net/obrajesse/2013-osdcmadeakeyboard">So I make a keyboard</a></li> 630 | <li><a href="http://kbtpure.com/kbtpure/kbc-poker-60-mechanical-keyboard-ansi-us-international.html">KBC Poker 60%</a></li> 631 | <li><a href="http://www.personal-media.co.jp/utronkb/">μTRON キーボード</a></li> 632 | <li><a href="http://ja.wikipedia.org/wiki/TRON%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88">TRON プロジェクト</a></li> 633 | <li><a href="http://blog.fsck.com/2012/12/building-a-keyboard-part-2.html">Building a Keyboard: Part 2</a></li> 634 | <li><a href="http://tokyo.fabcafe.com/en/">FabCafe</a></li> 635 | <li><a href="http://www.slideshare.net/obrajesse/2013-osdcmadeakeyboard/114">Mark 6 keyboard Design</a></li> 636 | <li><a href="http://keyboard.io">Keyboard.IO</a></li> 637 | </ul> 638 | 639 | Wed, 08 May 2013 00:00:00 -0700 640 | http://rebuild.fm/9/ 641 | http://rebuild.fm/9/ 642 | Tatsuhiko Miyagawa 643 | 644 | no 645 | Jesse Vincent (@obra) joins me to discuss his recent experiments to build his own keyboard. 646 | 647 | Jesse Vincent (@obra) joins me to discuss his recent experiments to build his own keyboard. 648 | 649 | 34:45 650 | 651 | 652 | 653 | 654 | 655 | 8: Screencasts, Pair Programming, English (伊藤直也 高林哲) 656 | <p>伊藤直也さん (<a href="https://twitter.com/naoya_ito">@naoya_ito</a>) 高林哲さん 657 | (<a href="https://plus.google.com/101463981287086074128">bkノート</a>) 658 | をゲストに迎えて、日米キャリアパス、スクリーンキャスト、ペアプログラミング、エンジニアリング英語などについて話しました。</p> 659 | 660 | <p>スポンサー: <a href="https://itunes.apple.com/app/listen-it/id512751653?ls=1&amp;mt=8">Listen-IT</a></p> 661 | 662 | <p>(収録機材の不調で、一部聴きづらい箇所があるかもしれません)</p> 663 | 664 | <h3>Show Notes</h3> 665 | 666 | <ul> 667 | <li><a href="http://railscasts.com/">Railscasts</a></li> 668 | <li><a href="http://weblog.bulknews.net/post/46471116934/introducing-milla">Milla screencast</a></li> 669 | <li><a href="http://dotinstall.com/">ドットインストール</a></li> 670 | <li><a href="http://www.listen-it.com/">Listen-IT</a></li> 671 | <li><a href="http://0xcc.net/blog/archives/000171.html">hogeの話</a></li> 672 | </ul> 673 | 674 | Tue, 16 Apr 2013 00:00:00 -0700 675 | http://rebuild.fm/8/ 676 | http://rebuild.fm/8/ 677 | Tatsuhiko Miyagawa 678 | 679 | no 680 | 伊藤直也さん (@naoya_ito) 高林哲さん 681 | (bkノート) 682 | をゲストに迎えて、日米キャリアパス、スクリーンキャスト、ペアプログラミング、エンジニアリング英語などについて話しました。 683 | 684 | 伊藤直也さん (@naoya_ito) 高林哲さん 685 | (bkノート) 686 | をゲストに迎えて、日米キャリアパス、スクリーンキャスト、ペアプログラミング、エンジニアリング英語などについて話しました。 687 | 688 | 26:50 689 | 690 | 691 | 692 | 693 | 694 | 7: Perl Community, YAPC (yusukebe) 695 | <p>和田裕介さん (<a href="https://twitter.com/yusukebe">@yusukebe</a>) をゲストに迎えて、Perl 696 | プログラミング、フレームワーク、モジュール開発、YAPC などについて話しました。</p> 697 | 698 | <h3>Show Notes</h3> 699 | 700 | <ul> 701 | <li><a href="http://shibuya.pm.org">Shibuya.pm</a></li> 702 | <li><a href="http://yusukebe.com/archives/20130330/105031.html">Perl Casual</a></li> 703 | <li><a href="http://www.oreilly.co.jp/books/4873111749/">Blog Hacks</a></li> 704 | <li><a href="http://plagger.bulknews.net/trac">Plagger</a></li> 705 | <li><a href="http://yusukebe.com/archives/20061203/220402.html">PlaggerとCatalystでCDTVならぬCDTube作ってみた</a></li> 706 | <li><a href="https://github.com/miyagawa/Dist-Milla">Dist::Milla</a></li> 707 | <li><a href="http://yusukebe.com/archives/20120503/195637.html">ノマドならルノアールがはかどるよねぇ〜っていう10個の理由</a></li> 708 | <li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00BU7DBIA/bulknews-22/ref=nosim/">Kindle: Perlについて語ろう</a></li> 709 | <li><a href="http://plackperl.org/">PSGI/Plack</a></li> 710 | <li><a href="http://mojolicio.us/">Mojolicious</a></li> 711 | <li><a href="http://www.yapcna.org/yn2013/">YAPC::NA 2013</a></li> 712 | <li><a href="http://www.wired.com/wiredenterprise/2013/03/pycon-github/">Donglegate at PyCon 2013</a></li> 713 | </ul> 714 | 715 | Wed, 03 Apr 2013 00:00:00 -0700 716 | http://rebuild.fm/7/ 717 | http://rebuild.fm/7/ 718 | Tatsuhiko Miyagawa 719 | 720 | no 721 | 和田裕介さん (@yusukebe) をゲストに迎えて、Perl 722 | プログラミング、フレームワーク、モジュール開発、YAPC などについて話しました。 723 | 724 | 和田裕介さん (@yusukebe) をゲストに迎えて、Perl 725 | プログラミング、フレームワーク、モジュール開発、YAPC などについて話しました。 726 | 727 | 40:06 728 | 729 | 730 | 731 | 732 | 733 | 6: Kindle Publishing, Google Reader Shutdown (Naoya Ito) 734 | <p>伊藤直也さん (<a href="https://twitter.com/naoya_ito">@naoya_ito</a>) をゲストに迎えて、Kindle 735 | 出版、GitHub、Google Reader などについて話しました。</p> 736 | 737 | <h3>Show Notes</h3> 738 | 739 | <ul> 740 | <li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00BSPH158/bulknews-22">入門Chef Solo - Infrastructure as Code</a></li> 741 | <li><a href="http://d.hatena.ne.jp/naoya/20130313/1363129532">Kindle 向けにChef本を出版しました</a></li> 742 | <li><a href="http://www.oreilly.co.jp/books/4873111749/">Blog Hacks</a></li> 743 | <li><a href="http://shop.oreilly.com/category/roughcuts.do">O&#39;Reilly Rough Cuts</a></li> 744 | <li><a href="http://pragprog.com/">Pragmatic Bookshelf</a></li> 745 | <li><a href="http://handbook.plackperl.org/">Plack Handbook</a></li> 746 | <li><a href="http://blog.livedoor.jp/dankogai/archives/51826132.html">紹介 - Plack Handbook 404 Blog Not Found</a></li> 747 | <li><a href="https://gumroad.com/">Gumroad</a></li> 748 | <li><a href="http://daringfireball.net/projects/markdown/">Markdown</a></li> 749 | <li><a href="http://calibre-ebook.com/">Calibre</a></li> 750 | <li><a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=1000765211">KindleGen</a></li> 751 | <li><a href="http://d.hatena.ne.jp/naoya/20130303/1362299005">Markdown to Inao</a></li> 752 | <li><a href="https://help.github.com/articles/github-flavored-markdown">Github Flavored Markdown</a></li> 753 | <li><a href="http://p.booklog.jp/about/pro">パブー Pro</a></li> 754 | <li><a href="https://paberish.me/">paberish</a></li> 755 | <li><a href="http://www.slideshare.net/knsmr/qait">ソーシャルコーディング革命後の開発委託の世界</a></li> 756 | <li><a href="http://jla-old.linux.or.jp/announce/20001127/1.html">Linux Conference 2000 Fall</a></li> 757 | <li><a href="http://www.itmedia.co.jp/news/articles/1303/18/news057.html">Google Readerが終わっても、RSSは終わらない</a></li> 758 | <li><a href="https://www.quora.com/Google-Reader-Shut-Down-March-2013/Why-is-Google-killing-Google-Reader">Why is Google Killing Google Reader?</a></li> 759 | <li><a href="https://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI">Google Reader API Unofficial document</a></li> 760 | <li><a href="https://code.google.com/p/pubsubhubbub/">pubsubhubbub</a></li> 761 | <li><a href="http://blog.feedly.com/2013/03/14/google-reader/">Transitioning from Google Reader to Feedly</a></li> 762 | <li><a href="http://superfeedr.com/">Superfeedr</a></li> 763 | <li><a href="http://www.marco.org/2013/03/14/baby-steps-replacing-google-reader">Baby steps toward replacing Google Reader</a></li> 764 | </ul> 765 | 766 | Thu, 21 Mar 2013 00:00:00 -0700 767 | http://rebuild.fm/6/ 768 | http://rebuild.fm/6/ 769 | Tatsuhiko Miyagawa 770 | 771 | no 772 | 伊藤直也さん (@naoya_ito) をゲストに迎えて、Kindle 773 | 出版、GitHub、Google Reader などについて話しました。 774 | 775 | 伊藤直也さん (@naoya_ito) をゲストに迎えて、Kindle 776 | 出版、GitHub、Google Reader などについて話しました。 777 | 778 | 41:20 779 | 780 | 781 | 782 | 783 | 784 | 5: Ruby 2.0 (まつもとゆきひろ) 785 | <p>まつもとゆきひろさん (<a href="https://twitter.com/yukihiro_matz">@yukihiro_matz</a>) 786 | をゲストに迎えて、Ruby 2.0 などについて話しました。</p> 787 | 788 | <h3>Show Notes</h3> 789 | 790 | <ul> 791 | <li><a href="http://itpro.nikkeibp.co.jp/article/NEWS/20130224/458401/">Ruby 20周年</a></li> 792 | <li><a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/">Ruby 2.0.0-p0 released</a></li> 793 | <li><a href="https://twitter.com/hotchpotch/status/306358719678144512">COOKPAD migrated to Ruby 1.9</a></li> 794 | <li><a href="https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza">Matz on Ruby 2.0 at Waza</a></li> 795 | <li><a href="http://www.ruby-forum.com/topic/4408870">Ruby Implementers Meeting</a></li> 796 | <li><a href="http://www.nntp.perl.org/group/perl.packrats/2002/07/msg3.html">The Jon Orwant mug throwing incident at P5P meeting</a></li> 797 | <li><a href="http://mdk.per.ly/2012/08/20/prs2012-perl5-perl6-reunification-summit/img_0472/">Perl5-6 Reunification Summit / Mug throwing</a></li> 798 | </ul> 799 | 800 | Wed, 13 Mar 2013 00:00:00 -0700 801 | http://rebuild.fm/5/ 802 | http://rebuild.fm/5/ 803 | Tatsuhiko Miyagawa 804 | 805 | no 806 | まつもとゆきひろさん (@yukihiro_matz) 807 | をゲストに迎えて、Ruby 2.0 などについて話しました。 808 | 809 | まつもとゆきひろさん (@yukihiro_matz) 810 | をゲストに迎えて、Ruby 2.0 などについて話しました。 811 | 812 | 35:12 813 | 814 | 815 | 816 | 817 | 818 | 4: bkノート, Yak Shaving, Code Reviews (高林哲) 819 | <p>高林哲さん (<a href="https://plus.google.com/101346514878442807431/posts">Satoru Takabayashi on 820 | G+</a>) 821 | をゲストに迎えて、バッドノウハウ、ソフトウェアエンジニアリング、コードレビューなどについて話しました。</p> 822 | 823 | <h3>Show Notes</h3> 824 | 825 | <ul> 826 | <li><a href="https://plus.google.com/101463981287086074128/posts">bkノート</a></li> 827 | <li><a href="http://handbook.plackperl.org/">Plack Handbook</a></li> 828 | <li><a href="http://0xcc.net/blog/archives/000196.html">yak shaving で人生の問題が80%が説明できる問題</a></li> 829 | <li><a href="https://twitter.com/miyagawa/status/275847917586231296">Yak Ratio</a></li> 830 | <li><a href="http://itpro.nikkeibp.co.jp/article/Watcher/20061005/250057/">プログラマの三大美徳</a></li> 831 | <li><a href="https://plus.google.com/101463981287086074128/posts/Ptn5advYShp">リファクタリングという名の現実逃避</a></li> 832 | <li><a href="https://plus.google.com/101463981287086074128/posts/fMwWWp3dvam">タイピングが速いプログラマは腕が立つ説</a></li> 833 | <li><a href="http://sstephenson.us/posts/you-are-not-your-code">You are Not Your Code</a></li> 834 | <li><a href="http://steps.dodgson.org/b/2012/12/30/code-review-from-lowland/">下から目線のコードレビュー</a></li> 835 | </ul> 836 | 837 | Wed, 06 Mar 2013 00:00:00 -0800 838 | http://rebuild.fm/4/ 839 | http://rebuild.fm/4/ 840 | Tatsuhiko Miyagawa 841 | 842 | no 843 | 高林哲さん (Satoru Takabayashi on 844 | G+) 845 | をゲストに迎えて、バッドノウハウ、ソフトウェアエンジニアリング、コードレビューなどについて話しました。 846 | 847 | 高林哲さん (Satoru Takabayashi on 848 | G+) 849 | をゲストに迎えて、バッドノウハウ、ソフトウェアエンジニアリング、コードレビューなどについて話しました。 850 | 851 | 31:04 852 | 853 | 854 | 855 | 856 | 857 | 3: MessagePack (frsyuki, kiyoto) 858 | <p>古橋貞之さん (<a href="http://twitter.com/frsyuki">@frsyuki</a>)、kiyotoさん 859 | (<a href="http://twitter.com/__kiyoto__">@__kiyoto__</a>) をゲストに迎えて MessagePack について話しました。</p> 860 | 861 | <h3>Show Notes</h3> 862 | 863 | <ul> 864 | <li><a href="http://msgpack.org">MessagePack</a></li> 865 | <li><a href="http://kumofs.sourceforge.net/">KumoFS</a></li> 866 | <li><a href="http://coderepos.org/share/">CodeRepos</a></li> 867 | <li><a href="https://github.com/msgpack/msgpack/issues/121">msgpack issue #121</a></li> 868 | <li><a href="http://en.wikipedia.org/wiki/Consensus_decision-making#Japan">Consensus decision-making</a></li> 869 | <li><a href="https://github.com/msgpack/msgpack/issues/128">msgpack issue #128</a></li> 870 | <li><a href="http://www.ietf.org/mail-archive/web/json/current/msg00156.html">msgpack/binarypack</a></li> 871 | </ul> 872 | 873 | Wed, 27 Feb 2013 00:00:00 -0800 874 | http://rebuild.fm/3/ 875 | http://rebuild.fm/3/ 876 | Tatsuhiko Miyagawa 877 | 878 | no 879 | 古橋貞之さん (@frsyuki)、kiyotoさん 880 | (@__kiyoto__) をゲストに迎えて MessagePack について話しました。 881 | 882 | 古橋貞之さん (@frsyuki)、kiyotoさん 883 | (@__kiyoto__) をゲストに迎えて MessagePack について話しました。 884 | 885 | 40:39 886 | 887 | 888 | 889 | 890 | 891 | 2: Rails, Redis, VPS (Kenn Ejima) 892 | <p>江島健太郎さん(<a href="http://twitter.com/kenn">@kenn</a>)をゲストに迎えて Macbook, 開発環境, Rails, 893 | Heroku, VPS などについて話しました。</p> 894 | 895 | <h3>Show Notes</h3> 896 | 897 | <ul> 898 | <li><a href="http://www.tuaw.com/2013/02/13/apple-releases-updates-to-macbook-pro-macbook-air/">Macbook Pro, Air update</a></li> 899 | <li><a href="http://www.crashplan.com/">Crashplan</a></li> 900 | <li><a href="http://www.haystacksoftware.com/arq/">Arq</a></li> 901 | <li><a href="http://boxen.github.com/">Boxen</a></li> 902 | <li><a href="https://github.com/rails/rails-dev-box">rails-dev-box</a></li> 903 | <li><a href="http://david.heinemeierhansson.com/2012/rails-is-omakase.html">Rails is omakase</a></li> 904 | <li><a href="http://www.youtube.com/watch?v=VOFTop3AMZ8">Railsconf 2012 Keynote by DHH</a></li> 905 | <li><a href="http://dev.mysql.com/tech-resources/articles/whats-new-in-mysql-5.6.html">MySQL 5.6</a></li> 906 | <li><a href="http://redis.io/">Redis</a></li> 907 | <li><a href="http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics">Heroku&#39;s Ugly Secret</a>, <a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update/">Heroku Routing Performance Update</a></li> 908 | <li><a href="http://newrelic.com/">New Relic</a></li> 909 | <li><a href="http://www.slideshare.net/winebarrel/vpc-14281906">Cookpad migrates to VPC</a></li> 910 | <li><a href="https://www.digitalocean.com/">Digital Ocean</a></li> 911 | </ul> 912 | 913 | Wed, 20 Feb 2013 00:00:00 -0800 914 | http://rebuild.fm/2/ 915 | http://rebuild.fm/2/ 916 | Tatsuhiko Miyagawa 917 | 918 | no 919 | 江島健太郎さん(@kenn)をゲストに迎えて Macbook, 開発環境, Rails, 920 | Heroku, VPS などについて話しました。 921 | 922 | 江島健太郎さん(@kenn)をゲストに迎えて Macbook, 開発環境, Rails, 923 | Heroku, VPS などについて話しました。 924 | 925 | 47:56 926 | 927 | 928 | 929 | 930 | 931 | 1: Podcasting, LTSV, RubyMotion (伊藤直也) 932 | <p>伊藤直也さん(<a href="http://twitter.com/naoya_ito">@naoya_ito</a>)をゲストに迎えてポッドキャスト、LTSV、RubyMotion、Perlなどについて話しました。</p> 933 | 934 | <h3>Show Notes</h3> 935 | 936 | <ul> 937 | <li><a href="http://5by5.tv">5by5</a>, <a href="http://www.muleradio.net">Mule Radio</a></li> 938 | <li><a href="http://blog.instapaper.com/post/24549960305">Instapaper for Android</a></li> 939 | <li><a href="http://ltsv.org">LTSV</a>, <a href="http://d.hatena.ne.jp/naoya/20130209/1360381374">LTSV FAQ</a></li> 940 | <li><a href="http://news.ycombinator.com">HackerNews</a></li> 941 | <li><a href="http://flipboard.com">Flipboard</a></li> 942 | <li><a href="http://d.hatena.ne.jp/naoya/20130128/1359369101">開発メモ#2 : AWS でのホスト / クラウドネイティブなデプロイ</a></li> 943 | <li><a href="http://d.hatena.ne.jp/naoya/20130205/1360062070">Vagrant</a></li> 944 | <li><a href="http://www.rubymotion.com">RubyMotion</a></li> 945 | <li><a href="http://rubysource.com/getting-to-know-rubymotion-with-laurent-sansonetti/">Getting To Know RubyMotion With Laurent Sansonetti</a></li> 946 | <li><a href="http://docs.topazruby.com/en/latest/blog/announcing-topaz/">Topaz A New Ruby</a></li> 947 | <li><a href="https://github.com/MoeOrganization/moe">Moe</a></li> 948 | <li><a href="http://blogs.perl.org/users/ovid/2013/02/perl-7.html">Perl 7</a>, <a href="http://blogs.perl.org/users/ovid/2013/02/perl-7---final-thoughts.html">Perl 7 Final thoughts</a></li> 949 | </ul> 950 | 951 | Wed, 13 Feb 2013 00:00:00 -0800 952 | http://rebuild.fm/1/ 953 | http://rebuild.fm/1/ 954 | Tatsuhiko Miyagawa 955 | 956 | no 957 | 伊藤直也さん(@naoya_ito)をゲストに迎えてポッドキャスト、LTSV、RubyMotion、Perlなどについて話しました。 958 | 959 | 伊藤直也さん(@naoya_ito)をゲストに迎えてポッドキャスト、LTSV、RubyMotion、Perlなどについて話しました。 960 | 961 | 52:53 962 | 963 | 964 | 965 | 966 | 967 | 968 | --------------------------------------------------------------------------------