コンピュータ、ソフトウェアに関すること。忘れないようにね。

WSLチップ : WSL バージョン1をバージョン2へコンバートする

既存のWSL1ディストロをWSL2へアップデートしたい。

 

コマンド: PowerShellコマンドプロンプトで実行

wsl --set-version Debian 2
書式: wsl --set-version <ディストロ名> <変更したいバージョン番号>

 

確認

wsl -l --verbose

 

OK

 

 

 

 

WSLチップ : Linux側ファイルをnotepadで編集する

Linux側のファイルシステムにアクセスするにはネットワーク接続経由のパスを使えば良いので、

  • ネットワーク接続経由のパスは「//wsl$/「ディストロ名」/ファイルパス」のように記述

コマンド: PowerShellコマンドプロンプトで実行

notepad.exe //wsl$/Debian/home/ユーザー名/.bashrc
 
以上です。
 
 
 

WSLチップ : Linux側ファイルをエクスプローラーで表示する

言葉で説明すると、

コマンド: Linux側端末で実行

/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe /c start .

 

このときエクスプローラーのURI

\\wsl$\Debian\home\ユーザー名

となっていて(「.」がホームディレクトリだったので)、これはLinux側のファイルシステムにアクセスするにはネットワーク接続経由のパスを使っているんだそうだ。

ネットワーク接続経由のパスは「//wsl$/「ディストロ名」/ファイルパス」のように記述する。

 

Microsoftドキュメントを見ていると勉強になるなぁ〜。実際とは異なっていたりしたけど(上のコマンドは修正したので正しく動きます)、powershell.exeは、C:/Windows/System32/にはないんだよね(2020年12月現在、Windows10バージョン20H2において)。

docs.microsoft.com

 

あれ?直接エクスプローラーを起動すれば良いのでは?

コマンド: Linux側端末で実行

/mnt/c/Windows/explorer.exe .

 

OKですね。

それならexplorerコマンドを作っておこう。

#! /bin/sh
/mnt/c/Windows/explorer.exe $1

コマンド: Linux側端末で実行、上記内容のファイルを作成し、実行権限を与えます。

sudo emacs -nw /usr/local/bin/explorer
sudo chmod +x /usr/local/bin/explorer

 

確認

OKです。

 

 

 

 

 

WSLチップ : ディストロを削除する

複製を作ったりで数が増えたのでいらないディストロを削除したい。

 

コマンド: Power Shell かコマンドプロンプトで実行

wsl --unregister Debian

wsl --unregister 削除したいディストロ名

 

確認:

wsl -l --verbose

 

 

 

WSLチップ : ディストリビューションを複製して2個目のディストロを作る

実験して試したいことがあるけど、元に戻せなくなると嫌だなぁ〜

と思っていたら、インストールしたディストロを複製してもうひとつディストロを作る方法がありました。

 

まず、インストールしたディストロ(ここではDebian)をexportしてtarファイルを作成します。

コマンド: Power Shell か コマンドプロンプトで実行

wsl --export Debian DebianWSL.tar

書式: wsl --export インストール済みディストロ名 tarファイル名

 

そして、このtarファイルからもう一つのディストロを作ります。

コマンド: Power Shell か コマンドプロンプトで実行

wsl --import DebianWSL C:\myWSL\WSL1\ .\DebianWSL.tar

書式: wsl --import 新ディストロ名 インストール先ディレクトリ tarファイル名

 

WSL2として作れるオプション[--version <バージョン>]がある!

wsl --import DebianWSL2 C:\myWSL\WSL2\ .\DebianWSL.tar --version 2

 

確認:

wsl -l --verbose

 

 

やっぱりヘルプは大事!

 

 

 

 

 

 

WSLチップ : ディストリビューションとユーザー名を指定して起動する

WSLをインストールするとWindowsのユーザーでWSLの方もログインします。

そうするとスーパーユーザーで作業をするには「sudo」を使わないといけません。

rootで初めからログインできないものかwsl.exeのヘルプを見てみたら、ありました。

 

コマンド: Power Shell または コマンドプロンプトで実行

wsl -d Debian -u root

 

オプション

-u : ログインするユーザー名

 

ヘルプ、大事ですね。

 

 

 

 

 

 

Asymptote 《関数編》

line bisector() -- 二等分線を作る -- import geometry

line bisector(point , point) :二つの点でできる線分の垂直二等分線を作る

