2014年7月31日木曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Statement of Accomplisment)

二つ目のCourseraのコースの修了証が発行された。
無事に満点で修了、と思ったら。。。?
You earned 100.7% with distinction
何故か100%超になっている!?

Programming in Scala, First Edition: Chapter 24

24. Extractors
  pattern matchingを使うためにはcase classを用意する必要がある。
    case classを作らないでpattern matchingを使いたいかもしれない。
    独自のpatternを作りたいかもしれない。
  Extractorsを使えばpatternを定義してobjectから取り出すことが出来る。

24.1 An example: Extracting email addresses
  例としてemail addressのユーザ部分とドメインの切り出しを考える。
  アクセス関数を使って行う場合。
    def isEMail(s: String): Boolean
    def domain(s: String): String
    def user(s: String): String
    if (isEMail(s)) println(user(s) +" AT "+ domain(s))
    else println("not an email address")
    ちゃんと動くけど無駄が多い。
    複数の条件を組み合わせるともっと複雑になりイマイチ。
  pattern matchingが使えるとしたら。
    ss match {
      case EMail(u1, d1) :: EMail(u2, d2) :: _ if (u1 == u2) => ...
      ...
    }
    シンプルに書ける。
  問題はStringがcase classではないのでpattern matchingが使えない事。
    EMail(user, domain)の様な内部表現を持っていない。
  Extractorを使えば出来る。
    既存のtypeに対して新しいpatternを定義出来る。
    typeの内部表現は不要。

24.2 Extractors
  unapply methodを持つobject
    値のmatchingと分離を行う。
  apply methodを持つこともある。(optional)
    値を構築するためのmethod。
    ** companion objectと似ている。
  email addressのExtractorの例
    object EMail {
      // The injection method (optional)
      def apply(user: String, domain: String) = user +"@"+ domain
      // The extraction method (mandatory)
      def unapply(str: String): Option[(String, String)] = {
        val parts = str split "@"
        if (parts.length == 2) Some(parts(0), parts(1)) else None
      }
    }
  apply method(injection)を持つ場合function typeを明示的にextendsしても良い。
    object EMail extends (String, String) => String { ... }
    これはFunction2[String, String, String]と同じ。
      ?? the declaration of the abstract apply method ??
  unapplyはSome(x)を返す。matchしないときはNone
  ?? selectorとunapplyの引数のtypeが合わなくても使える??
    ?? unapplyの引数のtypeにcastしてmatchされる??
  injection methodがあってもobjectはExtractorと呼ばれる。
  applyとunapplyは対にすべき。
    特に制約がある訳ではないが、分かり易さのため。

24.3 Patterns with zero or one variables
  3個以上に分離する場合は3以上の要素数のtupleをSome()に包んで返せばよい。
  1個と0個の時は扱いが少し違う。
  1個の場合
    tupleは使わずに値を直接Some()に包んで返す。
      1要素のtupleはない
  0個の場合
    ()のみの引数無(Unit??)にmatchさせる。UpperCase()
    ()は省略できない。省略するとobjectを値としてmatchさせようとしてしまう。
    値は分離できないが、matchした全体をbindingは出来る。
      x @ UpperCase()

24.4 Variable argument extractors
  可変長要素を取り出したいとき。
    List(x, y , _*)と同様な事がやりたい。
  unapplySeq methodを使う。
    object ExpandedEMail {
      def unapplySeq(email: String)
          : Option[(String, Seq[String])] = {
        val parts = email split "@"
        if (parts.length == 2)
          Some(parts(0), parts(1).split("\\.").reverse)
        else
          None
      }
    }
  可変数要素のみの場合はOption[Seq[T]]を返す。
  固定数要素 + 可変数要素の場合は、Option[T1, T2, Seq[T3]]
    T1, T2, Seq[T3] のtupleをSome()で包んだもの。
  bindingも可能
    case ExpandedEMail("tom", domain @ _*) => ...

24.5 Extractors and sequence patterns
  ListやArrayのsequence patternsも実体はExtractor
  ライブラリでunapplySeq()を実装している

24.6 Extractors versus case classes
  Extractorの利点
    実装非依存(Representation independence)
    patternがtypeのデータ表現に依存していない。
    typeの実装を後から変更してもclient codeへの影響を抑えられる。
    unapply methodの作り次第でどんなpatternでも作れる。
  case classの利点
    シンプルで分かりやすい。
    性能が良い。特定のパターンに絞ってコンパイラが最適化出来るようにしている。
    全パターン網羅されているかコンパイラでチェック出来る。
  まずはシンプルなcase classでの実装を検討してみる。
    case classから後でExtractorに変える事も出来るので。
  Extractorにした方が良いのは以下の時。
    case classでは扱えないpatternを使いたいとき。
      データ表現とpatternが合わない場合等。
    ユーザが不特定多数で、後からデータ表現が変わる可能性があるとき。
      case classだとデータ表現の影響で使えるpatternが変わってしまう。
      ユーザが使用するpatternを制限出来るならcase classでも良い。

24.7 Regular expressions
  Extractorの有効な使い方として正規表現がある。
  scalaはJavaの正規表現を継承していて、Javaは大体Perlと同じ。
    java.util.regex.Pattern 参照
  正規表現の生成方法。
    import scala.util.matching.Regex
    new Regex("(-)?(\\d+)(\\.\\d*)?")
      \はエスケープなので\\にする。
    new Regex("""(-)?(\d+)(\.\d*)?""")
      raw stringsを使えば\のエスケープ不要。
    """(-)?(\d+)(\.\d*)?""".r
     Stringに .r methodを適用しても生成出来る。
        StringがRichStringにimplicit conversionされて .r が適用される。
  検索方法
    regex findFirstIn str
      最初にマッチした部分文字列のOption typeを返す。
    regex findAllIn str
      マッチする全ての部分文字列のIteratorを返す。
    regex findPrefixOf str
      strの先頭からマッチさせた部分文字列のOption typeを返す。
  Extracting with regular expressions
    全ての正規表現はExtractorにもなっている。
    正規表現の(), groupの部分を切り出せる。
      Perlの$1,$2...と同様。
    matchしなかったgroupにはnullがbindされる。
    for expressionに正規表現のExtractorを使う事も出来る。

24.8 Conclusion
  Extractorを使えばtypeのデータ表現とは独立して柔軟にpatternを定義出来る。
  大規模ソフトではpatternをデータ表現と分離できることも保守性の向上で重要。
  Extractorは柔軟なライブラリの抽象化を可能にする。
  scalaのライブラリでも、正規表現の様に、多用されている。

2014年7月26日土曜日

ピアノ発表会(2014/7/25)

今日はいちご、サンのピアノ発表会だった。
仕事は年休を取って家族みんなで聞きに行った。

ホールは家から車で40分位の所。
リニューアルしたばかりで新しくて綺麗だった。
最初、駐車場が満車で中々入れなかったが、何とか演奏には間に合った。

二人とも間違っても止まらずに立て直して流良く演奏出来ていた。
いちごはパソドブレの曲と衣装がバッチリ決まっていた。
サンは出場者の中で一番背が小さいくらいだったが、合唱のドレミの歌も大きい声で歌えていた。
サンは初めの挨拶もちゃんと出来ていたらしい。

