韜晦日記

韜晦日記

Rietveldよりもプログラミングメインになりつつある

Rietveld解析初心者による備忘録とつぶやき

オリオン座の馬頭星雲と燃える木

f:id:tanisuke_str:20190109124629j:plain
オリオン座に位置する馬頭星雲と燃える木

Photo Data

  • Camera : Canon 60Da
  • Takahashi ε200 on Takahashi NJP
  • Auto Guider : M gen
  • ISO1600, Light : 360 sec × 10枚= 1 h
  • master flat frame × 1 (以前作成したもの)

明けましておめでとうございます。
細々ですが今年もこのブログを続けていきたいと思います。
最近では弊ブログも月間3000PVを超えるようになりました。
昨年の9月頃から徐々にPVも伸びてきているので今年は1万PVを狙っていきたいですね。
ということで今年もよろしくよろしくお願いします。

新年早々新月が重なっており、予定していた撮り初めに行ってきました。

出発前の予報では結構絶望的だと思っていたのですが、いつも一緒にいく先輩は「大丈夫深夜には晴れる」と言って黙々と用意を進めています。 どうやら現地では強風も吹いていたようで色々と不安が募りますが、僕も黙って車に機材を詰め込み南三陸は神割崎に向かいます。

現地に到着してみると、そこまで風も強くなく晴れていたのでこりゃしめたぞ。なんて撮影機材をセットしていたのも束の間、いつの間にか空は雲に覆われていました。
結局、やってらんねえよと先輩とお湯を沸かし始めいつものようにカップラーメンを食べました。

深夜過ぎ、予報通り北の厚い雲が抜けると雲はほとんどなくなりました。 やっぱり先人の知恵はちゃんと聞くべきですね。

ファイルの文字列を一括置換して上書きする【VBA】

一気にファイルの文字列を置換したい。

ファイルの中に置換したい文字列が複数存在しているとします。 こんな時にコードの量も少なく、シンプルな書き方がないか考えてみました。 付け焼刃で書いてるので自信ないですが、個人的なメモで書き残しておきます。

やり方としては

  1. FSOを使ってファイルを一気に読み込み
  2. 文字列を置換.
  3. Split関数で配列化.
  4. ファイル上書き用の関数に渡してファイルに上書き.

文字列の置換のところは文字列を配列に格納してforで回せばより大量に処理ができるようになると思います。

    Dim read_text_row As String '読み込み用テキスト
    Dim replace_text_row() As String ' 書き込み用テキスト
    Dim file_path ' 置換したいファイル
    file_path = "C:\Files\test.txt" ' 置換したいファイルパス
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    With FSO.GetFile(file_path).OpenAsTextStream
    
    read_text_row = .ReadAll '最後まで読み込み
    read_text_row = Replace(read_text_row, "置換前の文字列1", "置換後の文字列1")
    read_text_row = Replace(read_text_row, "置換前の文字列2", "置換後の文字列2")
    read_text_row = Replace(read_text_row, "置換前の文字列3", "置換後の文字列3")
    read_text_row = Replace(read_text_row, "置換前の文字列4", "置換後の文字列4")

    replace_text_row = Split(read_text_row, vbCrLf)
    .Close
    End With
    Set FSO = Nothing ' 開放
    
    Call Output_File(replace_text_row, plot_file_oripath) 

以下はファイル上書き用の関数です。

Sub Output_File(rep_text() As String, ByVal rep_file_path)
    Dim i As Long
    Open rep_file_pathFor Output As #1
    
    For i = 1 To UBound(rep_text)
        Print #1, rep_text(i)
    Next i
    Close #1
End Sub

ただ、このコードだとWindowsで扱うような改行コード(キャリッジ リターンとライン フィードの組み合わせ)にしか対応していません。
まあ、改行コードを判定してそれぞれSplitする改行コードを指定してあげればよいと思いますが。 ややこしいことはしていないので何となく個人的にわかりやすいコードな気がします。

以上

空白を含むファイルパスを変数として扱う方法

年の瀬に年末エントリーを書こうと思っていたのに…。 それは明日にでもかこう。

