読者です 読者をやめる 読者になる 読者になる

チラシの裏の設計書

プログラム開発、データ分析からロボット作りまでものづくり全般を思うがままに書き連ねたブログ。

CourseraのMachine Learningコースをがんばる

Qiitaを眺めているとCourseraというところで開講されているMachineLearingの講義が素晴らしいという記事が注目されていたので、その講義について調べてみました。

www.coursera.org

これはいわゆるMOOCとも呼ばれる大規模公開オンライン講義形式で行われているものです。

なかでもこの講義はスタンフォード大学の先生が機械学習の基礎から教えてくれ、機械学習を学びたい人には最適と言われているようです。

これは受けねば!と思いざっとカリキュラムを眺めてみましたが、一昔前にこれだけの内容を勉強しようと思うと独力ではなかなか難しく、大学なりで教わる必要がありました。それが今や超有名大学の講義がインターネットで見られる時代です。いいなぁ。。。いやいや、いいなぁじゃなくてその恩恵を受けねば。

 

ということで1週目から受け始めました。

(とりあえずブログで宣言しておけばドロップアウト抑止力になるかなと思い投稿)

 

まだ始めたばかりですが、現在の感想。

(かなり個人的感想だ、という前置きをしつつ、、、)

様々なところで「機械学習入門者はぜひ!」という感じで言われていますが

あくまで「前提としてある程度の数学知識や機械学習自体への興味があって」機械学習の基礎理論から学びたい、という人向けという印象です。

「なんか最近"機械学習"ってよく聞くからどんなものか知りたい」という意味での入門者はたぶん1週目でそっとブラウザを閉じる結果になるのでご注意ください。

 

あと、英語力があるとだいぶうれしいです。動画は日本語字幕もありますが、途中途中の問題や説明文は日本語がない場合も多々あります。

私は英語力がないのでグーグル翻訳片手に奮闘してます。

 

レガシーな人間のCSS関連メモ "rem"と"vh"

久しぶりにWebページ作成をすると、いろいろと時代に置いていかれているところがあって刺激になります。

ほんと進歩の速い分野です。

フロント系の方々にとっては常識かもしれませんが、とりあえずメモ。

 

  • "rem"という単位が導入されてた

ルートのfont-sizeを基準とした単位らしい。

html{font-size:10px}

と定義しておくと

p{font-size:1.5rem}

は10×1.5pxに対応するようです。

"em"のroot要素参照版なので"root em"→"rem"だそうな。

レスポンシブ対応などで効果を発揮しそうな予感です。

 

  • "vh","vw"という単位も導入されてた

これまた単位ですが、viewportに対して大きさを指定できるようです。

pxのような絶対値指定でもなく、%のように親要素に対する割合でもなく、見えている領域に対する指定ができます。

画像の表示などで便利そうです。

参考:【CSS3】最新の単位[vw][vh][vmin][vmax]の解説。 - ONZE

 

  • CSS直書きはもう古かった

これはなんとなくそんな気はしていましたが、直接CSSを記述するよりも変数が使えたりするメタ言語で書いてからCSSに変換するのが今や一般的なんでしょうね。

bootstrap4が使いたくて中身を除くとLESSも同封されていました。

また勉強しておかなくちゃ。。。

 

参考:CSSのメタ言語Sass(SCSS)、LESSの完全入門 - Qiita

 

 

ポートフォリオサイト(という名の自分の備忘録がわりのアカウントリスト)を作ろうとWebページ作成を始めたのでこういった発見がまだまだありそうです。

R言語のifelseを条件演算子的に使うときは注意

偉そうにR言語の入門記事を投稿したその日にやってしまったミスを紹介。

qiita.com

 

R言語でifelse()という関数があります。

ifelse(条件,真の時,偽の時) のような書き方をすることで条件に沿った方が戻り値として得られるというもので、ほかの言語でいう条件演算子のような使い方をしていました。

