473,545 Members | 2,084 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

newb comment request

Hi,

Im a newb to dev and python... my first sefl assigned mission was to read a
pickled file containing a list with DB like data and convert this to
MySQL... So i wrote my first module which reads this pickled file and writes
an XML file with list of tables and fields (... next step will the module
who creates the tables according to details found in the XML file).

If anyone has some minutes to spare, suggestions and comments would be verry
much appreciated to help me make my next modules better.. and not starting
with bad habit :)

Alexandre

############### ######### <EIPyFormatToXM L>
############### ############### ########
#pickle.loads a file containing database like data in a python list ->
#Outputs a XML file with "tables" details which will be used in a future
module
#to build MySQL tables. See the comment blocks at the end of the module
#for more details.

import sys
import pickle
import types

infile = open('cached-objects-Python-pickled-sample', 'rb')
_data = pickle.load(inf ile)
infile.close()

def ExtractTablesFr omData(data):
"""Extracts all the table names from the Dumped items data file and
returns the list."""
tablesR = []
for tables in data:#For each tables found in 'data'
tablesR.append([tables[0]])#Appends the list with current table name
return tablesR

def ExtractFieldNam esFromData(data ):
"""Extract all fields from data list (the calling function defines for
which table in 'data' argument)."""
fieldsR = []
for fields in data:
fieldsR.append([fields])
return fieldsR

def ExtractFieldVal uesFromData(dat a, indexField):
"""Check each value of the field passed as argument to the function, it
returns [valueType, maxLength, maxValue, minValue, floatPrecision,
NoneValues(bool ), sampleValue]."""
valueType, maxLength, maxValue, minValue, values , floatPrecision,
NoneValues = None, None, None, 999999999999, [], None, False
sampleValue = 'numeric value, check min and max values as sample'
for valuesD in data:#for each record...
value = valuesD[indexField]#focus value on required field
if type(value) is not types.NoneType: #if a value other than None is
found
valueType = type(value)#val ueType is given the type of the
current value
else:#... if the value is None
NoneValues = True#None values exist for this field in the record
list
if valueType is str:#if type is string
minValue = None#set minValue to None (minValue and maxValue are
only for numeric types)
if len(value) > maxLength:#if current string lenght is bigger
than maxLength
maxLength = len(value)#Set maxLength value to current string
length
sampleValue = value#Sets sampleValue with the longest string
found
else:#... if not string type
if value > maxValue:#if current value bigger than maxValue
maxValue = value#Sets current value to maxValue
if value and value < minValue:#if value is not None AND smaller
than minValue
minValue = value#Sets new minValue with current value
if valueType is float and value != 0:#if value type is float and
not 0
precisionTemp = len(str(value - int(value)))-2
if precisionTemp > floatPrecision: #if the current length
after decimal point is bigger than previous
floatPrecision = precisionTemp#s et current value to
precision
if valueType is float and floatPrecision == None:#if float could not be
determined because only 0.0 values were found
floatPrecision = 1#set precision to 1
if valueType is not float and floatPrecision != None:#if last value type
was not float but some float values were found
valueType = type(1.234)#set valueType to float
if valueType is str and maxLength == 0:#if value type found only ''
(empty) records
NoneValues = True#allow null values
if minValue == 999999999999:#i f minValue was not set
minValue = None#then minValue is None
values[:] = [valueType, maxLength, maxValue, minValue, floatPrecision,
NoneValues, sampleValue]
return values

def AddFieldsPerTab le():
"""Appends field list to each table."""
tables = ExtractTablesFr omData(_data) #First extract list of tables
for i, table in enumerate(table s): #Then for each table in the list
fields = ExtractFieldNam esFromData(_dat a[i][1][0])#get field list
([i] as table index, [1][0] to reach field list)
tables[i].append(fields) #Appends the returned field list to current
table
return tables