exeファイルを実行したい。

どうも。久しぶりのVBAに関する記事です。
VBAで実行ファイルを実行したい際にはWshShellオブジェクトRunメソッドを使いますよね。
この時、実行したいファイルのパスを与えなければなりません。
しかし、ファイルパスに空白が含まれていると正しく実行できず、二重引用符で囲む必要があります。

例えば
C:\Program Files\FOGE.exe
を実行したいときは以下のように書きます。

Dim ShellObject As Object
Set ShellObject = CreateObject("WScript.Shell")
ShellObject.Run """C:\Program Files\FOGE.exe"""

このファイルパスをプログラム上に直接書き込まずに変数として取得して使用したい場合は少し工夫が必要です。

取得したいファイルパスがA1セルに入力されているとします。 するとファイルパスは以下のように取得しますね。

Dim filePath as String
filePath = Cells(1, 1) 'あるいはRange("A1")でもいいけど

そして取得したファイルパスに引用符を文字列として付けたいのですが、普通にダブルコーテーションで囲って文字列を結合しようとしても意味がありません。

Dim filePath as String
filePath = """ & Cells(1, 1)  & """

Debug.Print filePath
' " & Cells(1, 1)  & "
' 上のように出力されてしまう。

このような場合は文字コードを直接指定してあげるとよさそうです。

Dim filePath as String
filePath = Chr(34) & Cells(1, 1)  & Chr(34)

Debug.Print filePath
' "C:\Program Files\FOGE.exe"
' これでおっけー

複数の引数を渡して実行する方法

おまけ

実行ファイルFOGE.exeに加えて引数Arg1, Arg2を与えたいとします。 これらのファイルも空白含んでいるとして、次のようにするといいでしょう。

filePath = Chr(34) & Cells(1, 1) & Chr(34)
Arg1 = Chr(34) & Cells(2, 1) & Chr(34)
Arg2 = Chr(34) & Cells(3, 1) & Chr(34)

Dim ShellObject As Object
Set ShellObject = CreateObject("WScript.Shell")
ShellObject.Run filePath & " " & Arg1 & " " & Arg2

以上です。

MendeleyへのExportでブロックされる時の対処法

論文をScience DirectからMendeleyに直接ダウンロードする

Science DirectにはMendeleyに直接論文をダウンロードできる機能があります。 この辺の連携がしっかりしていないと、一度Science Directで論文をダウンロードしてからMendeleyのソフトを立ち上げてインポートする必要があります。

この面倒な作業が、Science Direct - Menedely間ではボタン一つで連携が取れるのです。 しかし、実際に使ってみるとアンチウイルスソフトにブロックされてしまいました。 Macでは有名なセキュリティソフトに「avast!」があると思いますが、こちらを利用しているとMendeleyにエクスポートする際にブロックされてしまします。

今回はその対処法を描いてみます。

対処方法

  1. アバストを開きます。

    f:id:tanisuke_str:20181227202509j:plain:w200
    アバストを開く

  2. 左にある設定タブをクリック
    シールド内にあるウェブシールドの設定をクリック

    f:id:tanisuke_str:20181227202541j:plain:w600
    ウェブシールドの設定画面を開く

  3. 除外するサーバーとしてプラスボタンをクリックして
    サーバー : https
    サービス : www.mendeley.com
    と指定する。

    f:id:tanisuke_str:20181227202651j:plain:w600
    サーバーを追加
    これで大丈夫です。
    ただ、仮にmendeley経由でウィルスが流入しても監視対象外となるので、その辺は自己責任です。
    以上。

Shellメモ

メモ用の走り書きだし正確性や可読性については勘弁してほしい。

$@, $*, "$@", "$*"の違い

引数に与えられる位置パラメータについて。

shell, bashなどではコマンドラインから実行する際に、引数は位置パラメータに設定される。
これを使って引数をプログラムに与えることが出来るののだ。また引数として(-oとか-hの様な)オプションを与えることも出来るようになる。
もっともオプションを使えるようにするためにはコマンドラインの入力を解析するためにプログラムは複雑になる。
こんな時はオプション解析コマンド getoptsを使えばかなり楽になるが、ここでは関係ないためこの辺にとどめておく。