point P=(4,0) , Q=(0,5);
dot("$P$",P,E);
dot("$Q$",Q,W);

line m = bisector(P,Q);
draw(m);

となれば,垂直の記号を図に書き込みたくなります。

line p = line(P,Q);
point M = intersectionpoint(p,m);
markrightangle(p.A , M , m.A , size=5mm);

draw(P--Q , dashed);

のように,markrightangle(point , point , point) 関数を使えば実現できます。生成された直線で直線上の点があらわでなくても,m.A のように指定することができます。
 ついでに,PM=QM を表す記号もつけたくなります。
 上記の draw 関数の引数を下記のように変えます。また,点M も表示します。

draw(P--Q,dashed, StickIntervalMarker(2,2));

dot("$M$",M ,2S+.5W);

 P--Q のように線分を表すのは無骨すぎると思うときには, segment(P,Q) のように表すこともできます。
 StickIntervalMarker(int , int) 関数の第1引数は,線分の分割数を指定しています。二等分するときには "2" を指定します。第2引数は,記号の線の本数を指定しています。"3" にすれば3本線の記号が表示されます。

line bisector(line , line) :二つの直線でできる角のうち,指定した2直線で時計回りにできる角の二等分線を作る

point P=(0,4), Q=(5,0);
line p = line(P,Q);
dot("$P$",P,E+.5N);dot("$Q$",Q,E+.5N);draw("$p$",p);
line l = line((0,0),(5,3));
draw(l);

point M = intersectionpoint(p,l);

line m = bisector(p,l);
draw("$m$",m);

dot("$M$",M ,2S);

 もう一方の角の二等分線は,line bisector(line , line , real) 関数の第3引数を "90" にして,90度回転させることで得ることができます。

line m = bisector(p,l,90);
draw("$m$",m);

dot("$M$",M ,2W);

 次に,角が等しい記号を書いてみましょう。

  • 直角を表す関数は,
    markrightangle(point , point , point)
    でした。
  • 弧を描いて等しい角を表す関数は,
    markangle(point , point , point , StickIntervalMarker(i=2,n=1))
    です。

 markangle 関数で,弧を描き,StickIntervalMarker 関数で,短い線分を描きます。
 StickIntervalMarker 関数の引数のうち,"i=2" は,指定された角を分割して描く線分の個数です。もう一つの引数 "n=1" は,短い線分の本数を指定します。

markangle(l.A , M , p.B , StickIntervalMarker(i=2,n=1));

 弧の半径が大きいようです。半径を半分に,また,描く弧を2重線にしてみましょう。

markangle(2 , radius=0.5*markangleradius() ,
          l.A , M , p.B , StickIntervalMarker(i=2,n=1));

 弧を描くためだけに,2直線 l と p の交点 M を求めていました。交点を使わず,2直線で角を指定できます。

markangle(2 , radius=0.5*markangleradius() ,
          l , p , StickIntervalMarker(i=2,n=1));

 直線 l の起点が逆のようです。そこで,

markangle(2 , radius=0.5*markangleradius() ,
          reverse(l) , p , StickIntervalMarker(i=2,n=1));


 うまくできました。


line perpendicular() -- 垂線を作る -- import geometry

line perpendicular(point , line) :point を通り,line に垂直な直線を作る

triangle triangle() -- 三角形を作る -- import geometry

triangle t = triangle(point , point , point) :三点を指定して三角形を作る


point P=(4,0) , Q=(0,1) , R=(3.5,3);
triangle t = triangle(P,Q,R);
show(t);

 のように,インスタンス t を作った場合でも,各点の名前は引数の順に点A,点B,点Cとなり,辺を参照する変数もそれぞれ t.BC , t.CA , t.AB となります。また,点に向かい合う辺に小文字の名前 "a","b","c" が与えられます。

triangle t = triangle(real , real , real) :三辺の長さを指定して三角形を作る


triangle t = triangle(3 , 4 , 5);
show(t);

circle circle();-- 円を作る -- import geometry

  • circle circle(point , real):中心 と 半径 で円を作る
  • circle circle(point , point):直径とする2点で円を作る
  • circle circle(point , point , point):3点を通る円を作る
  • circle incircle(point , point , point): 3点でできる三角形の内接円を作る

全て1度に作ってしまいます。

3点A,B,C,を指定し、点Aを中心とする円がC1、辺ACを直径とする円がC2、三角形の外接円がC3そして、三角形の内接円がC4です。


import geometry;
size(7cm,0);