def AddFieldsDetail sPerField():
"""Extend field list with details for each field."""
tables = AddFieldsPerTab le()#First get table list
for iTable, table in enumerate(table s):#Then for each table
for iField, field in enumerate(table[1]):#...for each field in the
current table
values = ExtractFieldVal uesFromData(_da ta[iTable][1][1],
iField)#Get field's details([iTable] as table index, [1][1] to reach records
list, iField to focus search on current field)
field.extend(va lues)#Extends the tables list with returned field
details
return tables

def AddNbOfRecordsP erTable():#Inse rt number of records per table.
"""Extend 'tables' details with number of records per table."""
tables = AddFieldsDetail sPerField()#get tables
for i, table in enumerate(table s):#for each table
nbOfRecords = len(_data[i][1][1])#get number of records ([i]=table
index, [1][1] = record list)
table.insert(1, nbOfRecords)#in serts the number of records in tables
list
return tables

def WriteFileTableF ormat(fileName) :#Creates the XML with 'tables' list
tables = AddNbOfRecordsP erTable()#get tables detailed list
f = open(fileName, 'w')
f.write("""<?xm l version="1.0" encoding="ISO-8859-1"?>\n""")
f.write("<Root> \n")

for table in tables:
f.write("\t<tab le>\n")
f.write("\t\t<n ame>%s</name>\n" % table[0])
f.write("\t\t<n bOfRecords>%s</nbOfRecords>\n" % table[1])
for field in table[2][:]:
f.write("\t\t<f ield>\n")
f.write("\t\t\t <name>%s</name>\n" % field[0])
if str(field[1])[:7] == "<type '":
field[1] = str(field[1])[7:-2]
f.write("\t\t\t <pythonType>% s</pythonType>\n" % str(field[1]))
f.write("\t\t\t <maxLength>%s </maxLength>\n" % str(field[2]))
f.write("\t\t\t <maxValue>%s</maxValue>\n" % str(field[3]))
f.write("\t\t\t <minValue>%s</minValue>\n" % str(field[4]))
f.write("\t\t\t <floatPrecision >%s</floatPrecision> \n" %
str(field[5]))
f.write("\t\t\t <NoneValues>% s</NoneValues>\n" % str(field[6]))
f.write("\t\t\t <sampleValue>%s </sampleValue>\n" % str(field[7]))
f.write("\t\t\t <mysqlFieldType ></mysqlFieldType> \n")
f.write("\t\t</field>\n")
f.write("\t</table>\n")

f.write("</Root>")
f.close

WriteFileTableF ormat('EITables Format.xml')

############ <Help to understand '_data' structure>
#
# [['FirstTableName ', (['FirstFieldName ', 'nFieldName'],
[['FirstFieldFirs tValue', 'nFieldFirstVal ue'],
# ['FirstFieldnVal ue', 'nFieldnValue']])], ['nTableName', (['etc..
# print _data[0][0] #[0]=FirstTable, [0]=TableName -> output :
'FirstTableName '
# print len(_data) #number of tables in 'data'
# print _data[0][1] #[0]=FirstTable, [1]=FieldList And Records
# print _data[0][1][0] #[0]=FirstTable, [1]=FieldList, [0]=FieldNames ->
output : ['FirstFieldName ', 'nFieldName']
# print len(_data[0][1][0]) #number of fields in first table
# print _data[0][1][1] #[0]=FirstTable, [1]=FieldList, [1]=RecordList
# print len(_data[0][1][1]) #number of records in first table
# print _data[0][1][1][0][2] #[0]=firstTable, [1]=FieldList,
[1]=RecordList, [0] = First Record, [2]=Third Field Value
#
############### ######### </Help to understand '_data' structure>
############ <Final 'tables' variable format>
#
# The final 'tables' format used to build the XML should look like :
# ([tablename_1, nbOfRecords
# [
# [fieldname_1, pythonType, maxLength, maxValue, minValue,
floatPrecision, NoneValues, sampleValue],
# [fieldname_1, pythonType, maxLength, maxValue, minValue,
floatPrecision, NoneValues, sampleValue]
# ],
# [tablename_n,
# [
# [fieldname_1, ...]
# ]
# ])
#
############### ######### </Final 'tables' variable format>
############### ############### ###### </EIPyFormatToXML >
Jul 18 '05 #1
5 2020
Alexandre wrote:
Hi,

