Visual Studio CodeでC/C++プログラムのデバッグをする時gdbが上手く動かない

f:id:norikakip:20160417054848p:plain なんだかブレークポイントで止まってくれない上に画像のようなメッセージが出る。

"warning: GDB: Failed to set controlling terminal: Operation not permitted\n"

色々と検索して当たりましたが簡潔に。

  1. ptrace_scope
    sudo sysctl -w kernel.yama.ptrace_scope=1
    解決せず。ハズレ

  2. gdb -window
    gtkでwindow出してたのでもしかしてと思い。(英語を読む気がない感)
    解決せず。ハズレ

  3. gcc -g
    これでした。
    普通にgdb使う時はデバッグシンボルなくてもブレークポイントで止まってくれるのに……
    おかげで妙にハマってしまいました。

お疲れ様でした。

EclipseでLogcatが消えた時にやったこと

www.adventar.org

24日目の記事です。ジャスト投稿!!!(ジャスト一週間遅刻)
23日目の記事はElixirのドキュメント環境を整える - 302 - あちらですでした(手前味噌)
25日目の記事はwebsearch.vimpr でサービス別コンテンツを即検索 - Qiitaです

EclipseでLogcatが消えた

会社ではEclipseからAndroid Studioへ移行中で[移行前|移行済み]のプロジェクトが混在しているのですが、移行前のものをいじっている時に遭遇したLinuxEclipseを使ってる時にLogcatの画面で何も表示されないという問題を解決したときのメモ

Linux gnome環境 Eclipse Luna

なんとバグを2つ踏んでました。GTKウインドウの描画が正しくないものと、Logcatの設定2つの問題でした。

GTKウインドウの描画設定

eclipse.iniを編集します

--- eclipse.ini.old  2015-12-31 23:46:51.619740843 +0900
+++ eclipse.ini.new   2015-12-31 23:47:02.763073854 +0900
@@ -12,9 +12,12 @@ org.eclipse.platform
 256m
 --launcher.defaultAction
 openFile
+--launcher.GTK_version
+2
 --launcher.appendVmargs
 -vmargs
 -Dosgi.requiredJavaVersion=1.7
--XX:MaxPermSize=256m
--Xms256m
--Xmx1024m
+-XX:MaxPermSize=1024m
+-Xms1024m
+-Xmx4096m
+

メモリ関係のもの適当にいじってますが、大事なのはGTKバージョンの指定です。

launcher.GTL_version
2

この2行を--launcher.appendVmargsの前に入れます。

Logcatの設定

stackoverflow.com

StackOverflowの回答を見て欲しいんですが、workspace内にある設定ファイルをいじります。
この回答の手順が良いと思います。 Application等の値は自分の環境で変わるようですが、僕の場合は正しく動いている現在こんな感じになりました。

logcat.view.colsize.Application=226
logcat.view.colsize.Level=54
logcat.view.colsize.PID=58
logcat.view.colsize.TID=58
logcat.view.colsize.Tag=280
logcat.view.colsize.Text=688
logcat.view.colsize.Time=162

ほんとに値がよくわかりませんがこの2つを設定しなおしてちゃんと動くようになりました。終わりです。

Elixirのドキュメント環境を整える

www.adventar.org

23日目の記事です。
22日は幸せなコンソール - hogeblogでした。
24日は(まだ書いてません)

