niszetの日記

細かい情報を載せていくブログ

Windows updateしたら何度シャットダウンしても再起動してきた…

これが対策なのかわからないが…

コントロールパネルの電源の管理から、下記の表示が出るところまで行って、

f:id:niszet:20180714122714p:plain

「現在利用可能ではない設定を変更します」の文字をクリックして、「シャットダウン設定」の

[v] 高速スタートアップを有効にする(推奨)

を外してみたところちゃんと電源が落ちました。

これが原因かどうかは不明。推奨ってなってるからチェック入れた状態の方が良いのだと思うのだが…

試す場合は一応、自己責任で(たぶん起動が遅くなるだけですが)

(R) fsパッケージでpathまわりを使いこなしたい (1回目)

ファイルのパスの情報を扱うならfsパッケージを使うと便利。

さて、fsパッケージのお話です。前回から結構あいてしまいました。

niszet.hatenablog.com

fsパッケージでファイルのpathについて扱う関数はpath_***という名前になっています。
pathで始まる関数は下記のようです。

ls(envir = asNamespace("fs"), pattern = "^path_*")
#>  [1] "path"            "path_"           "path_abs"       
#>  [4] "path_common"     "path_dir"        "path_expand"    
#>  [7] "path_expand_r"   "path_ext"        "path_ext_remove"
#> [10] "path_ext_set"    "path_ext<-"      "path_file"      
#> [13] "path_filter"     "path_home"       "path_home_r"    
#> [16] "path_join"       "path_norm"       "path_package"   
#> [19] "path_real"       "path_rel"        "path_sanitize"  
#> [22] "path_split"      "path_temp"       "path_tidy"

ここから、exportされている関数について順に見ていきます。

ファイルパスについては原則としてそのファイルパスに実際にディレクトリやファイルが存在してもしなくてもエラーになりません。
また、区切り文字は"/"で、Windowsの"\"の形で与えても動作し、出力は全て"/"に変更されます(書式が環境に依存しない点がfsパッケージの良いところの1つです)
path()関数は任意の数の引数を...として受け取りますが、他は原則としてc()でまとめて与えてあげないといけません。
その代わり、まとめさえすればいくつ与えても同じ処理をしてくれますので、変数にまとめてから与えれば一度に処理されるためコードも見やすく実行速度も良いというコードの出来あがりですね。

path()

与えられた引数からファイルパスを構成して返してくれます。hereパッケージのhere()と同様の動きですね(fs::pathは拡張子も与えられるが)

## プロジェクトのroot(今回はC:/Users/niszet/Documents/r work/test4blog/)を起点としたファイルパスを返す)
here::here("hoge", "fuga")
#> [1] "C:/Users/niszet/Documents/r work/test4blog/hoge/fuga"

Helpにある実行例をコピペ。hereと違って、プロジェクトのrootを起点としたパスになりませんが、そのための関数は別途あります。この結果をhere()に与えても良いですね。

fs::path("foo", "bar", "baz", ext = "zip")
#> foo/bar/baz.zip

このようにすっきりと書けます。
わざわざstringrパッケージを使って書かなくても良いわけです。便利ですね。

stringr::str_c(c(stringr::str_c(c("foo", "bar", "baz"), collapse = "/"), 
    "zip"), collapse = ".")
#> [1] "foo/bar/baz.zip"

path_abs()

こちらは絶対パスで返してくれる関数。起点は引数startに与え、デフォルトは現在いるディレクト.になっています(下記では明示的に与えていますが。現在いるディレクトリはプロジェクトのルートにしています)

fs:::path_abs(path = "a", start = ".")
#> [1] C:/Users/niszet/Documents/r work/test4blog/a

あまり意味はないですが、プロジェクトルートを起点として明示すればこのようになります。(これはhere()に直接渡した方が良いが)

fs:::path_abs(path = "a", start = here::here())
#> [1] C:/Users/niszet/Documents/r work/test4blog/a

