グレインの備忘録

プログラミング関係とかをつらつらと。

NeoVim+neco-ghcでHaskell自動補完

neco-ghcを使ってHaskellの自動補完を有効にする。

github.com

なお、neco-ghcはneocomplete,deoplete,YCMなどで動く。

インストール

Tomlに追加。

<<dein_lazy.toml>>

[[plugins]]
repo = 'eagletmt/neco-ghc'
on_i = 1

あとはdein#install()で完了。

さらに、ghc-modが必要なので入れておく。(stackも必要)

$ stack install ghc-mod

※clockのビルドでエラーが出た方はこちら↓

grainrigi.hatenablog.com

※終わったら、ちゃんと~/.local/binにパスを通すこと(でないと動かない)

使い方

githubのReadme.mdを見れば早い。

動作はかなり軽快だと思う。

stackのclockのビルドで大ハマリした話

ghc-modを入れようとしたらclockのビルドに失敗してハマったのでメモ。

ビルドエラー

ghc-modのところでclockのビルドに失敗した的なメッセージが出たので単体でビルドした結果がこちら。

[naoki@X58A-UD3R ~/WorkDir/haskell] $ stack install clock
clock-0.7.2: configure
clock-0.7.2: build

--  While building package clock-0.7.2 using:
      /home/naoki/.stack/setup-exe-cache/x86_64-linux-tinfo6-nopie/Cabal-simple_m
PHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack-work/dist/x86_64-linux-tinfo6-nopie/
Cabal-1.24.2.0 build --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1
    Logs have been written to: /home/naoki/.stack/global-project/.stack-work/logs
/clock-0.7.2.log

    Configuring clock-0.7.2...
    Building clock-0.7.2...
    Preprocessing library clock-0.7.2...
    /tmp/stack18925/clock-0.7.2/Clock.hsc:44:0: 警告: "hsc_alignment" が再定義さ
れました
    /tmp/stack18925/clock-0.7.2/In file included from .stack-work/dist/x86_64-lin
ux-tinfo6-nopie/Cabal-1.24.2.0/build/System/Clock_hsc_make.c:1:0:
    /home/naoki/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2
/template-hsc.h:88:0: 備考: ここが以前の宣言がある位置です
     #define hsc_alignment(t...) \

    /usr/bin/ld: .stack-work/dist/x86_64-linux-tinfo6-nopie/Cabal-1.24.2.0/build/
