end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

whoisとopensslコマンドで、dnsやssl証明書の有効期限を確認

当初、perl moduleでの実装を検討しましたが、 whoisとopensslコマンドの利用が、お手軽のようです。

#!/usr/local/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;
use Data::Dumper;

my @HOSTNAMES =
    qw/
       www.xxx-xxx.com
       www.yyy-yyy.co.jp
       www.zzz-zzz.jp
      /;
my $TLDS =
    {"" =>['.com', '.org', '.net'],
     "whois.jprs.jp" =>['.co.jp', '.gr.jp', '.ne.jp', '.or.jp','.jp']};

my $TIMEOUT = 10;
my $SSL_PORT = 443;
my $WHOIS_CMD = '/usr/bin/whois';
my $OPENSSL_CMD = '/usr/local/bin/openssl';

main();

sub main {
    print join("\t",
               sprintf("%-36s","HOSTNAME"),
               "DNS_DATE_Fr","DNS_DATE_To",
               "SSL_DATE_Fr","SSL_DATE_To"),"\n";
    
    for my $hostname ( @HOSTNAMES ){
        my $dns_expire_date = get_whois_expire($hostname);
        my $ssl_expire_date = get_ssl_expire( $hostname );

        print join("\t",
                   sprintf("%-36s",$hostname),
                   @$dns_expire_date,
                   @$ssl_expire_date),"\n";
    }
}

sub get_whois_expire {
    my ($hostname) = @_;
    my ($domain_tmp,$whois_host) = extract_domain($hostname);

    my $cmd;
    if( $whois_host ){
        $cmd = "$WHOIS_CMD -h $whois_host $domain_tmp |";
    } else {
        $cmd = "$WHOIS_CMD $domain_tmp |";
    }

    my @ret_lines;
    eval{
        open my $fh , $cmd or die "fail open $cmd $!";
        @ret_lines = <$fh>;
        close($fh) or die "fail close $cmd $!";
    };

    my $strp_1 = DateTime::Format::Strptime->new(pattern => "%Y-%m-%d");
    my $strp_2 = DateTime::Format::Strptime->new(pattern => "%Y/%m/%d");
    my $ret_date = ['xxxx-xx-xx','xxxx-xx-xx'];
    
    for my $ret_line ( @ret_lines ){
        if( $ret_line =~ /Updated Date: (.+)/o ){
            $ret_date->[0] =$strp_1->parse_datetime($1)->ymd;
            next;
        }
        if( $ret_line =~ /Registry Expiry Date: (.+)/o ){
            $ret_date->[1] =$strp_1->parse_datetime($1)->ymd;
            next;
        }

        if( $ret_line =~ /\[Last Update?d?\]\s+([^\s]+)/o ){
            $ret_date->[0] =$strp_2->parse_datetime($1)->ymd;
            next;
        }
        if( $ret_line =~ /\[State\]\s+Connected\s+\(([^\s]+)\)/o or
            $ret_line =~ /\[Expires on\]\s+([^\s]+)/o ){
            $ret_date->[1] =$strp_2->parse_datetime($1)->ymd;
            next;
        }
    }
    return $ret_date;
}


sub extract_domain {
    my ($hostname) = @_;

    for my $whois_host ( sort keys %$TLDS ){
        for my $tld ( @{$TLDS->{$whois_host}} ){
            if( $hostname =~ /([^\.]+)$tld$/i ){
                return ($1 . $tld, $whois_host);
            }
        }
    }
    return ("","");
}


