0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

図形問題 平成25年度(2013)岐阜県数学問4「正答率0%の図形問題【高校入試なのに超難問】」(その2/2)をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-12-30

長文です。再チャレンジです。今回作図しました。
ページ最後の私の感想 だけでも、読んでもらえれば幸いです。

(その1/2 )のつづきです。旧いです。
(類題翌年)平成26年度(2014年)洛南

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

オリジナル PASSLABO 様

(途中5:10〜12:46)
解法その1,2,3からです。図形問題のポイントをスキップしています。
https://youtu.be/49z7Nj22ugE?t=310 解法その1 5:10
https://youtu.be/49z7Nj22ugE?t=549 解法その2 9:09
https://youtu.be/49z7Nj22ugE?t=613 解法その3 10:13 (高校数学)
PASSLABO 様 (フル0:00〜12:46)
https://youtu.be/49z7Nj22ugE

sympyで

・ver0.21 その1 AB=3x,△AHB∽△AHB,△AHBと△AHBのAH共通 8:27

# ver0.21 その1 AB=3x,△AHB∽△AHB,△AHBと△AHBのAH共通 8:27  
from sympy import *
var('x,y',positive=True)
print("#",solve([Eq(3*x,Rational(10,6)*(x+y)),Eq((3*x)**2-(x+y)**2,8**2-y**2)],[x,y])[0][0])
# sqrt(10)

・ver0.22 その1 AB=3x,△AHB∽△AHB,方べきの定理 8:34

from sympy import *
var('x,y',positive=True)
print("#",solve([Eq(3*x,Rational(10,6)*(x+y)),Eq(x*2*y,8*2)],[x,y])[0][0])
# sqrt(10)

・ver0.23 その2 AB=3x,△AHB∽△AHB,,∠BAH 角の二等分線の定理 9:10

# ver0.23 その2 AB=3x,△AHB∽△AHB,,∠BAH 角の二等分線の定理 9:10  
from sympy import *
var('x,y,AH',positive=True)
sol      =solve([Eq(3*x ,Rational(10,6)*(x+y)),Eq(3*x/x,AH/y)],[AH,y]   )
print("#",solve( Eq(8**2,sol[AH]**2+sol[y]**2)                ,[x]  )[0])
# sqrt(10)

・ver0.24 その2 AB=3x,△BECは二等辺三角形,直角三角形△ABC 9:40

# ver0.24 その2 AB=3x,△BECは二等辺三角形,直角三角形△ABC 9:40  
from sympy import *
var('x',positive=True)
print("#",solve( Eq(10**2,(3*x)**2+(x**2)),[x])[0])
# sqrt(10)

・ver0.25 その3 高校数学強さ 2倍角の定理 10:10

# ver0.25 その3 高校数学強さ 2倍角の定理 10:10  
from sympy import *
var('x,θ',positive=True)
EH=8*sin(θ)
eq_baikaku=Eq(cos(2*θ),Rational(8,10))
eq_houbeki=Eq(x*2*EH,8*2)
print("#",solve([eq_baikaku,eq_houbeki],[x,θ])[0][0])
# sqrt(10)

オリジナル 高校入試虎の穴 様

>延長して交点F...
>角の二等分線
>AFは8√10/3...
https://youtu.be/Q8_S-LZGdjM?t=685  (途中11:25〜17:40)問4(1)からです。
https://youtu.be/Q8_S-LZGdjM?t=750  (途中12:30〜17:40)問4(2)(ア)からです。
高校入試虎の穴 様 (フル0:00〜22:41)
https://youtu.be/Q8_S-LZGdjM

sympyで

・ver0.3
・角の二等分線の定理

