くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

BATファイルで特定フォルダ以下の特定の拡張子のファイルに対して処理を実行する方法

例として以下の条件で考えます。

  • フォルダ: Desktop
  • 拡張子: *.txt

このとき、Desktopフォルダ以下の*.txtファイルの一覧は以下のコマンドで表示できます。

dir /s /b Desktop\*.txt

/sは再帰検索、/bはファイル名のみ表示するオプションです。少し気持ち悪い指定ですが、これでDesktop以下の全てのサブディレクトリに存在する*.txtファイルを表示できます。

ファイル一覧が表示できたので、この結果をfor文に渡します。 例として、ファイルリストの前後にAAABBBを付けてechoします。

for /f "usebackq tokens=*" %%i in (`dir /s /b Desktop\*.txt`) do @echo AAA %%i BBB

これで echo AAA %%i BBBにファイル一覧が渡り、前後にAAABBBが付きました。

BATファイルでBOM付きUTF-8ファイルからBOMを取り除く方法

検証環境

Windows10 64bit

方法

input.txt からBOMを取り除いて、 out.txt テキストを出力する場合

start /min /wait cmd /c chcp 65001 ^& cmd /u /c type input.txt ^> $$$ ^& cmd /c type $$$ ^> out.txt ^& del $$$

コマンド自体は参考にしたところのほぼコピーですが、参照元には解説がなかったので分かる範囲で解説します。

解説

まずは各コマンドや引数を/?などで確認

  • start /min /wait外部プロセスでコマンドを起動(start)。ウィンドウを最小化(/min)、実行が終わるまで待つ(/wait)。
  • cmd /c コマンドプロンプトを起動し、引数に渡された文字列のコマンドを実行し終了する(/c)。
    • &はコマンドの実行が終わったら次のコマンドを実行するの意味。bashで言うところの ;
    • ^はコマンドプロンプトのエスケープシーケンス
    • ^& はエスケープされて文字列になった&
    • ^>はエスケープされて文字列になった>
  • chcp 65001 コマンドプロンプトの文字コードをUTF-8に変更する。(デフォルトはShiftJIS)
  • cmd /uは、内部コマンドの出力結果Unicodeパイプまたはファイルに出力するオプション
    • デフォルトは/a(ANSI)
  • typeコマンドはテキストファイルの内容を出力する内部コマンド
    • catみたいなもの
    • ShiftJISでもUTF-8でもUnicodeでも何でも読めるみたい

まとめるとこんなステップになります。

  • コンソールの文字コードをUTF-8にする
  • Unicodeのモードでinput.txtを開き、$$$に保存
    • $$$ファイルは「BOM付きUnicode」になる
  • ANSIのモードで$$$を開き、out.txtに保存
    • ANSIのモードではBOMが付かないため、BOMが外れる(現象からの予想)
    • out.txtは「BOMなしUTF-8」になる
  • $$$ファイルを削除

ANSIのコマンドプロンプトでUTF-8のファイルをtypeしてリダイレクトしてもBOMは外れない模様。 (文字コードが同じだから変換が発生しない?) なので、一旦unicodeを経由して変換することで無理やりBOMを取り外してるみたい。

参考

【COBOL】Bash on Ubuntu on WindowsでCOBOL

ちょっとネタ記事ばかり書いてしまったので、まともな記事を書こうと思います。

このブログのアクセス解析をしたところ、ダントツのアクセス数を叩き出しているのはこの記事でした。

www.kunst1080.net

つまり、WindowsでCOBOLを動かす、ということには需要がある!!

というわけで、Bash on Ubuntu on Windows(以後「BoW」)でCOBOLを動かしてみました。 以前はMSYS2MinGWで動かしていましたが、そのときよりも若干セットアップは簡単です。

概要

COBOLのコンパイラをインストールし、簡単なCOBOLのプログラムをコンパイル・実行できるところまでを検証します。

検証環境

Windows 10 Pro 64bit

  • バージョン 1703
  • ビルド:15063.13

※Creators Update後のWindows10です

また、BoWは既に使えるようになっている前提です。セットアップ方法はこの辺り(Bash on Ubuntu on Windowsをインストールしてみよう! - Qiita)を参考にすればよさそう。

セットアップ手順

opensource COBOLのインストール