sub get_ssl_expire {
    my ($host) = @_;

    my $cmd = join(" ",
                   "echo |",
                   "$OPENSSL_CMD s_client -connect $host:$SSL_PORT -showcerts",
                   "2> /dev/null | ",
                   "$OPENSSL_CMD x509 -dates -noout 2> /dev/null |");
    my @ret_lines;
    my $ret_date = ['xxxx-xx-xx','xxxx-xx-xx'];
    eval{
        open my $fh , $cmd or die "fail open $cmd $!";
        @ret_lines = <$fh>;
        close($fh) or die "fail close $cmd $!";
    };
    return $ret_date if $@;

    my $strp = DateTime::Format::Strptime->new(pattern => "%b %d %T %Y %Z");

    for my $response_line ( @ret_lines ){
        if( $response_line =~ /^notBefore\=(.+)/o ){
            $ret_date->[0] = $strp->parse_datetime($1)->ymd;
            next;
        }
        if( $response_line =~ /^notAfter\=(.+)/o ){
            $ret_date->[1] = $strp->parse_datetime($1)->ymd;
            next;
        }
    }
    return $ret_date;
}

システム評価指標 RASISの再整理 - R:信頼性, A:可用性, S:保守性, I:保全性, S:機密性

きっかけは、一般的な意味での「保全」とRASISにおける「保全」の違い

一般的に「保守」や「保全」と言うと、「保守=正常な状態を保つこと」と 「保全=安全な状態に保つこと」の意味で使われていると思います。

一方、RASISにおいては、「保全=データに矛盾がなく一貫性を保つ」と 定義されているので、注意が必要です。

このことが議論しているメンバーの中でずれており、 議論にならなかったので、以下のように再整理

システム評価指標を表す RASIS .

英語 日本語 概要や例
Reliability 信頼性 故障しにくさ. ≒MTBF
Availability 可用性 稼働率 = MTBF/(MTBF+MTTR)
Serviceability 保守性 MTTR
Integrity 保全 データに矛盾がなく一貫性がある
Security 機密性 不正アクセスしにくい

oracle 11.2.0 for win へ データインポート

内容は理解できていませんが、メモ

STEP1/3 DBスペース作成

SQL Plusに system または sys as dba (※)でログインし、以下を実行

SQL> CREATE TABLESPACE JSMAP DATAFILE 'c:\app\Administrator\oradata\JSMAP.dbf'
            SIZE 5000M;

※ STEP2/3 system や sys は、oracleでdefaultからあるユーザ

DB接続用ユーザ作成と権限付与

やはり SQL Plusに system または sys as dba でログインし、以下を実行。

oracleは殆ど使用したことがない為、grant文の内容は全く理解していません

SQL> create user ENQ identified by enq
       default tablespace JSMAP
       temporary tablespace TEMP;
SQL> grant DBA TO ENQ;
SQL> grant ALTER SYTEM TO ENQ;
SQL> grant connect,resource to ENQ;
SQL> grant unlimited tablespace to ENQ;
SQL> grant alter rollback segment to ENQ;
SQL> grant CREATE DATABASE LINK to ENQ;
SQL> grant CREATE TABLE to ENQ;
SQL> grant EXECUTE ON DBMS_OUTPUT to ENQ;
SQL> grant EXECUTE ON DBMS_PIPE to ENQ;
SQL> grant EXECUTE ON DBMS_SQL to ENQ;
SQL> grant SELECT ANY TABLE TO ENQ;
SQL> grant EXECUTE ON DBMS_ALERT TO ENQ;

STEP3/3 インポート実行

以下を、DOS or PowerShellより実行

DOS> cd C:\app\Administrator\prodct\11.2.0\dbhome_1\BIN
DOS> imp ENQ/enq file=c:\TEMP\ENQ.dmp log=ENQ.log buffer=10485760

(参考)インポート時のログ抜粋

最初「CREATE TABLESPACE」で指定したサイズが小さかった為か、 途中で、エラー? 警告?が表示されましたが、imp処理は完了しました。

今後、詳細を調べるかもしれませんので、参考として貼っておきます

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

エクスポート・ファイルはEXPORT:V10.02.01によって従来型パス経由で作成されました
JA16SJISTILDEキャラクタ・セットおよびAL16UTF16 NCHARキャラクタ・セットでインポートを実行します   
エクスポート・クライアントではJA16SJISキャラクタ・セットを使用します(キャラクタ・セットの変換可能)。
. ENQのオブジェクトをENQにインポートしています
. . 表                      "AIASCVT"をインポートしています      13479行インポートされました。
. . 表                     "AIBSYCVT"をインポートしています        541行インポートされました。
  :                               :                                   :