# ver0.3 高校入試虎の穴 様
from sympy import *
var('AH,degABD,degACD,degR,x',)
degABD=degACD #弧ADの円周角
print("#(1)    ",Triangle(asa=(degABD,AH,degR)).is_similar(Triangle(asa=(degACD,AH,degR))))
AC,CD=10,6
AD   =sqrt(AC**2-CD**2)
print("#(2)(ア)",AD)
AE=AD
CF=CD*AC/(AC+AD)                      # 角の二等分線の定理
FD=CD*AD/(AC+AD);AF=sqrt(AD**2+FD**2)
x =solve(Eq(x/AE,CF/AF),x)[0]
print("#   (イ)",x)
#(1)     True
#(2)(ア) 8
#   (イ) sqrt(10)

sympyで(いつもの方法で)

ver0.41 弦が4つある内の一つ (直経ACをx軸方向)

・点Hを使っていない。
・<仮称>さしごの直角三角形の ダブル三平方 に同じ。円と円の交点計算で対応しました。

#  ver4.1 弦が4つある内の一つ (直経ACをx軸方向)  
from sympy import *
var('t',real=True,positive=True)
AC,CD=10,6
r = AC*Rational(1,2)
DA=sqrt(AC**2-CD**2)
O,A,C=map(Point,[(0,0),(-r,0),(r,0)])
D=Circle(A,DA).intersection(  Circle(C,CD)  )[1]   
E=A+DA*(O-A).unit
B=Circle(O,r).intersection(Line(D,E))[1]
print("#",B.distance(E),float(B.distance(E)))
# sqrt(10) 3.1622776601683795

ver0.7 弦が4つある内の一つ (弦CDをx軸方向)

・仮t=∠OCD,∠ODC

# ver0.7 sympy風。弦が4つある内の一つ (弦CDをx軸方向) 
from sympy import *
var('t',real=True,positive=True)
AC,CD=10,6
r=Rational(AC,2)
t=solve(Eq((CD*Rational(1,2))/r,cos(t)),t)[1]
O,C,D=map(Point,[(0,0),(-r*cos(t),-r*sin(t)),(r*cos(t),-r*sin(t))])
A=C+2*(O-C)
H=Circle(A.midpoint(D),A.distance(D)*Rational(1,2)) \
  .intersection(Line(A,A+((C-A).unit+(D-A).unit)*Rational(1,2)))[0]
B=Circle(O,r).intersection(Line(H,D))[0]
E=Line(A,C)  .intersection(Line(H,D))[0]
print("#",B.distance(E),float(B.distance(E)))
# sqrt(10) 3.1622776601683795

ver0.8 できませんでした。無理があるかも。ver0.6 弦が4つある内の一つ

・点Hを使わない方がいい

# できませんでした。無理があるかも。ver0.8 弦が4つある内の一つ (弦BDをx軸方向) 
from sympy import *
var('x,y',real=True,positive=True)
AC,CD=10,6
r =Rational(AC,2)
BD=Rational(1,2)*(x+2*y)
O,B=map(Point,[(0,0),(-BD/2,-sqrt(r**2-(BD/2)**2))])
D  =Point(-B.x,B.y)
E  =B+Point(x,0)
A  =E+2*(O-E)
C  =A+AC*(O-A).unit
# print(Eq(C.distance(D),CD))
sol=solve(Eq(C.distance(D),CD),x)
print(sol)

できませんでした。無理があるかも。ver0.9 連立方程式

・ >直角三角形に注目していいですし、.....
・点Hを使わない方がいい

# できませんでした。無理があるかも。ver0.9 連立方程式
from sympy import *
var('t,AD,AH',real=True,positive=True)
AC,CD=10,6
AD=sqrt(AC**2-CD**2)
sol=solve([Eq(sin(t)              ,AD/AC),
           Eq(cos(t*Rational(1,2)),AH/AD)], 
          [t,AH])
print(sol)
t,AH,=sol[1][0],sol[1][1]
x=AH*(tan(t)+tan(t/2))-2*AH*tan(t/2)
print("#",x,float(x))
x=x.simplify()
print("#",x,float(x))

