おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

拡張テンパズル

YoutubeのQuizKnockを見ていて、面白い問題を人間とコンピュータ(のプログラムを作る人間)が勝負していました。 動画はもちろん面白かったのですが、このパズルを解くプログラムを自分でも作ってみたくなりました。

このパズルは例えば次のようなものです。

数字1, 2, 3, 4, 5と四則演算(加減乗除のこと)をつかい、その式の計算結果が20になるような式を見つけよ。

答えは複数ある可能性がありますが、ひとつ見つければ良いことにします。 例えば、

 3\times 5-1+2+4=20

はひとつの答になっています。

パズルの名前

このパズルは有名なのでしょうか?またその呼び名はあるのでしょうか? ネットを探してみると、「テンパズル」または「メイクテン」というのが、これに似ています。

ただし、テンパズルは与えられる一桁の数字が4個で、計算結果は10に固定されています。 計算結果が10ということが「テン」パズル、あるいはマイク「テン」の元になっているようです。

拡張テンパズル

このパズルの条件を拡張します。

  • 計算式に使う数字は4個でなくても良い。2個以上なら良いものとする
  • 計算式に使う数字は二桁以上でも良い。要するに自然数なら良い
  • 計算結果は10でなくても良い

これをここでは「拡張テンパズル」と呼ぶことにします。 拡張テンパズルを解くプログラムをRubyで作ってみました。 GitHubにすでにアップロードしてあります。

プログラム名の「e10p.rb」がextended TenPuzzleからきています。 このプログラムはライブラリであり、メインプログラムを作る必要があります。 demo.rbがそのような例になっているので、参考にしてください。

プログラムの実行

プログラムを実行するためのメインプログラムの例を示します。

require_relative "e10p.rb"

numbers = ARGV.dup.map{|s| s.to_i}
sum = numbers.pop
puzzle = E10P.new(numbers, sum)
print "#{puzzle.solve}\n"

これを実行するときに、引数に「式に使う数字」と「合計」を空白区切りで指定します。 例えば、式に使う数字が11, 20, 33で、合計が42とすると、

$ ruby main_program.rb 11 20 33 42
33-(11-20)

このように答えが表示されます。

テンパズルもやってみましょう。

$ ruby main_program.rb 2 3 5 8 10
5*(8-2*3)

面白いのは、分数が一度出てくるような例があることです。

$ ruby main_program.rb 1 1 9 9 10
9*(1+1/9)

プログラムの仕組み

例 2,4,5,6から10を作る

答えの一例は

 5\times(2\times 4-6)

です。 これは木構造で表すと

  *
 / \
5   -
   / \
  *   6
 / \
2   4

となります。 一番下の階層は2*4になっています。 この結果は8ですが、これから、この問題は、8と5, 6の3つで10になる計算を見つければ良いことになります。 もちろん、最初から2と4を組み合わせれば良いことは分かりませんから、4つの数字から2個をとる順列を生成し、虱潰しに探していきます。

数字がひとつ減ったので、今と同じ方法を用いると、次は数字が2つになります。 このようにして数字を減らしていって、計算結果が10になる場合を見つければ良いことになります。 これは、再帰呼出しです。

GitHubのプログラムでは、solve_realというメソッドがそれに当たります。

この問題はプログラム化が結構難しいと思いますが、Rubyのクラスを導入して木構造を作ると短くまとめることができます。

数式処理アプリケーションMaxima

Maximaとは

Maximaは古く歴史のあるアプリケーションですが、現在でも開発が行われています。 いわゆる「数式処理」をするアプリです。 電卓やPCの計算は数字に対するもので、整式などは扱えません。 例えば、次の式を展開する計算はできません。

 (x+1)(x+2)

このような計算をすることを「数式処理」といいます。 Maximaは数式処理をするアプリです。 詳しくはドキュメントを参照してください。 ここでは簡単な例のみ取り扱います。

2つのMaxima

Ubuntu Softwareというアプリケーションを開き「Science」ボタンからMaximaを探すと

