未分類

conda(Anaconda)経由でPythonにpy2exeをインストールする。

conda経由でPythonにPy2exeをインストールする手順です。

特にPython3でのpy2exepython3.4までしか提供されてないのでAndaconda Navigaterからはインストールできない為(パッケージがcurrent channelで提供されてない)、condaコマンドでインストールする必要があります。

 
 

  1. 事前にPython3.4の環境を構築する。
  2. Py2exeパッケージをインストールする。

    Python3.4でもpy2execurrent channelで提供されて無い為、次のコマンドでパッケージをインストールする。

    > conda install -c kieranharding py2exe


     
     

    ちなみに通常のパッケージインストールコマンドだと次のようにパッケージが見つからないと言われてしまいます。

     
     

    > conda install py2exe


     
     

     
     

  3. インストールしたパッケージがパッケージ一覧に含まれている事を確認する。

    > conda list


     
     

 
 

<補足>

32bit Python3.4では“-c kieranharding” パラメータを指定してもパッケージをインストールできないようなのでpipでインストールする必要があります。

> pip install py2exe


 
 

 
 

 
 

 
 

 
 

未分類

conda環境に古いバージョンのPython環境を構築する。

Python環境作成の際にAnaconda Navigatorから選択できない古いPythonバージョンを構築する際の手順の説明です。

condaコマンドを利用する事で任意のPythonバージョンで環境を構築する事ができます。

ここではpython3.4環境を例に手順を説明します。


 
 

  • 管理者権限でAnacondaPromptを起動する。

    もし、Anaconda上に複数のPythonバージョンの環境を作成している場合はbase環境でプロンプトを起動する。

  • 新しく32bitPython環境を作成する。

    >conda create -n py34 python=3.4.5


     
     

     
     

  • 作成した32bitPython環境を確認する。

    作成した32bit Python環境へ切り替えたのち、Pythonコンソールを起動してVerを確認する。

    > conda activate py34

    > python

     
     


     
     

未分類

64bit Windows の Anacondaに32bitのPython環境を作成する。

64bit Windows環境のAnacondaでは通常64bitのPython環境が構築されます。

時によっては32bitPythonを実行したい場合もあるのでPython 32bit環境の構築する方法の説明です。

 
 

特にpy2exeなどで32bit向けWindows バイナリを作成する際に重宝すると思います。

 
 

  1. 管理者権限でAnacondaPromptを起動する。

    もし、Anaconda上に複数のPythonバージョンの環境を作成している場合はbase環境でプロンプトを起動する。

  2. condaの環境変数を32bitへ変更する。

    > set CONDA_SUBDIR=win-32

  3. 変更結果を確認する。

    > conda info

    platform欄にwin-32と表示されている事を確認する。


     
     

    ちなみに64bitへ戻す場合は次のコマンド

    > set CONDA_SUBDIR=win-64

     
     

  4. 新しく32bitPython環境を作成する。

    >conda create -n py34_32bit python=3.4.5

     
     

    ここではpython 3.4環境で構築。


     
     

     
     

  5. 作成した32bitPython環境を確認する。

    condaの環境を作成した32bit Python環境へ切り替えてPythonコンソールを起動して確認する。

    > conda activate py34_32bit

    > python

     
     


 
 

コンソール上に”on win32″と表示されている事を確認する。

未分類

install.packages(“DoE.base”)

install.packages(“DoE.base”)

library(DoE.base)

library(lattice)

library(latticeExtra)

 
 

# =============================================================================(

 
 

plot.summaly <- function(a, df, df.mean, …){

x.lab <- df.mean[[a]]$label

# xy plot

plot.default(df[[a]], df$x, xaxt = “n”, ann = FALSE, …)

par(new = TRUE)

plot.default(df.mean[[a]]$label, df.mean[[a]]$x,

ylab = “x”, xlab = a,

xaxt = “n”,

type = “l”, col = “red”,

…)

 

axis(side = 1, at = x.lab, labels = levels(x.lab))

 

# boxplot

boxplot(formula(sprintf(“x~%s”, a)), data = df, …)

}

 
 

