473,804 Members | 2,265 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Is a Borg rebellion possible? (a metaclass question)

In my application, I make use of the Borg idiom, invented by Alex
Martelli.

class Borg(object):
'''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273

Derive a class form this; all instances of that class will share
the
same state, provided that they don't override __new__; otherwise,
remember to use Borg.__new__ within the overriden class.
'''
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj

----
This has worked very well so far, but is starting to impose some
unwanted constraints on my program design.

What I would like to do is, to put it figuratively, create a Borg
rebellion with various splinter groups. In concrete Python terms, I
would like to have

class MyClass(Borg, ...):
...

seven_of_nine = MyClass(...) # part of group "BORG"
two_of_nine = MyClass(...)

splinter1 = MyClass(..., group='splinter ')
splinter2 = MyClass(..., group='splinter ')

and have splinter 1 and splinter2 share the same state, but a
different state than the one shared by members of the BORG collective.

Any suggestions from the metaclass experts?

André

Sep 7 '07 #1
10 1530
On Fri, 2007-09-07 at 12:31 +0000, André wrote:
In my application, I make use of the Borg idiom, invented by Alex
Martelli.

class Borg(object):
'''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273

Derive a class form this; all instances of that class will share
the
same state, provided that they don't override __new__; otherwise,
remember to use Borg.__new__ within the overriden class.
'''
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj

----
This has worked very well so far, but is starting to impose some
unwanted constraints on my program design.

What I would like to do is, to put it figuratively, create a Borg
rebellion with various splinter groups. In concrete Python terms, I
would like to have

class MyClass(Borg, ...):
...

seven_of_nine = MyClass(...) # part of group "BORG"
two_of_nine = MyClass(...)

splinter1 = MyClass(..., group='splinter ')
splinter2 = MyClass(..., group='splinter ')

and have splinter 1 and splinter2 share the same state, but a
different state than the one shared by members of the BORG collective.

Any suggestions from the metaclass experts?
You don't need a metaclass. Just turn _shared_state into a dictionary of
shared states, keyed by the group name:

class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

HTH,

--
Carsten Haese
http://informixdb.sourceforge.net
Sep 7 '07 #2
On Sep 7, 10:27 am, Carsten Haese <cars...@uniqsy s.comwrote:
On Fri, 2007-09-07 at 12:31 +0000, André wrote:
In my application, I make use of the Borg idiom, invented by Alex
Martelli.
class Borg(object):
'''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273
Derive a class form this; all instances of that class will share
the
same state, provided that they don't override __new__; otherwise,
remember to use Borg.__new__ within the overriden class.
'''
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj
----
This has worked very well so far, but is starting to impose some
unwanted constraints on my program design.
What I would like to do is, to put it figuratively, create a Borg
rebellion with various splinter groups. In concrete Python terms, I
would like to have
class MyClass(Borg, ...):
...
seven_of_nine = MyClass(...) # part of group "BORG"
two_of_nine = MyClass(...)
splinter1 = MyClass(..., group='splinter ')
splinter2 = MyClass(..., group='splinter ')
and have splinter 1 and splinter2 share the same state, but a
different state than the one shared by members of the BORG collective.
Any suggestions from the metaclass experts?

You don't need a metaclass. Just turn _shared_state into a dictionary of
shared states, keyed by the group name:

class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

HTH,

--
Carsten Haesehttp://informixdb.sour ceforge.net
Unfortunately, it fails. Here's what I tried, followed by the
traceback
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name

a1 = MyClass('a')
a2 = MyClass('aa')
b1 = MyClass('b', group="B")
Traceback (most recent call last):
File "test.py", line 15, in <module>
b1 = MyClass('b', group="B")
TypeError: __init__() got an unexpected keyword argument 'group'
Sep 7 '07 #3
André wrote:
On Sep 7, 10:27 am, Carsten Haese <cars...@uniqsy s.comwrote:
>On Fri, 2007-09-07 at 12:31 +0000, André wrote:
>>In my application, I make use of the Borg idiom, invented by Alex
Martelli.
class Borg(object):
'''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273
Derive a class form this; all instances of that class will share
the
same state, provided that they don't override __new__; otherwise,
remember to use Borg.__new__ within the overriden class.
'''
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj
----
This has worked very well so far, but is starting to impose some
unwanted constraints on my program design.
What I would like to do is, to put it figuratively, create a Borg
rebellion with various splinter groups. In concrete Python terms, I
would like to have
class MyClass(Borg, ...):
...
seven_of_ni ne = MyClass(...) # part of group "BORG"
two_of_nine = MyClass(...)
splinter1 = MyClass(..., group='splinter ')
splinter2 = MyClass(..., group='splinter ')
and have splinter 1 and splinter2 share the same state, but a
different state than the one shared by members of the BORG collective.
Any suggestions from the metaclass experts?
You don't need a metaclass. Just turn _shared_state into a dictionary of
shared states, keyed by the group name:

