FILCO ウッドパームレスト Sサイズ 分離型(2分割) 幅(296mm) 天然堅木製 オスモカラー仕上げ 日本製 ブラウン FWPR/S
- 出版社/メーカー: ダイヤテック
- メディア: エレクトロニクス
- この商品を含むブログを見る
木なので冷たいのかなと思ったけどそんな事なかった。なんかさわり心地もいいし、もっと早く買っとけばよかった。
FILCO ウッドパームレスト Sサイズ 分離型(2分割) 幅(296mm) 天然堅木製 オスモカラー仕上げ 日本製 ブラウン FWPR/S
ユリゴコロまだやってるでしょと思ったら全くそんなことはなく結構遠出しないと駄目だった
— ひさいち (@hisaichi5518) 2017年10月28日
ユリゴコロはじまる
— ひさいち (@hisaichi5518) 2017年10月28日
吉高由里子とにかく可愛かったな
— ひさいち (@hisaichi5518) 2017年10月28日
インタビューとか見てたので、このシーンは10月に撮って寒かったシーンやなとか考えながら見てた
— ひさいち (@hisaichi5518) 2017年10月28日
松ケンのホクロが気になってしょうがなかった
— ひさいち (@hisaichi5518) 2017年10月28日
30億年ぶりに紅虎きた
— ひさいち (@hisaichi5518) 2017年10月28日
— ひさいち (@hisaichi5518) 2017年10月28日
うまい
— ひさいち (@hisaichi5518) 2017年10月28日
餃子8個はいけるな
— ひさいち (@hisaichi5518) 2017年10月28日
ビールと餃子と炒飯食べてて完全勝利🏅
— ひさいち (@hisaichi5518) 2017年10月28日
吉高由里子は可愛い
↑の続きです。
Android Studio Release Notes | Android Studio
Android Developers Blog: Android Studio 3.0
まあ、そうですよね
minneではテストでKotlinとassertjを利用しているんですが、 .isNotNull()
ではなく .isNotNull
と書けてた。一応.isNotNull()
を利用するようにしましょうという感じだったんだけど、残念なことにいくつか漏れがあってAndroid Studio 3.0にしたタイミングで.isNotNull
がコンパイルができなくなったので、修正した。
まあまあ昔からあるアプリなので、 org.apache.http.NameValuePair
に依存してたりする。今まではエラーになってなかったけど、Android Studio 3.0にしたタイミングでテストでClassNotFoundExceptionを吐くようになったので、robolectricのhttpclientを追加した。
このあたりは、消したい気持ちをこらえる必要がありました。
Android Studioが警告を出してきたのでポチポチした。
前も出てたけど、クリックしても設定画面に飛ばなかったんですが、今回は設定画面に飛んで設定出来るようになりました。
というわけで、minneを運営するGMOペパボは本日めでたくリリースされたAndroid Studio 3.0 stable対応企業です。よろしくお願いいたします。
【minne】Androidアプリエンジニア / GMOペパボ株式会社
Activity間で共通の画像があって、それをシューンと移動させるのがマテリアルしてんじゃん!という感じなのでやってみた。
試したのは、エミュレータでAndroid 7.0です。全部のコードはここにある。
このような感じに動くシンプルなやつ
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); GlideApp.with(this) .load(R.drawable.sample) .into(binding.view1); RxView.clicks(binding.view1).subscribe(__ -> { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( this, binding.view1, "image"); ContextCompat.startActivity(this, new NextActivity.IntentBuilder(this).build(), options.toBundle()); }); } }
遷移先のActivity
public class NextActivity extends AppCompatActivity { private ActivityNextBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_next); GlideApp.with(this) .load(R.drawable.sample) .into(binding.view1); RxView.clicks(binding.view1).subscribe(__ -> { ActivityCompat.finishAfterTransition(this); }); } static class IntentBuilder { private final Context context; IntentBuilder(Context context) { this.context = context; } Intent build() { return new Intent(context, NextActivity.class); } } }
あとは遷移先のImageViewにandroid:transitionName="image"
を指定してあげると動く。
案外簡単だった。windowに値をセットして〜〜〜とか説明してる記事がいくつかあったけど、特にいらなかった。試したのがAndroid 7.0だからかもしれない。またtransitionNameはstrings.xmlとかに書くのが本当はいいと思う。
時々変に移動する時がある。これはよくわからなかった。
時々ヒューンってどっかいくのウケる pic.twitter.com/AMKIwCi5OG
— ひさいち (@hisaichi5518) 2017年9月27日
testAnnotationProcessor "..."
と書くと実行されてクラスは作られてテストも想定通り動くが、Android Studio上ではクラスが参照できずにエラーになる。
https://issuetracker.google.com/issues/37121918
関連したgistに回答があった。
gist.github.com
android { defaultConfig { android.libraryVariants.all { def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}") it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir) } } }
Annotation Processor のテスト書きたいなと思って書いてた。
[java] モダンな Annocation Processor の開発手順まとめ - tokuhirom's blog
package com.github.hisaichi5518.konohana.processor; import com.google.common.truth.Truth; import com.google.testing.compile.JavaFileObjects; import com.google.testing.compile.JavaSourceSubjectFactory; import org.junit.Test; public class KonohanaProcessorTest { @Test public void test() { Truth.assert_().about(JavaSourceSubjectFactory.javaSource()) .that(JavaFileObjects.forResource("Success.java")) .processedWith(new KonohanaProcessor()) .compilesWithoutError(); } }
コンパイルが通ったらテストが通るというのをやろうとしたら通らない!!!なぜ!!javapoetのTypeName.get() できてない!
java.lang.RuntimeException: java.lang.IllegalArgumentException: part '<any>' is keyword at com.sun.tools.javac.main.Main.compile(Main.java:553) at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) at com.google.testing.compile.Compiler.compile(Compiler.java:146) at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilation(JavaSourcesSubject.java:293) at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:267) at com.github.hisaichi5518.konohana.processor.KonohanaProcessorTest.test(KonohanaProcessorTest.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Caused by: java.lang.IllegalArgumentException: part '<any>' is keyword at com.squareup.javapoet.Util.checkArgument(Util.java:64) at com.squareup.javapoet.ClassName.<init>(ClassName.java:49) at com.squareup.javapoet.ClassName.<init>(ClassName.java:43) at com.squareup.javapoet.ClassName.get(ClassName.java:218) at com.squareup.javapoet.TypeName$1.visitDeclared(TypeName.java:268) at com.squareup.javapoet.TypeName$1.visitError(TypeName.java:290) at com.squareup.javapoet.TypeName$1.visitError(TypeName.java:243) at com.sun.tools.javac.code.Type$ErrorType.accept(Type.java:1855) at com.squareup.javapoet.TypeName.get(TypeName.java:243) at com.squareup.javapoet.TypeName.get(TypeName.java:238) at com.github.hisaichi5518.konohana.processor.definition.KeyDefinition.<init>(KeyDefinition.java:35) at com.github.hisaichi5518.konohana.processor.definition.StoreDefinition.lambda$keyDefinitionStream$3(StoreDefinition.java:88) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.Iterator.forEachRemaining(Iterator.java:116) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at com.github.hisaichi5518.konohana.processor.builder.StoreMethods.build(StoreMethods.java:23) at com.github.hisaichi5518.konohana.processor.writer.StoreWriter.buildTypeSpec(StoreWriter.java:41) at com.github.hisaichi5518.konohana.processor.writer.StoreWriter.write(StoreWriter.java:73) at com.github.hisaichi5518.konohana.processor.writer.StoreWriter.write(StoreWriter.java:30) at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.Iterator.forEachRemaining(Iterator.java:116) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at com.github.hisaichi5518.konohana.processor.KonohanaProcessor.process(KonohanaProcessor.java:31) at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705) at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170) at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856) at com.sun.tools.javac.main.Main.compile(Main.java:523) ... 33 more
コンパイル対象のファイルを見てたら、java.util.List
がimportされてなかった…マジか………。追加したら無事なおった。
追記:
gfxさんにテストの内容について教えてもらった
正常系はlibrary側でやるのがよさそう
annotation prosessorのテスト、コンパイルエラーにしたいケースでしかやってないです。というか、機能のテストはできないからテストの意味がない…。
— FUJI Goro (@__gfx__) 2017年9月21日
正常系は、生成したコードの機能をテストするのがいいんじゃないですかね。
— FUJI Goro (@__gfx__) 2017年9月21日
作る度に毎度似たようなことをしていてめんどくさい。しかも忘れていたりするのでテンプレート化したいんですが、Android Studioを更新するときにはテンプレートを消さないといけないとかあるらしくてそれはそれでだるいので、とりあえず将来の自分のためにメモとして残しておく。
ここでは、Konohanaという名前のライブラリを作ろうとしています。 名前の由来は、此花区です。かわいい。
全部のログはここにあります。
まずは、サンプルアプリを作ります。
File -> New Project を選択
com.github.hisaichi5518.konohana.example
に変更するKonohana
にするそのあとは自分がmin sdkなどを指定してFinishを押す。 ビルド出来るようになるので、とりあえずビルドして安心感を得る。
プロジェクト生成が終われば、Gitをアレしてソレする。
git init
curl https://www.gitignore.io/api/vim%2Candroid%2Candroidstudio > .gitignore
git add .
git commit -m "first commit"
gitignoreを自分で頑張るのは不毛なので gitignore.io に任せる。僕が利用するVim, Android, Android Studio を指定してある。 Githubにリポジトリ作るとかは良きタイミングで。
File -> New Module -> Android Library を選択
Konohana
library
com.github.hisaichi5518.konohana
Android libraryの中にannotationを入れてもいいような気がしますが、後述するProcessor library(Java library)がAndroid libraryに依存するのが許せなかったので分けます。
File -> New Module -> Java Library を選択
annotation
com.github.hisaichi5518.konohana.annotation
Key
annotations
としているライブラリがいくつかありましたが、他は単数形でこれだけ複数形にするのが気になったのでやめました。なにか複数形にするべき理由があるのかもしれない。
File -> New Module -> Java Library を選択
processor
com.github.hisaichi5518.konohana.processor
KonohanaProcessor
processorのみJava8を指定する。
JavaVersion.VERSION_1_8
を指定する以下のように変更し、git commit する。
以下を追加する
compile project(':annotation')
以下を追加する
annotationProcessor project(':processor')
compile project(':library')
以下を追加する
compile project(':annotation')
Android Studio 3.0だと不要だと思う。 以下のコミットのように追加する。
以下のコミットのように追加していく。
また様々な箇所でバージョンを指定する必要があり、揃える必要があるライブラリ(例えばサポートライブラリ)は、バージョンを変数にいれる。
ライブラリは、最新版を利用したほうがいいので、以下のURLを確認
最後に library/build.gradleにある appcompat-v7
は不要であることもあるので、不要なら消す。
KonohanaProcessor を変更していく。
自動生成されるのはclassなのでAnnotationにする。 あとexampleで利用するコード書いておく。
@Target(ElementType.FIELD) public @interface Key { }
public class MainActivity extends AppCompatActivity { @Key String name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
Build -> Rebuild Project
なんかもっとスマートなやり方があったら知りたい。 github.com