plot.Interaction <- function(a, x.df, …){

 

f00 <- function(a, x.list, y, add.flg = FALSE, …){

f01 <- function(x, y, a, data.list, …){

list.name <- names(data.list)

legend.lab <- list.name

pchs = rep(1, length(legend.lab))

ltys = rep(“b”, length(legend.lab))

for(i in list.name){

order.z <- order(data.list[[i]][[x]])

df <- data.list[[i]][order.z,]

x.lab <- df[[x]]

main.lab <- paste(a, x, sep = ” – “)

if(rev(list.name)[1] == i){

plot.default(df[[x]], df[[y]], col = df[[a]],

ylab = y, xlab = x, main = main.lab,

xaxt = “n”,

…)

 

} else {

plot.default(df[[x]], df[[y]], col = df[[a]],

xaxt = “n”, ann = FALSE, …)

 

par(new = add.flg)

}

 

if(!add.flg){

axis(side = 1, at = x.lab, labels = levels(x.lab))

legend(“topleft”, legend = legend.lab, col = (1:length(legend.lab)),

pch = pchs, #lty = ltys,

bg = “transparent”)

}

 

}

 

if(add.flg){

# if(levels(x.lab)[1] == “D1”){

# browser()

# }

x.lab <- df[[x]]

axis(side = 1, at = x.lab, labels = levels(x.lab))

legend(“topleft”, legend = legend.lab, col = (1:length(legend.lab)),

pch = pchs, #lty = ltys,

bg = “transparent”)

}

TRUE

}

x.list2 <- x.list[[a]]

tg.x <- names(x.list2[[1]])

z <- grep(paste(c(a, y), collapse = “|”), tg.x)

lapply(tg.x[-z], f01, y, a, x.list2, …)

 

}

 

s.df <- lapply(a, function(a, x){split(x, x[[a]])}, x.df)

names(s.df) <- a

lapply(a, f00, s.df, “x”, ylim = c(0, 0.5), type = “b”, …)

}

 
 

cal.LSD <- function(tg.f, data.aov, a = 0.05, tg.x = “x”){

f.lsd <- function(n.comb, n, v.value, t.value){

((1/n[n.comb][1]) + (1/n[n.comb][2]) * v.value)^(1/2) * t.value

}

 

f.delta <- function(n.comb, x){

rtn <- data.frame(x[n.comb][1] – x[n.comb][2])

names(rtn) <- paste(names(x)[n.comb][1], names(x)[n.comb][2], sep = ” “)

row.names(rtn) <- NULL

rtn

}

 

 
 

 

aov.sum <- summary(data.aov)[[1]]

tg.data <- data.aov$model[[tg.f]]

 

if(is.null(tg.data)){

print(sprintf(“error : 対象の要素がNULLです。(tg.f : %s)”, tg.f))

return(NA)

}

lv <- levels(tg.data)

lv.comb <- combn(length(lv),2)

z <- length(row.names(aov.sum)[[1]])

n <-table(tg.data)

e.tValue <- abs(qt(a/2, aov.sum[[“Df”]][z]))

x.mean <- tapply(data.aov$model[[tg.x]], data.aov$model[[tg.f]], mean)

x.lsd <- apply(lv.comb, 2, f.lsd, n, aov.sum[[“Mean Sq”]][z], e.tValue)

names(x.lsd) <- names(x.mean)

x.delta.0 <- apply(lv.comb, 2,

function(n.comb, x){x[n.comb][1] – x[n.comb][2]},

x.mean)

names(x.delta.0) <- apply(lv.comb, 2,

function(n.comb, x){paste(x[n.comb][1], x[n.comb][2], sep = ” – “)},

names(x.mean))

 

x.delta <- as.data.frame(apply(lv.comb, 2, f.delta, x.mean))

# as.data.frame後にnamesに含まれる“-““.”に置き換わるのでgsub()再置換する。

names(x.delta) <- gsub(“[.]”, ” – “, names(x.delta))

# ————————————————————————-

 

print(“(Residuals)”)

print(sprintf(“factor : %s”, paste(lv, collapse = “, “)))

#print(sprintf(“factor : %s”, lv))

print(” – mean -“)

print(x.mean)

print(sprintf(“t-Value : %s”, round(e.tValue, 3)))

print(” – L.S.D -“)

print(x.lsd)

print(” – delta – “)

print(x.delta)

#print(x.delta.0)

rtn <- list()

rtn$factor <- lv

rtn$n <- n

rtn$mean <- x.mean

rtn$lsd <- x.lsd

rtn$delta <- x.delta

rtn

}

 
 