class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

HTH,

--
Carsten Haesehttp://informixdb.sour ceforge.net

Unfortunately, it fails. Here's what I tried, followed by the
traceback
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name

a1 = MyClass('a')
a2 = MyClass('aa')
b1 = MyClass('b', group="B")
Traceback (most recent call last):
File "test.py", line 15, in <module>
b1 = MyClass('b', group="B")
TypeError: __init__() got an unexpected keyword argument 'group'

Because your subclass signature is completely wrong. Why did you feel
you had to add an __init__() method to your subclass? This has two bvad
effects:

1. It stops the super-class's __init__() method from being called, and

2. It breaks the calling syntax specified in the superclass.

All you really need is to create your SplinterBorgs with appropriate
group names, you don't neef subclasses at all:

a1 = SplinterBorg(gr oup="one")
a2 = SplinterBorg(gr oup="two")

and so on.

If you want to create subclasses then they should work like this:

class MyBorg1(Splinte rBorg):
def __init__(self):
SplinterBorg.__ init__(self, group='borg1')

and so on, with a different group for each. But this seems over complicated.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------

Sep 7 '07 #4
On Fri, 2007-09-07 at 15:54 +0000, André wrote:
Unfortunately, it fails. Here's what I tried, followed by the
traceback
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name
[...]
Traceback (most recent call last):
File "test.py", line 15, in <module>
b1 = MyClass('b', group="B")
TypeError: __init__() got an unexpected keyword argument 'group'
Indeed, if you have an __init__ method that shouldn't see the "group"
argument, you need a metaclass after all so you can yank the "group"
argument between __new__ and __init__. The following code seems to work,
but it's making my brain hurt:

class SplinterBorgMet a(type):
def __call__(cls, *args, **kwargs):
inst = cls.__new__(cls , *args, **kwargs)
kwargs.pop("gro up",None)
inst.__init__(* args,**kwargs)
return inst

class SplinterBorg(ob ject):
__metaclass__ = SplinterBorgMet a
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name

The alternatives, as Steve just pointed out, would be not to subclass
SplinterBorg or to provide an __init__ method that expects a "group"
argument.

HTH,

--
Carsten Haese
http://informixdb.sourceforge.net
Sep 7 '07 #5
On Sep 7, 3:53 pm, Steve Holden <st...@holdenwe b.comwrote:
André wrote:
On Sep 7, 10:27 am, Carsten Haese <cars...@uniqsy s.comwrote:
On Fri, 2007-09-07 at 12:31 +0000, André wrote:
In my application, I make use of the Borg idiom, invented by Alex
Martelli.
class Borg(object):
'''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273
Derive a class form this; all instances of that class will share
the
same state, provided that they don't override __new__; otherwise,
remember to use Borg.__new__ within the overriden class.
'''
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj
----
This has worked very well so far, but is starting to impose some
unwanted constraints on my program design.
What I would like to do is, to put it figuratively, create a Borg
rebellion with various splinter groups. In concrete Python terms, I
would like to have
class MyClass(Borg, ...):
...
seven_of_nin e = MyClass(...) # part of group "BORG"
two_of_nine = MyClass(...)
splinter1 = MyClass(..., group='splinter ')
splinter2 = MyClass(..., group='splinter ')
and have splinter 1 and splinter2 share the same state, but a
different state than the one shared by members of the BORG collective.
Any suggestions from the metaclass experts?
You don't need a metaclass. Just turn _shared_state into a dictionary of
shared states, keyed by the group name:
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj
HTH,
--
Carsten Haesehttp://informixdb.sour ceforge.net
Unfortunately, it fails. Here's what I tried, followed by the
traceback
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj
class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name
a1 = MyClass('a')
a2 = MyClass('aa')
b1 = MyClass('b', group="B")
Traceback (most recent call last):
File "test.py", line 15, in <module>
b1 = MyClass('b', group="B")
TypeError: __init__() got an unexpected keyword argument 'group'

Because your subclass signature is completely wrong. Why did you feel
you had to add an __init__() method to your subclass? This has two bvad
effects:

