韜晦日記

韜晦日記

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

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

リスト内包表記を使って、空の要素にのみ値を入れる

Python3のリスト内包表記

取得したリストの要素が存在していたり、空だったりとそう言うデータがあるとします。
処理する際に要素が空だとエラーを吐いてしまうことがあったので、空の要素のみに何か値を入れる方法を考えました。
1行でシンプルに書きたかったので以下のようにしました。

arr = ['0' if i == '' else i for i in arr]

実際にやってみる。

arr = [1, '', 'テスト', 4, '', '23']
arr = ['0' if i == '' else i for i in arr]
# [1, '0', 'テスト', 4, '0', '23']

終わり

RDP Wrapperでリモートデスクトップできないときの対処法 【Win10 Home】

※ 対応バージョンの注意
この解決方法は以下のWindows10のバージョンまでしか対応できません。

  • Edition : Windows10 Home
  • Version : 1809
  • OS build : 17763.379(10.0.17763.379)

バージョンの確認方法は、キーボードのWindowsボタン(窓アイコン) + sと打ちaboutと検索すると確認することができます。
あるいはWindows のバージョン確認方法のようにWindowsボタン(窓アイコン) + rwinverで検索する方法もあります。
2019.4月現在、最新であるOS build : 17763.437に対する対処法はまだないようです。残念ながら公式Githubを観察するしかなさそうです。

MacからWindowsをリモート操作する

Macや他のWindows機を使ってWindows機を操作する方法としてRemote Desktopがあります。
これはWindows10 Proなどではデフォルトで使用できるのですが、Windows10 Homeでは利用できません。
そこでRDP Wrapper Library v1.6.2 を用いてリモートデスクトップを実現します。

ここではRDP Wrapperが使えず、エラーが起きた際に私がとった対処法を書きたいと思います。

まずはインストールや設定など。

RDP Wrapperのインストール

インストールは公式GithubのReleasesの最新版をインストールします。

インストールの仕方などは以下のサイトが参考になります。
素直にそのままやればインストールはできるはずです。

Windows Homeにリモートデスクトップで接続する方法 【RDPWrap】 - WICの中から

Windows 10 Homeにリモートデスクトップ接続できるようにする | 俺的備忘録 〜なんかいろいろ〜

そして全然解決できないエラー

数ヶ月前までは普通に使えていたのですが、突然接続した際にエラーが出るようになりました。
実際のエラー画面が以下のようになります。

f:id:tanisuke_str:20190414235831j:plain:w600
Microsoft Remote Desktopのエラー画面
f:id:tanisuke_str:20190414214113j:plain:w600
ついでにParallels Clientでのエラー画面

対処法を模索する

そこでWindows10側にインストールしたRDP Wrapperの設定画面を確認してみます。
まずはダウンロードしたRDP Wrapperのフォルダを開きRDPConf.exeファイルを実行します。
すると管理者権限の承認画面のあとに以下のような画面が現れます。

f:id:tanisuke_str:20190414214823p:plain:w600
RDP Wrapper Configurationの画面

この画像を見る通り、Listener stateの部分がNot listening [not supported]となっていました。
人によってはlistening [not supported]Not listening [fully suppoted]となっているようです。
いずれにせよ、ほとんどの場合でListener stateの部分がlistening [fully suppoted]とならない限りは接続することはできないようです。

これについて公式Githubのissuesを確認して見ると解決方法について議論されていました。

ここでの会話から以下のことがわかりました。

  1. Windows updateにより、termsrv.dllがアップデートされた
  2. それに伴い、rdpwrap.iniを更新しなければならない
  3. RDP warpperのアップデートが来るまでは自分でrdpwrap.iniを変更する必要がある。

さて、解決方法は分かったのであとは修正するだけです。

対処法

対処法はシンプルで、rdpwrap.iniを書き換えるだけです。

rdpwrap.iniを確認する

rdpwrap.iniを開くために、windows + rC:¥Program Files¥RDP Wrapperと入力してOKします。
それか、Cドライブ直下のProgram FilesフォルダにあるRDP Wrapperを開きます。
するとrdpwrap.initermsrv.dllファイルがあることが確認できるはずです。
ここでrdpwrap.iniを書き換えるので念のためコピーを保存して起きます。

テキストエディタを管理者権限で開く