帰りにイオンでしゃぶしゃぶ食べ放題を食べた。
おなか一杯食べれた。(ちょっと食べ過ぎたかも。。。)
普通の昆布だしの他に、すき焼きだしやトマトだしもあった。
すき焼き出しと卵の組み合わせが美味しかった。
牛よりも豚の方が柔らかくておいしかった。

朝、いちごが自分で庭に植えていた向日葵のお花に「頑張ったご褒美が小さいものでも良いからもらえます様に」とお願いしていた。
なので、ご飯の後はほっぺちゃんのお店で頑張ったご褒美を買った。
いちごはリップとマニキュア、サンは鉄砲、あんずはほっぺちゃんのティッシュを買った。

夕方から仕事の打ち合わせがあったがギリギリ間に合った。
子供が起きている時間に帰れて、一緒に早寝できた。

2014年7月24日木曜日

TOEIC IPテストの難易度

これまで私はIPテストのみで公開テストを受けたことがないが、難易度に差があるのだろうか?
色々なサイトを見ると概ねIPテストの方が易しいとあったが。。。

IPテストは公開テストの過去問が使われている。
TOEICは年々難化しているので過去問なら易しいはず?

ただ、2012/10以降は韓国版が使われているらしい。
韓国は日本よりTOIEC熱が高くて対策も進んでいるため、問題が日本より難しいとの話もあり。

点数観点では補正があるからあまり影響しないはず?

試験環境で言うと、IPは仕事の後だから疲れていると言うデメリットがある。
しかし、何時もの環境、知り合いの中だから緊張しにくいと言うメリットもありそう。

結局あまり変わらないはずという事になりそうだが、公開テストもどんなもんだか受けてみたいなあと思った。

2014年7月23日水曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Week 8)

==== Lecture ====
Section 2 Module 1 Part 7: Programming Bound Services with Messengers (Part 1) (10:50)
two-way communication
A pair of Messengers are used conurrently.
e.g., A Unique ID generator App.
The activity calls bindService() on onStart().
The service returns a reference to a Messanger via the onBind().
The activity receives this reference via the onServiceConnected().
The activity send a message containing a reply Messenger by using this reference.
The service receives the message via the handleMessage().
The service returns a message and the activity displays the result.
Broker & proxy pattern.
How to stop a bind service? => unbind(), unbindService().
If all clients is disconnected from the service, unbind() is called.
"hybrid" with Bound & Started Services => rebind().

Section 2 Module 1 Part 8: Programming Bound Services with Messengers (Part 2) (12:51)
It is easy to understand what the bound service do with the diagram on this Lecture.
If the service carshes, onServiceDisconnected() is called.

Section 2 Module 1 Part 9: Overview of the Android Interface Definition Language and Binder Framework (12:48)
AIDL & Binder: mimics Java object.
ex. Async/Sync Download Application
remote procesure call, serialize (marchaling, demarshaling)
Marchaling is tedious & erro-prone, so AIDL is needed.
AIDL is similar to Java interface. AIDL Compiler makes stubs and proxys.
Apps rarely access the Binder directly.
The Binder Driver runs in the Linux kernel.
AIDL is used on Java, as well as C/C++.
The default is sync. (two-way)
It is can be possible to do async opration with one-way methods.
To avoid race condition is needed by developers.
AIDL apply Broker pattern.

Section 3 Module 1 Part 1: The Monitor Object Pattern (Part 1) (12:45)
Minitor Object is used by Moniter Condtion and Monitor Lock and etc.
It gives sync method to other object.
acquire, release, wait, notify, notifyAll
Monitor Object can be used on C++.
Drawback: scale, multiple shared object

Section 3 Module 1 Part 2: The Monitor Object Pattern (Part 2) (12:14)
LikedBlockingQueue
public methods => ex. syc put() ,syc take()
private methods => ex. enqueue, dequeue
Monitor Object has Monitor Lock and Monitor Condition.
AtomicInteger is used.
Thread Safe Interface pattern
Guarded Suspension pattern => put() uses this pattern to wait for space to became available. take() also uses this pattern.
Monitor Object Pattern is implemented with java.util.conccurrent classes rather than java's built-in monitor objects.
Invariants => the values is not changed by others as long as lock is acquired.
Object-specific invariants must hold as threads suspend & resume their execution.

Week 7 Assignment 6: Solution Walkthrough
To fix the manifest, It is OK to add 'export="false"' or add a permission or just remove the intent-filter.
To fix LoginActivity, It is also OK to get the password by GUI or something each time instead of storing the login.txt on the storage.

==== Quiz ====
1st attempt: 31/32
2nd attempt: 32/32

==== Assignment ====
[Week-8-Assignment-7]
synchronize? => not used.
try/catch? => for the functions throwing exception only.
e.printStackTrace or log or toast? => printStackTrace because it can be printable on Android logcat.


try/finally, final, this, private, volatile, Lock, 初期化, fair, non-fair
static, join, interrupt, @Override
constructorはlock不要。(W2-A1と同様)
volatileを使えばcacheの一貫性は保てる? => yes.
Uninterruptiblyでもtry/finallyするべき? => yes?
countのreturnでもlock必要? => no. volatileなら不要。
ローカル変数も初期化すべき? finalをつけるべき? => yes? 講師はfinal派?
thisはつけるべき? => 付けていない人の方が多い感じなのでつけないで命名規則で。
インスタンス変数にはmXxxxの名前にすべき? => yes.
importのunusedがある場合は親クラスとして使うかもしれない。
weekreferenceはgetで本体を取り出せる。

とにかくLectureに大体は例がある。
さらにForumをみれば大体疑問点は出尽くしている。
VOHでは提出済のモノは詳しい説明あり。提出前のモノは簡単な説明ある。

Your work was submitted. Review your work to make sure everything looks OK.
のリンクから提出状況を確認できる。submit直後のみ。

[Evaluation]
Self
ClassName.this is used as a concext.
printStackTrace() is used.

S1
getBaseContext() is used as a context.

S2
getApplicationContext() is used as a context.
Throwing the exception is added instead of catching the exception.

S3
Null checking to stub variables is added.

S4
Log.e() is used.

S5
Null checking to stub variables is added.
getApplicationContext() is used as a context.

[Results]
I've got 18 points and one suggestion below.

// Use an AsyncTask so the twoway mDownloadCall doesn't
// block the UI thread and displayBitmap is called on
// the UI thread.

==== Etc ====

[Eclipse]
.classpath was modified by Eclipse when the file was imported as an eclipse project.
I checked the other assignments' .classpath and .classpath of this assignment seems wrong.
I also checked the forum of this course but only one unresolved topic is about this...
Should I post something about this on the forum?

==== log ====
2014/06/30 00:40 Lecture
2014/07/01 00:40 Lecture
2014/07/02 00:20 Quiz
2014/07/02 00:45 Lecture & Quiz
2014/07/06 00:30 Assignments
2014/07/11 00:40 Lecture
2014/07/13 02:30 Assignments
2014/07/13 00:10 Assignments
2014/07/19 01:00 Evaluation
2014/07/20 01:00 Evaluation
2014/07/22 00:10 Result