相対パス <-> 絶対パス変換は地味に使うので、こういうのがあると便利ですね。絶対パス->相対パスpath_rel()を参照してください。

path_common()

任意の数のpathを表す文字列を受け取り、その共通部分を返します。例えば下記の例であれば、"aaa/bbb"までが共通ですのでこの文字列が返ってきます。

path("aaa", "bbb" , "ccc")
#> aaa/bbb/ccc
path("aaa", "bbb" , "ddd")
#> aaa/bbb/ddd
path_common(c(path("aaa", "bbb" , "ccc"), path("aaa", "bbb" , "ddd")))
#> aaa/bbb

path_dir()

パスのディレクトリ部分を返す関数。実際には最後の"/"からうしろを削除する動きをしているようなので、そのパスがディレクトリを示している可能性がある場合はあらかじめis_dir()を使ってそのパスは弾いておきましょう

path_dir(c("aaa/bbb/ccc","aaa/bbb/ddd"))
aaa/bbb aaa/bbb 

path_expand(), path_expand_r()

~を展開してくれます。

path_expand("~")
#> C:/Users/niszet
path_expand_r("~")
#> C:/Users/niszet/Documents

path_expand()Windows上の挙動はpath.expand()とは異なるようです。path_expand_r()はその挙動を再現した動きをするようです。
詳細についてはHelpを参照してください。

path.expand("~")
#> [1] "C:/Users/niszet/Documents"

path_ext()

拡張子を取り出す関数。

path_ext("aaa/bbb.txt")
#> [1] "txt"

path_ext_remove()

拡張子だけを削除する関数。

path_ext_remove("aaa/bbb.txt")
aaa/bbb

これらの関数は、右から見てはじめて出てきた"."から右を拡張子、左を残りとしているので、

path_ext_remove("aaa.bbb/ccc/ddd")
#> aaa

path_ext("aaa.bbb/ccc/ddd")
#> [1] "bbb/ccc/ddd"

といった挙動になります。気をつけましょう。

path_ext_set()

拡張子を与えます。既にある場合は置き換えます。

path_ext_set("aaa/bbb", "txt")
#> aaa/bbb.txt
path_ext_set("aaa/bbb.zip", "txt")
#> aaa/bbb.txt

これも先の例と同様の拡張子の判断なので注意。

path_file()

ファイル部分を返す。

path_file("aaa/bbb.txt")
#> bbb.txt

これも最後の"/"から右を返す、という挙動なので拡張子がない場合は下記のようになる。

path_file("aaa/bbb")
#> bbb

path_filter()

ファイルパスに対して、正規表現を使って絞り込むことが出来る。regexpだけじゃなくglobでもよい。

## 英字1文字にマッチし、そのあとにその文字が1文字以上続く、というパタン(要するにaa, aaa, aaaa, ..., bb, bbb, ... のようなパタンがあればマッチ)
path_filter(c("aaa/bbb", "abc/def"), regexp = "(\\w)\\1+")
#> aaa/bbb

また、invert = TRUEにするとマッチしないものが返ってくる。

path_filter(c("aaa/bbb", "abc/def"), regexp = "(\\w)\\1+", invert = TRUE)
#> abc/def

これも地味に便利(正規表現を書き間違えてハマるまでが様式美)

量が多くなってきたので、ここで一旦切ります。
path_周りはようやく半分、です。折り返し。

fsパッケージ、ファイルの操作・処理を行うときなどには必須になります。是非使いこなしましょう!1 Enjoy!!


  1. 私がね…

(R) drakeでkeras mnistを動かしてみて動いたので記録。

チュートリアルをコピペ・整形したら出来るので本文は特に読まなくて良いですよ

RStudioのkerasパッケージのREADMEにある、mnistのサンプルを keras.rstudio.com

drakeパッケージを使って動かしてみた、というだけの記録。

github.com