Im a newb to dev and python... my first sefl assigned mission was to read
a pickled file containing a list with DB like data and convert this to
MySQL... So i wrote my first module which reads this pickled file and
writes an XML file with list of tables and fields (... next step will the
module who creates the tables according to details found in the XML file).

If anyone has some minutes to spare, suggestions and comments would be
verry much appreciated to help me make my next modules better.. and not
starting with bad habit :)


I would suggest that you repost the script without the excessive comments.
Most programmers find Python very readable, your comments actually make it
harder to parse for the human eye.
Also, make it work if you can, or point to the actual errors that you cannot
fix yourself. Provide actual test data in your post instead of the
unpickling code, so that others can easily reproduce your errors.
Only then you should ask for improvements.

Random remarks:

Object oriented programming is about programming against interfaces, so
exessive type checking is a strong hint to design errors.

Avoid using global variables in your functions; rather pass them explicitly
as arguments.

Where is valuesD introduced?

"%s" % str(1.23)
is the same as
"%s" % 1.23

type(value) is not types.NoneType
is the same as
value is not None

Module level code is habitually wrapped like so:

if __name__ == "__main__":
infile = open('cached-objects-Python-pickled-sample', 'rb')
_data = pickle.load(inf ile)
infile.close()
# process _data...

That way, you can import the module as well as use it as a standalone
script.

I'm sure, there is more, but then again, clean up the comments, try to make
it work, and then repost.

Peter
Jul 18 '05 #2

"Peter Otten" <__*******@web. de> a écrit dans le message de news:bq******** *****@news.t-online.com...
I would suggest that you repost the script without the excessive comments.
Most programmers find Python very readable, your comments actually make it
harder to parse for the human eye.
Done, so your help will also make my next posts better :)
Also, make it work if you can, or point to the actual errors that you cannot
fix yourself. Provide actual test data in your post instead of the
unpickling code, so that others can easily reproduce your errors.
Only then you should ask for improvements.
Also available in my new version :)
Random remarks:

Object oriented programming is about programming against interfaces, so
exessive type checking is a strong hint to design errors.
I'm not sure i understand... well, let's put it that way : i'm sure i don't understand :)
I guess i'll have to read about OO design... this is my first program, although i think i understand what OO means, i'm
not abble to write OO yet :/
Avoid using global variables in your functions; rather pass them explicitly
as arguments.
I'll try that !
Where is valuesD introduced?
Not sure i understand the question... i used this variable name "ValuesD" (meaning Values from Data) not to conflict
with the other variable named "values" in the same function.
"%s" % str(1.23)
is the same as
"%s" % 1.23
Ok

type(value) is not types.NoneType
is the same as
value is not None
Shame on me :)
Module level code is habitually wrapped like so:

if __name__ == "__main__":
infile = open('cached-objects-Python-pickled-sample', 'rb')
_data = pickle.load(inf ile)
infile.close()
# process _data...

That way, you can import the module as well as use it as a standalone
script.
Oh ? but, i can use it as standalone script ?!
If i type myScriptName.py in my dos prompt the script is working !
I'm sure, there is more, but then again, clean up the comments, try to make
it work, and then repost.


I'm sure there's more :)
Thanks a lot for your comments Peter !
Best regards,
Alexandre
Jul 18 '05 #3
############### ######### <EIPyFormatToXM L> ############### ############### ########
import sys
import types

_data = [['Table1',(['Field01','Fiel d02','Field03',],
[['a string', 12345, 1.000123],
['a second string', None, 3406.3],
['', 64654564, 35]])],
['Table2', (['Field04', 'Field05'], [[None, -0.3]])],
['Table3',(['Field06', 'Field07', 'Field08'],
[['', 0, 0.001],
['', None, 646464.0],
['', 6546, 0.1],
['', -6444, 0.2],
['', 0, 0.3]])]]

