極北別世界通信

極北別世界通信

軽井沢高原文庫

あまり本サイト内では書いてなかったような気がするが、当方は立原道造という詩人をこよなく愛している。

詩というものにわずかながらでも触れたことがある方にはそれなりに知名度もある詩人だが、世間的に超メジャー化というとそこまでではないようにも思うが、いずれにせよ当方の最も愛する詩人であることだけは確かだ。

一番好きなのはやはり「風に寄せて」その1 だが、詩も、物語も、建築もすべてにおいて非常に心惹かれる詩人なので、ご興味ある方は是非手にとって読んでほしいと思う。

今年は立原道造の生誕110年にあたり、軽井沢高原文庫で立原道造展が開催されている。

かつて東京にあった立原道造記念館に所蔵されていたものが現在軽井沢高原文庫に収蔵されていることは認識していたが、久しぶりの立原道造展ということでいかない選択肢はないなと春先から思っていた。

で、嫁さんと子供にも一応の許可?をとって一人軽井沢に旅立った。

というか軽井沢自体が30年ぶりのことで、30年前にはまだ立原道造も療養した「油屋旅館」が営業していた。

10数年前に廃業したというようなニュースはみていたのだが、それが数年前からいろいろな方の努力で形は残っていることがわかり、今回の宿泊先にすることとした。

もちろん30年前とは異なり、素泊まりのみの簡易宿泊ではあるが、それでも油屋という建物が残ったことがうれしい。

正直なところNPO団体の活動というものにこれまで成果というものを感じたことはなかったのだが、なるほどこういう風に役に立つのだなと(むろん、頭ではわかっているのだが)ようやっと身に染みて感じた次第ではある。

年額1万円くらいなら賛助会員くらいなっておこうかな。。。とすら考えている。

グダグダとりとめもなく書いたが実際に軽井沢高原文庫の立原道造展へお邪魔するのは明日。今日はある意味前乗りして現地の雰囲気に脳みそを慣らしておこうというところである。

というわけで昼酒して早めに寝て明日は朝イチから軽井沢高原文庫に移動してゆっくり展示会を見る所存。

0

NetCommons3がEOL (という表現が正しいかはわからないが)

Netcommons2、Netcommons3と使用してきましたが、どうやらOSSとしての公開が来年3月で終了する模様。

 

NC4ってのを内部的に作ってるようですが、それはOSSとして公開されない模様。そういうことやってるからお国主導のOSSが見限られるんじゃないのかなぁと思わなくもない。個人的にはNetcommons3的なCMSってほかにあまりなくて、全体を組みやすかったのでよかったのですが。
(サイトデザインみたいなことにあまり興味がないからというのもありますが)

いまんところは中の人がフォークしたConnect-CMS に移行するのがいいのかなぁ。当方の場合コンテンツ量は現状大したことないので別の何かを探すのもありなのですが。

0

技術書典16参加予定

5/26のオフライン開催含めて、技術書典16に参加予定です。

マイナーOSネタが間に合うか微妙。。

ITインフラ周りの拾位集みたいな内容の本は出るのではないかと思います。

0

11/12は技術書典15オフラインに出展します。

「(き08)」というスペースになるようです。

Operating System Maniacs 2nd Season Version 9.0

頒布予定です。

夏コミで頒布してたVersion8、既刊もなるべく持っていく予定です。

https://techbookfest.org/organization/67530006

今回はDabble in (OSS中心の技術系同人誌)は間に合わなそうですが、1つ2つネタはあるので、会期末までに間に合えば電子版での頒布は開始するかもしれません。

よろしくお願いします。

0

技術書典15

出典しまする。

いまんとこネタはあるけど時間がどうかというところ。

マイナーOSネタは、エミュレータ+若干ヒストリカルなやつ、

いっちょかみ本は、Stable Diffusion関連の続きかなー、というところ。

0

コミックマーケット102

ちゃんと書いてなかったのでこちらも。

「Fnow」として、コミックマーケット102で
8/13「日曜日 西地区 “か” ブロック 06a」
に配置されました。原稿頑張らんと

https://webcatalog.circle.ms/Circle/Map/17302883/1 #C102WebCatalog

カットにもある通りVMSとかメインフレームの試用版とかいろいろ予定してます。

あと、技術書典で頒布したStable Diffusion Web UIの導入関連の印刷版も
多少なり持っていくかもしれません。

。。。なんでかタイトルだけ「103」になってました。。。修正したです。

 

0

技術書典14

Twitter側だけ投稿してて書いてなかった。。。

今更感溢れますが、備忘録的サムシングとして一応記載。



 

技術書典14参加してます。オンラインのみです。


https://techbookfest.org/organization/67530006

大したもんではないですが一応新刊3冊
とはいえメインのはずのマイナーOS本は今回途中までしか試験が完了してないので無料版です

0

Stable Diffusion

まぁあっちこっちで大量にブログ記事出てますし今更感もありますが、一応やったことは書き留めておこうの方針。

■ハードウェア

必須:nVidia製 VRAM 12GB以上のグラボ

厳密に言えばもっと低スペックのものでも動きますが、5万弱くらいですしさんざん遊び倒せるのでこのために購入するもアリかと

いまだとあっちこちで書かれてますが GeForce RTX3060 12GB (当方もこれ)が手ごろかと。

なおCPUは早ければ早いほど、メモリは多ければ多いいほどいいと思いますが、当方環境は

CPU:Core i3-4xxx(第4世代)

メモリ:16GB

でもなんとかなってるのでまぁ。

それよりもデスクトップPCを持ってない、あってもメインの1台、ケースが多いと思うので(複数台持ってるようは人はもうやってるでしょう)そこのほうがネックになるかもしれませんね。

可能ならこれ専用のマシンが1台あるほうがベターです。

中古型落ち品でCore5-7xxx以下の型番なら (Windows 11が確実に動かないので)今なら投げ売りしてる気がするのでなんとか準備してください。

 

 

■導入

・Python 3.10.6 のインストール https://www.python.org/downloads/release/python-3106/

※3.11が最新ですが、3.10.6でないと動きません。あと言うまでもないですが64bit版です。

インストールは普通にダブルクリックして進めればいいですが以下2点を注意

1.「Add Python 3.10 to PATHにチェック」

Pythonのインストーラの最初の画面では、左下に「Add Python 3.10 to PATH」というチェックボタンがあるのでチェックします。

その後、Install Nowを押してインストールを開始します。

2.パス最大260文字制限の解除

インストールが完了した後で「Disable path length limit」というボタンが見えますので、これを押します。
これを押すと、260文字までのパス長(フォルダ名などの長さ)の制限を解除するためのレジストリ変更処理が行われます。

なぜやるか?というと、Stable Diffusionなどの処理で、長いパス名を実行したりする際に260文字以上になる場合があり、エラーになってしまうことがあるからです。

コマンドプロンプトを起動して「python -V]

を実行してバージョンが表示されればOK

・git のインストール https://gitforwindows.org/

Git公式からWindows 64bit版をインストールします。基本的にデフォルトのままでいいはずですが

「Git bash here」というチェックだけは入れたほうがいい」

という記事もあるのでおこのみで。(Web UIのアップデートが楽になるそうですが未確認)

「git -v」を実行して、Gitのバージョンが表示されればOK

・Stable Diffusion WebUI

元々のStable Diffusionは(ざっくり言うと)pythonのコマンドラインで学習や生成を行うため、非常に面倒です。

それを楽に行うためのWeb UIがリリースされていますので、これを利用します。

わかる方はインストールしたGitでCloneしてもいいですし、

https://github.com/AUTOMATIC1111/stable-diffusion-webui

をZiPダウンロードして展開しても構いません。(sd.webui.zip というダウンロードリンクもあります)

ツールとして有効に使うならアップデートや他のツールインストールなども踏まえてCloneしたほうがいいようですが、ここでは体験することを優先するのでお好きなほうで。

ここではzipファイルを展開したパターンでのインストール説明をします。

展開先は任意のフォルダで大丈夫ですがパスは日本語を含めないほうが無難です。

なお、当方はFドライブに入れてますがアップデートやスクリプト等のgitでのインストールが上手くいくかどうかは不明です。

(のちに一部extensionのインストール時に権限周りでエラーが出たりしたので、使い続ける場合はgitでインストールしたほうがいいのかも)

※注意:当方が実施した順で記載してますが、update.bat -> run.bat の順序のほうが良いかもしれません。

フォルダ内の「run.bat」をダブルクリックして起動します。

 自動でインストールが進みますので「続行するには何かキーを押してください」という表示が出るまで待ちましょう

上記インストールが完了後、「update.bat」も実行しておきましょう。

続いて「webui」フォルダの中にある「webui-user.bat」を「編集」します。

「set COMMANDLINE_ARGS=」の行を以下の通り書き換えます。

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--autolaunch --xformers