point A=(4,3), B=(0,0), C=(5,0);

triangle t = triangle(A,B,C);
draw(t, red);
dot("$A$", A,S+.5W);
dot("$B$", B,W);
dot("$C$", C);

circle c1 = circle(A, 1);
draw(c1);
dot("$C_1$",c1.C,N);

circle c2 = circle(A, C);
draw(c2);
dot("$C_2$",c2.C,NE);

circle c3=circle(A,B,C);
draw(c3);
dot("$C_3$",c3.C,2W);

circle c4=incircle(A,B,C);
draw(c4);
dot("$C_4$",c4.C,N);

line tangent();-- 円の接線を作る -- import geometry

円cの中心 c.C と円の中心以外の点Pを結ぶ半直線と円cとの交点Tは、

point T = point(c, P);

で得ることができます。



import geometry;
unitsize(1cm);

circle c = circle((0,0), (3,0));
point P = (2,0);

point T = point(c, P);

draw(c);
dot("$c.C$", c.C, W);
dot("$P$", P);

dot("$T$", T);


2種類の接線を引きます。

円周上の1点に接する接線と、円の外側の1点から引く接線です。

  • line tangent(circle, point) :半直線c.CPと円との交点での接線を作る
  • line[] tangents(circle, point) :外部の点Pを通る接線を作る



import geometry;
unitsize(1cm);

circle c = circle((0,0), 2);
point P = (5,-3);

point T = point(c, P);
// 点Tを接点とする接線を求める。
line l = tangent(c, P);
draw("$l$", l);

// 外部の点Pを通る接線の、接点を求める。
point[] Tm = intersectionpoints(c, circle(c.C, P));

line[] m = tangents(c, P);

draw(m[0]);
dot("$T_1$", Tm[0], S);
draw(m[1]);
dot("$T_2$", Tm[1], NE);

draw(c);
dot("$c.C$", c.C, W);

dot("$T$", T, W);
dot("$P$", P, S+W);

座標軸

座標軸の表示の基本

 まずは座標軸だけを描いて見ましょう。以後は、縦10cm、横10cm の大きさに固定します。

unitsize(x=1cm);
import graph;  

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;

xlimits( Xmin, Xmax);
ylimits( Ymin, Ymax);
xaxis();
yaxis();

labelx("$O$",0,SW);
dot((0,0));

 まず矢印とx、yの表示を加えてみましょう。

xaxis(Label("$x$",align=2E), Arrow(2mm));
yaxis(Label("$y$",align=2N), Arrow(2mm));

 次は、目盛りをつけます。

xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true), Arrow(2mm));

 おや?矢印の表示のために5mmほど先端が延びて、目盛りがついてしまうようですね。
では、Xmax の値を少し減らしてみましょう。

xlimits( Xmin, Xmax - .1);

 ついでに、y軸のほうは目盛りだけで、数値なしにしてみます。

yaxis(Label("$y$",align=2N), Ticks("%", begin=false, end=true),Arrow(2mm));

 目盛りの線の長さを調節したいですね。
長いほうは、『Size=‥』
短いほうは、『size=‥』
で指定できます。

xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));

 ここまでのソースを書いておきます。

unitsize(x=1cm);
import graph;  

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;

xlimits( Xmin, Xmax - .1);
ylimits( Ymin, Ymax - .1);
xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
yaxis(Label("$y$",align=2N), Ticks("%", begin=false, end=true),Arrow(2mm));

labelx("$O$",0,SW);
dot((0,0));

関数のグラフ

関数の定義
real f(real x) {return x^2/5;}

のように定義できます。

 グラフを描画するには、
graph(f,Xmin,Xmax)
を、draw()の引き数に与えます。

draw(graph(f,Xmin,Xmax));

 ソース

unitsize(x=1cm);
import graph;  

/************************************************************
 *  座標軸の描画を関数定義しました。
 *         使用する前に定義しておく必要があります。
 ************************************************************/
void myAxis(real Xmin, real Xmax, real Ymin, real Ymax) {
  xlimits( Xmin, Xmax - .1);
  ylimits( Ymin, Ymax - .1);
  xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
  yaxis(Label("$y$",align=2N), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
  labelx("$O$",0,SW);
  dot((0,0));
}
/***********************************************************/

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;


real f(real x) {return x^2/5;}
draw(graph(f,Xmin,Xmax),red);

myAxis(Xmin, Xmax, Ymin, Ymax);