codesearch.codelibs.orgの更新

ソースコード検索のcodesearch.codelibs.orgを地道に更新している感じですが、現在はスター数が多い1000レポジトリくらいを対象にしてインデックスしています。最近、ちょっとレスポンスが悪くなってきていたというのもあり、いろいろと変更を入れたりした。

まず、インデクシングするときのAnalyzerを変更してみたりした。デフォルトのまま使っていたので、englishなstemmingしてたりするのをやめて、ソースコードの検索に合うような感じにちょっと変えてみた。でも、トークンが増えそうな気もするので、もしかしたらレスポンスが落ちて再調整するかも…。

次にトップページがちょっとさみしいので、organizationやrepositoryとかも表示されるようにしたりしてみた。これをするためには、Fess自体の修正も入れたりした。なので、最新のFessではファセットをfess_config.propertiesで指定できるようになっている。

あとは細々とした修正を入れたりした感じではある。GitHubの方に手順をコメントしたので、同じものをローカルに作って試せるようになってきて入ると思う。(クリーンな状態からの構築を試していないから、実際に試すと何かしないと動かない可能性もあるけど…)

Fess 13.4.1をリリースしたら、これもバージョニングしていこうかなとも思っている。

Dockerfileで特定のRUN以降のキャッシュを無効にする

docker buildでキャッシュを使わないようにするときには、–no-cacheをつければ良いけど、開発時にこまめにdocker buildしたいときにベースパッケージのインストールなど、開発に関係ないところはキャッシュを使いたいケースなどがある。なので、特定のRUN以降はキャッシュを無効にするにはどうするのが良いかを考えると、単純にARGで毎回変わるようにしておけばよい。

Dockerfileにはキャッシュを無効にしたい箇所で

ARG CACHEBUST=1
RUN git clone ...

みたいにARGを加えて、docker build時には

$ docker build -t tagname --build-arg CACHEBUST=$(date +%s) .

という感じで、–build-argオプションで日付とかで毎回変わるように値を入れておけばよい。

Code Search for Fess

Fessをソースコードの検索に利用している話もよく聞くのだが、Fessは一般的な全文検索向けに作っているので、ソースコード検索観点だとちょっと物足りない部分も出てくる。というわけで、ソースコード検索に特化した設定にするにはどうするのが良いだろうか?ということで、codesearch.codelibs.orgを作りはじめた。

まだ、しばらくはcodesearch.codelibs.orgの改善ベースで進めていくと思うので、これを各開発サイトに導入とかは難しいのだが、このサイト自体の開発のコードはdocker-codesearchでオープンなので、落ち着いてくればDockerで簡単に立ち上げて利用できるようになるはず…。

という感じで、必要な変更自体も Fessにいろいろと入れ始めているが、Tikaのmimetype判定がおかしい部分があったり、ファセットまわりの性能問題や汎用化など、細々とした課題があるので、地道に修正が必要そうではある。

kindでelasticsearchを動かす

Kubernetes IN Docker(kind)を使えば、helmとかで簡単にk8sにelasticsearchを動かせるかなと思い、試してみる。

elasticsearchのhelmチャートはhelm/stableとelasticの2種類あるが、現時点ではelasticの方は動かなかった…。elasticの方にはexamplesにはkindの例があるのだが、これもダメなので、がんばって調べないと動かせなそうなので、一旦、これは見送って、素直にhelm/stableを試す。

kindやhelmなどの必要なものは入れてある前提で、まずは、kindでk8sのクラスタを作成する。

$ kind create cluster 
 Creating cluster "kind" …
  ✓ Ensuring node image (kindest/node:v1.15.3) 🖼
  ✓ Preparing nodes 📦 
  ✓ Creating kubeadm config 📜 
  ✓ Starting control-plane 🕹️ 
  ✓ Installing CNI 🔌 
  ✓ Installing StorageClass 💾 
 Cluster creation complete. You can now use the cluster with:

 export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
 kubectl cluster-info

という感じでクラスタが簡単にできる。kindでいろいろな設定でクラスタを作ることもできるらしい。何も指定しなければ、kindという名前のクラスタができる。

$ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
$ kubectl cluster-info
 Kubernetes master is running at https://127.0.0.1:36777
 KubeDNS is running at https://127.0.0.1:36777/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

 To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

KUBECONIGを設定すれば、kubectlコマンドが利用できる。あとはhelmを使うので、tillerに権限を付けて初期化しておく。

$ kubectl -n kube-system create serviceaccount tiller
 serviceaccount/tiller created
$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
 clusterrolebinding.rbac.authorization.k8s.io/tiller created
$ helm init --service-account=tiller --wait
 $HELM_HOME has been configured at /home/shinsuke/.helm.

 Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

 Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
 To prevent this, run helm init with the --tiller-tls-verify flag.
 For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

これ以降は普通にhelmでインストールすれば良い。

$ helm install --name my-release stable/elasticsearch
...
 From outside the cluster, run these commands in the same shell:

 export POD_NAME=$(kubectl get pods --namespace default -l "app=elasticsearch,component=client,release=my-release" -o jsonpath="{.items[0].metadata.name}")
 echo "Visit http://127.0.0.1:9200 to use Elasticsearch"
 kubectl port-forward --namespace default $POD_NAME 9200:9200 

という感じで、上記にあるようにkubectl port-forwardを実行すれば、localhost:9200でアクセスして確認することができる。

k8sのクラスタを破棄するには

$ kind delete cluster

とすれば削除できる。

カーネルパッチの当て方

最近、リリースされるたびにカーネルビルドをしている今日この頃だけど、リリースごとのカーネルパッチの当て方のメモ。

カーネルの差分パッチはkernel.orgからダウンロードできるけど、今のソースが5.3.5で5.3.6にしたい場合は、inc.patchからダウンロードして、たとえば、以下のような感じで当てる。

$ git clone https://github.com/marevol/linux-5.3-xps_13_2in1.git
$ cd linux-5.3-xps_13_2in1
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/incr/patch-5.3.5-6.xz
$ xzcat patch-5.3.5-6.xz | patch -p1