読者です 読者をやめる 読者になる 読者になる

技術関連の覚書

案件でやったり自宅で試したことの覚書、自宅Redmineから移行

Ubuntu17.04新機能

ようやくインストールできたので動かしてみます。

まずは、VMのLiveCDの割り当てを外します。

f:id:boctok-ctpoba:20170423170701p:plain

ログインします。

f:id:boctok-ctpoba:20170423193924p:plain

デフォルトのスクリーンサイズ(800x600)なので狭いです。

f:id:boctok-ctpoba:20170423194043p:plain

設定を変更して広くします。

システム設定を開いて、 f:id:boctok-ctpoba:20170423194343p:plain

ディスプレイの設定で画面解像度を変更します。

f:id:boctok-ctpoba:20170423194830p:plain

今回の変更は、リリースノート ZestyZapus/ReleaseNotes - Ubuntu Wiki によると、

  • 32bitPPCサポートの終了

  • デフォルトDNSの名前解決がsystemd-resolved

  • 新規インストールした場合、従来のSWAPパーティションからSWAPファイルへ変更

  • カーネルバージョンが4.10

  • ドライバレスプリント

  • LibreOffice5.3

など

まず、カーネルバージョンとSWAPファイルの変更を見てみます。

f:id:boctok-ctpoba:20170423201919p:plain

この時点でtopコマンドでメモリの使用状況などを見てみます。

f:id:boctok-ctpoba:20170423202351p:plain

既にSWAPが47MBほど使われています。 確かに、ちょっと重たいかなと言う感じはあります。

LibreOffice Calcを立ち上げてみました。 SWAPが70MBくらいまで増えました。

f:id:boctok-ctpoba:20170423202832p:plain

1GBで使うには THE BEATNIKS/ちょっとツラインダ - YouTube といった感想です。

SSDを使えばもしかしたら気にならないかもしれませんが。

2GBにしてみました。 SWAPは無くなりました。

f:id:boctok-ctpoba:20170423203922p:plain

ネットワークインタフェースの設定を見るためにifconfigをたたいてみます。

f:id:boctok-ctpoba:20170423204506p:plain

net-toolsをインストールしろといってますが、Ubuntu17.04ではnet-toolsが非推奨になっています。 CentOS7を使ってる人は察しがつくと思いますが、ip addrコマンドを使ってみます。

f:id:boctok-ctpoba:20170423204855p:plain

変更されたコマンドについてはこちらを見てください(英語)。 networking:net-tools [Linux Foundation Wiki]

ドライバレスプリントはどうも自宅プリンタは IPP Everywhere Self-Certified Printers - Printer Working Group の対象になってないようで試すことはできませんでした。

最後に

Ubuntuデスクトップはメモリ1GBではちょっと重いけども2GBあれば何とか使えそうです。 自宅ノートは1GBの2coreなので、しばらくXubuntu16.10かな。

ドライバレスプリントはリストを見るとHPのプリンタに対応しているようです。

サーバの方は

となってます。(読んだだけです)

OpenStackは自分が触ってた頃からいくつか増えてるようです。 Aodh and Gnochi Trove Designate Ironic Manila Barbican(昔こんな名前のノンアルビールがあった気がする)

Ubuntu MATE 17.04 | Ubuntu MATE もリリースされているようなので、次はこれですね。

Ubuntu17.04

ダウンロードできたのでまずはVM(VirtualBox)でインストールしてみる

VMの設定は後で変えられるところはデフォルトのままでHDDのサイズは可変サイズにしておくと実際に使った分しか領域を取らないので大きくしておきます(デフォルト値は8GB)。

  • メモリ:1024MB
  • HDD:57GB
  • ビデオメモリ:16MB

f:id:boctok-ctpoba:20170422234941p:plain

f:id:boctok-ctpoba:20170422234952p:plain

f:id:boctok-ctpoba:20170422235003p:plain

f:id:boctok-ctpoba:20170422235026p:plain

f:id:boctok-ctpoba:20170422235013p:plain

f:id:boctok-ctpoba:20170422235037p:plain

設定が終わったらダウンロードしたisoファイルをストレージの光学ディスクに割り当てて起動できるようにします。

f:id:boctok-ctpoba:20170422235045p:plain

f:id:boctok-ctpoba:20170422235056p:plain

光学ディスクを仕込んだら起動

f:id:boctok-ctpoba:20170422235108p:plain

Ubuntu17.04のLiveCDが起動します。

f:id:boctok-ctpoba:20170422235117p:plain

f:id:boctok-ctpoba:20170422235124p:plain

言語を日本語にして「Ubuntuをインストール」を押下してインストール開始。

f:id:boctok-ctpoba:20170422235135p:plain