の2つがあります。

どちらもMaximaなのですが、WxMaximaはGUIに対応しています。 1番目のMaximaは端末からCUIベースで操作します。

Ubuntu Softwareから簡単にインストールすることができます。

Windows版もあります。 ダウンロードサイトの説明を見てダウンロードしてください。

式の展開と因数分解

Maximaはコマンド、引数、セミコロンがまとまりになります。 ここでは2つのコマンドを試してみましょう。

  • expand: 引数で与えられた式を展開する
  • factor: 引数で与えられた式を因数分解する

式は、四則(+-*/)と累乗(^)が可能です。  x^2+2x+3は「x^2+2*x+3」と書きます。

まず、Maximaを起動して、展開、因数分解した画像を見てください。

Maxima

CUIベースなので、指数が同サイズのフォントで1行上に現れるので見にくいです。 しかし、きちんと展開、因数分解ができていることがわかると思います。

なお、乗算記号(*)とセミコロンを忘れないようにしてください。 セミコロンを忘れると、次の行に入力が繋がりますので、そこでセミコロンを打つと計算をしてくれます。 終了するときには

quit();

とタイプしてください。

次にWxMaximaで展開と因数分解した画像です。

WxMaxima

こちらはGUIベースなので多少見やすいと思います。

終了はメニューからできます。 Maximaのようにquitコマンドを使うと、GUIの背後で動いているmaximaが終了してしまうので注意してください。

まとめ

Maximaは豊富な機能を持っているので、興味のある方はウェブサイトを調べてみてください。 自分は展開や因数分解のチェックで使うことが多いです。 私は整式の手計算のミスが多いので、助けられています。

数式処理ソフトでは、一時期Mathematicaがウェブで語られていましたが、こちらは有料です。 現時点でMathematicaウェブサイトを調べたところ、デスクトップ版を家庭・趣味用で購入すると387ドル(145.97円×387=56490.39円)です。 円安なので高くつきますね。 他に教育用などの別のライセンスがありますから、購入を検討する人は調べてみてください。

Maximaは無料で使うことができるので、手軽だと思います。

WindowsにImageMagickとRMagickをインストール

Windowsで画像処理を行うため、ImageMagickをインストールします

ImageMagickのインストール

  • ImageMagickのウェブサイトをブラウザで開く
  • タイトルバーのダウンロードボタンをクリック(他に広告のダウンロードボタンもあるが、それは違うので要注意)
  • 下の方にWindowsインストーラがある。「ImageMagick-7.1.1-15-Q16-HDRI-x64-dll.exe」をクリックしてダウンロード。 PCの能力に応じて別のインストーラを選択してもよい
  • インストーラの指示に従ってインストール。 途中で「Install development headers and libraries for C and C++」にチェックを入れる。 これはRMagickを後にインストールするときに必要なため

テスト

  • 「ドキュメント」フォルダを開き、右クリックから「ターミナルで開く」をクリック
  • 「magick logo: logo.gif」と入力。ドキュメント・フォルダにlogo.gifというファイルができる。
  • フォルダ画面からlogo.gifをダブルクリック。ImageMagickのロゴが表示される

以上が確認できれば正常にインストールできています。

RMagickのインストール

RMagickはRubyのGem(ライブラリのこと)で、RubyImageMagickを使うためのものです。 使い方はオリジナルのImageMagickとは違い、Rubyプログラムに適した形になっています。 詳細はRMagickのドキュメントを参照してください。

ターミナルからgemコマンドでインストールします。

> gem install rmagick
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
Successfully installed rmagick-5.3.0
Parsing documentation for rmagick-5.3.0
Installing ri documentation for rmagick-5.3.0
Done installing documentation for rmagick after 2 seconds
1 gem installed
>

RMagickのテスト

エディタで次のプログラムを作成し、test.rbのファイル名で保存します。 保存先のディレクトリはどこでも良いのですが、一応ドキュメント(Documents)にしておきましょう。

