Category Archives: 未分類

2018-03-08

さくらのレンタルサーバにGitWebを入れてスマホ対応とハイライト

さくらインターネットのレンタルサーバにGitWebを入れた。GitWebはいろいろパッとしないけれどレンタルサーバに入れるにはちょうど良いだろうと思ったので。

いや、実は大分前に入れていたのだけど使いづらいのであまり使っていなかった。

使いづらい点:

  • 見た目がパッとしない上にスマホ縦持ちだとかなり見づらい(画面が切り替わるたびにいちいちズーム調整したりスクロールしたりしながら見なければならない)
  • ソースコードのハイライトを有効にしていない

というわけで、入れ直してそのあたりを改善してみた。

gitのインストール

gitのインストール。基本的に最新のソースコードをダウンロードして展開、 gmakegmake install する。その際 gmake prefix=/gitインストール先 install とインストール先を指定する。(参考:さくらインターネットのレンタルサーバーへGitをソースコードからインストールする手順 | WPlogs)

gitwebの配置

gitwebは gitインストール先share/gitweb 以下にある。とりあえずコピーしてhttpサーバが見えるところに配置した。

  • /gitweb置き場/gitweb.cgi
  • /gitweb置き場/static/*

gitへのパスはビルドした時に gitweb.cgi に埋め込まれている。

gitwebの設定

/gitweb置き場/gitweb_config.perl を作る。

# 全gitリポジトリの置き場所
our $projectroot = "/gitリポジトリ置き場";
# プロジェクト一覧のデフォルトの表示順。最近変更した物優先
our $default_projects_order = "age";
# プロジェクトの所有者を非表示
our $omit_owner=1;
# UTF-8ではない場合のエンコーディング
our $fallback_encoding = 'cp932';
# サーバに /etc/mime.types が無いので作って指定(必要なら)
#our $mimetypes_file = "/gitweb置き場/mime.types";

# 見た目のカスタマイズ。モバイルデバイス(スマホ)対応
push @stylesheets, "gitweb-site.css";
our $site_html_head_string = '<meta name="viewport" content="width=device-width,initial-scale=1.0" />';

# ソースコードハイライト
$highlight_bin = "/highlightインストール先/bin/highlight";
$feature{'highlight'}{'default'} = [1];
push @stylesheets, "highlight.css"; #highlight --print-style -s <stylename>

gitwebのテーマ?……失敗

モバイルデバイス対応

スマホ(縦)でもそこそこ見られるようにcssを調整する。

/gitweb置き場/gitweb_config.perl に次の文を追加。

our $site_html_head_string = '<meta name="viewport" content="width=device-width,initial-scale=1.0" />';
push @stylesheets, "gitweb-site.css";

/gitweb置き場/gitweb-site.css を次のように作成。

/* page header,body,footer height */
/* (レイアウトが崩れるので) */
div.page_header {
    height: auto;
}
div.page_body {
    overflow: scroll;
}
div.page_footer {
    height: auto;
    overflow: auto;
}

/* search box width */
/* サーチボックスの幅が広すぎ */
input {
    max-width: 30%;
}

/* table vertical align */
/* (狭い画面幅だと文字の折り返しでセルの高さが高くなりがち。
   ファイル名やプロジェクト名部分など、中央に合わせた方が見た目が良い) */
td {
    vertical-align: middle;
}
table.object_header > tr > td {
    vertical-align: top;
}