条件演算子: 条件 ? 真の時 : 偽の時 というやつ

 こういう書き方をした時に思わぬ動きをしました。

model <- ifelse(条件, modelA, modelB)

 やりたかったこととしては条件によりどちらのモデルを採用するかを決めるというもの。

modelA/Bの中身はlist構造でいろいろなものが詰め込まれています。

この書き方で条件がTrueの時、得られたのはmodelAの一部分になってしまいました。

これはmodelAのlistの一つ目(いわばmodelA1)だけが返ってきていたためでした。

 

なんだこの仕様はと思ったものの、よく考えればR言語は基本的にベクトルを扱うわけで、ifelseもこういった入力を想定しているわけです。

NewVec <- ifelse(c(T,F,F,F,T), c(1,1,1,1,1), c(2,2,2,2,2))

NewVecはc(1,2,2,2,1)となる

そう考えると、条件部分に一つしか真偽値が入ってなければ、一つだけしか返さないよというのも変な仕様とは言えないなと。

 

ifelse( 1==1, list(a=3, b=5), list(c=6, d=9,e=10))

↑で帰ってくるのは"3"のみ。

 

注意。注意。

Shinyアプリを配布できるようにするよ

既出情報ではあるんですが、日本語情報があまりないので英語拒絶症の人(主に自分)のためにまとめておきます。

 

☆やりたいこと

R言語のWebアプリが作れるフレームワークShinyで作ったアプリをR言語環境がない人に配布したい。

 

☆やること

配布可能なR環境の「Rポータブル」と「ブラウザ」と「Shiny起動バッチ」をセットで渡してあげるとうまく動くよ、という内容。

R環境まるまる送ってるだけじゃん、という突っ込みはなしで。

難しい設定をせずにダブルクリックしたら使える、ということに価値があるのだ!(たぶん)

 

☆情報源

www.r-bloggers.com

Tutorial: Packaging your Shiny App as an Windows desktop app

いわば、これらの素晴らしい情報の日本語訳なだけです。

 

☆手順

・各種リソースの配置

以下のスクリプトやファイルを任意のフォルダに配置します。

あとで使うのでlibrary置き場もメモしておきます。

App/

 ├ Shiny/

 │  ├ ui.R

   └ server.R

 ├ FirefoxPortable/

   └ FirefoxPortable.exe

 ├ R-Portable

     ├ R-Portable.exe

     └ App/

       └ R-Portable/

         └ library/

 

・Shinyアプリの作成

通常の開発環境でShinyアプリを作ります。

このとき、server.R側に一部追加します。

```R: server.R

shinyServer(function(input, output, session) {

  session$onSessionEnded(function(){
    stopApp()
    q("no")
  })

})

```

太字の部分を追加してRを終了させるコードを追加しておきましょう。

 

・ライブラリのコピー

Shiny実行に必要な以下のライブラリを上記のRポータブル内のlibraryフォルダにコピーします。

- shiny

- sourcetools

- htmltools

- R6

- xtable

- httpuv

- Rcpp

- jsonlite

- digest

- mime

 

・Rポータブルのダウンロード

sourceforge.net

ダウンロードして解凍しておきます。

 

・ポータブルブラウザ準備

情報元の例ではGoogle Chrome Portableを使っています。

ほかのブラウザでもできることを検証するために今回はMozilla Firefox, Portable Editionを使ってみます。

 

・Shiny起動スクリプト

Shinyをブラウザとポートを指定して起動します。

スクリプト自体はRで書きます。

```R: runShinyApp.R

.libPaths("./R-Portable/App/R-Portable/library")
# the path to portable firefox
browser.path = file.path(getwd(),"FirefoxPortable/FirefoxPortable.exe")
options(browser = browser.path)
shiny::runApp("./Shiny/",port=8888,launch.browser=TRUE)

```

・起動スクリプト

最後にShiny起動スクリプトをRポータブルで実行させる起動スクリプトを準備しましょう。

