投稿者「mars」のアーカイブ

量子コンピューター関連リンク

** シミュレータを作りながら量子コンピュータの仕組みを理解する
https://qiita.com/ohtaman/items/e121a2b0b4525b85b54d

WSL2の環境でAdafruit FT232H Breakoutを利用する

Adafruit FT232H Breakoutを使うことで、USB I/F経由でGPIO/I2C/SPIの機能を利用できるようになります。WSL2上のUbuntu22.02で、Adafruit FT232H Breakoutを動かしてみました。

準備:WSL2でUSBデバイスを利用するには、あらかじめWindows側での準備が必要です。

STEP1 usbipdのインストール

Windows 管理者として次を実行

>winget install –interactive –exact dorssel.usbipd-win

インストールしたらWindowsを再起動

WSLで次を実行

sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

STEP2 Adafruit FT232H BreakoutのWindows driverをインストール

FT232H を接続してUSB Seria Converterの認識を確認。

>usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
1-2    1ea7:0066  USB 入力デバイス                                              Not attached
1-3    0403:6014  USB Serial Converter                                          Not attached

STEP3 USB Seria ConverterをWSL側へ接続する。管理者権限で次を実行

windows10 コマンドラインから管理者モードを起動

コマンドプロンプトで、以下のコマンドを実行する。
powershell start-process cmd -verb runas

Windows10/11の破損したシステムファイルを修復

管理者権限のPowershellから次を実行

sfc /scannow

Windows リソース保護により、破損したファイルが見つかりましたが、それらの一部は修復できませんでした。
オンライン修復の場合、詳細は次の場所にある CBS ログ ファイルに含まれています
windir\ Logs\CBS\CBS.log (たとえば C:\Windows\Logs\CBS\CBS.log)。オフライン修復の場合、
詳細は /OFFLOGFILE フラグによって指定したログ ファイルに含まれています。

RaspberryPi4で2軸ステッピングモータの制御とUSBカメラの画像処理を試してみる。

カメラ用レンズを2軸マウントへ
import cv2
import time
import pigpio
import datetime
import threading
import os

pi = pigpio.pi()
sMin=0.005
sMax=0.0002
STP1 = 19
DIR1 = 13
EBL1 = 12
STP2 = 18
DIR2 = 24
EBL2 = 4
M=1/32   # microstep
N=200   # stepper
FOV = 20 # Field of view
R=M*360/N       # 1-Stepの回転角度
RR= 1 / R       # 1度の回転に必要なSTEP数
pX=0
pY=0
cAz = 0
cEv = 0
track = False
mode ='F'
reverse = False
Limit = False
circle = True
th = 170
LowEv,HighEv = 0, 80
RightAz, LeftAz = 0,100
cAz, cEv = 0, 0
oAz, oEv = 55, 45
pi.set_mode(STP1,pigpio.OUTPUT)
pi.set_mode(DIR1,pigpio.OUTPUT)
pi.set_mode(EBL1,pigpio.OUTPUT)
pi.set_mode(EBL2,pigpio.OUTPUT)
pi.set_mode(STP2,pigpio.OUTPUT)
pi.set_mode(DIR2,pigpio.OUTPUT)
delay_Az = 0.0005
delay_Ev = 0.002

def goto(oAz,oEv):
    global cAz,cEv,STP1,STP2,DIR1,DIR2,delay_Az,delay_Ev
    tA, tE = oAz - cAz, oEv - cEv
    rotAz(tA)
    rotEv(tE)

