「R」を使ってみた

こんにちは、イメージマジック三浦です。最近はChatGPTで大騒ぎですが、今回は「R」を紹介します。

「R」とは

「R」は統計解析向けのプログラム言語・その開発実行環境を併せた総称です。統計学的な操作を行うためのメソッドが充実しています。特に計算式をプログラムに落とし込むような手間がなく、統計的な要件に対しては、とても使いやすいツールです。
プログラム言語と言いつつも、専門の書籍は数学関係の場所に置いてあることが多いです。

インストール

Rの公式サイトから「Download」の下にある「CRAN」をクリックすると、各国用のミラーサイトに遷移できます。遷移先のサイトから、Windows, macOS, Linux用のインストーラをダウンロードできるようになっています。 Rだけでも十分使えますが、RStudioを使うと便利です。画面表示は全部英語ですが、日本語を扱うことに問題はなく十分に使いやすいツールです。

サンプルプログラム

詳しい説明は省略しますが、参考として単回帰分析を行うコード例を出します。
data<-read.csv(
    "./_data/sample_data.csv",
    encoding = 'UTF-8',
    stringsAsFactors = F,
    header=T
)
x <- data$dataX
y <- data$dataY
result <- lm(y~x)
summary(result)
分析用のデータをきちんと準備すれば、これだけのコード量で単回帰分析を実行できます。仮に単回帰分析の導出式をプログラム言語で実装しようとすれば、サンプルコードの数倍くらい必要になるかもしれません。

計算の前後が大事

Rは、分析用データを準備すれば計算を実行して結果を返してくれますが、結果の品質はデータの準備度合いに依存します。例えば分析用データに以下のようなものが混ざっていれば、結果の精度が落ちてしまいます。
  • 全体的な傾向から逸脱しているデータがある
  • 分析に使うデータ量やパラメータが適切でない
  • データに抜けがある
このようなデータを除くために「前処理」という工程が存在し、「前処理」だけで1冊専門書が出るくらいの内容があります。 計算後にしても、予想通りの結果が得られたのか予想と異なる結果が得られたかを検証し、状況次第では分析の見直し等が必要になってきます。

まとめ

強力な機能を備えるRですが、出てきた結果を鵜呑みにせず、結果が本当に正しいかを吟味することが必要だと思います。そうできるように、これからも精進あるのみです。

目当てのIPアドレスを探せ

ある日、ネットワーク内につないだ機器のIPアドレスが現地で分からなくなったので、調べてほしいと依頼がありました。当日は力技で何とかしましたが、もっと楽にできることあったので、振り返ってみます。

前提条件

幸いなことに、今回問題のネットワークでは、以下の点が分かっていました。
  • 現地の機器をつないでいるネットワークへアクセスできるサーバーに、本社オフィスからアクセスできた。
  • 探すべきIPアドレス帯は第3オクテットまで固定、かつ第4オクテットの範囲が決まっている。
  • IPアドレスを指定してwgetが成功することで、そのIPが当たりと言える。
これなら何とかなりそうです。

当日の手段:力業

当日は仕方なかったので、こんなシェルスクリプトを書いて、見つかったらCtrl+Cで対応しました。
wget -t 1 -T 3 --spider http://X.X.X.1/hogehoge;
wget -t 1 -T 3 --spider http://X.X.X.2/hogehoge;
・・・
wget -t 1 -T 3 --spider http://X.X.X.99/hogehoge;
wget -t 1 -T 3 --spider http://X.X.X.100/hogehoge;
IP1個につき1回wgetし、3秒待機するコマンドを第4オクテットとして考えられる範囲分(上の例なら100行分)を書いています。URLの存在チェックができれば十分だったので、–spiderを付けました。最初から1行ずつ実行していくだけのコマンドです。 コマンド自体は表計算ソフトで量産できますが、都度作るのは煩雑です。一発でできるようにしたいです。

次回からはこれを使う:ワンライナー

xargsを使うことで、ワンライナーで実行できます。
$ seq 1 100 | xargs -I@ wget -t 1 -T 3 --spider http://X.X.X.@/hogehoge;
seqコマンドで生成された数を、xargs以下に渡しています。X.X.X.@ のアットマーク分がxargsの引数で変化し順次実行していきます。これで目標とした検索が実現できます。 1から順に確認して見つけたらCtrl+Cで止めるのは、力業と同じです。

Ctrl+Cを使わない方法はあるか