call webui.bat

※なお、ここに以下に続く設定をすることで低スペックのグラフィックボードでも動くそうですが、試していません。

参考のために記載しておきますが自己責任でお願いします。

【ハイスペックGPU(VRAM12GB以上)】※上記で設定したのはこれ
--autolaunch --xformers

【ロースペックGPU(GTX10xxなど)】
--autolaunch --medvram --xformers

【GTX16xx専用】
--autolaunch --precision full --no-half --medvram --xformers

【VRAM4GBの超ロースペックGPU】
--autolaunch --lowvram --xformers

•autolaunch:
起動時にシステムのデフォルトブラウザで自動的にWebUIを開く。お好みで。
•precision full:
GTX16xxユーザー向け。起動時に画面が真っ黒になるのを防ぐ。
•no half:
GTX16xxユーザー向け。起動時に画面が真っ黒になるのを防ぐ。
•medvram:
生成速度を犠牲にVRAM消費量を節約する。
•lowvram:
medvramよりさらに生成速度を犠牲にしてVRAM消費量を大幅に節約する。
•xformers:
AIイラストの生成速度を高速化する

なお、VRAM6GB程度のGPUならlowvramではなくmedvramでもOKとのことです。(medvramにした方が、lowvramより2倍くらい生成時間が早くなるらしい)

VRAM4GBの場合はlowvramが必須のようです。

precision fullと no-halfに関しては、画面が真っ黒になる等のエラーが表示される場合に設定すると良いとのことです。

モデルデータの導入

AIによる画像生成はモデルデータと呼ばれる学習情報を元に行います。

色々な種類のモデルがありますが、これはもう各自の好みやどういったものを作りたいかということもあるので、最終的には各自で探してみてください。

ここでは、現在のStable Diffusionの前のバージョンのbaseモデルをバージョン2.1用に同じデータセットで調整したものということなので、以下をダウンロードしてセットします。

https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.ckpt

ダウンロードしたファイルを

【インストールフォルダ】\webui\models\Stable-diffusion

に配置します。

また、以下を取得して同じフォルダに置きます。

https://raw.githubusercontent.com/Stability-AI/stablediffusion/main/configs/stable-diffusion/v2-inference.yaml

 ※上記の実施の内容については

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#stable-diffusion-20

に説明があります。

これで準備が整ったので、「run.bat」を実行して起動します。

基本的には「prompt」にワードを入れて画像を生成しますが、単純な語句を入れただけだと思ったような画像にはなりません。あと語句は基本的に全て英語で入れます。

もちろん「dog」とか「cat」とか入れればそれらしい画像は生成されますが、細かいシチュエーション、背景、構図などの指定をしたり、逆に表示して欲しくないものは下の段の「negative prompt」に入れることでうまく生成されるようになります。

表示された画像に対して、細かな語句を調整したりすることでより生成したいイメージに合ったものにしていきます。

当サイトはセンシティブなネタは扱いませんが、おそらくニーズとしては現状、圧倒的に「そちら」方面な気はします。まぁこの手のテクノロジーの発展当初としてはある意味健全な気はしています(というかちょっと調べればわかりますが、そらまぁそういう用途に使うよね、としか思わない)

が、少し前のDeepFakeなどのように権利侵害などで問題になるようなケースが今後も出てくるものと思います。

折角の優れたテクノロジーも結局使うのは人間なので、どこまで行っても使う人間のリテラシー次第だなぁと思ったりします。

とりあえずインストールについて書いてみました。

時間があれば次回以降の同人誌の表紙くらいはこれで作ってみようかなぁと思っているのでその辺のことが書ける日が来たらまた。

0

年末年始

あけましておめでとうございます。

冬コミ前後は余裕が無くて何とか本は作ったもののそれ以外がさっぱりでした、、

マイナーOS本については、今回は珍しく?夏に向けてすでにネタを決めて進めているので、なるべく速やかに、なるべく内容も多くできればと思ったりしています。

現時点での計画は

・OpenVMS関連

冬コミ発行の号でも一応触れたんですが、

「Alpha Server DS10上で、OpenVMS Alpha 8.4(コミュニティライセンス)を動かしてみる」

のを中心にやれればと考えています。

どこまでやれるかはわかりませんが、せっかく所持しているハードウェアは有効に活用したいと思っています。

以下、未定な部分もありますが、夏向けの計画です。

・OpenVMS関連
 Student KitでのOpenVMSの試用
 Alpha Server DS10へのVersion8.4のインストール
 VAXエミュレータ上へのOpenVMS7.3のインストール
 ※Itanium機も持っているので、こちらへのインストールまで手が延ばせればやりたいですが、現時点では未定です。

・ClearPath OS 2200 Express Editionの試用
 メインフレーム系は当方はまったく現場を知らないというか通ってきていないので、もしかするとしんどい部分があるかもしれませんが、せっかく試用版があるなら触らせていただこうと思っています。
(まあそんなことを言ったらOpenVMSも全然通ってきてないんですが)

・その他
 上記以外についての原稿も書きたいと思っていますが、まずは計画しているところまではしっかりやりたいと思っています。
 いつもの駆け足レビュー的なものについてはネタがちゃんと集められればと思ってます。

 

 

1

技術書典13

オンラインだけですが参加予定です(イ18)

新刊なんとか準備したいが間に合うか微妙なこころもち

0

マイナーOS本改訂版の商業出版

8/12にマイナーOS本の大幅改定版が電子書籍メインで「技術の泉シリーズ」の1つとして商業出版されます。

この手の宣伝?って人のものをやるのは抵抗ないけど自分のものを宣伝するのに抵抗があるのは旧世代オタクだからなのでしょうか。

というわけで、「Operating System Maniacs -あなたの知らないマイナーOSの世界-」としてリリースされます。

とはいえ全体的に技術系の同人誌および商業化されたものって、ほんとに「技術書」系が多いんですよね。

当方の本は一応技術にかかわる内容もないわけではありませんが、やってることはひたすら「マイナーOSレビュー」にすぎないので、そのあたりは心配なところです。

 

0

コミックマーケット100

というわけでとりもとりあえず夏コミへの参加が確定しました。

場所とかは後で追記。

 

スペースは

「土曜日西地区 "す " 04b」

に配置されました。

コミケWebカタログもすでに公開されている模様。

https://webcatalog.circle.ms/Circle/Map/16217185/1 #C100WebCatalog

さすがにコミケ100には本を間に合わせないといけませんな

0

技術書典12参加予定

とりあえず申し込みました。

まだネタが出切ってませんが、、、直近でやってるNetFlowをElastiFlowで監視するとかでしょうか。

0

Operatign System Maniacs

というわけで、一応技術書典11用の新刊?をアップロードしました。

まだ審査中ですが。

今回は内容の薄さもあり無料配布です。

さすがにWindows 11の本を作るのもなんですしね。。。

ほんとに一応作った、というレベルではありますが、ご興味あれば是非。

審査完了したら直リンクも貼ろうかな。

https://techbookfest.org/event/tbf11/market

0

Windows 11

というわけでWindows 11 のインストールをしたという夢を見たよ。。。

まぁOSマニア(マイナーOSじゃなくてもOSマニアなのは変わらんので)としては興味のあるところです。

どうなんでしょうね。どういう経緯で流出したのか、、、話題作りにわざと流出させたなんて陰謀論もあるみたいですが。

インストール部分はまぁWindows10と大差ないように見えますね。ほぼ全エディションが入っているようです。

実際のところは正直何とも言えませんが、そもそもWindows10で終わりってのは無かったことになってるんですかね?

まぁ実際のところリリースされたらAzure OSみたいな名前になるんじゃないかといった記事もチラ見しましたが、正直元々そんなに興味を持って動向を見守ってたわけではないので(ぶっちゃけ今回の流出騒ぎで、野次馬的にどれどれ?と興味を持っただけ)あとは25日の「what's next for Windows」を待つくらいでしょうか。

実際の感じは以下のようですよ?あくまで参考まで。

・前述しましたがインストール自体は現状のWindows10と大差ないように見えます。
 実際にはリリースされた後はまぁオンラインでどうこうあるでしょうから何ともですが。

・流出してから時間が経ってますので、現状のISOイメージではインストールはできるように見えても何らかの制限をMS側でかけてくるかもしれませんね。

・実機の、ある程度新しいPCでやればまた違うのかもしれませんが、当方の夢の中ではリソースはあっても古いCPUのマシン上で動かしたせいかインストール完了までも相当にもっさりしていました。まぁ夢の話なのでどうでもいいですが。

2回ほどの再起動を挟んだ後の設定も、画面のイメージは変わっているものの、設定する内容はほぼ同じのようです。

 起動直後はこんな感じになっているようですよ

そして書いたページをWindows 11から見るという妄想。

 

