とらりもんHOME  Index  Search  Changes  Login

とらりもん - memo_Nasahara Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!奈佐原メモ
!!nvidia driver
[[https://note.com/setoyama60jp/n/n600df9f34230]]
sudo add-apt-repository ppa:graphics-drivers/ppa

!!機械学習
[[https://cloud.google.com/ml-engine/]]

!!ファイル検索にgrepを使う
ls -lt *png *jpg  --> *jpgが無いとエラーメッセージが出る(実害は無いが)
ls -lt | grep -e png -e jpg   --> *jpgが無くてもエラーメッセージ出ない

!!衛星/センサー
* RISAT-1: インド, C-band SAR, 2012/04-, dawn-dusk
* Gaofen-3 SAR 中国, 2016/08-, dawn-dusk, C-band


!! swap領域の使用状況
$ grep VmSwap /proc/*/status | sort -k 2 -r | head

!!ipythonで, コマンドをテキストエディタからコピペで貼り付ける:
In []: %cpaste
(ペースト)
-- (<- これを打ってEnter)

!!リモセン関係のいろんなシミュレーターや解析ツールのソースコード
[[https://rscl-grss.org/index.php]]

!!I2EM モデル
[[http://mrs.eecs.umich.edu/codes/Module10_1/Module10_1.html]]

!!Corine Land Cover = CLC
* 1985, 1990, 2000, 2006, 2012, 2018
* 44 classes
* MMU(status layer) = minimum mapping unit = 25 ha (area) or 100 m (line)
* MMU(change layer) = 5 ha
* LAU = local administrative units
* NUTS = nomenclature of territorial units for statistics
* NUTS1, NUTS2, NUTS3とだんだん細かくなっていく。by EUROSTAT?


!!Mann-Kendall test by Python
* https://up-rs-esp.github.io/mkt/#
* https://github.com/UP-RS-ESP/mkt
mkt.test(t, x, 0.1, 0.01, 'up')
0.1 ... possible random error in x value
0.01 ... if smaller, more strict test.

!!シェルで複数の文字列のorの正規表現
$ ls {abc,def}*.txt

!!デフォルトエディタの変更(Ubuntu 16.04)
$ sudo update-alternatives --config editor

!!pythonで非負・総和1の拘束条件つき線型最小二乗法
[[https://stackoverflow.com/questions/33385898/how-to-include-constraint-to-scipy-nnls-function-solution-so-that-it-sums-to-1]]
基本的に, scipyのnnlsを使う(non-negative least square)。

まずscipyのライブラリの不具合(Ubuntu 16.04特有?)を解消する:
$ sudo apt install --reinstall python\*-decorator
そしてpython3

import numpy as np
from scipy.optimize import nnls
def fn(x, A, b):
    return np.sum(A*x,1) - b

A = np.array([[60., 90., 120.],
              [30., 120., 90.],
              [1.,  1.,   1. ]])
b = np.array([67.5, 60., 1.])
x, rnorm = nnls(A,b)
print(x,x.sum(),fn(x,A,b))
しかし↑この解は厳密には総和=1を満たさない。厳密に総和=1にしたければ,

import numpy as np
from scipy.optimize import minimize
from scipy.optimize import nnls
A = np.array([[60, 90, 120],
              [30, 120, 90]])
b = np.array([67.5, 60])
x0, rnorm = nnls(A,b)
def fn(x, A, b):
    return np.linalg.norm(A.dot(x) - b)

cons = {'type': 'eq', 'fun': lambda x:  np.sum(x)-1}
bounds = [[0., None],[0., None],[0., None]]
minout = minimize(fn, x0, args=(A, b), method='SLSQP',bounds=bounds,constraints=cons)
x = minout.x
print(x,x.sum(),fn(x,A,b))



!!略語
* ESPA = EROS Center Science Processing Architecture [[https://landsat.usgs.gov/sites/default/files/documents/espa_odi_userguide.pdf]]

!!netbeans
* C++などの統合開発環境。Ubuntuではaptでインストール可能。
* クラスや関数などの参照は, netbeans上でいったんビルドしてから有効になる。

!!python
sudo apt-get install python-pandas ipython

!!リモセンへの世の中の期待
*コペルニクス計画
*GEOSS 2016-2025 / SBA Social Benefit Area
*GEO / SDGs Sustainable Development Goals
*仙台防災枠組み
*気象衛星調整会議 CGMS
*防災基本計画
*気候変動の影響への適応計画
*水循環基本計画

!!農業リモセン
* FAO/[[AMIS|http://www.amis-outlook.org/]] ... Agriculture Market Information System
* GEO-GLAM
** [[Crop Monitor|http://www.geoglam-crop-monitor.org/]] ... 準リアルタイムの作況マップ。衛星・地上・気象等のデータから。
** [[Asia-Rice|http://www.asia-rice.org/]] 欲しい(出したい)情報: 作付けマップ、農事暦、作況状況
* 米の生産量トップ10は、ブラジル以外、全部アジア。1 中国, 2 インド
* JAXA/JASMAI ... 農業気象衛星情報モニタリング
* IFPSIM, International Food and Agricultural Policy Simulation Model ... 大賀先生
!!漁業リモセン
* [[JAFIC|http://www.jafic.or.jp/sat/index.html]]
!!大気成分リモセン
* ENVISAI/SCIAMACHY (2002-2012年) 大気分光用イメジャー。0.24-2.4μm@約1nm分解能。by DLR。
* AURA/OMI Ozone Monitoring Instrument。byオランダ・フィンランド。TOMS後継。プッシュブルーム。約20km分解能。
* 1万カイザーが1μm。
!!SAR ポラリメトリ
* ケノー行列 (Kennaugh matrix) = ストークス行列 (Stokes Matrix)
** ストークスベクトルを受信電力に変換する二次形式の行列。4次の実対称行列。


!!Unixのジョブ管理
$ jobs  ... 実行中のジョブのリストを表示
$ stop %3    ... ジョブ番号3のジョブを一時停止
$ fg %5 ... ジョブ番号5のジョブをフォアグラウンドに。
$ kill $6 ... ジョブ番号6のジョブを強制終了。


!!Sylpheed
* gmailのアカウント設定。
** メールダウンロードがうまくいかないときは, IMAP4アカウントではなくPOP3アカウントでやってみる(2018/03/07 うまくいった)
** パスワードは, gmailの設定画面(ブラウザ)で、アプリ専用のパスワードを生成し, それを使う。Googleのログインパスワードではうまくいかない。

* 添付ファイルを開けるときのアプリを変更: $HOME/.sylpheed/sylpheedrcの中身を書き換える。
* うまく行かない場合は, /etc/mailcapを書き換える。
** 代替案: $ ln -s /usr/bin/eog /usr/local/bin/display

* アドレス帳の編集
** vi ~/.sylpheed-2.0/addrbook-00000?.xml
** サジェストで出てくるメアドもこれで追加・削除できる。ただし複数のアドレス帳がある場合は, 全てから消さないとサジェストからは消えない。

!!Linux

ログイン時のメッセージを変更
* sudo vi /etc/motd

dpkg
* dpkg -S hogehoge ... hogehogeという名のファイルを含むdebパッケージを探して表示。
* dpkg -L hogehoge ... hogehogeというdebパッケージに含まれるファイルを表示。
* dpkg -r hogehoge ... hogehogeというdebパッケージを削除。
* dpkg -l ... 入っている全てのパッケージを表示。

メールソフトの、アプリケーション関連付けの設定:
/etc/mailcapを編集!

スクリーンキャプチャ
$ import filename.png
カーソルが十字になる。クリックするとキャプチャされた結果(画像ファイル)がfilename.pngに吐き出される。

日本語入力
* フロントエンド(インプットメソッド): ibusかSCIM
* かな漢字変換: mozcかanthy.
* ibus & mozcが最近のトレンド。

ディストリビューションとバージョンを調べる:
$ lsb_release -a

マウントしているディスクのUUIDを調べる:
$ ls /dev/disk/by-uuid/ -l

CPU数, コア数, スレッド数を調べる:*
* CPU数 < コア数 < スレッド数
* CPU数は ... $ cat /proc/cpuinfo | grep "physical id"
* コア数は ... $ cat /proc/cpuinfo | grep "core id"
* スレッド数は ... $ cat /proc/cpuinfo | grep "core id" | wc
* physical idとcore idの組み合わせの重複が, ハイパースレッド。

PDFにテキストを書き込む:
xournalが便利! PDF書式に書き込む書類作りとか、簡単!

!!UAV
* simulater: http://www.heli-x.net/
* mission planner: http://planner.ardupilot.com/
* GoPro's wide FOV is too much. Only the central part is used in photoscan. You may want to use Ricoh GR for UAV photo, instead of GoPro.

!!C/C++
主な[[出典|http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html]]
* オンラインマニュアルのインストール: sudo apt-get install libstdc++6-4.4-doc
* ↑使うときは, $ man std::ifstream  のように。
* GSLを使うときのコンパイル: g++ test.cpp -lgsl -lblas -lm
* OpenCVを使うときのコンパイル: g++ test.cpp -lopencv_core
* 数学定数
** # define _USE_MATH_DEFINESしてから,
** M_PI  ... π=3.1415...
** M_E   ... e=2.7108...
** M_PI_2 ... π/2
** 他にも, M_SQRT2=sqrt(2)とか, M_SQRT1_2=1/sqrt(2)とか, M_LN10=ln(10)とか, いっぱい。
* 条件文は数値でもよく、0は偽、0でないときは真となる。
* 条件式を数値として使うこともでき、真は1、偽は0となる。
* 配列の初期化 (配列変数の中身を初期化するときは、中身(要素)を { } で囲んでやります。要素要素はコンマ(,)で区切ります。char配列に文字列の場合は""で書き下す。)
int x[]={ 1, 2, 3, 4};
char s[] = "I am a boy.";
* for(;;)は無限ループ。
* while(条件式)は, for (;条件式;)と同じ。
* ループの最初に条件式を評価したい: while
* ループの最後に条件式が評価される: do ... while
* ループを強制的に抜ける: break
* ループ内の以後の命令をすっとばしてループの最後(最初とも言える)に行く: continue
* switch ... case文は, caseの最後にbreak;を忘れるな! さもなくば, あるcaseで条件満たしたら, それ以後の条件は全て成立するものとされて残りの命令も実行されてしまう。
* sizeof(変数名または型名またはクラス名) ... その変数のバイト数(int)
** 配列変数のサイズも得られる。下の例では80と出る(4バイト*20)
int x[20];
cout << sizeof(x) << endl;
// ただし, ↑これは配列の要素数×1データのサイズ。配列の要素数だけを得たいなら, 次のマクロが便利!
#define ELEM(array)  (sizeof (array) / sizeof *(array))

* [[マクロ|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01028.html]]

* typeid(変数名又はオブジェクト名).name() ... その変数の型又はクラスの名前。# include <typeinfo>が必要。
* 最強の実数型 long double ... 16バイト!

* ポインタの宣言
char* a, b;   // aだけがポインタ変数になる(bはならない)。
char *a, *b;   // a, bともにポインタ変数になる。

* 配列とポインタの違い: ポインタにはアドレス(配列の最初とか)を代入できるが, 配列にはアドレスは代入できない。
int* x;
int y=6;
int z[]={1,2,3};
x=z;   // できる
x=&y;   // できる
z=&y;   // できない!!! (エラー)

* ポインタのインクリメントは, その型のサイズずつになる。
int* x;
int y[]={1, 2};
x=y;
cout << y << endl;
cout << y+1 << endl;
結果:
0x7fff46759390
0x7fff46759394

* ポインタのconst
const char *p;  // 参照先が定数になる。p は定数にあらず。
char *const p = &a;  // pが定数になる。

* 条件演算子 <条件式> ? <真の場合(数値)> : <偽の場合(数値)>
例: cout << ((0<x) ? sqrt(x) : -1) << endl;

* 8進数は頭に「0」をつけて、16進数は頭に「0x」を付けて表現する。
int x=0123;
int y=123;
int z=0x123;
cout << x << endl;  // 83と出る。
cout << y << endl;  // 123と出る。
cout << z << endl;  // 291と出る。

* ビット演算
** & AND ... 例: y = x & 1;
** | OR ... 例: y = x | 1;
** ^ XOR  ... 例: y = x ^ 1; ... ビット反転!
** ~ NOT  ... 例: y = ~x;
int x;
x=0;
cout << (x & 1) << (x | 1) << (x ^ 1) << endl;  // 011と出る。
x=1;
cout << (x & 1) << (x | 1) << (x ^ 1) << endl;  // 110と出る。
* ビットシフト
// 例1
void bitlist(int x){   // 下位ビットから表示する
for (; x; x >>=1) cout << (x & 1);
cout << endl;
}

int main(){
bitlist(1);
bitlist(0x123);
return 0;
}

// 例2
int x=1;
cout << (x<<=1) << endl;  // 2
cout << (x<<=1) << endl;  // 4
cout << (x<<=1) << endl;  // 8
cout << (x>>=2) << endl;  // 2

* 文字列入力でバッファオーバーフローさせたくなかったら, fgetsを使う。(scanf系の関数は危険なのでなるべく使わない)
scanf("%s", s);         // バッファオーバーフローする。
fgets(s, 128, stdin);   // 128バイト以内で読んでくれる。途中でCRがあったらそこまで。

* 変数の参照渡し ... たとえ渡った先で値が変わらなくても, 大きなオブジェクトは参照渡しすべし。さもないといちいちコピーされる。
# include <iostream>
using namespace std;

void bai(int& x){x = x * 2;}     // この&が重要!!

int main(){
int x=4;
bai(x);
cout << x << endl;
return 0;
}

* [[ヌルポインタ|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01063.html]]
* 関数のオーバーロード ... 引数が違えば同じ名前の関数も違う関数にできる。
# include <iostream>
using namespace std;

int bai(int x){return(x*2);}
double bai(double x){return(x*3);}

int main(){
cout << bai(2) << endl;     // 結果は4
cout << bai(2.0) << endl;   // 結果は6.0
return 0;
}
* [[デフォルト引数(引数の初期設定による省略)|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01065.html]]
* [[static|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01067.html]] (静的変数) ... constとは全く違う! 関数(サブルーチン)の中のstatic変数は, いちど呼ばれたら, その後もずっと維持される。関数を抜けても消えない。再度呼ばれた時に, 前の状態から再開できる。初期化命令があっても、それは最初に呼ばれたときだけ行われる。グローバル変数はstatic変数の一種。staticは関数内やブロック内で定義されるグローバル変数みたいなもの。
// static変数
# include <iostream>
using namespace std;
int a=3;

int main(){
int i;
for (i=0; i<3; i++)
   {int x=3;
    static int y=3;
    cout << x <<" " << y << endl;  // xは3のままだが, yは3, 4, 5と変化する。
    x++; y++;
   }
return 0;
}

* スコープ ... 変数や関数の見える範囲。普通はその定義を含む{}の内側(ブロックという)で, 定義以降。グローバル変数はどこからでも見える(ファイルスコープという)。

* [[リンケージ|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01069.html]] ... ファイルを越えて利用できるかどうか
* extern ... ほかのファイル内のソースコードで定義されているその変数を使う。
* static ... その変数を他のファイルのソースに見せないようにする。
* メモリーの確保: a = new intとか, a = new int[100]とか([]を()と間違えないように! それ間違えたらコンパイル通るけどsegfaultになる!)。後者は配列の確保。必ずdelete aすべし。配列の解法はdelete[] a。
// 危険! メモリーリークさせるプログラム。システム止まる!
# include <iostream>
using namespace std;

int main(){
for (; ;){
  int* a;
  a = new int;
}
return 0;
}
* new で確保したメモリの寿命はブロックには左右されない(ブロックを抜けても残る!)。
* 乱数を使う場合は, # include <cstdlib>すべし。
* 乱数の初期化(srand)をtimeでやると, 1秒以内の繰り返しでは同じ結果が出てしまう。
* rand()は線型合同法。精度悪い。科学計算(モンテカルロ)にはMT法を使うべし。
* [[enum|http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01076.html]]
* リテラル(文字列)は, ソースコードの中に書くと, 勝手にメモリ確保してくれてポインタを返す。
// リテラル
# include <iostream>
using namespace std;

int main(){
static const char* a = "I am a boy!";
static const char* b[] = {"I am a boy!"};
cout << a[0] << endl;    // 結果: I
cout << b[0] << endl;    // 結果: I am a boy!
return 0;
}

* メンバ関数は, クラスの宣言の中で実装するとインライン関数になる。
* [[コピーコンストラクタ|http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02009.html]]
** ポインタを含むクラスのインスタンスを, 関数への引数(仮引数)とする場合, 関数からの復帰時に, もとのインスタンスのポインタがクリアされてしまう。
** ポインタが指す内容もコピーしてから関数に渡すと、そのトラブルはなくなる。それをしてくれるのがコピーコンストラクタ。
** コピーコンストラクタは, 同じ内容のインスタンスを複数作る(あるインスタンスを別名でもう一個作る)ときにも使える。
** コピーコンストラクタの中では, コピー元のインスタンスのprivate変数も見えるらしい。

!PythonでGRASS
まずGRASSを立ち上げる。次にGRASSのコマンドラインでPythonを立ち上げる:
GRASS> python
Pythonのコマンドラインで以下を入力(以下, Pythonのコマンドプロンプトを>>>で表す):
>>> import grass.script as grass
>>> import grass.script.setup as gsetup
>>> import os,sys
>>> gisbase = os.environ['GISBASE']
>>> gisdb = "/home/nishida/GRASS"
>>> location = "latlon"
>>> mapset = "nishida"
>>> gsetup.init(gisbase, gisdb, location, mapset)
GRASSコマンドを走らせるには:
>>> grass.run_command("d.mon", start="x0")
>>> g.parse_command("d.rast", map="GTOPO_E100N40")
>>> g.parse_command("r.what", input="GTOPO_E100N40", east_north="138,35")


!もろもろ
* オドメトリ ... ロボット等が, 車輪などの回転数から自己位置を決める手法。
* [[SLAM|http://ja.wikipedia.org/wiki/SLAM]] ...  自己位置推定と環境地図作成を同時に行うこと