RedmineのMarkdownで画像サイズを指定できるようにした

こんにちは、Sayahamittです。

研究室のwikiとしてRedmineを使い始めたはいいものの、wikiでMarkdown記法を使うようにすると、記事中に掲載する画像サイズを指定できないという問題に行き当たりました。
wikiに掲載する画像をいちいち画像編集ソフトでリサイズするのは億劫なので、Redmineのソースコードに手を加えて対応しました。

以下の手順でRedmineのwikiでMarkdown記法でも画像サイズを指定できるようになります。

1. Redimineのルートディレクトリを調べる(私の環境では”/var/lib/redmine/lib/redmine/”)

2. redmine/lib/redmine/wiki_formatting/markdown/formatter.rb 内、HTMLクラス内、imageメソッドを以下のように編集する。

    def image(link, title, alt_text)
      return unless uri_with_safe_scheme?(link)
      if link =~ /^(.+?)\s*=+(\d+)(?:px|)$/
        # e.g. ![alt](url.png =100px)
        # e.g. ![alt](url.png =100)
        %(<img src="#{$1}" style="max-width: #{$2}px" alt="#{alt_text}">)
      elsif link =~ /^(.+?)\s*=+(\d+)(?:px|)x(\d+)(?:px|)$/
        # e.g. ![alt](url.png =30x50)
        %(<img src="#{$1}" style="max-width: #{$2}px; max-height: #{$3}px;" alt="#{alt_text}">)
      else
        %(<img src="#{link}" title="#{title}" alt="#{alt_text}">)
      end
    end

3.redmine/tmp に restart.txt を作成し、ブラウザでRedmineにアクセス (Redmine再起動)

 

以上の手順を実行すると、以下のMarkdown記法で画像サイズを指定できます

!(タイトル)[画像ファイル名(uri) =横幅]
!(タイトル)[画像ファイル名(uri) =横幅px]
!(タイトル)[画像ファイル名(uri) =横幅x縦幅]
!(タイトル)[画像ファイル名(uri) =横幅pxx縦幅px]

上記のrubyコードは以下に示すredcarpetのGithubに建てられているissueスレッドを参照しました。適用先となるRedmineの当該ファイルのGithubページも列挙しておきます。
redcarpet issue 487 “Image resizing”
Redmine “lib/redmine/wiki_formatting/markdown/formatter.rb”

 

GitLabのwikiでMathjaxを利用する方法

こんにちは、Sayahamittです。

 

GithubのようなGitのリモートリポジトリサーバーを構築するためのアプリケーションの一つに、GitLabがあります。

これは非常によく出来ていて、使いやすいのですが、markdownで記述したページの中でmathjaxが使えるともっと良いですよね。 (デフォルトではできません。)

 

Google先生に聞くとこのページ( Integrate Mathjax with Gitlab ) がヒットし、この通りに設定すると確かにmathjaxが使えるようになります。

しかし、少なくとも GitLab version 8.15.2 ではハット記号 ” ^ ” をmarkdownファイル中に記述すると、それはmathjax中のlatexとしては認識されず、superscriptとしてレンダリングされてしまいます。

source

On CentOS 7.1

えねるぎぃは... $ E = mc^2 $ だよ

$$
\frac{\pi}{2} =
\left( \int_{0}^{\infty} \frac{\sin x}{\sqrt{x}} dx \right)^2 =
\sum_{k=0}^{\infty} \frac{(2k)!}{2^{2k}(k!)^2} \frac{1}{2k+1} =
\prod_{k=1}^{\infty} \frac{4k^2}{4k^2 - 1}
$$

#### ハット記号なしの場合は上手くいきます。

$$
\partial_t \int_{\Omega} \mathbf{q} d \Omega =
\int_{\partial \Omega} \mathbf{f} (
\mathbf{q}) \cdot \mathbf{n}d \partial
\Omega - \int_{\Omega} hg \nabla z_b
$$


faild

ハット記号がsuperscriptとしてレンダリングされmathjaxのレンダリングを邪魔している

そこで、GitLab側でmarkdownレンダリングを行う際にsuperscriptを無効にする設定をする必要があります。
上の記事で紹介されている手順に加えて以下を行ってください。

 

