a stray sheep

お仕事周りの雑記帳

IlleagalException: failed to obtain node locks,

elasticsearch.bat 実行時エラー

学習用に elasticsearchプロセスの2つ目を実行した際に、以下のエラーが出た。

> elasticsearch.bat
...
「IlleagalException: failed to obtain node locks, tried 
[[C:\temp\elasticsearch-6.2.3\data\elasticsearch]] with lock id [0]; 
maybe these locations are not writable or multiple nodes were started 
without increasing [node.max_local_storage_nodes] (was [1])?」
...

対処

node.max_local_storage_nodesについて

エラーメッセージにある「node.max_local_storage_nodes」を調べてみる。 www.elastic.co

node.max_local_storage_nodes の説明

data pathは、複数のノードで共有される、異なるクラスタのノードでもね。 これは、開発マシンでのフェールオーバーや異なる設定をテストするのにとても役立つ。 しかし、商用では、サーバごとにElasticsearchノードを1つにすることを推奨する。

デフォルトでは、Elasticsearchは、同じdata pathを共有することからノードが1つ以上になることを避けるように設定されている。 1つ以上のノードを許容するには、node.max_local_storage_nodesの設定を1より大きい自然数(a positive integer)にする。

パラメータを設定して起動

> elasticsearch.bat -Enode.max_local_storage_nodes=2
...

起動できました

手元のGit環境をメモ

自分のノートPCのGit環境をメモっとく。

Git for windowsのインストール

ダウンロード

opcdiary.net 参考:石坂さんという方が書かれた最高に詳しい記事です。

Select Component ⇒デフォルト

f:id:belial6:20180325161539p:plain:h300

エディタ選択 ⇒デフォルト

f:id:belial6:20180325161536p:plain:h300

PATH設定 ⇒gitをパスに追加して、コマンドプロンプトから使えるようにしとく

f:id:belial6:20180325161533p:plain:h300

⇒デフォルト

f:id:belial6:20180325161530p:plain:h300

改行コード ⇒何もしない設定

f:id:belial6:20180325161527p:plain:h300

ターミナル ⇒デフォルト

f:id:belial6:20180325161709p:plain:h300

オプション ⇒シンボリックリンクも追加しとく

f:id:belial6:20180325161705p:plain:h300

TortoiseGitのインストール

ダウンロード

SSHクライアント ⇒デフォルトのPuTTyベース

f:id:belial6:20180325171516p:plain:h300

コンポーネント ⇒デフォルト

f:id:belial6:20180325171513p:plain:h300

日本語パックのインストール

⇒最後に、「この言語を使ってセットアップ」にチェックをつける

f:id:belial6:20180325171510p:plain:h300

Gitの環境設定

  • メールアドレスは自分のプライベートをさらしたくないので、ダミーを使う

    ダミーアドレスは、Githubにログイン後、Settings→Emailで、「Keep my email address private」をチェックして、そこに表示されているアドレスのこと。

コマンドプロンプトで、コミットに使う名前、メアドを設定する

> git config --global user.name "名前"   //githubのアカウント名にしとく
> git config --global user.email "xxxxxxxx+名前@users.noreploy.github.com"
> git config --global core.quotepath false   //日本語ファイルの文字化け対応

VirtualBoxで仮想マシン(Linux)作成後にすぐに外部に接続する方法

VirtualBox仮想マシン作成後にすぐに外部に接続する方法

#久々に触るとすぐに忘れてしまうので。

環境は、CentOS7、家

1) NICの設定を開く

# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

2) ONBOOTの設定

ONBOOT=yes

3) ネットワークを再起動

# systemctl restart network

これですぐにyumできます。

以上

CentOS7の自動ディスクパーティションで作られたLVMを縮小/拡張する

CentOS7のインストール時に、ディスクの構成でデフォルトの「自動ディスクパーティション」を選択すると、パーティションサイズが「/」が50GBで、「/home」が150GBといった状態になってしまう。

この状態を解消するために、「/home」を縮小し、「/」を拡張する手順をメモする。

 2020.04.22 追記
縮小と書いていたが、正確には削除して小さく再作成する、ということです。
なので、もともとデータが入っている場合はバックアップ等で退避しておく必要があります。


以下のサイトを参考にさせていただきました。こちらを読めば大丈夫です^^
qiita.com

確認した環境

仮想化ソフト: VirtualBox 5.1.28
ゲストOS: CentOS 7.4
仮想ディスクサイズ: 80GB

手順

以下、手順を記述するが、コマンドの出力結果は省略している場合があります。

ディスクの状態を確認

