13 Feb 2015, 15:08

RPubs に Emacs から投稿してみた (R Markdown, org-mode)

はじめに

RPubs は R Studio に依存する R markdown 共有サービスなのですが, R Studio を利用せずに, Emacs から 投稿できるか調べてみました.

rpubsUpload をつかう

結論としては, rpubsUpload という関数を利用すると, コードを評価することで RPubs に投稿できる.

# Upload をする
result <- rpubsUpload ("My document title", "Document.html")

# Upload 結果をブラウザで開く
if (!is.null (result$continueUrl))
   browseURL (result$continueUrl)
else
   stop (result$error)

ブラウザを開くと, ログイン画面が現れるのでログインして OK を押せばよい.

Emacs から投稿

R markdown を Emacs から投稿

Emacs で R Markdown を作成して, 投稿することができる.

以下の記事を参考にして Rmd を html に変換して, コードを評価する.

# Upload Test

see: [rpubsUpload - R Graphical Manual] (http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=markdown/man/rpubsUpload.Rd&d=R_CC)

# upload a document

this is my first upload from function

```{r sample, echo=TRUE, results='hide'}
require (markdown)
result <- rpubsUpload ("rpubsUpload usage", "RpubsUploadSample.html")
if (!is.null (result$continueUrl)) {
    browseURL (result$continueUrl)
}else {
    stop (result$error)
}
```

org-mode から投稿

markdown よりも org-mode のほうがなれているということもあり, org-mode からも投稿してみました.

M-x org-html-export-to-html で org-mode を html に変換して, コードを評価.

#   * Upload Test
#   this is my first upload from Emacs org-mode
#  
# ** convert to html
#    M-x org-html-export-to-html
#  
# ** run script
#  
# #+begin_src R :eval query
# require (markdown)
# result <- rpubsUpload ("Emacs org-mode upload", "UploadFromOrgMode.html")
# if (!is.null (result$continueUrl)) {
#     browseURL (result$continueUrl)
# }else {
#     stop (result$error)
# }
# #+end_src
#  

12 Feb 2015, 15:12

Emacs で knitr と R markdown を使う方法 (Rmd)

はじめに

coursera で, Reproducible Research の講座をとっています.

knitr の演習が出てきて, R Studio を使うように強いられます.

Emacs が捨てがたいので, knitr を Emacs で利用する方法について調べました.

knitr

knitr R と Markdown を利用して文芸的プログラミングをするためのツール.

CRAN から取得可能.

install.packages ('knitr', dependencies = TRUE)

polymode

polymode を利用すると, 複数のモードを共存させる. これを利用して R-mode (ESS) と markdown-mode を共存.