def key(k):
    global cAz,cEv,STP1,DIR1,STP2,DIR2,th
    global track,reverse,circle,dW,dH,Limit
    global LowEv,HighEv ,RightAz, LeftAz
    if k == ord('b'):
        cAz = 0
        cEv = 0
    elif k == ord('j') or k==81:
        rotAz(-0.5625)
    elif k == ord('J'):
        LeftAz=round(cAz,1)
    elif k == ord('k') or k==83:
        rotAz(0.5625)
    elif k == ord('K'):
        RightAz=round(cAz,1)
    elif k == ord('h'):
        rotAz(-5.625)
    elif k == ord('l'):
        rotAz(5.625)
    elif k == ord('i') or k==82:
        rotEv(1)
    elif k == ord('I'):
        HighEv=round(cEv,1)
    elif k == ord('m') or k==84:
        rotEv(-1)
    elif k == ord('o'):
        goto(30,40)
    elif k == ord('M'):
        LowEv=round(cEv,1)
    elif k == ord('a'):
        th = th - 2
    elif k == ord('s'):
        th = th + 2
    elif k == ord('t'):
        track = not track
    elif k == ord('p'):
        Limit = not Limit
    elif k == ord('r'):
        reverse = not reverse
    elif k == ord('@'):
        print('AzL=',round(LeftAz,1),',AzR=',round(RightAz,1),',EvH=',round(HighEv,1),',EvL=',round(LowEv,1))
    elif k == ord('c'):
        cAz, cEv = 10, 22
        LeftAz, RightAz = -9, 157
        HighEv, LowEv = 70, 20
    elif k == ord('z'):
        tmp=input()
        tmp=tmp.split(',')
        cAz = float(tmp[0])
        cEv = float(tmp[1])
    elif k == ord('x'):
        tmp=input()
        tmp=tmp.split(',')
        dW = float(tmp[0])
        dH = float(tmp[1])
        mH, mW = dH - cEv, dW - cAz
        print('Az:',cAz,' Ev:',cEv,' dW:',mW,' dH:',mH)

        rotAz(mW)
        rotEv(mH)
        cAz, cEv = dW, dH

def do_move(N,STP,delay):
    #print(N,STP,delay)
    for i in range(N):
        pi.write(STP,1)
        time.sleep(delay)
        pi.write(STP,0)
        time.sleep(delay)
    pi.write(EBL1,0)

def check(Az,Ev):
    global LowEv,HighEv ,RightAz, LeftAz
    AzR,AzL,EvH,EvL = False,False,False,False
    f = False
    if Az> RightAz:
        AzR, f =True, True
    if Az< LeftAz:
        AzL, f=True, True
    if Ev>HighEv:
        EvH, f=True, True
    if Ev<LowEv:
        EvL, f=True, True
    return f,AzR,AzL,EvH,EvL

def rotAz(deg):
    pi.write(EBL2,1)
    rot(deg,STP2,DIR2, delay_Az)

def rotEv(deg):
    pi.write(EBL1,1)
    #time.sleep(0.5)
    rot(deg,STP1,DIR1, delay_Ev)

def rot(deg,STP,DIR,delay):
    global cEv,cAz,LeftAz,LowEv,HighEv
    tmp=deg
    if tmp<0:
        dDIR=1
        tmp=-tmp
    else:
        dDIR=0

    if STP==STP2:
        N=int(0.5+200*32*tmp/360)
        if Limit:
            if AzL and (cAz > LeftAz):
                N = 0
            if AzR and (cAz < RightAz):
                N = 0
        if N != 0:
            cAz=cAz+deg
    else:
        N=int(0.5+48*120*tmp/360) # 48/360 1/120 gear and Full STEP
        if Limit:
            if EvL and (cEv<LowEv):
                N = 0
            if EvH and (cEv>HighEv):
                N = 0
        if N != 0:
            cEv=cEv+deg
    pi.write(DIR,dDIR)
    do_move(N,STP,delay)
    #thread2 = threading.Thread(target= do_move,args=(N,STP,delay,))
    #thread2.start()

def jyusin(img):
    global W2,H2
    mu = cv2.moments(img, False)
    try:
        x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
        c=(0,255,0)
        focus = True
    except ZeroDivisionError:
        x = W2
        y = H2
        c=(0,0,255)
        focus = False
    return focus,x,y,c