# =============================================================================

 
 

old.wd <- getwd()

setwd(“/Documents/R”)

 
 

# L9(3^4)の直行表を読み込む

show.oas(nruns=9, parents.only=FALSE)

oaTableL9 <- oa.design(ID=L9.3.4, randomize=FALSE)

print(oaTableL9)

 
 

x <- read.csv(“L9_data.csv”,

header = TRUE,

stringsAsFactors = FALSE)

x.data.info <- read.csv(“L9_data_factor_levels.csv”,

header = TRUE,

stringsAsFactors = FALSE)

 
 

# C因子について実験データの割付を直行表にあわせる。

data.frame(“直行表割付水準 = as.integer(oaTableL9.org$C),

実験データの水準” = c(1, 2, 3, 2, 3, 1, 3, 1, 2))

 
 

# 23を入れ替える。

x.data.info$C <- x.data.info$C[c(1,3,2)]

x.data.info$C

 
 

 
 

x.data <- cbind(oaTableL9, x = x$x)

 
 

# x.data.2<- data.frame(

# A = c(sprintf(“A%s”, as.character(x.data$A))),

# B = c(sprintf(“B%s”, as.character(x.data$B))),

# C = c(sprintf(“C%s”, as.character(x.data$C))),

# D = c(sprintf(“D%s”, as.character(x.data$D))),

# x = x.data$x)

 
 

x.data.header <- names(x.data)

z <- (x.data.header != “x”)

 
 

x.data.2 <- data.frame(

as.data.frame(

lapply(x.data.header[z],

function(a, x){paste(a, x[[a]], sep = “”)},

x.data)),

x.data$x)

 
 

x.data.2.mean <- lapply(x.data.header[z],

function(a, x){x <- tapply(x$x, x[[a]], mean); data.frame(x.mean = c(x), label = names(x))},

x.data.2)

 
 

names(x.data.2.mean) <- x.data.header[z]

print(x.data.2.mean)

 
 

 
 

#

old.par <- par(mfcol=c(2,length(x.data.header[z])))

lapply(x.data.header[z],

plot.summaly,

x.data.2, x.data.2.mean, ylim = c(0, 0.5))

par(old.par)

 
 

# 交互作用確認(Interaction)

#

# —————————————————————————

# old.par <- par(mfcol=c(3,3))

# plot.Interaction(“A”, x.data.2, add.flg = TRUE)

# par(old.par)

# for nextを利用してplotするとparによる複数レイアウトができないので

# layout()を使ってplotを配置する。

# layout(matrix(seq(3), rep(1, 3)), 1, 3)

p.mat <- matrix(seq(12), ncol = 3, nrow = 4, byrow = TRUE)

layout(p.mat,

widths = rep.int(1, ncol(p.mat)),

heights = rep.int(1, nrow(p.mat)))

plot.Interaction(x.data.header[-5], x.data.2, add.flg = TRUE)

# —————————————————————————

 
 

 
 

 
 

# 分散分析

result.aov <- aov(x ~ A + B + C, data = x.data)

summary(result.aov)

tapply(x.data$x, x.data$A, mean)

 
 

result.2.aov <- aov(x ~ A + B + C, data = x.data.2)

summary(result.2.aov)

# 誤差分散よりも値が小さいBの要素をプーリング