お使いのテキストエディタを管理者権限で開いてください。
普通のメモ帳でも構いません。そしてrdpwrap.iniを開きます。

中身を書き換える

変更箇所は2箇所あります。
まず始めに3058行目あたりにジャンプするか、[SLInit]と検索します。
すると、以下のように書かれていると思います。

[10.0.17763.1]
LocalOnlyPatch.x86=1
.
. // 中略
.
SLInitFunc.x64=New_CSLQuery_Initialize

[SLInit]
.
.
.

この[SLInit]の前に以下の文を挿入します。
必ず前後にあるSLInitFunc.x64=New_CSLQuery_Initialize [SLInit]から1行ずつ離してください。

[10.0.17763.292]
; Patch CEnforcementCore::GetInstanceOfTSLicense
LocalOnlyPatch.x86=1
LocalOnlyOffset.x86=AFAD4
LocalOnlyCode.x86=jmpshort
LocalOnlyPatch.x64=1
LocalOnlyOffset.x64=77A11
LocalOnlyCode.x64=jmpshort
; Patch CSessionArbitrationHelper::IsSingleSessionPerUserEnabled
SingleUserPatch.x86=1
SingleUserOffset.x86=4D665
SingleUserCode.x86=nop
SingleUserPatch.x64=1
SingleUserOffset.x64=1322C
SingleUserCode.x64=Zero
; Patch CDefPolicy::Query
DefPolicyPatch.x86=1
DefPolicyOffset.x86=4BE69
DefPolicyCode.x86=CDefPolicy_Query_eax_ecx
DefPolicyPatch.x64=1
DefPolicyOffset.x64=17F45
DefPolicyCode.x64=CDefPolicy_Query_eax_rcx
; Hook CSLQuery::Initialize
SLInitHook.x86=1
SLInitOffset.x86=5B18A
SLInitFunc.x86=New_CSLQuery_Initialize
SLInitHook.x64=1
SLInitOffset.x64=1ABFC
SLInitFunc.x64=New_CSLQuery_Initialize

そしてこのファイルの末尾に以下の文を挿入します。
これも前のコードから1行必ず開けるようにしてください。

[10.0.17763.292-SLInit]
bInitialized.x86 =CD798
bServerSku.x86 =CD79C
lMaxUserSessions.x86 =CD7A0
bAppServerAllowed.x86 =CD7A8
bRemoteConnAllowed.x86=CD7AC
bMultimonAllowed.x86 =CD7B0
ulMaxDebugSessions.x86=CD7B4
bFUSEnabled.x86 =CD7B8

bInitialized.x64 =ECAB0
bServerSku.x64 =ECAB4
lMaxUserSessions.x64 =ECAB8
bAppServerAllowed.x64 =ECAC0
bRemoteConnAllowed.x64=ECAC4
bMultimonAllowed.x64 =ECAC8
ulMaxDebugSessions.x64=ECACC
bFUSEnabled.x64 =ECAD0

これでrdpwrap.iniの変更は完了です。

再起動して再チャレンジ

PCを再起動して再びRDPConf.exeファイルを実行します。
すると......
Listener stateの部分がlistening [fully suppoted]となっているはずです。

これで再びMacからRemote desktopを実行すると見事に接続することができるようになりました。

めでたしめでたし。

Javascriptをローカル環境で実行可能にする【Mac】

単なるメモ

特に目新しいことがないので参考にした以下のサイトを参照するのが手っ取り早いでしょう。
断りがない限り、コマンドはコンソール上で入力するものになります。$を除いた文字をコピペして使います。

環境構築の流れ

  • インストール関連
    1. Homebrewのインストール
    2. nodebrewのインストール
    3. node.jsのインストール


本当はWebpackやbabelも一緒に使うと良いそうなのですが、その辺はまだよく分からなくて使えていません。 それではやっていきましょう。

インストール関連

Homebrewのインストール

Homebrewがインストールされているか確認

$ brew -v
-bash: /user/local/bin/brew : No such file or directry

インストールされていなければこのように出ます。
インストールされていればバージョンが表示されるのでここはスキップしてOKです。
以下のコマンドをコピペして実行します。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

途中でEnterの入力やユーザーパスワードの入力が求められるので入力します。
パスワードは入力しても何も表示されませんが、問題ないので入力してEnterを押します。

  • インストール完了の確認