OSSコンソーシアムのサイト(https://www.osscons.jp/osscobol/)から、opensource COBOL1をダウンロードします。

wget "https://www.osscons.jp/osscobol/files/?action=cabinet_action_main_download&block_id=414&room_id=21&cabinet_id=11&file_id=380&upload_id=759" -O opensource-cobol-1.5.1J.tar.gz

ビルドに必要なライブラリをインストールします。
(何が必要か、ということは README に書いてありました)

$ sudo apt-get install build-essential libgmp-dev libdb-dev libncurses5-dev

解凍

$ tar -xvf opensource-cobol-1.5.1J.tar.gz

ビルドとインストール

$ cd opensource-cobol-1.5.1J
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

ldconfig しないと、libcob.so.1が見つからない旨のエラーが発生してしまいます

確認

$ cobc
cobc: No input files

と表示されればインストールが成功しています。

作業フォルダの作成

BoWとWindowsで連携しながら開発を行うため、Windowsのエクスプローラから作業フォルダを作成します。

作業フォルダを C:\work\cobol に作成した場合、BoWからは /mnt/c/work/cobol のパスで参照できます。

BoWを作成した作業フォルダまで移動します。

$ cd /mnt/c/work/cobol

検証用ソースの作成

検証用のソースを適当なエディタで作成します。 文字コードはShiftJISにしてください。改行コードはLFでもCRLFでもどちらでも大丈夫です。

C:\work\cobol\test1.cbl

       IDENTIFICATION DIVISION.
       PROGRAM-ID. test1.
       ENVIRONMENT DIVISION.
      *
       DATA DIVISION.
      *
       WORKING-STORAGE SECTION.
       01  FILLER.
            03 TEST-X.
             10 VAR         PIC X(14).
             10 END-POINT   PIC X(01) VALUES '/'.
            03 TEST-9.
             10 VAR         PIC 9(08).
             10 END-POINT   PIC X(01) VALUES '/'.
            03 TEST-S.
             10 VAR         PIC S9(07).
             10 END-POINT   PIC X(01) VALUES '/'.
            03 TEST-COMP3.
             10 VAR         PIC S9(09)V9(2) COMP-3.
             10 END-POINT   PIC X(01) VALUES '/'.
            03 TEST-N.
             10 VAR         PIC N(09).
             10 END-POINT   PIC X(01) VALUES '/'.
            03 TEST-B.
             10 VAR         PIC S9(4) COMP.
             10 END-POINT   PIC X(01) VALUES '/'.
      *
       PROCEDURE DIVISION.
       MAIN-RTN.
           PERFORM EDIT-RTN.
           PERFORM OUTPUT-RTN.
           MOVE 9 TO RETURN-CODE.
       EXIT.
       STOP RUN.
      *
       EDIT-RTN SECTION.
           MOVE 'This is X Type'        TO VAR OF TEST-X.
           MOVE 12345678                TO VAR OF TEST-9.
           MOVE -12345                  TO VAR OF TEST-S.
           MOVE 123456789.12            TO VAR OF TEST-COMP3.
           MOVE 'こんにちは、世界!'    TO VAR OF TEST-N.
           MOVE 38533                   TO VAR OF TEST-B. *> 38533 = 0x9685 = '妹'
       EXIT.
      *
       OUTPUT-RTN SECTION.
           DISPLAY 'TEST-X    :'    TEST-X.
           DISPLAY 'TEST-9    :'    TEST-9.
           DISPLAY 'TEST-S9   :'    TEST-S.
           DISPLAY 'TEST-COMP3:'    TEST-COMP3.
           DISPLAY 'TEST-N    :'    TEST-N.
           DISPLAY 'TEST-BYTE :'    TEST-B.
       EXIT.
      *

実行準備

COBOLソースやファイルにはShiftJISのファイルを扱うことを想定していますが、BoWの文字コードはUTF-8です。なので、そのままプログラムを実行すると出力が文字化けしてしまいます。 文字化けを解消するためのツールとして nkf をインストールしておおきます。

$ sudo apt-get install nkf

コンパイルと実行

検証用のソースをコンパイルします。

$ cobc test1.cbl

test1 というファイルができます。

ひとまず、そのまま実行してみます。

$ ./test1

実行結果

TEST-X    :This is X Type/
TEST-9    :12345678/
TEST-S9   :001234u 
TEST-COMP3:4Vx,/  
TEST-N    :ɂ́AEI/
TEST-BYTE :/

このように、日本語の部分が文字化けしてしまっています。

出力結果に nkf を通すことで文字化けを解消できます。 もう一度実行してみましょう。

$ ./test1 | nkf

実行結果

TEST-X    :This is X Type/  
TEST-9    :12345678/  
TEST-S9   :001234u/  
TEST-COMP3:4Vx/  
TEST-N    :こんにちは、世界!/  
TEST-BYTE :妹/

日本語の文字化けが解消されました。 (pack項目はそもそもバイナリなのでこのままです。)

参考URL


  1. 執筆時のバージョンは v1.5.1J

Bash on Ubuntu on WindowsでMastodonを動かす方法

Bash on Ubuntu on WindowsでMastodonを動かします。

Mastodonを動かすついでにRedisとPostgreSQLも動かすので、興味のある方は是非読んでみて下さい。

セットアップ

セットアップの手順については、公式のドキュメント(Production guide)1を参考にします。

必要なパッケージのインストール

$ sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git curl

Node.jsのインストール

$ wget https://deb.nodesource.com/setup_7.x
$ sudo bash setup_7.x
$ sudo apt-get install nodejs
$ sudo npm install -g yarn

Redisのインストール

$ sudo apt-get install redis-server redis-tools

PostgreSQLのインストールとDBの設定

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

$ sudo apt-get install postgresql postgresql-contrib

設定のためにサービスを起動

$ sudo service postgresql start

データベースの設定

$ sudo su - postgres
$ psql
$ CREATE USER mastodon CREATEDB;
$ \q

(このタイミングで一度、適当なSQLクライアントで接続確認をしておくと安心です)

サービスの停止

$ sudo service postgresql stop

Rbenv

mastodon ユーザになって、rbenvと ruby 2.4.1 をインストールします。

ユーザーの作成

$ useradd -m mastodon
$ sudo su - mastodon
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

mastodonユーザでrbenvのインストール

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ source ~/.bash_profile
$ rbenv install 2.4.1

mastodonユーザでmastodonリポジトリの取得

$ git clone https://github.com/tootsuite/mastodon.git live
$ cd live
$ git checkout $(git tag | tail -n 1)

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

$ gem install bundler
$ bundle install --deployment --without development test
$ yarn install --pure-lockfile

設定ファイルの編集

設定用シークレットキーの生成

$ rake secret
$ rake secret
$ rake secret

設定ファイルの書き換え

$ cp .env.production.sample .env.production
$ vim .env.production

書き換えた項目は以下の分だけです。 (今回は手元で動かすだけなので、メールの設定などは省略)

REDIS_HOST=localhost
DB_HOST=localhost
LOCAL_DOMAIN=localhost
LOCAL_HTTPS=false
PAPERCLIP_SECRET=<rake secretで生成したシークレットキーの値>
SECRET_KEY_BASE=<rake secretで生成したシークレットキーの値>
OTP_SECRET=<rake secretで生成したシークレットキーの値>

データベースの初期化

$ RAILS_ENV=production bundle exec rails db:setup

アセットのプリコンパイル

$ RAILS_ENV=production bundle exec rails assets:precompile

サービス起動スクリプトの作成

公式ドキュメントではmastodonの各種サービスは systemd を使って動かすようになっています。しかしながら、BoWでは systemd が使用できません。
(おそらく、systemdで利用しているudevが、devtmpfs未実装のために動かないため?)
systemd が使えないので、代わりに普通の起動スクリプトを作成します。

mastodon-web.sh

#!/bin/bash

user="mastodon"
working_directory="/home/mastodon/live"
environment="RAILS_ENV=production PORT=3000"
exec_start="/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb"

sudo -i -u $user sh -c "cd $working_directory && $environment $exec_start"

mastodon-sidekiq.sh

#!/bin/bash

user=mastodon
working_directory=/home/mastodon/live
environment="RAILS_ENV=production DB_POOL=5"
exec_start="/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push"

sudo -i -u $user sh -c "cd $working_directory && $environment $exec_start"

mastodon-streaming.sh

#!/bin/bash

user=mastodon
working_directory="/home/mastodon/live"
environment="NODE_ENV=production PORT=4000"
exec_start="/usr/bin/npm run start"

sudo -i -u $user sh -c "cd $working_directory && $environment $exec_start"

アカウントを承認するコマンドの準備

今回はメールの設定をしないため、アカウントを承認するためにコマンドを実行する必要があります。ユーザーを切り替えたりすると面倒なので、起動スクリプトと同様、シェルスクリプトにまとめておきます。

confirm.sh

#!/bin/bash

user="mastodon"
working_directory="/home/mastodon/live"
environment="RAILS_ENV=production"
exec_start="/home/mastodon/.rbenv/shims/bundle exec rails mastodon:confirm_email USER_EMAIL=$1"

sudo -i -u $user sh -c "cd $working_directory && $environment $exec_start"

mastodonの起動

準備ができたので、サービスを順番に立ち上げていきます。

Redis

$ sudo service redis-server start

PostgreSQL

$ sudo service postgresql start

Mastodon (ターミナルを3枚開き、それぞれで起動すると挙動が見えて面白いです)

$ sudo ./mastodon-web.sh &
$ sudo ./mastodon-streaming.sh &
$ sudo ./mastodon-sidekiq.sh &

注意: ターミナルを全て閉じるとサービスが停止してしまうため、最低1枚はBoWの画面を開いておいて下さい

表示確認

http://localhost:3000 へアクセスすると、おなじみのmastodonのサインアップ画面が表示されます。

f:id:kunst1080:20170526211146p:plain

アカウント登録の後、アカウントを承認するコマンドで承認します。(インスタンスは立ち上げたままで大丈夫)

$ sudo ./confirm.sh <登録したメールアドレス>

これでログインできるようになりました。
ログイン後、サムネイル画像を設定したりトゥート!してみた後の画像はこちらです。

f:id:kunst1080:20170526211204p:plain

以上、こんな感じでした。

参考URL

Bash on Ubuntu on WindowsでUbuntuのchrootコンテナを作成する方法

概要

Creators Updateによって、Bash on Ubuntu on Windows (BoW) へ chroot を使ってUbuntuのコンテナを作成できるようになりました。ここでは、その手順を説明します。

※この記事の内容は、過去のエントリ(Bash on Ubuntu on Windowsのchrootを試してみた - くんすとの備忘録)の一部を切り出し一部修正を加えたものです

セットアップ手順

手順は1~5まであります。

1. 必要なパッケージのインストール

# apt install debootstrap

2. debootstrapを使ったUbuntu環境のダウンロード

違いがわかりやすいように、XenialではなくVividを入れます。

# debootstrap vivid /srv/chroot/vivid http://ftp.riken.go.jp/Linux/ubuntu/

3. resolv.confのコピー

# cp -L /etc/resolv.conf /srv/chroot/vivid/etc

4. デバイスのマウント

bashの全ての窓を閉じると設定し直しになるので注意

# cd /srv/chroot
# mount -t proc none vivid/proc
# mount -t sysfs none vivid/sys
# mount -o bind /dev vivid/dev

5. ログイン

# chroot /srv/chroot/vivid /bin/bash

確認・検証

uname

コンテナの外側

# uname -a
# cat /etc/lsb-release

f:id:kunst1080:20170525233527p:plain

コンテナの内側

# uname -a
# cat /etc/lsb-release

f:id:kunst1080:20170525233543p:plain

ということで、Ubuntu(Vivid)のコンテナ環境が作成されたことがわかります。

アプリケーションを入れてみる

リポジトリの追加

# sed -i.BK 's/$/ restricted universe multiverse/' /etc/apt/sources.list
# apt update

Gitのインストール

# apt install git

軽く動作検証

git clone https://github.com/vuejs/vue.git

f:id:kunst1080:20170525233613p:plain

OK

Rubyのインストール

# apt install ruby

軽く動作検証

# ruby -e 'open("/etc/lsb-release").readlines.collect{|l| puts l.downcase}'

f:id:kunst1080:20170525233626p:plain

OK

Node.jsのインストール

# apt install nodejs

軽く動作検証

# nodejs -e 'var fs = require("fs"); fs.readFile("/etc/lsb-release", "utf8", function(err, text) { 
  console.log(text.toLowerCase())
})'

f:id:kunst1080:20170525233637p:plain

参考URL

BATファイルにシェルスクリプトを埋め込む方法

Bash on Ubuntu on Windowsによって、Windowsでカジュアルにbashを利用することが出来るようになりましたよね。 しかしながらシェルスクリプトを直接実行することはできないようです。(パスの形式が違うので関連付けで実行できない)

ということで、BATファイルに埋め込めるようにしてみました。

# ---------- SHELL ---------- # 以降に実行したいシェルスクリプトを記述します。

ShellScript in Windows BAT

※改行コードはLFにしておく必要があります。

実行結果

f:id:kunst1080:20170424234845p:plain

こんな感じで引数も渡せます。

参考

Bash on Ubuntu on Windowsで簡単にフォルダを開くためのショートカットスクリプト

を書きました。

macのopenコマンドのように、ターミナルから今いる場所や引数で指定したファイルをエクスプローラで開くことができます。

※Windowsの管理しているフォルダにいるときのみ
※そうでないときは %USERPROFILE% が開く

open explorer in Bash on Ubuntu on Windows (BoW)