require 'rmagick'
include Magick

img = Image.new(800,600) do |options|
    options.background_color = 'blue'
end
img.write("blue.png")

端末から実行します。 まず、カレント・ディレクトリがドキュメントになっていることを確認しておいてください。

> ruby test.rb
>

同じフォルダにblue.pngができているはずです。 それは800x600サイズで全面青色の画像ファイルです。 それができていれば、RMagickはきちんと動作しています。

RMagickの応用

RMagickを使ってプロジェクターの画面解像度に写真サイズを合わせるプログラムが、 「プロジェクター用スライドの画像について」にありますので、参考にしてください。

この他にもいろいろなことができるので、RMagickのドキュメントを参考に試してみると良いと思います。

WindowsにRubyをインストール

関係者との互換性のため、Windowsでの作業が増えてきました。 しかし、WindowsLinuxと比べツールが少なく、使い勝手がよくありません。 それを解消するための手段のひとつとして、Rubyをインストールすることにしました。

Rubyのウェブサイトからダウンロード

  • Rubyのウェブサイトをブラウザで開き、「ダウンロード」ボタンをクリック
  • Rubyのインストール方法」を見ると「Windowsマシンでは、RubyInstallerといったツールが使えます。」とある
  • その文の中にある「RubyInstaller」をクリック
  • 「RubyInstaller」という別サイトが開く
  • 「Download」ボタンをクリック
  • Ruby+Devkit 3.2.2-1 (x64)」をクリック=>ダウンロード開始(バージョンは2023/8/26時点)
  • ダウンロードしたインストーラをダブルクリック。以下指示に従いインストールする

エディタのダウンロード

Rubyプログラムを書くためのエディタをインストールします。 私は、Visual Studio Codeをインストールすることにしました。 もちろん他のエディタ、例えばAtomなどでも良いと思います。

  • Visual Studio Codeのウェブサイトをブラウザで開く
  • Visual Studio Codeをダウンロードする」ボタンをクリック
  • Windows」のボタンをクリック。別画面に遷移すると同時にダウンロードも行われる
  • インストーラをダブルクリックして起動。以下指示に従う。私は「デスクトップにアイコンを作成」にもチェックを入れた

テスト

アプリケーションが動くかどうかテストします。 エディタを立ち上げ、次のプログラム「hello.rb」を作り、保存します。

print "Hello world.\n"

そのフォルダで右クリックし「ターミナルで開く」をクリック。 ターミナルが開き、そのカレント・フォルダがプログラムのあるフォルダになっています。 次のようにコマンドから入力します。 なお、プロンプトは、フォルダのパス名に「>」がついたものになりますが、以下では単に「>」のみとします。

> ruby hello.rb
Hello world.
>

Hello world.が表示されればRubyは動作しています。

Rubyチュートリアル

Rubyの使い方については徒然なるままにRubyというチュートリアルを書いていますので参考にしてください。

BOMについて

WindowsRubyプログラムを作るときに問題となるBOMについて書いておきます。 BOMは「Byte Order Mark」、すなわちバイト順を表すマークでファイルの先頭にあります。 このマークはバイト順だけでなく、Unicodeのどれを使うかも示しています。 「バイトオーダーマークの使用」を参考にしてください。

例えば端末から

> echo abc >test.rb
>

とすると、ファイルの先頭に十進で「254, 255」というデータが入ります。 十六進では「FE, FF」です。 これが表すのは、UTF-16でビッグエンディアンの形式でデータが表されるということです。 RubyはBOM無しのUTF-8をプログラムのエンコーディングとしているので、test.rbを実行するとエラーになります。

以上から、Rubyのプログラムを作るときにはBOM無しのUTF-8を出力するようエディタを設定しておいてください。 VSCodeはデフォルトでそのようになっています。 ただし、BOM付きのファイルを読み込んで編集する場合は、上書き保存も同じBOMつきになります。 ですから、最初からVSCodeでファイルを作成することをお勧めします。