アドベントカレンダーとはなんだったのか……(スイマセン

Elixirのドキュメント環境を整える

普通に公式のドキュメント見たりIEx使ったりしてもいいんですが、いろいろなライブラリを串刺しで検索したい時にちょっとフベンだったのでメモ

Macにおける串刺しドキュメント検索にはDash.appというアプリがありますが、Linuxでも使えるアプリとしてZealというものがあります。

セットアップするとこんな具合になります

f:id:norikakip:20151231223619p:plain f:id:norikakip:20151231223627p:plain

最高ですね。 ということでやったことのメモを書いていきます。

環境

Zealのインストール

Zeal - Offline Documentation Browser

github.com

githubにインストールの仕方が書いてあります、が僕が使ったコマンドはこれだけでした。

yaourt -S zeal-git

これで入りました(・ัω・ั)
Archlinuxベンリですね

Elixirのドキュメントのダウンロード

Dashで使われているものをそのまま使えるようで、ぽちぽちとチェックマークをつけてDownloadボタンを押すだけでした。 f:id:norikakip:20151231224500p:plain

Phoenixのドキュメントのダウンロード

Dash公式では用意されていないようですが、読み込めるっぽいことが書いてありました。

いやこれじゃ読み込む方法わかんねえ……ということで、適当に検索してたらありました。hex.pmでパッケージが引っかかりました。

github.com

ありがてえありがてえと思いながらas-a-global-archiveの方法でインストールしました。

(Installation & Usageの方法だとコケます。{:ex_doc_dash, "~> 0.2.0", only: :docs}がいけなくて、最新は0.3.0です。)

MIX_ENV=docs mix do deps.get deps.compile docs.dash

これで./docsフォルダ以下にフォルダが作成されるので、それをZealで設定しているフォルダにコピーします。デフォルトでは$HOME/.local/share/Zeal/Zeal/docsetsになっていると思います。

Zealを再起動して読み込めていることを確認できたらOKです。

ただ、なんかスタイルが変

期待していたのはElixirのドキュメントのようなスタイルなんですが、どうやら読み込んでいるstylesheet等がオリジナルのものになっている様子。Dash.appにあわせたのでしょうが、個人的には好きでない感じです。

結局どうしたかというと、Zealで読み込むデータベースはもう作れているようなので、
MIX_ENV=docs mix docsでドキュメントを生成しなおしました(手抜き感

時間ができたらちゃんとforkして綺麗に生成したいなあと思いつつ終了です。

dash.vimってプラギンを見つけたんですが、本当にDash.appにしか対応していないようなのでVimから引くコマンドを後日。

Archlinuxでpyenvを使いつつmatplotlibを動かす

Archlinuxでmatplotlibを使いたい場合、pacmanに用意されたパッケージを利用すれば簡単にグラフが出せます。たぶん。

ただそれを自分で入れたpyenvの環境でやりたかったがためのメモ

なぜmatplotlib

今回はO'Reilly Japan - 実践 機械学習システムの環境を整えました。

まずは本の内容通りにコードを書いて表示しよう!と思ったのですがまったく結果が表示されない。
原因がわからない。 GUIに利用できるライブラリがないんじゃないかこれと思い、とりあえずQtバインディングのライブラリを入れました。

Pythonとmatplotlib

matplotlibPythonで利用可能なプロットツールです。 プロットツールということで、プロットしたものを表示するGUI環境が必要です。 今回はQtを利用することにし、QtとPythonについて調べました。

PythonとQt

QtはC++から利用なGUIフレームワークです。
(これでキュートと読むらしい。今までキューティーと読んでた…)
C++から利用可能なものをPythonで利用するということは、つまりバインディングされているわけで、
よくあるパターンですが、Qtを使うための複数のライブラリが存在しています。

代表的な2つとして挙げられるのが

のようです(要出典)

PyQt

PyQtpipでインストールできません そしてライセンスがGPLです(商用ライセンスもある)。
ちょっと使いづらいですね。

ただ、現状Qt5を利用できるのはPyQtだけのようです(PyQt5)
Qt5をつかうため+後述の理由があったため、今回はPyQt5を入れました。
Qt5使う理由は特になくて新しい物使っとこうかな程度です。

PySide

PySideはpipでインストールできます
そしてライセンスがLGPLです。PyQtよりも使いやすいですね。

今回PyQtを使うに至った大きな理由は、PySideがまだPython3.5で利用できなかったためです。
Python詳しくないですがなんとなく新しい物使いたい病なので苦労しながらPyQt入れました。

導入する

2つのライブラリ(SIP、PyQt5)をダウンロード、コンパイル、インストールします。

SIPPythonから簡単にC++ライブラリを使えるようにするライブラリ(Riverbank | Software | SIP | What is SIP?) で、PyQtが依存しています。
なのでSIPから先にインストールします。

wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.17/sip-4.17.tar.gz
tar zxf sip-4.17.tar.gz
cd sip-4.17
python3 configure.py
make
make install

SIPはすんなり入るはずです。次にPyQtを入れましょう。 事前にpacmanyaourtを使ってqt5-baseパッケージをインストールしておいてください。

wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/PyQt-gpl-5.5.1.tar.gz
tar zxf PyQt-gpl-5.5.1.tar.gz
cd PyQt-gpl-5.5.1
python3 configure.py
make
sudo make install

どうやら共有ライブラリをシステム領域に入れるらしく、sudoがないとインストールできません。 (インストール場所指定しておけばよかったなと後で思いました)

これでライブラリの導入は完了です。

設定ファイル

ライブラリは入ったはずなのに相変わらずmatplotlibでplotができず、しばらくうんうん唸ってました。 どうやら、matplotlib用のconfigファイルがあるらしいです。

import matplotlib
matplotlib.matplotlib_fname()

で現在読み込まれているconfigファイルの場所がわかります。

$HOME/.config/matplotlibに設定ファイルを置くと読んでくれるらしいので、最初に読み込まれていたconfigファイルを複製して$HOME/.config/matplotlib/matplotlibrcとして読み込ませ、その内容を一部書き換えました。

書き換えた場所

--- $HOME/.pyenv/versions/3.5.0/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc 2015-12-13 18:54:09.000000000 +0900
+++ $HOME/.config/matplotlib/matplotlibrc   2015-12-14 07:46:21.760050011 +0900
@@ -35,7 +35,7 @@
 # You can also deploy your own backend outside of matplotlib by
 # referring to the module name (which must be in the PYTHONPATH) as
 # 'module://my_backend'.
-backend      : agg
+backend      : Qt5Agg
 
 # If you are using the Qt4Agg backend, you can choose here
 # to use the PyQt4 bindings or the newer PySide bindings to

これで無事plotできるようになりました。 最後のconfigファイル書き換えるだけで最初からQt以外使って描画できてた気がする。

入れててよかったVimプラギンとか設定とか

この記事はCPS Lab Advent Calendar 2015 - Adventarの14日目の記事になります。後輩向けに書きました。

Elixirのこと書こうと思ってたんですが、まだまだひよっこなのでまた後日。
Vimも自分でプラギン書かないひよっこですが、始めたばかりの人の役に立てそうなレベルのこと書きます。

入れててよかったVimプラギン

今回はとりあえず入れてみたけど助かってるなぁと感じたVimプラグイン(設定)を紹介しようと思います。
プラグイン入れることが全てではないですが、先人がベンリなものを作ってくれてるのでありがたく使わせてもらいます。
NeoBundle使ってるvimrcをそのまま切り貼りしてるのでたまに出てきますが、適宜読み替えて貰えれば幸いです。

lexima.vim

github.com

ソースコード書いてると良く""()で文字列を囲みますがその入力を助けてくれるプラグインです。 IDEっぽい感じになります。
自動で""{}を入力してくれるのでほぼ閉じ忘れがおきません。 文字で表現してもわかりづらいと思うので、githubgifを見てください。

" lexima.vim {{{
if neobundle#is_sourced("lexima.vim")
  let g:lexima_no_default_rules = 1
  call lexima#set_default_rules()
endif
" }}}

incsearch.vim

github.com

マッチするものが全てハイライトされるインクリメント検索ができます。 それがとても良いのです。

f:id:norikakip:20151214225206p:plain f:id:norikakip:20151214225250p:plain

" incsearch {{{
map / <Plug>(incsearch-forward)
map ? <Plug>(incsearch-backward)
map g/ <plug>(incsearch-stay)
" }}}

eskk.vim

github.com

Terminal環境によってはIMEが使えなくなってしまって困ることがあります。
そんな時に活躍します。skkの入力方式は癖がありますが、IMEなしで日本語が入力できるのはとてもありがたいです。
よく環境をお引越しする人にオススメです。

"eskk設定 {{{
let g:eskk#directory = '~/.eskk'
let g:eskk#dictionary = {
      \     'path' : "~/.skk-jisyo",
      \     'sorted' : 0,
      \     'encoding' : 'utf-8',
      \}
let g:eskk#large_dictionary = {
      \     'path' : "/usr/share/skk/SKK-JISYO.L",
      \     'sorted' : 1,
      \     'encoding' : 'euc-jp',
      \}
