2018年7月26日木曜日

アドセンス、amazonアフェリエイト審査などへの準備。NGワードへの気遣い

アフェリエイトのNGワードを探す。できるだけ多くの人に誤解のない表現を心がける。Linux的な作法で解決する。

3行コマンドを切り貼りするだけで、チェック箇所がわかります。

アドセンス、amazonアフェリエイトなどに限らず審査はよくわからないですが、意識していないくても機械的なのかなんなのかはわかりませんが、審査に通らない要因と予測できる場合、うっかり一部の人が不快に思う表現がはいっているかもしれません(ここでは議論しても仕方ないという前提で進めます)。「機械のスイッチをKILL」する、PSで探してプロセスをKILLなどのUNIXの手順を全面的に日本語で実直に書いてしまった場合。確証はありませんが、サツバツとしすぎて、NGになるかもしれません。大工さんなどでも、「はめ..し」など。

以下は、Linuxは当然そのまま使えますし、MAC OS Xの方も大丈夫かと思います。不足しているコマンドがもしあれば導入すればよいです。Windows10の方は、WSLを導入するのが最近の流行りかもしれません。WSLとはマイクロソフト提供のWindows 10のLinux互換環境です。もっとも情報が多いので、初心者の方は具体的にはubuntuを選べばよいと思います。

検索しながらだとこの作業はなかなか時間がかかりますので、さくっとダウンロードしてどうするか検討しましょう。手順はおおまかに次の通りです。

●ローカルにブログのミラーを作る。
●ローカルで検索して、対象記事を見つける。
●ネット上のブログツールで修正する。

とすると捗ります。WEBだけでやっていると時間が大変です。ローカルの検索が確実なのです。Googleまかせではいまいちで、Bloggerで全部ヒットしませんでした(?!)。そこで考えたのです。100ページを手動(マウス)で検査しますとどんなに高速なCPU,ネットワークでも2時間はかかります。実際3時間は必要だと思いますが。さすがにあほらしくなってきたので。短時間で処理できるようにしてみました。例を示します。

以下blogspot.com 例を示します。$の緑文字行がコマンドです。
対象ブログ100ページ位をダウンロードするとする。作業ディレクトリを作り、そこに移動し、一括取得コマンドwget を発行。しばらく待ちます。

作業ディレクトリを作成し、そこに移動し、ミラーを作成するコマンドwgetで一括取得
$ mkdir blogcheck && blogcheck
$ wget  https://poorダミーpoor.blogspot.com/ -r -p ./
... しばらくすると全部ダウンロードし終わる。 
そのままのディレクトリで。perlコマンドなどで探します。

ワードを探してみる。
「群青のさつ意」をNGワードと仮定します。あくまで例です。さつは漢字。
$ perl -lnE '/群青のさつ意/ and say "L $.\t$&\t$ARGV"' **/*
L 386275 群青のさつ意 poorダミーpoor.blogspot.com/grep-perl.html

などと次の順番で表示される。

L行番号      ヒットした文字           URL(正確には一部です)



このURLをchromeブラウザに貼り付け、ブログHTMLエディターなどで修正します。chromeがうまいことやってくれます。chromeブラウザでCTRL+Fで検索して個数を確認しつつ作業しましょう。


群青のさつ意 のところに、タヒ などと書き換えていくと、配慮したほうがよい箇所が見つかるかもしれませんよ。

たとえば「この暑さ、軽くタヒねますね」 などという気にもしていない表現が見つかるかもしれません。

本稿の意図は、察してください。悪夢のような...狩りではございません。

grep -R '群青' **/* に慣れていればこれでも。Perlで処理すると発展的にいろいろできるので、Perlの例をよい見本として提示しています。 

おまけ::正規表現でまとめて:: 「夢 順調 可能性 藍」をまとめて検索する。