CodeIQ

CodeIQ (https://codeiq.jp/)
リクルートが行っているIT実務者のスキル評価のためのサービス。
人材発掘、採用目的のサイト。

リクルートor企業から問題(プログラム)が出されていてそれを解く。
回答者は出題者からフィードバックをもらえるらしい。
場合によっては「うちに来ないか」等の誘いもあるらしい。

2012年からスタートして2013年末で累計3万突破。
問題は常時50問程度が上がっている様子。

出題側で全員分をフィードバックしている工数が取れているのかは疑問。
実際に解きたい問題を上げて皆にタダで解かせると言うのもあり??

Dependency Injection

Inversion of Control (IoC) の一つ。
オブジェクトの分離性を高めて再利用するためのパターン。
関連するオブジェクトの設定を自オブジェクトでは行わずに外から与えてもらう。
Constructor や Setter を使う。

夏休み始まる

先週の金曜日で幼稚園と小学校が終わって夏休みが始まった。
仕事はあるので大人の方はかえって大変になるだけだが。。。

いちごの通信簿と一学期に書いた作文が返ってきた。
学校では積極的に発言、行動している様子。元気にやっているようで良かった。
ピアノを習っているせいか音楽の成績が良かった。
運動会の駆けっこの作文はその場の臨場感が出ていて中々良く書けていた。

サンはもうすぐ誕生日だが、幼稚園の誕生日では
「サッカー選手になりたいですママ」
と言うつもりらしい。普段から「ママ」とは呼んでいないのだが。
サッカーも特にやらせてはいないが幼稚園で友達とやっているとのこと。
何にせよ戦隊モノからは早くも卒業なのだろうか。。。
私は結構楽しみに見ているのでちょっと寂しい。

あんずは、プリキュアの映画のパンフレットを見ながら、「これかりたいなあ〜」と言っていた。
「買いたい」と言おうとしているらしい。
いつの間にか「買いたい」と言う言葉を覚えてしまったようだ。
兄弟がいるので言葉を覚えるのが早い気がする。

2014年7月20日日曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (9th Virtual office hours)

==== Abstraction ====
This is the final Virtual Office Hours on this MOOC.
Besides explanation of the last assignment, next Mobile Cloud MOOC is explained.

==== W8A7 ====
The lines like "mDownloadCall = null;" are not replaced, but just commented out.
print.StackTrace() is used.
synchronize is not used.
To use another thread is an alternative solution.
classname.this is used as contexts.

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (8th Virtual office hours)

==== Abstraction ====
W7A6 is not included. Another video is provided for W7A6.
W8A7 and another example of AIDL are explained.

==== W8A7 ====
strict mode.
AIDL auto generated files.
async/sync.
onServiceConnetcted() => set the refercene AIDL generated?
sendPath() => call back? ui thread method?
runService() => async is easy because non blocking? background thread?
sync:
downloadImage() => stub, short, consice
makeIntent() => I can make it done with a normal way?
async:
downloadImage() => stub, short, consice, callback, 16 threads in a pool.
makeIntent() => I can make it done with a normal way?

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Week 7)

==== Lecture ====
Section 2 Module 3 Part 6: Avoid Conditional Logic in Secure Pathways (5:51)
条件判定は間違いやすい。なるべく使わない様にする。分かり難いかもしれない。
APIのlevelの意味がuserに明らかとは限らない。
条件判定をやめて二つのmethodに分ける。testも簡単になる。
userが間違い難いようなAPIの名前を使う。レビューする時も分かりやすくなる。
更によくできる??

Section 2 Module 3 Part 7: Prevent Secure Pathways from Being Broken at Runtime (5:48)
セキュリティ関連を設定で変更できるようになっていると危ない。
handlerの参照がmutableな変数になっていてruntimeで書き換えられるなど。
べた書きにしてcompile-timeにhandlerを固定する。
modularityとの妥協も必要。

Section 2 Module 3 Part 8: Privilege Escalation Concepts (5:51)
Malwareからの他のAppのServiceにアクセスされて問題が起きる事が多い。
権限の無いAppから権限の持っているServiceを不当に使用されてしまう。
intent base service

Section 2 Module 3 Part 9: Privilege Escalation Scenarios (4:08)
Malware自体にはinternetアクセスのpermissionが無いので安全に見える。
他のAppのintent serciveを使ってinternetにアクセス出来てしまう場合がある。
他のAppと話すAppを作るときは注意が必要。
Androidのpermission modelをbreakしてしまう。

Section 2 Module 3 Part 10: Privilege Escalation Code Walkthrough (6:23)
他のActivityやAppと話すServiceは危ない。
何もチェックせずにintentを実行するのが危ない。privilege escalation問題。
?? privateのstorageに入れれば他のappからはアクセスできないのでは??

Section 2 Module 3 Part 11: Privilege Escalation Fixes (7:19)
callerのpermissionを確認する手段が用意されている。
manifestにcallerに必要なpermissionを記載できる。持っていなかったらexception。
callerに自分の持っているpermissionと同様のpermissionを要求すべき。

Section 2 Module 3 Part 12: User Interface Attacks (8:46)
Malwareはprocessが違うので直接state(memory)を書き換える事は出来ない。
MalwareはUserにtrickを使って不適切な操作をさせようとする。
fake message, fake UI。fishing似ている。
mobileは画面が小さいのでユーザは重要なインジケータを見落としやすい。
例えばurlも途中までしか見えないので、隠れたところまで見ると予想外のアドレスかもしれない。
さらにアドレスバーを非表示にしている場合は別なurlになっていても気が付かないかも。
ユーザのsecurity decisionに必要な情報は隠さないで表示すべき。
?? 画面が小さくても??

Section 2 Module 3 Part 13: Cross-platform User Interface Attacks (4:26)
PCとmobile端末両方にmalwareが入ってしまうと更に複雑な悪行が出来てしまう。
最初にPCが何らかの理由でmalwareに感染する。
ユーザがPCから銀行のWebにアクセスした際にmalwareがmobileにappのインストールを要求。
ユーザが騙されてmobileにappをインストール。
ユーザが送金をする際にmalwareが自分の口座に送金する様な動作をする。
本人認証のために銀行からmobileに確認messageが行くが、これがmoblie側のmalwareで改竄されてしまう。
PCとmobile端末両方を連携させることで本人認証も働くなってしまう。

==== Quiz ====
1回目:22/25
2回目:25/25

==== Assignment ====
[Week-7-Assignment-6]
It is no problem to use Android 4.3 emulator only. 4.0 is not required.
Whether the issues are fixed can be checked with the provided checker app.
There is 5 issues.
I should review the code to find the issues and answer the Quiz on the link.
Next, I fix the issues and check them by the checker app.
This assignment is different from the previous assignments.
The instructor is different and the topic of this is about not concurrency but security.
The only AndroidManifest.xml and LoginActivity.java are necessary to be fixed.
The pdf below is slides for this assignment.
https://d396qusza40orc.cloudfront.net/posa/2014-PDFs/android_security_code_v2.pdf