このエラーは見た目には良く分からないので、対策を立てにくいものです。

WindowsにGimpをインストール

最近どうしてもWindowsを使わなければならない事情が発生しました。 普段使っていないので、アプリの数も少なく、不自由しています。 Windowsを使わなければならない理由は、やりとりする相手との互換性から、Officeでファイルを作成しなければならないことです。 今のところ、Word、ExcelPowerPointの3つです。 パワポは画像を使うことも多いので、画像処理のソフトが必要になりました。 いろいろ調べてみましたが、フリーなものではGimpがまだ有力なようです。 ベストではないと思いますが、自分の仕事の範囲では十分そうです。

Gimpのインストール

インストールは簡単です。

GimpはまだGTK4対応ではないようです。 つまりGTK3使用です。 早くそのへんが改善されると良いのですが。

Gimpの初歩の初歩

Gimpの使い始めはどうやって線を引くのかがわかりにくいと思います。

  • 長方形を描くには、長方形の選択をして、メニューから「編集」=>「選択範囲の境界線を描画」をクリック
  • 円や楕円も選択範囲を「楕円選択」にして、同様にすれば描ける。
  • 複雑な曲線はパスを利用する。パスを引いておいて、メニューから「編集」=>「パスの境界線を描画」をクリック

ドキュメントもあるので、コツコツ続けていけば、そのうち慣れてきます。 がんばりましょう。

今後は・・・

今後の環境整備はRubyImagemagickおよびRMagickのインストールです。 ここまでで、画像関係は何とかなるでしょう。 この話題は次回の記事で扱おうと思います。

プロジェクター用スライドの画像について

プロジェクター用スライドの画像

プレゼンテーションでスライドを作るときに、画像の画素数(これを解像度と言うこともあるが、正しくはない)をどれくらいにしたら良いのでしょうか? 一般にデジカメで撮った画像は画素数が多いので、それを何枚もスライドに入れると容量が大きくなってしまいます。 また、画素数の多い写真はピントが合うまでに少々時間がかかることもあります。 プロジェクタの解像度に適するように変換が行われるためです。 そこで、スライドを作るときの最良の画素数を計算する方法を考えてみました。

結論的には、「プロジェクターの画面解像度が1920x1080ならば、画面いっぱいに写す画像も1920x1080が最適」ということです。 これだけで十分な人は以下の記事を読む必要はありません。

素数とは

デジカメやスマホの写真データは、色情報を持った小さな点の集合になっています。 この点を画素(英語でピクセルpixel)といいます。 写真データにおける画素の数を画素数といいますが、縦横を別々にして1600x900のように表すことが多いです。 この場合、1600が横で900が縦です。 総画素数は、1600x900=1440000=144万画素、となります。

画素の縦横比を「ピクセルアスペクト比」といいます。 画素が正方形なら1:1です。 画素が長方形のこともあり、例えばNTSCビデオシステムでは10:11です(ウィキペディアのピクセルアスペクト比参照)。 コンピュータのディスプレイなどでは、ピクセルアスペクト比は1:1と考えて差し支えありませんが、実際のディスプレイには若干の誤差があります。

解像度と画面解像度

同じ大きさの写真でも、画素が多いものと画素が少ないものでは見た目が大きく違います。 これは長さに対する画素数の割合、すなわち密度の問題になります。 解像度を表すにはDPI(ドット・パー・インチ)を用いることが多いです。 1インチ(2.54cm)あたりに画素がいくつあるかを示します。

DPIは長さに対する画素数の密度ですが、縦横でDPIが異なる可能性があります。 それはピクセルアスペクト比が1:1でない場合です。 それでは、パソコンの場合はどうでしょうか? パソコンディスプレイではピクセルアスペクト比は1:1ですから、DPIは縦横が同じになります。 そこで、縦横区別せずに単にDPIをひとつだけ示せば足りることになります。