let g:eskk#enable_completion = 1
" }}}

プラギン以外

知ってると少しうれしい機能です

keywordprg

Vimではカーソル下のキーワードを調べる仕組みが用意されています。
デフォルトではK(Shift + k)でカーソル下のキーワードをmanを使ってしらべますが、 言語によってはドキュメントを検索するツールを指定したいです。その時にkeywordprgを使います。

autocmd FileType ruby call s:ruby_filetype_settings()
function! s:ruby_filetype_settings()
  setlocal tabstop=2 shiftround shiftwidth=2
  setlocal completeopt-=preview
  setlocal keywordprg=ri
endfunction

これでRubyのコードを書くときにKを押せばriでドキュメントを参照してくれるようになります。

vimのコマンド実行について

Vimではコマンドが一意に定まるとき、最後まで入力せずともコマンドが実行できます。タブで補完する必要もありません。

どういうことかと言うと、実行できるコマンドにExciteTranslateExploreがあったとして、

:Explore

これを

:Exp

に省略することが出来ます

自分でコマンドを書く際にこれを意識すると、とても入力効率が上がると思います。
下のscriptは現在開いているbufferのディレクトリにcdするコマンドです。

command! CDCurrent call s:CDCurrent()
function! s:CDCurrent()
  if isdirectory(expand('%:h'))
    cd %:h
  endif