How to install the checker APP.
cd c:\Users\com\Develop\adt-bundle-windows-x86_64-20140321\sdk\platform-tools
adb install c:\Users\com\Documents\hiroshi\test\Coursera\posa-002\git\POSA-14\POSA-14\assignments\week-7-assignment-6\W7-A6-VulnCheck.apk

I can check the login and sound vulnerabilites on Andriod 4.3.
I can not check the vulnerability of location but it is not the requirement of this assignment.

How to check the result of the quiz
https://class.coursera.org/posa-002/quiz?quiz_type=homework

[Evaluation]
Everyone added the permission to the manifest and left intent-filter remained just like I did.
Everyone passed the vulnerability checker as always.

Self
The permission of Record Sound is added to fix AndroidManifest.xml
The parameter, MAX_SECURITY is changed to StorageUtilities.SECURITY_PRIVATE to fix LoginActivity.java.

S1
The value of MAX_SECURITY is changed to StorageUtilities.SECURITY_PRIVATE.

S2
The value of MAX_SECURITY is changed to StorageUtilities.SECURITY_PRIVATE.

S3
The way to fix is the same as mine.

S4
The value of MAX_SECURITY is changed to StorageUtilities.SECURITY_PRIVATE.

S5
The way to fix is the same as mine.

[Results]
I've got 6 points (100%).

==== Etc ====
今週のLectureは50分程度で少な目。
Quizも8問と少ない。
Securityの話のみ。

#cousera #posa-002 Secure Cordingの観点に開発者のミスを防ぐこと、ミスした場合に安全サイドに倒れる事があり、これはセキュリティ以外の開発にも応用できる。
抽象化や柔軟性によって安全性が低下する可能性がある。安全性の観点が必要。

[Eclipse]
It is better to use AVD 4.4.2 on Intel Atom because it can be use the hardware accelerator.

==== log ====
2014/06/22 00:10 準備
2014/06/23 00:10 Lecture
2014/06/24 00:50 Lecture
2014/06/24 00:20 Quiz
2014/07/05 02:30 Assignments
2014/07/06 02:00 Assignments
2014/07/12 01:30 Evaluation

2014年7月19日土曜日

TOEIC対策について

[Part7]
選択肢まで先に読むか、設問を先に読むか、文章を先に読むかどれが良い?
選択肢が文章の場合は文章の内容を理解してからの方が選択肢を速く読める。
沢山の設問を先に読んでも覚えられない?
設問だけを先に読む?
最初の設問だけを先に読んで、文章を読んでいる途中で分かったら次の設問?
原則、文章を先に読んで内容を理解してから設問を読んだ方が良い気がする。
だが、設問に関係ない所に時間を掛けると損した気がする。
ダブルパッセージは先に文章を全部読んだ方が速い気がする。

[ゆっくり解くと正答率が上がる理由]
TOEICリーディングでは時間制限が厳しいので急いで解く必要がある。
当然ゆっくり解いた方が正答率は上がるが、知っている事は同じなのにどうして違いが出来るのか?

急いで解いたときは、それらしい選択肢が分かったらそれ以上考えずに次に行く。

ゆっくりの時は、それらしい選択肢が分かっても他の選択肢に可能性が無いか考える。
他の選択肢も正解になりえそうなら、どちらの選択肢がより正しそうか比較する。
選んだ選択肢の正当性や他の選択肢の不当性を補強するための手掛かりが他に無いかも吟味する。

考えても知らないから分からない問題に時間を掛けない様にして、分かったと思った問題の別の選択肢も軽く吟味できる時間が取れると理想的だが、今の実力では難しいかも。

そうすると下記の戦略が現状では良さそう?

自信がある問題 → そのまま次に行く
自信がない問題 → 他の選択肢も吟味する
分からない問題 → 全部の選択肢を吟味して絞り込んだら勘で決めて直ぐに次に行く

分からない問題を諦められないなら、最後で解くことにしてマークしない手もある?
時間効率は低下するが、分からない所そもそも正答率が低いのと、少しリフレッシュした方が何か思いつくかも

[スピーキング]
「究極の模試TEST2」のPart2で音声に合わせて頭の中でシャドーイングする聞き取り易くなった気がする。
音声に集中できるから?

そこで、900点特急のシャドーイングをやろうとしたら全然出来なかった。。。
音読、リピーティング、シャドーイング等のスピーキングをやればこれまでは違った能力が鍛えられそうな気がするが、腰が重い。。。

同様に英作文などのライティング系も良いと思うが、これも腰が重い。。。Lang-8もあるのだが最近は全然投稿出来ていない。

2014年7月18日金曜日

Functional Programming Principles in Scala (Statement of Accomplisment)

CourseraのFunctional Programming Principles in Scalaの評価が完了してStatement of Accomplisment with distinctionを手に入れた。
評価は100%(満点)だった!
80%以上でStatement of Accomplismentを受け取れるとあるが、scoreとdistinctionの関係がイマイチ分からない。

何にせよ最初のMOOCが無事に満点で終われてよかった。

2014年7月11日金曜日

アルク新TOEICテスト直前模試3回分第3回

アルク新TOEICテスト直前模試3回分第3回

最初に普通に時間内で解いて、その後時間を書けて見直しを行った。
本番より大分難しい気がした。
特にリスニングで聞こえているのに回答がわからなかったり、何回聞いても何を言っているのかわからないものがあった。

時間内 見直し後
P1 6 8
P2 26 27
P3 22 30
P4 23 26
計 77 91

P5 38 38 (17分)
P6 9 10 ( 7分)
P7 40 47 (49分)
計 87 95 (73分)

リスニングのP3は音声が流れている最中は選択肢を見ない作戦が失敗。
今まで通り音声を聞きながら選択肢もみて音声の終わりと同時にマークが良さそう。

P3,P4は選択肢が長い所をP1,2のdirection中に先読みするのでも良いかも。
でも、どれを読めばよいか迷うと良くないので、10セット中9,7,5を先読みが良さそう。

リーディングで
BとDを間違える、
逆順に解いた際の記入場所を間違える、
回答を修正した際の場所を間違える、
等のマークミスが計4問あった。

間違えやすいポイントを頭の片隅に入れながら素早く解く訓練をするしかない?

2014年7月9日水曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Week 6)

==== Lecture ====
Section 2 Module 1 Part 4: Android IntentService (9:02)
通常のサービス
Service.onCreate(), Service.onStartCommand(), Service.handleMessage()
を実装する必要がある。
IntentServieは使うのが簡単。
onHandleIntent() hook methodをoverrideすれば良い。
Activator pattern
一度に一つのintentを一つのthreadで扱う事しか出来ない。
扱うintentが無くなったら自動的にstop()する。
Command Processor pattern