. . 表                     "ATAKTCSD"をインポートしています   22091808行インポートされました。
IMP-00017: 次の文は、Oracleエラー1659で失敗しました:
 "CREATE INDEX "IDX_AKTCSD_01" ON "ATAKTCSD" ("C_SITEN" , "C_HANSYA" , "C_TEI"
 "" )  PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 704643072 FREELISTS"
 " 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "JSMAP" NOLOGGING"
IMP-00003: Oracleエラー1659が発生しました。
ORA-01659: 6を超えるMINEXTENTSを表領域JSMAPに割当てできません。
IMP-00017: 次の文は、Oracleエラー20000で失敗しました:
 "BEGIN  DBMS_STATS.SET_INDEX_STATS(NULL,'"IDX_AKTCSD_01"',NULL,NULL,NULL,213"
 "87816,77929,99318,1,3,329983,2,0); END;"
IMP-00003: Oracleエラー20000が発生しました。
ORA-20000: INDEX "ENQ"."IDX_AKTCSD_01" does not exist or insufficient privileges
ORA-06512: "SYS.DBMS_STATS", 行3007
ORA-06512: "SYS.DBMS_STATS", 行7865
ORA-06512: 行1
IMP-00017: 次の文は、Oracleエラー1659で失敗しました:
 "CREATE INDEX "IDX_AKTCSD_02" ON "ATAKTCSD" ("C_TEI" )  PCTFREE 10 INITRANS "
 "2 MAXTRANS 255 STORAGE(INITIAL 486539264 FREELISTS 1 FREELIST GROUPS 1 BUFF"
 "ER_POOL DEFAULT) TABLESPACE "JSMAP" NOLOGGING"
IMP-00003: Oracleエラー1659が発生しました。
ORA-01659: 6を超えるMINEXTENTSを表領域JSMAPに割当てできません。
IMP-00017: 次の文は、Oracleエラー20000で失敗しました:
 "BEGIN  DBMS_STATS.SET_INDEX_STATS(NULL,'"IDX_AKTCSD_02"',NULL,NULL,NULL,213"
 "87816,53739,99318,1,3,329983,2,0); END;"
IMP-00003: Oracleエラー20000が発生しました。
ORA-20000: INDEX "ENQ"."IDX_AKTCSD_02" does not exist or insufficient privileges
ORA-06512: "SYS.DBMS_STATS", 行3007
ORA-06512: "SYS.DBMS_STATS", 行7865
ORA-06512: 行1
IMP-00017: 次の文は、Oracleエラー1659で失敗しました:
 "CREATE INDEX "IDX_AKTCSD_03" ON "ATAKTCSD" ("C_AKTSYU" , "C_AKTVER" , "C_AK"
 "TEDB" , "N_SETSMN" , "N_KOUMOK" )  PCTFREE 10 INITRANS 2 MAXTRANS 255 STORA"
 "GE(INITIAL 754974720 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TAB"
 "LESPACE "JSMAP" NOLOGGING"
IMP-00003: Oracleエラー1659が発生しました。
ORA-01659: 6を超えるMINEXTENTSを表領域JSMAPに割当てできません。
IMP-00017: 次の文は、Oracleエラー20000で失敗しました:
 "BEGIN  DBMS_STATS.SET_INDEX_STATS(NULL,'"IDX_AKTCSD_03"',NULL,NULL,NULL,213"
 "87816,86591,334,259,63598,21241754,3,0); END;"
IMP-00003: Oracleエラー20000が発生しました。
ORA-20000: INDEX "ENQ"."IDX_AKTCSD_03" does not exist or insufficient privileges
ORA-06512: "SYS.DBMS_STATS", 行3007
ORA-06512: "SYS.DBMS_STATS", 行7865
ORA-06512: 行1
. . 表           "ATAKTCSD_AA_141106"をインポートしています        425行インポートされました。
  :                           : 