/* narrow screen device */
/* (幅か狭いデバイス用の設定) */
@media screen and (max-width:480px){
    body { margin: 0; }
    td { word-wrap: break-word; }
    table { padding-left: 1px; padding-right: 1px;}
    /* source code */
    /* (ソースの文字を小さくする) */
    td.pre, div.pre, div.diff {
        font-size: 8px;
    }
    /* file list */
    /* (ファイル一覧のモード列とサイズ列を消す) */
    td.mode { display: none; font-size: 0; width: 0; padding: 0;}
    td.size { display: none; font-size: 0; width: 0; padding: 0;}
    /* project list */
    /* (プロジェクトリストの幅を画面に合わせ、description列を消し、
        その他の列の幅を指定する) */
    table.project_list {
        display: fixed;
        width: 100%;
    }
    table.project_list > tr {
        width: 100%;
    }
    table.project_list > tr > td:nth-child(1) {
        max-width: 150px;
    }
    table.project_list > tr > th:nth-child(2){display:none; width:0; padding:0;}
    table.project_list > tr > td:nth-child(2){display:none; width:0; padding:0;}
    table.project_list > tr > td:nth-child(3) { width: 4em;}
    table.project_list > tr > td:nth-child(4) { width: 6.5em;}
    /* shortlog */
    /* (shortlogのレイアウトを横に幅を取らないように) */
    div.title_text {
        padding: 4px;
    }
    div.log_link {
        float: none;
    }
    div.log_body {
        padding: 4px;
    }
    /* (shortlogテーブルの幅を画面に合わせて列の幅を調整) */
    table.shortlog {
        table-layout: fixed;
        width: 100%;
    }
    table.shortlog > tr{
        width: 100%;
    }
    table.shortlog > tr > td:nth-child(1) {width: 4em;}
    table.shortlog > tr > td:nth-child(2) {width: 20%;}
    table.shortlog > tr > td:nth-child(4) {width: 6.5em;}
    /* log */
    /* (logのコミット経過時間とコミットログとの間に改行を挟む。
        横に長くならないように) */
    div.header > a.title > span.age {
        width: 100%;
    }
    /* tags */
    /* (タグ一覧のテーブル幅を画面に合わせ、列の幅を調整) */
    table.tags {
        table-layout: fixed;
        width: 100%;
    }
    table.tags > tr{
        width: 100%;
    }
    table.tags > tr > td:nth-child(1) {width: 4em;}
    table.tags > tr > td:nth-child(4) {width: 2.5em;}
    table.tags > tr > td:nth-child(5) {width: 5em;}
    /* object header */
    /* (gitオブジェクトヘッダーテーブルの幅を画面に合わせ、列の幅を調整)*/
    table.object_header {
        table-layout: fixed;
        width: 100%;
    }
    table.object_header > tr {
        width: 100%;
    }
    table.object_header > tr > td:nth-child(1) {width: 4em;}
    table.object_header > tr > td:nth-child(3) {width: 5em;}
    /* history */
    /* (履歴一覧テーブルの幅を画面に合わせ、列の幅を調整)*/
    table.history {
        table-layout: fixed;
        width: 100%;
    }
    table.history > tr {
        width: 100%;
    }
    table.history > tr > td:nth-child(1) {width: 4em;}
    table.history > tr > td:nth-child(2) {width: 4em;}
    table.history > tr > td:nth-child(4) {width: 6.5em;}
}

/* link buttons */
/* (リンクの見た目をボタンにする) */
td.link > a,
div.page_nav > a,
div.log_link > a,
td.selflink > a {
    display: inline-block;
    background: #ffffff;
    padding: 2px;
    margin: 1px 1px;
    font-weight: bold;
    font-size: 11px;
    color: black;
    text-decoration: none;
    border-radius: 3px;
    border: 1px solid #e0e0e0;
}
td.link > a:visited,
div.page_nav > a:visited,
div.log_link > a:visited,
td.selflink > a:visited {
    color: black;
}

/* small buttons */
div.log_link > a {
    font-size: 70%;
}

/* log */
/* (ログのボタンの位置を調整) */
div.log_link {
    margin-top: -6px;
    padding: 0 0 4px 0;
    width: 150px;
}

/* expand anchor clickable area */
/* (ファイル名やプロジェクト名のリンクを押しやすくする) */
table.tree > tr > td.list
{
    padding: 0;
}
table.tree > tr > td.list > a,
table.project_list > tr > td > a.list
{
    display: block;
    padding: 0.4em 1em;
}

ボタンの間の区切り線(|)が邪魔なので取り除くために gitweb.cgi を修正する。CSSやJavaScriptでやるのは大変なのでCGIを直接書き換える。 gitweb.cgi 内の " | "' | ' の部分を $linksep に置き換え、変数 our $linksep = ""; を頭の方で定義しておく。 ただし、run_highlighterのところの " | " は置き換えてはダメだと思う。

一部のソースがダウンロードされてしまう問題(mime typeの調整)

一部のソースコードで blob を押しても表示されずダウンロードしてしまうので、見知らぬファイルは基本 text/plain として扱うものとする。

gitweb.cgisub blob_mimetype { 内を次のように変更。

        } else {
-               return 'application/octet-stream';
+               #return 'application/octet-stream';
+               return 'text/plain';
        }
 }

困る場合もあるかもしれないが、いちいち mime.types を追加していられないし Makefile のように拡張子が無い場合もある。