Section 2 Module 1 Part 5: Activity and Service Communication (13:26)
ActivetyとServiceを同じプロセスにするかはmanifest.xmlのservice定義。
defaultは同じ、だが分けた方が良い時もある。
複数のAppからshareされる時。
Appに影響を与えたくない時。
ServiceのGCでAppの性能を落としたくない時。
binder frameworkでIPCが実装されている。one-way or two-way, RPC(stub) or message
BoundService
BindService()で起動。messageをsendしてhanderで処理。HaMeR
Method call(RPC)も使える。AIDL compilerがstubを生成する。
sync, asyn, one-way, two-way色々出来る。
Replyにもmessageは使える。serviceのreferenceをmessageに入れる。
他にはMethod callbacksも使える。Activetyからcallback objectを予め送っておく。
two-wayであれば特別replyを気にする必要はないが、syncだとdead lock等の問題ある。
Activator pattern: 無駄ならリソースを使わないで複数のclientを扱える。
Activator MangerがServiceを新たに起動する必要があるかを判断して起動する。
Command pattern: 機能の断片をobject化して他のprocess,threadや後で実行する。
Intent Serviceでは処理を非同期で後で別のプロセスで実行するのに使っている。
Active Object pattern: 機能をobject化して他のprocess,threadで実行。HaMeR
Broker pattern: RPCを隠ぺいする。Bound Service。Proxy。

Section 2 Module 1 Part 6: Service to Activity Communication via Android Messenger (9:55)
Messenger: HaMeRをprocess間に拡張した様なもの。
Download Application
単純な場合はMessengerで充分。複雑な場合はAIDLのMethod call(RPC)を使う。
Activetyでは、Messageにはreplyのためのhandlerのreferenceを入れる。
これをIntentに入れてServiceに送る。startService()。Active Object pattern
Serviceでは、処理後にIntentからMessageを取り出す。
Messageの中のRelpy handlerを使って結果をActivetyに送り返す。Proxy

Section 2 Module 2 Part 7: Avoid Storing Sensitive Data in Public Locations (8:43)
SD Cardは全部のappから参照出来る。privateではなくてpublicになっている。
passwordはdiskに保存してはいけない。する場合はencrypt/hash/privateにすべき。
external storageにはsensitive dataは置くべきではない。
photoデータなどをstealされても構わないなら置いても良いかもしれない。

Section 2 Module 2 Part 8: Risks of Insecure File Permissions (5:46)
private領域のデータのでもpermissionは設定できる。
permissionを変えると他のAppでもアクセス出来るように出来る。
deviceのuserからはprivate設定でもApp内のデータアクセスできる可能性がある。
開発者自身のprivateデータをdiskに保存すべきではない。
?? Appのバイナリ内に埋め込まれている事自体も危険??

Section 2 Module 3 Part 0: The Challenge of Secure Coding (2:49)
どうやったら安全なコードが書けるか。
通常のApp開発者は上位レイヤーには詳しいが下位レイヤーは分からない。
開発者が間違わない様な抽象化(フレームワーク)を作ることが重要。

Section 2 Module 3 Part 1: Security Vulnerability Walkthrough (7:31)
privateとpublicを同じinterfaceで扱うような作りは間違いやすい。
privateとpublicを抽象化でまとめてパラメータで切り替えるような作りは危険。
プログラムとしては悪くないが、もっと開発者が間違い難い方法を考えるべき。
?? defaultを安全な方に振れば良い??

Section 2 Module 3 Part 2: Principles of Secure Abstractions (2:55)
開発者に分かりやすくする。
コンパイル時にセキュリティ的な問題を摘出する。
dataとsecurity sateの分離と保護。

Section 2 Module 3 Part 3: Avoid Coupling Data & Security State (5:01)
dataとsecurityを組にしたデータ構造はNG。
そのデータ構造でどの様な値でもsecurtiyを確保していることをテスト出来ない。
security sateの元ネタをユーザの入力に依存しているとそこを攻撃されやすい。
データ構造としてsecurity sateとdataを分離する。
更に改善の余地がある。
?? 今後のLectureで説明??

Section 2 Module 3 Part 4: Build Abstractions that are Hard to Use Insecurely (9:49)
開発者の労力が少ないとsecureに、insecureにするためには沢山の労力が掛かるようにする。
boolean isSecureだとdefalutはfalseなのでinsecure -> isPublicにする。
insecureならpublic、それ以外はprivateと言うようにdefaultをsecureにする。
privateなデータを保存していると明らかに分かるようにする。
enumで分かりやすい名前(SecurityLevel等)を使う。

Section 2 Module 3 Part 5: Bound & Strongly Type Security State (11:55)
enumの代わりにstatic final intのflagを使ったら何故問題あるのか?
intは範囲に制限がないので全ての値をtestする事が出来ないから。
定義値を後で増やした場合も増やした場合も分かり難い。
定義されていない値も使えてしまう。コンパイルエラーにならない。
値に意図しない演算が使えてしまう。コンパイルエラーにならない。
security stateとdata stateを型で分離できない。
security stateにそれ以外の間違った数値を設定してもcompilerエラーにならない。
開発者、テスト、コンパイラの視点からsecurity stateを制限、分離出来る様にする。
更に良くできる??

==== Quiz ====
1回目49/52
2回目満点!!

==== Assignment ====
[Week-6-Assignment-5]
imageをURLからdownloadするプログラム。だんだんアプリらしくなってきた。

単純にIntentServiceを使うパターンと同時に複数imageのdownload可能なThreadPoolExecutorを使うパターンの2通りを実装する。

TODOは3ファイル8カ所。

さらに提出不要でイメージをonlineで実際にネットから取るかofflineでローカルから取るかの設定もTODOになっている。(default offline)

This assignment is more difficult than previous assignments because the implementation is not clear as far as the lecture videos say.

Section 1: Module 3: Part 5: Sending and Handling Messages with Android Handler
Section 2: Module 1: Part 2: Programming Started Services (Part 1)
Section 2: Module 1: Part 3: Programming Started Services (Part 2)

Section 2: Module 1: Part 4: Android IntentService
Section 2: Module 1: Part 6: Service to Activity Communication via Android Mes

Section 2: Module 1: Part 3: Programming Started Services (Part 2)

Section 1: Module 3: Part 7: The AsyncTask Framework (Part 2)
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html


null check of getString(),getData(),msg => may not

check msg.arg1 => must not.
https://class.coursera.org/posa-002/forum/thread?thread_id=1918

synchronized (this) {} on handleMessage() => probably not


try/finally, final, this, private, volatile, Lock, 初期化, fair, non-fair
static, join, interrupt, @Override, null check
constructorはlock不要。(W2-A1と同様)
volatileを使えばcacheの一貫性は保てる? => yes.
Uninterruptiblyでもtry/finallyするべき? => yes?
countのreturnでもlock必要? => no. volatileなら不要。
ローカル変数も初期化すべき? finalをつけるべき? => yes? 講師はfinal派?
thisはつけるべき? => 付けていない人の方が多い感じなのでつけないで命名規則で。
インスタンス変数にはmXxxxの名前にすべき? => yes.
importのunusedがある場合は親クラスとして使うかもしれない。
weekreferenceはgetで本体を取り出せる。
weekreferenceのnull check

ソースのコメントにも詳しい説明が書いてある。
とにかくLectureに大体は例がある。
さらにForumをみれば大体疑問点は出尽くしている。
VOHでは提出済のモノは詳しい説明あり。提出前のモノは簡単な説明ある。