$ perl -lnE '/夢|順調|可能性|藍/ and say "L $.\t$&\t$ARGV"' **/*


2018年7月22日日曜日

Python のスクリプトをPerlで修正する。Python2をPython3対応にするプチ事例

PythonソースコードをPerlでさくっと修正してみる

新規にターミナル(端末)。CTRL+ALT+T

2to3 という、 「Python 2.x のソースコードを読み込み、一連の 変換プログラム を適用して Python 3.x のコードに変換するプログラム」がありますので、本来の目的用ではなく、Perlのワンライナー活用例として示しています。


元のファイル、python000.py (Python2用 3行ファイル)

# coding: utf-8
print "パイソン世界2から3への代表的な例::2to3が用意されている\n覚えておくといいかも。"

exit()

実行

$ python2 python000.py
パイソン世界2から3への代表的な例::2to3が用意されている
覚えておくといいかも。

Python3で実行しようとすると怒られる。
$ python3 python000.py
                                          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print

なるほど、printの扱いが変わったのですね。これを修正します。修正の仕方も教えてくれる親切Pythonです。

$ perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py

1) プリント行を()で囲む仕様変更。
2) # coding: utf-8 は不要なので削除する。

まとめて実行、1ライナーで修正して保存、そのまま実行
$ perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py | tee python003.py && echo "終 実行"; python3 python003.py
print ("パイソン世界2から3への代表的な例::2to3が用意されている\n覚えておくといいかも。")
exit()
終 実行
パイソン世界2から3への代表的な例::2to3が用意されている
覚えておくといいかも。

$ python3 python003.py

としても当然同じなので、これでOK。

まとめ::結局bash上の使い方事例なのです

perl -wlpe 's/\b(print)\b.*\"(.*)\"/$1 ("$2")/;s/\# coding: utf-8//' ./python000.py |\
 tee python003.py \ 
 && echo "終 実行";\
 python3 python003.py
パイプ、接続をばらして説明すると
1行目、PerlでPrintする内容を正規表現でキャプチャしておいて、Python3仕様に変換。不要なUTF-8行を削除
2行目、Tee で結果(Python3で動く内容)を出力しつつ新たなファイル(python003.py)に保存する
3行目、作業が終わった目印を出力して(冗長:なくてもよい)
4行目で、Python3で新規に生成されたスクリプトファイル(python003.py)を引数として実行して、動作することを確認する。
こういう流れですね。teeはなくてもこまらないけれど、ないとめんどくさいコマンドかなと思います。地味に便利な子です。



2018年7月17日火曜日

perl で行番号 cat

テキストファイルに行番号を付ける

新規にターミナル(端末)。CTRL+ALT+T

行番号をつけてファイルを出力
perl -lne 'print "$. :: $_"' テキストfile


解説::

次をターミナルで実行してみるとよくわかります。

sed --help | perl -lne 'print "$. :: $_"' 

伝統的UNIXでは、

nl 
cat -n

で同様のことはできますが、Perlのように自由にフォーマットを指定できる柔軟さはありません。当職はPerlしか利用しなくなりました。


コラム::Perlの特殊変数

$. は行番号
$_ はループで読み込まれる、この場合、行のことです。

デフォルトでは改行単位の行ごとに処理するのがPerlです。ここでは触れませんが複数行単位でも、全体をひとつのファイルとしてでも、容易に処理できる柔軟さがPerlにはあります。

ちなみにPerl6では今現在 $.に相当する特殊変数がありませんので、カンタンには書けません。

Perlで文字列置換 sed

テキストファイルの文字列を置換する

新規にターミナル(端末)。CTRL+ALT+T

最も単純な置換処理
perl -lpe 's/対象文字/置換後文字/g' テキストfile


解説::
最期の/gでグローバルに全部置換。gがなければ最初に見つかったひとつのみ置換。

オプション::
l 自動chomp。改行を除去するなど行処理をいいかんじにしてくれる。
p ループ構造で実行してくれる。この場合Whileループがたった1文字で実現。
e 以下を計算式、命令として実行。この例は置換ですがそれ以外も使えます。
E にすると、sayなどが使えますので、Eで覚えたほうがいまどきいいかも。 
Perlがワンライナーでいいかんじに処理してくれる好例です。gは常に付ける癖にしておいて、不要な時のみ外すようにしたほうが捗ると思います。

複数置換は、置換命令を連続して重ねていけばだいじょうぶ
perl -lpe 's/対象文字/置換後文字/g;s/対象文字/置換後文字/g;s/対象文字/置換後文字/g' テキストfile

Perlの置換の書式は、sedと同じです。sed/viに倣って設計されているからです。

大量の置換処理が必要な場合は、sed同様ワンライナーよりもスクリプトファイルをテキストエディターで作成して実行するほうが得策です。

Perlの使い始めのうちは、こうしたものはパターンとしておぼえてしまうと楽かと思います。

最大のメリットはPerlを使うことでPerlの正規表現だけ覚えればOKということです。sedであれば微妙に動作が違うわけだし、OS問わず同じですから。めんどうを回避できます。

sedを超えるPerlのsed風味な機能は別稿にします。

おまけ:: Perl6 で正規表現テスト
ls | perl6 -pe 's:g/^.*?\.(.*)$/$0/ ;'

ファイルがいくつかあるディレクトリで実行してみるとよいです。ファイル名は置換されません。画面の結果だけですのでご安心を。

カレントにあるファイルのファイル頭からドットまでを削除して表示。ドットがなければそのフィアルをそのまま表示。

Perl5との違いは、キャプチャかっこの番号が0からになっている点。この場合のgは不要ですが、前に来ます。:が必要です。など。複雑になっていくとPerl5のようにはいきません。デリミタの自由度はとても高いです。


2018年7月1日日曜日

perlrange::指定範囲を抜き出すコマンド | シェル変数を受け取る::bash関数

Perlで範囲を抜き出す。特定範囲のみ加工する。

日本語ドキュメントの取り扱いが主ですが、用語と用語、行番号と用語などで範囲を想定し、Perlに備わっている機能を使ってテキストファイルから行を抜き出すのに、こんな風に使っています。

sオプションでシェル変数を受け取ります。関数やスクリプトにする場合に覚えておくと便利です。この関数は、Zsh/Bash共通でいけると思います。

新規にターミナル(端末)。CTRL+ALT+T
#
使い方
perlrange 範囲始まりに含まれる行の単語  同じく終わりの行の単語

.bashrc などにぺったんする。

function perlrange () {
        # s オプションでシェル変数受け取れる。qw注意。
        # if [ $# -ge 1 ]; then
        if [ $# -eq 2 ]; then
                perl -nse "print if /$1/ .. /$2/"
           

        else
            echo 説明....

            echo 範囲A-Bを入力。Bが存在しなければ最後まで。
        fi
     }



余談

perl -ne 'print if 10 .. 12'
10行目から12行めから抜き出す。正規表現にしなければ$_行番号になります。

perl -ne 'print if 10 .. /マンゴージュース/'
10行目からマンゴージュースまで抜き出す。正規表現と行番号も組み合わせできます。
 
cd ~ 
ls | sort -r | perlrange Pic Desktop
なんて2行タイプするとイメージがつかめていいかもしれません。