Because this is what I need to do currently with using the standard
Borg class, and is something I would like to be able to do. Here's a
simplified version of the current usage I have
=====
class Borg(object):
_shared_state = {}
def __new__(cls, *a, **k):
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta te
return obj

class BorgConsole(Bor g, SingleConsole):
'''Every BorgConsole share a common state'''
def __init__(self, locals={}, filename="Crunc hy console"):
SingleConsole._ _init__(self, locals, filename=filena me)

=====
and it is called via something like
a_console = BorgConsole(loc als)

where locals is a previously defined dict. Note that a number of
such instances are created dynamically as the program is used.

What I would like to do is to be able to add a "page_id" (the Borg
group referred to my previous message), so that I could call

a_console = BorgConsole(loc als, page_id)
where page_id would be an optional argument, defaulting to the BORG
group, as mentioned in my original post.

I must admit I did not try with keywords arguments ... and will not be
for a couple of hours while I am at work.

>
1. It stops the super-class's __init__() method from being called, and
I don't understand why this is so here, and not with the usual Borg
case as I used it...
2. It breaks the calling syntax specified in the superclass.

All you really need is to create your SplinterBorgs with appropriate
group names, you don't neef subclasses at all:

a1 = SplinterBorg(gr oup="one")
a2 = SplinterBorg(gr oup="two")

and so on.

If you want to create subclasses then they should work like this:

class MyBorg1(Splinte rBorg):
def __init__(self):
SplinterBorg.__ init__(self, group='borg1')

and so on, with a different group for each. But this seems over complicated.
I do need subclasses (I think) as my classes inherit from more than
the SplinterBorg class... I'll see what I can do following some of
your suggestions.

Thanks for the reply,

André
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------

Sep 7 '07 #6
On Sep 7, 4:00 pm, Carsten Haese <cars...@uniqsy s.comwrote:
On Fri, 2007-09-07 at 15:54 +0000, André wrote:
Unfortunately, it fails. Here's what I tried, followed by the
traceback
class SplinterBorg(ob ject):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj
class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name
[...]
Traceback (most recent call last):
File "test.py", line 15, in <module>
b1 = MyClass('b', group="B")
TypeError: __init__() got an unexpected keyword argument 'group'

Indeed, if you have an __init__ method that shouldn't see the "group"
argument, you need a metaclass after all so you can yank the "group"
argument between __new__ and __init__. The following code seems to work,
but it's making my brain hurt:

class SplinterBorgMet a(type):
def __call__(cls, *args, **kwargs):
inst = cls.__new__(cls , *args, **kwargs)
kwargs.pop("gro up",None)
inst.__init__(* args,**kwargs)
return inst

class SplinterBorg(ob ject):
__metaclass__ = SplinterBorgMet a
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name

The alternatives, as Steve just pointed out, would be not to subclass
SplinterBorg or to provide an __init__ method that expects a "group"
argument.

HTH,
Thanks for your reply. I will try to adapt it and see if it works in
my case.

André
--
Carsten Haesehttp://informixdb.sour ceforge.net

Sep 7 '07 #7
Carsten Haese wrote:
Indeed, if you have an __init__ method that shouldn't see the "group"
argument, you need a metaclass after all so you can yank the "group"
argument between __new__ and __init__. The following code seems to work,
but it's making my brain hurt:

class SplinterBorgMet a(type):
def __call__(cls, *args, **kwargs):
inst = cls.__new__(cls , *args, **kwargs)
kwargs.pop("gro up",None)
inst.__init__(* args,**kwargs)
return inst

class SplinterBorg(ob ject):
__metaclass__ = SplinterBorgMet a
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group"," BORG")
obj = object.__new__( cls, *a, **k)
obj.__dict__ = cls._shared_sta tes.setdefault( group,{})
return obj

class MyClass(Splinte rBorg):
def __init__(self, name):
self.name = name
I think I would probably write that as::
>>class SplinterBorgMet a(type):
... def __init__(cls, name, bases, bodydict):
... cls._shared_sta tes = {}
... def __call__(cls, *args, **kwargs):
... group = kwargs.pop('gro up', None)
... inst = cls.__new__(cls , *args, **kwargs)
... inst.__dict__ = cls._shared_sta tes.setdefault( group, {})
... inst.__init__(* args, **kwargs)
... return inst
...
>>class MyClass(object) :
... __metaclass__ = SplinterBorgMet a
... def __init__(self, name):
... self.name = name
...
>>a = MyClass('a')
aa = MyClass('aa')
b = MyClass('b', group='b')
bb = MyClass('bb', group='b')
a.name, aa.name, b.name, bb.name
('aa', 'aa', 'bb', 'bb')