手順

  • パスの読み替え
    上記事では/home以下にgitlabがあると書いてあるが、aptやyumでインストールした場合は/opt以下のrailsのディレクトリに格納される。Gitlab 8.12.3-ce を CentOS7 にyum でインストールした場合のパスは以下の通り。(Debian や Ubuntu でも同様の模様)
    /opt/gitlab/embedded/service/gitlab-rails
  • Integrate Mathjax with Gitlab に書いてある手順の実行
  • superscriptの無効化
    /opt/gitlab/embedded/service/gitlab-rails/lib/banzai/filter/markdown_filter.rb
    の 31 行目
    superscript:         true,

    superscript:         false,
    に書き換える。
  • シェルコマンドでGitLabの再起動
    $ sudo gitlab-ctl restart

以上でひとまずGitLabのwikiでmathjaxによる数式表示が可能になります。

 

また、Mathjaxの設定を行いたい場合は、app/views/layaout/_mathjax.haml.html の中に記述する JavaScript の即時関数の中でdocument.createElement()を利用して<script type=’text/x-mathjax-config’>エレメントを挿入します。

 

例えば、ブロック表示時に左寄せ&インデントを行い、インライン表示の記号を’$’にする設定を追加した _mathjax.haml.htmlは以下のようになります。

:javascript
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

    var gb = document.createElement('script');
    gb.type = 'text/x-mathjax-config';
    gb.async = true;
    gb.text = ('MathJax.Hub.Config({displayAlign: "left", displayIndent: "2em", tex2jax: {inlineMath: [ [\'$\',\'$\'] ]} } )');
    var t = document.getElementsByTagName('script')[0]; t.parentNode.insertBefore(gb, t);
  })();

以上の設定を行うと、上で示したソースが以下のようにレンダリングされます。

success

 

これで、Gitlabのweb上で好きなようにMathjaxが使えるようになりました。めでたしめでたし。

 

追記
どうやらgitlabのページ読み込みの仕様で、webページ上のボタンをクリックして画面遷移するとmathjax.jsが読み込まれないようです。
ひとまずはページを再読込することでMathjaxが有効になりますが、現在解決策を模索中です。

ThinkPad X250 をポチった

こんにちは、Sayahamittです。

 

この前まで9月だったのにもう11月ですか、大学も3回生となり、研究室に配属されてから半年経ったというのに、まだ何も分からないズブの素人同然で、ただ焦りが募るばかりの日々です。

 

さて、私はモバイルノートパソコンとしてMacBookPro Retina 13inch の2012年後期モデルを愛用しているのですが、MBPを使用している上で発生してきた種々の事情からもう一台ノートパソコンを購入することとしました。

種々の事情とは…

続きを読む

【Samba】共有フォルダの中に特定のアカウントのみ変更可能なフォルダを作る

こんにちは、Sayahamittです。

CentOS7 と Samba4 を利用して研究室用のファイルサーバーを作ったのですが、ちょっと変なアクセス制御をやったのでメモメモφ(..)

やりたかったこと

研究室のファイルサーバーに、メンバー各々の個別フォルダが欲しい

そのフォルダの内容は所有者のみが変更でき、かつ、全員がすべてのフォルダの中身を閲覧出来るようにしたい。

さらには、個々人のフォルダは各ユーザー自身や、他のユーザーによって消去されないようにしたいわけです。

 

研究室で共有するファイルサーバーに個々人のプライバシーが高いレベルで確保される領域を作りたくなかったので、このような構成を試そうと考えました。

 

フォルダ構成
Personal	
  +--Bob
  |    +--fileA
  |
  +--Alice
       +--fileB

具体的には、上の囲みの中に示したような共有フォルダが有ったときに、

BobはfileAを削除できますが、fileBや、フォルダAlice、フォルダBobを削除できない。

AliceはfileBを削除できますが、fileAや、フォルダBob、フォルダAliceを削除できない。

という状態にしたいのです。

続きを読む

C++で拡張ユークリッド互除法

こんにちは、Sayahamittです。

 

だいぶご無沙汰してしまいましたが久々のブログ更新です。

 

