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

(python) matplot の pyplot で極座標表示

python やら numpy あたりの勉強をしていてふと気になったので極座標表示を調べた.polar という関数を使えば良いらしい.

import numpy as np 
import matplotlib.pyplot as plt 

#Cardioid の極座標方程式 r = 1+cos(θ)

theta_list = np.arange(0, 2*np.pi, 0.05)
r_list = 1 + np.cos(theta_list)

plt.polar(theta_list, r_list)
plt.show()

fig1

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

latexでギュメを入力する(フランス語)

フランス語の引用符は《》みたいな形をしておりギュメ(guillemets) と呼ばれます.たとえばこんな感じになります:
french2

このような文は次のような latex ファイルから出力できます:

\documentclass[12pt,a4paper]{jsarticle}
\usepackage{amsfonts}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[french=guillemets]{csquotes}

\begin{document}
Le mot m\^eme d' \enquote{anneau local} provient de la g\'eom\'etrie 
alg\'ebrique, o\`u cette notion appara\^it de fa\c{c}on plus naturalle: par 
exemple, dans l'anneau $\mathbb{C}(X)$ des fonctions rationnelles d'une variable 
\`a coefficients complexes, l'anneau local correspondant \`a l'id\'eal premier 
$(X-\alpha)$ est l'anneau des fractions rationnelles \enquote{r\'eguli\`eres} au 
point $\alpha$ (c'est-\`a-dire n'ayant pas de p\^ole en ce point).
\end{document}

[付記]もし「Package babel Error: Unknown option `french’」のようなエラーが出たらこうすると良いかもしれない:

$ sudo tlmgr install babel-french

Ipeというツール(latex)

あとで調べてちゃんと書く.EPS や PDF の図を作るためのソフトだそうだ.

https://en.wikipedia.org/wiki/Ipe_(software)