. . 表                     "ATAKTRFD"をインポートしています
IMP-00058: Oracleエラー1659が発生しました。
ORA-01659: 1を超えるMINEXTENTSを表領域JSMAPに割当てできません。
. . 表              "ATAKTRFD_130213"をインポートしています        256行インポートされました。
. . 表                     "ATTEI10Y"をインポートしています
. . 表                     "ATTEIKER"をインポートしています          3行インポートされました。
IMP-00017: 次の文は、Oracleエラー1658で失敗しました:
 "CREATE UNIQUE INDEX "ATTEIKER_P" ON "ATTEIKER" ("C_JSMSTN" , "C_JSMHAN" , ""
 "C_TEI" )  PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 FREELIST"
 "S 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "JSMAP" NOLOGGING"
IMP-00003: Oracleエラー1658が発生しました。
ORA-01658: 表領域JSMAPにセグメント用のINITIALエクステントを作成できません。
IMP-00017: 次の文は、Oracleエラー20000で失敗しました:
 "BEGIN  DBMS_STATS.SET_INDEX_STATS(NULL,'"ATTEIKER_P"',NULL,NULL,NULL,3,1,3,"
 "1,1,2,0,0); END;"
IMP-00003: Oracleエラー20000が発生しました。
ORA-20000: INDEX "ENQ"."ATTEIKER_P" does not exist or insufficient privileges
ORA-06512: "SYS.DBMS_STATS", 行3007
ORA-06512: "SYS.DBMS_STATS", 行7865
ORA-06512: 行1
IMP-00017: 次の文は、Oracleエラー1658で失敗しました:
 "ALTER TABLE "ATTEIKER" ADD  CONSTRAINT "ATTEIKER_P" PRIMARY KEY ("C_JSMSTN""
 ", "C_JSMHAN", "C_TEI") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORA"
 "GE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESP"
 "ACE "JSMAP" NOLOGGING ENABLE "
IMP-00003: Oracleエラー1658が発生しました。
ORA-01658: 表領域JSMAPにセグメント用のINITIALエクステントを作成できません。
. . 表                     "ATTEINER"をインポートしています          0行インポートされました。
. . 表                     "ATTEINYK"をインポートしています
ORA-01658: 表領域JSMAPにセグメント用のINITIALエクステントを作成できません。
. . 表             "WORK_CNG_SOSHIKI"をインポートしています
IMP-00058: Oracleエラー1658が発生しました。
ORA-01658: 表領域JSMAPにセグメント用のINITIALエクステントを作成できません。
IMP-00041: 警告: オブジェクト作成の際、コンパイル・エラーが発生しました。
 "CREATE FORCE VIEW "ENQ"."AVTEIJSM"                             ("C_SITEN",""
 "C_HANSYA","C_TEI","C_TEIK","S_TEI","C_RENMEIK","S_RENMEI","K_KEIYAK","C_KEN"
 "TYP","C_SYOTYP","N_UNIT","N_UNIT1F","N_YKAMEN","N_KENMEN","N_KAISUU","K_FIN"
 "EUP","C_SYOYUU","K_TAKTEN","K_TYKHDN","C_GAIHEK","K_HINKAK","K_DENKA","N_TY"
 "KHDN","K_HINKOU","C_KYUTOU","N_TINTAI","K_KUKKBO","K_IKAN","K_IKANSK","C_IK"
 "ANSK","D_KEIYAK","D_SUEYOT","D_SUEJIS","D_HONYOT","D_HONURI","D_ZOUYOT","D_"
 "ZOUURI","C_EIGTNT","C_KEITNT","C_JISTNT","C_KOJTNT","C_KANTNT","C_KENTNT",""
 "C_INTTNT","C_EXTTNT","K_CANCEL","D_CANNIN","C_CANRIY","C_HORYUU","D_HRYTRK""
 ","C_HRRIY1","N_TMNKNJ","D_TMNJIS","C_TRHKSK","K_IMPORT","C_GENSTN","C_GENTR"
 "H","C_GENHAN","N_COUNT") AS "
 "SELECT juta.ctteikhn.c_siten   AS c_siten"
 "     , juta.ctteikhn.c_hansya  AS c_hansya"
 "     , juta.ctteikhn.c_tei     AS c_tei"
             :
 "     , enq.amjsmimp.c_genhan   AS c_genhan"
 "     , (SELECT COUNT(ctteikhn_count.ROWID)"
 "        FROM   juta.ctteikhn ctteikhn_count"
 "             , enq.amjsmimp amjsmimp_count"
 "        WHERE  ctteikhn_count.c_hansya = amjsmimp_count.c_trhksk"
 "           AND amjsmimp_count.c_genstn = enq.amjsmimp.c_genstn"
 "           AND amjsmimp_count.c_genhan = enq.amjsmimp.c_genhan"
 "           AND ctteikhn_count.c_tei    = juta.ctteikhn.c_tei"
 "           AND ctteikhn_count.c_hansya <= juta.ctteikhn.c_hansya) AS n_coun"
 "t"
 "FROM   juta.ctteikhn"
 "     , enq.amjsmimp"
 "WHERE  juta.ctteikhn.c_hansya = enq.amjsmimp.c_trhksk  (+) "