2つの整数の最大公約数を高速に求められるユークリッド互除法をなんとなく実装してみました。

意味は…ないです…w

もしかしたらそのうち簡単なRSA暗号とかもやってみるかも。

 

テクニカルなコーディングはできないので、教科書に書いてあったアルゴリズムをそのままクラスとして実装しました。

続きを読む

Java 標準入力待ちでスレッドをブロックさせない方法

こんにちはSayahamittです。

 

Javaでマルチスレッドなコードを書いている時に、あるスレッドでユーザーから標準入力待ちをする必要がありました。さらに、そのスレッドは他のスレッドと連動していて、他方のスレッドが終了したらそのスレッドも即座にかつ自動的に終了しなければなりません。

 

ご多分に漏れず僕はソッコーで躓きました。二日間も。

 

問題になったのはSystem.inを読むBufferdReaderでreadline()を行うと標準入力待ちになり、ユーザーがEnterキーを押してくれるまでそのスレッドの終了はおろか、interrupt()も出来ないことです。

しかし、僕が想像もしなかったスマートな解決策がありました。

続きを読む

UTF8なstring入れたらShiftJISなstring出てくる関数作った

こんにちは、Sayahamittです。

 

Macで書いていたC++コードをWindows VC++に持ってきたら文字コードでハマったのでメモしておきます。

 

今回は引数にUTF8エンコードのstd::string型文字列を取り、ShiftJISエンコードのstd::string文字列を返す関数と、その逆をやる関数を作りました。

バリバリのWindows API依存コードです。ごめんなさいm(__)m

 

Windowsでは内部的な処理にはUnicodeが使われているにも関わらず、コンソールにおける入出力を始めAPIなど、ユーザーとのインターフェースには未だにShift-JISが使われているようで、UTF8など多バイト文字を直接利用出来ません。

WindowsAPIなんて殆ど触ったことがない自分も、もれなくこの問題に引っかかりました。

Win API を利用する場合にはMultiByteToWideCharメソッドとWideCharToMultiByteメソッドを用いてUTF8とShiftJISの相互変換が実現できるようです。

続きを読む

C言語で逆ポーランド記法電卓を作った

こんにちはSayahamittです。

さて今回はC言語で逆ポーランド記法(スペース区切り)電卓を作ってみました。

文字列の動的確保とか、リストでスタックを実装したりとかしたので備忘録として残しておこうと思います。

(…Twitterクライアント?…(やってますよ…OOPとC++難しい…))

 

仕様っぽいもの

今回作った電卓では、四則演算が逆ポーランド記法(スペース区切り)によって書かれた数式を文字列入力として受け取り、スタックを利用して計算することにしました。和差積商以外の演算や関数はエラーを返すこととします。

また、入力桁数に制限があるとつまらないので、mallocを使って文字配列を動的確保し、

それに伴いスタックも双方向リストを用いて動的に伸縮できるように実装することとしました。

動的確保のアルゴリズムは、文字列を伸ばす場合には容量が増えた後の全体を格納するのに必要なメモリを丸々全部確保し直すものとしました。

続きを読む

Xcodeで黒背景を使う場合にカーソルを目立たせる方法

こんにちはSayahamittです。

今回もつまらない備忘録…

 

私はXcodeのエディタを黒背景にするため”midnight”テーマを使っているのですが、これだとマウスカーソルが極端に見えづらくなっていまいます。

しかし、ググったら、それを一発で解決する方法を知ることが出来ました。

私が行き着いたのはこのページ Better Xcode ibeam cursor

名前そのまんまですねw

続きを読む

WiresharkのInterface ListにNICが表示されない場合

UbuntuにWiresharkをインストールしたはいいものの、root以外ではネットワークインターフェイスを参照してくれませんでした。これはLinuxのパーミッションの挙動として正常であるようですが、Wiresharkを起動するのにわざわざ端末からsudoするのはメンドクサイ…(´・ω・`)

 

調べてみると、パケットキャプチャの為にネットワークインターフェイスを利用するプログラムの本体は/usr/bin/dumpcapで、こいつにネットワーク系のケーパビリティを与えれば上手く行くそうです。

 

忘れそうなのでメモメモ…φ(..)

続きを読む