閑話休題
この位置パラメータについて、具体的にかくとこんな感じだ。

コマンド 説明
$0 コマンドラインで実行されたファイルのファイルパスかコマンド
$1~$n コマンドラインで入力された引数を先頭から順番に格納してる
$# コマンドラインで入力された引数の総数を表す。
$@ コマンドラインで入力された引数の全てが格納される
$* $@と同じだが" "で囲んだ時の挙動が"$@"と違う

こんな感じだ、と言われてもピンとこないと思うので試してみる。
ここで実行するshellのファイルはtest.shとする。
また実行するtest.shはカレントディレクトリに配置されているものとする。
まずは与えられた引数がどのように格納されているかみる。

$0と$1 ~ $nについて

#!/bin/sh
echo $0
echo $1
echo $2
echo $3
echo $4

上記のtest.shを次のように実行すればこのように出力される。

$ sh test.sh aa bb cc
test.sh
aa
bb
cc

ここでshはshellを実行する宣言みたいなもの。
test.shは実行するファイル
aa bb ccが引数となる。
正しくはtest.shも引数である。多分
この時、コマンドラインに与えられた引数は3つのみなのに、echo $4としているため、出力の最後は空白行となっている。
このようにコードに書いた$nと引数が一致しなくてもプログラムはエラーを吐かないので注意が必要。

$10以上の時

また、$nの整数 nは基本的にはなんぼでもいけるが、$10以降は$10と分けて認識されてしまうため問題が生じる。
試しにやってみる。

#!/bin/sh
echo $10
echo ${10}
$ sh test.sh aa bb cc dd ee ff gg hh ii jj
aa0
jj

このように$10だと第一引数のaaと、$10の認識されなかった0が出力されてしまう。
この対策として${n}として{ }で囲うことで正しく出力されていることがわかる。

$@と$*について

この2つの挙動は同じである。
試しにやってみる。

#!/bin/sh
echo "\$@ -> $@"
echo "\$* -> $*"

これはこの様な結果になる。

$ sh test.sh aa bb cc dd ee ff gg hh ii jj
$@ -> aa bb cc dd ee ff gg hh ii jj
$* -> aa bb cc dd ee ff gg hh ii jj

同じですね。 もっと言えば、引数全てがスペース区切りで繋げられた状態で返されると認識しているといいかもしれない。

"$@"と"$*"について

試しにやってみる。

#!/bin/sh
echo "\$@ -> "$@""
echo "\$* -> "$@""

これはこの様な結果になる。

$ sh test.sh aa bb cc dd ee ff gg hh ii jj
$@ -> aa bb cc dd ee ff gg hh ii jj
$* -> aa bb cc dd ee ff gg hh ii jj

$@$*の時と同じ様に見える。
ここで$#setを使って引数の挙動を観察してみる。

#!/bin/sh
set -- "$@"
echo "$@"
echo $#

set -- "$*"
echo "$*"
echo $#
$ sh test.sh aa bb cc dd ee ff gg hh ii jj
aa bb cc dd ee ff gg hh ii jj
10
aa bb cc dd ee ff gg hh ii jj
1

$@の場合、setを通っても引数の数は10のまま変わない。
これに対して$*の場合は全て一つの引数としてまとめられたことがわかる。

したがって、この二つは引数全体を一つのパラメータとして扱う場合と引数を個別のパラメータとして扱う場合に使い分けることが出来る。
単に引数をLogとして出力する場合なんかは"$*"を使えば良い。

また、補足になるが引数を" "で囲んだ場合は囲まれた中身が1つのパラメータとして認識される。

#!/bin/sh
echo $#
echo $@
$ sh test.sh aa bb "cc dd"
3
aa bb cc dd

$@と"$@"の違い

この2つの違いは引数を" "で囲んだ部分がある場合に" "内を1つの引数として認識するかどうかである。 試しにやってみる。

echo $#
set -- $@
echo "$@"
echo $#

