Rustで<T: std::ops::Sub> T - T の返り値
<T: std::ops::Sub> T - T の返り値
std::ops::Sub::Outputが返り値になる。
AddとかMulとか、Overloadable operatorsはそんな感じらしい
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++が表示できました。
お疲れ様でした。
参考:
- [SOLVED]Cannot find libncurses.so.5 / Newbie Corner / Arch Linux Forums
- libtinfo.so.* missing in Arch Linux · Issue #778 · Valloric/YouCompleteMe · GitHub
おまけ
いつものエミュレータが起動できない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 を選択
GroupId にはパッケージ名、ArifactIdにはプロジェクト名を入れる
GradleのJavaプラグインではプロジェクトのレイアウトが決められていて(もちろん変更は可能)、ソースフォルダは
- src/main/java
が使われるようになっている。なのでここにフォルダを作ってソースファイルを入れないと、Gradleに設定を書いていない限り、syncするたびにソースフォルダとして指定しないといけなくなります。ちょっとハマりました。
これでプロジェクトが始められるぞー٩( ‘ω’ )و ガンバル
フォルダを自分で作りたくない
プロジェクト作成時に Create directories… にチェックを入れればフォルダは勝手に作られます。
よく読もうと思いました。終わり。
Visual Studio CodeでC/C++プログラムのデバッグをする時gdbが上手く動かない
なんだかブレークポイントで止まってくれない上に画像のようなメッセージが出る。
"warning: GDB: Failed to set controlling terminal: Operation not permitted\n"
色々と検索して当たりましたが簡潔に。
ptrace_scope
sudo sysctl -w kernel.yama.ptrace_scope=1
解決せず。ハズレgdb -window
gtkでwindow出してたのでもしかしてと思い。(英語を読む気がない感)
解決せず。ハズレgcc -g
これでした。
普通にgdb使う時はデバッグシンボルなくてもブレークポイントで止まってくれるのに……
おかげで妙にハマってしまいました。
お疲れ様でした。
EclipseでLogcatが消えた時にやったこと
24日目の記事です。ジャスト投稿!!!(ジャスト一週間遅刻)
23日目の記事はElixirのドキュメント環境を整える - 302 - あちらですでした(手前味噌)
25日目の記事はwebsearch.vimpr でサービス別コンテンツを即検索 - Qiitaです
EclipseでLogcatが消えた
会社ではEclipseからAndroid Studioへ移行中で[移行前|移行済み]のプロジェクトが混在しているのですが、移行前のものをいじっている時に遭遇したLinuxでEclipseを使ってる時に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の回答を見て欲しいんですが、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のドキュメント環境を整える
23日目の記事です。
22日は幸せなコンソール - hogeblogでした。
24日は(まだ書いてません)
アドベントカレンダーとはなんだったのか……(スイマセン
Elixirのドキュメント環境を整える
普通に公式のドキュメント見たりIEx使ったりしてもいいんですが、いろいろなライブラリを串刺しで検索したい時にちょっとフベンだったのでメモ
Macにおける串刺しドキュメント検索にはDash.appというアプリがありますが、Linuxでも使えるアプリとしてZealというものがあります。
セットアップするとこんな具合になります
最高ですね。 ということでやったことのメモを書いていきます。
環境
- OS: Linux(Archlinux)
Zealのインストール
Zeal - Offline Documentation Browser
githubにインストールの仕方が書いてあります、が僕が使ったコマンドはこれだけでした。
yaourt -S zeal-git
これで入りました(・ัω・ั)
Archlinuxベンリですね
Elixirのドキュメントのダウンロード
Dashで使われているものをそのまま使えるようで、ぽちぽちとチェックマークをつけてDownloadボタンを押すだけでした。
Phoenixのドキュメントのダウンロード
Dash公式では用意されていないようですが、読み込めるっぽいことが書いてありました。
いやこれじゃ読み込む方法わかんねえ……ということで、適当に検索してたらありました。hex.pmでパッケージが引っかかりました。
ありがてえありがてえと思いながら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
matplotlibはPythonで利用可能なプロットツールです。 プロットツールということで、プロットしたものを表示するGUI環境が必要です。 今回はQtを利用することにし、QtとPythonについて調べました。
PythonとQt
QtはC++から利用なGUIフレームワークです。
(これでキュートと読むらしい。今までキューティーと読んでた…)
C++から利用可能なものをPythonで利用するということは、つまりバインディングされているわけで、
よくあるパターンですが、Qtを使うための複数のライブラリが存在しています。
代表的な2つとして挙げられるのが
- PyQt
- PySide
のようです(要出典)
PyQt
PyQtはpip
でインストールできません
そしてライセンスがGPL
です(商用ライセンスもある)。
ちょっと使いづらいですね。
ただ、現状Qt5を利用できるのはPyQtだけのようです(PyQt5)
Qt5をつかうため+後述の理由があったため、今回はPyQt5を入れました。
Qt5使う理由は特になくて新しい物使っとこうかな程度です。
PySide
PySideはpip
でインストールできます
そしてライセンスがLGPL
です。PyQtよりも使いやすいですね。
今回PyQtを使うに至った大きな理由は、PySideがまだPython3.5で利用できなかったためです。
Python詳しくないですがなんとなく新しい物使いたい病なので苦労しながらPyQt入れました。
導入する
2つのライブラリ(SIP、PyQt5)をダウンロード、コンパイル、インストールします。
SIPはPythonから簡単に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を入れましょう。
事前にpacman
かyaourt
を使って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以外使って描画できてた気がする。