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

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

Mac Dockerインストール後に、docker-compose のバージョンを「1.27.4」から「1.28.4」にアップグレードさせるTips

はじめに

Dockerインストール後に、docker-compose のバージョンが合わないということがある。

今回、「1.27.4」から「1.28.4」にアップグレードさせる実行例を取り上げる。

#Docker のインストール
brew install --cask docker

#Docker.appの起動
open /Applications/Docker.app

#実行許可を聞かれる >> OK
#Docker Desktop needs privileged access. >> OK

#Dockerのパス確認
which docker
#/usr/local/bin/docker

#Dockerのバージョン
docker -v
#Docker version 20.10.2, build 2291f61

#docker-composeのパス確認
which docker-compose
#/usr/local/bin/docker-compose

#docker-composeのバージョン
docker-compose -version
#docker-compose version 1.27.4, build 40524192

docker-compose のバージョンが違うと、dockerfileがうまく立ち上がらない問題がある*1

そういうときには、docker-compose のバージョンを合わせる必要がある。

docker-compose 1.28.4 をGitHubリポジトリからダウンロード・インストール

docker-compose 1.28.4 をGitHubリポジトリからダウンロードして、権限設定、パス設定を行う。

ここに、docker-compose のリリース・ページがある。

github.com

#現在のdocker-composeのバージョン
docker-compose -version
#docker-compose version 1.27.4, build 40524192

#docker-compose 1.28.4のダウンロード
wget #https://github.com/docker/compose/releases/download/1.28.4/docker-compose-Darwin-x86_64

#名前の変更
mv docker-compose-Darwin-x86_64 docker-compose

#実行権限の付与
chmod +x ./docker-compose 

#ファイルの移動(上書き)
mv -f ./docker-compose /usr/local/bin/

which docker-compose 
#/usr/local/bin/docker-compose

docker-compose -version
#docker-compose version 1.28.4, build cabd5cfb

【追記 2021/4/13】Mac docker-compose 1.26.2 を 1.27.4 にアップグレードする

#現在のdocker-composeのバージョン
docker-compose -version
#docker-compose version 1.26.2, build eefe0d31

#docker-compose 1.27.4のダウンロード
wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Darwin-x86_64

#名前の変更
mv docker-compose-Darwin-x86_64 docker-compose

#実行権限の付与
chmod +x ./docker-compose 

#一度、動かす
./docker-compose -version
#docker-compose version 1.27.4, build 40524192

#ファイルの移動(上書き)
mv -f ./docker-compose /usr/local/bin/

#パス確認
which docker-compose 
#/usr/local/bin/docker-compose

#バージョン確認
docker-compose -version
#docker-compose version 1.27.4, build 40524192

まとめ

Dockerは便利なんだけど、docker-compose のバージョン問題はハマると厄介な問題である。

パッケージソフトウェアの更新と合わないとか、 歩調を合わせて欲しいところである。。

*1:そもそも、brew で管理されているdockerのバージョンのアップデートがやや遅いというのがある。

【R・ビッグデータ解析の処方箋】readLines、connection オブジェクトを使って、テキストファイルの1行ずつ読み込みを実行してみた件〜

はじめに

現状、数十GB・数百GBといった、大きなファイルを扱う際には、R/メモリ上で全データを読み込むことはややリスキーである。

ファイル全体を読み込まず、ファイル内の1行ずつで処理を実施する工夫が必要となる。*1

Rで、1行ずつの処理を実行するには、readLines関数を用いる。

readLines関数は、connection オブジェクトから一部またはすべてのテキスト行を読み込む関数である。

また、connection オブジェクトとは、つまり「一般化されたファイル」(圧縮ファイル、URL、パイプなど)を作成、オープン、クローズするための関数オブジェクトを指す。このR Documentationの説明を読んでてても、いまいち分からないのだが、要するに、R上に全ファイルのロードせずに、DB的にファイルと接続して、データのやり取りをするというイメージだろう。

テストファイルを用意したので、readLinesの実行例を解説する。

練習ファイルのダウンロード

#gistからファイル・ダウンロード
utils::download.file(url="https://gist.githubusercontent.com/kumeS/398fbeb50c71cf828190aced63b0d1b0/raw/0fb095ae07a4e331ef23e6fc9350a5d7d276b732/file.txt",
                     destfile="file.txt")

#ファイル表示
system("cat file.txt")
#AAA
#BBB
#CCC
#DDD
#EEE
#FFF
#GGG
#HHH
#III
#JJJ
#KKK
#LLL
#MMM
#NNN
#OOO
#PPP
#QQQ
#RRR

readLinesのダメな実行例

これは、間違った使い方であるが、 ファイル名を指定して、readLinesを実行してもダメ・・・である。

以下の実行だと、同じ出力が繰り返されるだけである。

#ファイルパス
txt_file <- "./file.txt"

readLines(con=txt_file, n = 1)
#[1] "AAA"
readLines(con=txt_file, n = 1)
#[1] "AAA"

##引数
#con: connection オブジェクト
#n: 読み込む (最大の) 行数

readLinesの実行コード例

まず、ファイルパスから、connection オブジェクトを作成する。

con_file <- file(description = "./file.txt", open = "r")

str(con_file)
# 'file' int 3
# - attr(*, "conn_id")=<externalptr> 

con_file
#A connection with                        
#description "./file.txt"
#class       "file"      
#mode        "r"         
#text        "text"      
#opened      "opened"    
#can read    "yes"       
#can write   "no"  

