WindowModePatchに最前面管理か…

なんかタイトルがおかしいですが、掲示板への返信ではなくこちらで書いてみたいと思います。

 

WindowModePatchをしばらく放置していたので少し修正してみた

掲示板の要望を見たから、というのもあるのですが、修正したものを作成してみました。一応最前面管理のような機能を追加して、アクティブウィンドウに関する処理を追加しています。処理を行わせた場合に不具合が出る、というわけではないのですが、そのオプションがないと不具合が出るプログラムがあれば詳細が詰められるのに…という状態で、まだ試作レベルとなってしまっています。今現在は設定には直接設定ファイルを書き換える必要があります。

 

ただし、まだ正式リリースはしない予定

WindowModePatchがWindowsDefenderによりウイルス扱いされた件があることもあり、様子見です。公開の準備はできている(Ver 0.72Alpha相当)のですが、このまま公開せずにスキップするかもしれません。いろいろと気に入らない点が見つかって、「直したいんだけれども…」といったところでしょうか。ここまで来るとプログラム上の処理の数が多すぎて追いかけるのが大変なんですよね…。まるでコンピュータウイルスの解析をしているような感覚に襲われたこの改良作業でした。

 

CMSサイトの構築とSELinux

というわけで今回はこういう話題です。ほとんどの解説サイトがSELinuxを前提にしていない書き方をしているためにこの系の権限変更がちゃんと行われず、サイトの初期設定すらまともに行えない、という現象にはまることが多いような気がするのでそれについて書いてみます。

 

SELinuxが持っているhttp系の初期権限

これを知らないと大変なことになります。SELinuxでは、http系で操作される各種ファイルについて以下のようなラベルを割り当てて管理しています。大まかに必要な分だけですが…。

権限名 意味 権限
httpd_sys_content_t 通常コンテンツ 読み込み専用
httpd_sys_rw_content_t 通常コンテンツ(読み書きあり) 読み書き
httpd_sys_script_exec_t 実行可能コンテンツ(CGIなど) 読み込みおよび実行
httpd_var_lib_t /var以下に存在するhttpの動作に関わる補助ファイル(phpのキャッシュなど) 読み書き
httpd_var_run_t /var以下に存在するhttp上で実行されるコンテンツの補助ファイル(phpのセッションなど) 読み書き

下二つはあまり関係しませんが、php-fpmなどの設定時に関わってくることがあります。で、問題は上の3つ。

 

SELinuxがhttp系ファイルにつける初期ラベルはhttpd_sys_content_tになる

これが要注意ポイント。つまり読み込み専用になるわけです。この状態は通常のコンテンツをアップロードしたときには正しいのですが、CMSサイトのようにディレクトリ内にキャッシュを持ったり、自分自身でファイルのアップデートを行うコンテンツにおいては非常に相性が悪い(というかこの状態だとうまく使えないこと)になってしまいます。

 

CMSサイトのディレクトリにはhttp_sys_rw_content_tをつけないとインストールできないことも

この件について調べるのにかなり時間がかかってしまいました…。特に内部的にキャッシュディレクトリを持つ場合はそのキャッシュディレクトリにhttp_sys_rw_content_tを設定しておかないとキャッシュが動かず実行できません。これは大変です。また、CMSの場合たまにあるのが、アップデート時に何らかのスクリプトをCGI権限で動かすパターンがあるのですが、その場合は個別にhttpd_sys_script_exec_tを設定しないとたとえchmodによる実行権があってもSELinuxにより実行が拒否されますので対応する必要があります。

 

CMSサイトのディレクトリには必要な部分にhttp_sys_rw_content_tを設定しよう

という結論になります。もちろん、全域に設定するとセキュリティが弱くなるので必要な部分だけ、というのはあるのでコンテンツに関するディレクトリだけです。例えば/var/www/cms以下にコンテンツをインストールして、/var/www/cms/webroot以下を書き換え可能にするとするなら

# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/cms/webroot(/.*)?"
# restorecon -R -v /var/www/cms/webroot

のような処理が必要になります。この処理はターミナル上からしかできないのでSELinuxを設定している時は要注意になります。また、実行権が必要になるファイルにもhttpd_sys_script_exec_tの設定処理が必要になりますので、これを参考にやっておきましょう。

 

SELinuxがセキュリティに貢献していることがよくわかる…

chmodによる権限変更だけでは受け入れない堅さが自慢です、というところですか。面倒ですが、少しずつ覚えていって使いこなせるようにならないとまずいような気はしますね。

 