Ctrl+Cで止めない方法も考えたいと思って、for文でコマンドを試作してみました。
## 1から順番に数を調べて、3の倍数になったらループを抜ける例。
for v in `seq 1 10`; do if [ $((v % 3)) -eq 0 ]; then echo fuga; break; else echo $v; fi; done
実際書いてみると、単語が込み入って見づらいと感じました。これなら、素直にシェルスクリプトファイルにした方が見やすそうです。よりよい方法があるかもしれませんが、今回はこれ以上の調査を見送ります。

余談

「ワンライナー」という言葉を使いましたが、似た感じの言葉で「リニア」があります。「ライナー」と「リニア」の違いが気になって調べてみました。
  • ライナー(liner)
    • 定期運行する交通機関
    • 「京成スカイライナー」「おはようライナー」の「ライナー」はこちらの意味
  • リニア(linear)
    • 一直線に伸びた感じの意味
    • リニアモーターカー linear motor car
    • 線形代数学 linear algebra

同じ名前で中身がちがうもの

こんにちは。イメージマジック三浦です。 最近めっきり寒くなってきました。体調には十分に気を付けてください。今日は「同じ名前で中身がちがうもの」と題して書いてみます。

アニメの場合

アニメ作品では、異なる登場人物を同じ声優が担当することがあります。 最近一番驚いたのは、アニメ「ルパン三世」の次元大介役の声優交代の話です(本投稿執筆時点の約3か月前にインターネット記事で出ています)。交代前後の声優は以下の通りです。
  • 交代前:小林清志さん
  • 交代後:大塚明夫さん
お二人はOVA「機動戦士ガンダム0083 STARDUST MEMORY」にて、「デラーズ・フリート」という陣営の上官と部下として共演されています。
  • 小林清志さん:エギーユ・デラーズ
  • 大塚明夫さん:アナベル・ガトー
記事を見て 「次元大介の声が デラーズからガトーへ 受け継がれるか」と感じました。 「デラーズからガトーへ」というキーワードでインターネット検索すると、この声優交代の情報が出てくるところに反響の大きさを感じました。 劇中、2人の登場人物には深い信頼関係があったので、熱い気分になりました。

PowerShellの場合

話はPowerShellに変わります。こちらは、はまりポイントになったという話です。

きっかけ

Windows11がWindows Updateから利用できるようになったのを受けて、自分の作業用PCをWindows11にアップグレードしました。 そのPCで自社開発アプリの動作確認を実施していましたが、アプリの1つでPowerShellスクリプトが動かないエラーが出ました。
このシステムではスクリプトの実行が無効になっているため、ファイル XXXX を読み込むことができません。
PowerShellの実行権限が無いときに出るエラーメッセージです。

調査してみる

実行権限の不足ということで、普段使っているPowerShellでLocalMachineに「RemoteSigned」を設定してみたが動きません。
PS C:\> Get-ExecutionPolicy LocalMachine
RemoteSigned
PS C:\>
OS再起動しても動きません。 アプリを開発したメンバーにも確認しましたが「PowerShell」の権限設定に問題はなさそうでした。 Windows11ではPowerShellを起動するときに何か特殊な対応が必要なのか?と思って一度は諦めました。

謎が解けた

後日、アプリのログファイルに「PowerShell.exe」と出ているのを見つけて、自分のPCに2種類のPowerShellがいることに気づきました。

2種類の「PowerShell」

2種類のPowerShellとは以下の通りです。
  • Window10プリインストール版
    • PowerShell5.1
    • プロセス名は「powershell.exe」
  • 普段使っているPowerShell(後でインストールした後継版)
    • PowerShell7.2
    • プロセス名は「pwsh.exe」
「powershell.exe」 と「pwsh.exe」は、それぞれでスクリプト実行権限を管理していて、一方で権限を開放しても他方に反映されません。 「普段使っているPowerShell」=「pwsh.exe」で権限を開放しても、「powershell.exe」には一切効果なし。そして 「powershell.exe」 がスクリプト実行権限を開放していなかったので、
このシステムではスクリプトの実行が無効になっているため、ファイル XXXX を読み込むことができません。 
が延々と出ていました。実際に「powershell.exe」で実行権限を開放したら、無事に動きました。

「謎」の正体

今回の謎の正体は「PowerShell違い」でした。幸いにして特殊な対応は不要でした。

2つのPowerShellの見分け方

最後に2つのPowerShellの見分け方をご紹介します。
※本記事執筆当時、三浦の作業用PCで確認した動作です。Windows UpdateやPC本体の設定により異なる可能性があります。