ソースコードのハイライト

ハイライトには André Simonhighlight を使用する。

ただし、さくらのレンタルサーバではg++のバージョンにより最新版はビルド出来なかった。試行錯誤の末、最終的に少し古いバージョンをビルドして済ませた。

Luaのインストール

highlightはLuaをライブラリとして使用するので、先にビルドする。

wget https://www.lua.org/ftp/lua-5.3.4.tar.gz
tar xf lua-5.3.4.tar.gz
cd lua-5.3.4
gmake freebsd
gmake install INSTALL_TOP=/luaインストール先

続いてhighlightのインストール……失敗

wget http://www.andre-simon.de/zip/highlight-3.42.tar.bz2
tar xf highlight-3.42.tar.bz2
cd highlight-3.42
gmake PREFIX=/highlightインストール先

エラー。 g++のオプションに -std=c++11 がついている。一部のソースコードでC++11の機能を使用しているので、対応コンパイラでないとビルド出来ない。 さくらのサーバに入ってるのはg++ 4.2.1(20070831)なのでc++11はおろか c++0xオプションすら使えない。 unique_ptrを使っている部分はauto_ptrで済むけれど、union内にstd::string入れているのはよく調査しないと無理。 最新のg++をインストールするのはさすがに無茶。

パッケージを利用出来ないか……失敗

ユーザーローカルなパッケージシステムを使う試みもあったようだ。

さくらのレンタルサーバ(スタンダード)でportsとpkgngを使って超簡単インストールツールを作ってみた - Qiita

sh -c 'bash -c "$(curl -fsSL https://raw.githubusercontent.com/bellflower2015/pspkg/master/setup.bash)"'

.cshrcに環境変数を設定するコードをセットして少し試してみる。

pspkg --search vim
Unknown modifier 't'

"/home/***/.pspkg/ports/Mk/bsd.port.mk", line 1043: Unknown directive
Unknown modifier 't'

Variable .CURDIR is recursive.
"/home/***/.pspkg/ports/Mk/bsd.port.subdir.mk", line 117: warning: "make -V _JAVA_VERSION_LIST_REGEXP USE_JAVA=1 -f /home/***/.pspkg/ports/Mk/bsd.port.mk" returned non-zero status
"/home/***/.pspkg/ports/Mk/bsd.port.mk", line 1043: Unknown directive
Unknown modifier 't'
...

うーん、エラー。makeがらみで動かなくなってるみたい。.pspkgのサイズも1GB以上ある。諦める。

highlightの古いバージョンを試す

いつからC++11前提になっているのか。

次のコミットからgcc4.7に移行し、C++11オプションが入った。

その直前のコミットでauto_ptrがunique_ptrへ置き換わっている。

となるとその直前のコミットか?

このバージョンならc++11オプションもunique_ptrもunion内std::stringも使っていない。

というわけで、 1fd00c2 のコミットでビルド。

git clone https://github.com/andre-simon/highlight.git
cd highlight
git checkout --forced 1fd00c2
cd highlight
gmake PREFIX=/highlightインストール先 conf_dir=/highlightインストール先/etc/highlight/ LUA_CFLAGS="-I/luaインストール先/include -I/boost展開先"  LUA_LIBS=/luaインストール先/lib/liblua.a LDFLAGS=
gmake PREFIX=/highlightインストール先 conf_dir=/highlightインストール先/etc/highlight/ LUA_CFLAGS="-I/luaインストール先/include -I/boost展開先"  LUA_LIBS=/luaインストール先/lib/liblua.a LDFLAGS= install

※boostは昔サーバに入れておいたboost_1_39_0を使った。xpressiveを使っているっぽい。インクルードファイルだけ必要なので展開して適当なところに置くだけで良い。

オプション 説明
PREFIX= highlightのインストール先
conf_dir= デフォルトは/etc/highlight固定なので明示的に指定
LUA_CFLAGS= luaの(ついでにboostの)インクルードパスを入れる
LUA_LIBS= luaのライブラリ(.a)ファイル
LDFLAGS= -ldl の指定がエラーになるので

※一部のパス(データ等へのパス)はプログラム内に埋め込まれるので注意。

テーマを選ぶ。

  • /highlightインストール先/bin/highlight -w でテーマ名一覧が出る。
  • 一部のテーマは highlight Theme-Samples にサンプルがある。

Fine-Blueにする。

