京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Mac版sshpassを使って、SSH/SCPコマンドのパスワード認証を引数で与えてみた件

はじめに

R上でshコマンドを実行する際に、しばしば、パスワードの受け渡し・認証の問題でエラーが起こる。

この認証をいい感じに補助してくれるコマンドが、sshpassである。

今回、sshpass/sshsshpass/scpコマンドを組み合わせた事例を紹介する。

まずは、sshとscpコマンドのusageを見てみる。

sshは、ポート22でリモートコンピュータと通信するためのプロトコルである。 scpは、ssh通信で、コンピュータ間でのファイルの転送・コピーを行うコマンドである。

#$ ssh
#usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
#           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
#           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
#           [-i identity_file] [-J [user@]host[:port]] [-L address]
#           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
#           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
#           [-w local_tun[:remote_tun]] destination [command]

#$ scp
#usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file]
#            [-J destination] [-l limit] [-o ssh_option] [-P port]
#            [-S program] source ... target
#-Crオプションでやや早くなる場合も

sshpassのインストール

どうもHomeBrew本家からは、 セキュリティ上の理由からsshpassのリポジトリ追加を 拒否られているとのこと*1

なので、hudochenkovのGitHubサイトからインストールする。

##HomeBrew本家からはインストールできない
#system("brew install sshpass")
#Error: No similarly named formulae found.
#Error: No available formula or cask with the name "sshpass".
#We won't add sshpass because it makes it too easy for novice SSH users to
#ruin SSH's security.

#解決策
system("brew install hudochenkov/sshpass/sshpass")

#OR
#system("brew install https://raw.githubusercontent.com/hudochenkov/homebrew-sshpass/master/sshpass.rb")

#パス確認
system("which sshpass")
#/usr/local/bin/sshpass

sshpassのUsage

#Usage
#system("sshpass")
#Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
#   -f filename   Take password to use from file
#   -d number     Use number as file descriptor for getting password
#   -p password   Provide password as argument (security unwise)
#   -e            Password is passed as env-var "SSHPASS"
#   With no parameters - password will be taken from stdin
#   -P prompt     Which string should sshpass search for to detect a password prompt
#   -v            Be verbose about what you're doing
#   -h            Show help (this screen)
#   -V            Print version information
#At most one of -f, -d, -p or -e should be used

R上でSSHを実行するとバグるよ・・・

sshpass/sshコマンドを実行する場合の文法は以下の通りである。 ただ、これをRコンソールで実行するとバグってしまった。

system("sshpass -p [Your Password] ssh [Remote hostname]@[IP address / SSID]")

なので、良い子は、ターミナルタブに移動して実行しましょう。

sshpass -p [Your Password] ssh [Remote hostname]@[IP address / SSID]

R上でのSCP実行はうまくいく

sshpass/scpコマンドを実行する場合の文法は以下の通りである。

これは、うまく通った。ただ、Progress barが出ないのが残念。

system("sshpass -p [Your Password] scp [local machine file path] [Remote hostname]@[IP address / SSID]:[remote machine file path]")

ターミナルタブに移動して実行する場合には、

sshpass -p [Your Password] scp [local machine file path] [Remote hostname]@[IP address / SSID]:[remote machine file path]

ここで、[ ]の括弧は、語彙範囲を明示するもので、実際のコマンド実行時には不要である。

scpコマンドの具体例

scpコマンドの具体的な使い方を以下に示します。

#ローカルからサーバーに送る
scp -P 22 -r [送るファイルパス] [ユーザー名]@XXX.jp:/AAA/BBB/

#秘密鍵を指定して、ローカルからサーバーに送る例
scp -P 22 -r -i [秘密鍵のファイルパス] [送るファイルパス] [ユーザー名]@XXX.jp:/AAA/BBB/

#サーバーからローカルに送る
scp -P 22 -r [ユーザー名]@XXX.jp:/AAA/BBB [送り先のフォルダパス]
引数 概要
-P 22 ポート22を指定する
-r ディレクトリごと再帰的にコピーする
-p コピー元のタイムスタンプやパーミッションを保持する
-i ssh接続に使用する鍵ファイルを指定する

まとめ

セキュリティ問題で拒否られてるだけあって、簡単・シームレスでコマンド実行ができる。

参考資料

webkaru.net

qiita.com

techtipshoge.blogspot.com

*1:そらそうだろね

公共(バイオ)画像データのリポジトリをまとめてみた