connection オブジェクトをreadLinesで読み込んでいくと、実行回数ごとに出力が変わる。

#readLinesを実行するごとに、違う行が表示される
readLines(con_file, n = 1)
#[1] "AAA"
readLines(con_file, n = 1)
#[1] "BBB"
readLines(con_file, n = 1)
#[1] "CCC"
readLines(con_file, n = 1)
#[1] "DDD"
readLines(con_file, n = 1)
#[1] "EEE"

次に、forループで実行する例を示す。

#for実行の場合
con_file <- file(description = "./file.txt", open = "r")
for(n in 1:18){
a <- readLines(con_file, n = 1)
print(a)
}

#[1] "AAA"
#[1] "BBB"
#[1] "CCC"
#[1] "DDD"
#[1] "EEE"
#[1] "FFF"
#[1] "GGG"
#[1] "HHH"
#[1] "III"
#[1] "JJJ"
#[1] "KKK"
#[1] "LLL"
#[1] "MMM"
#[1] "NNN"
#[1] "OOO"
#[1] "PPP"
#[1] "QQQ"
#[1] "RRR"

さらに、stackoverflow内で、dvdさんが示していた関数の事例を下記に示す。

whileを使って、if ( length(line) == 0 )の条件を入れることで、 ファイルの全行数が分からなくても、実行の開始・終了ができる。

processFile = function(filepath) {
  con = file(filepath, "r")
  while ( TRUE ) {
    line = readLines(con, n = 1)
    if ( length(line) == 0 ) {
      break
    }
    print(line)
  }
  close(con)
}

processFile(filepath="./file.txt")
#[1] "AAA"
#[1] "BBB"
#[1] "CCC"
#[1] "DDD"
#[1] "EEE"
#[1] "FFF"
#[1] "GGG"
#[1] "HHH"
#[1] "III"
#[1] "JJJ"
#[1] "KKK"
#[1] "LLL"
#[1] "MMM"
#[1] "NNN"
#[1] "OOO"
#[1] "PPP"
#[1] "QQQ"
#[1] "RRR"


#あるいは、repeat関数 でもOK!!

processFile_r <- function(filepath) {
  con = file(filepath, "r")
  repeat {
    line = readLines(con, n = 1)
    if ( length(line) == 0 ) {
      break
    }
    print(line)
  }
  close(con)
}

まとめ

connection オブジェクトの扱い方とか、ノーマークだったけど、Rにも便利なオブジェクトがあるもんだ。

R・ビッグデータ解析の処方箋 関連記事

skume.net

R言語 お勧め書籍

補足

readLines関数で、10万行の同時読み込み

実際の事例では、readLines関数でGBオーダーのテキストファイルを読み込んでいく場合に、n = 1では、インタプリンタ言語の性格上、非常に読み込み効率が悪く、n = 10000あるいはn = 100000くらいに設定して読み込むのが良い。

私の経験上、readLines関数での10万行の読み込みは、1-2秒で完了する。

#readLinesの実行例
readLines(con_file, n = 100000)

参考資料

stackoverflow.com

*1:sedコマンドで、1行ずつ行を抽出できるが、sedコマンドでも一度ファイル全体を読み込んでから処理を実行しているらしく、大きなファイルにsed実行は不向きである。

Mac版 JAVAバージョン切り替えメモ : Java 14 から 12 への切り替え

Javaパスを切り替えるメモ書き

Mac PC内に、Java 14 と 12 が混在している状況で、Java 14 からJava 12にパスを切り替えるメモ書き。

#現在のJava パス
which java
#/usr/bin/java

# Javaのバージョン確認 => java 14 が使用されている
java -version
#java version "14" 2020-03-17
#Java(TM) SE Runtime Environment (build 14+36-1461)
#Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)

#configの確認 => Java 14 と 12が存在する
brew config
#HOMEBREW_VERSION: 2.7.7
#...
#Java: 14, 12.0.2
#macOS: 10.15.7-x86_64
#CLT: 12.0.32.28
#Xcode: 12.3
#XQuartz: 2.7.11 => /opt/X11

# Java VMの確認
/usr/libexec/java_home -V
#Matching Java Virtual Machines (3):
#    14, x86_64:    "Java SE 14" /Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home
#    14, x86_64:    "OpenJDK 14" /Library/Java/JavaVirtualMachines/openjdk-14.jdk/Contents/Home
#    12.0.2, x86_64:  "AdoptOpenJDK 12"    /Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home
#
#/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home

環境変数の設定に関する2パターンの方法

環境変数の設定には、2パターンの方法がある。

  • (1)一時的に環境変数JAVA_HOMEの設定を書き換えるか

  • (2).bash_profileに書き込んで、起動毎に環境変数JAVA_HOMEの設定を行うか

である。

一時的な設定の場合

いちおう、両者のやり方を下記に示す。

## 環境変数JAVA_HOMEの設定
#一時的な設定の場合
cd 
export JAVA_HOME=`/usr/libexec/java_home -v "12"`; PATH=${JAVA_HOME}/bin:${PATH}

一時的な設定の場合

#.bash_profileに環境変数の設定を書き込む場合
cd
echo 'export JAVA_HOME=`/usr/libexec/java_home -v "12"`; PATH=${JAVA_HOME}/bin:${PATH}' >> .bash_profile
source .bash_profile

設定後の確認

#設定の確認
java -version
#openjdk version "12.0.2" 2019-07-16
#OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.2+10)
#OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.2+10, mixed mode)

#パスの確認
which java
#/Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home/bin/java