//ディスクドライブの使用状況を確認する
# df -Th
/Filesystem               Type   Size   Mounted on
/dev/mapper/centos-root   xfs     50G   /
/dev/sda1                 xfs   1014M   /boot
/dev/mapper/centos-home   xfs     27G   /home

//論理ボリュームを確認する
# lvdisplay
...
LV Path     /dev/centos/home
LV Name     home
VG Name     centos
LV Status   available
LV Size     26.99GiB

...
LV Path     /dev/centos/root
LV Name     root
VG Name     centos
LV Status   available
LV Size     50.00GiB

//ボリュームグループを確認する
# vgdisplay
VG Name        centos
VG Size        <79.00GiB
PE Size        4.00MiB
Total PE       20223
Alloc PE/Size  20222 / 78.99 GiB ※80GBは割り当て済み
Free  PE/Size  1 / 4.00 MiB
...

LVMディスクの開放

//アンマウント
# umount /dev/mapper/centos-home

//ボリュームの利用を停止する
# lvchange -a n /dev/centos/home

//論理ボリュームを確認する
# lvdisplay
...
LV Path     /dev/centos/home
LV Name     home
VG Name     centos
LV Status   NOT available ※利用不可となった
LV Size     26.99GiB

//論理ボリュームを削除する ※データも消えてしまうので注意
# lvremove /dev/centos/home
  Logical volume "home" successfully removed

//ボリュームグループを確認する
# vgdisplay
VG Name        centos
VG Size        <79.00GiB
PE Size        4.00MiB
Total PE       20223
Alloc PE/Size  13312 / 52.00 GiB ※割り当て済みは80GB→52GBに減少
Free  PE/Size  6911 / 27.08 GiB ※空き領域ができた
...

論理ボリューム「home」を作成

削除した論理ボリューム「/home」をサイズ指定で再作成する。

//論理ボリュームを作成
# lvcreate -L 10G -n home centos
WARNING: xfs signature detected on /dev/centos/home at offset 0. Wipe it? [y/n]:
y ※とりあえず「y」を入力
   Wiping xfs signature on /dev/centos/home.
   Logical volume "home" created.

//ファイルシステムを作成
# mkfs.xfs /dev/centos/home
...

//マウントする
# mount /dev/centos/home

//ボリュームグループを確認する
# vgdisplay
VG Name        centos
VG Size        <79.00GiB
PE Size        4.00MiB
Total PE       20223
Alloc PE/Size  15872 / 62.00 GiB ※/homeに10G割り当てた分増加
Free  PE/Size  4351 / 17.08 GiB ※残った17GBをこのあと「/」に割り当てる
...

空き領域を割り当てる

/dev/centos/rootに残りの空き領域を割り当てる

//空き領域を割り当てる
# lvextend -l +100%FREE /dev/centos/root
  Size of logical volume centos/root changed from 50.00 GiB (12800 extends) to <67.00 GiB (17151 extents).
  Logical volume centos/root successfully resized.

//XFSファイルシステムの拡大(これをしないとサイズは増えない)
# xfs_growfs /dev/mapper/centos-root
...

//ディスクドライブの使用状況を確認する
# df -Th
/Filesystem               Type   Size   Mounted on
/dev/mapper/centos-root   xfs     67G   /   ※「/」は50G→67Gに拡張された
/dev/sda1                 xfs   1014M   /boot
/dev/mapper/centos-home   xfs     10G   /home ※「/home」は27G→10Gに縮小された


以上

容量固定の仮想マシンを作成する

Hyper-V Server 2012R2上で、容量固定の仮想マシンを作成する手順をメモしておく。

Step1. 空の仮想マシンを作成

  1. Hyper-Vマネージャー上で、「新規」→「仮想マシン」を選択する。
  2. 「名前と場所の指定」画面で、仮想マシン名と、仮想マシン構成ファイルの格納先を指定する。
  3. 「世代の指定」画面で、仮想マシンの世代を選択する。
    ・第1世代: 従来のバージョンと同じ
    ・第2世代: 仮想ハードウェア構成が見直された新しい仮想マシン。使用可能なゲストに制限あり。
  4. 「メモリの割り当て」画面で、仮想マシンに割り当てるメモリ量を設定する。
  5. 「ネットワークの構成」画面で、仮想スイッチを選択する。
  6. 「仮想ハードディスクの接続」画面で、”後で仮想ハードディスクを接続する”を選択する。
  7. 最後に、完了を選択して、終了する。

 