;; MARKDOWN
(require  'poly-markdown)
(add-to-list 'auto-mode-alist '("\\.md" . poly-markdown-mode))

;; R modes
(require  'poly-R)
(add-to-list 'auto-mode-alist '("\\.Snw" . poly-noweb+r-mode)
(add-to-list 'auto-mode-alist '("\\.Rnw" . poly-noweb+r-mode))
(add-to-list 'auto-mode-alist '("\\.Rmd" . poly-markdown+r-mode))

markdown への変換

ess-swv-knit で Rmd を md に変換できる.

HTLM への変換

html に変換するには, 以下の方法がある.

(defun rmarkdown-to-html ()
  (interactive)
  "Run knitr::knit2html on the current file"
  "https://gist.github.com/kohske/9128031"
  (shell-command
   (format "Rscript -e \"knitr::knit2html ('%s')\""
       (shell-quote-argument (buffer-file-name)))))

;; do this in R process
;; library (rmarkdown); render ("file_name.Rmd")

(defun ess-rmarkdown ()
  (interactive)
  "Compile R markdown (.Rmd). Should work for any output type."
  "http://roughtheory.com/posts/ess-rmarkdown.html"
  ; Check if attached R-session
  (condition-case nil
      (ess-get-process)
    (error 
     (ess-switch-process)))
  (let* ((rmd-buf (current-buffer)))
    (save-excursion
      (let* ((sprocess (ess-get-process ess-current-process-name))
         (sbuffer (process-buffer sprocess))
         (buf-coding (symbol-name buffer-file-coding-system))
         (R-cmd
          (format "library (rmarkdown); rmarkdown::render (\"%s\")"
              buffer-file-name)))
    (message "Running rmarkdown on %s" buffer-file-name)
    (ess-execute R-cmd 'buffer nil nil)
    (switch-to-buffer rmd-buf)
    (ess-show-buffer (buffer-name sbuffer) nil)))))

(define-key polymode-mode-map "\M-ns" 'ess-rmarkdown)

11 Feb 2015, 06:54

Java7 の Java.nio.file.Files で ファイルのコピーをしてみる

はじめに

会社では Java で SMB プロトコルをごにょごにょしているというお仕事なので, Java でファイル操作をするような I/F を調べました.

具体的には, フォルダをコピーしたい.

Java7 で Files というライブラリが新たらしく追加された. これが利用できそうなので, 試してみた.

reference

基本

java.nio.file を import.

import java.nio.file.*; 

FileSystems.getDefault ();で ファイルシステムオブジェクトを取得.

// filesystem の取得
FileSystem fileSystem = FileSystems.getDefault ();

ファイル or ディレクトリを表すオブジェクトは Path オブジェクトで示す. 以下のいずれかで取得.

  • fileSystem.getPath ()
  • Paths.get ()
Path fooFile = fileSystem.getPath ("foo.txt");
Path barFile = Paths.get ("bar.txt");

コピーしてみる

Files オブジェクトの copy メソッドを利用する.

public static Path copy (Path source, Path target, CopyOption... options) throws IOException
  • source … コピー元
  • target … コピー先
  • options
    • REPLACE_EXISTING … target が存在すれば上書き
    • COPY_ATTRIBUTES … Attribute もコピー.
    • NOFOLLOW_LINKS … シンポリックリンクはコピーしない.
Files.copy (fooFile, barFile);

reference

コピー

移動

属性の取得

以下でできる.

  • getFileAttributeView ()
  • getFileAttribute ()
  • readFileAttirbute ()

getFileAttributeView (), readFileAttirbute () だと, 指定した FileAttributeView オブジェクトが取得できる.

BasicFileAttributes attrs = Files.getFileAttributeView (barFile, BasicFileAttributeView.class);
BasicFileAttributes attrs = Files.readAttributes (barFile, BasicFileAttributes.class);

getFileAttribute で FileAttirbuteView の個々の属性を指定して情報を取得することができる.

Sample Code

import java.nio.file.*;
import java.nio.file.attribute.*;

public class FilesSample {
    public static void main (String args[]) {
        try {

            // file system
            FileSystem fileSystem = FileSystems.getDefault ();

            // ファイルを表す Path オブジェクトを生成
            Path fooFile = fileSystem.getPath ("foo.txt");
            System.out.println (fooFile);
            Path barFile = Paths.get ("bar.txt");
            System.out.println (barFile);

            // ファイルが存在する場合は削除します
            Files.deleteIfExists (barFile);

            // copy
            Files.copy (fooFile, barFile);

            // 存在チェック
            if (!Files.exists (barFile)) 
                System.out.println ("file not exist");

            // 容量チェック
            if (Files.size (barFile) != Files.size (barFile) ) 
                System.out.println ("file size is not equal");

            BasicFileAttributes attrs = Files.getFileAttributeView (barFile, BasicFileAttributeView.class);
            BasicFileAttributes attrs = Files.readAttributes (barFile, BasicFileAttributes.class);

        } catch (Exception ex) {
            System.out.println (ex);
        }
    }
}

つづき

11 Feb 2015, 02:46

Java で windows のコマンドを実行してフォルダコピー

はじめに

前回の続き.

Java を利用した copy だと, フォルダをコピーすると, 中身をコピーしない.

xcopy を利用.

中身をコピーする方法もあるようだけれども, めんどくさいので, xcopy を利用することにする.

xcopy で ファイルですか, ディレクトリですかと質問されるので, echo F を 先頭につけたいところだが, この方法だと, うまくいかない.

ファイルならば, copy を利用する. フォルダならば, xcopy /i で OK.

Java で windows のコマンドを実行する

processBuilder ライブラリを利用する.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class XCopyOperator {
    public static void main (String args[]) throws IOException, InterruptedException {
        String source = "foo";
        String target = "bar";

        // Process Builder 生成
        // xcopy /e /i source target ディレクトリを再帰的にコピー
        ProcessBuilder pb = new ProcessBuilder ("xcopy", "/e", "/i", source, target);

        // 標準出力と標準エラーをマージする (Defualt false)
        pb.redirectErrorStream (true);

        // プロセス開始
        Process process = pb.start ();

        // プロセス完了待ち合わせ
        process.waitFor ();

        // 結果の出力
        InputStream is = process.getInputStream ();
        printInputStream (is);
    }

    public static void printInputStream (InputStream is) throws IOException {
        BufferedReader br = new BufferedReader (new InputStreamReader (is));
        try {
            for (;;) {
                String line = br.readLine ();
                if (line == null) break;
                System.out.println (line);
            }
        } finally {
            br.close ();
        }
    }
}

11 Feb 2015, 02:20

関数型言語 (Scala) をどうオブジェクト指向の現場に持ち込むか? セミナーをきいた感想

はじめに

今日は, なんだか仕事のやる気も起きないアンニュイな気分だったので, 仕事をサボって社内で開かれたセミナーを聴きにいきました.

Scala による OO と FP のお話

スピーカーは, 浅海智晴さん.

話の内容は, “オブジェクト指向と関数型プログラミング (Scala)“について.

用語を復習しようと Google で検索していたら, 今日きいた話のスライド発見. 一生懸命メモをとったものの, ラッキー.

以下, 用語についての復習と感想を書く.

背景

ハードウェアのメニーコア, 大容量メモリ化によって, 性能のボトルネックが I/O ではなくて, アプリケーションとなってきた. アルゴリズムが勝負の世界. アプリがボトルネックになってきた. そのため, 言語レベルで平行・並列処理が書きやすい言語が求められるようになった.

Cloud Computing において, 異常が発生したら全体をとめるのではなくて, 一部を停止して運用を継続させる必要がある.従来の例外処理では処理する のが複雑になってきた.そのため, 言語レベルで分散コンピューティングや Fault Tolerant をサポートするような言語が求められるようになった.

所感

ストレージ業界にいることもあって, アプリが性能のボトルネックになるというはなしはよくきく.

以前, 次世代メモリと呼ばれている ストレージ・クラス・メモリ (SCM) の技術動向の話をきいたときにも同じはなしが出た. アプリがストレージの性能のボトルネックになるとわかったとき, 我々開発者はなにをすればいいのか? という質問がでたが, 答えは,

関数型言語をつかうこと

All SCM Array が数年後に実現したときにはじめて, プログラミングの パラダイムシフト が起こるかもしれない.

関数型言語とは

過去と現在の関数型言語の認識の違い.

昔は, 高階関数 をサポートする言語という緩い定義だった.

現代のモダンな言語の定義は違う!

現代のモダンな言語 (Haskell, Scala など) は,

数学的理論を背景にプログラムを記述する言語

数学をベースとするプログラミング

数学的理論とは, たとえば以下.

  • ラムダ計算
  • 数理論理学
  • 圏論

とりわけ, Monad が大事.Monad をつかって, どうつくるかという流れ.

所感

数学のベースについて, 以下の記事でまとめられているが,これがおもしろい. 数学がベースといってはいるものの, 数学のほんの一部分.抽象代数学がからんでいる.

自分は, 大学では一応応用数学を学んだ気がしたので, プログラミングと数学が結びつくという売り文句はとてもうれしいのだ.

ああ, 学生時代の苦しみは無益ではなかったのだと.

代数学は, 禅僧の修行のような単なる苦悩に耐え忍ぶ訓練だと思っていたので, まさか, 社会人になって再び群論にお目にかかるとは,学生のときには想像 出来ないことだった.

コンパイル = 証明

コンパイルを通すということは, 正しさを証明すること

関数型言語では, コンパイルが通るとバグがほとんどでない. 純粋関数の世界でプログラミングをすることによって, 実現できる. 背景には数理論理学がある.

このことがなぜ大事かというと, 並列プログラミングのバグとりは大変. テストですべてのバグをとれたという保証ができない.

関数型ならば数学をベースにして, バグがないことを証明することができる

関数型言語のメリット・デメリット

  • メリット
    • 高階関数を使った技が使える (それによってコードが短くなる)
    • 定理と証明
  • デメリット デメリットだけみると, 組み込み系ではほとんど出番なしな気がした. いつの時代も, C 言語最強?? いや, C で並列処理はつらい.

    質問時間に, 組み込み系では関数型言語は活用できますかと 質問してみたが, わかりませんという回答だったので, 調べてみた.

    有力候補は OCaml. 時間効率, 空間効率がいいらしい.

    マイナーな言語で ATS というものもあるが, 情報が少ない.

    分散システムを組むならば, Erlang もつかえるか? - 組み込みから生まれた言語 Erlang の時代が来る - 日経エレクトロニクス

    組み込み系といっても, リッチな環境の組み込み系ならばリソースなんて 関係ない?? Android は Java で動いているし, Scala だって.

Monadic Programming

モナドを中心にプログラムを組む方法.

モナドとは,

  • コンテナ
  • パイプライン
  • インタプリタ

モナドにはいろいろな種類がある.

  • IO モナド
  • State モナド
  • Future モナド …

モナドの使い方は難しいのだけれども, パターンがあるのでなれれば簡単.

所感

モナドはよくわからない.

しかし, 今日の話で距離が狭まった.

難解なもの, 副作用をもつものは, モナドに閉じ込めて隠蔽する. それによって, プログラムがスッキリする.

この言い回しは, OO におけるカプセル化 でもきいたような気がする.

難解なもの, 副作用をもつものは, オブジェクトに閉じ込めてカプセル化する. それによって, プログラムがスッキリする.

また, モナドには使い方があり, 覚えてしまえば簡単という話は, 以前まとめた関数型デザインパターンの話にもつながるのかもしれない.

Functinal Reactive Programming (FRP)

ある変化に応じて動作する, イベント駆動のプログラミング方法.

Reactive Programmig には, 2 つの種類があるように思う.

  • Actor Model
  • Monadic Model

所感

以下の記事がわかりやすい.

最近よくみかける用語だし, これから流行しそうな手法.

GUI, インフラ, ビッグデータ処理など様々な場面で浸透しつつあります. 今までは複雑すぎて作ることが難しかったアプリケーションが簡単に設計できるようになっていくでしょう.

リアクティブ宣言なんという, かっこいい文章も存在する.

Object-Functional Programming (OFP)

オブジェクト指向のパラダイムと関数型のパラダイムの両方を利用して プログラミングする.

上流工程では, 今までどおりオブジェクト指向設計で考えることになる. ユースケースで今までどおり要件定義をして, コンポーネント分割までする. そこから, オブジェクトかファンクションのどちらかつかって責務を実現する. なので, OOP と FP は共存関係にある.

OFP 新三種の神器.

  • トレイト
  • モナド
  • 型クラス

OFP を導入することメリットは, 以下.

  • 高階関数DSL を書くことで 開発効率 をあげる
  • Monadic Programming を行うことで並列処理の品質をあげる

どこに Functional Programming を適用するか?

Functinal Programming で書くと, バグが出にくいので, Functonal Programming の割合をできるだけ増やしていくのがベスト.

システム開発では, OO:FP の割合は 6:4 くらいか??

FP でつくるのに適した部分は, DSL の部分. OOP で, Framework と呼ばれている部分.

アプリ開発は Java でもいい. アプリ開発の基盤にある DSL 部分を 関数型でかく.

DSL

DSL とは,特定のタスク向けに設計されたコンピュータ言語. DSL は一種類のタスクをうまく実行することに集中したもの.

そして, FP (というよりも Scala) は, DSL を書くことに 適している (Scalable language). なぜなら, 簡単に独自の型や制御構造を定義できるので.

まとめ

去年から, 関数型言語をかじりはじめてきたが, 自分が理解してきた

  • Stateless
  • High-order function

という考え方は, いわゆる伝統的な FP の概念だということを知った. また, それにかわるモダンな考え方は Monad だということも知った. (OFP 新三種の神器)

モナドについては, ほとんどまだ理解できていないので, 今年はモナドに注目して学んでいくことにする.

個人的には, 関数型言語を並列処理どう適用するかという話をもう少し つっこんで知りたい. それも, Monadic Model を理解すると見えるかもしれ ない.まずは, Monad.

Next Action

今は (伝統的!) 関数型言語の聖典, SICP を読んでいるので, Monad はさておき, まずはこれを読み終えなければ.

4 月か 9 月に coursera の Scala の講義が開講されたらもう一度受けてみる. (なぜなら, 前回は落第して単位をもらえなかったから…)

Reactive Programming についても学んでみたい. 去年 coursera で講座が 開講されるのをまっていたのだが, 去年は開講されなかった. 今年も開講されなかったら, 11 月からアーカイブ講座をつかって学んで見ようと思う.

05 Feb 2015, 12:59

統計解析の基礎を学ぶ! edX の Foundations of Data Analysis をうけた

はじめに

統計の基礎を勉強するために, edX の Foundations of Data Analysis を受けました.

内容

タイトルどおり, 統計学の基礎を 11 週に渡って学ぶ講座. 大学初年度の学生が 1 年かけて学ぶ内容をざっと網羅している.

前半は, 記述統計学・後半は推定統計学, とくに仮説検定.

以下, 用語を思い出しながら主要なキーワードを列挙.

  • 記述統計学
    • 統計モデル
      • 線形モデル
      • 指数モデル
      • 対数モデル
    • 確率分布
      • 二項分布
      • 正規分布
    • 相関
  • 推定統計学

    • サンプリング
    • 区間推定・点推定
    • 仮説検定
      • Z 検定
      • T 検定
      • F 検定
      • カイ二乗検定
      • 分散分析

    言語は R を利用する. R を利用した統計解析の方法が一通り分かるところがよい.

    この講座のかわっているところは, Reading が多いこと. テキストが PDF で毎週ダウンロードできる. その内容を読んでから, R の使い方を学んで, 問題をとくスタイル.

    また, この講座のよかった点は, 課題が現実のデータを利用しているところ. 実験の分析などの, 現実とはかけ離れた内容ではなく, 親しみやすいデー タなので, 興味が沸きやすい.

    あくまで, 基礎的な内容なのでそこまで難しくはない. 1 難しい数式もでてこない. なので, 数学があまり得意でない文系のひとでもついていけると思う.

感想

大学の統計学の授業はつまらなかった

大学生のときに統計の授業を受けたのだが, それよりも圧倒的にわかりやすかった!! 無料でわかりやすい授業がうけら れると, 大学の授業はどうなってしまうのだろう?? That’s MOOC 革命.

大学のときの統計がつまらなかった理由は,

  • データを扱わなかった
  • 数式ばかりをあつかっていた
  • プログラミングで計算しなかった

こんなところで大学の授業の愚痴をいってもしょうがないのだが, 統計学なはずなのに, 実際にデータを分析するようなことは一切なかったし, グラフを書くようなことも一切なかった. 朝一に授業がはじまって, 難しい 数式をノートにひたすら写していた記憶しかない.2

この講座は, 大学生のときにつまらないと思っていた要因の反対のことをし ている. だから, おもしろい.

あくまで基礎

そんなわけで, 大学生以来, xx 年ぶりに統計を学び直した.

  • 覚えていたこと
  • 忘れていたこと
  • 習っていないこと

がそれぞれ出てきて, 毎週おもしろかった. 仮説検定はほとんど大学では学ばなかった 3 ので, 考え方が新鮮だった.

ただ, これは基礎だ. 以下のページに統計学の大まかな図があったのだが, 基礎の先には広大な統計学の応用領域が広がっている.

これから

この先は, 統計学のおもしろそうな領域にすこしずつ手をつけていこう.

統計学が, 今後の人生にどう関係してくるのかはわからない. 勉強の先に宝が埋まっているかもしれないし, 徒労に終わってまた忘れてしまうかもしれない.

でも, 統計学がここ数年で急激に注目されていることは紛れもない事実だ.

必ず役に立つ, いや, 必ず役に立たせると信じることにする.

Footnotes


  1. 英語が難しいのだが… [return]
  2. そして, 朝起きることができなくて次第におサボリ. [return]
  3. 学んだけれども忘れたのかも [return]

01 Feb 2015, 16:08

helm-google と eww で サクっと キーワード検索が便利

はじめに

helm-google と eww を組み合わせたらなかなか相性がよかった.

helm-google

helm-google は, google 検索結果を helm で絞り込めるもの.

(require 'helm-google)
(setq helm-google-tld "co.jp")

eww と組み合わせる

ブラウザはデフォルトでは browse-url を呼んでいるので, これを eww を呼ぶように変更してしまう.

;; eww で表示
(setq helm-source-google
    `((name . "Google")
      (init . (lambda () (require 'google)))
      (action ("Browse URL" . eww-browse-url))
      (display-to-real . helm-google-display-to-real)
      (candidates . helm-google-search)
      (requires-pattern)
      (nohighlight)
      (multiline)
      (volatile)))

helm-resume と組み合わせる

helm-resume と組み合わせると便利. 検索語句にキーワードを追加で足して検索したいときは, helm-resume!!

便利だと感じたのは, 一度キーワードで検索をかけたあとに, 追加でキーワードを指定したいと思ったとき.

helm-resume だと, 前回の検索結果からはじまるので, 追加でキーワードををいれることができる.

検索結果の表示を高くする

検索結果は, helm の buffer に現れる. 画面の 20%にしか表示されないので, すこし小さい. 大きくしてみる.

最近追加された autoresize 機能で, 動的に高さを調整.

(helm-autoresize-mode 1) ;; 検索結果によってリサイズ. default 40%
(setq helm-autoresize-max-height 50)

01 Feb 2015, 06:58

Coursera で R 入門! Data Scientist の講座 2 つ

はじめに

今年の目標はデータサイエンスを学ぶこと.

coursera でデータサイエンスのシリーズ講座があるので, うけてみることにしました.

今回は, その中の 2 つを同時にうけた.

  <div id="outline-container-unnumbered-2" class="outline-2">
    <h2 id="unnumbered-2">
      Coursera の データサイエンティストシリーズの紹介の講座
    </h2>

    <div class="outline-text-2" id="text-unnumbered-2">
      <p>
        データサイエンテス関連の講座が去年に公開された.
      </p>

      <ul class="org-ul">
        <li>
          <a href="https://www.coursera.org/specialization/jhudatascience/1">Data Science &#8211; Specialization | Coursera</a>
        </li>
      </ul>

      <p>
        去年はあまり余裕が無かったけれども, 今年はちょっと背伸びをして受けてみる.
      </p>

      <p>
        データサイエンスの分野が細かく 9 つに分けられて講座として用意されて いる.
      </p>

      <ol class="org-ol">
        <li>
          The Data Scientist&#8217;s Toolbox
        </li>
        <li>
          R Programming
        </li>
        <li>
          Getting and Cleaning Data
        </li>
        <li>
          Exploratory Data Analysis
        </li>
        <li>
          Reproducible Research
        </li>
        <li>
          Statistical Inference
        </li>
        <li>
          Regression Models
        </li>
        <li>
          Practical Machine Learning
        </li>
        <li>
          Developing Data Products
        </li>
      </ol>

      <p>
        ひとつの講座が 1 ヶ月単位. このシリーズの特徴は, 毎月同じ講座が開 講されていること. 半年や一年に一回開講される他の講座に比べると, 珍しい. 検索をかけると, 一年中トップに検索結果が表示されるので, よく目につく.
      </p>

      <p>
        毎月 1 つの講座をうけようとは思うものの, 終わるまで 9 ヶ月かかりそうな&#x2026;
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-3" class="outline-2">
    <h2 id="unnumbered-3">
      Data Scientist&#8217;s Toolbox
    </h2>

    <div class="outline-text-2" id="text-unnumbered-3">
      <p>
        この講座は, シリーズのはじめにうける必要がある.
      </p>

      <ul class="org-ul">
        <li>
          <p>
            <a href="https://www.coursera.org/course/datascitoolbox">The Data Scientist&#8217;s Toolbox</a>
          </p>

          <p>
            2 つのトピックを扱う.
          </p>

          <ul class="org-ul">
            <li>
              データサイエンスの概要と, シリーズの別の講座の詳しいガイダンス.
            </li>
            <li>
              データサイエンティストに必要なツールを身につける
            </li>
          </ul>

          <p>
            以下のツールを利用する.
          </p>

          <ul class="org-ul">
            <li>
              R
            </li>
            <li>
              RStudio
            </li>
            <li>
              git
            </li>
            <li>
              github
            </li>
          </ul>

          <p>
            しかし, すべてのツールを利用したことがあったので, なんと 2 時間で 終わってしまった! あっけない.
          </p>

          <p>
            この講座は, データサイエンスシリーズのオリエンテーションだった.
          </p>
        </li>
      </ul>
    </div>
  </div>

  <div id="outline-container-unnumbered-4" class="outline-2">
    <h2 id="unnumbered-4">
      R Programming
    </h2>

    <div class="outline-text-2" id="text-unnumbered-4">
      <p>
        シリーズを通じて R を利用する用なので, まずは R 言語を学ぶ.
      </p>

      <ul class="org-ul">
        <li>
          R の基本文法
        </li>
        <li>
          R の基本データ構造
        </li>
        <li>
          R の 関数型の性質 (apply 系)
        </li>
        <li>
          デバッグ方法・プロファイリング方法
        </li>
        <li>
          Random 生成によるシミュレーション
        </li>
      </ul>
    </div>

    <div id="outline-container-unnumbered-5" class="outline-3">
      <h3 id="unnumbered-5">
        課題
      </h3>

      <div class="outline-text-3" id="text-unnumbered-5">
        <p>
          課題は, csv ファイルからデータを読み出して, 編集して表示するようなもの. 統計的なはなしはほとんどでてこない. せいぜい平均程度.
        </p>

        <p>
          言語の文法とデータの扱い型の説明に終始している.
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-6" class="outline-3">
      <h3 id="unnumbered-6">
        感想
      </h3>

      <div class="outline-text-3" id="text-unnumbered-6">
        <p>
          week1,2 は基本文法を次から次へと紹介されるので, 頭が追いつかない. 少し忘れた.
        </p>

        <p>
          講座では, R の関数型の性質が強く説明されていたように感じた. apply の説明に week3 のほとんどが費やされるなど.
        </p>

        <ul class="org-ul">
          <li>
            値は代入では無くて, 束縛.
          </li>
          <li>
            loop を利用するよりも, apply を利用するとプログラムが短くなる.
          </li>
        </ul>

        <p>
          なんとなくだけれども R を身につけた. 文法は抑えたので, あとは R の関数の使い方を覚えていけば大抵のことはできる気がする.
        </p>

        <p>
          R を利用すると, 大きな CSV データが簡単に処理できることに驚いた.
        </p>

        <p>
          いままで, Excel しか知らなかった人間にとって, <b>データをプログラムで解析する</b> という新しい視点を手に入れた. こういう, 新しい知見を得ることも, MOOC に取り組む一つの目的だ. g
        </p>
      </div>
    </div>
  </div>

30 Jan 2015, 04:31

Coloring Rules で Filter に色付け! カラフルな DarkWireShark でログ解析を加速する方法

はじめに

前回の続きです.

WireShark の Coloring Rules をいじることで, 表示されるパケットに自由に色をつけることができたので紹介.

Coloring Rules をいじる

Wireshark を開き,

  • ツールバーから view > Coloring Rules を選択.
  • New を選択
  • Name: で名前をつける. String で絞りこむ条件を入れる.

この設定をすることで, 起動時から Filter に色をつけておくことができる. たとえば, 以下の記事に書いたフィルタをあらかじめ色付けしておけば, とてもログ解析がやりやすくなる.

以下, 色づけの例.

Name Fildter ForeGround BackGround
SMB2 smb2 #F8F8F2 #272822
SMB2 ERROR smb2.nt_status>0 #F8F8F2 #FF5800
SMB2 CREATE smb2.cmd==5 #F8F8F2 #225D71

これだけでも, だいぶカラフルになる.

SnapCrab_NoName_2015-1-30_13-19-44_No-00.png

29 Jan 2015, 12:53

WireShark で SMB/CIFS のパケット解析をするときの便利 Tips

はじめに

仕事で SMB プロトコルのパケット解析ばかりするようになってきた.

少し Tips がたまってきたので, 忘れないうちにメモしようと思う. SMB2 限定.

かなりニッチな内容だけれども, いつかどこかで誰かの役に立つことを願う.

検索を利用する

Ctrl + F で検索窓か開くので, キーワードから検索.

Filter を利用する

素早く情報を検索するには, フィルタが有効.

  • ツールバーからフィルタのパターンを入力
  • よく利用するものは, save を押すと再利用可能
  • フィルタの追加, 削除は Edit > Preferences > Filter Expressions から.

以下, よく利用するものを列挙

smb プロトコルをフィルタする

<div class="outline-text-3" id="text-3-1">
  <p>
    これは基本.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb or smb2<br /> [/sourcecode]
  </p>
</div>

IP アドレスでフィルタリング

<div class="outline-text-3" id="text-3-2">
  <p>
    サーバのログをみるとき, たくさんのクライアントからのアクセスがある ので, ログが見づらい. 以下で, 送信元または送信先でフィルタリング.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1<br /> [/sourcecode]
  </p>

  <p>
    送信元と先を指定する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1 and ip.addr == 10.0.0.0<br /> [/sourcecode]
  </p>
</div>

NT Status が エラーのものをフィルタリングする

<div class="outline-text-3" id="text-3-3">
  <p>
    エラーを素早くチェックするために.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.nt_status > 0<br /> [/sourcecode]
  </p>
</div>

Command Code でフィルタリング

<div class="outline-text-3" id="text-3-4">
  <p>
    コマンドコードで絞込み.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> # create でフィルタ<br /> smb2.cmd==5<br /> [/sourcecode]
  </p>

  <p>
    コマンドコード一覧
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://msdn.microsoft.com/en-us/library/cc246528.aspx">2.2.1.1 SMB2 Packet Header &#8211; ASYNC</a>
    </li>
  </ul>
</div>

FileId でフィルタリング

<div class="outline-text-3" id="text-3-5">
  <p>
    create response コマンドにある fileId を追跡する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.fid==00004001-0000-0000-0000-000000000000<br /> [/sourcecode]
  </p>
</div>

tshark を利用する

コマンドラインの tshark を利用したほうが, 操作が早いことに気付く. しかし, Detail をしっかりみるためには GUI 版の WireShark がいい.

smb でフィルタリンクしたものを吐き出し. これでログが軽くなる.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2’ -w foo.pcapng
[/sourcecode]

-Y でフィルタをかける. サブ画面でちょっとした grep をするのに便利.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.cmd==5’
[/sourcecode]

エラーがないかなどを素早くチェックする.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.nt_status > 0’
[/sourcecode]