一般に解像度が高いほうが見た目が良くなります。 ただし、人間の目には限界がありますので、ある程度の解像度を越えるとその違いは感じられなくなります。 また、ディスプレイとプリンタでは、その仕組みが違うので、同じ解像度でも見た目が変わります。 ちなみに私の持っているPCのディスプレイは13.3型(対角線の長さが13.3インチ)で1920x1080ピクセル(16:9)なので、 横の長さをxとすると

 \displaystyle
x^2+\left(\frac{9x}{16}\right)^2 = 13.3^2 \\
x = 11.6 \\
1920\div 11.6 = 165.6

これより約166dpiです。 解像度はディスプレイによって異なります。

解像度に似た用語に「画面解像度」があります。 これはディスプレイの縦横の画素数を示したもので、密度を表すわけではありません。 例えば私の持っているノートパソコンのディスプレイの画面解像度は1920x1080ドットです。 パソコンをプロジェクターにつなげる場合は、パソコンの外部出力の画面解像度とプロジェクタの画面解像度の能力で決まってきます。 多くの場合はプロジェクターの画面解像度になると思います。 例えば、私の持っているエプソンのプロジェクター「EF-100B」の場合は1920x1080です。

デジカメやスマホ・カメラの画素数

私の持っているデジカメはNikonの「COOLPIX B600」で、通常の撮影における画素数は4608×3456です。

 \displaystyle
4608 = 2^9\times 3^2 \\
3456 = 2^7\times 3^3 \\
4608:3456 = 4:3

同じくスマホのカメラは4000x2250です。 しかし、このスマホには4つのカメラ(1つはインカメラ・・・自撮り用カメラ)があるので、それぞれに画素数が異なります。 ですので、4000x2250はそのうちのひとつにおける画素数です。

 \displaystyle
4000 = 2^5\times 5^3 \\
2250 = 2\times 3^2\times 5^3 \\
4000:2250 = 16:9

いずれもディスプレイの画面解像度よりも画素数が多いです。 あた、アスペクト比(縦横比)が異なるので、4:3の画像は左右に黒い背景を追加して、中央に画像を置く必要があります。

EXIFデータ

EXIFデータはJPEGなどの画像に追加できるメタデータです。 撮影日時、場所、カメラなどの情報が良く用いられます。 ネット上に画像をあげるときに、これらの情報(個人情報)は削除する方が好ましいと言われています。

画像変換のプログラム

画像変換にはImagemagickを使うと良いです。 ここでは、そのRubyライブラリであるRMagickを使って変換プログラムを作ってみます。 私のプロジェクターの画像解像度が1920x1080なので、画像サイズもそれに合わせます。 読者がこのプログラムを活用する際にはお持ちのプロジェクターの画像解像度に合わせて調整してください。 また、16:9以外の画像をこのサイズ内におさめると余白ができますが、余白は黒にします。

ImagemagickやRMagickについては次のリンクが参考になります。

次のプログラムは最後の3行で与えられるファイル(sample1.jpg、sample2.jpg、sample3.jpg)を変換します。 EXIFデータは削除され、サイズが1920x1080に変更され、photo-0.png、photo1-.png、photo2-pngというファイルに保存されます。 定数WidthとHeightを書き換えることにより、異なるサイズに対応できます。

プログラムを起動するには、コマンドラインから

$ ruby image_for_slide.rb

とタイプします。

# image_for_slide.rb 
#
# This program converts images for slides.
# - The image filenames are given after the __END__ line.
# - Removes EXIF data.
# - Resizes the images to suit slides
# - The name of the created image files are "photo-0.png", "photo-1.png", ...
 
require 'rmagick'
include Magick

# Display resolution
# 16:9
Width = 1920
Height = 1080
# 4:3
# Width = 1024
# Height = 768

imagelist = ImageList.new(*DATA.read.split(/\n/))
imagelist.each do |image|
  image.strip!
end
imagelist = imagelist.map do |image|
  base = Image.new(Width,Height) {|options| options.background_color = 'black'}
  src = image.resize_to_fit(Width,Height)
  base.composite(src,CenterGravity, OverCompositeOp)