drakeパッケージはCRAN版のバージョンが上がって、依存パッケージが変わってます。

上記drakeパッケージのGitHubリポジトリInstallationの章を参照して、Bioconductorからgraphパッケージをインストールしてください。指示に従えば特に困ることはないはず、です。

ちょっと前に書いた記事の内容が、CRAN版でも必要になった、ということですね。

niszet.hatenablog.com

drakeパッケージは日々活発に開発がされていますので、GitHub版を追いかけるのもよいかもしれません。 まぁ、もうちょっと安定するまで触らなくてもよいのでは…げふんげふん

コード

貼る意味あるんか…

plan <- drake_plan (
  mnist = dataset_mnist(),
  x_train_ = mnist$train$x,
  y_train_ = mnist$train$y,
  x_test_ = mnist$test$x,
  y_test_ = mnist$test$y,

# reshape & rescale
  x_train = array_reshape(x_train_, c(nrow(x_train_), 784))/255,
  x_test = array_reshape(x_test_, c(nrow(x_test_), 784))/255,

  y_train = to_categorical(y_train_, 10),
  y_test = to_categorical(y_test_, 10),

  model = keras_model_sequential() %>% 
    layer_dense(units = 256, activation = 'relu', input_shape = c(784)) %>% 
    layer_dropout(rate = 0.4) %>% 
    layer_dense(units = 128, activation = 'relu') %>%
    layer_dropout(rate = 0.3) %>%
    layer_dense(units = 10, activation = 'softmax') %>% 
    compile(
      loss = 'categorical_crossentropy',
      optimizer = optimizer_rmsprop(),
      metrics = c('accuracy')),
  history = model %>% 
    fit(x_train, y_train, 
        epochs = 30, batch_size = 128, 
        validation_split = 0.2
    )
)

でplanを作って、下記で可視化と実行、結果の確認。

config <- drake_config(plan)
vis_drake_graph(config)
make(plan)

loadd(history)
plot(history)

f:id:niszet:20180710215526p:plain

f:id:niszet:20180710215017p:plain

という感じでまぁ動いてよかったよかった…(?)

まぁ今更ですが、drake_plan()の中では<-ではなく=を使う。同じ変数を左辺に2度置けない。kerasのようにlayerをいじっていけるような場合(再代入不要な場合)はそのまま書いても大丈夫そう?です。

なお、書いたら動いた、って感じなので、細かいところは追えていません。
drakeパッケージもいつの間にかREADMEがすごい成長していて、そろそろ読み直さないと…

しかし、挙動が変…。

キャッシュ消してしまえばよいのですが、どうも挙動が変な気が…。
先のconfigを一度見てしまうと、plot()できなくなります(再度loadd()すればよいのだが…)
GitHub版では解決してるかもしれないし、こちらの環境かもしれないのですが。

いやまぁ、そもそもkerasの結果をdrakeで管理したいですかね?どうですかね…

ということで、やってみた系の記事でした。mnistは軽いので適当に実行して結果見るのに良いですね。

snakemakeも見てみようか…

RからPython実行すればよいかーと思っていましたが、その場合はsnakemakeパッケージをPythonで使えばよさそう?(と、drakeのREADMEに書いてある)

Snakemake — Snakemake 5.1.5+0.gb3233c8.dirty documentation

が、reticulateパッケージを介してRからPythonを動かせるので、これをやりたい。多分やればできるのでそのうちやる…。

と、いうことで・・・

Enjoy!!

(R) R3.5.1 の Windows環境のreadrで日本語ファイル名のファイルが読めないがいずれ解決するらしい

メモ

やはりユタ兄さんすごい(「これ直したんですけど…」とかいつか言ってみたい…)

ということで、CRAN版使っている方で、R3.5.xを使っていてWindows環境の方は要注意かなと。R3.4.xでは問題なかったのに…。