はじめに

ライフサイエンス・基礎生物、医療・医用などの画像データを中心に、 機械学習・深層学習に使えそうな、データセット関連のページリンクをまとめてみた。

【24 June 2021, updated】随時更新予定

公共(バイオ)画像データのリポジトリ

Dataset Search - Google

Dataset Search

「segmentation」で検索した結果

Dataset Search

「3d sem」で検索した結果

Dataset Search

Kaggle - image

https://www.kaggle.com/tags/image-data

Find Open Datasets and Machine Learning Projects | Kaggle

BioImageDbs - Bioconductor

Bioconductor - BioImageDbs

BioImage Archive (EMPIAR, Cell-IDR and Tissue-IDR)

Home < BioImage Archive < EMBL-EBI

BIAFlows

Biaflows

Broad Bioimage Benchmark Collection

Image Sets | Broad Bioimage Benchmark Collection

CELL TRACKING CHALLENGE

2D+Time Datasets – Cell Tracking Challenge

3D+Time Datasets – Cell Tracking Challenge

Segmentation Dataset for Transmission Electron Microscopic Cell Recordings, University of Freiburg

Computer Vision Group, Freiburg

zenodo

Zenodo - Research. Shared.

「segmentation」で検索した結果

Zenodo

Academics Torrents

Academic Torrents

「segmentation」で検索した結果

https://academictorrents.com/browse.php?c6=1&search=segmentation&sort_field=size&sort_dir=ASC

Tissue Image Analytics (TIA) Centre

TIA Centre: Datasets for Sharing

Allen Institute for Cell Science

ALLEN CELL EXPLORER - Allen Cell Explorer, the data portal of the Allen Institute for Cell Science

Object Research Systems

Dragonfly Sample Datasets | ORS

Genomic Data Commons Data Portal

GDC

National Cancer Institute, NIH

NBIA CBIIT Instance Retirement Notice - National Biomedical Imaging Archive - NCI Wiki

Cancer Imaging Archive

 

Osirix | DICOM Image Library (CT dataset)

https://www.osirix-viewer.com/resources/dicom-image-library/ [:title]

American Association for Anatomy's Virtual Microscope Database (バーチャルスライドデータ)

VMD Website

Beelden Pathologie (病理画像)

Beelden Pathologie - Radboudumc

NEURODATA (コネクトームデータ)

Hildebrand et al. (2017)

Nanotomy: Large-scale electron microscopy (EM) datasets

www.nanotomy.org

Michigan Histology and Virtual Microscopy Learning Resources

All Resources | histology

Cell Image library, Center for Research in Biological Systems, University of California, San Diego

The Cell Image Library

miniJSRT_database | 日本放射線技術学会 画像部会

miniJSRT_database | 日本放射線技術学会 画像部会

コンペ系

Grand Challenge

Challenges - Grand Challenge

ISBI 2019

Challenges | ISBI 2019

kaggle.com(Image Data)

https://www.kaggle.com/tags/image-data

VisualData (一般画像認識課題)

VisualData Discovery - Search Engine for Computer Vision Datasets

まとめサイト

機械学習に使える医療系データセット【随時更新】

機械学習に使える医療系データセット【随時更新】

機械学習用データセット一覧(フリー素材)

機械学習用データセット一覧(フリー素材) | Md.lab

【10個掲載】機械学習による画像分類で使えるデータセット

https://lionbridge.ai/ja/datasets/image-classification-datasets-for-machine-learning/

画像解析のためのバイオイメージデータベース@tokkuman

画像解析のためのバイオイメージデータベース - Qiita

List of datasets for machine-learning research

List of datasets for machine-learning research - Wikipedia

50 Open Source Image Datasets for Computer Vision for Every Use Case

50 Open Source Image Datasets for Computer Vision for Every Use Case | TaQadam

参考資料

https://www.researchgate.net/post/Can_anyone_suggest_me_any_website_for_downloading_DICOM_files

R言語 CRAN Task View:医用画像解析 | トライフィールズ

List of Training Materials | BIII

11 Image data | Modern Statistics for Modern Biology

Quantitative Pathology & BioImage Analysis: QuPath - [NEUBIASAcademy@Home] Webinar - YouTube

QuPath

The ANTsX ecosystem for quantitative biological and medical imaging | Scientific Reports

SAPHIR: a Shiny application to analyze tissue... | F1000Research