FreeCADのマクロで作図

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面に作図しました。
・計算部分は、Ver.0.6 の コピー貼り付けです。
・最後にAC水平を問題文の向きに回転しています。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.6 sympy風。弦が4つある内の一つ (直経ACをx軸方向) 
# ・点Hを使っていない。
from sympy import *
var('t',real=True,positive=True)
AC,CD=10,6
r = AC*Rational(1,2)
DA=sqrt(AC**2-CD**2)
O,A,C=map(Point,[(0,0),(-r,0),(r,0)])
D=Circle(A,DA).intersection(  Circle(C,CD)  )[1]   
E=A+DA*(O-A).unit
B=Circle(O,r).intersection(Line(D,E))[1]
print("#",B.distance(E),float(B.distance(E)))
# sqrt(10) 3.1622776601683795
###########################################################################
H=Line(B,D).projection(A)
def myMatrixToPoint(myMatrix):    
    return Point2D(myMatrix[0],myMatrix[1])
def myPoinrToMatrix(myPoint):    
    return Matrix([[myPoint.x],[myPoint.y],[1]]) 
t=-Line(O,O+Point(1,0)).angle_between(Line(B,D) )
myTurn=Matrix([[cos(t),-sin(t),0],[sin(t),cos(t),0],[0,0,1]])
A=myMatrixToPoint( myTurn*myPoinrToMatrix(A) )
B=myMatrixToPoint( myTurn*myPoinrToMatrix(B) )
C=myMatrixToPoint( myTurn*myPoinrToMatrix(C) )
D=myMatrixToPoint( myTurn*myPoinrToMatrix(D) )
E=myMatrixToPoint( myTurn*myPoinrToMatrix(E) )
H=myMatrixToPoint( myTurn*myPoinrToMatrix(H) )
############################################################################
# 3D作図 z=0 XY平面に作図しました。
# 2024-10-08 fontsize 追加しました。従来と互換性がありません。 
# 2024-10-20 HR 
############################################################################
def myDimension(fontsize,myExtOvershoot,start_point, end_point,HVP):
    x1, y1 = start_point.args
    x2, y2 = end_point.args
    myFlipText = True
    if HVP=="PL":
       myP1  =Point(float(x1),float(y1))
       myP2  =Point(float(x2),float(y2))
       myFlipText = False
       myExtOvershoot1=abs(myExtOvershoot)
    elif HVP=="PR":
       myP1  =Point(float(x1),float(y1))
       myP2  =Point(float(x2),float(y2))
       myFlipText = False
       myExtOvershoot1=-abs(myExtOvershoot)
    elif HVP=="VL":
       if x1<x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       else:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
    elif HVP=="VR":
       if x1<x2 and y1<y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
    elif HVP=="HL":
       if x1 < x2 and y1<y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       elif x1 < x2 and y1>y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       elif x1 > x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1= abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
    elif HVP=="HR":
       #if x1<x2 and y1<y2: # 2024-10-20 HR
       if x1<x2 and y1<=y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1=-abs(myExtOvershoot)
    else:  
      print("")

    myM   =myP1.midpoint(myP2)
    myT   =myM+myExtOvershoot1*((myP1-myM).unit).rotate( -pi/2 )
    dimension = Draft.makeDimension(
        FreeCAD.Vector(myP1.x, myP1.y, 0),           # 点1の座標
        FreeCAD.Vector(myP2.x, myP2.y, 0),           # 点2の座標
        FreeCAD.Vector(float(myT.x),float(myT.y),0)  # 矢印の位置を中央に設定
    )
    # Ext Overshootを設定
    dimension.ViewObject.ExtOvershoot = -float(myExtOvershoot)
    
    dimension.ViewObject.FlipText = myFlipText

    # 矢印のスタイルを設定
    dimension.ViewObject.ArrowType    = "Arrow"  # 矢印のタイプを "Arrow" に設定
    dimension.ViewObject.ArrowSize    = fontsize/5
    dimension.ViewObject.TextSpacing  = 0
    dimension.ViewObject.LineColor    = (0.0, 1.0, 0.0)  # 緑色
    dimension.ViewObject.FontSize     = fontsize  # フォントサイズを指定