def finish(n):
    global writer,track,Limit,f_name
    print(f_name,'closed')
    writer.release()
    new_name=f_name.replace('.avi','-'+str(n)+'.avi')
    os.rename(f_name,new_name)
    writer ,f_name= None, ""
    track = False
    Limit = False
    goto(55,50)
    track = True
    Limit = True

fontFace =cv2.FONT_HERSHEY_SIMPLEX
# VideoCapture オブジェクトを取得します
capture = cv2.VideoCapture(0)
#capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'mp4v')
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
# 幅
W = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
# 高さ
H = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
print('Size W:',W,'  H:',H)
half = False
W2, H2 = int(W/2), int(H/2)
WW, HH = W2, H2
if W>1024:      # resize
    W2, H2=int(W/4), int(H/4)
    half = True
fourcc = cv2.VideoWriter_fourcc(*'h264')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
#fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = None
PATH="/home/mars/pWork/"
AzR,AzL,EvH,EvL = False,False,False,False
f_name=""
i=0
white,blue,red,green=(255,255,255),(255,0,0),(0,0,255),(0,255,000)
config='optrack.ini'
if os.path.exists(config):
    f = open(config)
    s = f.read()
    t = s.split(',')
    cAz, cEv, LowEv, HighEv ,RightAz, LeftAz = float(t[0]),float(t[1]),float(t[2]),float(t[3]),float(t[4]),float(t[5])

while(True):
    ret, frame = capture.read()
    if half:
        frame = cv2.resize(frame, dsize=(WW, HH))
    now=datetime.datetime.today()
    if reverse:
        img1 =  cv2.cvtColor(cv2.bitwise_not(frame) ,cv2.COLOR_BGR2GRAY)
    else:
        img1 = cv2.cvtColor(frame ,cv2.COLOR_BGR2GRAY)
    # 二値化(閾値100を超えた画素を255にする
    ret, img_th = cv2.threshold(img1, th, 255, cv2.THRESH_BINARY)
    cv2.imshow('frame2',img_th)
    k=cv2.waitKey(1) & 0xFF
    key(k)
    if k == ord('q'):
        break

    # 重心検出
    focus,x,y,c = jyusin(img_th)
    cc = white
    if focus:
        if track:
            i=i+1
            if writer is None:
                f_name ='video/'+now.strftime("%Y-%m-%d_%H:%M:%S")+'.avi'
                writer=cv2.VideoWriter(f_name, fourcc, 15, (WW,HH))
                print('Record Start:',f_name)
                time_start = time.time()
            else:
                writer.write(frame)
                cc = green
                if (time.time() - time_start) >20:
                    finish(i)
                    i = 0
        else:
            if writer is not None:
                finish(i)
                i = 0

    else:
        if (writer is not None):
            writer.write(frame)
            if  ((time.time()- time_start)>20):
                finish(i)
                i = 0

    if circle:
        cv2.circle(frame, (x,y), 4, color=c, thickness=1)
        cv2.circle(frame, (x,y), 10, color=c, thickness=1)
        cv2.circle(frame, (x,y), 16, color=c, thickness=1)

    f, AzL,AzR,EvH,EvL=check(cAz,cEv)
    cf = green
    if f:
        cf = red
    dW = (WW*0.5 - x)*0.001
    if track and abs(dW)>0.02:
        rotAz(-dW)    #  cAz = cAz + dW * R

    dH = (HH*0.5 - y)*0.001
    if track and abs(dH)>0.02:
        rotEv(dH)     # cEv = cEv + dH*R

    text='T:'+str(track)+' L:'+str(Limit)+' '+now.strftime("%H:%M:%S")+ ' TH=' +str(th)+'  X='+str(x)+'  Y='+str(y)+" F#:"+str(i)+" File:"+f_name
    text2="Az:"+str(round(cAz,2))+"  Ev:"+str(round(cEv,2))+" F:"+str(f)+"  AzL:"+str(AzL)+" AzR:"+str(AzR)+" EvH:"+str(EvH)+" EvL:"+str(EvL)
    text3="Az_step:"+str(round(dW,2))+"  Ev_step:"+str(round(dH,2)) + " Video Reverse:" + str(reverse)
    text4="AzL:"+str(LeftAz)+" AzR:"+str(RightAz)+" EvH:"+str(HighEv)+" EvL:"+str(LowEv)
    img = cv2.putText(frame, text, (10,20), fontFace, 0.5,color=cc)
    img = cv2.putText(frame, text2, (10,40), fontFace, 0.5,color=cf)
    img = cv2.putText(frame, text3, (10,60), fontFace, 0.5,color=cc)
    img = cv2.putText(frame, text4, (10,80), fontFace, 0.5,color=cc)
    cv2.imshow('frame',img)