Your work was submitted. Review your work to make sure everything looks OK.
のリンクから提出状況を確認できる。submit直後のみ。

[Evaluation]
S1
"import android.R.string;" is unused.
getApplicationContext() is used as context.
The return value of intent.getExtras().get() is casted with (Messenger).

S2
getApplicationContext() is used as context.
The return value of intent.getExtras().get() is casted with (Messenger).

S3
getBaseContext() is used as context.
The return value of intent.getExtras().get() is casted with (Messenger).

S4
The return value of intent.getExtras().get() is casted with (Messenger).

S5
getApplicationContext() is used as context.
The return value of intent.getExtras().get() is casted with (Messenger).

Self
"intent. getParcelableExtra()" is used.
I think it is better to use "intent.getParcelableExtra()" instead of "intent.getExtras().get()" because it is necessary to use cast.
getParcelableExtra() is added in API level 1, so I can use it to this course, which require API level 17.

[Results]
Perfect!

==== Etc ====
今週もLectureが11個80分ととても多い。大変そう。。。
Quizは13個。これも多い。

securityの視点からより良いコーディングを行うと言うのは面白そう。
どうやったら人が間違い難いコードを作れるかと言う事で、security以外でも通じる。

[Eclipse]
The Javadoc can be used when the code is seen.
The place where the word is used can be searched with "Reference".

==== log ====
2014/06/17 00:50 Lecture
2014/06/18 00:50 Lecture
2014/06/22 00:30 Quiz
2014/06/27 00:30 Assignments
2014/06/28 01:30 Assignments
2014/06/29 03:00 Assignments
2014/07/04 01:40 Evaluation
2014/07/09 00:10 Result

2014年7月7日月曜日

脱出! 暗闇プロジェクト第5回を読んで

日経コンピュータの「脱出! 暗闇プロジェクト」の第5回を読んだ。

[二者択一を迫られたらとりあえず「逃げる」]
選択肢以外にも良い解がある可能性があるので、即答せずに持ち帰って検討する。
二者択一の場合はどちらも困難な場合や、どちらかが非現実的で誘導の場合もある。
相手の選択肢の中ではない所に落とし所がある場合も多い。

[会議での厳しい発言は「割り引いて」聞く]
特に公の会議の場合は、建前で発言する傾向があるので割り引く必要がある。
皆各部門の代表として自部門の利益を主張している可能性が高い。
実際の落とし所は「根回し」で合意する方が現実的な場合も多い。

[「境界線」は雰囲気で引く]
ソフト開発でもバグ率や生産性等の管理指標を使う事が多い。
ただし、管理指標の精度は普通はそんなに高くない。
誤差が倍半分の範囲なら結構良い方だと思う。
そう言う状況で、「これは何時もよりも1.2倍のバグ率だが問題ないか?」とかを議論してもあまり意味がない。
大切なのは何故その数値になったのかを考える事を通して、これまでの作業を振り返る事。
振り返る機会を増やせると言うのが管理指標を使う事の一つの意義だと感じる。
これによって間違いや不備に早く気が付いて対処できる可能性を増やせる。

2014年7月5日土曜日

テキストボックスの入力補完をする

テキストボックス(input type="text")にメールアドレス等を毎回入力するのは面倒なので入力補完をする方法を調べた。

[ブラウザの補完機能を使う]
フォームの自動入力 - Chrome ヘルプ
これが一番簡単な気がする。
ただ、Chromeでは補完されたりされなかったり、イマイチ挙動が把握出来ていない。

[ブラウザの拡張機能を使う]
多分いろんなextensionが出ていると思うけど、今回は未調査。

[HTML5のlistとdatalistを使う]
<input autocomplete>-HTML5タグリファレンス
HTML datalist Tag
古いブラウザでは使えない。Chrome20, IE10, FireFox4, Opera9, Safariは未サポート?

activeのINPUT text要素に補完リストを追加するbookmarklet
datalistのidが元ソースと競合しないように注意する必要がある。
javascript: (function (id, list) {
    var activeElement = document.activeElement;
    if (activeElement.tagName != "INPUT" || activeElement.type != "text")
        return;

    var datalist = document.getElementById(id);

    if (!datalist) {
        datalist = document.createElement("DATALIST");
        datalist.id = id;
        for (i = 0; i < list.length; i++) {
            var option = document.createElement("OPTION");
            option.value = list[i];
            datalist.appendChild(option);
        }
        activeElement.appendChild(datalist);
    }

    if (datalist.tagName != "DATALIST")
        return;

    activeElement.setAttribute("list", id);
})("myDatalist032984032", ["hoge", "fuga"]);
[jQueryを使う]
javascript jQuery 入力補完の実装
jQuery UI - オートコンプリート - jQuery 入門

jQueryとjQueryUIを読み込んでactiveElementに.autocompleteで補完リストを追加するbookmarklet。
jQueryとは別にjQueryUIの読み込みが必要な事に気が付かないで苦労した。
元々jQueryが読み込まれているページの場合は再読み込みはせずにそれを使う。
想定しているバージョンと異なる可能性あるので注意が必要。
javascript; (function (bml) {
    var d = document;
    var doBml = function () {
        bml(jQuery);
    };
    var loadScript = function (url, f) {
        console.log(url);
        var s = d.createElement("script");
        s.src = url;
        s.onload = f;
        d.body.appendChild(s);
    };
    var loadjQueryUi = function () {
        loadScript("//code.jquery.com/ui/1.10.4/jquery-ui.js", doBml);
    };
    
    if (typeof jQuery == "undefined") {
        loadScript("//code.jquery.com/jquery-2.0.3.js", loadjQueryUi);
    } else if (typeof jQuery.ui == "undefined") {
        loadjQueryUi();
    } else {
        doBml();
    }
})(function ($) {
    console.log($().jquery, $.ui.version, document.activeElement);
    $(document.activeElement).autocomplete({source: ["hoge","fuga"]});
});
[Javascripのライブラリを使う]
suggest.js - 入力補完ライブラリ

[おまけ]
focousがある要素はJavaScriptでは"document.activeElement"で取れる。
javascript - How do I find out which DOM element has the focus? - Stack Overflow

Chromeのbookmark barはCtrl+Shift+Bで表示をトグル出来る。

2014年7月4日金曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (7th Virtual office hours)

==== W6A5 ====
Null check is not done for the result of msg.getData(), etc.
One liner coding.
"this" is used as context.
One liner coding.
makeIntent: One liner coding.
Messenger is casted with (Messenger). It it necessary?
ThreadPool...this is used as context in runnable.
getParcelExtra() is better because it is shorter.

==== W7A6 ====
Quiz is hard because finding issues is difficult.
Fixing is easy.
9 questions. 5 key issues.
add permission Record audio or exported=false??
require same permission??
filter for timezone??
add permission malware does not have, e.g. READ_LOG...??
The bunch of ways to fix the problem on this assignment.
export=false, requiring same permissions for callers.
Decompiling apk is easy.
Reduce unnecessary permissions.

==== cloud service ====
It is originally 6weeks course but 10weeks long because of summer vacation.
The Spring Boot is used as a framework.
It can be possible to use Amazon S3.

今朝見た夢2014/07/03