なんかで見た通り、スタートメニューが真ん中にあるのがヘンな感じ。ただUIやアイコンは変わってますがそれほど(現在のところは)極端に変更があるようには見えません。

Settings⇒Language⇒Add a LanguageでJapaneseを追加してみました。

いったんサインアウトを要求されたのでサインアウト。

ログインパネルはこんな感じ

さすがにIMEはまだ準備できていないようですね。

 

というわけで前のサイトの時に見たVMWareへのMacOSのインストール以来の謎の夢ですが、まぁ面白いっちゃ面白いですね。一過性のもんではありますが。

 

0

技術書典11 出展予定

というわけで、技術書典11 のオンライン出展に申し込みしました。

が、現状異常に忙しいので正直どこまでできるか不安があります。

参加するからには何かしら新しいものは出したいと思っていますが。。。

今のところは前回予告していたFuchia の実機動作を出せればと思っていますので、なんとか間に合わせたいです。

0

技術書典の無料配布本

技術書典の無料配布本については、無期限で

https://www.fnow.org/cabinets/cabinet_files/index/22/77112207056b57b3289031ccc6090fc0?frame_id=46

にてダウンロード配布中ですので、ご興味ありましたら是非ダウンロードしてご覧いただければと思います。

なお無料本2の内容は技術書典9で発行した有料本の補足みたいな内容になってしまっていますのでその点はご了承下さい。。。

0

Todo覚書

・既存リモート環境にシングルサインオンの導入
 →Rocketchatのみ完了 原稿化予定

・その他のシステム
 →架空の会社の社内システムを全部OSSで作るという
  試験を1年ほどかけてやろうと思っています。
  なので普段使いしているApache Guacamoleとインフラ系のDNSとかを除いて
  まるっと構築しなおそうと考えています。

・Dockerプライベートレジストリをjenkinsとgitlab使って構築
 →ネタとして面白そうと思ったのですが、当方がDockerを普段使いしてないので
  イマイチ着手に至っていません。

・Snipe IT使って資産管理システム
 →どちらかというとシステムより実際の登録と運用が肝。
  導入自体は割と容易だったのですが、今回の架空の会社システム構築の際に
  やり直す予定

・Exmentの活用の具体例
 →こちらも同上。設計の大切さが身に沁みますな

・Zabbixでの監視と、各種ログのとりまとめ、可視化
 →監視自体は設定してますが、細かい通知とかログのとりまとめはできてません。
  ただそもそも監視に何を使うかの選定を優先する予定
  (その上で架空の会社のシステム構築を行う方向)

・ヘルプデスクシステムをオープンソースで何とかする
 →まだまだ調査段階。3つくらい候補がありますが、これも架空の会社の
  システム構築で対応する予定。

■その他
・というわけで、いまのところは現行で使ってるもののうち残すものと新しい企画のために
 いったんまっさらにするものに分けて対応する予定です。

まぁ自分向けのTodoなんですが。

0

技術書典とコミックマーケットとエアコミケ

技術書典が12/26~1/6

エアコミケが12/30、31

コミケ99が2021年5/2~5/5

なかなかハードですな。

どこまで達成可能かわかりませんが一応、原稿は以下の方針で進めてます。

 

■技術書典
OSM 2nd Version3 マイナーOS駆け足レビュー
dabble in... Vol.3 KeyCloakで既存環境にSSO導入(のさわり)

■エアコミケ
多分同時期なので基本は技術書典と同じ。
dabble in... のExtra Editionは作ろうと思っています。
ネタはアセットマネジメントのSNIPE ITか多目的CMSのodooか…

■コミケ99
OSM 2nd Version4 いまさらOS/2 WARPをVirtual Boxで動かしてみる(仮)
dabble in... Vol.4 Docker+gitlab+jenkinsでプライベートDocker Hub構築(仮)

ただコミケ99のネタは少し前に検討したけど自身の環境でそれほどDockerを現状は使っていないのでどうなるか未定。

それ以外に「架空の会社の社内システムを全部OSSで作ってみる」という演習を1年間かけてやってみる予定なので、その途中経過とかの本になるかもしれません。

 

0

Windowsの特殊フォルダ

当方の自宅のマシンにはドライブが18個くらいあるんですが、うっかり特殊フォルダを移動したのを忘れていて、デフォルトフォルダがユーザーのTempフォルダにされる事件があったので、その解消法を簡単に。

当方が被害?にあったのはCapturesフォルダでした。マイナーOSの挙動をWindowsのデフォルトのキャプチャ機能でキャプチャしておこうとしたら、キャプチャデータがどっか行ってしまいました。

設定を見たら(スタート⇒設定⇒ゲーム⇒キャプチャ)、なぜかユーザーのTempフォルダになってる。はて?

こういう時はレジストリだ!というわけでregeditを起動。

Win+Rキーから「regedit」とタイプしてEnter。

コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

に、たくさんフォルダに指定が並んでますが、Capturesフォルダが存在しなくなったドライブに指定されてました。

フォルダが見当たらないとユーザーのTempフォルダにされちゃうんですね。

なお、名前は

{EDC0FE71-98D8-4F4A-B920-C8DC133CB165}

で、データの値を移動したいフォルダにすると、そこがキャプチャフォルダになります。

スタート⇒設定⇒ゲーム⇒キャプチャ

のフォルダもちゃんとそこに変更されます。

でもこういうのは簡単に設定できるようにしてほしいなぁ。なんかこうブラックボックスにしたい意地?みたいのを感じますな。

0

仮想マシンイメージの変換

覚書に近いですが。

VirtualBoxのVBoxManageコマンドを使って実施します。対象ファイルは全部同フォルダ/ディレクトリにある前提です。

前提:C:\Program Files\Oracle\VirtualBox

「コントロールパネル」⇒「システム」⇒「システムの詳細設定」⇒「詳細設定」タブ⇒「環境変数」⇒「Path」に追加
※当方はユーザー環境変数に入れてますがお好みで。

 

sd★はもちろん例です。

■物理HDD ⇒ RAW
sudo dd if=/dev/sd★ of=./sd★.img ※Linuxでやるほうが楽なのでこうしてます。Windowsでもできるツールはあります

■RAW ⇒ VDI
VBoxManage convertfromraw sd★.img sd★.vdi --format VDI

■RAW ⇒ VMDK
VBoxManage convertfromraw sd★.img sd★.vmdk --format VMDK

■VDI ⇒ VMDK
VBoxManage clonehd sd★.vdi sd★.vmdk --format VMDK

■VMDK ⇒ VDI
VBoxManage clonehd sd★.vmdk sd★.vdi --format VDI

■VDI ⇒ RAW
VBoxManage clonehd sd★.vdi sd★.img --format RAW

■RAW ⇒ 物理HDD
sudo dd if=./sd★.img of=/dev/sd★ ※最初の物理 ⇒ RAWと同様Linuxで実施

主にダウンロードしたマイナーOSのHDDイメージを変換する際に利用してます。

0

覚書更新

・オープンソースHCI

→オール仮想マシンでやろうとして失敗中

・既存リモート環境にシングルサインオンの導入

→Rocketchatのみ完了

→NextCloudはできるらしいが若干不安あり

→その他はまだ厳しそう

・Dockerプライベートレジストリをjenkinsとgitlab使って構築 →未着手

・Snipe IT使って資産管理システム

→どちらかというとシステムより実際の登録と運用が肝。少しずつやってるがあまり進捗なし

・Exmentの活用の具体例

→わりと同上。インストールやら構築よりその先のほうが肝心

・Zabbixでの監視と、各種ログのとりまとめ、可視化

→進んでない。他の機能の方を優先してる感じ

・ヘルプデスクシステムをオープンソースで何とかする

→まだまだ調査段階

■その他

・GoogleのSearch consoleやらは放置しすぎてたのとodooで構築してたサイトが度々接続切れてたせいかGoogle八分食らってて草生える。ちゃんとしないと。

・コソコソいろんな仕事の対応したりしてたら異常にいそがしく

・技術書典10に申し込んだがなにやろう。

・とりあえず自分で使ってて最も有用なApacheGuacamoleは押し続けたい所存。ログ取りやら解析やらそのあたりももう少し踏み込んでやりたい

・今更シェルスクリプト書いたりしてるけどなんというかコードがきったねぇ。エレガントに?書く訓練もしとらんからあれだが

 

0

唐突にマインクラフトサーバ

そういや子供が以前からマインクラフトをやりたがっていたので、統合版のサーバをさっくり立ててみることにする。

以前調べた時は、統合版の発売前だったようで、PCからのJava版と他のプラットホームは共存できないという話だったと記憶してましたが、今回調べたら統合版というのが出てて、マルチプラットフォームが可能らしいのでちょいとサーバを立ててみることにしました。

OSごとに多少なり違いはありそうですが、潤沢な仮想マシンリソースを使ってとりあえず立ててみます。

■準備

