macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか

macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか

Python

Mojave

1
2
3
Python 2.7.10 (default, Aug 17 2018, 17:41:52)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

High Sierra

1
2
3
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

Pythonのバージョンは変更なし。
コンパイラのバージョンは上がっている。

perl

Mojave

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

High Sierra

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

perlのバージョンは変わらない。

PHP

Mojave

1
2
3
PHP 7.1.19 (cli) (built: Aug 17 2018 18:03:17) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

High Sierra

1
2
3
PHP 7.1.16 (cli) (built: Mar 31 2018 02:59:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

細かいバージョンが上がっている。

Ruby

Mojave

1
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

High Sierra

1
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]

Rubyのバージョンは変わらない。

sqlite3

Mojave

1
SQLite version 3.24.0 2018-06-04 14:10:15

High Sierra

1
SQLite version 3.19.3 2017-06-27 16:48:08

細かいバージョンが上がっている。

まとめ

今回もPythonのバージョンアップはなかった。
macOSの何らかのプログラムがPython2に依存しているのだろうか。

同じタグの記事
同じカテゴリの記事

perl正規表現で制御コードを除去する

perl正規表現で制御コードを除去する

RSSの収集をオリジナルのプログラムで行っている。
稀に制御コードが入っていることがあった。
制御コードが入っていると、オリジナルプログラムで利用しているXML::Simpleが異常終了してしまう。

なので、不要な制御コードを除去してからXML::Simpleを利用したい。

1
2
3
4
5
6
7
8
use LWP::Simple qw(get);
use XML::Simple;

my $url = "http://www.xxx.yyy/feed.rdf";
my $xml = get($url);
$xml =~ s/[[cntrl:]]//g;
my $xs = Xml::Simple-new;
my $obj = $xs->XMLin($xml);

これで制御コードが入ったRSSでも処理できるようになった。

同じタグの記事
同じカテゴリの記事

perlワンライナー

perl ワンライナー

大きなファイルが存在する。この大きなファイルの中の特定の文字列を置き換えたい。
perl ワンライナーの出番。

1
$ perl -pe 's/xxx/X01/g;s/yyy/X02/g' in_file > out_file

これでxxxはX01に、yyyはX02に置換される。
本当は、こんな単純な条件で置換してしまうと、余計なところまで置換されそうなので、もう少し悩む必要がある。

ちなみに、perlのオプションの-eが直後のコマンドを実行するということ。-pはファイルを読み込んで出力すること。

ここまで簡単な編集なら、awkでもできる。

1
$ awk '{gsub("xxx", "X01");gsub("yyy", "X02");print}' in_file | tee out_file

gsubが文字列置換。検索対象文字列には正規表現が利用できる。
subという関数もあるが、こちらは最初のマッチのみを置換する。
gsubは3つ目の引数に置換対象の文字列をしていできるが、省略すると$0が入る。
printも引数を省略すると$0が入るので、行ごとに処理し、置換が終わったら出力される。

teeは標準入力をファイルに出力するコマンド。 > out_fileでも良いとは思うが、一応コマンドを使っておく。

同じタグの記事
同じカテゴリの記事

macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか

macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか

macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか。

python

High Sierra

1
2
3
Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

Sierra