That is, I don't think there's really a need for __new__ if you're using
a metaclass. Just set the instance's __dict__ in the __call__ method of
the metaclass.

STeVe
Sep 7 '07 #8
On Fri, 2007-09-07 at 14:54 -0600, Steven Bethard wrote:
Carsten Haese wrote:
[slightly convoluted example...]

I think I would probably write that as::
[concise example...]

That is, I don't think there's really a need for __new__ if you're using
a metaclass. Just set the instance's __dict__ in the __call__ method of
the metaclass.
Good point. I suppose it shows that this is the first metaclass I've
ever written, but it works, and it didn't make my brain explode ;)

--
Carsten Haese
http://informixdb.sourceforge.net
Sep 8 '07 #9
On Sep 7, 1:53 pm, Steve Holden <st...@holdenwe b.comwrote:
All you really need is to create your SplinterBorgs with appropriate
group names, you don't neef subclasses at all:
Dang. With that subject heading I thought this was about some post-
Singularity, Python-programmed cyborgs rising up to take over the
universe.

See, e.g.
<a href="http://www.amazon.com/How-Survive-Robot-Uprising-Defending/dp/
1582345929/inscape-20">How To Survive A Robot Uprising</a>

I am officially misled!

rd

Sep 8 '07 #10

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

Similar topics

5
2270
by: Irmen de Jong | last post by:
Hi, I've developed the Metaclass below, because I needed a way to make a bunch of classes thread-safe. I didn't want to change every method of the class by adding lock.aqcuire()..lock.release() around the existing code. So I made a metaclass that essentially replaces every method of a class with a 'wrapper' method, that does the locking, invocation, unlocking. Is this the right approach? It seems to work fine. But I have
33
2542
by: Jacek Generowicz | last post by:
I would like to write a metaclass which would allow me to overload names in the definition of its instances, like this class Foo(object): __metaclass__ = OverloadingClass att = 1 att = 3
6
1947
by: Steven D'Aprano | last post by:
I've been working with the Borg design pattern from here: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531 and I'm having problems subclassing it. I'm a newbie, so I've probably missed something obvious. I want two Borg-like classes where all instances share state within each class, but not between them. This is what I tried:
14
2037
by: Pedro Werneck | last post by:
Hi I have a class A, with metaclass M_A, and class B, subclass of A, with metaclass M_B, subclass of M_A. A class C, subclass of B must have M_B or a subclass of it as metaclass, but what if I need to 'disable' the code in M_B on C ? The correct way to do that seems to be with a M_C metaclass, subclass of M_B, implementing but not calling parent class methods, or calling 'type' methods.
0
1083
by: mikelostcause | last post by:
Is there anyway to hold the base.WndProc(ref m) until after the Logout() function finishes loading a webpage?? I'm working on shutting down an app that runs in the system tray, I have no problems shutting down, but I have problems saving data first. if the base.WndProc(ref m) is placed at the top, it closes, but the system does not continue to shutdown and it does not save the data via the Logout() funtion. If the base.WndProc(ref m)...
1
1844
by: Jake Barnes | last post by:
I searched comp.lang.javascript on Google Groups but I didn't find an answer when I searched for "viewport" or "viewport div" or any combination of words using "viewport" so now I think I'm searching for the completely wrong thing. Perhaps someone can tell me what I should be searching for? I've got a div with overflow set to "auto": overflow:auto
4
1161
by: Chuck B | last post by:
I have a .NET application installed on a server. It runs fine when I run an instance on my PC. My question is, is it possible to run a .NET app hosted on a server without having the framework installed on the client PC?
2
950
by: Chuck B | last post by:
Is it equally possible to create WPF objects for use in a web browser as well as WinForms?
5
2109
by: Lie | last post by:
This is probably unrelated to Python, as this is more about design pattern. I'm asking your comments about this design pattern that is similar in functionality to Singleton and Borg: to share states. I'm thinking about this design pattern (I don't know if anyone has ever thought of this pattern before): class OddClass(object): def __init__(self): global OddClass
0
9594
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 synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10599
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. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10346
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 captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10347
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 most users, this new feature is actually very convenient. If you want to control the update process,...
0
10090
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 choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9173
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 launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
6863
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5531
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
2
3832
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

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.