起動直後のメッセージ

  • powershell.exe は「新機能と改善のために最新の PowerShell をインストールしてください!」とメッセージを表示します。
  • pwsh.exe は「PowerShell 7.2.0」のように、バージョン番号を先頭行に表示します。

バージョン番号

このコマンドでPowerShellのバージョン番号が分かります。
$PSVersionTable | find --% "PSVersion"
powershell.exe
PS C:\> $PSVersionTable | find --% "PSVersion"
PSVersion                      5.1.22000.282
PS C:\>
pwsh.exe
PS C:\> $PSVersionTable | find --% "PSVersion"
PSVersion                      7.2.0
PS C:\>

最後に

PowerShell5.1, PowerShell7.2, どちらも「PowerShell」と呼んで間違いではないので、混乱したという話でした。
「PowerShell」と呼ばれる異なるバージョンのアプリが同居している可能性を常に考えておきたい、と思った出来事でした。 本日は以上です。 2022.06.02 誤字脱字を訂正しました。

どっちなの問題

こんにちは、イメージマジック三浦です。
弊社本社がある小石川一帯は最近大きいビルの建設が終わり、テナントも入り始めてきました。工事はまだまだ継続中ですが、工事が終わったらどんな街になっているのか気になります。
最近解釈が分かれやすい表現は極力避けたいと感じた例を見かけたので、人によって解釈が分かれる、または分かれやすい例を「どっちなの問題」と名付けて書いてみます。

こんな数式を見かけました

いきなりですが、四則演算の問題です。以下の式を計算するといくつになるでしょうか。
6÷2(1+2)
回答は2通りに分かれるそうです。
説1:6÷2(1+2)=3×3=9
説2:6÷2(1+2)=6÷6=1

真実が実は2つ?

回答が2通りに分かれるポイントは、カッコの中を計算した後の掛け算と割り算をどういう順番で扱っているかです。「2(1+2)」は「2×(1+2)」の掛け算記号が省略されているのですが、省略される掛け算を扱う優先順位が異なることで答えが2説出てきます。
  • 説1:カッコの中を計算した後、左から順番に割り算と掛け算を実行する。
  • 説2:カッコの中を計算した後、省略されている掛け算を優先して実行し、その後で割り算を実行する。

プログラム言語での扱い方