IMP-00003: Oracleエラー4043が発生しました。
ORA-04043: オブジェクトZFPZ001Bは存在しません。
制約の有効化について...
インポートは正常に終了しましたが、警告が発生しました。

msys2 + mingw for win 10 64bitで、emacs 25.3 をbuild

emacs24.5をwin10 + USキーボードへ引っ越し後、動作が不安定

先日、PC買換えに伴い、OSもwin7 → win 10(64bit)へ移行。

NTemacsは、win7で動作していた emacs-24.5-IME-patched を そのままcopyして利用していますが、どうもIMEの動作がおかしい。

  • google日本語入力の変換suggest窓が表示されない
  • IME=on/off切換え不可になることがあり、「winキー+SPACE」や「ALT+~」のおまじないで復活

のような状態。 ただ...上記2) は、win10というよりwin10 + USキーボードの影響な気もしています。

ググっても、解消につながる情報は得られないので、 試しに emacsをbuildしてみることにしました。

msys2 + mingw for win 10 64bitで、emacs 25.3 をbuild

msys2 の install

windowsunix的な環境といえば、cygwinを使用してきましたが、 今回は、msys2をinstall

参考url

といっても、msys2自体は以下のurlよりダウンロードし、 インストーラを実行するのみでOK

http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20180531.exe

msys2 の 最新化? 更新?

msys2 コンソール? / shell?を起動し、以下を実行

## パッケージ管理のDB更新とpacmanのinstall
MSYS2 $ pacman -Sy pacman

## 一旦、MSYS2 を再起動し、以下を実行

MSYS2 $ pacman --needed -S bash pacman pacman-mirrors msys2-runtime

## MinGWのinstall
MSYS2 $ pacman -S base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain

emacs 25.3 の build

参考url

【Windows/msys2】Emacs 25.3の64bit版をビルドする | The modern stone age. msys2 を使用して Windows 10 に Emacs 25.0.94.2 (IMEパッチ適用) を導入した - blechmusikの日記

buildに必要なpackageをinstall

MSYS2 $ pacman -Sy
MSYS2 $ pacman -S \
            base-devel                     mingw-w64-x86_64-toolchain \
        mingw-w64-x86_64-xpm-nox       mingw-w64-x86_64-libtiff \
            mingw-w64-x86_64-giflib        mingw-w64-x86_64-libpng \
            mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-librsvg \
        mingw-w64-x86_64-libxml2       mingw-w64-x86_64-gnutls

