z80oolong さんはインスタンス qiitadon.com のユーザーです。アカウントさえ持っていればフォローしたり会話したりできます。 もしお持ちでないなら こちら からサインアップできます。

z80oolong @z80oolong@qiitadon.com

(承前)

## qiitactl のソースコードをビルドする

そして、以下のようにして [qiitactl のソースコード][3]をビルドします。

$ GOPATH=`pwd`/build go get -v github.com/minodisk/qiitactl

最終的に実行ファイルが ./build/bin/qiitactl に生成されます。この実行ファイルが手元の端末で Qiita の記事の取得において正常に動作することを確認しました。

## お断り

当方が golang の経験が全く無いため、以上のソースコードのビルド手法に多くの実行及び認識の漏れや誤りがあるかと思いますが、どうか御了承ください。

## 謝辞

テキストベースの Qiita クライアントである [qiitactl][2] を開発された [minodisk 氏][1]に心より感謝申し上げます。

## 余談

自分の性格からか、どうしても Mastodon の toot を 10 文字以上残して投稿するのはフラストレーションが残るものでした。

(承前)

## go-bindata を導入する

ソースコード中のファイル .goxc.json を実行コードに埋め込むために [go-bindata][4] を導入します。

$ GOPATH=`pwd`/build go get -u -v github.com/jteeuwen/go-bindata/...

## .goxc.json を埋め込むためのコードを生成する

以下のようにして .goxc.json を実行コードに埋め込むためのソースコードを生成します。

$ ./build/bin/go-bindata ./.goxc.json

(続く)

[4]:github.com/jteeuwen/go-bindata

(承前)

## qiitactl のソースコードを入手・展開する

[qiitactl のソースコード][3] を入手して展開します。

$ wget -O qiitactl-0.1.4.tar.gz https://github.com/minodisk/qiitactl/archive/v0.1.4.tar.gz
$ tar -zxvf qiitactl-0.1.4
$ cd qiitactl-0.1.4

## 作業用ディレクトリを作成

[qiitactl のソースコード][3] の展開先に作業用ディレクトリを作成します。

$ mkdir build/src/github.com/minodisk
$ pushd build/src/github.com/minodisk
$ ln -sf ../../../.. qiitactl
$ popd

[3]:github.com/minodisk/qiitactl/a

# qiitactl をソースコードからコンパイルする

## 概要

現在うだうだ中。 Mastodon の toot を markdown 記法で記述してみる。 qiitadon.com では code 記法しかレンダリングされないが、若干ながら雰囲気だけでも伝わると良いかと思って試みてみました。
さて本日は、 golang の経験が無い筆者が、 [minodisk 氏][1]による qiita クライアントである [qiitactl][2] をソースコードからコンパイルした備忘録を記述します。

## go 言語のコンパイラを用意する

最初に、 go 言語のコンパイラを用意します。 linuxbrew を用いて導入します。

$ brew install go

(続く)

[1]:github.com/minodisk
[2]:github.com/minodisk/qiitactl

(承前の追記)
2017/09/24 現在、 [Linuxbrew 公式ページ][1] によると、 Linuxbrew に依存する Debian のパッケージは以下の通りとなっています。

$ sudo apt-get install build-essential curl file git python-setuptools ruby

これに加えて、必要に応じて [thermes 氏による "Linuxbrew のススメ" の投稿][2]にある パッケージを追加で導入した方が良いでしょう。

$ sudo apt-get install build-essential curl git m4 ruby texinfo libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev gettext

[1]:linuxbrew.sh
[2]:qiita.com/thermes/items/926b47

(承前)
即ち、 homebrew/core/krb の Formula ファイルの内容をそのまま評価することによってオリジナルの Krb5 クラスをそのまま定義し、 class Krb5 ... end によって、 krb5 が libressl 環境下でのコンパイルに失敗する不具合の修正を行う差分ファイルを適用するコードを追加します。

これにより、ある Formula ファイルのインストールにおいて、不具合の修正などを行う差分ファイルを適用するコードを追加したい場合、オリジナルの Formula ファイルを修正すること無く、また修正後の Formula ファイルにおいて、差分ファイルが適用できる状況である限り、オリジナルのバージョン等に追従させながらインストールを行うことが出来ます。

参考:
- [Homebrewでサクッとpatchを当てる][1]
- [GitHubのプルリクエストのdiffやpatchをダウンロードする方法][2]

[1]:qiita.com/macoshita/items/2ee3
[2]:qiita.com/hshimo/items/f038ed1

現在うだうだ中。 qiitadon.com を使用して3日目。