```VBS: run.vbs

Randomize
CreateObject("Wscript.Shell").Run "R-Portable\App\R-Portable\bin\R.exe CMD BATCH --vanilla --slave runShinyApp.R" & " " & RND & " ", 0, False

```

こちらも情報元のものをそのまま使わせていただきました。

 

・起動テスト

run.vbsをダブルクリックで、ブラウザが起動してShiny画面が出てくれば成功です。

f:id:stkdev:20170212004312p:plain

いい感じに起動できました。

 

 

Gistでフラグ立てられた話

検索しても似た事例がすくなったので、情報として書き残しておきます。
 
Gistを利用していると
 
埋め込み画像 1
 
というように、「おまえのアカウントにフラグ立てたから!」とメッセージが出てきてしまいました。
もとに戻したかったらサポートに連絡してねとのこと。
 
投稿がスパムによるものと判定されてしまったため、フラグ対象になってしまったそうです。
 
結論から言うと、メッセージに出ている通りcontact supportにメールすると数分(10~20分ぐらい)で対応してもらえました。すばやい。
 
 
過去、英検準2級をボーダーラインぎりぎりで合格し、TOEIC模擬試験では200点台をたたき出したこともある私の問い合わせメールがこちら(参考にしないでください)
 
---
A message was displayed when using Gist.
"Your account has been flagged."
 
Would you please return the account status?
---
つ、伝わればいいのさ!
 
そして返信をいただきました
 
---
Hello,
 
Sorry about that!
 
Sometimes our spam-detecting robots get a little overzealous and need to be reprogrammed. I've reset your profile, so your repositories and gists should be available again, and you shouldn't see that message anymore.
---
 
ということで、教師データを一つ増やす貢献をしましたとさ。
 
 
 

ハトでもわかる単純パーセプトロン

またずいぶん久しぶりの日記になってしまいました。

あちこちに散らばってしまった情報発信源をちゃんとまとめて更新していこうと決めた2017年ですが、去年も同じ決意をしてた気がします。うん、来年から頑張ろう。

 

社内勉強会用に作った資料をSlideShareにアップしました。

 

 

 

単純パーセプトロンを実装して理解を深めよう、という内容です。

ソースコード類もちゃんと整理しようと(やっと)GitHubの活用も開始しました。

早速Gistで「怪しいアカウントと判断してフラグ立てたから!」と怒られ四苦八苦していますが、何とかなりそうです。

 

Gistからソース貼る実験↓

 

 

PHSのSMS認証問題まとめ

microsoftのアカウントやツイッターのアプリ登録などでSMSを使った認証が多々あります。

PHSだと認証ができない問題があったため、現状をまとめておきます。

 

問題:

SMSによる認証で、PHSの番号を入れてもエラーになり送信できない、

もしくは送信されたように見えて、SMSが届かない。

 

前知識:

PHS(現Ymobile)の電話番号は 070-55 or 070-56 で始まる。

PHSにはライトメールという独自の電話番号でのメッセージ送信があったが、近年では携帯とも互換性のあるSMSが利用可能になっている。

・携帯会社への電話番号割当で 070始まりの番号も始まる。

MNPによりPHSも携帯電話も番号の違いはなくなりつつある。

 

原因パターン:

・システム側で070始まりを拒否している

 ⇒過去PHSがSMSに対応していなかった経緯があるため080/090のみを受けいれているパターン

 ⇒この場合、たとえ携帯電話でも070のもはNG

・SMSの拒否設定

 ⇒着信拒否されていないか確認。指定番号からの許可設定をしないといけない場合も。

・海外からの送信を受け取れない

 ⇒Ymobileの場合、海外からのSMSをカットしているようです。(個人の設定では解除できない)

・国際番号+81がある場合は先頭の0をのける

 ⇒070-xxxx は 81-70-xxxx というようにします。

 

ひっかかりそうなところリストアップでした。

ちなみに自分の場合旧willcomからのPHSユーザだったので、海外番号から受信できずに詰みました。