C++の列コンテナの「最後の要素」だけ扱いを変えたい(自分用メモ)

C++の列コンテナを操作しているときに,最後の要素だけ扱いを変えたいことがあります.
(何らかのメタプログラミング,つまりプログラムを使ってプログラムを生成したい場面にしばしばこのような処理の必要が生じます).
vector::size() を使って列の長さを取得して size_t でアクセスすることにしても良いのですが,今回書いていたコードでそのようにすると前半と後半でiteratorアクセス/添字アクセスと切り替わって見苦しいので方法を調べました.

/*---------------------------------------------
   iterator で,列の最後の要素だけ特別扱いしたい
 *---------------------------------------------*/

#include 
#include 
#include 

using namespace std;

int main()
{
	typedef vector svector;
	svector a{"first", "second", "third", "fourth", "fifth", "sixth", "last"};

	auto end = ++(a.rbegin());
	for(auto i = a.begin(); i != a.end(); ++i)
	{
		cout << *i << flush;
		if(i != end.base()){ 
			cout << "," << flush; 
		}else{
			cout << ";" << endl;
		}
	}
	return 0;	
}

/*-----------------------------------------------
 出力:
 first,second,third,fourth,fifth,sixth,last;
-----------------------------------------------*/

(python, OpenCV)imshow がエラーになる問題の workaround

OpenCVをPython から使おうとしているが imshow という関数がエラーになる.
色々な fix 法が検索でヒットするが自分の環境で試してもうまくいかなかった.
そこで以下のような workaround を使うようにしている.

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = np.zeros((size, size, 3), np.uint8)

#cv2.imshow('image',img)

fig, ax = plt.subplots()
ax.imshow(img)
plt.show()

(WSL) OpenCV3.4 on anaconda インストール記録 (自分用メモ)

OpenCVをpythonから使いたくなった.Python 環境はインストール済みの anaconda を使いたい.

■1.anaconda navigator の起動.
コマンドラインから $ anaconda-navigator で起動する.X環境が必要なので適宜WSLからevinceを使う方法で説明したような方法で事前に整備しておく.

■2.新規環境の作成
001

002
上の図ではOpenCV33 としてしまったが実際にインストールされたのはOpenCV3.4だった(…).

■3.新しい環境のターミナルを開く
003

こうして開いたターミナルに$ conda install -c menpo opencv
と入力する.あとは指示に従えばよい.
これが済んだら anaconda navigator を終了する.

■4.新しい環境の呼び出し
$ conda activate OpenCV33
このようにして環境をアクティベートする.この環境にOpenCVが入っていることを確認しよう:

(base) himmel@DESKTOP:~$ conda activate OpenCV33
(OpenCV33) himmel@DESKTOP:~$ python
Python 3.7.5 (default, Oct 25 2019, 15:51:11)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.2'

■参考にしたページ
https://qiita.com/ariki4160/items/5f276f796cb169b55ff9

(python) PIL(Python Image Library)で画像が表示されないトラブルとその解決法

■tl;dr: sudo apt install imagemagick

■状況: PIL(Python Image Library) というモジュールを使って次のようなサンプルを書いた:

from PIL import Image

im = Image.open('lena.jpg')
im.show()

WSL(Windows Subsystem for Linux) にインストールした anaconda (python環境の一つ)で実行するとlena.jpg が表示されるはずなのに何も表示されない.

■この現象の起こる理由:
下記の「参考にしたページ」によるとPILは xv または display という画像ビューワを呼び出す.しかしUbuntuのように eog (Eye of Gnome) という画像ビューワしかデフォルトでは持たない場合画像表示が失敗する.

■(とりあえずの)解決方法: imagemagick をインストールする.すると display が提供されるようになり,PIL での画像表示がうまくいくようになる.WSLの場合X環境が必要になるのでWSLからevinceを使う方法で説明したような方法で整備をする必要がある.

■参考にしたページ:https://stackoverflow.com/questions/16279441/image-show-wont-display-the-picture

(python)自作モジュールをpython インタプリタから import したい

python をインタプリタとして起動したパスに hoge.py が置かれているとする.これを import してインタプリタから使いたい.

$ python
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('.')
>>> import hoge
>>> hoge.Foo(1,1)
>>> 1

G13(左手デバイス)で「押下しているときだけGキーが効く」ようにする

https://github.com/dif-engine/memo/blob/master/G13/script.lua

G13というロジクール製の左手デバイスがあります.(現在は廃盤ですが「Logicoolゲームソフトウェア」でサポートされています).このデバイスは,挙動をLuaスクリプトで制御できます.今回は「Gキーを押している間だけ有効にする」というのをやってみました.(上のコードです).

