Pharo-users
By thread
pharo-users@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
November 2016
- 84 participants
- 556 messages
Re: [Pharo-users] may I please be added to the Mercap/HighchartsSt repo
by Mariano Martinez Peck
That's great to hear. Let me know if the latest commits do work for you
(they should work for 5.0.2).
Cheers,
On Tue, Nov 8, 2016 at 7:43 PM, Richard Pillar via Pharo-users <
pharo-users(a)lists.pharo.org> wrote:
>
>
> ---------- Forwarded message ----------
> From: Richard Pillar <richardpillar(a)googlemail.com>
> To: Any question about pharo is welcome <pharo-users(a)lists.pharo.org>
> Cc:
> Date: Tue, 8 Nov 2016 22:43:30 +0000
> Subject: Re: [Pharo-users] may I please be added to the
> Mercap/HighchartsSt repo
> Hi,
>
> This is great news.
>
> I have been using Highcharts for some of my personal projects and have
> added code to build box plots and heat charts.
>
> I will download the updates shortly.
>
> Many Thanks
>
> Richard
>
> On Mon, Nov 7, 2016 at 2:33 AM, Mariano Martinez Peck <
> marianopeck(a)gmail.com> wrote:
>
>> Paul,
>>
>> Quick comment: I was about to make an ANN soon but.... I have been
>> refactoring it a LOT these last days and I did:
>>
>> 1) make it fully the auto-generation code (already done)
>> 2) making it work for highcharts 5.0.2 (already done)
>> 3) start supporting highstocks (was going to start this this week).
>>
>> Please please please grab the very last version. What are your plans with
>> it?
>>
>> I just added you.
>>
>> Cbest
>>
>>
>>
>> On Sat, Nov 5, 2016 at 3:24 PM, PAUL DEBRUICKER <pdebruic(a)gmail.com>
>> wrote:
>>
>>> I'd like to add code that allows the creation of boxplots:
>>>
>>> http://www.highcharts.com/docs/chart-and-series-types/box-plot-series
>>>
>>>
>>> my username is pdebruic
>>>
>>>
>>> Thanks
>>>
>>>
>>
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>
>
>
--
Mariano
http://marianopeck.wordpress.com
Nov. 9, 2016
Re: [Pharo-users] [ANN] CPPBridge: One Ring to rule them ALL
by Dimitris Chloupis
I would not call you lazy, its normal to want to see documentation before
installing something and at least an example. Actually thats a good idea, I
will add a few more comments in the example and use it on repo's front
page.
On Wed, Nov 9, 2016 at 12:56 PM Denis Kudriashov <dionisiydk(a)gmail.com>
wrote:
>
> 2016-11-09 11:41 GMT+01:00 Dimitris Chloupis <kilon.alios(a)gmail.com>:
>
> "Hi.
>
> It would be nice to see simple code (not in video) how to create memory
> and read/write data to it."
>
> If you get the Project it comes with an example how to use in the class
> side of the CPPBridge Class and its in methods retrieveSharedValueStep1 and
> retrieveSharedValueStep2
>
>
> I just a lazy guy. Thank's for pointing code here.
>
>
Nov. 9, 2016
Re: [Pharo-users] [ANN] CPPBridge: One Ring to rule them ALL
by Denis Kudriashov
2016-11-09 11:41 GMT+01:00 Dimitris Chloupis <kilon.alios(a)gmail.com>:
> "Hi.
>
> It would be nice to see simple code (not in video) how to create memory
> and read/write data to it."
>
> If you get the Project it comes with an example how to use in the class
> side of the CPPBridge Class and its in methods retrieveSharedValueStep1 and
> retrieveSharedValueStep2
I just a lazy guy. Thank's for pointing code here.
Nov. 9, 2016
Re: [Pharo-users] [ANN] CPPBridge: One Ring to rule them ALL
by Dimitris Chloupis
"Hi.
It would be nice to see simple code (not in video) how to create memory and
read/write data to it."
If you get the Project it comes with an example how to use in the class
side of the CPPBridge Class and its in methods retrieveSharedValueStep1 and
retrieveSharedValueStep2, first one open the files , access the shared
memory and pick the value from shared memory, the second unmaps the file
from memory and closes the file (access to shared memory remains , the file
is is just no longer auto-saved by the OS). All methods are documented and
class comes with a comment.
Yes basically what I have done is to extend the LibC class because every
function I am using is from LibC aka as C standard library that comes
included in MacOS and Linux. Windows is doing its own thing , I have not
ported to windows yet, though if you have something that install LibC (part
of GCC) on Windows probably it works there too. But I will make a native
port to Windows as well because its crucial for my gamers to play my games
out of the box with no additional install of libraries or what else.
One thing I did not make clear, the file opened plays a minor role for the
shared memory its just used to store a dumb of the memory just like we do
with the Pharo image (though in the case of Pharo image is bytecode) . As
such file I/O is never involved in accessing the data instead it gives
direct access to the memory , hence why its blazing fast.
I don't have any issue to add this to LibC of UFFI but this decision is to
Esteban, I just did not want to put more things in the Pharo image that
people wont use since we try to decrease the size of the image.
CPPBridge currently does not provide anything else, however in truth it
does not need to. The moment you share date, that means you share state and
you can even control code execution. Unfortunately C/C++ is not a dynamic
language like Python, with Python all I had to do was to pass strings to
python eval() and let python execute whatever command I wanted, but with
C++ these things will have to be precompiled in order to work.
Most likely I will be adding in the near future classes and method of
convenience for using C++ libraries/code from Pharo and Pharo
libraries/code from C++. Possible will add also Python support. Other
language that can be supported are C# (and any other language running on
.NET or Mono related) , Java (again any other language running on JavaVM ),
Ruby , Pearl, D, J, Julia, R , so pretty much any language out there. C/C++
obviously is optional.
I am pasting bellow the source of the two methods I mentioned, code can be
also viewed here
https://github.com/kilon/CPPBridge/blob/master/CPPBridge.package/CPPBridge.…
and here
https://github.com/kilon/CPPBridge/blob/master/CPPBridge.package/CPPBridge.…
---------------------------------------------------------
retrieveSharedValueStep1
<example>
"This method is an example that retrieves a struct from a shared memory
section, in order for this example to work you need you first copy paste
the contents of the Example Souce Code of the C++ file in the comment
section of this class to a C++ source code file and compile it a run then
replace the path of in this code of CPPBridge openFile: with the correct
path of the bin that the C++ files has created , in order for this to work
also you need to execute the C++ example first so it creates and file and
share the memory.
After executing this method you can execute retrieveSharedValueStep2 to
unmap and close the memory mapped file (keeps sharing the memory it just
does not store it to the file)"
| instance fdNumber lseek mmapPointer data struct |
instance := CPPBridge new.
fdNumber := CPPBridge openFile: '/Users/kilon/git/Pharo/Atlas/mmapped.bin'
flags: (O_RDWR) .
"Warning !!! You must change the path to the file that is located in your
hard drive. The file should be at the same location you built
atlas-server.cpp which is responsible for creating the file."
lseek := CPPBridge lSeek_fd: fdNumber range:3999 value:0.
mmapPointer := CPPBridge mmap_adress: 0 fileSize:4000 flag1: (PROT_READ |
PROT_WRITE )flag2: MAP_SHARED fd: fdNumber offset: 0 .
struct := CPPStruct pointTo: (mmapPointer getHandle ).
data :={ instance. fdNumber . lseek. mmapPointer . struct}.
data inspect.
ExampleDATA := data.
^data
"
This is an alternative array that contains only the two values of the C
Struct :
1) data = char[3000] this is where we store the string
2) count = int this is where we store the size of the string
struct := {(mmapPointer getHandle copyFrom: 1 to:3000 )asString .
(mmapPointer getHandle integerAt: 3001 size:4 signed: false)}.
mmapPointer is the pointer that points to the first byte of the shared
memory.
getHandle gives us the memory adress that the pointer points to
copyFrom:1 to:3000 copies byte from byte 0 (remember C counts from 0 ,
Pharo counts from 1) to byte 3000 because the string we store is stored as
a char array of 3000 elements, each element is a char, each char is 1 byte
in leght and represents a single character of the string.
on the other hand integerAt: 3001 size: 4 signed: false returns us the
value count memeber of the C struct . its an integer in position 3001
because our string is a char[3000] and the size is 4 bytes because its an C
int, signed false because we use no negative values because it does not
make sense for a string to have negative length."
------------------------------------------
retrieveSharedValueStep2
<example>
"this one is to be triggered after retrieveSharedValueStep1 when we are
finished with the shared memory and we want to erase it and close the
memory mapped file
ExampleDATA = { CPPBridgeinstance . fd . lseek . mmap . struct}"
CPPBridge munmap_data: (ExampleDATA at: 4) filesize: 4000.
CPPBridge closeFile: (ExampleDATA at: 2).
Nov. 9, 2016
Re: [Pharo-users] [ANN] CPPBridge: One Ring to rule them ALL
by Denis Kudriashov
Hi.
It would be nice to see simple code (not in video) how to create memory and
read/write data to it.
As I understand you create bindings to OS shared memory functions. What
else CPPBridge provides? Why not separate bindings to another project?
because it could be useful without any C++ relation.
Best regards,
Denis
2016-11-09 0:06 GMT+01:00 Dimitris Chloupis <kilon.alios(a)gmail.com>:
>
> *https://youtu.be/pI4PR3XaX6Q <https://youtu.be/pI4PR3XaX6Q>*
>
> *What is it ?*
>
> CPPBridge is a library that allows Pharo to share memory with any C/C++
> application. Opening the door not only to IPC and data sharing but also
> even complete control of C++ code from Pharo and vice versa.
>
> *How to install ?*
>
> In a few hours it should be available from Package Browser, if not you can
> always fetch it with Metacello from here because it comes with a Baseline
>
> https://github.com/kilon/CPPBridge
>
> *Why bother making such a library ? *
>
> In my saga to find a way to use Pharo as a scripting language for Unreal
> Game Engine, I had two options
>
> a) Build Unreal as a Library and use Pharo UFFI to launch and control it
> b) Embed Pharo inside the Unreal Executable (this is what every other
> scripting language uses for controlling Unreal)
>
> Option (a) was a no go, because Unreal is huge , complex and uses its own
> custom made build tools, making a DLL for Pharo or an army of DLLs out of
> the question
>
> Option (b) Embeding Pharo inside an executable is impossible and
> implementing it also insanely complex
>
> Naturally my mind went first into sockets which is what I use to make
> Pharo able to use Python libraries. However sockets have proven too slow
> for the insanely fast loops of Unreal.
>
> *What are the advantages ?*
>
> 1) *No need to move data around.* Sharing memory means you don't have to
> move data around, you can use directly the shared memory
>
> 2)* Extend the Pharo image beyond Pharo.* Shared memory is mapped into a
> file means that you can do with C++ what you can do with Pharo image, save
> the live state directly to a binary file. That means we no longer need to
> worry about sessions and reinitializing C/C++ data since memory mapped file
> acts as an extension of the Pharo image.
>
> 3) *Blazing fast. *Memory mapping is a function that comes directly from
> the OS kernel and as such it has to be extremely fast. Memory mapping is
> also what is used for dynamically linked shared libraries an extremely
> important feature for any application including Pharo that heavily depends
> on (see Cairo for Athens). So its a very mature , well tested method.
>
> 4) *No extra libraries needed* to be installed, CPPBridge uses OS
> libraries to work out of the box
>
> 5) *Low level handling of memory.* Direct access to memory you can even
> manipulate the memory byte by byte
>
> 6)* Memory efficient.* Memory mapping excels at large data, the bigger
> the better. Can take full advantage of your entire free memory and not
> waste a byte. That means also that can be used to optimise Pharo memory,
> since you could compress your Pharo objects to bytes and mapped file will
> store the live state.
>
> 7) *Tons of Languages. *Because memory mapping is a core functionality
> for every OS out there, pretty much every programming language supports it.
> CPPBridge currently supports only C/C++ but all languages can be supported
> giving access to Pharo to any library for any programming language. Sky is
> the limit
>
> 8) *Self Documented. *CPPBridge is small, simple and with large class
> comment and comments for every method. YouTube video tutorial also
> available and linked on top.
>
> 9) *Works both ways*, C/C++ and Pharo can access and modify the shared
> memory. Making it possible for C/C++ to use Pharo libraries and Pharo to
> use C/C++ libraries.
>
> 10) Experiments have proven that it improves sex life... if it does not
> please file a bug report ;)
>
>
> *What are the disadvantages ?*
>
> 1) *Candy Crash Saga*. Dare do something incorrectly and Pharo will
> crash. CPPBridge can easily point to wrong address if you are not aware of
> what you doing.
>
> 2) *C++/C* . If you think you can avoid learning C/C++ and that this is a
> magic solution , think again. The C/C++ application must be modified to
> include shared memory mapping for CPPBridge to work .
>
> 3) *Local only*. Unlike sockets, Shared Memory works only on the same
> machine so no remote execution and manipulation of code like in my socket
> bridge to Python
>
> 4) *UFFI still No1 option*. No replacement for UFFI it actually depends
> on it to work , so if you can turn your C/C++ code into a DLL that should
> be your first option.
>
> *Roadmap *
>
> Currently CPPBridge works only on MacOS , most likely on Linux too
> (because it uses the Unix architecture) but I will have to test it.
>
> Windows is coming next ASAP, since its my No1 platform for creating
> commercial games.
>
> Maybe establish a small protocol of communication via the Shared Memory ,
> JSON looks like a good universal format
>
> *Thanks*
>
> Big thanks to Eliot for inspiring me and Esteban for helping me figure out
> things.
>
Nov. 9, 2016
Re: [Pharo-users] UFFI can not generate Structure accessor of type char[100]
by Esteban Lorenzano
> On 9 Nov 2016, at 02:33, Igor Stasenko <siguctua(a)gmail.com> wrote:
>
>
>
> On 8 November 2016 at 13:11, Esteban Lorenzano <estebanlm(a)gmail.com <mailto:estebanlm@gmail.com>> wrote:
>
>> On 8 Nov 2016, at 12:55, Dimitris Chloupis <kilon.alios(a)gmail.com <mailto:kilon.alios@gmail.com>> wrote:
>>
>> Thank you Esteban
>>
>> By the way I really love the design of UFFI , very clean and quite easy to understand , great work to you and Igor :)
>
> UFFI is just mine ;)
> (but I sanded in giant shoulders as I took Igor work as inspiration⦠and to âborrowâ many cool ideas)
>
> Your credit is too generous :)
> Btw, is this expression:
>
> FFITypeArray ofType: #char.
>
> creates anonymous class, or you making an instance of something?
>
> Because if it anonymous class, i was always warned against use it in such form, and instead use some kind of class initializers to
> generate all the 'types' you will use in future i.e.
>
> MyCalss class>>initialize
> MyCharr100Type := FFITypeArray ofType: #char size:100.
>
> and then just use it wherever you need i.e.:
>
> mychars := MyChar100Type new.
is exactly like you say :)
Esteban
>
> .. whatever.
>
> Esteban
>
>>
>> On Tue, Nov 8, 2016 at 1:54 PM Esteban Lorenzano <estebanlm(a)gmail.com <mailto:estebanlm@gmail.com>> wrote:
>>> On 8 Nov 2016, at 12:49, Dimitris Chloupis <kilon.alios(a)gmail.com <mailto:kilon.alios@gmail.com>> wrote:
>>>
>>> I was reaching a similar conclusion
>>>
>>> Currently I have a void pointer to the struct with the members I mentioned
>>>
>>> I can get char[100]
>>>
>>> pointerToStruct fromCString
>>>
>>> and I can get the int with
>>>
>>> pointerToStruct getHandle integerAt: 101 size:4 signed: false
>>>
>>> so if I want to pass the address of the pointer to my YourStruct instance will I have to initialize with
>>>
>>> YourStruct fromHandler: (pointerToStruct getHandle)
>>>
>>> is this a correct and safe way to pass the address ?
>>
>> yes.
>>
>> Esteban
>>
>>>
>>>
>>> On Tue, Nov 8, 2016 at 1:21 PM Esteban Lorenzano <estebanlm(a)gmail.com <mailto:estebanlm@gmail.com>> wrote:
>>> it never could.
>>> you need to do a âspecial typeâ, who has to be something like:
>>>
>>> YourStruct class>>initialize
>>> Char100 := FFITypeArray ofType: #char.
>>>
>>> fieldsDesc
>>> ^ #(
>>> Char100 data;
>>> int count;
>>> )
>>>
>>> but then⦠you want to optimise that and in field accessors, who will look something like this:
>>>
>>> YourStruct >>data
>>> "This method was automatically generated"
>>> ^(FFITypeArray ofType: #char size: 100) fromHandle: (handle copyFrom: 1 to: 100)
>>>
>>> you can change that for:
>>>
>>> YourStruct >>data
>>> "This method was automatically generated"
>>> ^Char100 fromHandle: (handle copyFrom: 1 to: 100)
>>>
>>> and same for setter.
>>> (other way will work, but it will be suboptimal)
>>>
>>> Esteban
>>>
>>> > On 8 Nov 2016, at 12:10, Dimitris Chloupis <kilon.alios(a)gmail.com <mailto:kilon.alios@gmail.com>> wrote:
>>> >
>>> > I have FFIExternalStructure which has at class side
>>> >
>>> > fieldsDesc
>>> > ^#(
>>> > char data[100];
>>> > int count;
>>> > )
>>> >
>>> > if I try to do
>>> >
>>> > EphCPPTestStructure rebuildFieldAccessors .
>>> >
>>> > in order to generate the accessors for the members of the struct it complains with an error that it does not recognise the type of " [ "
>>> >
>>> > Does that mean that char arrays are other arrays are not supported as struct members or will I have to do this manually ?
>>>
>>>
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
Nov. 9, 2016
Re: [Pharo-users] [ANN] CPPBridge: One Ring to rule them ALL
by Dimitris Chloupis
I am the only potential customer of CPPBridge because
a) I am the only C++ coder AFAIK
b) Using DLLs (dynamically linked shared libraries) is still by far the
best solution because using the UFFI you can do everything from Pharo.
Compared to CPPBridge which you will need to code in C++.
So as you can imagine making a general library for IPC communication via
shared memory is not my goal.
The Unreal part will be a separate library that will depend on this one. I
have not touched that one yet but I will soon.
UnrealBridge library will become my most important Pharo project because
the goal is to start selling games using Pharo and Unreal.
IPC Protocol wise , I don't think synchronisation will be an issue because
Unreal will be too fast for Pharo anyway and its ok if Pharo lags behind
even a few dozens of milliseconds which is a matter of losing a couple of
frames. I may implement a hybrid synchronisation for when Pharo lag becomes
too severe but that will have and see in practice.
Something that interest me is "stealing" your idea for NBOpenGL where you
made an automatic generator for the library that used OpenGL headers. This
is something that could benefit me a lot because Unreal contains over
10.000 methods and wrapping them one by one is not something I am looking
forward to doing. This means generating both C++ and Pharo code.
Of course if I feel that what I implement with UnrealBridge is general
purpose enough I can port it back to CPPBridge.
In any case I must say it was a lot of fun accomplishing this goal and cant
wait to dive deeper into IPC magic, making Pharo the nerve centre, the
brain , of my coding environment is a role that I think Pharo would excel
at. It will also allow me to use Pharo as much as possible and provide a
super powerful game / graphics engine to the Pharo community. Shared memory
is that just the means to that goal.
Moose could also a play role later on for analysing my game code both in
Pharo and C++ and use Roassal for some nifty visualizations though I could
use Unreal as backend to Roassal for some nice 3d visualisations.
So ton of ideas, tons of fun and a ton of time to accomplish them.
PS: I have to say you have been inspiration for my IPC saga, you did the
unthinkable (at least to me) and brought Assembly to Pharo, I never had a
use for Assembly but nonetheless you taught me that Pharo potential is more
massive than I imagined, so thank you :)
On Wed, Nov 9, 2016 at 3:21 AM Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 9 November 2016 at 02:09, Dimitris Chloupis <kilon.alios(a)gmail.com>
> wrote:
>
> I have only played with c structs and it looks like they do the job fine .
> If json parsing is slow especially in Pharo then it's out of the question.
> Parsing must be kept close to zero because I will be running some very
> tight loops of 100 frames per second and there is no way that I will let
> Pharo take its time as the whole idea of using the fastest way to IPC was
> to keep Pharo in sync with unreal . Heavy lifting will be done only by
> Unreal. Pharo will be used just for logic.
>
> Well, it depends what you want: if you want to give away a
> complete/general solution for IPC with Pharo via shared memory, then you
> should create some kind of library (both C++ and Pharo) which would allow
> users to setup the bridge configuration in the way they want, leaving the
> application-specific exchange to the hands of users.. And if you just want
> to make own data exchange for own purpose, then you are basically done.
>
>
> In any case there is a ton of testing and profiling needed to be done . So
> these are just the first steps.
> On Wed, 9 Nov 2016 at 02:58, Igor Stasenko <siguctua(a)gmail.com> wrote:
>
> JSON? -- But you were talking about speed. Once you put JSON as a base for
> IPC, then say goodbye to speed.
>
> Because JSON parsing/writing will eat like 90% of time even if you would
> use sockets.
> So, why not using some kind of binary protocol?
> Unless you wanna use JSON for initial handshaking exchange. Then it is
> quite reasonable.
>
> But all of that still won't free you from inventing some kind of
> contract(s) which would allow parties to agree who writes where and/or who
> writes, while other waits then reads etc.
>
>
> On 9 November 2016 at 00:06, Dimitris Chloupis <kilon.alios(a)gmail.com>
> wrote:
>
>
> *https://youtu.be/pI4PR3XaX6Q <https://youtu.be/pI4PR3XaX6Q>*
>
> *What is it ?*
>
> CPPBridge is a library that allows Pharo to share memory with any C/C++
> application. Opening the door not only to IPC and data sharing but also
> even complete control of C++ code from Pharo and vice versa.
>
> *How to install ?*
>
> In a few hours it should be available from Package Browser, if not you can
> always fetch it with Metacello from here because it comes with a Baseline
>
> https://github.com/kilon/CPPBridge
>
> *Why bother making such a library ? *
>
> In my saga to find a way to use Pharo as a scripting language for Unreal
> Game Engine, I had two options
>
> a) Build Unreal as a Library and use Pharo UFFI to launch and control it
> b) Embed Pharo inside the Unreal Executable (this is what every other
> scripting language uses for controlling Unreal)
>
> Option (a) was a no go, because Unreal is huge , complex and uses its own
> custom made build tools, making a DLL for Pharo or an army of DLLs out of
> the question
>
> Option (b) Embeding Pharo inside an executable is impossible and
> implementing it also insanely complex
>
> Naturally my mind went first into sockets which is what I use to make
> Pharo able to use Python libraries. However sockets have proven too slow
> for the insanely fast loops of Unreal.
>
> *What are the advantages ?*
>
> 1) *No need to move data around.* Sharing memory means you don't have to
> move data around, you can use directly the shared memory
>
> 2)* Extend the Pharo image beyond Pharo.* Shared memory is mapped into a
> file means that you can do with C++ what you can do with Pharo image, save
> the live state directly to a binary file. That means we no longer need to
> worry about sessions and reinitializing C/C++ data since memory mapped file
> acts as an extension of the Pharo image.
>
> 3) *Blazing fast. *Memory mapping is a function that comes directly from
> the OS kernel and as such it has to be extremely fast. Memory mapping is
> also what is used for dynamically linked shared libraries an extremely
> important feature for any application including Pharo that heavily depends
> on (see Cairo for Athens). So its a very mature , well tested method.
>
> 4) *No extra libraries needed* to be installed, CPPBridge uses OS
> libraries to work out of the box
>
> 5) *Low level handling of memory.* Direct access to memory you can even
> manipulate the memory byte by byte
>
> 6)* Memory efficient.* Memory mapping excels at large data, the bigger
> the better. Can take full advantage of your entire free memory and not
> waste a byte. That means also that can be used to optimise Pharo memory,
> since you could compress your Pharo objects to bytes and mapped file will
> store the live state.
>
> 7) *Tons of Languages. *Because memory mapping is a core functionality
> for every OS out there, pretty much every programming language supports it.
> CPPBridge currently supports only C/C++ but all languages can be supported
> giving access to Pharo to any library for any programming language. Sky is
> the limit
>
> 8) *Self Documented. *CPPBridge is small, simple and with large class
> comment and comments for every method. YouTube video tutorial also
> available and linked on top.
>
> 9) *Works both ways*, C/C++ and Pharo can access and modify the shared
> memory. Making it possible for C/C++ to use Pharo libraries and Pharo to
> use C/C++ libraries.
>
> 10) Experiments have proven that it improves sex life... if it does not
> please file a bug report ;)
>
>
> *What are the disadvantages ?*
>
> 1) *Candy Crash Saga*. Dare do something incorrectly and Pharo will
> crash. CPPBridge can easily point to wrong address if you are not aware of
> what you doing.
>
> 2) *C++/C* . If you think you can avoid learning C/C++ and that this is a
> magic solution , think again. The C/C++ application must be modified to
> include shared memory mapping for CPPBridge to work .
>
> 3) *Local only*. Unlike sockets, Shared Memory works only on the same
> machine so no remote execution and manipulation of code like in my socket
> bridge to Python
>
> 4) *UFFI still No1 option*. No replacement for UFFI it actually depends
> on it to work , so if you can turn your C/C++ code into a DLL that should
> be your first option.
>
> *Roadmap *
>
> Currently CPPBridge works only on MacOS , most likely on Linux too
> (because it uses the Unix architecture) but I will have to test it.
>
> Windows is coming next ASAP, since its my No1 platform for creating
> commercial games.
>
> Maybe establish a small protocol of communication via the Shared Memory ,
> JSON looks like a good universal format
>
> *Thanks*
>
> Big thanks to Eliot for inspiring me and Esteban for helping me figure out
> things.
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
Nov. 9, 2016
Re: [Pharo-users] UFFI can not generate Structure accessor of type char[100]
by Dimitris Chloupis
As a said that expression does not exist
The one with size it does exist and creates an instance as you would
expect.
No idea what an anonymous class is.
I have experienced some slow downs because creating FFI types seems that
copies the data and Pharo chokes with my 3000 bytes char array. So I
decided not to use FFI types and instead fetch the data directly from
shared memory via the pointer which means
anExternalData getHandle unsignedCharAt: for reading
anExternalData getHandle unsignedCharAt: put: for writing
Plus copying the data to Pharo memory kinda defeats the purpose of using
shared memory in the first place and it's unnecessary .
But then I am a special case ... the recommended way remains using those
types.
On Wed, 9 Nov 2016 at 03:34, Igor Stasenko <siguctua(a)gmail.com> wrote:
> On 8 November 2016 at 13:11, Esteban Lorenzano <estebanlm(a)gmail.com>
> wrote:
>
>
> On 8 Nov 2016, at 12:55, Dimitris Chloupis <kilon.alios(a)gmail.com> wrote:
>
> Thank you Esteban
>
> By the way I really love the design of UFFI , very clean and quite easy to
> understand , great work to you and Igor :)
>
>
> UFFI is just mine ;)
> (but I sanded in giant shoulders as I took Igor work as inspiration⦠and
> to âborrowâ many cool ideas)
>
> Your credit is too generous :)
> Btw, is this expression:
>
> FFITypeArray ofType: #char.
>
> creates anonymous class, or you making an instance of something?
>
> Because if it anonymous class, i was always warned against use it in such
> form, and instead use some kind of class initializers to
> generate all the 'types' you will use in future i.e.
>
> MyCalss class>>initialize
> MyCharr100Type := FFITypeArray ofType: #char size:100.
>
> and then just use it wherever you need i.e.:
>
> mychars := MyChar100Type new.
>
> .. whatever.
>
>
> Esteban
>
>
> On Tue, Nov 8, 2016 at 1:54 PM Esteban Lorenzano <estebanlm(a)gmail.com>
> wrote:
>
> On 8 Nov 2016, at 12:49, Dimitris Chloupis <kilon.alios(a)gmail.com> wrote:
>
> I was reaching a similar conclusion
>
> Currently I have a void pointer to the struct with the members I mentioned
>
> I can get char[100]
>
> pointerToStruct fromCString
>
> and I can get the int with
>
> pointerToStruct getHandle integerAt: 101 size:4 signed: false
>
> so if I want to pass the address of the pointer to my YourStruct instance
> will I have to initialize with
>
> YourStruct fromHandler: (pointerToStruct getHandle)
>
> is this a correct and safe way to pass the address ?
>
>
> yes.
>
> Esteban
>
>
>
> On Tue, Nov 8, 2016 at 1:21 PM Esteban Lorenzano <estebanlm(a)gmail.com>
> wrote:
>
> it never could.
> you need to do a âspecial typeâ, who has to be something like:
>
> YourStruct class>>initialize
> Char100 := FFITypeArray ofType: #char.
>
> fieldsDesc
> ^ #(
> Char100 data;
> int count;
> )
>
> but then⦠you want to optimise that and in field accessors, who will look
> something like this:
>
> YourStruct >>data
> "This method was automatically generated"
> ^(FFITypeArray ofType: #char size: 100) fromHandle: (handle
> copyFrom: 1 to: 100)
>
> you can change that for:
>
> YourStruct >>data
> "This method was automatically generated"
> ^Char100 fromHandle: (handle copyFrom: 1 to: 100)
>
> and same for setter.
> (other way will work, but it will be suboptimal)
>
> Esteban
>
> > On 8 Nov 2016, at 12:10, Dimitris Chloupis <kilon.alios(a)gmail.com>
> wrote:
> >
> > I have FFIExternalStructure which has at class side
> >
> > fieldsDesc
> > ^#(
> > char data[100];
> > int count;
> > )
> >
> > if I try to do
> >
> > EphCPPTestStructure rebuildFieldAccessors .
> >
> > in order to generate the accessors for the members of the struct it
> complains with an error that it does not recognise the type of " [ "
> >
> > Does that mean that char arrays are other arrays are not supported as
> struct members or will I have to do this manually ?
>
>
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
Nov. 9, 2016
Re: [Pharo-users] Converting an Array of Characters to a String
by Dimitris Chloupis
Not in C but there std::string in C++ similar to our String object.
C char indeed is more a byte array than a string. Actually C won't allow to
change the string value mainly because it thinks you try to change the size
which something that is not allowed for arrays anyway, so the only way to
change a char string aka char array is character by character.
Null termination is why I filled the shared memory with zeros to be on the
safe side and then added the string and the number on top
On Wed, 9 Nov 2016 at 03:41, Igor Stasenko <siguctua(a)gmail.com> wrote:
> What i meant, i wanted to warn Dimitris that
> char[100]
> are just array of 100 characters (bytes in C).. and has nothing to do with
> strings.
> Do not confuse fixed-length C arrays with strings. There's no 'string'
> data type in C, and instead they use null-terminated character sequence as
> a convention. But it is not a fixed-size data.
>
> On 9 November 2016 at 02:38, Igor Stasenko <siguctua(a)gmail.com> wrote:
>
>
>
> On 8 November 2016 at 14:42, Esteban Lorenzano <estebanlm(a)gmail.com>
> wrote:
>
> (always with Char100 example in mind):
>
> s := MyStructure fromHandle: blah.
> string := s data readString.
>
> should work.
>
>
> IIRC, #readString works correctly only for correctly null-terminated
> strings. If not, it will read beyond the structure size , until it find a
> zero byte somewhere in memory,
> and thus, results may vary :)
>
>
> Esteban
>
>
> > On 8 Nov 2016, at 14:31, Dimitris Chloupis <kilon.alios(a)gmail.com>
> wrote:
> >
> > I feel like stupid but I cannot find a way to convert an Array of
> Characters to a String , I can do with a do: and join characters converted
> to strings to a single string but it feels too many steps.
> >
> > Is there a simpler way ?
>
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
Nov. 9, 2016
Re: [Pharo-users] about balkanisation
by Igor Stasenko
On 7 November 2016 at 14:28, stepharo <stepharo(a)free.fr> wrote:
>
> [ ... ]
>
>
> And this one I don't understand. A smooth, git / iceberg oriented
> transition over Monticello/Metacello is perfectly doable... As Dale
> explained. A nice Iceberg gui reworking / making git usable is perfect.
>
> But why make the transition so hard? You get Stef angry on a Sunday
> morning because he can't find things anymore... even if he is a strong
> proponent of the strategy he complains about ;)
>
>
> No my point was not that.
> My point is that it is important to pay attention and not to add more
> noise than necessary. Let us take the time and move alltogether.
>
> If you want to get somewhere with this story, you don't want to wait till
everything will be ready.
Transition will never start unless you force users to enter the minefield
and let them clear the mines for you. Step by step. Many will blow
themselves up, while some will manage to pass unhurt..
Because else, it will be always a minefield between you and the destination
of your journey :)
> Stef
>
>
> Thierry
>
>
>
--
Best regards,
Igor Stasenko.
Nov. 9, 2016