OS:Ubuntu server 20.04 LTS

マインクラフトサーバ

オフィシャルサイトからダウンロードしますが、なんか、日本版のサイトだと2020年11月現在ダウンロードできないっぽい

なのでUSサイトからダウンロードします。

https://www.minecraft.net/en-us/download/server/bedrock

■手順

1 Ubuntuをインストール

ベースは別のUbuntu上のVirtualBox仮想マシン。8コア16GB割当。実際はもっと少なくてもいいはず。

なおインストール中に設定したほうが楽なのでIPアドレスとホスト名はちゃんと決めておきましょう

 ダウンロードしたファイル内にあるhtmlファイルに詳細な情報が載ってるので、正直インストールとかは全然難しくないです。

2 unzipをインストール

最初のアップデートを実施後、unzipをインストールします

$ sudo apt -y install unzip

3 ダウンロードしたマインクラフトサーバソフトを任意のディレクトリに配置

他のファイルを置かない空のディレクトリ作成してそこに置くのが推奨のようです 

今回は自身のホームディレクトリ配下に作成したディレクトリ内に展開するので以下のようにしています。

$~ mkdir bdc
$ cd bdc
$ unzip bedrock-server-1.16.40.02.zip

※上記は2020/11/17現在のバージョン

※余談
オフィシャルサイトからはwgetとかで持ってきてもいいですが、

Windowsでダウンロード→サーバにTera Termでsshログイン→Tera Term画面にD&D

 でも事足ります。便利になりましたなぁ(じじいくさい)

4 screenのインストール

このまますぐに起動してしまってもいいんですが、screenを使って起動してあげるとサーバから抜けても稼働し続けてくれるので楽。

やり方はまぁ何でもいいですが、

$ LD_LIBRARY_PATH=. screen -dmS bds ./bedrock_server

とやって、dbsというスクリーン内で起動し、デタッチしてしまうのが割と楽かと。

コンソールからScreenにアクセスする(アタッチする Ubuntu→BDS)には

$ screen -r bds

Screenから抜けてコンソールに戻る)デタッチする BDS→Ubuntu)には

Ctrl+a d

※ctrlキーを押しながら a を押下し、続けて d を押下すると抜けます。

もちろんsystemctlに登録して自動起動するように設定したりもできますがまぁその辺はお好みで。

※もしちょっとしらべて登録したらまた追記するかもしれません。

…実はまだクライアント購入してないんで、購入したら子供に感想でも聞いてみます。

0

Apache GuacamoleをDockerで構築してLDAPバックエンドでリバースプロキシ(長い)

以前すでにいくつか書いていますが忘れないようにメモ。

まぁ。。なんも書かんよりはマシかな程度ですが。

■Apache Guacamole

ちょっとまえに構築して現状、自分の立てたやつではぶっちぎりで利用しているので簡単に書く。

なお、ネタとしては こちら でやられていることのほぼ丸パクリ+LDAP、あとはリバースプロキシ対応をしています。

1.仮想マシン

VirtualBoxにUbuntu 18.04をインストールしてベースにする。

SELinux、Firewallを外す

2.Docker、docker-composeのインストール

・Dockerのインストール

オフィシャルのスクリプトで行います。

$ curl -fsSL https://get.docker.com -o get-docker.sh

$ sudo sh get-docker.sh

dockerグループに操作ユーザーを加えて再ログイン

$ sudo usermod -aG docker $USER
・docker-composeをインストール
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

3.Guacamoleのインストール

・作業ユーザのディレクトリにguacamoleディレクトリを作成
$ mkdir guacamole
$ cd guacamole/
・⁠docker-compose.yml を作成
なお、ファイル内の「⁠guacamole_root_password」と「guacamole_user_password」は,適切なパスワードに変更する。
version: "3"
services:
  guacd:
    container_name: my-guacd
    image: guacamole/guacd
    restart: always
  guacamole_db:
    container_name: my-guacamole-db
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: guacamole_root_password # NEED TO CHANGE
      MYSQL_DATABASE: guacamole_db
      MYSQL_USER: guacamole_user
      MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE
    volumes:
      - ./dbdata:/var/lib/mysql
      - ./dbinit:/docker-entrypoint-initdb.d
  guacamole:
    container_name: my-guacamole
    image: jkbys/guacamole:1.1.0ja
    #image: guacamole/guacamole
    restart: always
    environment:
      GUACD_HOSTNAME: my-guacd
      MYSQL_HOSTNAME: my-guacamole-db
      MYSQL_DATABASE: guacamole_db
      MYSQL_USER: guacamole_user
      MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE
      GUACAMOLE_HOME: /guacamole-home
    volumes:
      - ./home:/guacamole-home
    depends_on:
      - guacamole_db
      - guacd
    ports:
      - "8080:8080"
・必要なディレクトリを作成
$ mkdir -p dbdata dbinit home/extensions
・MySQLの初期化スクリプトを出力
$ docker run --rm jkbys/guacamole:1.1.0ja /opt/guacamole/bin/initdb.sh --mysql > ./dbinit/initdb.sql
・docker-composeを実行してGuacamoleを起動
$ docker-compose up -d

起動するまではちょっと時間がかかるので慌てず待つ。

この時点で、

http://【ServerIP】:8080/guacamole

にアクセスすることで、Guacamoleが使える状態になっています。guacadmin/guacadminでログイン可能(パスはすぐ変更すること)

4.LDAP利用の設定を行う

docker-compose.ymlに追記

LDAP_HOSTNAME: 192.168.1.xxx ※LDAPサーバのIPアドレス
LDAP_PORT: 389
LDAP_USER_BASE_DN: dc=xxx,dc=xxx
 ※ユーザー検索のベース
LDAP_SEARCH_BIND_DN: uid=admin,cn=ldapadmin,ou=Group,dc=xxx,dc=xxx
 ※検索する際にバインドするユーザーのDN
LDAP_SEARCH_BIND_PASSWORD: 【Pass】
 ※検索する際にバインドするユーザーのパスワード
SKIP_IF_UNAVAILABLE: ldap
 ※LDAPでのログインに失敗した際に無視する
  →別にSQL  Serverにアカウントが登録されてればそちらで、設定ファイルに
   ユーザー登録があればそれを使うための設定

今回は公開されない範囲でやってますので平文で通信してますが、必要に応じてSSL対応とかやったほうがいいとは思います。

・LDAP認証のためのGuacamoleのエクステンションを持ってくる
$ wget http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/1.1.0/binary/guacamole-auth-ldap-1.1.0.tar.gz
$ tat xzf guacamole-auth-ldap-1.1.0.tar.gz
・展開した中のldap接続エクステンションを、guacamoleが認識できるようにguacamole/home/extensions/ 配下に移動
$ cp -p guacamole-auth-ldap-1.0.0/guacamole-auth-ldap-1.1.0.jar guacamole/home/extensions/guacamole-auth-ldap-1.1.0.jar
・docker-compose.ymlを書き換えたので再起動
$ docker stop
$ docker-compose up -d

これでLDAPユーザーはログインできますが、現状何も設定していないので接続ができません。

管理者アカウントでログインし、LDAPの管理アカウント(LDAPの他のユーザーが全員見られるアカウント)に対して、Guacamoleの管理権限を与えます。

※元々あるGuacamoleアカウントは、LDAP側の権限がないので他のユーザー情報が見得ません。LDAP側で権限があるアカウントに、Guacamole側の権限を与えます。

あとはそのユーザーで接続に必要な情報を展開するなどの対応を行います。

5.リバースプロキシ対応

リバースプロキシ設定の際のTomcat側のserver.xml書き換え方法です。
Tomcat側に「この通信はリバースプロキシ経由だよ」というのを教えてあげないとCSRFと判断されてエラーになります。

通常の構築であればTomcatのインストールディレクトリを探せばいいですが、今回はDockerで導入しているので、コンテナ内のファイル強引に書き換えてます。

起動時にオプションで引数として設定ファイルを渡すなり、起動のタイミングで設定ファイルをコピーする方法もあるようですが、当方はDocker自体にそこまで詳しくないので、強引にコンテナ内のファイルを書き換えています。

・Dockerイメージ内の設定ファイルをコピー
$ sudo cp /var/lib/docker/overlay2/【docker-dir】/merged/usr/local/tomcat/conf/server.xml .
・Hostディレクティブ内に追記
$ vi server.xml
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
               internalProxies="192.168.1.91"
               remoteIpHeader="x-forwarded-for"
               remoteIpProxiesHeader="x-forwarded-by"
               protocolHeader="x-forwarded-proto" />
・Dockerイメージ内の設定ファイルを書き戻し
$ sudo cp server.xml /var/lib/docker/overlay2/【docker-dir】/merged/usr/local/tomcat/conf/

6.リバースプロキシ設定(nginx側)

別途nginxでのリバースプロキシは構築済みとします。