コンピューターではこの数式をどう処理するのか調べてみましたが、そもそもプログラム言語では掛け算記号の省略表記ができませんでした。参考として、手元にあるpython3.7で省略表記しようとした時のTraceback・説1の結果を出す式表記・説2の結果を出す式表記を書いた結果を掲載します。
(結果が少数表記になる点は、ここでは考慮しないことにします。)
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> 6/2(1+2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>>
>>> 6/2*(1+2)
9.0
>>>
>>> (6/2)*(1+2)
9.0
>>>
>>> 6/(2*(1+2))
1.0
>>>
カッコをつけることで、掛け算・割り算の優先順位が明示されています。

正しい答えはどっち?

正しい答えは説2の方でした。実際に関数電卓で計算してみると、説2の答えが出てきます。
これは解釈が分かれやすい「どっちなの問題」です。

その他の「どっちなの問題」

今回のテーマから派生して、解釈が分かれる「どっちなの問題」の例を挙げます。

0の0乗はいくつ?

「xの0乗」は、0でない実数(-1のルートを考えなくてよい世界)では常に1ですが、0の0乗はどうなるのかは数学の中でも統一されていません。1と決めると都合がいい分野と「定義しない」と決めると都合がいい分野があり、各分野が都合のよい方を定義に採用して理論構築しています。

旧暦2033年問題

今使われている「グレゴリオ暦」のひとつ前「天保暦」の問題です。天保暦では2月・5月・8月・11月を設定し、設定後に他の月を設定します。しかし、100年に一回程、設定できる月が1つに定められないという事態が発生するケースがあり、直近では2033年~2034年に起こるというものです。
俳句で使う季語は旧暦の春夏秋冬で区分けされる等、決められないことによる影響は小さくないようです。こちらは一定のルールを決めて解決しようとしているようですが、解決方法が複数あって検討中のようです。

詰将棋【最後の審判】

詰将棋は、限られた自軍の駒を動かしながら相手の王将を詰ますパズルで、本将棋のルールに加えて詰将棋独自のルールがあります。本将棋のルールでは「禁じ手」が規定されていますが、「最後の審判」は詰将棋のルール上「禁じ手」を指すしかない状況が双方で生じた時に勝敗を判断できない、という状態が発生する作品です。
便宜上、詰将棋の1種として記載していますが、実は詰将棋として成立するかも結論が出ていません。 こちらについて興味のある方は、【詰将棋 最後の審判】で検索してみてください。

注:単に【最後の審判】で検索すると、ミケランジェロの「最後の審判」がヒットします。これも 「最後の審判」と言われて、絵なのか詰将棋なのかで解釈が分かれる「どっちなの問題」の一例です。

キーマクロを作ってみた話

こんにちは。イメージマジック三浦です。昼食のために外に出たある日、風から感じる香りが変わったなと感じます。もうすぐ春ですね。
今回はnginxのログを解析するために、サクラエディタのキーマクロを作った話です。

キーマクロを作った経緯

システムのパフォーマンスが悪い時期があり、ボトルネック調査の一環でnginxのログを解析していました。 解析時はExcelやGoogleスプレッドシートでフィルタリングできるように、テキスト置換を繰り返してきましたが、次第にパターンが決まってきて、置換自体を手動リプレイできる状態になってきました。そしてはたと気づきました。
 

ここまでパターン化できているならキーマクロで自動化しよう!

キーマクロの記録方法

ここで、キーマクロの記録について触れておきます。
キーマクロは「ツール」>「キーマクロの記録開始」とクリックすることで、記録開始できます。タイトルバーに「キーマクロの記録中」と出てきます。
上の状態で「ツール」>「キーマクロの記録終了」とクリックすると、キーマクロ記録を終了できます。

簡単なキーマクロを作ってみる

まずは簡単なキーマクロを作ってみます。

(1,2,3,4,5)
を正規表現置換で
(1)
(2)
(3)
(4)
(5)
のようにする操作をキーマクロで保存してみます。 正規表現は以下の通りです。
「ツール」>「キーマクロの読込」とすると、以下のファイルが出てきます。
このパス内にある「RecKey.mac」が、先ほど記録したキーマクロの実体ファイルです。このファイルをデスクトップなどにコピーします(元の場所におくと次回のキーマクロ記録で消えてしまうため)。

キーマクロ機能拡張

先のキーマクロの中身はこのようになっています。
S_ReplaceAll(',', '\\)\\r\\n\\(', 1068);  // すべて置換
S_ReDraw(0);    // 再描画
Excelできれいに貼り付けられるようにしたいという目的を踏まえ、キーマクロを拡張していきます。今回は以下のような方針で拡張しました。
  • S_ReplaceAll のパターンを増やして、異なる方法での置換を実行する
  • S_ReDrow(0)を最後に呼び出すことで、画面再描画は最小限にする
  • 1行をタブで区切られた時の要素数が均一かつ、Excelに貼り付けた時に情報がきれいに出る。
拡張したキーマクロの一部を紹介します。
// HTTPメソッドの分割
S_ReplaceAll('\"(GET|POST|HEAD) ', '\t$1\t', 1068);
// HTTP Status の分割
S_ReplaceAll(' ([2-5][0-9][0-9]) ', '\t$1\t', 1068);
// 再描画
S_ReDraw(0);
拡張したキーマクロは、共通設定の「マクロ」タブで登録し、メニューから実行できるようにします。そこから先は置換結果やExcelに貼りつけた結果を確認しながら、正規表現を調整していきます。

仕上げ

Excelへの貼り付けを繰り返すうちに、以下の点も入れたいという気持ちが出てきたので、拡張中のキーマクロに組み込みます。
  • 先頭に項目行を入れたい
  • 置換後は保存しておいて開いたらすぐに貼り付けられるようにしたい
コード自体はキーマクロの記録で生成されたものをコピペします。
仕上げまで実施し、最終的には以下の通りになりました。
// ファイルの先頭に移動
S_GoFileTop(0);
// 項目行を追加
S_InsText(′項目1\t項目2\…');

// HTTPメソッドの分割
S_ReplaceAll('\"(GET|POST|HEAD) ', '\t$1\t', 1068);
// HTTP Status の分割
S_ReplaceAll(' ([2-5][0-9][0-9]) ', '\t$1\t', 1068);
(他いろいろ)
// 再描画
S_ReDraw(0);

// 保存
FileSave();
これで、アクセスログを整形しExcelに貼り付ける直前まで整形する操作のキーマクロができました。作ってみると非常に便利で、心の中でドヤ顔しています。

最後に

冒頭に記載したボトルネックについては、部員の皆様の活躍により、現在は改善されています。

横がダメなら縦でやってみる

こんにちは。イメージマジック三浦です。うだるような暑さの毎日から一変し、過ごしやすい気候に変わってきました。寒暖の差が大きくなってきましたので、体調を崩さないように気を付けていきたいところです。 今回はSQLの集計クエリを書いていた時の話です。

やりたいこと

・同じ期間内でテーブルA,Bをそれぞれ日付と区分(区分はAとBの両方にある)で集計し、その結果セットを以下イメージの形式で取りたい。
 yyyy-mm-dd | 区分1の集計値 | 区分2の集計値 | 区分3の集計値 | …
ただし、テーブルAとBには以下の状態が想定されます。
  1. AとBの両方に含まれる日付がある
  2. Aだけに含まれる日付がある
  3. Bだけに含まれる日付がある

横ではできなかった理由

2の条件と3の条件が両立する可能性があったため、以下のように横方向にデータを結合していく方式では、どうしても集計漏れが出ます。
SELECT * FROM A INNER JOIN B ON A.日付=B.日付 WHERE …
SELECT * FROM A LEFT JOIN B ON A.日付=B.日付 WHERE …
SELECT * FROM A RIGHT JOIN B ON A.日付=B.日付 WHERE …
完全外部結合で対応しようとおもいきや、MySQLやmariaDBは完全外部結合が使えませんので、横方向へのデータ結合では要件を満たすことができません。
※これは使えない
SELECT * FROM A FULL OUTER JOIN B ON A.日付=B.日付 WHERE …

完全外部結合ができないわけではない

このようなクエリにより、完全外部結合を再現することはできます。
SELECT * FROM A LEFT  JOIN B ON A.日付=B.日付 WHERE …
UNION
SELECT * FROM A RIGHT JOIN B ON A.日付=B.日付 WHERE …
または
SELECT * FROM A LEFT JOIN B ON A.日付=B.日付 WHERE …
UNION
SELECT * FROM B LEFT JOIN A ON B.日付=A.日付 WHERE …
しかし、今回はAとBそれぞれに集計対象の条件が異なり、同じ集計条件を1クエリ内で2度書く必要がある分、クエリが複雑になります。スポット集計用ならまだしも、これからもずっと運用していく予定のクエリだったので、複雑になることを避けるために導入を見送りました。 しかし、UNIONを使う方針は有力でした。

UNIONを使って事前集計を行う

UNIONを使って縦方向の結合により集計値を取得します。 UNIONを使うためには、SELECT文のカラム数を同じにする必要があるので、カラム数合わせの0をセットします。後の集計のため、エイリアスもつけています。UNIONにより重複が排除される効果もあります。
SELECT 日付, 区分
, Aの集計値1, Aの集計値2, …
, 0 AS Bの集計値1, 0 AS Bの集計値2, …
FROM A
WHERE …
GROUP BY 日付, 区分
UNION
SELECT 日付, 区分
, 0 AS Aの集計値1, 0 AS Aの集計値2, …
, Bの集計値1, Bの集計値2, …
FROM B
WHERE …
GROUP BY 日付, 区分

本集計

予備集計のクエリをインラインビューとし、インラインビュー内の集計値をさらに集計します。ダミーのカラム値を0としたことで、SUMを実行した時に影響しないようになっています。
SELECT
日付
, SUM(CASE WHEN X.区分 = 1 THEN Xの集計値 ELSE 0 END) AS summary1
, SUM(CASE WHEN X.区分 = 2 THEN Xの集計値 ELSE 0 END) AS summary2
, SUM(CASE WHEN X.区分 = 3 THEN Xの集計値 ELSE 0 END) AS summary3
, SUM(CASE WHEN X.区分 = 4 THEN Xの集計値 ELSE 0 END) AS summary4
, …
FROM (
SELECT 日付, 区分
, Aの集計値1, Aの集計値2, …
, 0 AS Bの集計値1, 0 AS Bの集計値2, …
FROM A
WHERE …
GROUP BY 日付, 区分
UNION
SELECT 日付, 区分
, 0 AS Aの集計値1, 0 AS Aの集計値2, …
, Bの集計値1, Bの集計値2, …
FROM B
WHERE …
GROUP BY 日付, 区分
) X
GROUP BY X.日付
SUMの結果について、もれなくエイリアスを定義しておくことが最後のポイントです。これにより、プログラムロジック内で集計値を扱いやすくなります。

小話

「インラインビュー」という言葉を初めて聞いたのは、新卒2年目の時に入った案件で見た設計ドキュメントでした。当時は何も分からないながら、何とかしてクエリを書きましたが、そのクエリは廃棄されてしまったそうです。 おまけに、そのことを聞いたのは案件を外れて半年後でした。 派遣エンジニアだった頃の、1つの思い出です。

デザインに使える比率の話

皆さんこんにちは。イメージマジック三浦です。 新型コロナウイルスに対して、弊社でも在宅勤務等の感染予防対策が進んできて今までと違う状況が日常になりつつあります。一日も早い収束を願いつつも、日々自分にできることをやっていこうと思います。 今回は「デザインに使える比率の話」と題して、黄金比と白銀比を紹介します。

黄金比

1:(1+√5)/2≒1:1.6
(1+√5)/2は黄金数とも呼ばれ、フィボナッチ数列の一般項表記に出てくる数です。整数値で比率を表すと5:8となります。
Web画面を作る時、通常表示向けと強調表示向けのフォントサイズを5:8にすることがありますが、通常表示側が奇数になる場合は以下2つの内、1.6に近い方を使うようにしています。
  • 強調表示向け÷(通常表示向け+1)
  • 強調表示向け÷(通常表示向け-1)

白銀比

貴金属比による定義…1:(1+√2)≒1:2.4
直角二等辺三角形の斜辺と底辺の比…1:√2≒1:1.4
「1:√2」は紙の寸法に出てくる他、日本の建築物に多く取り入れられています。また、東京スカイツリーの「東京スカイツリー展望回廊」とタワー全体の高さが約1:1.41で、これも白銀比になっています。

少し数学的な話

第n貴金属比…1:{n+√(n^2)+4}/2
黄金比や白銀比を更に一般化した概念として、貴金属比というものがあります。第1貴金属比(n=1)が黄金比、第2貴金属比(n=2)が白銀比です。ちなみに第3貴金属比(n=3)…1:{3+√13}/2 には青銅比という別名がついています。
(この並び、昔のアニメを思い出します)

おまけ

貴金属比に属さないながら、貴金属の名前を持つ比として白金比というものがあります。
白金比…1:√3
これは、正三角形の底辺の中点と頂点を結んでできる直角三角形の、斜辺を除く辺の比として出てきます。斜辺は短い方の辺のちょうど2倍になっていて、これは三平方の定理からも分かります。

最後に

少し前の話になりますが、京都大学数理解析研究所の望月新一教授による「ABC予想」の証明が認められたと話題になりました。「ABC予想」を真とすると、「フェルマーの最終定理(ワイルズの定理)」をあっという間に証明できるという話があるので紹介します。詳しい説明をしているサイトが他にありますので、ここでは定理と証明の概略を紹介するに留めます。
【フェルマーの最終定理(ワイルズの定理)】
3以上の自然数nについて、(x^n)+(y^n)=(z^n) を満たす自然数の組(x, y, z)は存在しない。
【証明の概略】
・ABC予想を真とすると、n>=6で(x^n)+(y^n)=(z^n) を満たす自然数の組(x, y, z)は存在しないことが証明できる。
・n=3,4,5の場合は、先人達によって個別に証明されている。
・よって3以上の自然数について、(x^n)+(y^n)=(z^n) を満たす自然数の組(x, y, z)は存在しない。
証明に360年かかった命題を、ここまで簡単に証明してしまえるのは驚くばかりです。しかしながら全てではなく、先人達が残した実績との合体技で証明です(これも昔の某アニメを思い出す)。どんなに優れた知見が出ても、そこに至るまでの先人達の歩みを無視することはできないと感じます。
今回は、ここで終わりとします。

ImageMagickコマンドの注意点

こんにちは。イメージマジック三浦です。 2019年が後半に入りました。あっという間に半年過ぎたとも、まだ半年あるんだなとも思います。 今回は「ImageMagickコマンドの注意点」と題して書きます。
業務で、WindowsOSに導入することを念頭に ImageMagickコマンドを調査しましたが、その時に気づいたことを書いてみます。

ImageMagickとは

画像の変換や表示、内部情報などを見るソフトウェア群です。詳しい説明は他のサイトを参照してください。
 https://imagemagick.org/index.php 

インストールについて

ImageMagick開発元が、様々なOS向けにインストーラを提供しています。
特にWindowsOS用では、インストーラ方式のものと解凍して配置するだけのものがありますが、今回はWindowOS向けのポータブル版を使うことにしました。 ImageMagickコマンドの動作には、VC2013再頒布可能パッケージのインストールが必要とされています。最初のパッケージの後に、更新版が出ていますので、導入が必要だとすれば更新版の方がよいかと思います。
(VC2013再頒布可能パッケージ)
https://www.microsoft.com/ja-jp/download/details.aspx?id=40784
(VC2013再頒布可能パッケージの更新版)
https://support.microsoft.com/ja-jp/help/3138367/update-for-visual-c-2013-and-visual-c-redistributable-package
ただし、OSによっては同パッケージをインストールしなくても動いてしまうケースがあるので、実際の画像を使った動作確認は欠かせません。

動作確認をしてみて気づいたこと

WindowsOS向けのポータブル版ImageMagickを動作確認をする中で、ImageMagickコマンドの1つ「convert」が動かないという現象がありました。 以下のようなディレクトリ構成で、
E:\hoge
[D] ImageMagcik
[F] test.psd
PowerShellで、カレントディレクトリをImageMagick直下に移動してconvertコマンドを実行すると、以下のような結果が出ます。
(convertコマンドの詳細は割愛します)。
PS E:\test\ImageMagick&amp;gt; convert ../test.psd[0] ../test.png
無効なパラメーターです - /test.psd
PS E:\test\ImageMagick&amp;gt;
1つ上の階層のディレクトリに「test.png」というファイルができると期待したのですが、エラーになりました。
「convert /?」と入力するとWindowsOSのコマンドのヘルプが出てきたので、ImageMagickの「convert」コマンドを実行するつもりが、WindowsOSの「convert」コマンドを実行していたと考えられます。特に、コマンドプロンプトだと発生しないので、混乱しやすいところです。 PowerShellで期待した結果を得るには、以下のように指定する必要がありました。
PS E:\test\ImageMagick&amp;gt; ./convert ../test.psd[0] ../test.png
または
PS E:\test\ImageMagick&amp;gt; .\convert ../test.psd[0] ../test.png

同じような現象を回避するために

今回のような現象を回避するには、先頭に「.\」を付加してカレントディレクトリのコマンドであると明示する方法が無難だと感じました。「.\」が付いていれば、コマンドプロンプトでもPowerShellでも同じ動きをしてくれるためです。 他には「convert」コマンドが、最新バージョンの1つ前のImageMagick6系と互換性を維持するために提供されるものなので、最新バージョンの「magick」コマンドを使うことが考えられます。

最後に

これから暑くなるので、体調の管理には気を付けてください。
個人的には、睡眠時間の確保と毎日の食事でネバネバ食材を食べることに気を付けていますが、身体が軽くなったように感じているので、これからも続けていきたいと思います。

PowerShellにLinuxコマンドを見る

こんにちは。イメージマジック三浦です。
朝晩の寒さは残りますが、梅の花が咲いているところやプロ野球オープン戦の話題が出てくるようになりました。一方で最近降った雨は冷たかったです。暖かくなるのはもう少し先のようです。

今回のテーマ

今回は「PowerShellでLinuxコマンドを使ってみる」と題して書きます。 かねてより、lsやcurlを起動できることは知っていたのですが、 気になったので正体を調べてみました。

早速試す

実際にPowerShellでコマンドを打ってみると、以下の結果となります。オプションまでLinuxと同じということはないようです。
  • 使える:ls, ls -R
  • 使えない:ls -l
PS C:\hogehoge> ls


    ディレクトリ: C:\hogehoge


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/03/01     12:42                subdir
-a----       2019/03/01     12:41              3 aaa.txt
-a----       2019/03/01     12:41              3 bbb.txt
-a----       2019/03/01     12:41              3 ccc.txt


PS C:\hogehoge>
PS C:\hogehoge> ls -R


    ディレクトリ: C:\hogehoge


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/03/01     12:42                subdir
-a----       2019/03/01     12:41              3 aaa.txt
-a----       2019/03/01     12:41              3 bbb.txt
-a----       2019/03/01     12:41              3 ccc.txt


    ディレクトリ: C:\hogehoge\subdir


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/03/01     12:42              6 ddd.txt


PS C:hogehoge>
PS C:\hogehoge> ls -l
Get-ChildItem : パラメーター 'LiteralPath' の引数が指定されていません。型 'System.String[]' のパラメーターを指定し、再
試行してください。
発生場所 行:1 文字:4
+ ls -l
+    ~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem]、ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,Microsoft.PowerShell.Commands.GetChildItemCommand

PS C:\hogehoge>

昔からあるWindowsのコマンドは?

ディレクトリ配下の一覧を返すコマンドとして、以前からdirというものがありました。ここでdirを実行してみると、lsと同じ結果が返ってきます。
PS C:\hogehoge> dir


    ディレクトリ: C:\hogehoge


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/03/01     12:42                subdir
-a----       2019/03/01     12:41              3 aaa.txt
-a----       2019/03/01     12:41              3 bbb.txt
-a----       2019/03/01     12:41              3 ccc.txt


PS C:\hogehoge>

正体を探る

lsとdirで同じ結果が出るのは判りましたが、何故かはわかりません。これを調べるために、ls のヘルプを見てみます。
PS C:\hogehoge> ls -?

名前
    Get-ChildItem

概要
    Gets the items and child items in one or more specified locations.

…
Get-ChildItem という名前が出てきました。これが正体のようです。
lsを実行すると、「Get-ChildItem」というPowerShellコマンド(コマンドレットと言われます)が実行されます。 dir でも同じ結果が出てきます。
PS C:\hogehoge> dir -?

名前
    Get-ChildItem

概要
    Gets the items and child items in one or more specified locations.

…

「Get-Children」の別名を確認

最後に、「Get-Children」コマンドレットが持つエイリアスを確認してみます。
PS C:\hogehoge> Get-Alias | Where-Object { $_.Definition -eq "Get-ChildItem" }

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           dir -> Get-ChildItem
Alias           gci -> Get-ChildItem
Alias           ls -> Get-ChildItem


PS C:\hogehoge>
ls, dir の他に gci という別名がいることも分かります。

まとめ

PowerShellで「ls」や「curl」が打てた、というところを出発点に調べてみました。Linux系OSで使えたコマンドを試しに打ってみたら実は使える、というものが他にもあるかもしれません。また使えなかったとしても、自分でエイリアスを設定することもできるようです。
スクリプトを作る時は、使おうとしているエイリアスが実行先の環境で設定されているかを確認する必要がありますが、技術的な選択肢の1つの手段として、上手く使っていければと思います。

大量の情報から必要なものを探す(メール編)

こんにちは。イメージマジック三浦です。
昨年、月に1~2回やっているフットサル用に、長袖のトレーニングウェアを買いました。フットサルは屋外でやることが多いのですが、肌が直接外気に触れないだけで体の冷え具合が全く違うので、寒い時期の運動にはありがたい存在です。

今回はメールの中から必要な情報を取り出す、ということをテーマにして投稿します。

【システムからの通知メール】

弊社で運用しているシステムからは、日々多くのメールが送信されてきます。
多くは定時のバッチやタスクが「異常なし」で動作したことを通知してくるメールですが、 時々異常を通知するメールが送信されることがあります。
異常を感知した場合は、内容を確認して必要な対応を取らなくてはいけません。

通知メールは1通ずつ見ていくのが大変なくらいに送信されてきますが、 異常がない時に「異常なし」と通知してもらうことも重要です。「問題なし」の通知を止めてしまうと、異常がなくて通知がないのか何らかの異常で通知できないのか判断しにくくなります。

そこで、送信されてきたメールの中からエラーを通知するメールを取り出すことを考えます。

【キーワードの選定】

ここではシステムからの通知メール本文に
「error: x」(x = 1から9の整数)
という文字列があれば、何かしらの異常があるものと判断します。
異常が1件でも10件でも、「error: 1」という文字列で検索できるということです。

【どうやって抽出するか】

正規表現による検索が使えるメーラーの場合、 上記の規則性をカバーできる正規表現で条件を設定すれば簡単です。 しかし、検索に正規表現を使えないメーラーの場合は悩みます。
※普段の業務ではgmailを利用していますが、gmailは正規表現が使えません。

【実際にやったこと】

gmailでは、必要な分だけOR条件をつなげる方法が使えました。
“error: 1” OR “error: 2” OR … (9までつなげる)
検索条件のテキストを別ファイルに保存しておいて、gmailフィルタのラベル添付機能と組み合わせると、使いやすい状態になりました。

【まとめ】

今回は、大量の情報から必要な情報を探すという観点で書きました。
目の前にある情報をどう整理するかという観点と、どういう情報があれば整理しやすいかという観点の両方を忘れないようにしたいと思います。