https://forum.image.sc/t/zerocostdl4mic-splinedist-notebook-now-available/47568

CSBDeep

https://www.embopress.org/doi/full/10.15252/embj.2020105889

GitHub - ML-Bioinfo-CEITEC/ECCB2020: ECCB2020 tutorial: Using Deep Learning For Image and Sequence Analysis

【R言語とテキスト変換】pdf2textを実行して、PDFファイルをテキストに変換するの巻

はじめに

科学論文などの文献資料の多くは、通常、PDF形式のファイルで保管されています。

このフォーマットは主に印刷用に設計されているため、検索や索引付けにはあまり適していません。 PDFファイルは、OSやソフトウェアが変わっても、書式が変わらないのが強みですね。

rOpenSciが提供する、pdftoolsパッケージを使えば、 R環境で、PDFファイルから、テキストやメタデータを抽出できるみたいです。

今回、PDFファイルを読み込み、テキスト生成とかをR環境でやってみました。

関連パッケージのインストール

まずは、「pdftools」パッケージとツール群をインストールします。

#関連ページ
browseURL("https://github.com/ropensci/pdftools")
browseURL("https://cran.r-project.org/web/packages/pdftools/index.html")

#pdftoolsのインストール
install.packages("pdftools")

#事前にセットアップ For MacOSX
system("brew install poppler")
system("brew install wget")

#パッケージ・ロード
library(pdftools)

Getting started (1) 英語論文での事例

pdf2textパッケージで、最も重要な関数は、pdf_text 関数で、 pdfのページ数と同じ長さの文字ベクトルを返します。

また、ベクトル内の各文字列は、 そのページ内のプレーンテキストに変換されます。

それでは、 The jsonlite Package: A Practical and Consistent Mapping Between JSON Data and R Objects のArxiv論文PDFを使って、検証してみます。

#ダウンロード
download.file("http://arxiv.org/pdf/1403.2805.pdf", "1403.2805.pdf", mode = "wget")

#Check
#dir(pattern = ".pdf")

#変換
txt <- pdftools::pdf_text("1403.2805.pdf")

#1ページ目のテキスト
cat(txt[1])

#2ページ目のテキスト
cat(txt[2])

#簡単な前処理: 空白と改行記号を消す
#1ページ目を抜き出す
a <- txt[1]
for(n in 1:10){
a <- gsub("  ", " ", a)
a <- gsub("\n", " ", a)
}

結果として、以下のような、テキストが抽出されました。

#出力
a
#[1] " The jsonlite Package: A Practical and Consistent Mapping Between 
#JSON Data and R Objects Jeroen Ooms arXiv:1403.2805v1 [stat.CO] 12 Mar 
#2014 UCLA Department of Statistics Abstract A naive realization of JSON data 
#in R maps JSON arrays to an unnamed list, and JSON objects to a named list. 
#However, in practice a list is an awkward, inefficient type to store and manipulate
#data. Most statistical applications work with (homogeneous) vectors, matrices 
#or data frames. Therefore JSON packages in R typically define certain special 
#cases of JSON structures which map to simpler R types. Currently there
#.........

#書き出し・表示
readr::write_excel_csv(as.data.frame(a), "a.csv", col_names = F)
browseURL("./a.csv")

Getting started (2) 日本語資料での事例

英語論文で試しましたが、次に、日本語のPDFファイルではどうかを検証してみます。

「マクマリー 生化学反応機構」という専門書籍の、とあるページで試してみます。

#ダウンロード
download.file("http://www.tkd-pbl.com/files/mcmurry_seikagakuhannoukikou_2nd.pdf", "seikagaku_2nd.pdf", mode = "wget")

#変換
txtJpn <- pdftools::pdf_text("seikagaku_2nd.pdf")
txtJpn

#簡単な前処理: 空白と改行記号を消す
b <- txtJpn[1]
for(n in 1:10){
b <- gsub(" ", "", b)
b <- gsub("\n", " ", b)
b <- gsub(".", ".", b)
b <- gsub(",", ",", b)
}

b
#[1] "生化学と有機化学を相互につなぐ教科書マクマリー生化学反応機構―
#ケミカルバイオロジーによる理解―第2版J.McMurry,T.Begley著長野哲雄監
#訳A5判・井上英史,浦野泰照,小島宏建,496ページ鈴木紀行,平野智也訳
#定価:本体5400円+税東京化学同人「生命活動は化学反応によって成り学
#の世界として,頭に詰め込まれてい学問体系の相互的な理解が進むように工立
#っている.だから有機化学を学ぶことく.一方で生化学の教科書では,生体内夫
#されており,深い学びへと誘うアクは,生命を理解することにつながるのでひ
#き起こされる物質変換の様子が連続ティブラーニングが自然と達成できる教だ」私が
#....