アップデートのダウンロード何かをしておくと便利だけど今回はお試しで時間短縮のためチェックはしません。

f:id:boctok-ctpoba:20170422235152p:plain

インストール先のパーティションパーティション構成もデフォルトのまま次へ。

f:id:boctok-ctpoba:20170422235224p:plain

f:id:boctok-ctpoba:20170422235238p:plain

インストールが裏で始まってますが、ここで地域の設定(タイムゾーン)を聞かれるので日本の場合はTokyoになります。

f:id:boctok-ctpoba:20170422235244p:plain

キーボードの設定と言語の設定を聞かれるので自分の環境に合わせて設定します。

f:id:boctok-ctpoba:20170422235253p:plain

管理ユーザのアカウントを作ります。 パスワードは文字数で以下のようになります。

長さ メッセージ
1~5 短いパスワード
6~7 弱いパスワード
8~9 まあまあのパスワード
10 良いパスワード
11以上 強いパスワード

ただし、同じ文字の連続の場合、8文字以上で「かんたんなパスワード」になります。

f:id:boctok-ctpoba:20170422235305p:plain

後はインストールが終わるまで待ちます。

f:id:boctok-ctpoba:20170422235312p:plain

後は再起動するとUbuntuが起動します。 実機と違ってDVDが取り出されないので(USBで起動した場合も同様ですが)再起動するときに光学ディスクから割り当てを除去しておきます。

f:id:boctok-ctpoba:20170423000426p:plain

明日は、実際に動かしてみます。

仕事効率化の追記

意外と知りたい人が多かったようなので、追加しておきます。

コマンドラインの再利用

コマンドラインはコマンドを打って実行するのですが、Windowsならbat,cmdファイル、(Powershellはあまり知りません) UNIX系ならばシェルファイルにしておいてこれを実行できる事は知ってる人は多いです。

それを再利用するためにどうしたらいいかを知らない人が意外にいました。

プログラムでもimportしたりすることで別に作ったモジュールの利用ができるようにバッチファイルやシェルファイルでもできます。

バッチファイルならcall バッチ,bash系なら. シェルファイル といった書き方で読み込めます。[c-shellはどうだったかな….]

エディタのマクロなどでも外部ファイルを読み込む仕組みがある物もあるのでそれを使って再利用する工夫をするとプログラミングでも何を共通化することで再利用しやすい作りを考える習慣が身につくと思います。

Excelドキュメント

業務上、なんでもExcel(個人的には嫌いですが)というところが多いです。

仕事なので使わざるを得ないこともありますが、マクロやVBAにするよりもJavaのPOIを使ったり、RubyならRubyXLなど(こちらは使った事ないですが)開発メンバーなら使える言語で作るという方法もあります。

このメリットは、VBAExcelにくっついてしまってるためソースがバイナリになります。 バージョン管理ツールを使ってもTortoiseSVNでセルの差分は見ることができますが、マクロやVBAは見ることができません。

ソース管理の上でもVBAよりメンテナンス性があると思います。(外部ファイルに展開してしまうと整合性の保証の問題が発生します)

また、VBAの場合はそのExcelを開く必要がありますが、Javaならjarを実行すればExcelを開かずに実行できます。 それに、JavaとかRubyはテストフレームワークもあるのでテストもできるし。

案件ごとに使う言語が違うにしてもその言語とVBAを知っている人でなく、その言語がわかれば作れたり直せたりするはずなので、そのVBAを作った人がいなくなって直せなくなったということもないかと思います。 VBAって、複雑になりがちなので。

最後に

業務上、どうしてもこっちのツールを使った方が(backlogとかRedmineでなくExcel管理表みたいに)と思う事や、こう作った方がもっとコーディング量減るのにとかがあってもそれに従わないといけないことも少なくありません。

だから、制限があってもできる範囲で工夫すると終電帰りから終電1時間前くらいまでの短縮にはなることもあります。

手作業よりは、ツールを使うことで早くなるし、ツールがなければあるもので作ると言うのは有効な手段です。 ミスも減りますしね。

作る時間はかかるけれども、使う時間は瞬時で終わるので、使いつづけるものを作ることは最終的には時間の短縮になります。

Ubuntu17.04がまだダウンロードできない

自宅に帰ってから寝るまでの間に少しずつ落としているUbuntu17.04ですが、現在1,125,570,789です。

残りおよそ400MBくらいなんですが、10MBPMくらいのペースです。

今日は日中ダウンロードして夜にはVMで試してみることくらいはしたいです。

作業効率化のためにしてること

普段作業をするときに、手間がかかるものを楽にするための仕組みはPCにはいくつかあります。

職場ではWindowsが多いのでGUIツールを使う手順がかかれていることが多いけども、コマンドプロンプトで処理する方が楽な場合もあります。 よくあるパターンは大量の単純作業