グラフィックソフトにおいてスペースバーに「手のひらツール」が割り当てられていることがあります.多くの場合,スペースバーを押し下げている間だけこのツールが有効になり,手を離すと直前に使っていたツールに遷移します.

以前のロジクール製G13ドライバにはこのような挙動をさせるための機能があったのですが,Windows10になってから削除されてしまいました.そこでこのような挙動をさせるためのLuaスクリプトを書いてみました.

上に貼った github のコードの「GtoKeys」という関数を好みに合わせて編集して使ってください.
例えば「G1」を押すと「ABC」キーが押されるようにしたければ g[1] の箇所を
g[1] = {"a","b","c"};
とすれば良いです.「G2」を押すと「Shift+B」が押されるようにしたければ g[2] の箇所を
g[2] = {"lshift", "b"};
とすれば良いです.一文字だけ割り当てる場合には
g[4] = "d";
のようにします.

G13(というデバイス)にはG1~G22の合計22個のGキーが並んでいますが,実はジョイスティック部分なども(内部的に)Gキーとして扱われます.スクリプトを書く際の参考にしてください.
pic

Buffaloの子機のドライバ

buffalo のサイトに行って検索しても見つからなかったのでメモ
https://www.buffalo.jp/support/download/detail/?dl_contents_id=60652

makeの特定のターゲットで実行されるコマンドを「その場で」つまりMakefileを直接いじらずに修正したい

■tl;dr
$ make hoge -n | vipe | bash
一時バッファでvimが開くのでそれを編集してから :wq すると編集されたコマンドが実行される.

■状況
$ make hoge で実行されるコマンドが
some-long-command1 arg1 arg2 arg3
のようになっており,臨時に arg3 だけ変更したいがMakefileをいじるまでもない.
どうするか?

■素朴な対処法
$ make hoge -n でコマンドの内容を書き出し,コピーして$ 以下に貼り付けてからその場でコマンドを編集して実行する.

■素朴な対処法の不満点
タッチパッドしか使えない場合などにはこのやり方はかなり不便.また,hoge ターゲットが複数のコマンド(複数行)からなっている場合,作業そのものが面倒.

■うまく行かない方法
(1) $ make hoge -n | xclip (2) マウスの中ボタンを押す.
ポイント1:マウスの中ボタンを押すとコマンドが実行されてしまう.
ポイント2:タッチパッドに中ボタンがそもそもないんですけど!

■解決策: vipe を使う.
(1) $ make hoge -n | vipe | bash
一時バッファでvimが開くのでそれを編集する.
(2):wq でvimを終了すると編集されたコマンドが実行される.

■vipe はどう入れる?
$ sudo apt install moreutils

■謝辞
vipe というコマンドにはググっても自力でたどり着くことができなかった.
Twitter上で教えてくださった @Mi_Sawa 氏に感謝する.

polyglot:プロジェクトの行数を数える

開発中のプロジェクトの様子を見るための有効な方法の一つがソースコードの行数を把握することです.
もちろん単一のファイルの行数を数えるにはwc -lなどとすれば良いわけです.しかし,プロジェクト全体の行数をうまく数えるにはどうしたらよいでしょうか?

polyglot がそのような目的に適うかもしれません.

プロジェクトページに書いてあるように,インストールは

curl -sSl https://raw.githubusercontent.com/vmchale/polyglot/master/bash/install.sh | sh -s

だけでいけます.

このツールを使うとソースコードの行数を言語ごとに集計してくれます.次の例は私が趣味で開発しているプロジェクトのディレクトリ直下で試した結果です:

$ poly
-------------------------------------------------------------------------------
 Language             Files       Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 Cabal                    2         149          126           10           13
 Haskell                 10        2423         2069           83          271
 Makefile                 2          71           48            2           21
 Markdown                 4           8            6            0            2
 Plaintext                1          33           19            0           14
 TeX                      3        2705         2451            2          252
 YAML                     4         236           90          122           24
-------------------------------------------------------------------------------
 Total                   26        5625         4809          219          597
-------------------------------------------------------------------------------

余談ですが,polyglot はATSという言語で書かれているそうです.

わけもなくtexのコンパイルが通らなくなったときの対処

特に変なことをしていない(つまりついさっきまで正常にコンパイルが通った)のに突如texのコンパイルが通らなくなることがある.そんなときは *.aux, *.ilg, *.bbl, *.blg, *.lof, *.out を一度削除すると良いかもしれない.

自分はlatex原稿を管理するMakefileに次のようなターゲットを入れている:

clean : ## clear aux,out files
	$(RM) *.aux
	$(RM) *.ilg
	$(RM) *.idx
	$(RM) *.bbl
	$(RM) *.blg
	$(RM) *.lof
	$(RM) *.out