def ExtractTablesFr omData(data):
"""Extracts all the table names from the Dumped items data file and returns the list."""
tablesR = []
for tables in data:
tablesR.append([tables[0]])
return tablesR

def ExtractFieldNam esFromData(data ):
"""Extract all fields from data list (the calling function defines for which table in 'data' argument)."""
fieldsR = []
for fields in data:
fieldsR.append([fields])
return fieldsR

def ExtractFieldVal uesFromData(dat a, indexField):
"""Check each value of the field passed as argument to the function."""
values , floatPrecision, NoneValues = [], None, False
valueType, maxLength, maxValue, minValue = None, None, None, 999999999999
sampleValue = 'numeric value, check min and max values as sample'
for valuesD in data:
value = valuesD[indexField]
if type(value) is not types.NoneType:
valueType = type(value)
else:
NoneValues = True
if valueType is str:
minValue = None
if len(value) > maxLength:
maxLength = len(value)
sampleValue = value
else:
if value > maxValue:
maxValue = value
if value and value < minValue:
minValue = value
if valueType is float and value != 0:
precisionTemp = len(str(value - int(value)))-2
if precisionTemp > floatPrecision:
floatPrecision = precisionTemp
if valueType is float and floatPrecision == None:
floatPrecision = 1
if valueType is not float and floatPrecision != None:
valueType = type(1.234)
if valueType is str and maxLength == 0:
NoneValues = True
if minValue == 999999999999:
minValue = None
values[:] = [valueType, maxLength, maxValue, minValue, floatPrecision, NoneValues, sampleValue]
return values

def AddFieldsPerTab le():
"""Appends field list to each table."""
tables = ExtractTablesFr omData(_data)
for i, table in enumerate(table s):
fields = ExtractFieldNam esFromData(_dat a[i][1][0])
tables[i].append(fields)
return tables

def AddFieldsDetail sPerField():
"""Extend field list with details for each field."""
tables = AddFieldsPerTab le()
for iTable, table in enumerate(table s):
for iField, field in enumerate(table[1]):
values = ExtractFieldVal uesFromData(_da ta[iTable][1][1], iField)
field.extend(va lues)
return tables

def AddNbOfRecordsP erTable():
"""Extend 'tables' details with number of records per table."""
tables = AddFieldsDetail sPerField()
for i, table in enumerate(table s):
nbOfRecords = len(_data[i][1][1])
table.insert(1, nbOfRecords)
return tables

def WriteFileTableF ormat(fileName) :
tables = AddNbOfRecordsP erTable()
f = open(fileName, 'w')
f.write("""<?xm l version="1.0" encoding="ISO-8859-1"?>\n""")
f.write("<Root> \n")

for table in tables:
f.write("\t<tab le>\n")
f.write("\t\t<n ame>%s</name>\n" % table[0])
f.write("\t\t<n bOfRecords>%s</nbOfRecords>\n" % table[1])
for field in table[2][:]:
f.write("\t\t<f ield>\n")
f.write("\t\t\t <name>%s</name>\n" % field[0])
if str(field[1])[:7] == "<type '":
field[1] = str(field[1])[7:-2]
f.write("\t\t\t <pythonType>% s</pythonType>\n" % str(field[1]))
f.write("\t\t\t <maxLength>%s </maxLength>\n" % str(field[2]))
f.write("\t\t\t <maxValue>%s</maxValue>\n" % str(field[3]))
f.write("\t\t\t <minValue>%s</minValue>\n" % str(field[4]))
f.write("\t\t\t <floatPrecision >%s</floatPrecision> \n" % str(field[5]))
f.write("\t\t\t <NoneValues>% s</NoneValues>\n" % str(field[6]))
f.write("\t\t\t <sampleValue>%s </sampleValue>\n" % str(field[7]))
f.write("\t\t\t <mysqlFieldType ></mysqlFieldType> \n")
f.write("\t\t</field>\n")
f.write("\t</table>\n")

