├── 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 |
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 [](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'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'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&qid=1380666636&sr=8-1&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'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' 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'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'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'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'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's Adam Orth, The "Always-On" 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'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 "full-stack programmer" 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't think iOS 7 is beautiful, I don'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'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 & 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&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'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&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'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 |
--------------------------------------------------------------------------------