R3.5.0は結構悲鳴が聞こえていたので3.5.1まで待っていたのですが、まだ安定しないのだろうか…(R3.5.0で3.4.xよりも高速になったという話があったので期待しているんですけどねぇ…高速化の犠牲に色々バグが出てきてしまうと結局使うことをためらうことに…)

追記

ユタ兄さんから補足が。

どうやら、R側に問題があるのではなく、readr側に問題があるようで、今までうまく動いていたのは「たまたま」っぽい。なので、readrだけでもgithub版を使う(そしてRは3.5.1を使う)が良いかもしれませんね。

Enjoy!!

Analog Mixed Signal and Photonic Integrated Circuits (AMPIC) Lab at the University of Idaho の lecture noteが良さげだったのでメモ

アナログ回路の話だよ。

場所はここです。

AMPIC Lab

Teaching -> coursesのところからいける。PLLはRazaviベースなのでそうでもないが、Analog Design/Mixed Signalまわりは情報も新しそうだし良さげっすね。

Mixed Signalの良い日本語の資料ないですかねぇ…

analog cmos design lecture note pdf で検索する

Design of Analog and Mixed Integrated Circuits and Systems

スペインの大学の講義資料のようですが、このintroductionのスライドが半導体製造プロセス・製造ばらつき周りの資料として良かったので、メモ。

Design of Analog and Mixed Integrated Circuits and Systems (102726)

特に1のintroductionは毎年?更新されているようで、かなり最近のプロセス事情も反映している気がする。
自分も分かってない箇所が何か所かありますが、CMOSアナログ回路設計者は製造プロセス周りについて疎い人が多いので、こういった内容がまとまっているのは良い。というか、海外の大学ではちゃんと講義でやっている人が設計しているとなると、このあたりの知識がないというのは良くないのではー?と思っていますが。

1つ1つ説明する記事とか書いても良いかなと思ったんですが、まぁ需要もないしね…

ちなみに、タイトルのようにlecture note pdfで検索するとどこぞの大学の講義資料がヒットするので良いですね。
最近は動画とかも多いようだけど。

A3サイズのコピー用紙にアイディアを書きまくる

日記のリハビリ機関

6月はお仕事が全然進捗なくてしんどかったので日記を書いている余裕がなかった。最終週でようやくアーキが固まり、実装が進んでいるのでとりあえずしばらくは気持ちの余裕がある。しかし、体力がない。体力がないとやる気も出てこない。困った。これは寝るしかない。

この仕事、どうしても体力が削られていく。日中ずっと座り仕事、帰ったら帰ったで勉強なりなんなりで自分で積極的に体力の増強を行わないとどんどんと体力が失われてしまうのだ。なんとかしよう。

で、何かRに関する日記でも書こうと思ったものの、「いや、書けることがない…」という気持ちになったので、一旦日記を挟んで気持ちをリセットする。
別に簡単なことを記録として書いても良いのだし、今2018年なのに…みたいなことは気にしなくて良いのだ。ただしpython2使いはダメ。3使え。

古い人間なので、いまだにアイディアは紙と鉛筆のスタイルである。ここ最近はA3のコピー用紙を裏表使って思いついたことを書き殴るスタイルの方が結果として色々なことに縛られないので良い気がしてきた。iPad Proで出来そうな気もするんだけど、まだ試していない。購入したのに全然使ってませんね。

回路図、数式、その他色々なアイディアを書いて、それをまとめるためには広い作業領域が必要なので、Proの大きい方でもちょっと狭いのですよね。とはいえA3サイズになったら重かろうな…。

あと、業務で私物は使えないからダメな気がする。やはりA3のコピー用紙に書き出すのが一番良い気がしますね。安いし。

久々に設計すると勘所を全て忘れてしまうので、やはりまとめておきたい。しかし、人の目に触れさせることは出来ないだろうなぁ…。 もくもくと書いていこう。

ということで、雑記の日記でした。

久々に仕事に関係ない文字を長々と書くとちょっと気持ち良いですね。