emacs 25.3 + IME patchのbuild

MSYS2 $ wget http://ftp.gnu.org/gnu/emacs/emacs-25.3.tar.xz
MSYS2 $ wget https://codeload.github.com/gist/8c20b904c9f5e588ba99/zip/ce3af256814df287e2da594bc55e178674353abd
MSYS2 $ unzip ce3af256814df287e2da594bc55e178674353abd
MSYS2 $ patch.exe -p0 < ../emacs-25.3-w32-ime.diff

MSYS2 $ autogen.sh
MSYS2 $ CFLAGS='-Ofast -march=x86-64 -mtune=corei7 -static' \
             ./configure --without-dbus --without-compress-install --with-modules
## ↓make       
MSYS2 $ make bootstrap

## ↓make install
MSYS2 $ make install-strip

emacs 25.3 の build

MSYS2 $ runemacs

emacsのbuildや実行は、何の問題もなく完了しましたが、 「ALT+~」でIMEに切り替わらず...

で、今回は、ここまでにしておきます

ssl化した apache 2.4 起動時のパスフレーズ入力を省略

以前のエントリの関連です apache 2.4 の ssl設定 (conf/extra/httpd-ssl.conf)のオレオレ サンプル - end0tknr's kipple - 新web写経開発

以下の5行目にある「openssl rsa」を追加で行うことで、OK。なんですけど、 方法をすっかり忘れていたので、メモ

$ cd /home/end0tknr/local/apache24/conf

$ /usr/local/openssl_1_1_0/bin/openssl genrsa -aes128 2048 > server.key
$ /usr/local/openssl_1_1_0/bin/openssl req -new -key server.key > server.csr
$ /usr/local/openssl_1_1_0/bin/openssl x509 -in server.csr -days 2000 \
    -req -signkey server.key  > server.crt

$ /usr/local/openssl_1_1_0/bin/openssl rsa -in server.key.20180602  > server.key

LibGD 2.2.5 + GD.pm for perl を centos 7へ src からinstall

以前、「最近のlibgdには、configureがない」とか言ってましたが、 そもそも、cmakeに移行していたっぽい。 README は、configureがあるような記載になっていますが...

GD (libgd)をsrcからinstall - end0tknr's kipple - 新web写経開発

で、以下の通り

GD

$ curl -LO https://github.com/libgd/libgd/archive/gd-2.2.5.tar.gz
$ tar -xvf libgd-gd-2.2.5.tar.gz
$ cd libgd-gd-2.2.5
$ less docs/README.CMAKE
$ mkdir build
$ cd build
$ cmake -DBUILD_TEST=1 ..
$ make
$ make test
$ sudo make install

GD.pm

curl -LO http://search.cpan.org/CPAN/authors/id/R/RU/RURBAN/GD-2.68.tar.gz
tar -xvf GD-2.68.tar.gz
cd GD-2.68
$ perl Makefile.PL --gdlib_config_path=/usr/local/bin/gdlib-config
Configuring for libgd version 2.1.1.
Checking for stray libgd header files...none found.

Included Features:          GD_TIFF GD_JPEG GD_FREETYPE GD_GIF GD_GIFANIM GD_OPENPOLYGON GD_UNCLOSEDPOLY GD_ANIMGIF GD_FTCIRCLE VERSION_33
GD library used from:       /usr/local
gdlib-config used:          /usr/local/bin/gdlib-config
Generating a Unix-style Makefile
Writing Makefile for GD
Writing MYMETA.yml and MYMETA.json
$ make
$ make test
$ sudo make install

fuji xerox apeos port-v c7785 のプリンタinstallをdosのbatchで行う

以下のような感じかな?

※ driver自体は fuji xerox のサイトからダウンロードしてください

@echo off
set ip_addr=10.100.???.???
set dsp_name="TEST_PRINTER"

call %~dp0\common\AutoInstall.bat
@echo off