end
imagelist.write("photo.png")
__END__
sample1.jpg
sample2.jpg
sample3.jpg

釧路湿原

少し前のことになりますが(2023年6月)、釧路湿原に行きました。 あいにく天気が悪く、霧が出ていて、壮大な湿原全体を見ることができませんでしたが、それでも自然を感じることができました。

交通

私は飛行機を利用しました。 最寄りの空港は「たんちょう釧路空港」です。 そこからはレンタカーを使いました。 空港のすぐ目の前にレンタカーのお店が並んでいるので便利です。

お店で「鹿には気をつけてください」と言われましたが、どうもピンときませんでした。 しかし、その直後に事故現場を目撃することになります。 ボンネットが大きくへこんだ乗用車とその前に横たわる大きな鹿。 すでに警察が来て事故処理にあたっていました。 あらためてネットを調べてみると、国土交通省の「エゾシカ衝突事故マップ」というサイトに詳しい情報がありました。 そこには「エゾシカとの衝突は生死にかかわります!」との目立つ注意書きが。 エゾシカとの交通事故は非常に多くて、2022年には北海道全体で4480件発生しています。 毎日12から13件発生していることになります。 お店の注意が真剣なものだったということを後になって認識しました。

釧路市湿原展望台・サテライト展望台

初日は湿原の西に位置する釧路市湿原展望台に行きました。 そこの円形の遊歩道の湿原側に「サテライト展望台」があります。 残念ながら霧のため眺望は限られましたが、それでも湿原の広さを感じることはできました。 途中で狸の親子に会いました。 動画をご覧ください。

www.youtube.com

ノロッコ号

翌日はまず釧路駅へ。

釧路駅

ノロッコ号に乗りました。

ノロッコ号

ノロッコ号はJRの釧網本線(せんもうほんせん)のうち、釧路駅から塘路駅までを湿原観光用に特化して運転している列車です。 座席の配置も湿原を見やすいように工夫されています。 また、ガイドさんのアナウンスもあります。 線路は湿原の東側を通りますが、一部湿原内を通るので左右どちらからでも湿原を見ることが出来ます。 特に線路と並行して流れる釧路川が美しく、それが一番の見所かもしれません。

細岡展望台

細岡展望台は湿原の東に位置し、湿原を最もよく見渡せる展望台です。 ここへは車で行きましたが、ノロッコ号釧路湿原駅下車、そこから20分ほど歩いて行くこともできます。 天気があまり良くありませんでしたが、写真を撮ってみました。

釧路湿原

サルボ展望台。塘路湖

サルボ展望台は細岡展望台よりも北にあり、湿原東側にある塘路湖が良く見えます。 道路脇の駐車場から10分ほど登ったところにあります。 その駐車場付近でシカとサギを発見しました。

シカとサギ

最初はこの鳥がタンチョウヅルかと思いましたが、首が黒くないので違うことがわかりました。 おそらくサギだと思います。

タンチョウヅルは釧路湿原に住む鳥で、渡り鳥ではありません。 「タンチョウ」は空港の名前にもなっているほど釧路では有名です。

幣舞橋(ぬさまいばし)

ホテル近くの幣舞橋を散歩しました。 夕日がきれいなことで有名です。

幣舞橋

橋には彫刻が4つあり、春夏秋冬を表しているそうです。

幣舞橋の彫刻

また、橋の先には、時計のオブジェがあります。

時計のオブジェ

幣舞橋は、夕方になると多くの人が散歩しています。 カメラを持っている人がたくさん夕日を撮っていました。 また、釧路川の両岸は幅のある遊歩道になっているので、そこでも散歩が楽しめます。

グルメ

最後に食べ物について。 北海道は海の幸が有名で、寿司、ろばた焼きが美味しいです。 予約をしておくのが確実です。 値段は店によります。 安くても美味しい店はありますから、事前によく調べておくと良いです。