def myXYZ2Txt_2D(A):
    return ""
def myXYZ2Txt_XY_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
def myTxtXYZ_2D(fontsize,A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = str(fontsize,)+' mm'
    return
def myTxtXYZ_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myTxtXYZ_XY_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_2D(xy_tx[2*i-2]) )
    return

def myTxtXYZ_MoveY_2D(fontsize,MoveY,A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)+MoveY
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = str(fontsize,)+' mm'
    return
def myTxtXYZ_XY_S_MoveY_2D(fontsize,MoveY,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_MoveY_2D(fontsize,MoveY,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_2D(xy_tx[2*i-2]) )
    return
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def Freecad3D_circle(x=0.0,y=0.0,z=0.0,radius=0.0,diameter=0.0,circumference=0.0,area=0.0,startangle=0.0,endangle=0.0,arc=0.0,anglecenter=0.0,cord=0.0,arrow=0.0,center=0,placemObject=""):
    from math import sqrt, pi
    if placemObject == "":
        pl = FreeCAD.Placement()
        pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()   
        pl.Base = FreeCAD.Vector(x,y,z)
    else:
        pl = FreeCAD.Placement()
        pl = placemObject                                  # placement imposted
    if diameter != 0:                                      # with diameter
        radius = diameter / 2.0
    elif circumference != 0:                               # with circumference
        radius = (circumference / pi) / 2.0
    elif area != 0:                                        # with area
        radius =  sqrt((area / pi))
    elif (cord != 0) and (arrow != 0):                     # with cord and arrow
        radius = ((arrow**2) + (cord**2) / 4.0) / (arrow*2) 
    elif (arc != 0) and (anglecenter != 0):                # with arc and anglecenter central in degrees
        radius = ((360/anglecenter)*arc) / pi/2.0
        if endangle != 0:
            startangle  = endangle - anglecenter
        endangle   = anglecenter + startangle
        startangle  = endangle - anglecenter
    if radius != 0:
        try:
            Draft.makeCircle(radius,placement=pl,face=False,startangle=startangle,endangle=endangle,support=None)
            if center != 0:
                x=pl.Base.x
                y=pl.Base.y
                z=pl.Base.z
                Draft.makePoint(x,y,z)
        except Exception:
            App.Console.PrintError("Unexpected keyword argument" + "\n")
        App.ActiveDocument.recompute()
    else:
        App.Console.PrintMessage("Unexpected keyword argument" + "\n")
        App.Console.PrintMessage("circle(x,y,z,radius,diameter,circumference,area,startangle,endangle,[arc,anglecenter],[cord,arrow],center,placemObject)" + "\n")
        App.Console.PrintMessage("circle(radius=10.0,placemObject=App.Placement(App.Vector(11,20,30), App.Rotation(30,40,0), App.Vector(0,0,0)))" + "\n")
    return
def myCircle_2D(myCi):
    x=myCi.center.x
    y=myCi.center.y
    r=myCi.radius
    Freecad3D_circle(
           x=float(x),y=float(y),z=0.0,
           radius=float(abs(r)),
           center=1,
           placemObject=App.Placement(App.Vector(float(x),float(y),0),
           App.Rotation(0,0,0),App.Vector(0,0,0)))
    return
def myLine_2D(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),0.0
    Bx,By,Bz=float(B.x),float(B.y),0.0
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
    return
def myLine_S_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    return
def myLine_C_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    myLine_2D(args[i],args[0])
    return
def myLine_H_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[0],args[i])
    return
