<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>アナログを愛するデジタル生活館</title>
  <link>http://blog.mor-maid.info/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://blog.mor-maid.info/RSS/" />
  <description>ちゃんとカテゴリ分けされておりませんので、
記事をお探しならブログ内検索が便利です。
ご活用くださいませー+.(≧∀≦)ﾟ+.ﾟ
</description>
  <lastBuildDate>Fri, 16 Jan 2026 07:09:02 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>サーバに負荷をかける方法</title>
    <description>
    <![CDATA[<pre># コア数を自動取得して、その分だけバックグラウンドで無限計算を走らせる
for i in $(seq 1 $(nproc)); do 
    sha256sum /dev/zero &amp; 
done
</pre>]]>
    </description>
    <category>どうでもいいコト</category>
    <link>http://blog.mor-maid.info/%E3%81%A9%E3%81%86%E3%81%A7%E3%82%82%E3%81%84%E3%81%84%E3%82%B3%E3%83%88/%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E8%B2%A0%E8%8D%B7%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95</link>
    <pubDate>Fri, 16 Jan 2026 07:09:02 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/752</guid>
  </item>
    <item>
    <title>Let's Encryptで管理しているドメインを削除する</title>
    <description>
    <![CDATA[<div>こちらもすぐ忘れてしまうのでメモです。</div>
<div></div>
<div>`sudo certbot certificates`</div>
<div><br />
Certificate-Name を確認し<br />
<br />

<div>`sudo certbot delete --cert-name &lt;Certificate-Name&gt;`</div>
<div><br />
で削除です。<br />
<br />
#certbot #letsencrypt #linux #webserver</div>
</div>]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/let--s%20encrypt%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B</link>
    <pubDate>Tue, 08 Jul 2025 07:15:54 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/751</guid>
  </item>
    <item>
    <title>tor 経由でクロール</title>
    <description>
    <![CDATA[クロールはあまり大きな声で言えませんが私生活上身近な存在です。<br />
そしてクロールをするうえで非常に重要になるのが、いかにコンテンツを取得するかとなります。<br />
<br />
それはWEBサイト運営者の身になって考えるとわかるのですが、コンテンツ提供者にとってbotのアクセスは望まざる来訪者です。<br />
時に負荷をかけるだけで一文の得にもならないどころかコンテンツを流用されて被害すら出ます。<br />
そのためクロールという行為そのものが受け入れる側としては好ましくありません。<br />
時にはアクセスを遮断される事態に陥ります。<br />
<br />
アクセスブロックという事象です。<br />
単純なアクセスブロックは接続元のIPアドレスを元に遮断を行います。<br />
つまりアクセス元が複数（のIP）あればかいくぐることができる（可能性が高まる）ということです。<br />
<br />
そのために世の中のボットはサーバを仲介してアクセス元を偽装しコンテンツの取得を試みます。<br />
通称プロキシというものです。<br />
アクセス元をごまかせれば何でもいいので要はIPなのですが、個人（法人であっても）IPを手に入れるのは割と困難で費用も掛かります。<br />
そこで安いVPSなどをレンタルして仲介することでアクセス元をごまかします。<br />
<br />
しかしこんなことをする方であればご存知だと思いますがアクセス元のIPアドレスはまだまだIPv4が主流です。<br />
そしてIPv4は既に割り当てが完了しています（枯渇状態）。<br />
そうなってくるとこのIPの所有者はだれであるかは容易な話になってきます。<br />
使用者は難しいですが、所有者は割と簡単です。<br />
<br />
となるとアクセスされる側としては大事なのはどこから来たのか、となりますので、サーバから来た≒踏み台を使用して偽装アクセスしているの方程式が成り立ちますので、アクセスブロックを施策するわけです。<br />
こうしてアクセスされる側は大量のアクセスをブロック、踏み台をブロックという2段構えでコンテンツを守るわけです。<br />
<br />
もしここまで施策しているサイトからコンテンツを取得したいとなると容易ではありません。<br />
しかしブロックの仕組みがIPアドレスのみで判断している場合はかいくぐれる可能性が高い方法があります。<br />
<br />
それが&nbsp;<a href="https://www.torproject.org/" title="">tor</a> です。<br />
<br />
前置きが長くなりましたが、torの構築メモとなります。<br />
こういうニッチでグレーな環境を構築するにはUbuntuOSが手っ取り早いでしょう。<br />
<br />

<pre># tor のインストール
sudo apt install tor

# tor サービスの起動
sudo systemctl start tor

# IPをすぐに変える場合はサービスの再起動が手っ取り早い
sudo systemctl restart tor

# クロールテスト（自分の生IP）
curl -s http://taruo.net/ip/ | egrep '[0-9.]{8,16}'
# クロールテスト（torのIP）
curl -s -x socks5h://127.0.0.1:9050 http://taruo.net/ip/ | egrep '[0-9.]{8,16}'
</pre>
<br />
どうでしょうか。生IPから変ってIPを偽装されているのがわかると思います。<br />
しかし tor ではデフォルトで localhost&nbsp;を Listen します。<br />
クロールサーバと tor サーバが抱き合わせならこれでもいいですが、別にする場合はサーバIPのほうが良いです。<br />
設定でループバックアドレスからローカルIPに変更することはできると思いますが、ここでは手っ取り早くポートフォワーディングで乗り切ってみようと思います。<br />
<br />

<pre># ポートフォワーディング専用コマンドのインストール
sudo apt install redir

# ポートフォワーディングの設定（8080-&gt;127.0.0.1:9050）
redir --lport=8080 --cport=9050 --caddr=127.0.0.1
</pre>
<br />
#tor<br />
#クロール<br />
#プロキシ<br />
#UbuntuServer24.04<br />
<br />
<br />

<div id="gtx-trans" style="position: absolute; left: -99px; top: -18px;">
<div class="gtx-trans-icon"></div>
</div>]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/tor%20%E7%B5%8C%E7%94%B1%E3%81%A7%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB</link>
    <pubDate>Thu, 22 Aug 2024 09:34:40 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/750</guid>
  </item>
    <item>
    <title>わかりにくいdjangoのPermissionを紐解く</title>
    <description>
    <![CDATA[djangoのPermissionはわかりにくいですよね。<br />
恐らくやり方だけが出回っているため、その全体像がイメージしにくいために把握に時間が掛かってしまうのだと思います。<br />
<br />
私もかなり調べました。<br />
djangoのPermissionの考え方はシンプルでCRUDに基づき、追加・削除・更新・閲覧がデフォルトで用意されています。<br />
そしてその権限はアプリとモデルに紐づくということです。<br />
<br />
アプリに紐づくというのはイメージしやすいのですがモデルに紐づくというのがちょっと混乱を招いている気がします。<br />
というのも権限の範囲がアプリというスコープなのはイメージしやすいですが1アプリの中でモデルは複数存在するものではないかと思います。<br />
にもかかわらず権限はモデルに紐づくため、モデルと言ってもどのモデルを使えば&hellip;？<br />
という疑問から始まってしまいます。<br />
<br />
しかもモデルに紐づけている割にはその仕組みをコンテントタイプ（ContentType）というここにきて新しい概念で括ってきます。<br />
これらの立て付けをちゃんと説明しているサイトが少なく、権限付与のやり方という結論しかないため難しくしているのではないでしょうか。<br />
ちなみにContentTypeはざっくりアプリ名とモデル名を紐づけたものです。<br />
<br />
さらにContentTypeはdjangoアプリに。<br />
permission自体はauthアプリに紐づくのもわかりにくい。<br />
ここはもはや標準機能内のおはなしなのでそういうもの、で終わらせておきましょう。<br />
<br />
これらから私はdjangoのPermissionsは以下のように立て付けることとしました。<br />
アプリまたは業務スコープ内でPersmissionsテーブルを作ってしまう。<br />
よくあるブログと投票の例でいうと<br />
<br />

<pre>class BlogPost(models.Model):
    # ...


class Vote(models.Model):
    # ...
</pre>
こんな感じがあったとしてブログを管理できる権限と管理ができる権限を分ける場合、こんな感じのモデルを作っちゃいます。<br />

<pre>class BlogPermission(models.Model):
    class Meta:
        managed = False


class VotePermission(models.Model):
    class Meta:
        managed = False
</pre>
Permissionはモデル（テーブル）に自動的に自動的に紐づくので、中身や管理も不要です。<br />
managed=Falseでもパーミッションは作成されてしまうようなので、modelsに記載されているかどうかが重要のようです。<br />
またモデルを消してもPermissionは残るので、もしかしたらカスタムPermissionのほうが良いかもしれません&hellip;<br />
とはいえ権限の設定があることがmodelsに記載すること明白になるので、まったくメリットがないというわけじゃないと思っています。<br />
なのでここまでできてしまえば、後は簡単。<br />

<pre># 必要なモデル群をimport
from django.contrib.auth.models import User, ContentType, Permission
from sample.models import BlogPermission

# ContentTypeを引き出して、該当の権限を引っ張る
content_type = ContentType.objects.get_for_model(BlogPermission)
permissions = Permission.objects.filter(content_type=content_type)

# それをユーザに紐づけるだけ
user.user_permissions.set(permissions)
if user.has_perm("sample.add_blogpermission"):
    print('権限あります')

# 上記はCRUD全てですが、特定の権限に絞る場合はこんな感じ
permissions = Permission.objects.filter(content_type=content_type, codename__startswith='delete')
</pre>
<br />
次にグループです。<br />
グループの概念がある割にグループに関する操作マニュアルが希薄でこれまたわからない&hellip;<br />
どこにグループの作り方の記載あるのでしょうか&hellip;<br />
テーブル見る限り、単純にINSERTで対応してしまえばよいみたいです&hellip;<br />
ここもキャメルケースにすべきかどうかも不明ですね&hellip;<br />

<pre># グループを作成
group = Group(name='BlogAdmin')
group.save()

# グループが持つ権限をセット
permissions = Permission.objects.filter(content_type=content_type)
group.permissions.set(permissions)
group.save()

# ユーザにグループ権限を付与
user.groups.set([group])
</pre>
慣れればこれだけ。<br />
ただグループとユーザが同列のため、その権限はユーザPermissionなのかグループPermissionなのかはしっかり設計が必要です。<br />
<br />
私は権限のスコープはモデルで、権限の塊はグループで分けることにしました。<br />

<pre># 閲覧のみ
group = Group(name='BlogViewer')
group.save()
permissions = Permission.objects.filter(content_type=content_type, codename__startswith='view')
group.permissions.set(permissions)
group.save()

# 編集者
group = Group(name='BlogEditor')
group.save()
group.permissions.set([Permission.objects.get(content_type=content_type, codename__startswith='view'),
                      Permission.objects.get(content_type=content_type, codename__startswith='add'),
                      Permission.objects.get(content_type=content_type, codename__startswith='change'),])
group.save()
</pre>
<br />
少しでも参考になれば幸いです。]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%84django%E3%81%AEpermission%E3%82%92%E7%B4%90%E8%A7%A3%E3%81%8F</link>
    <pubDate>Mon, 19 Feb 2024 08:22:22 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/749</guid>
  </item>
    <item>
    <title>Python3.10 インストールメモ</title>
    <description>
    <![CDATA[ガチdeメモ<br />

<pre>sudo dnf install curl gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make -y
export CFLAGS="-fPIC"
./configure --enable-optimizations --prefix=${HOME}
make clean
make -j $(nproc)
make install</pre>
<pre></pre>]]>
    </description>
    <category>どうでもいいコト</category>
    <link>http://blog.mor-maid.info/%E3%81%A9%E3%81%86%E3%81%A7%E3%82%82%E3%81%84%E3%81%84%E3%82%B3%E3%83%88/python3.10%20%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2</link>
    <pubDate>Tue, 16 Jan 2024 07:52:53 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/748</guid>
  </item>
    <item>
    <title>話題のTiDBおいくら万円？</title>
    <description>
    <![CDATA[aaSで悩ましいのはコスト計算。<br />
運用したら移行コストも含めてペイできないもよく聞きます。<br />
最近では脱クラウド、オンプレ回帰という言葉もよく見ます。<br />
<br />
しかしながらクラウドが便利であることには変わり有りません。<br />
特にデータ周りはバックアップや耐障害性も踏まえるとaaSはとても優位です。<br />
<br />
そんな中で新鋭とも呼べるaaSがTiDB。<br />
MySQLベースのRDBMSのサービスでDaaSに分類されます。<br />
<br />
そんなTiDBはDisk容量とRU、リクエストユニットというこれまたわからない使用量の単位で課金をしてきます。<br />
Diskもシンプルかと思いきや、行ストレージと列ストレージがあります。<br />
いったん行だけ考えます。<br />
無料枠は5GiB、5000万RUまで。<br />
単位を聞くとそこそこ使えそうです。<br />
<br />
実際は、というと77MBのデータを保存して85MiB。<br />
RUは66万です。<br />
小さいアプリケーションならそこそこ使えそう。<br />
ということでざっくり、1MB書き込み処理を行うのに10,000RU、1MB読み込み処理を行うのに100RUくらいという試算がでました。<br />
<br />
ビッグデータをゴリゴリ解析するのでないなら5GiBはかなりの容量です。<br />
5000万RUまで無料を考えるとRUも思ったより消費しませんね。<br />
<br />
どこかで一度本運用してみたいと思います。<br />
<br />
]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/%E8%A9%B1%E9%A1%8C%E3%81%AEtidb%E3%81%8A%E3%81%84%E3%81%8F%E3%82%89%E4%B8%87%E5%86%86%EF%BC%9F</link>
    <pubDate>Fri, 29 Dec 2023 02:51:47 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/747</guid>
  </item>
    <item>
    <title>pip install mysqlclient が失敗するとき</title>
    <description>
    <![CDATA[バージョンを落として解決！<br />
とか何の解決にもなっていない記事が散見されるので備忘録。<br />
<br />
必要なライブラリがないからpipで失敗するのでパッケージ管理コマンドで事前にインストールしておくだけです。<br />

<pre># Redhat系
sudo dnf install mariadb-connector-c-devel

# Debian系
sudo apt install libmysqlclient-dev
</pre>
<br />
Refs: <a href="https://unix.stackexchange.com/questions/758535/how-to-install-libmysqlclient-dev-at-almalinux-9-2">How to install libmysqlclient-dev at AlmaLinux 9.2</a><br />
#Python3 #pip #mysql]]>
    </description>
    <category>どうでもいいコト</category>
    <link>http://blog.mor-maid.info/%E3%81%A9%E3%81%86%E3%81%A7%E3%82%82%E3%81%84%E3%81%84%E3%82%B3%E3%83%88/pip%20install%20mysqlclient%20%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D</link>
    <pubDate>Thu, 28 Dec 2023 08:59:40 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/746</guid>
  </item>
    <item>
    <title>jpegtran コマンドをインストールする</title>
    <description>
    <![CDATA[画像をベースライン形式からプログレッシブ形式に変換する要件が出てきたので、楽な方法は無いかと検索したところ jpegtran コマンドがよさそうってなりました。<br />
しかし dnf などで入らないようなのでコンパイルが必要です。<br />
備忘録的にシェルスクリプトを作成しました。<br />
<br />

<pre># シンプルにインストール
curl http://notebook.mor-maid.info/scripts/jpegtran_install.sh | bash -
</pre>
<pre># インストール先などを変える場合はいったん保存が必要
# working_path はソースのダウンロードやコンパイルを行うディレクトリです
curl http://notebook.mor-maid.info/scripts/jpegtran_install.sh &gt; jpegtran_install.sh
chmod +x jpegtran_install.sh
./jpegtran_install.sh -i path_to_install -w working_path
</pre>
<pre># インストールに必要な dnf などで入るパッケージも含めてインストールする場合は -d でやってくれます
# その場合は要rootユーザです
curl http://notebook.mor-maid.info/scripts/jpegtran_install.sh &gt; jpegtran_install.sh
chmod +x jpegtran_install.sh
./jpegtran_install.sh -i /user/local/ -w working_path -d
</pre>
<br />
refs: <a href="https://www.hack-log.net/entry/jpegtran-optimization/">jpegtranのインストール方法と使い方【JPG画像最適化】</a><br />
要望不具合は<a href="https://twitter.com/al_aya_yuka">X</a>にて賜ります]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/jpegtran%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B</link>
    <pubDate>Thu, 28 Dec 2023 04:50:06 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/745</guid>
  </item>
    <item>
    <title>自動でchromedriverをダウンロードする方法</title>
    <description>
    <![CDATA[まぁ、ググれば出てくるんですが、まだググり方にコツがいるので、備忘録的に&hellip;<br />
WEBサイトのテストや邪道な使い方としてクローラを作成するときにseleniumはよく使う手段です。<br />
が、geckodriverはともかくchromedriverは毎回chromeのバージョンに合わせたchromedriverを使わなければなりません。<br />
そのため、毎回chromedriverを起動するchromeに合わせて落としてくる必要があるのですが&hellip;<br />
pipにて自動インストールするモジュールがありましたので、こちらを使うと便利ですよ、というお話しです。<br />
<br />
またfind_element_by_xpathもなくなったようなので、合わせて代替方法も記載します。<br />
<br />
<br />
事前作業<br />

<pre>pip install selenium
pip install webdriver_manager
</pre>
<br />
簡易的に確認<br />

<pre>2023.08.21　更新
# 4.3.0 以降は呼び出し方が変わったみたいです

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get('https://yahoo.co.jp/')
driver.find_elements(By.XPATH, '//a')
</pre>
<br />

<pre># 4.3.0 以前のやりかた

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://yahoo.co.jp/')
driver.find_elements_by_xpath('//a')
</pre>
<br />
検索タグ<br />
#python #python3 #クローラ #chrome #chromedriver #selenium]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/%E8%87%AA%E5%8B%95%E3%81%A7chromedriver%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95</link>
    <pubDate>Tue, 06 Jun 2023 00:25:21 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/744</guid>
  </item>
    <item>
    <title>hgwebを最短で実現する方法（かきかけ）</title>
    <description>
    <![CDATA[<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">バージョン管理は主に案件、システム単位で行うことは多いと思いますがそうなるとその単位でリポジトリを切ることになります。</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">ローカル、または共有サーバ上でディレクトリを作成してそれぞれにリポジトリを作ることはリポジトリの管理の面でとても楽ちんです。</span></span></div>
<div><br />
一方でローカル、またはイントラにあるネットワークからはデプロイが困難という側面もあります。</div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;" data-mce-mark="1"><span style="white-space: normal;" data-mce-mark="1">高度なインテグレーション体制（CIツールの利用）があれば、解決可能でしょうが、そこに至らない小規模開発ベンチャーにはハードルが上がります。&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">またアクセス権という意味ではしっかりしておかないと、リポジトリにアクセスできる人はどのリポジトリにもアクセス可能になってしまいます。&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">githubなどはそれらをうまく回避可能なのでしょうが、Mercurialではどうでしょうか、ということで前置き長くなりましたが、hgwebの導入について、です。&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">hgwebの特徴&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">・WEB経由で行える&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">・リバプロで対応することでインターネットはSSL通信を容易に実現可能</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">・BASIC認証などを組み合わせればアクセス制限を簡易的に実現できる</span></span></div>
<div><br />
<br />
</div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">ほぼ以下を丸パクリ&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">https://github.com/benoitc/gunicorn-recipes/issues/1</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">でもいくつか思い通りにならないので後ほど修正します。</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&lt;br /&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">事前準備</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&lt;pre&gt;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># 必要なモジュールを pip で入れていく</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># 必要に応じてvenvは事前にして置くこと</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">pip install mercurial</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># リポジトリ群を格納するディレクトリを作成（場所は任意）</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">mkdir -p /var/vcs/mercurial/repos</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># hgwebの設定を諸々記載するディレクトリを作成（場所は任意）</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">mkdir -p /var/vcs/mercurial/hgweb</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># hgweb.py を作っていく</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">vim /var/vcs/mercurial/hgweb/hgweb.py</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"><br />
from mercurial.hgweb import hgweb<br />
<br />
</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># bytes にするところがミソ</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">CONFIG = b'./hgweb.config'</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;">app = hgweb(CONFIG)</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># hgweb config を作っていく</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">vim /var/vcs/mercurial/hgweb/hgweb.config</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">[ui]</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">editor = vim</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">[web]</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># 今回は /hgweb/ からリバプロからのリクエスト想定なのでこのようにする</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">baseurl = hgweb/</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># 今回は paths でワイルドカードを指定し、動的（再帰的）にリポジトリを検索する</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">descend = True</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># SSLはApacheで、リバプロと hgweb はイントラ内なのでSSLは無効にする</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">push_ssl = false</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># pushを許可する</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">allow_push = *</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">[paths]</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">/ = /var/vcs/mercurial/repos/*</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># gunicorn の設定</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">vim /var/vcs/mercurial/hgweb/gunicorn.conf.py</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">import pathlib</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">base_dir = pathlib.Path(__file__).parent</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">wsgi_app = 'hgweb:app'</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">host = "127.0.0.1"</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">port = "9000"</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">bind = f"{host}:{port}"</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">daemon = True</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">reload = True</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># httpd.conf この辺は諸々省略します</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">cat &lt;&lt; EOS &gt; /etc/httpd/conf.d/hgweb.conf</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">ProxyPass /hgweb/ http://127.0.0.1:9000/</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">ProxyPassReverse /hgweb/ http://127.0.0.1:9000/</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">EOS</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">----</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># リポジトリ作成</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">cd /var/vcs/mercurial/</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">hg init repos/test_repo &amp;&amp; touch hgweb/gunicorn.conf.py</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;"># リポジトリが見えることを確認する</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">https://hgweb.host/hgweb/</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&nbsp;</span></span></div>
<div><span face="Arial, メイリオ, sans-serif" style="font-family: Arial, メイリオ, sans-serif;"><span style="white-space: normal;">&lt;/pre&gt;</span></span></div>
<div></div>
<div id="gtx-trans" style="position: absolute; left: 55px; top: 488px;">
<div class="gtx-trans-icon"></div>
</div>]]>
    </description>
    <category>技術系</category>
    <link>http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/hgweb%E3%82%92%E6%9C%80%E7%9F%AD%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88%E3%81%8B%E3%81%8D%E3%81%8B%E3%81%91%EF%BC%89</link>
    <pubDate>Thu, 02 Feb 2023 12:04:01 GMT</pubDate>
    <guid isPermaLink="false">blog.mor-maid.info://entry/743</guid>
  </item>

    </channel>
</rss>