print('Done!')
f=open(config,'w')
msg=str(cAz)+','+str(cEv)+','+str(LowEv)+','+str(HighEv)+','+str(RightAz)+','+str(LeftAz)
f.write(msg)
f.close()
capture.release()
if writer is not None:
    writer.release()
cv2.destroyAllWindows()
pi.write(EBL1,0)
pi.write(EBL2,0)

WSLでUSBデバイスを使う

参照URL: WSL2 USBカメラ+他のUSB機器 2022年09月06日版

USBデバイスの種類によっては、カーネル再構築が必要のようだ。https://zenn.dev/pinto0309/articles/e1432253d29e30

>usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
1-4    03c3:290a  ZWO ASI290MC Camera                                           Not attached
1-6    31b2:0010  KT USB Audio, USB 入力デバイス                                Not attached
1-8    8087:0a2a  インテル(R) ワイヤレス Bluetooth(R)                           Not attached
2-3    05e3:0749  USB 大容量記憶装置                                            Not attached
4-1    056e:00e7  USB 入力デバイス                                              Not attached
4-2    328f:2015  eMeet Nova, USB 入力デバイス                                  Not attached
5-2    1908:2220  USB 大容量記憶装置, USB2.0 Device, USB 入力デバイス           Not attached
5-3    1b1c:1b73  USB 入力デバイス                                              Not attached
5-4    8086:0808  USB PnP Sound Device, USB 入力デバイス                        Not attached

deviceのattach

>usbipd wsl attach --busid 4-2
usbipd: info: Using default WSL distribution 'Ubuntu-20.04'; specify the '--distribution' option to select a different one.

>usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
1-6    31b2:0010  KT USB Audio, USB 入力デバイス                                Not attached
1-8    8087:0a2a  インテル(R) ワイヤレス Bluetooth(R)                           Not attached
1-12   03c3:290a  ZWO ASI290MC Camera                                           Not attached
2-3    05e3:0749  USB 大容量記憶装置                                            Not attached
4-1    056e:00e7  USB 入力デバイス                                              Not attached
4-2    328f:2015  eMeet Nova, USB 入力デバイス                                  Attached - Ubuntu-20.04
5-2    1908:2220  USB 大容量記憶装置, USB2.0 Device, USB 入力デバイス           Not attached
5-3    1b1c:1b73  USB 入力デバイス                                              Not attached
5-4    8086:0808  USB PnP Sound Device, USB 入力デバイス                        Not attached

ビデオデバイス:wsl2_linux_kernel_usbcam_enable_conf

https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf

起動しなくなったWSL2を復活させるまでにしたあれこれ

https://zenn.dev/karaage0703/articles/e30c9614a55bdb#.wslconfig%E3%82%92%E9%80%80%E9%81%BF%E3%81%97%E3%81%A6%E5%BE%A9%E5%B8%B0

.wslconfigを退避して復帰で救われた! ユーザ/xxxxx/.wslconfig

参考情報 USBカメラの情報をv4l2-ctl取得・設定

Ubuntu 20.04 LTSでUSB接続のWEBカメラを使う

v4l2-ctlで行うUSBカメラ設定方法まとめ

// 利用可能なWEBカメラの一覧を表示しています
$ v4l2-ctl --list-devices
//#デバイスの全ての情報を表示します
v4l2-ctl -d /dev/video2 --all