Fedora32のPHPは初期設定でphp-fpmになるのか…

そして今回の出来事の中で気がついてしまったこと。昔はApacheの場合はphpがhttpd上で動く組み込みパターンになるのでphpの実行者はhttpdの実行者と同じになっていたのですが、Fedora32の場合は初期設定がphp-fpmによる外部動作なので、phpの実行者がphp-fpmで設定されている実行者になる、という「suexecを考えるよりはわかりやすいのか?」という状態になっているようです。このあたりも気をつける必要がある人は気をつけましょう。

VBAの小技 Excelで指定した領域を除外した領域を作る

またまた何か変な小ネタですが…ちょっととあることをやっていると「Excelにおいて、指定した領域のうち、ある部分だけが含まれない状態を作りたい」という不思議な要求が出てきたので、それをかなえるべくVBAで処理を組んでみました。Excel限定ですので多分VBA以外でこんな処理は作れないでしょうし、作る意味もない、というか。

 

コードは…

こんな感じでしょうか。

Function ExcludeRange(rr As Range, re As Range) As Range
    Dim ra As Range, rt As Range, ri As Range, ret As Range

    For ai = 1 To rr.Areas.Count Step 1
        Set ra = rr.Areas(ai)
        For i = 1 To ra.Rows.Count Step 1
            For j = 1 To ra.Columns.Count Step 1
                Set rt = Range(Cells(ra.Row + i - 1, ra.Column + j - 1), Cells(ra.Row + i - 1, ra.Column + j - 1))
                Set ri = Application.Intersect(rt, re)
                If ri Is Nothing Then
                    If ret Is Nothing Then
                        Set ret = rt
                    Else
                        Set ret = Application.Union(ret, rt)
                    End If
                End If
            Next j
        Next i
    Next ai
    Set ExcludeRange = ret 
End Function

 

構想は…

考え方はこの通り。

  • Rangeから直接差のRangeを取り出すことはできないので、「重なっていない」セルだけをくっつけていくしかない
  • 仕方がないので、Forループで一つ一つ領域→行→列を巡回して指されたRangeに重ならないかどうかを調べる(Intersectでのチェック)
  • あとは結果となる領域にくっつけていく

になります。なお、はじめのRangeに含まれているすべてのセルを巡回する特性上、かなり遅いです。参考として出しているだけですので、本気に使いたいのであればもう少し最適化が必要だと思います。(行方向のみに限定したり、列方向に限定する、など)ちゃんとRangeオブジェクトのためにIntersectやらUnionやらOffsetやらの処理はあるのに…。

まあ、ゲームの描画でも、DirtyRect管理で重なっている文の検出やら最小の再描画領域になるようにRectを再構築するなどはありそうですが、指定した範囲の除外なんていうのはほぼ出てこないパターンでしょう。アルゴリズムを考えてみる分には面白いのかもしれませんが。

 

Fedora32をインストールしてみた

今回のFedoraは公開されてからあまり時間をおかずにインストールしています。一応今のところは不具合などはありませんが、それでも変更点は何個もあったのでそれを紹介していきたいと思います。

 

パーティションはほぼデフォルトで

Fedora30のときにはext4で…と書いていましたが、今回はほぼデフォルトに任せてパーティションを設定させました。そうすると、boot系のパーティションを除きLVMで作成され、しかもデータパーティションの形式はxfsになっていました。xfsが標準となりつつあるのでしょうか…?

 

ファイアウォールの設定に少し戸惑った

ファイアウォールの設定は以前からfirewall-cmdを通す形式だったのですが、バックグラウンドがiptablesからnftablesに変わったからかよくわかりませんが、デフォルトで適用されるゾーンの名前がpublicからFedoraServerになったようです。このため、以前は–zone=publicを指定して設定していたポート開放処理ですが、Fedora32では—zone=FedoraServerを指定しないと正しいポート開放にならなくなっているようです。このあたりはfirewall-cmdでリストを出せばわかるのですが、一発では気がつかない現象でした。

 

cronが標準でいなくなった?

はじめにこれを感じたのはcrontabのコマンドがなくなったことでした。crontabのファイル自体は存在していますが、コマンドからのファイル編集がなくなっているので…と思いちょっと見てみると、cron自体が入っていなくなったのですね…。