result.2.aov.2 <- aov(x ~ A + C, data = x.data.2)

summary(result.2.aov.2)

 
 

# 最小有意差:LSD(Least Significant Difference)を求める

#cal.LSD(“A”, result.2.aov, “A1”, “A2”)

result.lsd <- lapply(x.data.header[c(1,3)], cal.LSD, result.2.aov.2)

# lapply(x.data.header[z][4], cal.LSD, result.2.aov)

# debug(cal.LSD)

names(result.lsd) <- x.data.header[c(1,3)]

 
 

result.lm <- lm(x ~ A + B + C, data = x.data)

summary.lm(result.lm)

 
 

result.lm.2 <- lm(x ~ A + B + C, data = x.data.2)

summary.lm(result.lm.2)

未分類

Ubuntu18.04 でmediatombをソースからインストールする(その2)


前回に引き続き、MediatombDLNA Severを構築していたUbuntu 16.04LTS 18.04へアップグレードしたところ、Mediatombが消えてしまったので再構築した際の手順メモです。(前回の記事:Ubuntu18.04 でmediatombをソースからインストールする(その1))

ビルド環境の構築

ソースファイルをビルドする為にbuild-essentialとautoconfをインストールしてビルド環境を構築します。

$ sudo apt install build-essential

$ sudo apt install autoconf

参照:Ubuntu 18.04 Serverへ開発環境をセットアップ

依存パッケージのインストール 1


mediatombビルドする前に、mediatombが依存しているパッケージをあらかじめインストールします。

依存パッケージはUbuntu パッケージの情報を参考にしてインストールしました。


https://packages.ubuntu.com/source/artful/mediatomb

整理するとつぎのとおり。

17.10 依存パッケージ

説明

追加

18.04で追加するパッケージ

dh-autoreconf debhelper add-on to call autoreconf and clean up after the build

x

dh-autoreconf
dh-systemd debhelper add-on to handle systemd unit files – transitional package

x

dh-systemd[universe]
libavformat-dev FFmpeg library with (de)muxers for multimedia containers – development files

x

libavformat-dev[universe]
libavutil-dev FFmpeg library with functions for simplifying programming – development files

x

libavutil-dev[universe]
libcurl4-gnutls-dev development files and documentation for libcurl (GnuTLS flavour)

x

libcurl4-gnutls-dev
libexif-dev library to parse EXIF files (development files)

x

libexif-dev
libexpat-dev 以下のパッケージによって提供される仮想パッケージです: libexpat1-dev

x

libexpat1-dev
libffmpegthumbnailer-dev development files for ffmpegthumbnailer

x

libffmpegthumbnailer-dev[universe]
libflac-dev Free Lossless Audio Codec – C development library

x

libflac-dev
libmagic-dev Recognize the type of data in a file using “magic” numbers – development

x

libmagic-dev
libmysqlclient-dev MySQL database development files

x

libmysqlclient-dev
libsqlite3-dev SQLite 3 development files

x

libsqlite3-dev
libtag1-dev audio meta-data library – development files

x

libtag1-dev
libz-dev 以下のパッケージによって提供される仮想パッケージです: zlib1g-dev

x

zlib1g-dev
pkg-config manage compile and link flags for libraries

x

pkg-config
uuid-dev Universally Unique ID library – headers and static libraries

x

uuid-dev

この中からインストールされてないパッケージを追加していきます。

また、追加するパッケージの中には“universe”のリポジトリを追加する必要があるのも存在するのでリポジトリを追加してからパッケージをインストールします。

(参考:リポジトリ追加)

$ sudo apt-add-repository universe
$ sudo apt update
$ sudo apt install dh-autoreconf dh-systemd libavformat-dev
$ sudo apt install libavutil-dev libcurl4-gnutls-dev libexif-dev
$ sudo apt install libexpat1-dev libffmpegthumbnailer-dev libflac-dev
$ sudo apt install libmagic-dev libmysqlclient-dev libsqlite3-dev
$ sudo apt install libtag1-dev zlib1g-dev pkg-config uuid-dev