$ brew -v
Homebrew 2.0.3

これでインストール完了

nodebrewのインストール

node.jsのバージョンを管理するためのツールになります。

$ brew install nodebrew
~~~中略~~~
==> Summary
🍺  /usr/local/Cellar/nodebrew/1.0.0: 8 files, 38.4KB, built in 4 seconds

以上が出れば終わり。
インストールが終わったら以下のコマンドをうつ。

$ nodebrew -v
~~~中略~~~
    # use a specific version number
    nodebrew use v8.9.4

と出ればおっけい。

nodebrew経由でnode.jsをインストール

以下の6つのコマンドを順番に実行
特にnodebrew setupなどは実行しないと使えないので注意。

$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
$ nodebrew setup
$ nodebrew install-binary stable
$ nodebrew use stable
$ node -v

これで正常にインストールされたはずです。 次に実際にデバッグ環境を作り、デバッグします。

デバッグ環境の初期化

まずはじめにVScodeを起動します。
適当にtestフォルダを作成します。
ターミナルを開きcdでtestフォルダに移動します。

npmパッケージ管理ファイルpackage.jsonを作成

npmパッケージ管理ファイルであるpackage.jsonはnpmで管理しているファイルの依存関係を示したファイルになります。
jsファイルの実行に必要な外部ファイルをpackage.jsonに入力することで、実行時にそのファイルを自動でインストールしてくれるようです。
詳しくはまだ理解できていませんが、取り敢えずはこんな認識でいいのでしょうか。

ターミナルでtestディレクトリに移動したら、テスト用のindex.jsファイルを作成します。

test$ touch index.js 

これでindex.jsができます。 次にpackage.jsonを作成します。

test$ npm init -y

npm initでnpm管理用のファイルであるpackage.jsonを作成して-yではこのコマンドに対する問いに全てyesと答えるという意味になります。 すると色々書かれたpackage.jsonが生成されます。

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

これでOK

VScodeデバッグする

index.jsVScodeで開きます。
写真のように、VScodeの左側あるフォルダを開くからtestフォルダを開きます。

f:id:tanisuke_str:20190325161522j:plain:w600
VScoedを開いた画面
次に、index.jsを開き、簡単なコードを書きます。
f:id:tanisuke_str:20190325161527j:plain:w600
適当にコードを書きます。コードの左横にある赤いマークはブレイクポイントです。
実行するには左にある、アイコンの下から2番目をクリックします。
すると上部に再生ボタンと赤いバッチのついた設定マークがあるのでマークをクリックしてnode.jsを選択します。
f:id:tanisuke_str:20190325161528j:plain:w600
デバッグの構成を選択
あとは再生ボタンを押すことでデバッグが開始されます。

RIETAN-FPに関するメモ

解析全般

  • 初期のパラメータは収束の安定性や正確性に直結するため非常に重要になってくる。
    特に格子定数があっていないとプロファイルパラメータの精密化の段階で躓いてしまう原因になります。
    自分で最小二乗プログラムを作成し、格子定数を精密化するか、格子定数決定用のプログラムをダウンロードして正確な格子定数の値を決定すべきです。
    特に元素を置換したようなサンプルだと格子定数が変化する可能性が高いので要注意です。 格子定数であれば線形最小二乗で求められるので比較的容易にプログラムを作成できます。いつか余裕のある時にその辺の記事もかけるといいです。

  • フィッティングが良好かグラフを拡大して確認することをお勧めする。
    解析をする際にステップごとに回折パターンや残差の比較を行い解析の手ごたえを感じることは非常に重要であると考えています。
    しかし、描画された回折パターンを自由に拡大・縮小することが困難だと精神衛生上よろしくありません。
    従ってインタラクティブなグラフィックソフトを使用することが賢明です。 NPAT = 1で計算を行い、秀丸Plotを実行するとPDF化されたグラフが描画されますがあまり好ましくは思いません。
    そんな時はNPAT=2としたうえで、RIETVIEWで描画するといいでしょう。ただし秀丸支援環境下でこれを実行するにはPlot.macgtool を3に変更する必要があります。

線形制約条件に付いて

  • 複数個のパラメータを同じ値に固定したいとき
    例えばAl1, Al2, Al3, Al4の等方性原子変異パラメータを同じ値に固定したいときは、一つのIDを1にして他は2にする。
    つまり、条件式にはID = 1のパラメータを右辺に書いて他のID = 2は左辺に書く。