gitwebのディレクトリに行き、次のコマンドを実行すると highlight.css が生成される。

/highlightインストール先/bin/highlight --print-style -s fine_blue

設定ファイルに次を追加。

$highlight_bin = "/highlightインストール先/bin/highlight";
$feature{'highlight'}{'default'} = [1];
push @stylesheets, "highlight.css";
2018-03-04

分割式泥よけの修理 Honjo H27-700N.Smooth(ジョイントタイプ)

先日後輪に木の枝を巻き込んで派手にひしゃげてしまって以来後ろの泥よけを取り外していたのですが、雨上がりなど路面が濡れていると背中やお尻に水で線が……。

というわけで泥よけを何とかしようと思ったのですが、私の自転車(スポルティーフ)についている泥よけはツーリング車にマッチするHonjoの泥よけ(フェンダー、マッドガード)。700C、細身のタイヤ用、亀甲加工ではないタイプ。これがなかなか売っているところが限られる代物なのですが、インターネットで検索して売っていそうな実店舗へ電話。在庫ありとのことでお店へ出向いて買ってきました。

この Honjo の H27 は通常タイプとジョイントタイプ(分割式泥よけ用)があります。分割式泥よけというのは輪行のために後輪側の泥よけが二つに分割出来るようになるものです。 私の自転車は元々買ったときはH27のジョイントタイプがついていて、数年乗った後にジョイント部分が壊れてお店に持って行ったところ、ジョイントタイプがないので通常タイプを切断して自分で加工して作ってくれと言われたという経緯があります。悪戦苦闘の末、最終的にステンレス製のジョイントを自作するに至るのですが、それはまた別の話。 なので通常タイプがあればいいやと思っていたのですが、ダメ元で聞いてみたところ分割式もありました。

購入したジョイントタイプの後ろ側をすでに車体についている前側へ接続してみるとピッタリ! 自作のなんちゃってジョイントとは比べものになりません。さすが本物です。

2018-03-04-honjo-h27-700n-joint-01.jpg 2018-03-04-honjo-h27-700n-joint-02.jpg 2018-03-04-honjo-h27-700n-joint-03.jpg 2018-03-04-honjo-h27-700n-joint-04.jpg 2018-03-04-honjo-h27-700n-joint-05.jpg 2018-03-04-honjo-h27-700n-joint-06.jpg 2018-03-04-honjo-h27-700n-joint-07.jpg 2018-03-04-honjo-h27-700n-joint-08.jpg 2018-03-04-honjo-h27-700n-joint-09.jpg 2018-03-04-honjo-h27-700n-joint-10.jpg 2018-03-04-honjo-h27-700n-joint-11.jpg 2018-03-04-honjo-h27-700n-joint-12.jpg 2018-03-04-honjo-h27-700n-joint-13.jpg 2018-03-04-honjo-h27-700n-joint-14.jpg 2018-03-04-honjo-h27-700n-joint-15.jpg

2018-01-22

2018冬の新番組

今期は今のところゆるキャン△ラーメン大好き小泉さんあたりがお気に入りです。宇宙よりも遠い場所も目を引きましたが今後の展開次第でしょうか。