依存パッケージのインストール 2

更にビルドする際にあった方がよさそうなライブラリーについてもインストールします。

ここでインストールするライブラリーは無くてもビルドは可能なので必要に応じてインストールしてください。

  • libmp4-v2-dev
    $ sudo apt install libmp4v2-dev
    

mediatombのビルド


$ mkdir source
$ cd source/
$ wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mediatomb/mediatomb_0.12.1-47-g7ab7616.orig.tar.xz
$ tar -xvf mediatomb_0.12.1-47-g7ab7616.orig.tar.xz
  • mediatombのビルド
    $ cd mediatomb-0.12.1-47-g7ab7616/
    $ autoreconf --install
    $ ./configure
    
sqlite3 yes
mysql yes
libjs missing
libmagic yes
inotify yes
libexif yes
expat yes
id3lib disabled
taglib yes
FLAC yes
libmp4v2 not compatible
ffmpeg yes
ffmpegthumbnailer yes
lastfmlib yes
external transcoding yes
curl yes
YouTube yes
db-autocreate yes


configureでは次のような設定になりました。 libmp4v2が”not compatible”となっていますがビルドはできそうなのでそのまま作業を進めます。

$ make
$ sudo make install

インストールが完了すると /usr/local/bin/mediatomb にバイナリーが配置されます。

また、config.xmlについては~/.mediatomb に作成されていました。

mediatombの起動確認

configu.xml に必要な情報を設定したらmediatombを起動して正しく動作する事を確認します。

$ /usr/local/bin/mediatomb
MediaTomb UPnP Server version 0.12.2 - http://mediatomb.cc/
	
	===============================================================================
	Copyright 2005-2010 Gena Batsyan, Sergey Bostandzhyan, Leonhard Wimmer.
	MediaTomb is free software, covered by the GNU General Public License version 2
	
	2018-10-08 03:49:04    INFO: MediaTomb configuration was created in: /home/abc/.mediatomb/config.xml
	2018-10-08 03:49:04    INFO: Loading configuration from: /home/abc/.mediatomb/config.xml
	2018-10-08 03:49:04    INFO: UUID generated: 648f7c48-b52f-4b09-b494-a7ef020e1c65
	2018-10-08 03:49:04    INFO: Checking configuration...
	2018-10-08 03:49:04    INFO: Setting filesystem import charset to UTF-8
	2018-10-08 03:49:04    INFO: Setting metadata import charset to UTF-8
	2018-10-08 03:49:04    INFO: Setting playlist charset to UTF-8
	2018-10-08 03:49:04 WARNING: You enabled the YouTube feature, which allows you
	                             to watch YouTube videos on your UPnP device!
	                             Please check http://www.youtube.com/t/terms
	                             By using this feature you may be violating YouTube
	                             service terms and conditions!
	
	2018-10-08 03:49:04    INFO: Configuration check succeeded.
	2018-10-08 03:49:04 WARNING: Sqlite3 database seems to be corrupt or doesn't exist yet.
	2018-10-08 03:49:04    INFO: no sqlite3 backup is available or backup is corrupt. automatically creating database...
	2018-10-08 03:49:04    INFO: database created successfully.
	2018-10-08 03:49:04    INFO: Initialized port: 49152
	2018-10-08 03:49:04    INFO: Server bound to: 192.168.10.248
	2018-10-08 03:49:05    INFO: MediaTomb Web UI can be reached by following this link:
	2018-10-08 03:49:05    INFO: http://192.168.10.248:49152/

実行すると、上記の情報がコンソールに表示されたので問題なさそうです。

早速、webブラウザでアクセスしてみると無事にmediatombのサービスに接続できました。


libmp4v2が”not compatible” や デーモンが無いなど、いくつか課題が残っていますが、今回はDNLA経由で動画も見れるのでヨシとしました。

たぶん、課題は解決せずにgerberaを利用する方が正解だと思うので次はgerberaの環境を構築してみたいと思います。