f.write("</Root>")
f.close

WriteFileTableF ormat('EITables Format.xml')

############### ############### ###### </EIPyFormatToXML >

-> result xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<Root>

<table>

<name>Table1</name>

<nbOfRecords> 3</nbOfRecords>

<field>

<name>Field01 </name>

<pythonType>str </pythonType>

<maxLength>15 </maxLength>

<maxValue>Non e</maxValue>

<minValue>Non e</minValue>

<floatPrecision >None</floatPrecision>

<NoneValues>Fal se</NoneValues>

<sampleValue> a second string</sampleValue>

<mysqlFieldTy pe/>

</field>

<field>

<name>Field02 </name>

<pythonType>int </pythonType>

<maxLength>None </maxLength>

<maxValue>64654 564</maxValue>

<minValue>12345 </minValue>

<floatPrecision >None</floatPrecision>

<NoneValues>Tru e</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

<field>

<name>Field03 </name>

<pythonType>flo at</pythonType>

<maxLength>None </maxLength>

<maxValue>3406. 3</maxValue>

<minValue>1.000 123</minValue>

<floatPrecision >6</floatPrecision>

<NoneValues>Fal se</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

</table>

<table>

<name>Table2</name>

<nbOfRecords> 1</nbOfRecords>

<field>

<name>Field04 </name>

<pythonType>Non e</pythonType>

<maxLength>None </maxLength>

<maxValue>Non e</maxValue>

<minValue>Non e</minValue>

<floatPrecision >None</floatPrecision>

<NoneValues>Tru e</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

<field>

<name>Field05 </name>

<pythonType>flo at</pythonType>

<maxLength>None </maxLength>

<maxValue>-0.3</maxValue>

<minValue>-0.3</minValue>

<floatPrecision >2</floatPrecision>

<NoneValues>Fal se</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

</table>

<table>

<name>Table3</name>

<nbOfRecords> 5</nbOfRecords>

<field>

<name>Field06 </name>

<pythonType>str </pythonType>

<maxLength>0</maxLength>

<maxValue>Non e</maxValue>

<minValue>Non e</minValue>

<floatPrecision >None</floatPrecision>

<NoneValues>Tru e</NoneValues>

<sampleValue/>

<mysqlFieldTy pe/>

</field>

<field>

<name>Field07 </name>

<pythonType>int </pythonType>

<maxLength>None </maxLength>

<maxValue>654 6</maxValue>

<minValue>-6444</minValue>

<floatPrecision >None</floatPrecision>

<NoneValues>Tru e</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

<field>

<name>Field08 </name>

<pythonType>flo at</pythonType>

<maxLength>None </maxLength>

<maxValue>64646 4.0</maxValue>

<minValue>0.001 </minValue>

<floatPrecision >3</floatPrecision>

<NoneValues>Fal se</NoneValues>

<sampleValue>nu meric value, check min and max values as sample</sampleValue>

<mysqlFieldTy pe/>

</field>

</table>

</Root>
Jul 18 '05 #4
Object oriented programming is about programming against interfaces, so
exessive type checking is a strong hint to design errors.
I'm not sure i understand... well, let's put it that way : i'm sure i don't understand :)
I guess i'll have to read about OO design... this is my first program, although i think i understand what OO means,

i'm not abble to write OO yet :/


ok... a little shower always help, now i understand your remark :)
The thing is, this first module is retrieving '_data' from another app.
This other app is not written to share '_data' with other apps.