System/Clock_hsc_make.o: relocation R_X86_64_32 against `.rodata' can not be used
 when making a shared object。 -fPIC を付けて再コンパイルしてください。
    /usr/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません
    collect2: エラー: ld はステータス 1 で終了しました
    linking .stack-work/dist/x86_64-linux-tinfo6-nopie/Cabal-1.24.2.0/build/Syste
m/Clock_hsc_make.o failed (exit code 1)
    command was: /usr/bin/gcc .stack-work/dist/x86_64-linux-tinfo6-nopie/Cabal-1.
24.2.0/build/System/Clock_hsc_make.o .stack-work/dist/x86_64-linux-tinfo6-nopie/C
abal-1.24.2.0/build/System/Clock_hsc_utils.o -o .stack-work/dist/x86_64-linux-tin
fo6-nopie/Cabal-1.24.2.0/build/System/Clock_hsc_make -fno-PIE -fno-stack-protecto
r -L/home/naoki/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2
/base-4.9.1.0 -Wl,-R,/home/naoki/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.
0.2/lib/ghc-8.0.2/base-4.9.1.0 -L/home/naoki/.stack/programs/x86_64-linux/ghc-tin
fo6-nopie-8.0.2/lib/ghc-8.0.2/integer-gmp-1.0.0.1 -Wl,-R,/home/naoki/.stack/progr
ams/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/integer-gmp-1.0.0.1 -lgmp -
L/home/naoki/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/gh
c-prim-0.5.0.0 -Wl,-R,/home/naoki/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8
.0.2/lib/ghc-8.0.2/ghc-prim-0.5.0.0 -L/home/naoki/.stack/programs/x86_64-linux/gh
c-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/rts -Wl,-R,/home/naoki/.stack/programs/x86_64-
linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/rts -lm -lrt -ldl -lpthread

全然意味がわからん。

結局

ncursesのレガシパッケージが必要とのこと。(ncurses5-compatible)

github.com

別のところで「ncurses-full入れれば一発やで」と書いてあったので自分はそっちを使った。

またもやエラー

ところが、今度はncurses-fullがうまく入らない。

1[naoki@X58A-UD3R ~/WorkDir/haskell] $ yaourt -S ncurses5-compat-libs

==> AUR から ncurses5-compat-libs の PKGBUILD をダウンロード...
x .SRCINFO
x .gitignore
x PKGBUILD
izznogooood commented on 2017-09-05 19:28
gpg --recv-keys C52048C0C0748FEE227D47A2702353E0F7E48EDB

bhimberg commented on 2017-09-06 11:35
This may help some, please comment/correct if I missed something.

For whatever reason, my .gnupg directory was not quite right. I would get an erro
r:
$ gpg --recv-keys C52048C0C0748FEE227D47A2702353E0F7E48EDB
gpg: keyserver receive failed: Cannot assign requested address

I moved my $HOME/.gnupg directory to .gnupg.bak and ran the following:
dirmngr --debug-level guru

This recreated the .gnupg directory and fixed whatever was causing 'Cannot assign
 requested address'. I think it may be related to useradd or something along thos
e lines: root was able to import keys fine, just not this particular user. Maybe
I missed a step in the installation guide?

elicacio commented on 2017-10-02 17:55
Hello guys,

I was able to install the package following the tip of this link https://forum.ma
njaro.org/t/error-trying-to-install-ncurses/19354/2

run the following command:
gpg --keyserver keys.gnupg.net --recv-keys 702353E0F7E48EDB

after:

yaourt -S ncurses5-compat-libs

zor1984qq commented on 2017-10-23 10:20
Thx it works now.

abdo commented on 2017-10-28 18:33
This packages does not build. The linker fails with a missing symbol. I do not fu
lly understand what happened, but looking at the PKGBUILD in core I managed to fi
x it by adding --with-termlib=tinfo --with-ticlib=tic on the ./configure command
line, and removing the symlink to libtinfo.so.5 (because it already exists) from
package().

ncurses5-compat-libs 6.0+20170902-1  (2017-09-04 06:22)
( サポートがないパッケージ: 潜在的に危険です ! )
==> PKGBUILD を編集しますか ? [Y/n] ("A" で中止)
==> ----------------------------------
==> n

==> ncurses5-compat-libs の依存パッケージ:
 - glibc (既にインストールされています)
 - gcc-libs (既にインストールされています)
 - sh (既にインストールされています)


==> ncurses5-compat-libs のビルドを続行しますか ? [Y/n]
==> ----------------------------------------
==>

==> パッケージのビルドとインストール
==> パッケージを作成: ncurses5-compat-libs 6.0+20170902-1 (2017年 12月  4日 月曜
日 21:23:17 JST)
==> ランタイムの依存関係を確認...
==> ビルドタイムの依存関係を確認...
==> ソースを取得...
  -> ダウンロード ncurses-6.0-20170902.tgz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3244k  100 3244k    0     0   216k      0  0:00:15  0:00:15 --:--:--  125k
  -> ダウンロード ncurses-6.0-20170902.tgz.asc...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   267  100   267    0     0    267      0  0:00:01 --:--:--  0:00:01   575
==> source で md5sums ファイルを検証...
    ncurses-6.0-20170902.tgz ... 成功
    ncurses-6.0-20170902.tgz.asc ... スキップ
==> gpg でソースファイルの署名を検証...
    ncurses-6.0-20170902.tgz ... 失敗 (不明な公開鍵 702353E0F7E48EDB)
==> エラー: PGP 鍵を検証できませんでした!
==> エラー: Makepkg は ncurses5-compat-libs をビルドできませんでした。
==> ncurses5-compat-libs のビルドを再開しますか ? [y/N]
==> ----------------------------------------
==> N

PGP鍵が検証できない」とさ。これはお決まりのパターン。鍵をインポートすればいい。

yaourt で PGP鍵を検証できない場合の対処

[naoki@X58A-UD3R ~] $ gpg --keyserver http://pgp.mit.edu --recv-keys 702353E0F7E48EDB
gpg: 有効なOpenPGPデータが見つかりません。
gpg:           処理数の合計: 0

???

鍵が見つからないということらしい。

最終的に

結論から言うと、鍵サーバーが違った。

aur.archlinux.org

[naoki@X58A-UD3R ~] $ gpg --keyserver keys.gnupg.net --recv-keys 702353E0F7E48EDB

gpg: key 702353E0F7E48EDB: 鍵がないため142個の署名は検査しません
gpg: /home/naoki/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵702353E0F7E48EDB: 公開鍵"Thomas Dickey <dickey@invisible-island.net>"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg:           処理数の合計: 1
gpg:             インポート: 1

アホらしいこと極まりない。

あとはトントン拍子でうまく行った。

$ yaourt -S ncurses-full
$ stack install clock

おわり。

SSHでGitHubに接続する

パスワード認証の問題点

GitコマンドでGitHubにpush/pullするためには何らかの形で認証方法を与えてやる必要がある。

一つはユーザー名とパスワードを入力する方法である。

ところが、これは毎回パスワードを入力する必要があるので面倒臭い。
(一応パスワードを保存することもできるが、平文で保存されるためセキュリティ上全くよろしくない。)

そこでSSHが登場する。

SSH公開鍵暗号通信

SSHを使えば、最初に鍵生成する手間はかかるが、認証情報を入力する必要はない。

また、マシンごとに秘密鍵を作っておけば漏洩時の対処もしやすい。

ちなみに、SSHのデメリットは特にないと思われる。

鍵生成

鍵生成および通信にはopensshが必要なので入れておく。

$ sudo pacman -S openssh

ssh-keygenで鍵生成。

$ ssh-keygen -t rsa

生成場所はデフォルトのままにしておく。
パスフレーズは設定しても構わないが、設定するとpushのたびに入力する必要がある。

生成が完了したら~/.ssh/id_rsa.pubに公開鍵が生成されているはずなので、中身をコピーする。

あとは、GitHubの「Settings」→「SSH and GPG keys」→右上の「New SSH Key」から登録しておしまい。

HTTPSでcloneしたリポジトリSSHに切り替え

GitHubからcloneするときは大抵HTTPSを使うと思うが、このままではSSHでpush/pullできない。

そこで、モードを切り替える。

対象のローカルリポジトリディレクトリに移動して、

$ git remote set-url origin git@github.com:[ユーザー名]/[リポジトリ名].git

とする。これでsshに切り替わる。

ArchLinuxのインストール 2.5.ユーザー作成編

ArchLinuxでユーザーを作るときに少しハマったのでメモ。

ホームディレクトリをちゃんと作ること

ユーザーの正しい作成方法は、

$ sudo useradd -b/home [ユーザー名]
$ sudo passwd [ユーザー名]
$ sudo mkdir /home/[ユーザー名]
$ sudo chown [ユーザー名] /home/[ユーザー名]

である。特に後半の二行がめっちゃ重要。

ホームディレクトリが存在しないとXが設定ファイルを作れないため、GUIのログインに失敗してしまうのである。

xfceの設定をバックアップ(xfpanel-switch)

xfpanel-switchを使うと、xfceの設定を保存できる。

インストール

ArchLinuxだとAURでメンテナンスされている。

$ yaourt -S xfpanel-switch

おわり。

使い方

パネルを右クリックして、「パネル」→「パネルの設定」を開く。

すると、設定画面に「Backup and Restore」というボタンが追加されている。

あとはツールチップを頼りに設定を保存・エクスポートする。

設定の上書きについて

一度保存した設定を上書きしたい場合は、同名で保存すれば良い。

このとき、同名のものが2つで来ているように見えるが、実際は上書きされているので上書き前のものを消そうとしないこと。

(消すと、先ほど上書き保存したものが消されてしまう。)

ArchLinuxにWifiマネージャとブラウザを入れる

以前に構築したArchLinux環境にWifiマネージャ的なものを入れてみる。

マネージャアプレットのインストール

NetworkManagerを入れてなければ、

$ sudo pacman -S networkmanager
$ sudo systemctl enable NetworkManager.service

で入れておく。

入れ終わったら、

$ sudo pacman -S network-manager-applet xfce4-notifyd gnome-keyring

これで終わり。再ログインしたら右上にアイコンが出るはず。

通知の設定

デフォルトだと通知の表示時間が10秒と長いので変更する。

左上の「アプリケーション」→「設定」→「通知」を開き、「Disappear After」を設定する。

f:id:grainrigi:20171202222705p:plain

ブラウザ

ブラウザはChromiumをチョイス。

火狐も使ってみたのだがなんだがうまく動かない模様。(文字が出ない)

$ sudo pacman -S chromium

おわり。

あとはフォントの設定をしておくこと。(デフォルトは英字がなんか変なので)

ArchLinuxのインストール 2.GUI(xfce)&日本語環境構築編

※この記事はArchLinuxのインストール 1.ファイルコピー編の続きです。

今回はGUIを入れていく。 以下のサイトを参考にした。

Arch LinuxにGUIデスクトップ環境を構築する Arch Linuxに日本語環境を構築する

GUI構築

1.グラフィックスドライバのインストール

GPUのメーカーや型番ごとにインストールするパッケージが異なる。

Intel

$ sudo pacman -S xf86-video-intel

AMD (HD7750-7970, R9 240-290)

$ sudo pacman -S xf86-video-amdgpu

AMD(上記以外)

$ sudo  pacman -S xf86-video-ati

nvidia

$ sudo pacman -S nvidia nvidia-utils

2.xserverのインストール

GUIのベースとなるxserverを入れる。

$ sudo pacman -S xorg-server xorg-apps xorg-xinit
$ sudo pacman -S mesa

xserverの動作確認をするには以下のコマンドを打つ。 (確認しなくても構わない。)

$ sudo pacman -S xorg-twm xorg-xclock xterm
$ startx

このあと画面が暗転して、質素なターミナルウィンドウが出れば成功。
マウスを動かせるかも確認しておくこと。
確認できたらexitでターミナルを閉じ、xsystemから抜ける。

※マウスを動かせない場合は、

$ sudo pacman -S xf86-input-synaptics

とすれば解消することがあるらしい。

3.キーコンフィグ

日本語106キーボードのキーマップを使うように設定する。

$ sudo vim /etc/X11/xorg.conf.d/10-keyboard.conf

ファイルが新規作成されるはず。(ディレクトリ名のX11は大文字なので注意。) 以下のように記述する。

Section "InputClass"
    Identifier                "Keyboard Defaults"
    MatchIsKeyboard "yes"
    Option                    "XkbLayout" "jp"
EndSection

4.デスクトップ環境のインストール

今回は軽さの割に使いやすいXfceを使う。

$ sudo pacman -S xfce4

入れたら一度起動テストをしてみる。

$ startxfce4

うまく行ったらLogoutで元に戻ってもいいし、ターミナルを開いて作業してもいい。

5.ディスプレイマネージャーのインストール

Xの自動起動+ログインマネージャみたいな感じ。

$ pacman -S lightdm lightdm-gtk-greeter

自動起動の設定もしておく。

$ sudo systemctl enable lightdm.service

あとは再起動してxfce自動起動することを確認する。


日本語環境構築

0.ロケールの生成

これはarchのインストール時にやっているはず。 自信がない場合は以下の方法で確認・再生成する。

まずは

$ sudo locale-gen

とやってみる。もし「ja_JP.UTF-8」的なのが出なかったら、

$ sudo vim /etc/locale.gen

で開いて、「ja_JP.UTF-8」のある行のコメントアウトを取る。 そして再び

$ sudo locale-gen

で生成完了。

1.ロケールの設定

$ sudo vim /etc/locale.conf

「LANG=なんちゃら」の行があればそれを書き換え、無ければ追加

LANG=ja_JP.UTF-8

2.フォントのインストール

個人的にはIPAexフォントが好きである。

これはAURにあるので、yaourtが必要。
(yaourtの入れ方はArchLinuxのインストール 1.5.yaourtのインストール編を参照のこと。)

$ yaourt -S otf-ipaexfont

yaourtが面倒な人は

$ pacman -S otf-ipafont

で普通のIPAフォントが入る。

フォントの適用が終わったら一旦再起動する。 再起動したら日本語表示に変わっているはずである。

フォントをきれいに表示

一応日本語フォントは表示されるが、少し汚く感じるかもしれない。(特に漢字)
この場合、ヒンティングを無効にすると改善されることがある。

「アプリケーション」→「設定」→「外観」で開いたウィンドウの「フォント」タブで設定できる。

f:id:grainrigi:20171202205745p:plain

ヒンティング:なし とすることで潰れた感じを抑制できる。

3.IMEのインストール

Ubuntuでも標準採用のfcitxとMozc(Google日本語入力)を使う。

$ sudo pacman -S fcitx-im fcitx-configtool fcitx-mozc

さらにIMEの設定をする。

$ vim ~/.xprofile

で開いて、以下の三行を追加。

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=”@im=fcitx”

保存できたら再ログインして、「アプリケーション」→「設定」→「Fcitxの設定」を開く。

左下の「+」ボタンからMozcを追加して完了。


おまけ

外国語フォント

さっき入れたフォントだけでは表示できる言語が限られる。

フォント - ArchWikiに様々なフォントが載っているが、中には相性問題でXがフリーズするものもあるので注意が必要である。

基本的にsymbolaと花園明朝を入れておけば死角はないと思われる。

symbola

$ sudo pacman -S ttf-symbola

花園明朝]

以下からダウンロード。

Hanazono fonts

DLしたら、

$ unzip [zipファイル]
$ sudo cp HanaMin* /usr/share/fonts/TTF/
$ sudo chmod 644 /usr/share/fonts/TTF/HanaMin*
$ sudo fc-cache -vf

として展開&コピーする。 フォントはパーミッションが644でないとうまく動かないので注意する。

なお、fc-cache -vfはフォント情報を更新するコマンドである。