// 接続しているUSBカメラの全情報出力
$ v4l2-ctl --all
// USBカメラが対応している設定項目一覧を確認するには

$ v4l2-ctl -L

設定の確認は以下で行います。
$ v4l2-ctl -C <設定項目名>

設定は以下で行います。
$ v4l2-ctl -c <設定項目名>=値

解像度とフレームレートの取得
$ v4l2-ctl --list-formats-ext

ADSBの電波を受信し、航空機の画像を撮影

利用ソフトdump1090-fapysynscan + 自作のpythonスクリプト

ADSB受信用SDR:RTL-SDR RTL2832U

カメラ制御用経緯台 SkyWatcherのAz-GTi

カメラ:ASI1600MC-COOL + カメラ用レンズ

撮影画像例:距離 10000m程度

おまけ

スマホで航空機を撮影:距離500m程度??

撮影場所、時刻、方向:スマホのGPS情報、加速度センサー等から取得

アメダスは:降水量を観測する観測所は全国に約1,300か所

問題点:

(1)経緯台の回転速度が比較的遅いので、カメラの指向が間に合わないことがある。

(2)航空機までの距離が遠いことが多く、200mm程度の望遠レンズでは、画像から機種の判別は困難

STEP1:ADSBの電波を受信し、航空機のICAOコードと位置(緯度、経度、高度)を取得。

STEP2:航空機の位置(緯度、経度、高度)と、観測場所の緯度、経度から航空機が見える方位と見上げ角度を計算。

STEP3:経緯台のモータを、航空機の方向に向ける。

STEP4:画像を撮影

# -*- coding: utf-8 -*-
from  math import *
import time,datetime
import os
import socket
import logging
import synscan
from optparse import OptionParser

PORT = 30003           # Running dump1090-fa
host = '192.168.68.61' #
BUFFER_SIZE = 1024

R_EARTH = 6378137
RAD = 3.14159265 / 180
LAT0,LON0=35.7973, 139.4462

parser = OptionParser()
parser.add_option("-r","--range",action="store",dest="MAX", default=0,type="int",help="Max range")
parser.add_option("-t","--tilt",action="store",dest="TILT_MIN", default=1,type="float",help="Min tilt")
(opts, args) = parser.parse_args()
MAX=opts.MAX
TILT_MIN=opts.TILT_MIN
#MAX = 20000
if MAX == 0:
    TEST = True
    pH,pT = 0,0
    MAX = 50000
    print("Test mode")
else:
    TEST = False
    smc=synscan.motors(udp_ip='192.168.68.200', udp_port=11880)
    pH,pT = smc.axis_get_pos(1),smc.axis_get_pos(2)
    print('Last PAN,TILT:',pH,pT)

H_MIN ,T_MIN = 0.1, 0.1

def distance(lat1,lon1,lat2,lon2):
    lat1,lat2 = lat1*RAD, lat2*RAD
    lon1,lon2 = lon1*RAD, lon2*RAD
    lat_c = (lat1 + lat2) / 2
    try:
       dx = R_EARTH*(lon2-lon1)*cos(lat_c)
       dy = R_EARTH*(lat2-lat1)
    except:
        dx,dy = 100000, 100000
        pass

    return sqrt(dx*dx + dy*dy)

def azimuth(y1,x1,y2,x2):
        x1=radians(x1)
        y1=radians(y1)
        x2=radians(x2)
        y2=radians(y2)

        deltax = x2 - x1
        ans = degrees(atan2(sin(deltax),(cos(y1)*tan(y2)-sin(y1)*cos(deltax))))%360
        return ans

