Rustで<T: std::ops::Sub> T - T の返り値

<T: std::ops::Sub> T - T の返り値

std::ops::Sub::Outputが返り値になる。

AddとかMulとか、Overloadable operatorsはそんな感じらしい

doc.rust-lang.org

Associated typesと一緒にやったときちょっと引っかかったのでした。 Rustはまだ数回ググらないと、自分の知識では目的までたどり着けないなあ。

たいして目的のないコードを載せると、こんな感じです。

trait Contains {
    type A: Copy + ops::Sub;
    type B: Copy + ops::Sub + convert::From<Self::A>;

    fn contains(&self, &Self::A, &Self::B) -> bool;
    fn first(&self) -> Self::A;
    fn last(&self) -> Self::B;
}

fn difference<C: Contains>(container: &C) -> <C::B as ops::Sub>::Output {
    container.last() - C::B::from(container.first())
}

お疲れ様でした。

Arch LinuxでAndroid Studioを使ってC++ supportのプロジェクトを作るときにやったこと

プロジェクト作成は省略。Hello from C++を表示するまでにやったこと。 Arch Linuxではプロジェクト作ってそのままだとGradle syncがCMake実行時にコケてしまったのでメモ。

libncurses

なんかlibncurses.so.5が見つからないと言われる。 ncurses は インストール済みなのに言われるので調べたらlibncurses.so.6が入ってるんですね。

なので symbolic link を貼って解決すればいいとのこと。

[SOLVED]Cannot find libncurses.so.5 / Newbie Corner / Arch Linux Forums

sudo ln -s /usr/lib/libncursesw.so.6 /usr/lib/libncurses.so.5

libtinfo

ncursesの解決はできたものの今度は libtinfo.so.5 が見つからないとのこと。

sudo pacman -Ss libtinfo なんて適当に調べても見つからない。 おとなしくググると、 AURにはあるらしい。

なのでyaourt -S libtinfoでインストール。/usr/libの下を確認するとlibtinfo.so.6がいることを確認

sudo ln -s /usr/lib/libtinfo.so.{6,5}

これでとりあえずはGradle syncがコケなくなってHello from C++が表示できました。

お疲れ様でした。

参考:

おまけ

いつものエミュレータが起動できないlibstdc++のアレ

追記: 2017/03/14現在、確認

SDKいくつで変わったのかはわかりませんが、soが移動してました。ので

mv $ANDROID_SDK_HOME/emulator/lib64/libstdc++/libstdc++.so.6{,.back}
ln -s /usr/lib/libstdc++.so $ANDROID_SDK_ROOT/emulator/lib64/libstdc++/libstdc++.so.6

↑こんな感じで。

↓では動きません。動きませんというか、ファイルがないのでコケるはず。

mv $ANDROID_SDK_HOME/tools/lib64/libstdc++/libstdc++.so.6{,.back}
ln -s /usr/lib/libstdc++.so $ANDROID_SDK_ROOT/tools/lib64/libstdc++/libstdc++.so.6

IntelliJ IDEA で Gradle Java のプロジェクトを作ったときのsrcフォルダの場所

普段Android Studioが勝手に作ってくれてよく忘れるので覚え書き。

  • IntelliJ IDEA 2016.3.2 Community Edition での説明です。

プロジェクト作成の流れ

Create New Project(もしくはメニューの New -> Project)を選択して

Gradle -> Java を選択

f:id:norikakip:20170108171649p:plain

GroupId にはパッケージ名、ArifactIdにはプロジェクト名を入れる

f:id:norikakip:20170108171913p:plain

GradleのJavaプラグインではプロジェクトのレイアウトが決められていて(もちろん変更は可能)、ソースフォルダは

が使われるようになっている。なのでここにフォルダを作ってソースファイルを入れないと、Gradleに設定を書いていない限り、syncするたびにソースフォルダとして指定しないといけなくなります。ちょっとハマりました。

第23章 Javaプラグイン

これでプロジェクトが始められるぞー٩( ‘ω’ )و ガンバル

フォルダを自分で作りたくない

プロジェクト作成時に Create directories… にチェックを入れればフォルダは勝手に作られます。

f:id:norikakip:20170108175854p:plain

よく読もうと思いました。終わり。

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以外使って描画できてた気がする。