set -- "$@"
echo "$@"
echo $#
$ sh test.sh aa bb "cc dd"
3
aa bb cc dd
4
aa bb cc dd
4

実行時は" "で囲まれた部分が1つの引数として認識されている。
しかし、$@setしなおすと" "が無視されて引数が3から4に増えたことがわかる。 したがってsetする場合やforで値を取り出す場合に注意が必要である。 試しにforで引数を取り出してみる。

echo \$@
for i in $@; do
  echo ${i}
done

echo ""
echo "\$@"
for i in "$@"; do
  echo ${i}
done

echo ""
echo "\$*"
for i in "$*"; do
  echo ${i}
done
$sh test.sh aa bb "cc dd"

$@
aa
bb
cc
dd

"$@"
aa
bb
cc dd

"$*"
aa bb cc dd

ExchangeCharCo

この様に、$@の場合は" "を無視されていることがわかる。
また、"$*"では引数が1つにまとめられている事もわかる。

位置パラメータの再設定

プログラム内で位置パラメータを再設定することはできない。 例えば以下の様に再設定しようとしてもエラーが吐かれて終わる。

#!/bin/sh
$1=jj

位置パラメータを変更したい場合にはsetを用いる。

#!/bin/sh
echo $1 $2
set kk ll
echo $1 $2
$ sh test.sh aa bb
aa bb
kk ll

バラ星雲とコーン星雲

f:id:tanisuke_str:20181210130320j:plain
バラ星雲とコーン星雲

Photoshopを導入後初の天体写真

先日、僕もついにPhotoshopを導入する運びとなりました。
運びとなりました。と仰々しく書いていますが、ただ年間1万円近くの利用料金を払ってPhotoshopをインストールしただけですけどね。
それにしても、買い切り型よりもサブスクリプション型の方がなんとなく購入するまで構えてしまいがちです。

さて、Photoshopを導入したのはいいものの、ここ最近観測に行けていません。
不憫に思ったのか、Photoshop練習用にと師匠が撮影データを送ってきてくれました。
対称星はバラ星雲とコーン星雲です。また、見難いですがカタツムリ星雲も写っています。

色々と書きたいこともありますが、あまり時間がないので今日は成果報告として画像を上げるだけにします。
なんの面白みもない記事ですみません。
Photoshopでの画像処理法についてはまたいつかあげようと思います。

Mixhostのサーバー障害で記事が消えた時の対処法

事の発端

先日からレンタルサーバーのMixhostにてサーバー障害が発生していたようです。

Mixhostのサーバーは復旧したようですが、サーバーのデータが1週間前に巻き戻しされブログなどの記事も消されてしまったようです。
これによって今朝からTwitterではプチ騒動になっている模様。

僕自身、このサーバーを使っていないのであまり詳しくは把握していませんが、これの対処法について書きたいと思います。

問題と対処法

  • 問題
    Mixhostデータベースのデータが1週間程度前の状態に戻された。
    その結果、12月1日から12月9日までのブログ記事等は消滅。

  • 対処法
    サーバーから記事が消えてしまっても、Googleによってクロールされていればキャッシュが作成されているはず。 このキャッシュデータにアクセスして削除された記事を復旧する。 support.google.com

以上となります。

具体的な方法

※ 僕はMixhostを使っていないので画像などははてなブログになっています。

  1. まず自分のWebサイトをGoogleで検索します。

  2. 写真矢印の部分をクリックするとキャッシュと表示されるのでそこをクリック。

    f:id:tanisuke_str:20181210123836j:plain:w600
    矢印の部分をクリックすると「キャッシュ」と表示される

  3. すると削除以前のブログページを開くことができますので、削除された記事のタイトルをコピーしておきます。
    f:id:tanisuke_str:20181210124657j:plain:w600

  4. コピーしたブログタイトルをGoogleで再び検索します。
    2番と同様に検索結果からキャッシュページを表示します。

これで削除されたページが見れるようになるはずです。
記事が削除されても、キャッシュから復旧できればあとはコピペするなりして元に戻せるのではないかと思います。