Step2. 仮想ハードディスクの格納先ディレクトリを作成

  1. 空の仮想ハードディスクを作成する前に、格納先のディレクトリを作成する。
    仮想マシン名\Virtual Hard Disks

Step1で仮想ディスクを作っていないので、仮想マシンディレクトリ内にはVirtual Hard Disksは存在しません。

 

Step3. 容量固定の仮想ハードディスクの作成

  1. Hyper-Vマネージャ上で、「新規」→「ハードウェア」を選択する。
  2. 「ディスクフォーマットの選択」画面で、仮想ハードディスクのフォーマット形式を選択する。
    VHD  #従来の形式で、2040GB以下の仮想ハードディスクが作れる。第2世代仮想マシンでは使えない。
    ・VHDX #最大64TBの仮想ハードディスクが作れる。WS2012よりサポートなので、それ以前では使えない。
  3. 「ディスクの種類の選択」画面で、”容量固定”を選択する。
  4. 「名前と場所の指定」画面で、仮想ハードディスクの名前と場所を指定する。
    ・場所には、Step2 で作成した「仮想マシン名\Virtual Hard Disks」を選ぶ。
  5. 「ディスクの構成」画面で、「新しい空の仮想ハードディスクを作成する」を選択し、最大サイズを指定する。
  6. 最後に「完了」をクリックする。

 

Step4. 仮想マシンに仮想ハードディスクを接続

  1. 仮想マシンの設定を開き、IDEコントローラを追加する。
  2. IDEコントローラの参照先に、Step3で作成した仮想ハードディスクのパスを指定し、容量固定の仮想ハードディスクを接続する。

 

以上

 

Raspberry Piで天気予報をしゃべる

ラズパイがしゃべってくれたので、今度はWebから天気予報を取得してしゃべってもらいたいと思います。

全体はこちらを参考にしました。
raspi.seesaa.net

jsayコマンドの作成は、上記リンク内のこちらを参考にしました。
raspi.seesaa.net

jsayコマンドの作成

スクリプト作成

$ sudo vi /usr/local/bin/jsay

#!/bin/sh

CMDNAME=`basename $0`
sleep 1
if [ $# -lt 1 ]; then
    echo "Usage: ${CMDNAME} [ text ]" 1>&2
    exit 1
fi

# 定数定義(出力ファイル名、辞書の場所、音声データの場所)
TMPFILE=`mktemp /tmp/tmp.XXXXXXXX.wav`
DIC=/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.08/
VOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice

### こちらでも良いです
#DIC=/var/lib/mecab/dic/open-jtalk/naist-jdic

# 音声データ生成
echo "$1" | open_jtalk \
-x ${DIC} \
-m ${VOICE} \
-ow ${TMPFILE} && \

# 生成した音声データを再生する
aplay --quiet ${TMPFILE}

# 生成した音声データを削除する
rm -f ${TMPFILE}

# 終了
exit 0

しゃべる

$ sudo chmod +x /usr/local/bin/jsay

$ jsay こんにちは

しゃべった!OK!

天気予報をしゃべるスクリプト作成

スクリプト作成

$ sudo vi talk_weather.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import shlex
import subprocess

from datetime import datetime

import urllib2
import json

CMD_SAY = 'jsay'

def main():
    say_datetime()
    say_weather()
    return

def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    text = CMD_SAY + ' ' + text
    print '**********************'
    print text
    print '**********************'
    proc = subprocess.Popen(shlex.split(text))
    #proc = subprocess.Popen(shlex.split(text), shell=True)
    proc.communicate()
    return

def say_weather():
    city = '120010'
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1'
    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'

    try:
        r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
        obj = json.loads( unicode(r.read()) )

        title = obj['title']
        forecasts = obj['forecasts']

        # TODAY
        cast = forecasts[0]
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        tommorow_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])

        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt
        weather_str = weather_str.encode('utf-8')

        text = '''%s '%s' ''' % (CMD_SAY, weather_str)
        print text
        proc = subprocess.Popen(shlex.split(text))
        #proc = subprocess.Popen(shlex.split(text), shell=True)
        proc.communicate()
    finally:
        r.close()

    return

### Execute
if __name__ == "__main__":
    main()

実行

$ python talk_weather.py

**********************
jsay 71日、14290秒
**********************
jsay '千葉県 千葉 の天気 今日の天気は曇時々雨です。 明日の天気は曇りです。
明日 の予想最高気温、28度、予想最低気温、23度です。'

やったー。Webから取ってきた天気予報をしゃべったーー。



さて、次は何をしようかな。

Raspberry Piでしゃべってみる