※時間が取れれば別途書きます。

なお、基本的にリバースプロキシをかましているのは、以前にもちょっと書いた気がしますが

・SSLを全部nginx側で終端する
・自宅サーバメインなので、ルータのポートをたくさん開放したり特殊なポートを開けたりしたくない
というような理由によります。

SSL(Let's Encrypt)設定は別途実施済みの前提で、プロキシ設定は以下のようにしています。

server{
    server_name    【guacamoleの接続ホスト名】;
    listen 443 ssl;
    listen [::]:443 ssl;
 ~SSL設定省略~
    location / {
    proxy_pass    http://192.168.1.xxx:8080/guacamole/;
    proxy_buffering off;
    proxy_set_header    X-Forwarded-Host        $host;
    proxy_set_header    X-Real-IP               $remote_addr;
    proxy_set_header    X-Forwarded-Server      $host;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for ;
    proxy_set_header    X-Forwarded-Proto https;
    proxy_http_version  1.1;
    proxy_set_header    Upgrade $http_upgrade;
    proxy_set_header    Connection "upgrade";
    proxy_cookie_path /guacamole/ /;
    }
        gzip on;
}

※nginxでの各種SSL終端+リバースプロキシ設定はもしかしたら多少ニーズがあるかもしれないのでそのうち別途まとめて書きます。

0

シングルサインオン

ようやくKeycloakでのシングルサインオンに手を付けた。

とはいえインターネット経由で使えるようにするとなるとまたSSLの設定やらなんやら必要ですし中々面倒ですな。

まぁ構築後の面倒をさけるための構築なんだからしょうがないんですが。

ちなみにKeyCloakは、単にテスト用程度に構築する分には実はそれほど難しくありません。

JDKのインストール

# yum update -y
# yum install java-1.8.0-openjdk

keycloakのインストール

# cd /opt
# sudo wget https://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.tar.gz
# tar xfpz keycloak-11.0.2.tar.gz
# mv keycloak-11.0.2 keycloak

Keycloakの設定

構築内容や状況によってはほかにもいろいろ必要だが、下記はおそらく絶対必要な対応ではないかと。

# vi /opt/keycloak/standalone/configuration/standalone.xml

<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:[KeycloakサーバーのIP]}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:[KeycloakサーバーのIP]}"/>
</interface>
</interfaces>

なお、実際の構築時にはいつも通りリバースプロキシを通すのでSSL化のために下記の太字部分を書き換えている

<subsystem xmlns="urn:jboss:domain:undertow:7.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
<buffer-cache name="default"/>
<server name="default-server">
- <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
+ <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" proxy-address-forwarding="true"/>
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<http-invoker security-realm="ApplicationRealm"/>
</host>
</server>

起動設定のためにサービスとして登録

# sudo vi /etc/systemd/system/keycloak.service

[Unit]
Description=Jboss Application Server
After=network.target
[Service]
Type=idle
Environment=JBOSS_HOME=/opt/keycloak
JBOSS_LOG_DIR=/var/log/keycloak/ "JAVA_OPTS=-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true"
User=root
Group=root
ExecStart=/opt/keycloak/bin/standalone.sh -Djboss.http.port=80 -b 0.0.0.0
TimeoutStartSec=600
TimeoutStopSec=600
[Install]
WantedBy=multi-user.target

設定ファイルを再読み込みし、サービスとして登録、起動します。

# systemctl daemon-reload
# systemctl enable keycloak
# systemctl start keycloak

Keycloakでは管理者をあらかじめ登録しないとアクセスできませんので、管理ユーザーをコンソールから登録します。
ユーザー名とパスワードは任意のものを設定してください。

# /opt/keycloak/bin/add-user-keycloak.sh -r master -u 【ユーザー名】 -p 【パスワード】

これで一応構築は完了です。

ログインしての設定等はまた別途。

 

0

Jitsiのリバースプロキシ下動作

Jitsi Meetを既存リバースプロキシの背後で動かす方法を探しているのですが、なかなか見つからない。

Jitsi MeetはインストーラがNginxを設定してくれちゃうらしいのですが、単体のマシンの中でのお話なので、
その設定を他のマシンにもっていってもうまく動かないように思われます。

(必要な設定をちゃんと書き換えればいいんだとは思いますが)

まぁただ、Jitsi Meet自体が20人ぐらいになると、クライアント側での処理が重たくなってなかなか表示が厳しくなるらしいので、単純に既存のZoom等の代替になるかというと難しそうですが。

 

0

HCI構成をOSSでやるのはなかなか難しいですな

oVirt+GlusterFSでのOSS HCIを構成しようとしていますが、GlusterFSの作成まではうまく動くのですが、Hosted-Engineの導入で毎回失敗します。

とはいえ実機を準備しておらず、すべて仮想マシンで準備していることも原因かもしれませんが、なかなか厄介ですな。

仮想マシンであればある程度のスペックのものは用意できますが、実機複数台というとちょっと厳しいですなぁ

逆にスペック落としても実機のほうがやりやすいのかもしれませんね。

0

ダウンローダー設置

そういやこっちに書いてなかった。

総集編以前に出したOperating System Maniacsの旧刊は、こちら からダウンロードできるようにしました。

各種イベントで無料配布したものなどもこちらからダウンロードできるようにしようかと思います。

技術書典9で配布中のものも、こちらにも置いています。

 

0

技術書典9戦利品

まだ開催初日なんですよね。まぁしばらくはだらだら見たりしますが。

購入およびいただいたもの。

無料のものが半分くらいでしょうか。当方の無料配布のも入ってるのはご愛敬。

0

技術書典の開始とちょっとだけリニューアル

技術書典9

はじまりましたねー。オンラインオンリーの開催ってのもすごいもんですね。

さて、大した変化じゃないですが、旧版(マイナーOS本総集編発行以前)のPDFデータをダウンロードできるようにしてみました。多少なり興味のある方は是非見てやってください。

だいたいわけわからんOSをモゾモゾしてるだけではありますが。

 

0

おぼえがき

技術書典にかぎりませんが、何かしらないとなかなかきちんとインストール手順とかそういうのもまとめませんね。。。

というわけでイベント様様です。

あと今後やりたいこととかのメモ(前にも書いたけどまぁ)

 

・オープンソースHCI

・既存リモート環境にシングルサインオンの導入

・Dockerプライベートレジストリをjenkinsとgitlab使って構築

・Snipe IT使って資産管理システム

・Exmentの活用の具体例

・Zabbixでの監視と、各種ログのとりまとめ、可視化

・ヘルプデスクシステムをオープンソースで何とかする

ポイントは当方プログラマでも何でもないので自分でコード書いてどうにかする、という手段は取れないという点です。(自慢にならん)

なるべくありものを駆使してなんとかできれば。

0

OpenMeetingsのLDAP設定について

OpenMeetingsのVersion5.0.0でのLDAP設定に罠が潜んでたんで軽く記載。

(ってまだLDAP構築記事書き終わっとらんやんけ)

 

LDAPの設定をやるとき上記のページ(管理者ユーザーで管理⇒LDAPと遷移)で設定を行いますが、ここに罠が。

説明には

「webapp/openmeetings/confに置かれている必要があります」

と書いてあるんですが、実際には

「webapps/openmeetings/data/conf」

に配置する必要があります。

以下参考

https://openmeetings.apache.org/LdapAndADS.html

いやー、しばらく気が付きませんでした。Version5になったときに変更がおいついてないとかなんでしょうか。

0

技術書典9に参加予定です。

https://techbookfest.org/event/tbf09

というわけで参加予定です。

とりあえずマイナーOS系は残念ながらあまりいいネタが仕入れられていないので怪しいです。

どちらかというとリモートワークを主体とした各種サービスの導入についての書籍になると思います。

可能ならなんらかのマイナーOSネタも扱いたいですが。。。

なお基本的にPDFでのダウンロード販売のみになる予定です。

0

その他の構築物

こちらも後々詳細を追加する気ではいますが、一応何を書こうと思ってたのかがわからなくならんように記載。

Apache Guacamole

RocketChat

NextCloud

odoo

⇒リバースプロキシ経由でアクセスさせる際の設定等

Docker Hubローカル構築(Gitlab)

Redhat OpenShift 4 テスト環境(Red Hat CodeReady Containers)

 9/11追記

ちなみにGuacamole、OpenMeetings、Rocket.Chat、NextCloud nginx(リバースプロキシ)+LDAP構成を取りまとめた本を技術書典に出してます。ぜひ。

0

OpenLDAP構築続き

なかなか時間が取れてないのですが書く気があるのをアピールするためにとりあえず。。

とりあえずやったことを箇条書きにしますがなるべく箇条書きの中身をあとから詳細に書こうと思ってます。

設定ツリーの管理

設定ツリーの管理ユーザを設定する。

作成したLDIFファイルを使って設定を更新する。

