現在開いてるファイルのディレクトリをロードパスに追加する

特定の開いてるファイルのディレクトリをロードパスに追加する場合は以下のようにやる。

  1. M+: *1キーバインドを押す
  2. ミニバッファにから以下の式を実行する
(add-to-list 'load-path default-directory)

f.elを使う場合はこんな感じ。

(add-to-list 'load-path (f-parent (f-this-file)))

こんなことしようかと思った理由は、なんだかバグってる拡張の調査をしようと思ったから。 emacs -Qで開いて特定の拡張だけ読み込むようにするため、ロードパスに追加したかった。

もっといい方法があるかな?

*1:eval-expression: ミニバッファからLisp式を読み込み,それを評価し,ミニバッファに結果を表示する

LaravelのHomesteadが使えなかった

LaravelのHomesteadというboxを追加しようとしたところなぜか404エラーになった。

⋊> ~/.v/boxes vagrant box add laravel/homestead
The box 'laravel/homestead' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/laravel/homestead"]
Error: The requested URL returned error: 404 Not Found

検索して下のリンクに行き着いて中身を読んだけれど、どうも自分の場合と事例が違った。

The box 'laravel/homestead' could not be found or could not be accessed in the remote catalog. If this is a private box on HashiCorp's Atlas · Issue #819 · laravel/homestead · GitHub There was a problem while downloading the metadata for your box · Issue #807 · laravel/homestead · GitHub

そういえばVagrantのバージョンはどうなっているか確認してみる。

⋊> ~/ vagrant --version
Vagrant 1.9.5

Vagrantの本家サイトは2.0.3になっていたのでアップグレードしてみるとエラーが解消された。

⋊> ~/ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice:

Please Upgrade的なことをエラー文に書かれてるともっとすぐに解消できてたのだけどしょうがない。

kublerの404 Not Found エラーを回避する(Mac)

解決方法

Macだとsedの互換性の問題でrオプションが使えないのでまずgnu-sedを入れる。

$ brew install gnu-sed

lib/cmd/update.shの、rオプションを使っている部分をgsedに書き換える。

$ cd kubler
$ nano lib/cmd/update.sh

-                        sed -r -i s/^STAGE3_DATE=\(\"\|\'\)?[0-9]*\(\"\|\'\)?/STAGE3_DATE=\'"${s3date_remote}"\'/g \
+                        gsed -r -i s/^STAGE3_DATE=\(\"\|\'\)?[0-9]*\(\"\|\'\)?/STAGE3_DATE=\'"${s3date_remote}"\'/g \

kublerの使用するGentoo stage3イメージ?をアップデートする。

./kubler.sh update

cleanしてビルドする。

./kubler.sh clean
./kubler.sh build -c kubler/glibc

経緯

kubler(旧:gentoo-bb)というものを使うとdockerのコンテナサイズを小さく作れるというのを聞いて試して見るとERROR 404: Not Found が出て進まなくなった。

> $ ./kubler.sh build kubler/glibc
*** generate build order
--> required engines:    docker
--> required stage3:     stage3-amd64-hardened+nomultilib stage3-amd64-musl-hardened
--> required builders:   kubler/bob kubler/bob-musl
--> build sequence:      kubler/busybox kubler/glibc
*** gogo!
--2017-05-14 01:12:00--  http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64-hardened+nomultilib/stage3-amd64-hardened+nomultilib-20170420.tar.bz2
Resolving distfiles.gentoo.org... 64.50.236.52, 140.211.166.134, 137.226.34.46, ...
Connecting to distfiles.gentoo.org|64.50.236.52|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2017-05-14 01:12:01 ERROR 404: Not Found.

*** Got a 404 for stage3-amd64-hardened+nomultilib-20170420.tar.bz2, try running the update command to resolve this.
fatal: Aborted download of /Users/pogin/workspace/kubler/tmp/downloads/stage3-amd64-hardened+nomultilib-20170420.tar.bz2

set -xをkubler.shに入れて調べたけど結局よくわからなかった。

なので、公式のREADME.mdを見直してみると

$ kubler.sh update

というものがあったので、これを実行するとtagをアップデートしてくるっぽいので実行してみる。

$ ./kubler.sh update
*** sync portage container
Warning, skipped sync. Couldn't find a builder image to work with, tried "kubler/bob"
*** check for stage3 updates
dummy/
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
--> bob/                 updated 20170420 -> 20170504 - stage3-amd64-hardened+nomultilib
kubler/
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
--> bob-musl/            updated 20170404 -> 20170509 - stage3-amd64-musl-hardened
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
--> bob-uclibc/          updated 20170405 -> 20170430 - stage3-amd64-uclibc-hardened
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
--> bob/                 updated 20170420 -> 20170504 - stage3-amd64-hardened+nomultilib

Found updates for 1 stage3 file(s), to rebuild run:

    kubler.sh clean
    kubler.sh build -c some_namespace

このままkubler.sh clean; kubler.sh build kubler/glibcとしても同じように404 Not Foundが出て全然アップデートしてくれない...。

どうもMacsedではrオプションを受け付けない様子。

sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

以下のissueを見てみるとgnu-sedを入れて書き換えれば動くというらしいので入れてみる。
OS X Yosemite “sed: illegal option -- r” fatal error · Issue #1526 · fabric/fabric

$ brew install gnu-sed

該当しそうな箇所をagで探す。

$ ag sed
lib/cmd/update.sh
24:                        sed -r -i s/^STAGE3_DATE=\(\"\|\'\)?[0-9]*\(\"\|\'\)?/STAGE3_DATE=\'"${s3date_remote}"\'/g \

何かしらのエディタで修正する。

$ nano lib/cmd/update.sh
-                        sed -r -i s/^STAGE3_DATE=\(\"\|\'\)?[0-9]*\(\"\|\'\)?/STAGE3_DATE=\'"${s3date_remote}"\'/g \
+                        gsed -r -i s/^STAGE3_DATE=\(\"\|\'\)?[0-9]*\(\"\|\'\)?/STAGE3_DATE=\'"${s3date_remote}"\'/g \

もう一度updateコマンドを実行してみる。

$ ./kubler.sh update
*** sync portage container
Warning, skipped sync. Couldn't find a builder image to work with, tried "kubler/bob"
*** check for stage3 updates
dummy/
--> bob/                 updated 20170420 -> 20170504 - stage3-amd64-hardened+nomultilib
kubler/
--> bob-musl/            updated 20170404 -> 20170509 - stage3-amd64-musl-hardened
--> bob-uclibc/          updated 20170405 -> 20170430 - stage3-amd64-uclibc-hardened
--> bob/                 updated 20170420 -> 20170504 - stage3-amd64-hardened+nomultilib

Found updates for 1 stage3 file(s), to rebuild run:

    ./kubler.sh clean
    ./kubler.sh build -c some_namespace

指示に従ってclean,buildを実行してみる。

$ ./kubler.sh clean
--> remove build artifacts
rootfs.tar files
generated Dockerfiles
PACKAGES.md files
find: -delete: forbidden when symlinks are followed

find: -delete: forbidden when symlinks are followed
なんか不穏なメッセージが出てるがとりあえず次に進む。

$ ./kubler.sh build kubler/glibc
*** generate build order
--> required engines:    docker
--> required stage3:     stage3-amd64-hardened+nomultilib stage3-amd64-musl-hardened
--> required builders:   kubler/bob kubler/bob-musl
--> build sequence:      kubler/busybox kubler/glibc
*** gogo!
--> build image kubler/bob-core
--> phase 2: build kubler/bob-core:20170423
Sending build context to Docker daemon 40.45 kB
Step 1/10 : FROM kubler-gentoo/stage3-amd64-hardened-nomultilib
 ---> e0a88dbeb066
Step 2/10 : LABEL maintainer Erik Dannenberg <erik.dannenberg@xtrade-gmbh.de>
 ---> Using cache
 ---> 3df1f3912ff9
.....

やっとこさ動きました。

終わりに

久々のブログだったので大変だった。
できればPull Requestとかまで行きたいけどどこを書き直そうか。

新しいMagitにしたら動かなくなった

こんなエラーが出た。

Error (magit): git-commit-mode has to be removed

Magit is no longer compatible with the library `git-commit-mode',
which was used in earlier releases.  Please remove it, so that
Magit can use the successor `git-commit' without the obsolete
library getting in the way.  Then restart Emacs.

Error (magit): git-rebase-mode has to be removed

Magit is no longer compatible with the library `git-rebase-mode',
which was used in earlier releases.  Please remove it, so that
Magit can use the successor `git-rebase' without the obsolete
library getting in the way.  Then restart Emacs.

git-commit-mode, git-rebase-modeは最近のMagitだと互換性がないから削除してくださいとのこと。

magitに関連するパッケージが古いことが原因らしい。

対処法としては、

  1. M-x list-package をする
  2. magitに関連しそうなパッケージをキーボードの"d"で選択する。
    この場合git-commit-mode、git-rebase-modeを削除する。
  3. キーボードの"x"で削除を実行してパッケージを削除する。
  4. 削除したらまたmagitをインストールする。
  5. Emacsを再起動する。

これでmagitが動くようになるはず。

新しくなったmagitはこちら。

なんかインデントがなくなって違和感がある…。

ちなみに昔のMagitはこちら。

Stashes: が下に来たから見やすくなった。Stashes:はそんな重要な情報じゃないし確かに上になくて良いと思う。Local:が消えて Remote: の情報が少なくなったのはたまに困ることがありそう。

更新履歴

2015/12/29
1. git-commit-mode、git-rebase-modeを削除するように文章を変更。
2. Emacsを再起動する文言を追加

error "GHCi lacks `:complete' support"

haskell-modeでinteractive-modeの補完を使おうとしたら、こんなメッセージが出た。

[Haskell]error "GHCi lacks `:complete' support"

どういうことかというと、GHC 7.6.3じゃ:completeはサポートしていないという話。

Haskell 7.8に上げろとのこと。

Completion error on OS X: GHCi lacks :complete support · Issue #281 · haskell/haskell-mode · GitHub

第6回init.el読書会に参加しました

自分も書いてみようと思ったので書いてみます。自分はあまり指摘ができないので、

  • 気づいたこと
  • 自分が知らなかった技術

などを書こうと思います。

今回はGithubで検索して見つけたdragonwasrobotさんのinit.elを見ました。
dragonwasrobot/dot-emacs

jade.el


dot-emacs-d/modes/jade.el

これはJadeという、Haml, Slim, などと同様のHTMLテンプレートエンジンです。これは閉じタグがないタイプの軽量マークアップ言語のようです。
例はこんな感じ。
HTML

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>最高にクールなホームページ</title>
        <link rel="stylesheet" href="./css/app.css">
    </head>
    <body>
        <h1>最高にクールなホームページ</h1>
        <p>最高にクールなホームページへようこそ。</p>
        <script src="./js/app.js" charset="UTF-8"></script>
    </body>
</html>

JADE

doctype html
html
  head
    meta(charset='UTF-8')
    title 最高にクールなホームページ
    link(rel='stylesheet', href='./css/app.css')
  body
    h1 最高にクールなホームページ
    p 最高にクールなホームページへようこそ。
    script(src='./js/app.js', charset='UTF-8')

だいぶ楽に書けそうなテンプレートエンジンだと思います。

詳しい説明はこちらへ。
https://gist.github.com/japboy/5402844

dot-emacs.el

dot-emacs.el

気づいたこと、知らなかった設定
L67

(set-fringe-mode 4)

これはフリンジと呼ばれる左右にある余白の設定です。(set-fringe-mode 100)とかするとどんなものなのかがわかりやすい。

L68
iswitch-mode は古い。icomplete-modeかido-modeを使うべきらしい

L75
standard-indent は謎。一体なんの設定なのか。

L108

(setq cursor-type 'bar)

cursor-typeという設定がある。Emacsのカーソルを設定することができる。

(add-to-list 'default-frame-alist '(cursor-type . 'box)) ;; ボックス型カーソル
(add-to-list 'default-frame-alist '(cursor-type . 'hbar)) ;; 下線
(add-to-list 'default-frame-alist '(cursor-type . '(bar . 3)) ;; 幅3ポイントの縦棒カーソル

http://th.nao.ac.jp/MEMBER/zenitani/elisp-j.html#cursor

L110
saveplaceが便利そう。saveplaceはファイルを編集して、終了したときのカーソルの位置を覚えておく機能。


increment-number-at-pointというのがあるのを知った
Vimみたいにカーソル下の数字をインクリメントする機能。
dot-emacs.el#L222
IncrementNumber -EmacsWiki-

L199
kill-all-bufferはたまに便利そう。

;; すべてのバッファを削除する
(defun kill-all-buffers ()
  "Kills all emacs buffers."
  (interactive)
  (mapc (lambda (b) (kill-buffer b)) (buffer-list)))

dot-emacs.el#L199

aliases.el

dot-emacs-d/aliases.el
このファイルはEmacsでシェルのようにaliasを作っている

(defalias 'ms 'magit-status)
(defalias 'qrr 'query-replace-regexp)
(defalias 'er 'eval-region)

よく使うコマンドはこんな風に設定するといいみたいです。

coq.el

Coqについては↓へ。
Coqによる証明プログラミング

dot-emacs-d/modes/coq.el
eval-after-loadで(print)していてeval-after-loadが起きたことがわかりやすい

(eval-after-load "coq-mode"
  '(progn
     (print "In eval-after-load coq"))
     ...)

pretty-mode.elというものがある。
https://github.com/akatov/pretty-mode

終わりに

もう気力が続かないのでここで終わります。

init.el読書会は毎週土曜日22:00時、lingrEmacs部屋でやってるので、興味のある方はぜひ参加してみてください。

http://emacs-jp.github.io/reading-init.el/

Jenkinが終了できない場合の対処

Jenkinsを使っていてすんなりシャットダウンができたことが少なく、よく「シャットダウン中です」の状態から進まない。調べても、検索仕方がわるいのかシャットダウンが終わらない系のものが少ない。

なぜJenkinsはうまいことシャットダウンができないのか…。

この記事ではコマンドで強制的に停止、起動をするやり方を書く。

(WindowsLinuxのやり方は随時追加したい)

Macでのやり方

最初にやり方を書いておく。詳しいやり方は後ろの方に書く。

Homebrewの場合
すでにJenkinsが起動しているのなら、ターミナルで、

# jenkinsのジョブ名を見つける
launchctl list | grep jenkins
=> 20522    -    homebrew.mxcl.jenkins

# ジョブの停止
launchctl stop homebrew.mxcl.jenkins

# ジョブの起動
launchctl start homebrew.mxcl.jenkins

これで大丈夫のはず。

load, unloadでやる場合

# 自動起動の無効とJenkinsの停止
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

# 自動起動の有効とJenkinsの起動
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

詳しいやり方

Homebrewの場合

Homebrewからインストールしている場合、brew list jenkinsでどこにどんなファイルがあるかがわかる。

$ brew list jenkins
/usr/local/Cellar/jenkins/1.574/homebrew.mxcl.jenkins.plist
/usr/local/Cellar/jenkins/1.574/libexec* (3 files)

この、homebrew.mxcl.jenkins.plistがJenkinsを実行するための設定ファイルみたいなものである。plistファイルを使用してlaunchdがJenkinsをサービスとして起動している。すでに登録されている場合は

launchctl list | grep jenkins
# => 20522	-	homebrew.mxcl.jenkins

で見つかる。この、homebrew.mxcl.jenkins.plistは

/Library/LaunchAgents/
~/Library/LaunchAgents/

のどっちかに入ってる。ここを参考にした人は~/Library/LaunchAgents/に入ってると思う。

公式サイトのインストーラの場合

公式サイトの.pkgで入れた人は多分org.jenkins-ci.plistが /Library/LaunchDaemons/に入ってると思う。下のコマンドは予想で書いてる。.pkgでインストールされるファイルがorg.jenkins-ci.plistになる。

cd /Library*
sudo find . -type f | grep jenkins 
#=> /Library/LaunchDaemons/org.jenkins-ci.plist

起動、停止コマンド

homebrew.mxcl.jenkins、org.jenkins-ci.plistという名前がわかっていれば停止、起動コマンドが使える。普通にインストールしていればこのコマンドで事足りるはず。

# ジョブの停止
launchctl stop homebrew.mxcl.jenkins

# ジョブの起動
launchctl start homebrew.mxcl.jenkins

こうすることでJenkinsを強制的に再起動させることができる。

load, unloadでやる場合

load, unloadでも停止、起動をすることができる。その場合、どこにファイルがあるかを把握する必要がある。

Jenkinsのplistの場所は、大体ここらへんに入ってるはず。

/Library/LaunchAgents/
/Library/LaunchDaemons/

ここ を参考にした人は
~/Library/LaunchAgents/ に入ってるはず。

自動起動の無効、Jenkinsを起動している場合は停止する
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

自動起動の有効、Jenkinsを起動している場合は起動させる
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

これでJenkinsの強制再起動をすることができる。

まとめるのが意外と大変だったので、今回はここまで。