Linuxbrew において、 openssl に変えて libresslbrew link --force libressl コマンドにより強制的にリンクさせた環境において、 krb5 のインストールが失敗する問題を回避する為に、自分用の Tap に以下の krb5.rb スクリプトを置いて、 brew install (自分用の Tap 名)/krb を実行する手法が考えられます。
# あまり良い手法とは言えませんが…。

eval (Tap.fetch("homebrew/core").formula_dir/"krb5.rb").read

class Krb5 < Formula
patch do
url "https://github.com/krb5/krb5/pull/607.diff"
sha256 "0ae656cac8436f67dc5e2143ce45541c51491ad5f8c5183e66468ab8b4cff37c"
end
end

ここに、 Dlinfo 構造体は、動的ライブラリ内の関数の逆引き情報を格納する構造体であり、 dli_sname メンバに関数名が格納されます。詳細については、[dlclose, dlerror, dlopen, dlsym のマニュアルページ][1]を御覧下さい。

そして、 dladdr(3) 関数に関数のポインタを示す引数 addrDlinfo 構造体へのポインタ info を渡して呼び出した結果、値 0 が返却されるか、 info.dli_sname に関数名の文字列以外が格納されていれば、関数のポインタは正しくない物であることが判ります。

即ち、 glibc を使用する場合において動的ライブラリ内の関数のポインタが正しいがどうかを確認するには、 dlerror(3) 関数の返り値を判定する手法と上記の手法が必要であることが判ります。

[1]:linuxjm.osdn.jp/html/LDP_man-p

現在うだうだ中。現在自宅にて明日の予定について思案中。

標準 C ライブラリ関数において dlsym(3) 関数で動的ライブラリ内の関数のポインタを取得する時、まれに dlsym(3) 関数の値が誤ったポインタを返却してエラーを返さない現象が起きることがあります。

この時、返却されたポインタを用いて関数を呼び出すと、当然にプロセスが Segmentation Fault を起こす不具合を起こします。

これを防ぐ手法として、 glibc のみに実装されている標準ライブラリ関数の dladdr(3) を用いて関数のポインタから関数名の逆引きを試みる手法が考えられます。

typedef struct {
const char *dli_fname;
void *dli_fbase;
const char *dli_sname;
void *dli_saddr;
} Dl_info;

int dladdr(void *addr, Dl_info *info);

前述投稿の訂正です。環境変数 HOMEBREW_PREFIX の設定に誤りがありました。正しくは下記のとおりです。
お詫びして訂正致します。

export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"

また、 Debian noroot 環境に Linuxbrew を導入する場合、[thermes 氏による "Linuxbrew のススメ" の投稿][1]にある通り、予め Linuxbrew の導入前に下記のパッケージの導入を行っておいて下さい。

$ sudo apt-get install build-essential curl git m4 ruby texinfo libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev gettext

なお、環境変数 LD_LIBRARY_PATH の設定は行わないほうが良いでしょう。

[1]:qiita.com/thermes/items/926b47

前述の様にして、 Debian noroot 環境に Linuxbrew のリポジトリを導入した後は、以下の環境変数を設定して Linuxbrew を使用可能にします。
特に、環境変数 HOMEBREW_NO_AUTO_UPDATE 定義して brew install コマンドにおいて毎回 Linuxbrew のリポジトリの更新を行うのを抑止し、 brew install コマンドが遅くなるのを防ぎます。

export HOMEBREW_PREFIX="/opt/linuxbrew/.linuxbrew"
export PATH="${HOMEBREW_PREFIX}/sbin:${HOMEBREW_PREFIX}/bin:$PATH"
export MANPATH="${HOMEBREW_PREFIX}/share/man:${MANPATH}"
export INFOPATH="${HOMEBREW_PREFIX}/share/info:${INFOPATH}"
export HOMEBREW_NO_AUTO_UPDATE=1

現在うだうだ中。現在自宅にて休息中。 mstdn.jp のアカウントに続き、 qiitadon.jp にもアカウントを取得。
ここでは、技術的事項について呟き程度の最も簡易な短信を投稿する所存です。

さて、 Debian noroot 環境で Linuxbrew を導入すると、 Linuxbrew のリポジトリは必ず /home/linuxbrew/.linuxbrew に作られます。
ディレクトリ /home 等がユーザに対して書き込み可能であるためです。

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install)"
..(略)..
$ ls /home/linuxbrew/.linuxbrew
CHANGELOG.md CONTRIBUTING.md Dockerfile Library _config.yml boot docker.test.yml etc lib opt sbin var
..(略)..