スキーマファイルの取り込み

管理者用アカウントの設定とベースDNの設定

グループ、ユーザーの登録

ユーザーを50人100人など一括登録するために

csv2ldif2

https://sourceforge.net/projects/csv2ldif2/

を使って登録用のldifファイルを作成し、コマンドで登録する

ユーザー用のパスワード初期化UIとパスワード変更UIを作成する
こちらのページを参考にして構築

http://www.ceres.dti.ne.jp/~t-yamada/ldap/index.html

メール送信の際にローカルのメールサーバから自身のメールアドレスにポート587で送信するための設定をPostfixに実施

0

OpenLDAP構築

以前からやろうやろうと思ってはいたのですがなかなか手が出せなかったOpenLDAP構築にようやく手を出した。

きっかけは前回投稿しているOpenMeetings関連。

社内でテスト利用してもらおうにも、アカウント周りの作成とか管理が課題になる。

んではLDAPで管理すりゃええんちゃう?ということで構築開始。
また、今後もLDAPをサポートしているオープンソースの各種ソフトウェアの試験利用時にもアカウントを使いまわせて試す側も楽になるであろうという考えもあってのことではある。

過去に構築そのものはしたことがあるが、その際には有識者とセットで仕事でやったものなんで、極論を言えばコピペが正しく出来ましたか?レベルだったので、今回はちゃんと自分のとこの環境として考えて構築する。

 

■目的
 OpenLDAP サーバの構築
 OpenLDAPクライアントの動作確認
 ユーザー情報の登録(100名前後)の効率のよい方法の検討
 Apache OpenMeetingsや、その他のWeb系のサービスとのLDAP連携の実施

■インストール編

長くなりそうなので複数回にします。今回はインストール編です。
Qiitaのこのあたりの記事丸パクリですが(ありがとうございます)、今回は最終的にいろんなところの記事やら
ブログやらをパクりつつ、全体通して構築していきます。

枯れたソフトウェアということなのか、大抵のディストリビューションでパッケージとして用意されています。

CentOS環境なのでyumで何も考えずにインストールします。

yum install openldap openldap-servers openldap-clients

DB設定用のファイルを用意してアクセス権を変更します。

cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG

自動起動設定をします。

systemctl start slapd
systemctl enable slapd

下記は当方の環境では不要なのですが、Linuxでのファイルディスクリプタ上限が1024なので、これを増やしておくほうが無難です。

grep "Max open files" /proc/`pidof slapd`/limits
Max open files    1024    4096    files

LDAPはセッション数が多く、やり取りで入出力を管理するファイルディスクリプタ数が足りなくなることがあるようですので、環境によっては変更しておいたほうがいいかもしれません。
※実環境での検証まではしていません。

vi /usr/lib/systemd/system/slapd.service
[Service] の一番下に追記
---
LimitNOFILE=65536
LimitNPROC=65536
---

再起動を行い、ファイルディスクリプタ上限が変わっていることを確認

systemctl daemon-reload
systemctl restart slapd
grep "Max open files" /proc/`pidof slapd`/limits


Max open files    65536    65536    files

また、OpenLdapはデフォルトではログの出力設定がされていません。
試験時はjournalctlコマンドで参照すれば事足りますが、実運用時にトラブルがあった場合など、
ログが残っていないと困ると思いますので、一応ログの設定をしておきます。
併せてログローテーション設定もします。

ログの出力設定
vi /etc/rsyslog.conf
※追記
local4.*   /var/log/ldap/slapd.log
ログのローテーション設定
vi /etc/logrotate.d/syslog
※追記
/var/log/ldap/slapd.log

 いちおう「インストール」的な作業はここまで。

次から管理者設定など「構築」編に行こうかと思います。
(書くのいつになるかな。。。。)

 

0

Apache OpenMeetings

世の中リモートワークばやりでございますが、捻くれ天邪鬼な性格の自分としてはすぐ「zoom使いたくねぇ」とか始まってしまうんですね。

いやまぁなんだかんだ言って仕事なら使うんですがね。

で、オープンソースのWeb会議ツールは敷居が高くてちょっと敬遠してたんですが、まぁせっかくだし流行りに乗って構築してみようかなと。

ただ、当方の場合最終的に「自宅で作ってDDNSでアドレス取ってNginxのリバースプロキシで振り分ける」という単なる構築以上に面倒くさい構成が待っているのでそこはちょっと辛いとこなんですが。

ちなみにNginxはまだ全然ド素人なので、いっかいちゃんと勉強しないといけませんな。

閑話休題

 

とりあえず単純に構築するなら、だいたいはオフィシャルサイトの手順に沿ってコマンドをつらつら入れていけば難しいことはありません。

ただ個々のコマンド、項目で何をやってるのかある程度理解してないとどうしようもないですが。

 まず今回の前提条件について記載します。

実運用上の最適スペックは確認してないのでそこはまた別途。

・環境

Windows上のvirtualbox仮想マシン

ディスク:100GB
メモリ:8GB
CPU:2

あとネットワークはブリッジ接続にしています。

・OS

今回はUbuntu18.04.4Serverにて構築しています。

 ・インストール

基本的には オフィシャルサイト の構築手順と、ググって見つけた こちらの「ろっひー ~ ITが気になる毎日」 さんのブログ記事「Ubuntu18.04 まっさらな環境にOpenMeetings5.0.0-M4をインストール」をほぼ丸パクリする勢いです。
大変お世話になりました。

・OSを最新化

$ sudo apt update; sudo apt -y dist-upgrade; sudo apt -y autoremove
$ sudo reboot

・各種ライブラリインストール

■OpenJavaのインストール

$ sudo apt install openjdk-11-jdk openjdk-11-jdk-headless
$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing)

■LibreOfficeのインストール

アップロード資料をPDFに変換するためのライブラリ

$ sudo apt install libreoffice

■ImageMagic,sox,ffmpegと関連ライブラリのインストール

イメージや動画の変換用のライブラリ

$ sudo apt install -y imagemagick libjpeg62 zlib1g-dev sox ffmpeg vlc

ImageMagickの設定ファイルを書き換える。
過去のGhostScriptバグの対策で変換ができなくしてあるので、その設定をコメントアウトして外しています。
参考

$ sudo vi etc/ImageMagick-6/policy.xml

上記ファイルの下のほう、★を付けた2行をコメントアウト

<!-- disable ghostscript format types -->
★ <!-- <policy domain="coder" rights="none" pattern="PS" /> -->
<policy domain="coder" rights="none" pattern="PS2" />
<policy domain="coder" rights="none" pattern="PS3" />
<policy domain="coder" rights="none" pattern="EPS" />
★ <!-- <policy domain="coder" rights="none" pattern="PDF" /> -->
<policy domain="coder" rights="none" pattern="XPS" />
</policymap>

■データベースのインストール

ここではMariaDBを使っているが他のDBでも構築は可能なようです。

$ sudo apt install mariadb-server
$ sudo mysql

MariaDB [(none)]> create database openmeetings default character set 'utf8';

MariaDB [(none)]> grant all privileges on openmeetings.* to 'openmeetings'@'localhost' identified by 'om_password' with grant option;

MariaDB [(none)]> quit

データベース openmeetings
ユーザー openmeetings
パスワード om_password

。。。すみません、丸パクリです。

■Kurento Media Serverのインストールと設定

基本的にはここを参考に。今最新Versionは6.13.2みたいですが、OpenMeetingsのオフィシャルと揃えています。

カメラ、マイク、録画、画面共有に必要なライブラリ。リポジトリのキーをインストールする

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83

リポジトリのソースファイルを新規作成。

sudo vi /etc/apt/sources.list.d/kurento-dev.list

中身は以下

deb [arch=amd64] http://ubuntu.openvidu.io/6.13.0 bionic kms6
deb [arch=amd64] http://mirror.yandex.ru/ubuntu/ bionic main restricted
deb [arch=amd64] http://mirror.yandex.ru/ubuntu/ bionic universe

Kurento Media Serverのインストール

$ sudo apt update
$ sudo apt install -y kurento-media-server

設定ファイルを変更。

sudo vi /etc/default/kurento-media-server

上記ファイル内の

DAEMON_USER="kurento" # User as whom Kurento Media Server will run

の行をコメントアウトし

DAEMON_USER="nobody"

を追加してサーバを走らせるユーザーを変更

サービスの登録と開始

$ sudo systemctl start kurento-media-server
$ sudo /lib/systemd/systemd-sysv-install enable kurento-media-server

■OpenMeetingsのインストール

ようやく本体のおでまし。
まずはダウンロード

$ wget https://downloads.apache.org/openmeetings/5.0.0-M4/bin/apache-openmeetings-5.0.0-M4.tar.gz

展開して配置 場所はこれまた丸パクで /usr/share/openmeetings としてます。