So my first module should be the only one which deals with types checking because those data will then be available to
my app from a DB (... once i've written the second module :)

Thx again and regards,
Alexandre
Jul 18 '05 #5
Alexandre wrote:

[Peter]
Object oriented programming is about programming against interfaces, so
exessive type checking is a strong hint to design errors.
[Alexandre]
I'm not sure i understand... well, let's put it that way : i'm sure i
don't understand :) I guess i'll have to read about OO design... this is
my first program, although i think i understand what OO means, i'm not
abble to write OO yet :/


Type checking is generally best avoided, e. g. if you test for

isinstance(myst ream, file)

this may fail on mystream objects that have all the methods needed to
replace a file in subsequent code and you thus unnecessarily limit its
usage.
As your script is explicitly in the "type checking business", my remark was
a bit off, though.
Where is valuesD introduced?

Not sure i understand the question... i used this variable name "ValuesD"
(meaning Values from Data) not to conflict with the other variable named
"values" in the same function.


I spotted an error where there was none - nothing to understand here :-(
Module level code is habitually wrapped like so:

if __name__ == "__main__":
infile = open('cached-objects-Python-pickled-sample', 'rb')
_data = pickle.load(inf ile)
infile.close()
# process _data...

That way, you can import the module as well as use it as a standalone
script.


Oh ? but, i can use it as standalone script ?!
If i type myScriptName.py in my dos prompt the script is working !


Yes, but you can *only* use it as a standalone script. If you import it into
another module, it will try to read the pickled data from the hard-coded
file before you can do anything else.
Peter
Jul 18 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
1420
by: Knoppix User | last post by:
Hi folks I still have not been able to solve this one, which didn't manage to garner a response yesterday, so I'm rephrasing it here. If I define an attribute in the __init__ statement of a class, I should be able to access that attribute in a later method of that class, right? I have run into a situation where that does not SEEM to...
3
1739
by: Walter | last post by:
But I'm stumped..... I've got a windows 2000 server and I am trying to set up PHPBB on it using a mysql database.. I am very inexperienced on this..... Ive installed mysql V4.0.20d and I can get it up and running. I then run winmysqladmin V1.4 (the mysql service is running) When I go to databases inside the admin, it shows on the left side...
13
5635
by: Christoph Brunner | last post by:
Hi, on the sun homepage i had submit to the bugparade a request for feature enhancement for the JAXB API. After a period of time sun called me to post my request to a newsgroup an get comments from other java developers. So please comment my following request for feature enhancement: If i unmarshall an invalid xml document i got a...
20
2010
by: Chad Everett | last post by:
Hi all, I am new to the group. Trying to learn Python programming on my own. I am working through Michael Dawson's Book Python Programming for the absolute beginner. I am tring to write a program that is a number guessing game. I want to be able to give the user 5 tries to guess the number before the program ends. I get the result...
2
1479
by: Eric | last post by:
I have a textbox on a form that is populated from the database when the form loads. When I check textbox.Text when the user clicks my submit button, the value is always what it was when the form loaded, no matter of what the user changed the text to. Any suggestions? protected void Page_Load(object sender, EventArgs e) { DataSet ds =...
15
3647
by: manstey | last post by:
Hi, I have a text file called a.txt: # comments I read it using this:
2
3092
by: Carl | last post by:
I'm new to C#, and I have only limited programming experience. I've been doing the video tutorials at MS's website, and they're very helpful, but I decided to experiment with GDI+ and have gotten stuck. I'm trying to draw a bitmap on my main form and then to draw a second bitmap, as if it were a sprite (e.g., a "unit" in a wargame), on top of...
6
11295
by: johnny | last post by:
How do I join two string variables? I want to do: download_dir + filename. download_dir=r'c:/download/' filename =r'log.txt' I want to get something like this: c:/download/log.txt
12
2004
by: joaotsetsemoita | last post by:
Hello everyone, im completly new to vb.net and I was assigned to do a simple piece of software that just had to select from um db in a MS access data base and insert into a SQL server Database. The structure tables are exactly the same so there's no need in data conversation. My idea was to fill a datatable with the results from my...
0
7405
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language...
0
7659
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. ...
0
7811
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
1
7428
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
0
7760
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the...
0
5975
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
0
3444
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
1019
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
709
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.