rem +------------------------------------------
rem + 管理者権限で実行していない場合は昇格
rem +------------------------------------------

net file 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto continue )
echo ***********************************
echo 管理者として実行して下さい!!
echo ***********************************
pause
exit /b 

:continue
pushd %~dp0..\

rem +------------------------------------------
rem + 印刷ポートを作成
rem +------------------------------------------
echo 1〜2分そのままでお待ち下さい...

set ip_port=IP_%ip_addr%
IF EXIST %SYSTEMROOT%\System32\prnport.vbs (
  set PRNPORT=%SYSTEMROOT%\System32\prnport.vbs
)
IF EXIST %SYSTEMROOT%\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs (
  set PRNPORT=%SYSTEMROOT%\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs
)

rem 既存設定を削除
rundll32 printui.dll,PrintUIEntry /q /dl /n%dsp_name%
cscript %PRNPORT% -d -r %ip_port% 1>NUL 2>NUL

rem ポート作成
cscript %PRNPORT% -a -s %computername% -r %ip_port% -h %ip_addr% -o lpr -q lp

rem +------------------------------------------
rem + プリンタドライバをインストール
rem +------------------------------------------
set name="FX ApeosPort-V C7785"

SET | FINDSTR /I ^PROGRAMFILES(X86) 1>nul 2>nul
if %ERRORLEVEL%==0 (
  set inf_path="x64\ART_EX\amd64\001\FXLH3JL.inf"
) else (
  set inf_path="x86\ART_EX\i386\001\FXLH3JL.inf"
)
rundll32.exe printui.dll,PrintUIEntry /if /f %inf_path% /m %name% /r %ip_port% /b %dsp_name%

rem +------------------------------------------
rem + 通常使用するプリンタに設定
rem +------------------------------------------
rundll32.exe printui.dll,PrintUIEntry /y /n %dsp_name%


rem +------------------------------------------
rem + 認証設定等(稀に失敗する)
rem +------------------------------------------
rem start common\property.vbs %dsp_name%


popd 

samba 経由でfileを編集すると、書込みが遅いらしく、 -bash: ./foo.pl: /usr/local/bin/perl: bad interpreter: Text file busy

samba 経由でfile( perl script )を編集し、実行すると、以下のようなエラー

$ ./foo.pl
-bash: ./foo.pl: /usr/local/bin/perl: bad interpreter: Text file busy 

どうやら、実際の書込みが遅いらしい。 なので、 smb.conf に「 oplocks = no 」の設定追加。

oplocks = no による悪影響は理解していません。

$ sudo vi /etc/samba/smb.conf

[global]
  workgroup = SAMBA
  security = user
  passdb backend = tdbsam

  printing = cups
  printcap name = cups
  load printers = yes
  cups options = raw
  hosts allow = 192.168. 127.

  oplocks = no
  :

SMB::Client for perl で、SMB接続し、fileをdownload

http://search.cpan.org/perldoc?SMB

https://metacpan.org/pod/SMB

上記を参考に、次のように書きます。

use strict;
use warnings;
use SMB::Client;
use Data::Dumper;

main();

sub main {
    my $client = SMB::Client->new('//192.168.56.101/end0tknr',
                                  username => 'ないしょ',
                                  password => 'ないしょ');
    my $tree = $client->connect_tree;
    
    for my $file ($tree->find("tmp/*")) {
        printf "%-40s %s\n", $file->name, $file->mtime_string;
        if($file->name eq "COPYING.txt"){
            $tree->dnload("tmp/COPYING.txt") or die "Failed to download";
        }

#        $tree->rename("my.log", $new_filename) or die "Failed to rotate";
#        $tree->dnload('new_'$new_filename) or die "Failed to download";
#        $tree->remove($new_filename) or die "Failed to remove";
    }
}

contos 7 において GnuTLS の configureを行うと、「Libnettle 3.1 was not found.」エラー

単純に https://ftp.gnu.org/gnu/nettle/nettle-3.4.tar.gz をダウンロード後、 configure , make , make install するだけではNG。