endfunction

:CDで始まるコマンドは僕の入れているプラグインと被っていないので、これだけでbufferのディレクトリに移動できます。
なるべく被らないコマンドを定義して指を休めてください。

Vimはautocmdとmapだけですごく楽ができるので、慣れたらガシガシいじってください。

その他ポインタ

VimのCTRL-X補完について - daisuzu's notes

vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト

Vim Advent Calendar 2015 - Qiita

時間切れだぁ(・ัω・ั)

Railsチュートリアル2章をやってて引っかかったところのメモ

メモメモ

  1. development.rb:1:in `<top (required)>': undefined method `configure'

  2. dynamic_matchers.rb:22:in `method_missing': undefined method `raise_in_transactional_callbacks='

  3. ERROR RuntimeError: You must set config.secret_key_base in your app's config.

ejabberdをCentOS(v6.5)で動かす

XMPPサーバを立てる必要があったのでejabberdをCentOSにインストールして自動起動するようになるまでのあれこれ。
とりあえず動くようになったという状況なので、適切な状態ではないかもしれません。 今回の目的はきちんとした形での起動ではなくクライアントソフトウェアのための実験サーバなので動く状態でよかったのが主な理由でだいぶ適当です。
ejabberdが更新されればfixされると信じて…!

環境

ejabberdのインストール

Installing ejabberd | ejabberd Installation and Operation Guide

基本的には公式ドキュメントに従いインストールします。
英語が読みたくなくて日本語のリソースを探して途中まで参考にしました(๑╹ڡ╹๑)
インストール自体はとっても簡単、インストーラを落としてきて走らせると質問形式でインストールが進んでいきます。
システム上にインストールするためrootアカウントで作業した。
ejabberd関連のファイル一式は/opt/ejabberd-15.03にインストールされました。

ejabberd ユーザを作る

ドキュメントを読み進めて行くとWindowsLinux(もしくはUnix)によって作業がわかれます。
読みづらいので見出しを付けて欲しい…

CentOSなのでLinux向けの作業をする。具体的には、

  • ejabberd システムユーザの作成
  • ejabberd ユーザのホームディレクトリを /opt/ejabberd-15.03にする
# groupadd -r ejabberd
# useradd -g ejabberd -p ejabberd -r ejabberd 
# usermod -d /opt/ejabberd-15.03 ejabberd

これで/opt/ejabberd-15.03/bin/ejabberctlが使えるようになりました。
(上記作業を行わなくてもroot権限で使用することはできる)
ここから先が長かった…

binのstopスクリプトが動作するようにする

なぜか/opt/ejabberd-15.03/bin/stopがうまく動作しない…
メッセージを読むと同じbinにあるはずのepmdが見つからないとのことでした。
パスが通っていないらしい。

ぐぐって見つかったFixに従ってejabberdctlに以下の行を追加しました。

EPMD="$ROOT_DIR"/bin/epmd
INSTALLUSER=root

+# The problem is epmd isn't in the path of the ejabberdctl script.
+# The (quick fix) is at the top of bin/ejabberdctl, add in here!
+# See: https://www.ejabberd.im/node/5748
+
+PATH=$PATH:$(dirname $(readlink -f $0))

# check the proper system user is used if defined
if [ "$INSTALLUSER" != "" ] ; then

これで/opt/ejabberd-15.03/bin/stopが動かせるようになりました。やったぜ。

ejabberdの自動起動

あとは公式ドキュメントの通り、binの中にあるejabberd.initをinit.dにコピーします。 不安だったのでその前に動かせるかどうか試してみました。

# /opt/ejabberd-15.03/bin/ejabber.init start

動きません。しかもrootユーザで動かしてね♡的な事を言われれます。
何を言っているんだ……と思い色々試しますが動かず。

ejabberdctlstartstopは動くことから、initスクリプトがおかしいだろうとあたりをつけました。

スクリプトを開くと、結局ejabberdctlを実行している……

suコマンドの引数として与えられてるユーザをrootユーザに変更すると動きました。 変数を後続のスクリプトに受け継いでいるようなのが少し気になりますがとりあえずスルー。

chkconfigで自動起動する

initスクリプトは動くようになったので、あとはchkconfigで起動時に立ち上がるようにするだけ!
chkconfig用に追記して、iptablesでポートを開いてreboot
無事動作していることを確認しました。成し遂げたぜ。

参考にしたサイト一覧

Installing ejabberd | ejabberd Installation and Operation Guide
Service doesn't start automatically in CentOS
"epmd: command not found" after Ejabberd installation
CentOS 6 に ejabberd をインストールする方法 - だいたいおっけぇ