1
2
3
Python 2.7.10 (default, Feb  7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

pythonバージョンは変更なし。
コンパイラのバージョンは上がっている。

perl

High Sierra

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

Sierra

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

perlのバージョンも変更なし。

PHP

High Sierra

1
2
3
PHP 7.1.7 (cli) (built: Jul 15 2017 18:08:09) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

Sierra

1
2
3
PHP 5.6.30 (cli) (built: Feb  7 2017 16:18:37)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

なんと、 PHP5からPHP7へ。

sqlite3

High Sierra

1
SQLite version 3.19.3 2017-06-27 16:48:08

Sierra

1
SQLite version 3.16.0 2016-11-04 19:09:39

sqlite3はバージョンが上がっているけど、これがどこにどう影響するかがわからない。

まとめ

バージョンが上がっているスクリプト言語もあった。
本当はPythonが3系列になっていると嬉しかった。

同じタグの記事
同じカテゴリの記事

perlで日付を扱うならTime::Piece

perlで日付を扱うなら、Time::Pieceがお勧め。
time()とlocaltime()を使って処理するよりも、簡単に日付を加工できる。

現在を得る

1
2
use Time::Piece;
my $t = localtime;

日付をフォーマットする

1
print $t->strftime('%Y/%m/%d %H:%M:%S');

日付の要素を個別に取得する

1
2
print $t->year;
print $t->mon;

月末日を取得する

print $t->month_last_day;

日付の足し算

1
2
use Time::Seconds;
$t + ONE_DAY * 5 # 5日間足しこむ

文字列の日付をTime::Pieceに変換する

1
2
my $d = Time::Piece->strptime('20170803', 'Y%%m%d');
my $t = Time::Piece->strptime('2017/08/03 15:30:20', '%Y/%m/%d %H:%M:%S');

どの処理も、localtime関数で行うと、だらだらと記述しなくてはならないところが一発でできてしまう。
お勧めします。

同じタグの記事
同じカテゴリの記事

バッチ処理の基本・ファイル入出力

バッチ処理の基本といえば、ファイル入出力。
最近は、DBアクセスが基本となっているが、システム間連携などは、未だにファイル連携が多い。
連携されてきたファイルを直接取り込んでも良いけど、あまりにも格好悪いファイルは、事前にある程度整えておきたい。
そんな時に、バッチ処理が役立つ。
私がよく使い言語は、下記の4つ。それぞれの言語で、1つのファイルを読んで、1つのファイルを出力する雛形を置いておく。

1.pythonの場合(最近は、pythonでチョチョっと加工することが多いかも)

1
2
3
4
5
6
import codecs
with codecs.open('in.txt', 'r', 'utf_8') as r, codecs.open('out.txt', 'w', 'utf_8') as w:
    counter = 0
    for line in r:
        counter += 1
        w.write('{:03d}:{}'.format(counter, line))

とても簡潔に、描きたいロジックだけを書くことができます。

2.javaの場合(Javaで作らないと実行の承認が通らない時はJavaで作ります)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.lang.String;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.BufferedReader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.StandardOpenOption;

public class FileIo {
    public static void main(String[] args) {
        try (
            BufferedReader r = Files.newBufferedReader(
                    Paths.get("in.txt"), StandardCharsets.UTF_8);
            Writer w = Files.newBufferedWriter(
                    Paths.get("out.txt"), StandardCharsets.UTF_8,
                    StandardOpenOption.WRITE,
                    StandardOpenOption.APPEND,
                    StandardOpenOption.CREATE)
        ) {
            String line = null;
            int counter = 0;
            while((line = r.readLine()) != null) {
                counter++;
                w.write(String.format("%03d:%s\n", counter, line));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

昔に比べれば、だいぶシンプルに書けるようにはなったけど、冗長な感じがする。
しかし、実行速度は結構速い。Java7以降は性能をほとんど気にせずコーディングしても、それなりのスピードで動いてくれる。

3.C#の場合(実行環境がWindowsの場合はC#で作ればだいたい動く)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Text;
using System.IO;

public class FileIo
{
    public static void Main()
    {
        try
        {
            using(StreamReader r = new StreamReader("in.txt", Encoding.GetEncoding("UTF-8")))
            using(StreamWriter w = new StreamWriter("out.txt", false, Encoding.GetEncoding("UTF-8")))
            {
                int counter = 0;
                while(r.Peek() >= 0)
                {
                    counter++;
                    w.WriteLine(string.Format("{0:000}:{1}", counter, r.ReadLine()));
                }
            }
        }
        catch (Exception e)
        {
            Console.Write(e.StackTrace);
        }
    }
}

Visual Studioがなくても、気合いでC#を簡単なテキストエディタでコーディングして、
.Net Framework付属のcscでコンパイルし実行できます。
特別な環境がなくても動くあたりは素晴らしい。

4.perlの場合(ファイル入出力はやっぱり速い。Pythonでは性能が出ない時はperlで実装)

1
2
3
4
5
6
7
8
9
10
use strict;
open my $r, '<:encoding(utf8)', 'in.txt';
open my $w, '>:encoding(utf8)', 'out.txt';
my $counter = 0;
while (<$r>) {
    $counter++;
    printf $w "%03d:%s", $counter, $_;
}
close $r;
close $w;

perlもシンプルに書けて良い。ただし、最近のredhatはperlがインストールされていない
こともあるので、必ずインストールされているPythonでツールを作ることが多くなった。
perl実行環境は、WindowsでもLinuxでもOracleがインストールされていると、その中に大概入っている。
そのperl実行環境を利用するのも良い。Oracleインストール領域に入っているので、perlからOracleに接続してDB操作するのも簡単。

python,java,c#はcloseの心配がない構文が用意されているのが良い。
perlはcloseを明示的に行う必要がある。
python,perlは目的のロジックに集中してコーディングができる。
Java,C#は定義部分が多くて。
VisualStudioやEclisepに頼って簡単にコーディングできたとしても、
メイン処理以外が多いのは、後から読んだ人にとってもメンテナンスしづらいかも。

同じタグの記事
同じカテゴリの記事