Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
はてなにおけるモダンAndroidアプリ開発入門
Search
cockscomb
December 03, 2014
Programming
16k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
はてなにおけるモダンAndroidアプリ開発入門
@ Hatena Engineer Seminar #3
cockscomb
December 03, 2014
More Decks by cockscomb
See All by cockscomb
はてなアカウント基盤 State of the Union
cockscomb
1
1.5k
jq at the Shortcuts
cockscomb
1
2.1k
GraphQL放談
cockscomb
4
2.2k
GraphQL Highway
cockscomb
28
8.9k
吉田を支える技術
cockscomb
0
2.6k
コーポレートサイトを静的化してAmplify Consoleにデプロイする
cockscomb
0
3.5k
ユーザインターフェイスと非同期処理
cockscomb
5
2.1k
GUIアプリケーションの構造と設計
cockscomb
10
10k
イカリング2におけるシングルページアプリケーション
cockscomb
2
7.8k
Other Decks in Programming
See All in Programming
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
JIS keyboard support in Omarchy
lef237
0
110
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
Next.js: The final boss of Web Performance
guaca
0
250
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.2k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The Curious Case for Waylosing
cassininazir
1
570
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
So, you think you're a good person
axbom
PRO
2
2.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Optimising Largest Contentful Paint
csswizardry
37
4k
Claude Code のすすめ
schroneko
67
230k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Faster Mobile Websites
deanohume
310
32k
Documentation Writing (for coders)
carmenintech
77
5.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Transcript
כגזחֶֽ ٌتٝ"OESPJE،فٔ涪Ⰵ DPDLTDPNC !)BUFOB&OHJOFFS4FNJOBS
JEDPDLTDPNC
JEDPDLTDPNC ˖ ،فٔ؛٦ءّٝؒٝآص، ˖ J04"OESPJE8FC،فٔ؛٦ءّٝ⡲ ˖ כגזـؚٗث٦ي
WWDC14
None
ͰखʹೖΕΑ͏ כגזـؚٗ
• Motivation • Process • Development • Engineers
None
Motivation
None
–Anonymous ˑ״999ך"OESPJE،فٔת˒
0UIFST "OESPJE J04
None
X
Build Flagships ⛵
None
Process
None
None
˖ ل٦ػ٦فٗزة؎فדⰋגך歗䲽ֹ⳿ׅ ˖ 歗ך銲稆峤ְ⳿ׅ ˖ 歗ה歗ךאזָך濨湼זֻׅ ˖ فٗزة؎فדِ٦ؠؽٔذ؍ذأزׅ ˖ זץֻ傍ְ媮ꥡד鐰⣣ׅ
˖ ذأزך穠卓החفٗزة؎ف⥜姻ׅ
剢 抟 宏 加 ꆃ أفٔٝز 鎘歗 أفٔٝز ٖؽُ٦
剢 抟 宏 加 ꆃ أفٔٝز 鎘歗 ِ٦ؠؽٔ ذ؍ذأز 鎘歗
ِ٦ؠؽٔ ذ؍ذأز ؙٕٔ٦ز ِ٦ؠؽٔ ذ؍ذأز أفٔٝز ٖؽُ٦
None
None
˖ أؙٓيؿٖ٦يٙ٦ؙח⛦ֿהד嚂ׅ ˖ ِ٦ؠؽٔذ؍ذأزד䧭卓然钠ׅ ˖ 䙼ְ鴥דֹֽ《ꤐֻ ˖ أفٔٝزהِ٦ؠؽٔذ؍ذأزず劍ׅ ˖ 竰竲涸ז何㊣ך؎ذٖ٦ءّٝ㔐ׅ
None
Development
.BUFSJBM%FTJHO ˖ "QQ$PNQBU ˖ 'SBHNFOU
.BUFSJBM%FTJHO ˖ HPPHMFDPNEFTJHO ˖ "QQ$PNQBU ˖ "DUJPO#BS"DUJWJUZ ˖ 5IFNF"QQ$PNQBU ˖
תתָל
'SBHNFOU ˖ 'SBHNFOU ˖ 'SBHNFOU5SBOTBDUJPO ˖ 'SBHNFOU.BOBHFS ˖ عو
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container); if (fragment == null) {
fragment = SomeFragment.newInstance(); getSupportFragmentManager().beginTransaction() .replace(R.id.container, fragment) .commit(); }
'SBHNFOUعوه؎ٝز ˖ 'SBHNFOUך䗁⯋ ˖ 'SBHNFOUךⰅ㶨 ˖ getChildFragmentManager ˖ onActivityResult ˖
IllegalStateException ˖ commitAllowingStateLoss
כגזـؚٗך箟꧊ٌ٦س ˖ 鋅תת箟꧊ ˖ כגז鎸岀 ˖ .BSLEPXO
鋅תת箟꧊ ˖ )5.-ךcontenteditable • execCommand("formatBlock", false, "H1") ˖ 8FC7JFXךغ٦آّٝח״ ˖
$ISPNFדرغحؚ"OESPJE⟃꣬
כגז鎸岀٥.BSLEPXO ˖ ♨㻝ח㹋鄲
ֿֿכ鋅⳿׃ח׃ְ] 劤俑דׅկ
ֿֿכ鋅⳿׃ח׃ְ] 劤俑דׅկ
ֿֿכ鋅⳿׃ח׃ְ] 劤俑דׅկ
ֿֿכ鋅⳿׃ח׃ְ] 劤俑דׅկ
ֿֿכ鋅⳿׃ח׃ְ] 劤俑דׅկ
מהאך갪湡 סאך갪湡 אך갪湡
מהאך갪湡 סאך갪湡 אך갪湡
מהאך갪湡 סאך갪湡 אך갪湡
מהאך갪湡 סאך갪湡 אך갪湡
מהאך갪湡 סאך갪湡 אך갪湡
㣐ⴖזֿהכ䓼锃׃ְ
㣐ⴖזֿהכC䓼锃C׃ְ
㣐ⴖזֿהכ䓼锃׃ְ
♨㻝ח㹋鄲כꨇ׃ְ ˖ 牞כ稢鿇ח㺊 ˖ ֽו˘˘ ˖ 䩛דְְ然钠׃ֻזְ ˖ ךדծ ˖
⽃⡤ذأز剅ֻ
public void testGetLineRanges() throws Exception { String text = "ABCDEFG\n"
+ "HIJKLMN\n" + "OPQRSTU\r\n" + "VWXYZ"; { List<BaseCommand.Range> lineRanges = BaseCommand.getLineRanges(text, new BaseCommand.Range(8, 9)); assertContentsInOrder(lineRanges, new BaseCommand.Range(8, 16)); assertEquals("HIJKLMN\n", text.subSequence(8, 16)); } }
public void testDecorateWrappingInline() throws Exception { String text = "ABCDEFG\n"
+ "HIJKLMN\n"; ArrayList<String> decorators = Lists.newArrayList("<b>", "</b>"); { Editable editable = Editable.Factory.getInstance().newEditable(text); BaseCommand.Range newRange = BaseCommand.decorateWrappingInline( editable, new BaseCommand.Range(2, 4), decorators ); assertEquals("AB<b>CD</b>EFG\n" + "HIJKLMN\n", editable.toString()); assertEquals(new BaseCommand.Range(5, 7), newRange); } }
⽃⡤ذأز ˖ ٗآحؙךذأز剅ֻ ˖ הծ ˖ 6*ָזֻגفؚٗٓيך姻䔲䚍ָ嗚鏾דֹ ˖ ךדծ ˖
ذأز鸐؝٦س剅ֻֽד״ְ ˖ 牞כذأزח㺊
،ؕؐٝزה"1* ˖ "DDPVOU.BOBHFS ˖ /FUXPSL$MJFOU
"DDPVOU.BOBHFS ˖ "OESPJEך،ؕؐٝز盖椚ءأذي ˖ ،ؕؐٝز盖椚䬄韋⻉ ˖ 钠鏾ز٦ؙٝך《䖤䬄韋⻉ ˖ ،فٔדⰟ剣
AccountManager accountManager = AccountManager.get(this); // ΞΧϯτΛՃ Account account = new
Account("cockscomb", "jp.ne.hatena"); accountManager.addAccountExplicitly(account, "Passw0rd!", null); // ΞΧϯτΛऔಘ Account[] accounts = accountManager.getAccountsByType("jp.ne.hatena");
accountManager.getAuthToken( account, "jp.ne.hatena.token", true, new AccountManagerCallback<Bundle>() { @Override public void
run(AccountManagerFuture<Bundle> future) { try { // τʔΫϯऔಘ Bundle result = future.getResult(); String authToken = result.getString( AccountManager.KEY_AUTHTOKEN ); } catch (OperationCanceledException | IOException | AuthenticatorException e) { // ΤϥʔϋϯυϦϯά } } }, null);
"DDPVOU.BOBHFS כגזؚٗ؎ٝ盖椚
8FC"1* ˖ 駈זֽל⡲ ˖ 1FSMד剅ְג1VMM3FRVFTU
)551/FUXPSLJOH ˖ 圫ղז鼅䫛肇 ˖ )UUQ63-$POOFDUJPO ˖ )UUQ$MJFOU ˖ 7PMMFZ ˖
0L)UUQ ˖ 3FUSPU
7PMMFZ ˖ (PPHMF醡 ˖ &BTZ 'BTU/FUXPSLJOHGPS"OESPJE ˖ "DDPVOU.BOBHFSה鸬䵿
public void getEntries( Response.Listener<JSONObject> listener, Response.ErrorListener errorListener ) { Request<JSONObject>
request = new JsonObjectRequest( Request.Method.GET, HOST_HATENA + "/my/entries", listener, errorListener ) { @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<>(); headers.put("X-Session-Key", mAuthenticator.getAuthToken()); return headers; } }; RequestQueue requestQueue = Volley.newRequestQueue(mContext); requestQueue.add(request); }
3FUSPU ˖ 4RVBSF醡 ˖ "UZQFTBGF3&45DMJFOUGPS"OESPJEBOE+BWB
public class BlogClient { private static final String API_URL =
"https://blog.hatena.ne.jp"; public interface BlogService { @GET("/my/entries") void getEntries( Callback<List<EntryResponse>> callback ); @POST("/my/entries") void postEntry( @Body DeviceRequest entry, Callback<EntryResponse> callback ); @Multipart @POST("/my/images") void uploadProfileIcon( @Part("image") TypedFile image, @Part("title") String title, Callback<ImageResponse> callback ); } public static BlogService getSessionClient(Account account) { RestAdapter restAdapter = new RestAdapter.Builder()
ͰखʹೖΕΑ͏ כגזـؚٗ
None
˒˒˒˒˒ ˒˒˒˒˒
None
Engineers
id:cockscomb id:aereal id:nobuoka id:hakobe932 id:funnelbit id:sakahara id:yashigani_w
ـؚٗث٦ي ـحؙو٦ؙث٦ي
أو٦ز⠓
أو٦ز⠓ ˖ ✼ְךأو٦زׁ釈獥ִ⠓ ˖ ث٦يדⴓ倖ָׁז长㉏겗鍑寸 ˖ 䪮遭ךⰟ剣 ˖ ث٦ي埆倖ׅ《穈
id:cockscomb id:aereal id:nobuoka id:hakobe932 id:funnelbit id:sakahara id:yashigani_w
Join Us id:cockscomb id:aereal id:nobuoka id:hakobe932 id:funnelbit id:sakahara id:yashigani_w You
None