じゃあcronの代わりは?というとsystemctlのtimerを使って定期的にジョブを動かす、という仕掛けになっているようです。つまり、自分でtimer(+service)の設定ファイルを作成し、systemctlで有効にする、という手順をとらないと以前にcronでやっていた「定期的にスクリプトを動作させる」ということが標準でできないようです。この差はちょっと大きいですね。しかも、SELinuxを有効にしたままだとスクリプトファイルの権限に関する問題(ファイルの実行フラグではなくSELinuxに基づく実行許可問題)が現れてしまい、auditの設定やらsemanageやらなんか面倒なことをする必要が増えたな~という感想です。セキュリティは強化されているのですが。

 

どうせ「StayHome」なので、こういうときにこそ更新作業をしよう

長期の休みなので、家でしかできないことシリーズとしては、こういうOSの更新作業なんていうものは典型的なものだと思いますので、皆さんも思い出した段階でやっておきましょう。

メインサーバにFolding@homeを導入して新型コロナウィルスなどの解析に協力してみた

さすがに新型コロナウィルスの影響がしゃれになっていない状態になってきています。自分の身にも転職や請負の仕事などで降りかかっていますし…。ということでちょっとある動画でやっていた、いわゆる余っているPCの能力を組み合わせていろいろなものを調べる系(分散コンピューティング)のプロジェクト、今回は特に新型コロナウィルスなどの構造解析をやっているFolding@homeを導入してみたいと思います。

 

今回はLinux版(Redhat系)でやってみる

メインマシンに入れるとファンの音の問題や消費電力の問題も大きそうですので、サーバー機に入れてやってみようと思います。さすがに世界的なプロジェクトだけあってWin版以外にもmac版、Linux版(Debian系、Redhat系)などがありますので自分に適したものを導入すればOKです。手順としてはこんな感じ。

 

1. ホームページ(https://foldingathome.org/)から上のメニューより「Start folding」をクリックする

2.ダウンロードページの中程にある「alternative downloads」のリンクをクリックする

3.各OSにインストールするときのインストールプログラムおよびパッケージへのリンクがあるので必要なファイルをダウンロードする

このとき、GUIからの監視や設定プログラムがなくてもよい場合はfahclientのみでOK。監視プログラムを入れる場合は特に別PCから監視する場合はいくつかのポートを開いたりするなどファイアウォールの処理が必要になるので注意。

4.root権限を使ってパッケージをインストールする。

DNFが使えるFedora系ならば(3/29現在だと)

$ sudo dnf install fahclient-7.5.1-1.x86_64.rpm

でOKです。openssl系のパッケージが必要になるのでそこだけ注意。

5.インストールが完了すると勝手に動作を開始するので一度停止させる

いくつか設定をちゃんとする必要があるので動作を停止させましょう。本当をいうならreloadができるはずなので止めなくてもよいかもしれませんが、初期設定の場合は一度完全に止めた方が確実でしょう。

$ sudo /etc/init.d/FAHClient stop

6. 必要な設定を作成する

初期設定だけならFAHClientからファイルを作ることができますのでそれを使いましょう。

$ sudo FAHClient --configure
User name [Anonymous]:(自分を示すユーザ名を入力する。空欄ならAnonymous)
Team number [0]:(参加したいチームの番号を入力する)
Passkey:(パスキーを入力する)
Enable SMP [true]: (複数CPUへの分散を行うときはtrueを指定する)
Enable GPU [true]: (GPU[OpenCLやCUDA]を使用するときはtrueを指定する。認識されていなければ動作しない)
Name of configuration file [config.xml]:(空欄でOK)

7. /etc/fahclient/config.xmlを編集してCPU使用率に関する指定をする。

エディタで設定ファイルを開いてもう少し細かく設定します。特にCPUやGPUの使用率に関してもっと使ってほしい場合にはこの設定項目を変更します。

 <power v='light'/> (ここをmediamやfullにすると使用率が上がる)

8. サービスを再起動する

$ sudo /etc/init.d/FAHClient start

 

実行に必要になるものは勝手にダウンロードされるので後は放置でOK

解析させたいタンパク質のデータもそうですが、対象のPCにあう解析プログラムがダウンロードされるので、それが実行されるまでしばらくかかるようです。実行されるとCPU使用率が大幅に上がるはずです。なお、実行で使われるデータ、プログラムおよびログは/var/lib/fahclient以下にありますので解析ログを見てみたい人は直接見てみるとよいと思います。そんなにこまめに見るものでもないと思いますが。

 

昔はSETI@homeがあったな…

こちらは「宇宙から来た電波などを解析して宇宙人の痕跡を探す」でしたが、すでに終了しています。こういう分散コンピューティングの先駆けともなっているものを知っているのでこういうときに協力してみようという気になるわけですね・・・。