$ tar xzvf apache-openmeetings-5.0.0-M4.tar.gz
$ mv apache-openmeetings-5.0.0-M4 openmeetings
$ mkdir -p openmeetings/webapps/openmeetings/data/streams/{1,2,3,4,5,6,7,8,9,10,11,12,13,14}
$ mkdir -p openmeetings/webapps/openmeetings/data/streams/hibernate
$ sudo chmod -R 750 openmeetings/webapps/openmeetings/data/streams
$ sudo chown -R nobody:root openmeetings/
$ sudo mv openmeetings/ /usr/share/

mysql-connectorをダウンロードして配置

$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.20.tar.gz
$ sudo chown nobody:root mysql-connector-java-8.0.20/mysql-connector-java-8.0.20.jar
$ sudo mv mysql-connector-java-8.0.20/mysql-connector-java-8.0.20.jar /usr/share/openmeetings/webapps/openmeetings/WEB-INF/lib/

※バージョンが変わると適宜修正が必要になるのでご注意を。

■OpenMeetingsの自動起動スクリプトを作成

上手くいっているものをパクれの精神で、これまた丸パクリです。
OpenMeetingsのオフィシャルにも「tomcat3」という起動スクリプトがあるので、環境に合うように書き換えて使います。

sudo vi /etc/init.d/openmeetings

#!/bin/sh
### BEGIN INIT INFO
# Provides: Openmeetings
# Required-Start: mysql apache2 kurento-media-server
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Apache Openmeetings Service
# Description: Openmeetings provides video conferencing, instant messaging,
# white board, collaborative document editing and other groupware
# tools using API functions of the Red5 Streaming Server for
# Remoting and Streaming.
### END INIT INFO

# set the environment
# JAVA_OPTS=""
# CATALINA_OPTS=""
CATALINA_HOME=/usr/share/openmeetings
RUN_USER=nobody

# set TIME OUT values
# TIMELIMIT=10
# SLEEPTIME=40

# Function to wait until all Tomcat processes are killed
waitForTomcatToDie()
{
PROCESSES=`ps auxwww | grep $HOME | grep 'java' | grep 'tomcat' | grep -v 'grep'`
while [ ! -z "$PROCESSES" ] && [ $SECONDS -lt $TIMELIMIT ] && [ $TIMELIMIT -ne 0 ]; do
echo -n "."
sleep $SLEEPTIME
PROCESSES=`ps auxwww | grep $USER | grep 'java' | grep 'tomcat' | grep -v 'grep'`
done
echo ""
if [ ! -z "$PROCESSES" ]; then
PROCESS_ID=`echo $PROCESSES | awk '{ print $2 }'`
echo "Killing process: $PROCESS_ID"
kill -9 $PROCESS_ID
fi
}

# See how we were called.
case "$1" in
start)
$CATALINA_HOME/bin/startup.sh -u $RUN_USER -Dcatalina.base$CATALINA_BASE
;;
# debug)
# DEBUG_PORT=10001
## export JAVA_OPTS="${JAVA_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,address{DEBUG_PORT},server=y,suspend=n"
# $CATALINA_HOME/bin/startup.sh -Dcatalina.base{CATALINA_BASE}
# ;;
stop)
# $CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/shutdown.sh
waitForTomcatToDie
echo "...Tomcat stopped."
;;
restart)
$0 stop
echo "...Restarting..."
sleep 8
$0 start
;;
status)
status $PROG -p $PIDFILE
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac

exit $RETVAL

作成したファイルを有効化

$ sudo chmod 755 /etc/init.d/openmeetings
$ sudo systemctl daemon-reload
$ sudo /lib/systemd/systemd-sysv-install enable openmeetings
$ sudo systemctl start openmeetings

■OpenMeetingsのWeb UIによる初期設定

以降、WebUIでの設定となります。

 http://【インストールホスト】:5080

 

■アクセスすると次の画面が表示されるので[NEXT >]を押下。

Openmeetings_01

データベースユーザーとパスワードを入力し、[接続試験]をクリック。問題なければ[NEXT >]を押下。

Openmeetings_02