Buf = {}
dBuf= {}
T_MAX, L_MAX = 0.5,10
dH, dT = 0, 0
start=time.time()
TGT=None
seq = 0
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((host, PORT))
    while True:
        str = s.recv(BUFFER_SIZE).decode()
        if 'MSG,3' in str:
            t = str.split(',')
            try:
                ID, Lat, Lon, Alt = t[4],t[14],t[15],t[11]
                LAT=float(Lat)
                LON=float(Lon)
                ALT=float(Alt)
            except:
                LAT, ALT = 0, 0
                pass
            if LAT>0 and ALT>0:
                dist = round(distance(LAT0, LON0, LAT, LON),1)
                if dist<MAX:
                    houi = round(azimuth(LAT0, LON0, LAT, LON),1) + 5 + dH
                    tilt = round(degrees(atan(ALT*0.3048/dist)),1) + 3 + dT
                    Buf[ID] ={'TIME':round(time.time(),0),'DIST':dist,'PAN':houi,'TILT':tilt}
                    dBuf[ID]=dist
                else:
                    pass
            if time.time()-start > T_MAX:
                now = time.time()
                start = time.time()
                os.system('clear')

                print('---',datetime.datetime.now(),'---','ICAO:',TGT,' PAN:',pH,' TILT:',pT)
                for k,v in list(Buf.items()):
                    last = Buf[k]['TIME']
                    if now - last > L_MAX:
                        print('deleted..',k)
                        del Buf[k]
                        if k == TGT:
                            TGT = None
                print('TGT:',TGT)
                for k,v in Buf.items():
                    if (TGT is None) or (TGT not in Buf):
                        TGT = k
                        print('New target:',TGT)
                        seq = 1
                        dH, dT = 0,0
                    print(k,v)
        if TGT is not None and TGT in Buf:
            houi, tilt = Buf[TGT]['PAN'], Buf[TGT]['TILT']
            #pH,pT = smc.axis_get_pos(1),smc.axis_get_pos(2)
            dH, dT = round(pH - houi,1), round(pT - tilt,1)
            if (abs(dH)>H_MIN or abs(dT)>T_MIN) and tilt>TILT_MIN and (houi<200 and tilt<80):
                pH, pT = houi, tilt
                print('*',TGT, houi,'(',dH,')', tilt,'(',dT,')','SEQ:',seq)
                seq = seq + 1
                if not TEST :
                    smc.goto(houi,tilt,syncronous=False)
            else:
                pass

WSL内のサーバへ外部PCから接続

ssh serviceの自動起動設定

https://buzz-server.com/tech/ubuntu-ssh/

echo 'none none rc defaults 0 0' | sudo tee -a /etc/fstab
echo '#!/bin/bash' | sudo tee /sbin/mount.rc
echo 'sudo service ssh start' | sudo tee -a /sbin/mount.rc
sudo chmod +x /sbin/mount.rc

$sudo ssh-keygen -A を実行

password認証を有効にするには、/etc/ssh/sshd_configを修正する。

ポート転送の設定PowerShell スクリプト

https://neos21.net/blog/2021/07/20-01.html

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

$ip = bash.exe -c "ip r |tail -n1|cut -d ' ' -f9"
if( ! $ip ){
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

# All the ports you want to forward separated by comma
$ports=@(22,8501,8888);
$ports_a = $ports -join ",";

# Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

# Adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=* connectport=$port connectaddress=$ip";
}

# Show proxies
iex "netsh interface portproxy show v4tov4";

ポート転送の削除  netsh.exe interface portproxy delete v4tov4 listenport=22

Windows FireWallの設定(解放)

https://qiita.com/DR623G/items/20e1d95e25e4ae658a33

netsh advfirewall firewall add rule name="WSL2" dir=in action=allow protocol=TCP localport=22

設定の確認

netsh advfirewall firewall show rule name="WSL2" verbose

GoLang実行速度の実測(Python,PHPと比較)

素数を求める

PHP
Counts; 9592
Start: 1665640247.3987, End: 1665640871.2338
Elapsed: 623.83505320549

python
見つかった素数の数は9592 個です。
かかった時間は712.5231149196625秒です。

mars@ps2:~/work $ python3 prime.py
見つかった素数の数は9592 個です。
かかった時間は771.8856158256531秒です。

golang
見つかった素数の数は9592個です。
かかった時間は12.71028914秒です。