Commit 828c7f4a authored by Carsten Eie Frigaard's avatar Carsten Eie Frigaard
Browse files

update

parent 0f975de9
...@@ -588,22 +588,19 @@ CONTENT L00 ...@@ -588,22 +588,19 @@ CONTENT L00
\itemize{ \itemize{
\item{Antal studerende per grupper er = 3.} \item{Antal studerende per grupper er = 3.}
\item{Grupper med 2 eller 1} \item{Grupper med 2 eller 1}
\item{studerende vil blive sammelagt. Skriv til undervisere, hvis du har en gyldig grund til at være SOLO i en gruppe.}
\item{studerende vil blive sammelagt. Skriv til undervisere, hvis du har
en gyldig grund til at være SOLO i en gruppe.}
} }
\p{\i{Installation}: de obligatoriske værktøjer til ITMAL inden kursusstart (dvs. \p{\i{Installation}: de obligatoriske værktøjer til ITMAL inden kursusstart (dvs.
L01).} L01).}
\p{\i{Forberedelse til L01:} Hent GIT repositories til litteraturen [GITHOML], prøv at \p{\i{Forberedelse til L01:} Hent GIT repositories til litteraturen [GITHOML],
kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy prøv at kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy
bibliotek.} bibliotek.}
\p{\i{Ekstra materiale til forberedelse:} optionelle python opgaver, hvis du vil sætte \p{\i{Ekstra materiale til forberedelse:} optionelle python opgaver, hvis du
dig mere ind i sproget.} vil sætte dig mere ind i sproget.}
\sub{Installation} \sub{Installation}
...@@ -629,13 +626,10 @@ dig mere ind i sproget.} ...@@ -629,13 +626,10 @@ dig mere ind i sproget.}
\item{få fat i litteratur til kurset,} \item{få fat i litteratur til kurset,}
\item{clone [GITHOML] til din egen PC, se how-to under [KURSUSFORKORTELSER].} \item{clone [GITHOML] til din egen PC, se how-to under [KURSUSFORKORTELSER].}
\item{skim denne tutorial igennem:} \item{skim denne tutorial igennem:}
\displaystyle{\em{§ Scientific Python tutorials:} NumPy, \ipynb{tools_numpy.ipynb}, [GITHOML] \subitem{\em{§ Scientific Python tutorials:} NumPy, \ipynb{tools_numpy.ipynb}, [GITHOML]
\subitem{Læs blot, hvad du finder relevant så som 'iteration', men
[BR][BR] spring blot over emner, der er for komplekse eller for 'pythoniske', så
som 'Stacking arrays' og 'QR decomposition'.}
Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
'QR decomposition'.
} }
} }
...@@ -645,9 +639,9 @@ dig mere ind i sproget.} ...@@ -645,9 +639,9 @@ dig mere ind i sproget.}
information (informations-overload), så du skal danne dig en metode til at information (informations-overload), så du skal danne dig en metode til at
kunne selektere og navigere i materialet.} kunne selektere og navigere i materialet.}
\p{Vi vil primært holde os til [HOML], [GITHOML] og Scikit-learn, med en note \p{Vi holder os primært til [HOML], [GITHOML] og Scikit-learn, med en note om,
om, at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret) at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret) information:
information: en kildekritiks holdning er vigtig!} en kildekritiks holdning er vigtig!}
\sub{Ekstra materiale til forberedelse} \sub{Ekstra materiale til forberedelse}
...@@ -691,14 +685,14 @@ at vi præsentere de formelle rammer vdr. ...@@ -691,14 +685,14 @@ at vi præsentere de formelle rammer vdr.
\p{Herefter vil vi præsentere machine learning [ML] som koncept overordnet, og \p{Herefter vil vi præsentere machine learning [ML] som koncept overordnet, og
kort ridse lektionsplanen for kurset op.} kort ridse lektionsplanen for kurset op.}
\p{Software til brug for kurset introduceres og skal installeres på jeres PC'er, \p{Software til brug for kurset introduceres og skal installeres på jeres
se 'L00: Forberedelse' for en installationsguide. Vi anvender python PC'er, se 'L00: Forberedelse' for en installationsguide. Vi anvender python
distributionen anaconda og i henter og installere den sidste nye version. På distributionen anaconda og i henter og installere den sidste nye version. På
klassen vil der blive givet en kort demo af jupyter notebooks, dvs. et at de klassen vil der blive givet en kort demo af jupyter notebooks, dvs. et at de
udviklingsværktøjer til python vi vil bruge.} udviklingsværktøjer til python vi vil bruge.}
\p{Vi kigge på Scikit-learn, det primære eksterne web-sted vi vil bruge i kurset, \p{Vi kigge på Scikit-learn, det primære eksterne web-sted vi vil bruge i
samt forsøge os med et par små programmer i python.} kurset, samt forsøge os med et par små programmer i python.}
\p{Til slut kigger vi på supervised learning og at kunne predicte \p{Til slut kigger vi på supervised learning og at kunne predicte
'life-satisfactory' via demo projektet i [HOML], og vi ser på pythons modul- og 'life-satisfactory' via demo projektet i [HOML], og vi ser på pythons modul- og
...@@ -711,11 +705,10 @@ lektioner..} ...@@ -711,11 +705,10 @@ lektioner..}
\item{Formelle rammer vdr. kurset.} \item{Formelle rammer vdr. kurset.}
\item{Eksamensform, godkendelsesfag via:} \item{Eksamensform, godkendelsesfag via:}
\itemize{ \itemize{
\item{et sæt obligatoriske skriftlige gruppe-journaler med afleveringsdeadlines,} \item{et sæt obligatoriske skriftlige gruppe-journaler med afleveringsdeadlines,}
\item{en poster-session, med aflevering af poster og mundtlig præsentation af poster,} \item{en poster-session, med aflevering af poster og mundtlig præsentation af poster,}
\item{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems \item{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems bidrag.}
bidrag.} \subitem{[BR]\b{\style{color: #ff3333, => Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.}}}
\displaystyle{\b{\style{color: #ff3333, => Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.}}}
} }
\item{Læringsmål.} \item{Læringsmål.}
\item{Litteratur.} \item{Litteratur.}
...@@ -738,12 +731,11 @@ lektioner..} ...@@ -738,12 +731,11 @@ lektioner..}
\sub{Litteratur} \sub{Litteratur}
\displaystyle{\i{§ Preface}, p. xv [HOML] (eksklusiv fra \i{Using Code Examples}...og resten af \itemize*{
intro kapitlet)} \item{\i{§ Preface}, p. xv [HOML] (eksklusiv fra \i{Using Code Examples}...og resten af intro kapitlet)}
\item{\i{§ 1 The machine Learning Landscape} [HOML]}
\displaystyle{\i{§ 1 The machine Learning Landscape} [HOML]} \item{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
}
\displaystyle{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
\p{Dette kapitel indeholder mange nye koncepter og en del kode. Vi vender \p{Dette kapitel indeholder mange nye koncepter og en del kode. Vi vender
senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overblik senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overblik
...@@ -751,9 +743,10 @@ senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overbl ...@@ -751,9 +743,10 @@ senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overbl
\p{Når du har installeret anaconda (se L00):} \p{Når du har installeret anaconda (se L00):}
\displaystyle{\i{§ Scientific Python tutorials: NumPy}} \itemize*{
\item{\i{§ Scientific Python tutorials: NumPy}}
\displaystyle{\indent{\ipynb{tools_numpy.ipynb} [GITHOML]}} \subitem*{\ipynb{tools_numpy.ipynb} [GITHOML]}
}
\p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over \p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
...@@ -771,8 +764,8 @@ emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og ...@@ -771,8 +764,8 @@ emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
\enumerate{ \enumerate{
\item{Diskussion om ML (indlejret i forelæsningen).} \item{Diskussion om ML (indlejret i forelæsningen).}
\item{\b{Opgave} (introduktion): \link**{[HOME]/L01/intro.ipynb}} \item{\b{Opgave} (introduktion): \link**{[HOME]/L01/intro.ipynb} }
\subitem*{HUSK DATA til intro'en (download og udpak så dataset dir ligger sammen med intro.ipynb): \link**{[HOME]/L01/datasets.zip}} \subitem*{HUSK DATA til intro'en (download og udpak så dataset dir ligger sammen med intro.ipynb): \link**{[HOME]/L01/datasets.zip}}
\item{\b{Opgave} (python introduktion): \link**{[HOME]/L01/modules_and_classes.ipynb}} \item{\b{Opgave} (python introduktion): \link**{[HOME]/L01/modules_and_classes.ipynb}}
} }
...@@ -783,8 +776,8 @@ brug for en python og lineær algebra kick-start.} ...@@ -783,8 +776,8 @@ brug for en python og lineær algebra kick-start.}
\sub{Slides} \sub{Slides}
\displaystyle{ \itemize*{
\link**{[HOME]/L01/lesson01.pdf} \item{\link**{[HOME]/L01/lesson01.pdf} (vil blive opdateret inden lektion)}
} }
...@@ -854,20 +847,11 @@ læring den pågældende algoritme har opnået på de pågældende data.} ...@@ -854,20 +847,11 @@ læring den pågældende algoritme har opnået på de pågældende data.}
\sub{Litteratur} \sub{Litteratur}
\displaystyle{ \itemize*{
\i{§ 2 End-to-End Machine Learning Project}, \i{Select a Performance Measure}, [HOML] \item{\i{§ 2 End-to-End Machine Learning Project}, \i{Select a Performance Measure}, [HOML]}
\subitem{Genlæs KUN \i{Select a Performance Measure} (pp.39-41)}
[BR] \item{\i{§ 3 Classification} [HOML]}
\subitem{Skim eller spring over: \i{The ROC Curve} (pp.97-100) \i{Multilabel Classification} og \i{Multioutput Classification} (pp.106-108).}
\indent{Genlæs KUN \i{Select a Performance Measure} (pp.39-41)}
}
\displaystyle{
\i{§ 3 Classification} [HOML]
[BR]
\indent{Skim eller spring over: \i{The ROC Curve} (pp.97-1o0) \i{Multilabel
Classification} og \i{Multioutput Classification} (pp.106-108).}
} }
\sub{Forberedelse inden lektionen} \sub{Forberedelse inden lektionen}
...@@ -887,8 +871,8 @@ læring den pågældende algoritme har opnået på de pågældende data.} ...@@ -887,8 +871,8 @@ læring den pågældende algoritme har opnået på de pågældende data.}
\sub{Slides} \sub{Slides}
\displaystyle{ \itemize*{
\link**{[HOME]/L02/lesson02.pdf} \item{\link**{[HOME]/L02/lesson02.pdf}}
} }
...@@ -916,38 +900,47 @@ til at komme igennem alle grundliggende koncepter i \i{§ 2}.} ...@@ -916,38 +900,47 @@ til at komme igennem alle grundliggende koncepter i \i{§ 2}.}
sammensættes i en samlet processerings-\i{pipeline}. Programmerings-teknisk sammensættes i en samlet processerings-\i{pipeline}. Programmerings-teknisk
ser vi derfor til sidst på Scikit-learns Pipelines.} ser vi derfor til sidst på Scikit-learns Pipelines.}
\displaystyle{ \itemize*{
\link{\img{[FIGS]/ml_supervised_map.png, Supervised map image.}, [HOME]/Etc/ml_supervised_map.pdf} \item{
[BR] \i{Figur: \link*{Oversigtskortet for Supervised learning (The Map)., [HOME]/Etc/ml_supervised_map.pdf}} \link{\img{[FIGS]/ml_supervised_map.png, Supervised map image.}, [HOME]/Etc/ml_supervised_map.pdf}
[BR]
\i{Figur: \link*{Oversigtskortet for Supervised learning (The Map)., [HOME]/Etc/ml_supervised_map.pdf}}
}
} }
\sub{Indhold} \sub{Indhold}
\itemize{ \itemize{
\item{Generel genlæsning og repetition af § 2} \item{Generel genlæsning og repetition af \i{§ 2}}
\item{K-fold Cross-validation} \item{K-fold Cross-validation}
\item{Pipelines} \item{Pipelines}
} }
\sub{Litteratur} \sub{Litteratur}
\enumerate{ \itemize*{
\item{Genlæs: \i{§ 2 End-to-End Machine Learning Project} [HOML]} \item{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
\subitem*{(eksklusiv \i{Create the Workspace} og \i{Download the Data})} \subitem*{genlæsning (eksklusiv \i{Create the Workspace} og \i{Download the Data})}
\item{Scikit's dokumentations-side vdr. k-fold CV} \item{\i{§ Scikit's dokumentations-side vdr. K-fold CV}}
\subitem*{\link{https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html}} \subitem*{\link{https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html}}
} }
\sub{Forberedelse inden lektionen} \sub{Forberedelse inden lektionen}
\itemize{ \itemize{
\item{Læs litteraturen.} \item{Læs litteraturen,}
\item{Forbered een eller flere af gruppe medlerne på en mundtlig repetition af \i{§ 2 End-to-End:}:}
\subitem{i skal kunne give et kort mundligt resume af hele \i{§ 2} til en anden gruppe (på nær, som nævnt, \i{Create the Workspace} og \i{Download the Data}),}
\subitem{resume holdes til konceptplan, dvs. prøv at genfortælle, hvad de overordnede linier i kaptilerne i [HOML].}
} }
\sub{På klassen} \sub{På klassen}
\itemize{ \enumerate{
\item{Supergruppe [SG] resume af \i{§ 2 End-to-End}:}
\subitem{en supergruppe [SG], sammensættes af to grupper [G], on-the-fly på klassen,}
\subitem{hver gruppe [G] forbereder og giver en anden gruppe [G] et mundtligt resume af \i{§ 2} til en anden gruppe,}
\subitem{tid: ca. 30 min- sammenlagt, den ene grupper genfortæller første haldel af \i{§ 2} i ca. 15 min., hvorefter den anden gruppe genfortæller resten i ca. 15 min.}
\item{Almindelig forelæsning} \item{Almindelig forelæsning}
\subitem*{ekstra materiale: \link**{[HOME]/L03/Extra/k-fold_demo.ipynb}} \subitem*{ekstra materiale: \link**{[HOME]/L03/Extra/k-fold_demo.ipynb}}
\item{\b{Opgave} (pipelines): \link**{[HOME]/L03/pipelines.ipynb}} \item{\b{Opgave} (pipelines): \link**{[HOME]/L03/pipelines.ipynb}}
...@@ -957,10 +950,12 @@ ser vi derfor til sidst på Scikit-learns Pipelines.} ...@@ -957,10 +950,12 @@ ser vi derfor til sidst på Scikit-learns Pipelines.}
\sub{Slides} \sub{Slides}
\displaystyle{ \itemize*{
\link**{[HOME]/L03/lesson03.pdf} \link**{[HOME]/L03/lesson03.pdf}
} }
END
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
...@@ -978,7 +973,7 @@ CONTENT L04 ...@@ -978,7 +973,7 @@ CONTENT L04
supervised klassifikation metode.} supervised klassifikation metode.}
\p{Modellen lineær regression gennemanalyseres og der angives både analytiske \p{Modellen lineær regression gennemanalyseres og der angives både analytiske
og numeriske løsninger til træning af en lineær model. og numeriske løsninger til træning af en lineær model.}
\p{For den numeriske løsning går vi i dybden med træningsmetoden \i{Stochastic \p{For den numeriske løsning går vi i dybden med træningsmetoden \i{Stochastic
Gradient Decent metoden} (SGD).} Gradient Decent metoden} (SGD).}
...@@ -1019,11 +1014,6 @@ grundlag for neuroner i neurale net.)} ...@@ -1019,11 +1014,6 @@ grundlag for neuroner i neurale net.)}
\link**{[HOME]/L04/lesson04.pdf} \link**{[HOME]/L04/lesson04.pdf}
} }
END END
Formål : Formål :
......
...@@ -21,6 +21,7 @@ CONTENT ...@@ -21,6 +21,7 @@ CONTENT
NOTES NOTES
Tidpunkt: Fredage 08:15 til 12:00 Tidpunkt: Fredage 08:15 til 12:00
Lokale: 5106-110 Lokale: 5106-110
BA: 15/12 aflevering af bachelorprojekt
REFS REFS
[1] sdf [1] sdf
[2] sfd zdf [2] sfd zdf
......
...@@ -8,16 +8,18 @@ PWD = $(shell pwd) ...@@ -8,16 +8,18 @@ PWD = $(shell pwd)
COURSEFILES = ITMAL_E21 COURSEFILES = ITMAL_E21
MKDIFF=colordiff -dw Refs/$1 $1 && echo "DIFF OK" && rm $1 MKDIFF=colordiff -dw Refs/$1 $1 && echo "DIFF OK" && rm $1
build:
@ $(PYCOURSE) -c $(COURSEFILES)/course.tex -v -o ../../Html/
@ $(PYPLAN) -p $(COURSEFILES)/plan.txt -v -o ../../Html/plan.html
@ cd ../.. && $(PWD)/$(PYFILETREE) -v -o Html/filetree.html
sync: build sync: build
@ echo "SYNC.." @ echo "SYNC.."
@ ssh si "cd ITMAL_E21 && rm -f Html/*.html && git pull" @ #nmap -T5 -p 22 si | grep -v "Note: Host seems down" >/dev/null
@ ssh si "cd ITMAL_E21 && rm -f Html/*.html && git pull"
@ cd ../../ && scp -q -C -r Html si:ITMAL_E21/ @ cd ../../ && scp -q -C -r Html si:ITMAL_E21/
@ echo "SYNC..DONE" @ echo "SYNC..DONE"
build:
@ $(PYCOURSE) -c $(COURSEFILES)/course.tex -v -o ../../Html/
@ $(PYPLAN) -p $(COURSEFILES)/plan.txt -v -o ../../Html/plan.html
@ cd ../.. && $ $(PWD)/$(PYFILETREE) -v -o Html/filetree.html
TESTARGS=-v -v TESTARGS=-v -v
test: test:
...@@ -26,7 +28,7 @@ test: ...@@ -26,7 +28,7 @@ test:
@ $(call MKDIFF,L01.html) @ $(call MKDIFF,L01.html)
@ $(PYPLAN) -p Test/plan.txt $(TESTARGS) -o plan.html @ $(PYPLAN) -p Test/plan.txt $(TESTARGS) -o plan.html
@ $(call MKDIFF,plan.html) @ $(call MKDIFF,plan.html)
@ cd Test && $(PWD)/$(PYFILETREE) $(TESTARGS) -o $(PWD)/tree.html @ cd Test && $(PWD)/$(PYFILETREE) $(TESTARGS) -header "ITMAL Backend File Structure" -o $(PWD)/tree.html
@ $(call MKDIFF,tree.html) @ $(call MKDIFF,tree.html)
edit: edit:
......
...@@ -255,7 +255,7 @@ class Diagnostics: ...@@ -255,7 +255,7 @@ class Diagnostics:
linetag = '", line ' linetag = '", line '
m = ii.find(linetag) m = ii.find(linetag)
if m>=0: if m>=0:
ii = FiltPwd(ii[0:m]) + Col('BLUE') + str(linetag) + ii[m+len(linetag):] ii = FiltPwd(ii[0:m]) + Col('LCYAN') + str(linetag) + ii[m+len(linetag):]
t = Col('CYAN') + str(ii) + ColEnd() t = Col('CYAN') + str(ii) + ColEnd()
if n==0: if n==0:
maxlen = len(t) if len(t)>maxlen else maxlen maxlen = len(t) if len(t)>maxlen else maxlen
......
...@@ -3,71 +3,69 @@ ...@@ -3,71 +3,69 @@
from Utils.dbg import ERR, DiagStdErr, PrettyPrintTracebackDiagnostics from Utils.dbg import ERR, DiagStdErr, PrettyPrintTracebackDiagnostics
from sys import stdout, stderr from sys import stdout, stderr
def isStr(t, checknonempty=True): def Str(t, checknonempty=True):
assert isinstance(t, str), f"exected string but got type='{type(t)}'" assert isinstance(t, str), f"exected string but got type='{type(t)}'"
assert (not checknonempty) or (len(t)>0), f"string is empty, and this was unexpected" assert (not checknonempty) or (len(t)>0), f"string is empty, and this was unexpected"
return t return t
def isBool(t): def Bool(t):
assert isinstance(t, bool), f"exected bool but got type='{type(t)}'" assert isinstance(t, bool), f"exected bool but got type='{type(t)}'"
return t return t
def isInt(t, minval=0): def Int(t, minval=0):
assert isinstance(t, int), f"exected int but got type='{type(t)}'" assert isinstance(t, int), f"exected int but got type='{type(t)}'"
assert t>=minval assert t>=minval
return t return t
def isList(t): def List(t):
assert isinstance(t, list), f"exected list but got type='{type(t)}'" assert isinstance(t, list), f"exected list but got type='{type(t)}'"
return t return t
def isDict(t): def Dict(t):
assert isinstance(t, dict), f"exected dict but got type='{type(t)}'" assert isinstance(t, dict), f"exected dict but got type='{type(t)}'"
return t return t
def isTuple(t, expectedlen=2): def Tuple(t, expectedlen=2):
assert isinstance(t, tuple),f"exected tuple but got type='{type(t)}'" assert isinstance(t, tuple),f"exected tuple but got type='{type(t)}'"
assert len(t)==isInt(expectedlen, 1) assert len(t)==Int(expectedlen, 1)
return t return t
def Check(expr, msg): def Check(expr, msg):
isStr(msg) Str(msg)
if not expr: if not Bool(expr):
ERR("EXPRESSION NOT FULLFILLED: " + msg) ERR("EXPRESSION NOT FULLFILLED: " + msg)
def Trim(s, checknonempty=True): def Trim(s, checknonempty=True):
s = isStr(s, isBool(checknonempty)).replace("\t"," ") s = Str(s, Bool(checknonempty)).replace("\t"," ")
s = s.strip() s = s.strip()
return s return s
def SuffixFrom(s, splitstr): def SuffixFrom(s, splitstr):
n = isStr(s).rfind(isStr(splitstr)) n = Str(s).rfind(Str(splitstr))
if n<0: if n<0:
ERR(f"string '{s}' does not contain split string '{splitstr}' at all") ERR(f"string '{s}' does not contain split string '{splitstr}' at all")
return s[n+len(splitstr):] return s[n+len(splitstr):]
def Dbg(verbose, msg, level=1): def Dbg(verbose, msg, level=1):
isInt(verbose) Str(msg)
isStr(msg) if Int(level) <= Int(verbose):
isInt(level)
if level <= verbose:
print(msg, file=stderr) print(msg, file=stderr)
def Outputfile(outputfile): def Outputfile(outputfile):
assert outputfile is not None assert outputfile is not None
outputfile = isStr(outputfile).replace(" ", "_") outputfile = Str(outputfile).replace(" ", "_")
f = stdout if (outputfile is None or len(outputfile)==0 or outputfile=="None") else open(outputfile, 'w') f = stdout if (outputfile is None or len(outputfile)==0 or outputfile=="None") else open(outputfile, 'w')
return f return f
def LoadText(filename, timeout=4000, split=True): def LoadText(filename, timeout=4000, split=True):
with open(isStr(filename), 'r', timeout) as f: with open(Str(filename), 'r', timeout) as f:
c = f.read() c = f.read()
if split: if split:
c = c.split("\n") c = c.split("\n")
return c return c
def MkHtmlPage(htmlcontent): def MkHtmlPage(htmlcontent):
assert isStr(htmlcontent).find("DOCTYPE")<0 and htmlcontent.find("<html>")<=0 and htmlcontent.find("<body>")<=0 assert Str(htmlcontent).find("DOCTYPE")<0 and htmlcontent.find("<html>")<=0 and htmlcontent.find("<body>")<=0
meta = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>" meta = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>"
comment = "<!-- AUTOGENERATED HTML from CourseBuilder, CEF -->" comment = "<!-- AUTOGENERATED HTML from CourseBuilder, CEF -->"
......
...@@ -17,13 +17,13 @@ if __name__ == '__main__': ...@@ -17,13 +17,13 @@ if __name__ == '__main__':
RIGHT= '>' RIGHT= '>'
def HtmlEncode(s): def HtmlEncode(s):
return escape(isStr(s, False)) return escape(Str(s, False))
def HtmlDecode(s): def HtmlDecode(s):
return unescape(isStr(s, False)) return unescape(Str(s, False))
def _mkHtml(tag, style=""): def _mkHtml(tag, style=""):
if len(isStr(style, False)) > 0: if len(Str(style, False)) > 0:
if style[0]!=" ": if style[0]!=" ":
style = " " + style style = " " + style
if style.find("'") >= 0: if style.find("'") >= 0:
...@@ -31,7 +31,7 @@ if __name__ == '__main__': ...@@ -31,7 +31,7 @@ if __name__ == '__main__':
if style.find('"') >= 0: if style.find('"') >= 0:
ERR(f"no quotes in style, please, got style = '{style}'") ERR(f"no quotes in style, please, got style = '{style}'")
return f"{LEFT}{isStr(tag)}{style}{RIGHT}" return f"{LEFT}{Str(tag)}{style}{RIGHT}"
class Cmd: class Cmd:
__cmdstate = 0 # 0: txt, 1: cmd, 2: args __cmdstate = 0 # 0: txt, 1: cmd, 2: args
...@@ -59,11 +59,11 @@ if __name__ == '__main__': ...@@ -59,11 +59,11 @@ if __name__ == '__main__':
def Ok(self): def Ok(self):
assert Cmd.isCmd(self) assert Cmd.isCmd(self)