#書き出し・表示
readr::write_excel_csv(as.data.frame(b), "b.csv", col_names = F)
browseURL("./b.csv")

実行時に、PDF error: Invalid Font Weightというエラーが出ていますが、特に結果に問題なさそうです。

他のユーティリティについて

pdf_toc関数で目次(ToC)を取得・表示する

加えて、このパッケージには、PDFファイルから他のデータを抽出するためのユーティリティがいくつか用意されています。

pdf_toc関数は、目次(ToC)を取得・表示します。 つまり、PDFリーダーが通常、左側のメニューパネルに表示するセクションヘッダーを意味します。

JSON形式だと、うまく表示されるらしいです。

# 目次の取得
toc <- pdftools::pdf_toc("1403.2805.pdf")

toc
#$title
#[1] ""
#
#$children
#$children[[1]]
#$children[[1]]$title
#[1] "1 Introduction"
#
#$children[[1]]$children
#$children[[1]]$children[[1]]
#$children[[1]]$children[[1]]$title
#[1] "1.1 Parsing and type safety"
#...

#JSON形式での表示
jsonlite::toJSON(toc, auto_unbox = TRUE, pretty = TRUE)
#{
#  "title": "",
#  "children": [
#    {
#      "title": "1 Introduction",
#      "children": [
#        {
#          "title": "1.1 Parsing and type safety",
#          "children": []
#        },
#        {
#          "title": "1.2 Reference implementation: the jsonlite package",
#          "children": []
#        },
#        {
#          "title": "1.3 Class-based versus type-based encoding",
#          "children": []
#        },
#....

メタデータに関する情報

また、pdf_info関数などを使えば、フォントや添付ファイル、作者や作成日、タグなどのメタデータに関する情報を取得できます。

# Author, version, etc
info <- pdftools::pdf_info("1403.2805.pdf")
info
#$version
#[1] "1.4"
#$pages
#[1] 29
#$encrypted
#[1] FALSE
#$linearized
#[1] FALSE
#$keys
#$keys$Producer
#[1] "dvips + GPL Ghostscript GIT PRERELEASE 9.08"
#......

# Table with fonts
fonts <- pdftools::pdf_fonts("1403.2805.pdf")
fonts
#              name   type embedded                            file
#1      Times-Roman  type1    FALSE /System/Library/Fonts/Times.ttc
#2    UWJIZQ+CMTT10 type1c     TRUE                                
#3     OYDUEZ+CMR10 type1c     TRUE                                
#4    EBLJKS+CMTI10 type1c     TRUE                                
#5    APBPVY+CMBX12 type1c     TRUE                                
#6     FBFBNT+CMTI9 type1c     TRUE                                
#......

#Table with attachments
files <- pdftools::pdf_attachments("1403.2805.pdf")
files
#list()

#Table with data
Dat <- pdftools::pdf_data("1403.2805.pdf")
head(Dat[[1]])
#  width height   x   y space      text
#1    27     15  92 115  TRUE       The
#2    71     14 124 117  TRUE  jsonlite
#3    59     15 200 115  TRUE  Package:
#4    11     15 266 115  TRUE         A
#5    61     15 284 115  TRUE Practical
#6    25     15 350 115  TRUE       and

また、PDFファイルをビットマップ配列にレンダリングする機能もあります*1

R環境では、pdf_render_page関数を使って、PDFの1ページをビットマップにレンダリングできます。

# pdf から bitmap へのレンダー
bitmap <- pdftools::pdf_render_page("1403.2805.pdf", page = 1)

# bitmap 画像の保存
png::writePNG(bitmap, "page.png", dpi = 100)
jpeg::writeJPEG(bitmap, "page.jpg", quality = 0.7, bg = "white")
#install.packages("webp"); library(webp)
#webp::write_webp(bitmap, "page.webp")

#ファイルを開く
browseURL("./page.png")
browseURL("./page.jpg")

まとめ

pdftoolsを使って、PDFファイルのテキスト変換を一通りやってみました。

結構、便利そうに思いますね。。。

*1:popplerライブラリの事前インストールが必要です