contos 7は、64bitなOSなので、「./configure --libdir=/lib64」のように、実行することで解消

apache commons csv for javaで、文字コードを指定して読む

先程のエントリのおまけ。以下

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;


public class TestConvEncode3 {
    public static void main(String[] args) {
        String nowDir = new File(".").getAbsoluteFile().getParent();
        System.out.println("CURRENT DIR: " + nowDir);
        
        InputStreamReader isr0 = new InputStreamReader(System.in);
        
        String csvPath;
        try(BufferedReader br0 = new BufferedReader( isr0 ) ) {
            System.out.println("input csv file path below...");
            csvPath = br0.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        
        List<CSVRecord> recordList;
        
        try(BufferedReader br = 
            new BufferedReader(
                               new InputStreamReader(
//                                              new FileInputStream(new File(csvPath)),"MS932"))){
                                                     new FileInputStream(new File(csvPath)),"SJIS"))){
            CSVParser parse =
                CSVFormat
                .EXCEL                          // ExcelのCSV形式を指定
                .withIgnoreEmptyLines(true)     // 空行を無視する
                .withFirstRecordAsHeader()      // 最初の行をヘッダーとして読み飛ばす
                .withIgnoreSurroundingSpaces(true)  // 値をtrim
                .parse(br);
            
            recordList = parse.getRecords();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        
        for (CSVRecord record : recordList) {
            for(int i = 0; i< record.size(); i++) {
                System.out.println(record.get(i) );
            }
            System.out.println("");
        }
    }
}

javaでfileをUTF-8で読み、別fileMS932で書く - InputStreamReader() , OutputStreamWriter() , PrintStream()

java 文字コード 変換」でグルると、 「new String("あ".getBytes("UTF-8"), "SJIS")」の方法を見かけますが、 これは誤りで、正しくは以下のように書くはず。

その他、SJISと MS932 の文字コード(文字セット)の違いを理解できていない人もよく見かけます。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;


public class TestConvEncode2 {
    
    public static void main(String[] args) {
        File fileIn = new File(args[0]);
        
        String newFilePath =
            fileIn.getAbsoluteFile().getParent() + "/NEW_FILE.TXT";
        File fileOut = new File(newFilePath);
        
        try {
            // javaで主に使用する文字コードは、UTF-8, SJIS, MS932
            FileInputStream input = new FileInputStream(fileIn);
            InputStreamReader streamIn = new InputStreamReader(input,"UTF-8");
            BufferedReader bufferR = new BufferedReader(streamIn);
            
            FileOutputStream output = new FileOutputStream(fileOut);
            OutputStreamWriter streamOut = new OutputStreamWriter(output,"MS932");
            BufferedWriter bufferOut = new BufferedWriter(streamOut);
            
            String str;
            while((str = bufferR.readLine()) != null){
                
                try {
                    // fileへ指定した文字コードで出力
                    bufferOut.write(str);

                    // 標準出力へ指定した文字コードで出力
                    PrintStream out_ms932 =
                        new PrintStream(System.out, true, "MS932");
                    out_ms932.println(str);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            bufferR.close();
            bufferOut.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

↑こう書くと、↓こう実行できます

$ javac TestConvEncode2.java 
$ java TestConvEncode2 foo.txt 

Re: HashiCorp Vaultの基礎知識と導入

Vault by HashiCorp

HashiCorp Vaultの基礎知識と導入 | Developers.IO

  • 1) 機密情報/秘密情報を管理するためのソフトウェア
  • 2) バックエンドには、MySQLAWS S3?を利用可能
  • 3) 2015年に初回リリース

らしい。

Vaultがフロントに立ち、暗号化/複合化 を担ってくれるらしい。

1) だけ聞くと、導入したくなりますが、 2) のような中身であれば、自前実装でもよい気がします。

3)のように初回リリースから、それ程、経過していないこともあるので、 もう少し様子見