自宅にはWindowsがないので試せないですが…

(自宅PCはUbuntuです)

コマンドプロンプト

大量処理を繰り返して処理するためにはFOR文を使うと便利です。

for %variable in (<pattern>) do <command-line>
for /D %variable in (<pattern>) do <command-line>
for /R [[<drive-letter>:]<path>] %variable in (<pattern>) do <command-line>
for /L %variable in (<start>,<step>,<end>) do <command-line>
for /F ["<options>"] %variable in (<pattern>) do <command-line>

pattern のところにコマンドも使えるのでbashのようにコマンドの実行結果を元にコマンドを実行することもできます。

sqlの拡張子のファイルをpsql(Postgresql)に流して実行したい場合は

for /F %f in (dir /b *.sql) do psql -U postgres < %f

(バッチファイルの場合は%を%%にする)

bashならこんな感じです

for f in `ls -1 *.sql`; do
  psql -U postgres < ${f}
done

CREATE TABLE がテーブルごとにファイルに分かれている場合なんかには有効です。

(今やってるのは検証SQLにパラメータ追加して一気に流してログを取るといった作業です)

他にも、スタートアップにcopyやxcopyコマンドでバックアップをとるようなバッチを入れれば起動時に毎回バックアップがとれます。

よくやるのは、TortoiseSVNコマンドラインツールもインストールしておいて svn up を起動する度に実行して朝イチはソースが最新になるようにしてます。 今はドキュメントがメインですが。

エディタのマクロを使う

無料なのでサクラエディタを使うことが多いですが、秀丸エディタは変数や制御文が使えて便利です。

(現場ではサクラエディタなんですけどね)

ログファイルの余分なヘッダをカットするマクロを作ってたりします。

現物がないのですみません。

サクラエディタの場合は行数指定ができないので、1行選択か2行選択を必要回数記述して削除するように書きます。

サーバ接続にテラタームマクロを使う

サーバが大量にある場合に間違って接続するのを防止するためにもマクロを使ってそれをクリックするだけで接続するようにします。

テラタームマクロはinclude文が使えるので接続マクロに変数で指定するようにして接続情報をそれぞれのマクロに記述してincludeで呼び出すようにしています。

エディタやテラタームのマクロはそれほど複雑ではないので一度作ってみたらこんなに簡単にできると実感できると思います。

自宅では.bash_loginにVMのSNAPSHOTコマンド入れて

Ubuntu17.04

Transmissionでダウンロードしてしばらく置いていましたが、まだ0%でした…

今週末に直接ダウンロードして見たいと思います。

Javaでテストするときの話(2)

昨日の続きです

System.out.printlnで出力された文字列のAssertEquals

テストクラス

package jp.boctok.sample8.systemout;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class SystemOutTest {
    /* System.outの代用のためのByteArrayStream */
    private final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    /* 元のSystem.out */
    private final PrintStream orgOutStream = System.out;
    /* System.errの代用のためのByteArrayStream */
    private final ByteArrayOutputStream errStream = new ByteArrayOutputStream();
    /* 元のSystem.err */
    private final PrintStream orgErrStream = System.err;

    @BeforeMethod
    public void beforeTest() {
        // System.outに代用のByteArrayStreamを出力させるように設定
        System.setOut(new PrintStream(outStream));
        // System.errに代用のByteArrayStreamを出力させるように設定
        System.setErr(new PrintStream(errStream));
    }
    
    @AfterMethod
    public void afterTest() {
        // System.outを元に戻す。
        System.setOut(new PrintStream(orgOutStream));
        // System.errを元に戻す。
        System.setErr(new PrintStream(orgErrStream));
    }
    
    @Test
    public void systemPrint() {
        // System.out.printのテスト
        String text = "print out";
        System.out.print(text);
        assertThat(outStream.toString(), is(text));
        // System.err.printのテスト
        text = "print err";
        System.err.print(text);
        assertThat(errStream.toString(), is(text));
    }
}

printlnでなくprintにするのは、改行文字が入ってしまうからです。 printlnで評価する時は後ろに改行文字を付け足します。

実行すると

[TestNG] Running:
  /tmp/testng-eclipse--1818333339/testng-customsuite.xml

PASSED: systemPrint

===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@3701eaf6: 3 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@35d176f7: 5 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@3d99d22e: 4 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@63e2203c: 2 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@59e5ddf: 16 ms

f:id:boctok-ctpoba:20170420000002p:plain

System.outに設定されているPrintStreamオブジェクトを取得可能な物にすることで値を参照することができました。 この場合、元に戻すのを忘れるとその後にSystem.outやSystem.errの挙動がおかしくなるので注意しましょう。