久々に沢山寝たせいか夢を見た。

切り立った厳しい小さな山がある。
岩が中心だが緑もまばらに見えている。
山の外周に沿ってらせん状に頂上に向かう道がある。
そこを一台の車で登っている。車はセダンかSUVかそんな種類のもの。
カーブの度にタイヤが崖からはみ出そうになる。
無駄だと分かってはいても、自然と体が崖と反対に傾いてしまう。
山の中腹に家がある。
凹凸の激しい斜面に建っているので、複数のポールで床を支えている。フロアは三つくらいある。
各フロアは細長い形をしていて、小さな船の甲板の様な感じがある。
床の材質は竹のような丸細長い物をつなぎ合わせて作られている。
そこに住んでいるのは従妹の様だった。こども向けの絵本なども置いてある気がする。

その後、家は山小屋の様な不特定の人を宿泊させる施設になっていた。
ロビー兼食堂の様な場所に数人の登山客の様な人影が見える。

そして家の横の崖から下を覗き込むと、そこには惑星の様な丸いものが見えた。
TVゲームの中の惑星の様な感じ。
そこに原始人の様なずんぐりむっくりした人の様なものが経っている。巨人だ。
巨人が惑星を走り回るとその部分がダメージを受ける。ゲームみたいだ。
雪原、平原。。。走る場所によってダメージの受け方が違うみたい。
そして、巨人の死骸。。。大きな槍のようなものが何本も突き刺さっている。
何時倒されたのか分からないが、死骸は朽ちかけている。
夕日が眩しい。大きく見開かれた巨人の瞳はうつろで何処も見ていない。

2014年7月2日水曜日

例外的な難問を勉強する事による弊害

最近「新TOEIC TEST 900点特急 パート5&6」と言う難問ばかりの問題集をやっていて思った事。

例外的な難問を勉強する事による弊害ってないだろうか?

普通の場合に関する知識がしっかりしていないのに、例外の場合を勉強すると混乱して普通の場合についても答えに迷ってしまう事がある気がする。
実際は普通の場合に関する問題の方が多いので、そちらを混乱して落としてしまうと、例外を知っていることによるメリットより影響が大きいのでは?

朝は英語が聞き取りやすい?

会社に行くときに英語を聞くのと帰るときに聞くのでは聞こえ方が全然違う。
朝は脳が元気だから聞こえやすい?

最近朝活をしている人の話をよく聞くが、朝勉の方が効率が良いのかもしれない。

TOEICの公開テストは休みの日の午後1時からなので、平日の夕方のIPテストよりも脳は元気かも。
次回のIPは月曜日なので、まだ疲れは溜まっていないかもしれないので良いかも。前回も月曜だった様な気がする。

夕方からのTOEICのIPテスト本番に備えるために、英語の勉強をすべきか脳を休めるべきか?
warming upとして疲れない程度にTOEICの勉強が出来ると良いのだが。。。

2014年7月1日火曜日

ChromeのDate()についてのメモ

Date()の値をそのままsetRequestHeaderに使おうとすると、

Uncaught SyntaxError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'Mon Jun 30 2014 19:36:42 GMT+0900 (東京 (標準時))' is not a valid HTTP header field value.

のエラーになってしまう。(東京 (標準時))が引っかかっているとのこと。

他のブラウザでは(東京 (標準時))がつかないので問題ないらしい。

setRequestHeaderに渡す前に(東京 (標準時))を削除すれば問題はない。

既存のサイトのjsをbookmarkletやextensionで書き換えて対応する事は可能??

読み込み時にajaxで使われているときはbookmarkletでは多分対応出来ない。

javascriptが実行される前にextensionを実行出来れば何とかなる?
Manifestのrun_atをdocument_startにすれば可能??

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Week 5)

==== Lecture ====
Section 2: Introduction to Android Services and Security (1:56)
Activity(UI)とは別にbackgroundでサービスを実行するprocessがある。
これとUIはIPCで通信する。
セキュリティモデルとセキュリティを確保する方法についても学ぶ。

Section 2 Module: Introduction to Android Services and IPC (1:55)
binder OORPCで Activity と Service の間のmessage passing を行う。
HaMeRをプロセス間通信に拡張。Android Interface Definition Language も説明。

Section 2 Module 1 Part 1: Overview of Android Services (9:52)
[StartedService]
clientから発行されたら実行して勝手に終わる。
結果がclientに返されない場合もある。
onStartCommand()

[BoundedService]
clientからbindされたらunbindされるまで実行される。
IPCでclientと通信する。
onBind()
onUnbind()

[共通]
clientと同じプロセス、違うプロセスどちらにするかはManifest.xmlで選択。
onCreate()
onDestory()

[pattern]
activator, command process, active object, proxy, broker, publish describer
[canonical framework techniques]
Service classを拡張してtemplete methodでlife cycleに必要なmethodを実装する。

Androidにも色々なServiceが元々実装されている。

Section 2 Module 1 Part 2: Programming Started Services (Part 1) (9:06)
[StartedService]
Download Applicationを例にする。
このMOOCでは一番複雑な例。色々な要素を使っているので色々学べる。

clientがstartService()を実行する。clientはblockされない。
ActivityManagerがサービスを起動する。
onCreate(),onStartCommand()がActivityManagerから実行される。
onStartCommand()の結果はclientには返されない。非同期実行。
Androidにprocessがkillされた場合にどう扱うべきかを伝える。
sticky: 同じintent(パラメータ)で実行されることはない
no_sticky: 明示的に再開されるまでstopped状態で待機する。
redeliver_intent: 再開されたときに同じintent(パラメータ)が使われる。
処理はHaMeRを使って実行される。
終了後はclientに結果を直接知らせずにonDestroy()する。
この時に他の部分から確実に使われていない状態でDestory()するのが重要。

Command processor patternになっている。
同時に複数のrequestを処理しない場合に適している。

Inversion of Control (IoC)(制御の反転)
Javaではそこそこ一般的な用語の様子。
ハリウッドの原則 (Hollywood Principle) とも呼ばれる。
何時どのように応答するかを呼ばれた側が制御する設計。
制御をmainではなくてsubのmoduleに任せるやり方。
全体を疎結合で構成する事が出来るが、各部分間の協調は難しくなる。

Section 2 Module 1 Part 3: Programming Started Services (Part 2) (8:58)
[StartedService]
Download ActivetyでurlからDownload ServiceのIntentをFactory methodで作成。
その後startServiceを起動。結果はDownloadHandlerで受け取る。

Download ServiceでmakeIntent()を実装。これをActivetyから呼び出す。
結果をActivetyに伝えるためのDownloadHandlerの登録も行う。
Looper, ServiceHandlerはvolatile宣言する。

onCreate()でThreadを起動。LooperとServiceHandlerを取得。

onStartCommand()でServiceHandlerに送るMessageを作成、送信。HaMeR。
not_stickyでプロセスkill時に自動再スタートしない旨を通知。

ServiceHandlerでMessageを処理。

stopSelf()で完了後に自動的にDestory()する。
次のMessageの処理中にonDestory()しない様に、完了したMessageのID(arg1)を渡す。
最後のrequestのIDとmatchした場合だけServiceをstopする。