# 構造パラメータ
Al1  ........ 00001
Al2  ........ 00002
Al3  ........ 00002
Al4  ........ 00002

# 線形制約条件
A(Al2, B) = A(Al1, B); A(Al3, B) = A(Al1, B); A(Al4, B) = A(Al1, B)

ちなみに等方性原子変異パラメータについては以下の5節を参考にするといい。 Know-how and Techniques of Rietveld Analysis

自動解析するときの覚書

いくら自動化に頼ろうとも、逐次確認を怠らない方が身のためだと考えます。
私は10サンプルを20~30stepで軽く解析した際にいくつかR因子が大きくなってしまったことがあります。
これは途中で確認していれば回避できたようなミスで余計な手間を増やしてしまいました。
今のところRIETANを自動解析するような有力なソフトはないようですが、今後自動化が進もうとも完全に手放しにするのは賢明ではなさそうです。
余談ですが、天体撮影においてもいくら自動化が進もうとも、撮影機材から目を離してのんびり車のなかで寝ていたりすると思いっきりガイドがあれて碌な写真しか撮れていなかったりします。まあ、何が言いたいかというと、自分の仕事はちゃんと面倒をかけよう。。。

多相解析の時

事前に各サンプルでバックグラウンドと尺度因子、格子定数を合わせて精密化して、R因子が大きくないか確認する。
特に相分率が主相以外が極端に少ない場合は確認しないと局所解にまっしぐらになることがあるので注意。
R因子が大きい時は主相のU, V, Wを合わせてみる。順番はW⇒U, Vとする。 これで下がらない場合はAsymmetry parametersも合わせてみる。最初の1, 2つ合わせるだけで大幅に落ちることもある
また格子定数がずれているようであれば、まずはDICVOLなどを用いて格子定数を合わせる。

※あとでDICVOLを用いた格子定数の合わせ方のリンクを貼っておく

プロファイル, 格子定数を精密化しても合わない場合は格子定数の精密化を解除してシフト因子を精密化してみる。 シフト因子はその他のパラメータと相関が強いため扱いには注意が必要だが少しは下がるだろう。 ある程度フィッティングがあえば安定して解析が進むはず。

ファイルの指定した行から他のファイルにコピーする。【batファイル】

指定した行から最終行まで他のファイルにコピーするためのバッチファイルを作りました。
私はこれを使って実験データを整形し解析に用います。

やりたいこと。

内容としては以下の通りです。
コピーしたいファイル : a.txt
コピー先のファイル : b.txt
a.txt内のテキストをある行から最終行までコピーしてb.txtに出力します。 今回はううう の3行目から最後まで出力してみます。

a.txtの中身

あああ
いいい
ううう
えええ
おおお
かかか
ききき

バッチファイルの中身

@echo off 
echo %1

type %1|more +2 >>%~p1%b.txt

実行結果b.txt

ううう
えええ
おおお
かかか
ききき

実行方法

  1. 適当なフォルダにバッチファイルを作成します。(どこでもいいはずです。)
  2. 作成したバッチファイルにコピーしたいファイル(a.txt)をドラック&ドロップします。

以上です。コピーしたいファイル(a.txt)があるフォルダの中にb.txtが生成されます。

わざわざコマンドを打たなくてもいい理由は、第一引数を受け取っているからです。 %1は第一引数を表しており、ドラック&ドロップされたファイルのパスが入力されます。
そして出力ファイルは%~p1%b.txtとなっていますが、%~p1%は第一引数で得たパスのフォルダを表しています。なので、コピーしたいファイルのフォルダの中にb.txtが生成されるわけです。

行の指定

行の指定にはtype %1|more +2 >>%~p1%b.txt+2の部分を指定したい行数に変更します。
ここで注意するのが行数のカウントは0からスタートしますので、0から数えて何行目かを指定してください。 案外簡単ですよね。

おまけ

テキストファイルの行数をカウントして出力したい場合は type %1|find /c /v "" >>%~p1%b.txt
とするといいでしょう。(実験データの整形に利用したため。)

おわり。

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

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する改行コードを指定してあげればよいと思いますが。 ややこしいことはしていないので何となく個人的にわかりやすいコードな気がします。

以上