■最初のユーザーの生成。管理者アカウントですがうっかり会社のアドレス情報いれてしまったので見た目汚くて申し訳ない
けっこう制約があるようです。
(パスワードには大文字、小文字、数字、記号(!@#$%^&*][)を含める必要あり、名前と一緒だとNG等)

設定が済んだら[NEXT >]を押下

Openmeetings_03

■自己登録の拒否を設定して、管理者のみがユーザー追加をできるように設定。
 メール送信用のサーバも会社のサーバ名とか入れてるのでこれまた汚くて申し訳ないです。
 設定したら[NEXT >]を押下

■ライブラリが使えるかどうかの確認。
 [接続試験]のボタンを全部クリックしてOKであることを確認したら、[NEXT >]を押下

■このページはこのままで[NEXT >]を押下

■[FINISH]を押下してインストール。なおインストールボタンというものはない

■インストール処理が完了したら以下の画面になる。なお、「再起動」はしないでも一応ログイン後の画面には遷移した。

SSL設定は別途するので、この時点では

 http://【インストールホスト】:5080

に再接続する。

ログイン後の画面イメージ

・Nginxでのリバースプロキシ

この状態だと、ローカルPCからのアクセスしかできず、またSSL設定も行っていない状態です。

当方が試験用に自宅で構築しているものは、どれもNginxでのリバースプロキシを用いて、DDNSでIPアドレスを割り当てた各種サブドメインごとに異なる仮想マシンに転送する構成になっています。

また、その際にNginxでLet's EncryptのSSL通信を終端しています。

このOpenmeetingsも、リバースプロキシで外部から使おうとしたんですがまぁなかなかにハマりました。

そのへんも書いていこうと思います。

■構成

基本的に当方が自宅で外部向け公開(といっても、試験用のものが多いので頻繁に変わったりしてますが)は、以下のように構成している。

インターネット -> ルータ(80/443 ポート開放済み) -> Nginx(リバースプロキシ)  -> 各種サーバ

Let's Encryptの証明書発行のためのアクセスも受け付ける必要があるので80番ポートも開けているが、基本的なアクセスはすべてSSLで行っている。

常時5.6個ほどのドメインに対してDDNSで(同一)IPを割り当てて、URLアクセスをNginx でリバースプロキシしている。

これまでもShirasagi、Odoo、NextCloud、など毎回厄介そうなものをリバースプロキシで試験含め運用してきたが、今回はさらにハマった。
それでもググることで2、3日で答えが見つかるんだからネットはすごいなー(小並感)

簡単に言うと、以下設定をせずにリバースプロキシ経由でアクセスした場合、リクエスト元がhttpsなのに、NginxとTomcat間の接続はhttpなので、TomcatのCSRF対策によりBad Requestとして処理されてしまう、という問題が発生します。

海外のフォーラムなどでもこの問題にハマっている方は多いようでしたが、Openmeetings関係のところでは以下の設定は貼られてませんでした。

ただ、stackoverflowのこのページが引っ掛かりまして、結局Tomcat側の設定を変更しないとダメだというのが判明しました。難しいもんですね。

インターネット ->https-> Nginx ->http-> Openmeetings

となっているので、Openmeetings側で上記を検出し、リダイレクトの際にhttp通信であることからCSRFとしてはじかれる。

インターネット ->★https-> Nginx ->http-> Openmeetings

★の部分がhttpsであることをNginxからOpenmeetingsに通知するが、さらにそれを処理するための設定をTomcat側にも実施することで、プロキシ経由の通信であることが正常に処理され、問題なく通信ができるようになる。

■Nginx側の設定

本設定をnginxのconf.dディレクトリ配下に置いてnginx.confにIncludeさせてます。なのでhttpセクションは未記載。
ホスト名とIPアドレスは書き換えてます。

map $http_upgrade $connection_upgrade { ★1
default upgrade;
'' close;
}

server {
server_name openmeetings.mydomain.com;
listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate /etc/letsencrypt/live/openmeetings.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/openmeetings.mydomain.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/openmeetings.access.log;

location / {
proxy_pass http://xxx.xxx.x.xxx:5080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;     ★2
proxy_http_version 1.1;              ★2   
proxy_set_header Upgrade $http_upgrade;      ★2 
proxy_set_header Connection $connection_upgrade; ★2
}
}

★1
mapディレクティブを使って、$http_upgrade、$connection_upgradeを定義します。

$http_upgrade $connection_upgrade {

default upgrade;
'' close;
}

$http_upgradeの値が空('')の場合は、
$connection_upgrade = close

それ以外の場合は、
$connection_upgrade = upgrade

という処理になります。

 

SSL処理の部分は通常のものと変わらないので割愛させてください。

★2
proxy_set_headerで以下の値を指定します。
他のProxyヘッダももちろん必要ですが、以下は今回のOpenmeetingsのリバースプロキシ化に必要なので特記します。

proxy_set_header X-Forwarded-Proto https;
proxy_http_version 1.1;              
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

proxy_set_header X-Forwarded-Proto

を用いて、前段の通信がhttps通信であることを伝えます。

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

http1.1であることを明示的に宣言し、NginxのWebSocketプロキシ機能を有効にして、Upgradeヘッダとコネクションヘッダをプロキシからバックエンドに伝えます。

ただし、Openmeetingsの場合、Nginx側の設定だけではダメで、Tomcat(Openmeetings)側のSever.xmlファイルも変更する必要があります。

server.xmlの

<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="true">

の後ろに以下を追記します。

<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>

org.apache.catalina.valves.RemoteIpValve

というClassはProxy経由でのアクセスの際にリモートの情報を取得するためのものになります。

なお、上記は

remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"

を含めていますが、おそらく今回の設定の場合は

protocolHeader="x-forwarded-proto"

だけ設定されていれば問題ないはずです。

NginxとServer.xmlを変更し、両方とも再起動をかけて(サービス再起動でもいいとは思います)
上記設定ファイル上での「https://openmeetings.mydomain.com」

にアクセスすれば、Nginxでのリバースプロキシを介したOpenmeetingsへの接続ができているはずです。

 

0

直接的には

被害があるわけではないけど、やはり間接的には影響がありますなあ

新コロ関連でバタバタしてあっという間にいろいろやる時間がごっそり無くなっていました。

コミケも中止になってその後のことはまだまだ予断を許しませんし、どうなることやらですね。

また気を取り直していろいろやっていきたいです。

0

Shirasagiの扱いが難しい

まぁRubyやらRailsやらからっきしなのでアレですが。

今回のはRuby関係ないですが。

Shirasagiの常時SSL化をNginxのリバースプロキシ下でやろうとしてハマった話。

インターネット(SSL)⇒Nginx ⇒(ここから先http)(別Serverの)Nginx ⇒ Shirasagi(Unicorn?)

という構成で、公開サイトをsslで表示するのはすぐにできたんですが、管理画面ログインがうまくいかなくて困った。

 

フロント側のNginxのプロキシ(ヘッダー)設定を

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;

バックエンド側のNginxはShirasagiインストール時に生成されてるんだけど、

#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $realip_remote_addr";

に書き換えてみた。

ようはフロントで

proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;

して、バックエンドで

proxy_set_header X-Forwarded-Proto $scheme;

することでうまくいくらしい。

なおバックエンド側に追記したのは

フロント側で

proxy_set_header X-Forwarded-For $remote_addr;

しておいてバックエンド側で書き換えた

proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $realip_remote_addr";

でアクセス元のIPを取ろうという記述、、、のはず。

Nginx触り始めて1週間でググりまくった結果なのでまたこつこつ調べないといけませんね。

0

F-Revo CRM patch適用とPHP7.2化

雑ですが忘れないようメモ

・F-Revo CRMをインストール

無印?版はphp5.6でしか動かないのでオフィシャルなどにある手順通りインストール

https://f-revocrm.jp/2018/08/8273

パッチ3の適用まで書いてありますが、さらに今はパッチ4、5、6、6_1までリリースされていますので、すべて適用します。

基本的にアーカイブを展開してディレクトリごと上書きするだけです。

また、前の記事で書いた includes/main/WebUI.php

がパッチ6で上書きされるので、修正しなおしを忘れないようにしましょう。

パッチ6がphp7対応バージョンとのことなので、合わせてphpを7.2に更新します。
一応apacheとか止めておいたほうが無難なのかな?当方は仮想マシンで丸ごとバックアップしていたのであんまり考えずに実行してしまいましたが。

yum install --disablerepo=base --enablerepo=epel,remi,remi-safe,remi-php72 php php-gd php-mysqlnd php-imap php-mbstring php-devel php-mcrypt php-xml php-opcache

用心でphp.iniとかもバックアップしてましたが、特に何も変更せずとも大丈夫でした。

これでphp7.2環境になりました。

時間が取れそうならもう少し丁寧に書きます。。。

0

F-revo CRM リバースプロキシ関連のTips

F-revo CRMをNginxのリバースプロキシの背後に置くとRefererを見られてうまく動いてくれない。

本来ならgetコマンドでRefererを取って反映、とかやるのが正しいのだろうけど、とりいそぎコード変更してみた。

どうなんだろ、一応開発元に質問したりしてみてもいいもんなんだろうか。

なお前提としてNginxでのリバースプロキシは構築済みで、nginx側でのSSL化も済んでる前提です。

■事前:

crm/config.inc.phpの「$site_URL」を以下のように設定

$site_URL = 'http://【サーバのIPアドレス】/crm/';

■以下のように変更

# vi crm/config.inc.php

$site_URL = 'https://【SSL証明書を取得したドメイン名】/crm/';

# vi crm/includes/main/WebUI.php

// if ($site_URL && stripos($request_URL, $site_URL) !== 0){
// header("Location: $site_URL",TRUE,301);
// exit;
// }

ただ、これRequest URLとSite URLが正しくないと接続を許可しないってセキュリティ面を担保する設定のような気がするので、そもそもOFFにするのがいいのかといわれるとちょっと。。という感じ。

一応ログ等見ながら様子見。

。。。あれ、パッチどこまで適用してたっけ。。ちょっと確認しないと。

0

Nginx リバースプロキシ&SSL設定のTIPS

基本的なインストールやら導入は(暇があったら書きますが)、とりあえずたくさん記事があるので放置して、ハマリかけたとこだけ

SSL設定で

dhparam.pem

がないと怒られる。

# nginx -t
nginx: [emerg] BIO_new_file("/etc/ssl/certs/dhparam.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/ssl/certs/dhparam.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)

まぁネット上のConfigパクってて設定もしてないほうが悪いんですが、Nginxは今のVersionだとdhparam.pemがないといけないらしいので注意。

んで

# openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem
Generating DH parameters, 2048 bit long safe prime, generator 2

完了まで時間がかかる。

そのあと

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

正常にとりあえずはなったのでメモ

0

NextCloudとリバースプロキシ

他に書く場所も確保していないのと、せっかくの構築関連のTIPS的なやつなのでここにメモがてら。

自宅で古めのサーバにNextCloudを構築して使っているが、自宅にいくつもサーバを立てていると、外部から接続させるときのポートフォワーディング設定などが煩わしい

うっかり開けた穴を閉じ忘れてるなどもあるかもしれないので、思い切ってやり方を変えることにした。

基本的に自宅で構築するものはWeb系のものが多い。なのでいっそ全部リバースプロキシで受けて増やしたり減らしたりする際にはリバースプロキシ側で制御すればいいんじゃん?と考えたわけである。

。。。が、本編のリバースプロキシ構築に入る前に、NextCloudを現在Let's Encryptを使ってhttpsで外部からつながるように設定しているのだが、ローカル側は常にhttpで構築するように変更しようと考えたところなぜかNextCloudにhttp経由の場合ログインができない状態に陥った。

色々調べてみると、どうもphpのセッションが格納されるディレクトリの権限の問題と判明。

当方の場合CentOSでインストールしているのだが、/var/lib/php の権限の問題で、/var/lib/php/session配下に生成されるセッション管理ファイルがうまく読み書きできない状態になる模様。

なので

chown -R apache:apache /var/lib/php

として、権限を変更し、無事httpでも正常にログインできるようになった。

このメモだけだとわかる人にしかわからないが、NextCloudをVersionUpしたり、CentOSでPHP 7.xをremiリポジトリからインストールしてると発生するケースがあるようなのでメモ。

 

0

サイト内コンテンツ

現在はローカルでの作業が主体ですが一応コンテンツをもう少し拡充させようと地味に努力中。

とりあえずはマイナーOSデータベースの再整理を進めてます。昔ダウンロードしたものが現状、サイトごと消えてたりするかと思えば、一応ソースコードだけはまだsourceforgeに残ってたりと様々です。

 

また、勢いでドカドカダウンロードしてたものが単なるLinuxのディストリビューションだったりすることもしばしば(そしてとっくの昔にプロジェクト自体は崩壊済みなのもしばしば)。

Linuxのディストリビューションは、DistroWatchなどの大手サイトもありますのでそれほど深堀りする気はありませんが一応、明確に区分はしておかないとと思って整理中です。

ただデータベースの項目名をどうするかは悩ましいところ。あんまり凝りすぎないほうがいいのかもしれませんが、情報量が少なすぎるのもと思ったり、そう思えばそもそも情報が全然なかったりと悩ましいです。

0

冬コミ終了

今回は惨敗中の惨敗です。
まぁ前々回あたりからろくな宣伝活動もできていないのは確かなので、もう少し活動をしていきたいと思います。

始めにfnowのサイト内のコンテンツをもう少し充実していかないと。。。

 

0