スピーカーから音を出せたので、今度はラズパイにしゃべらせたいと思います。

参考にしたのはこちら。
途中の「日本語音声合成システム(Open JTalk)のインストール」からやっています。

qiita.com

Open JTalkのインストー

Open JTalk本体のインストー

$ sudo apt-get install open-jtalk
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libhtsengine1
提案パッケージ:
  open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
以下のパッケージが新たにインストールされます:
  libhtsengine1 open-jtalk
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
187 kB のアーカイブを取得する必要があります。
この操作後に追加で 542 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libhtsengine1 armhf 1.08-1 [38.0 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main open-jtalk armhf 1.07-2 [149 kB]
187 kB を 1秒 で取得しました (148 kB/s)
以前に未選択のパッケージ libhtsengine1 を選択しています。
(データベースを読み込んでいます ... 現在 112429 個のファイルとディレクトリがインストールされています。)
.../libhtsengine1_1.08-1_armhf.deb を展開する準備をしています ...
libhtsengine1 (1.08-1) を展開しています...
以前に未選択のパッケージ open-jtalk を選択しています。
.../open-jtalk_1.07-2_armhf.deb を展開する準備をしています ...
open-jtalk (1.07-2) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
libhtsengine1 (1.08-1) を設定しています ...
open-jtalk (1.07-2) を設定しています ...
libc-bin (2.19-18+deb8u10) のトリガを処理しています ...

提案パッケージのインストー

$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  hts-voice-nitech-jp-atr503-m001 open-jtalk-mecab-naist-jdic
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
10.9 MB のアーカイブを取得する必要があります。
この操作後に追加で 68.2 MB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main open-jtalk-mecab-naist-jdic all 1.07-2 [10.1 MB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/contrib hts-voice-nitech-jp-atr503-m001 all 1.05-1 [764 kB]
10.9 MB を 2秒 で取得しました (4,331 kB/s)
以前に未選択のパッケージ open-jtalk-mecab-naist-jdic を選択しています。
(データベースを読み込んでいます ... 現在 112445 個のファイルとディレクトリがインストールされています。)
.../open-jtalk-mecab-naist-jdic_1.07-2_all.deb を展開する準備をしています ...
open-jtalk-mecab-naist-jdic (1.07-2) を展開しています...
以前に未選択のパッケージ hts-voice-nitech-jp-atr503-m001 を選択しています。
.../hts-voice-nitech-jp-atr503-m001_1.05-1_all.deb を展開する準備をしています ...
hts-voice-nitech-jp-atr503-m001 (1.05-1) を展開しています...
open-jtalk-mecab-naist-jdic (1.07-2) を設定しています ...
hts-voice-nitech-jp-atr503-m001 (1.05-1) を設定しています ...

Open JTalkを使用する

テキストファイルを音声ファイルに変換して、音声を出力します。

テキストファイル作成

$ vi voice.txt

こんにちは

音声ファイルに変換

$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001
/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow
test.wav voice.txt

音声ファイルを実行

$ aplay test.wav

おー、しゃべった!すごい!!

スクリプト

$ jsay.sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay --quiet $TMP
rm -f $TMP

//権限付与
$ chmod 755 jsay.sh

//実行
$ ./jsay.sh こんにちは

女性の声に変えてみる

音声ファイルを取得する

最新版は1.7でした。

$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
--2017-06-25 10:41:29--  http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
downloads.sourceforge.net (downloads.sourceforge.net) をDNSに問いあわせています... 216.34.181.59
downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://jaist.dl.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip [続く]
--2017-06-25 10:41:29--  https://jaist.dl.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
jaist.dl.sourceforge.net (jaist.dl.sourceforge.net) をDNSに問いあわせています... 2001:df0:2ed:feed::feed, 150.65.7.130
jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)|2001:df0:2ed:feed::feed|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 12650627 (12M) [application/octet-stream]
`MMDAgent_Example-1.7.zip' に保存中

MMDAgent_Example-1. 100%[=====================>]  12.06M  4.25MB/s 時間 2.8s

2017-06-25 10:41:32 (4.25 MB/s) - `MMDAgent_Example-1.7.zip' へ保存完了 [12650627/12650627]

//解凍
$ unzip MMDAgent_Example-1.7.zip

//meiフォルダ配下を/usr/share/hts-voice/にコピー
$ sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/

jsay.shを修正して、jsay_w.shを作成

$ jsay_w.sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/mei/mei_happy.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay --quiet $TMP
rm -f $TMP

//実行
$ ./jsay_w.sh こんにちは

メイちゃんの声に変わりました!