1話印象 開始日時 チャネル タイトル
01/01(月) 20:00~ TOKYO MX アイドリッシュセブン
○+ 01/02(火) 23:00~ TOKYO MX 宇宙よりも遠い場所
01/04(木) 17:59~ TOKYO MX みっちりねこ(※月~金の帯放送)
○+ 01/04(木) 22:00~ TOKYO MX ラーメン大好き小泉さん
01/04(木) 23:30~ TOKYO MX ゆるキャン△
01/05(金) 21:54~ TOKYO MX 働くお兄さん!
01/05(金) 24:00~ TOKYO MX グランクレスト戦記
× 01/05(金) 25:05~ TOKYO MX 刀使ノ巫女
01/05(金) ~ Netflix DEVILMAN crybaby
01/06(土) 06:30~ TBS系 七つの大罪 戒めの復活
01/06(土) 07:00~ TBS系 新幹線変形ロボ シンカリオン THE ANIMATION
01/06(土) 09:30~ テレビ東京系 ポチっと発明 ピカちんキット
× 01/06(土) 22:00~ TOKYO MX サンリオ男子
× 01/06(土) 24:30~ TOKYO MX スロウスタート
× 01/06(土) 25:00~ TOKYO MX ポプテピピック
01/07(日) 07:30~ BSプレミアム カードキャプターさくら クリアカード編
01/07(日) 22:00~ TOKYO MX 伊藤潤二『コレクション』
× 01/07(日) 23:00~ TOKYO MX 学園ベビーシッターズ
01/07(日) 23:30~ TOKYO MX citrus(シトラス)
01/07(日) 24:00~ TOKYO MX 続 刀剣乱舞-花丸- (第2期)
01/07(日) 24:30~ TOKYO MX 刻刻
× 01/07(日) 25:00~ TOKYO MX 25歳の女子高生
01/07(日) 25:35~ TOKYO MX 三ツ星カラーズ
01/07(日) 25:35~ テレビ東京 銀魂 銀ノ魂篇
× 01/08(月) 23:00~ TOKYO MX からかい上手の高木さん
× 01/08(月) 24:00~ TOKYO MX バジリスク ~桜花忍法帖~
01/08(月) 24:30~ TOKYO MX りゅうおうのおしごと!
× 01/08(月) 25:05~ TOKYO MX まめねこ
× 01/08(月) 25:10~ TOKYO MX gdメン
01/08(月) 26:05~ テレビ東京 弱虫ペダル -GLORY LINE- (第4期)
01/09(火) 12:00~ dTV d松さん(仮)※おそ松さん オリジナルショートアニメ
01/09(火) 17:20~ NHK Eテレ うちのウッチョパス
01/09(火) 21:54~ TOKYO MX 怪獣娘~ウルトラ怪獣擬人化計画~ 第2期
01/09(火) 24:30~ TOKYO MX オーバーロードⅡ
01/09(火) 25:40~ TOKYO MX 一人之下2 the outcast 羅天大ショウ篇
01/09(火) 25:59~ 日本テレビ ちはやふる 秀歌撰
01/10(水) 22:30~ TOKYO MX ダメプリ ANIME CARAVAN
01/10(水) 23:30~ とちぎテレビ サクラノチカイ ~まろに☆え~る 東の飛鳥下野市をえーる!~
01/10(水) 24:00~ TOKYO MX ヴァイオレット・エヴァーガーデン
× 01/11(木) 22:30~ TOKYO MX メルヘン・メドヘン
× 01/11(木) 24:00~ TOKYO MX デスマーチからはじまる異世界狂想曲
01/11(木) 24:55~ フジテレビ 恋は雨上がりのように
01/11(木) 25:58~ TBS ミイラの飼い方
01/11(木) 26:28~ TBS だがしかし2
01/11(木) 26:43~ TBS たくのみ。
× 01/12(金) 22:00~ TOKYO MX 覇穹 封神演義
01/12(金) 22:30~ TOKYO MX ハクメイとミコチ
01/12(金) 24:30~ TOKYO MX 博多豚骨ラーメンズ
01/12(金) 25:55~ TBS BEATLESS
01/12(金) 26:40~ TBS キリングバイツ
01/13(土) 21:00~ TOKYO MX 銀の墓守り(ガーディアン) 第2期
× 01/13(土) 23:30~ TOKYO MX ダーリン・イン・ザ・フランキス
01/16(火) 25:35~ テレビ東京 斉木楠雄のΨ難 第2期
01/20(土) 他配信サイト多数 トミカハイパーレスキュー ドライブヘッド~機動救急警察~ 新シリーズ
01/27(土) 24:00~ TOKYO MX Fate EXTRA Last Encore
01/29(月) ~ YouTube 七つの美徳

ゆるキャン△良いですね。山に行きたくなっちゃいます。まぁ、冬のキャンプ場で本を読みたいとは思いませんけど。 中学生の頃にテントと寝袋を自転車に積んで友だちと出かけたことがあります。そのうち一回は目的地のキャンプ場で私が怪我をして救急車で麓の病院へ送られてあえなく中断したわけですが、まぁ、それは良いとして……。 大人になってからは一緒に行ってくれる人も居ませんし何より体力も気力もありません。 最近は公共交通機関で気軽に行ける山に登ったり、せいぜい山小屋に泊まるくらいです。 そういう所に行くとキャンプしている人も見かけるので自分もやってみたいなーと思います。 でもテント泊の登山なんてやったことありませんし、重い荷物を持って長時間歩けるものなのでしょうか。 場所によってはテントの貸し出しをやっているらしいですが。 涸沢カールなんて一度行ってみたいです。