DefaultではServiceはUIのThreadを使うが、処理が長いとANRエラーになってしまう。
なので、Serviceを別processで実行する。

I/O主体のServiceはHaMeRの様なframeworkを使う。
バグを防ぐためにCommand Processor patternを使ったIntentServiceのframeworkを使う。

Section 2 Module 2 Part 1: Traditional App Accounts
[Traditional App Accounts]
講師が変わった。
普通のDesktopなどのAppは起動したuser accountの権限で実行される。
全てのAppが同じ権限で実行される。
あるAppから他のAppが保存したデータや情報を見たり、書き換えたり出来てしまう。

Section 2 Module 2 Part 2: Mobile vs. Traditional App Accounts
[Movile App Accounts]
個々のAppがそれぞれ独立したuser accountを持っている。
App毎に権限が異なる。起動したuser accoutの権限よりさらに制限される。
??権限がuser accountより増えることはあるのか??
App毎にアクセス出来るデータ領域が異なる。

Section 2 Module 2 Part 3: App Account Mapping to Linux Users
[Mapping to Linux Users]
ManifestにAppの権限を記載。
ユーザにこれを提示して許可を求める。
App毎にLinuxの別々のuserになっている。
Linuxのgroupも設定されている。Appのgroupも設定されている。

Section 2 Module 2 Part 4: The Apps are People Analogy for Malware Attacks
[Malware]
Malwareについて通常の人間社会での悪人と被害者の比喩で説明。
Malware自体には権限などがなくてもMalwareを信用しているgood appに悪さをさせる。
lie, steal, manipulateの三つが主な不法操作。

Section 2 Module 2 Part 5: How Android Protects Apps
AndroidのAppはlinux上の別々のprocessで実行される。
memory空間は分離されているので他のAppから直接memoryを書き換えられ打事はない。
storageも分離されている。apkやdbやApp privateのstorage。

Section 2 Module 2 Part 6: What Android Doesn't Protect
process間で何らかのinteractionがある場合は注意が必要。
IPCを使う場合はその結果が自Appのメモリを書き換えることになるかもしれない。
sd cardを経由してデータをやり取りする場合は共有資源になる。
strorageでもpermissionを変更することで他のAppと共有して読み書き可能に出来る。
GUIを使って他のAppに入力されるべきデータをmalwareに入力させようとするかも。

==== Quiz ====
講義に合わせてQuizも11個ある。
今回はmpeg4形式でダウンロードしたものを見ていたので、Quizはぶっつけに近い。
Quizを見てからその内容だけは聞き逃さないように視聴した方が良いかも。
1回目41/47、2回目45/47、3回目47/47
??Quiz 7 だけは回答が説明と合わない気がするが。。。
Forumを見ても特に話題に上がっていないので単なる勘違いか??

==== Assignment ====
[Week-5-Assignment-4]
今週もping-pongプログラムだが、遂にAndroid上で動かす事に!

最新のSDKはtarget=android-19で手持ちもこれ。project.properties内で定義。
課題は少し古くてandroid-17を使うようになっている。
下記によると手元でandroid-19で作成してsubmit時に17に戻すのでも良いらしい。
https://class.coursera.org/posa-002/forum/thread?thread_id=1332#post-4670
とりあえずandroid-17をinstallしたら動かせた。

TODOはAndroidPlatformStrategy.javaファイルの4カ所を埋めるだけ。
ConsolePlatformStrategy.javaとprint()以外は同じで良さそう??
print()はrunnableをlooperに渡すとかでLectureを見直す必要あり。
更にLectureを見直してframeworkの動きを押えるべきだが。。。

S1M2P10にそのままの例があった。。。Lectureをちゃんと見直すべき。
また、5th VOHでも多少言及はあり。

runOnUiThread(new Runnable () {
public void run () {
mTextView.append(outputString);
}}};
UI Threadからコールしたら単にrun()が関数実行される。
UN Thread以外からコールしたらUI ThreadにrunnableがmessageとしてHander.postされるto。
javaにはclousureが無いのでinner classでは自動変数はfinal以外は使えない。
@Overrideを書くか? Lectureでは書いていない。
done()もrunnableをUIに送るように書かれている。

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
http://developer.android.com/reference/android/widget/TextView.html
setText(char[] text, int start, int len), setText(CharSequence text)
を使えば文字は出せる?

Toastを使えば簡単にポップアップの様なものを出せる。


try/finally, final, this, private, volatile, Lock, 初期化, fair, non-fair
static, join, interrupt, @Override
constructorはlock不要。(W2-A1と同様)
volatileを使えばcacheの一貫性は保てる? => yes.
Uninterruptiblyでもtry/finallyするべき? => yes?
countのreturnでもlock必要? => no. volatileなら不要。
ローカル変数も初期化すべき? finalをつけるべき? => yes? 講師はfinal派?
thisはつけるべき? => 付けていない人の方が多い感じなのでつけないで命名規則で。
インスタンス変数にはmXxxxの名前にすべき? => yes.
importのunusedがある場合は親クラスとして使うかもしれない。
weekreferenceはgetで本体を取り出せる。
とにかくLectureに大体は例がある。
さらにForumをみれば大体疑問点は出尽くしている。
VOHでは提出済のモノは詳しい説明あり。提出前のモノは簡単な説明ある。

Your work was submitted. Review your work to make sure everything looks OK.
のリンクから提出状況を確認できる。submit直後のみ。

[Evaluation]
S1
@Override is used
Latch is not sent to UI on done().
TODO is replaced to DONE

S2
@Override is used

S3
@Override is used
Latch is not sent to UI on done().
Text is sent to Looper instead of Activity on print().

S4
Latch is not sent to UI on done().

S5
Latch is not sent to UI on done().
Text is sent to Looper instead of Activity on print().
mLatch is recreated redundantly.

Self
It may be better to use @Override.
It may be better no to send Latch to UI on done().

The major difference is to send text to UI or Looper.
The instructor said UI is better.

[Results]
無事満点で完了。下記コメントあり。
peer 5 → Well done. IMO, no need to do the mLatch.countDown() in a Runnable...

==== Etc ====
今週はLectureが11個ととても多い。大変そう。。。
Quizも11個。Lecture毎に一つという事かな?

javaではvolatileへのアクセスもatomicになっている。
java.util.concurrent.atomicを使うべき?

[Eclipse]
Java Applicationを動かすためにはRun configのclass pathからAndroid 4.2.2を消す。
何故かAndroidのEmulatorのAPI leveを17にすると起動しなかった。
EmulatorのAPI levelを19にして、プログラムの方は17にしても動いた。

その後API level17でもARMのEmulatorは起動してJUnitも通せた。
上手く行った理由は不明。またx86では起動しない。

==== log ====
2014/06/08 00:20 準備
2014/06/12 00:44 Lecture
2014/06/13 00:50 Lecture
2014/06/16 00:50 Lecture & Quiz
2014/06/18 01:00 Assignment
2014/06/19 00:30 Assignment
2014/06/21 02:00 Assignment
2014/06/27 01:00 Evaluation
2014/07/01 00:10 Result