##################################################################################
myCircle_2D     (Circle(O,r))
myLine_C_2D     (A,B,E,H,D)  
myLine_S_2D     (A,C,D)  
myLine_S_2D     (A,H)
#
myFontsize =0.5
myOvershoot=myFontsize*7
#myTxtXYZ_XY_S_2D(myFontsize,O,"O",A,"A",B,"B",C,"C",D,"D",E,"E")
myTxtXYZ_XY_S_2D(myFontsize,O,"O",A,"A",B,"B",C,"C",D,"D")
# MoveY
myTxtXYZ_XY_S_MoveY_2D(myFontsize,myFontsize  ,E,"E")
myTxtXYZ_XY_S_MoveY_2D(myFontsize,myFontsize*2,H,"H")

myDimension(myFontsize,myOvershoot,C,A,"PL")
myDimension(myFontsize,myOvershoot,C,D,"PR")
myDimension(myFontsize,myOvershoot,A,D,"PL")
myDimension(myFontsize,myOvershoot,B,E,"HR")
####################################################################################
doc = App.activeDocument()
#App.ActiveDocument.addObject("App::Origin", "Origin")
#App.ActiveDocumen!t.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

・(青色の)角度寸法は、ニセモノです。Part>計測>角度計算 です。
・角度寸法の表示は、まだ勉強中です。

isometric方向?です。(省略)
拡大図 回転前

拡大図 回転後(CADの操作で角度寸法線を追加)
111.png

参照

三四五(さしご)の定理

><仮称>ダブル三平方の さしごの直角三角形

相似 と 合同

私の感想1

内容の重複があります。
本問の設問(2)(イ)について。BEの長さ?

■図を見ただけで、相似の組み合わせが複数ある。
△ABHと△ACD(設問(1)より。)
△ABEと△ECD(蝶々)
△BCEと△EAD(蝶々。二等辺三角形)
△AEHと△HAD(合同。直角三角形)
さらに、延長して交点Fを追加すると組み合わせの数がふえる。
相似の組み合わせの数だけ、解法がある?
どれを、選択するかだと思いました。
(一目で解答が見える方もおられます。)

■(解法の技は別にして、)出題者の誘導 にのって、
△ABHと△ACDの「相似比」(設問(1)より角の三等分へ) 8√10/3:8。線分HD非表示。
△ABHと△ACDの辺の長さ
を求めるのがベストのように思います。

■私は、(高校入試虎の穴 様の)黄色と青色の三角形は気がつきませんでした。
設問(1)(2)(3)じゃないところがステキです。出題者の誘導かも。
この設問で時間を使わない方がイイよ。。
・(直角?)三角形の角の二等分線の長さは、三平方の定理を使って計算ができる。
 (高校生には不要の定理?)
・蝶々?の相似でなくて、隣接した三角形の相似
過去問の類題を教えて下さい。よろしくお願いします。

私の感想2(追加洛南2014の問題後)

■ニッキーランド様に洛南の問題を教えてもらいました。
<仮称>ダブル三平方の さしごの直角三角形
半角・倍角の公式を使わなくてもすみます。
試験用紙を、ACを水平に回転して見る。

<仮称>ダブル三平方の さしごの直角三角形 。洛南  数学2014 平成26年
<仮称>さしごの直角三角形の ダブル三平方 。岐阜県 数学 2013 平成25年
<仮称>両者。オモテウラの関係問題。ウラオモテの関係問題。ドッチ?

■岐阜県の問題をさしごを使う解法は、出題者のユウドウにのっていないので
あまり望ましくない。半角・倍角の公式を使うのもです。所謂、
設問1を直接?使わずに最終問題の解法パターンは、自転車君の問題(共通テ2022)に似ています。

よって、
高校入試虎の穴 様の解法の、ユウドウ(1)相似の問題、(2)図の右端から、片押し?がわかりやすいと思いました。

参考(ダブル三平方???)

覚えていると得するよ の ページの最後(64)
http://ynaka.html.xdomain.jp/toku2.html

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?