Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation on 02/05/24 in all areas

  1. What's the reputational cost of the current fiasco?
  2. Vincent Parrett

    GetIt alternatives

    Sure, I do that all the time - but tinkering with something and being good at something are not the same. It's not just the language you need to learn, it's the libraries. I can read and write code in Go, Rust, C, C++, Javascript, Typescript, C#, Delphi - but I would only consider myself good at writing the last 3 (I have used a bunch more languages over the years too). What you are forgetting is just how little time most people have to dedicate to open source development - if you look at the most popular open source delphi projects, you will see they have only a hand full of regular contributors. If you add having to learn a new language (whatever that may be) then you are narrowing the pool of possible contributors substantially. Examples https://github.com/VSoftTechnologies/DUnitX/graphs/contributors - 56 contributors but only one regular one (the author - myself). https://github.com/danieleteti/delphimvcframework/graphs/contributors 42 contributors but only one regular one (the author). https://bitbucket.org/sglienke/spring4d/src/master/ - bitbucket doesn't show the number of contributors but the 99% of the commits come from one person ( the maintainer/new author). Most other contributors contribute the odd bug fix but they tend to be one offs. If they have to learn another language (or are not good at a language) then they either won't contribute or they will move on to an alternative. So yes, being an open source author can be somewhat joyless.
  3. Vincent Parrett

    GetIt alternatives

    I care about whether the community can contribute to it or not. The number of delphi developers who consume open source projects AND are willing to contribute to those projects is very small - when you filter those developers who have Go skills the the number would be vanishingly small. For me though the issue with Boss is the complete lack of discoverability - you have to know a package exists to be able to use it, how do I find the available packages for Boss? With dpm and other package managers that have a public repository (eg. nuget, npm, cargo) that is easy - and dpm presents that list of available packages in the IDE (searchable).
  4. Since years, our Open Source mORMot framework offers several ways to work with any kind of runtime arrays/objects documents defined, e.g. via JSON, with a lot of features, and very high performance. Our TDocVariant custom variant type is a powerful way of working with such schema-less data, but it was found confusing by some users. So we developed a new set of interface definitions around it, to ease its usage, without sacrificing its power. We modelized them around Python Lists and Dictionaries, which is proven ground - with some extensions of course. Two one-liners may show how our mORMot library is quite unique in the forest/jungle of JSON libraries for Delphi (and FPC): +] assert(DocList('[{ab:1,cd:{ef:"two"}}]')[0].cd.ef = 'two'); assert(DocList('[{ab:1,cd:{ef:"two"}}]').First('ab<>0').cd.ef = 'two'); Yes, this code compiles and run on Delphi - even the antique Delphi 7. 😆 If you compare e.g. to how the standard JSON library works in the RTL, with all its per-node classes, you may find quite a difference! And there is no secret in regard to performance, that our JSON processing is fast. More info: https://blog.synopse.info/?post/2024/02/01/Easy-JSON-with-Delphi-and-FPC
  5. OpenSSL has released new versions of the three active versions, 3.2.1, 3.1.5 and 3.0.13 which have three low priority security fixes. Windows binaries are available in SVN and the overnight zip file and separately from https://wiki.overbyte.eu/wiki/index.php/ICS_Download or https://www.magsys.co.uk/delphi/magics.asp In addition to the three DLL files, the zips include compiled RES resource files that contain the same DLLs, text files and version information, see the RC file. The RES file may be linked into application EXE files and code then used to extract the DLLs from the resource to a temporary directory to avoid distributing them separately. ICS V9.1 and later optionally support loading the resource file, currently in SVN and the overnight zip. Beware V9.1 has a lot of other changes that may need application changes, please read the SVN change log very carefully. There will be a lot of new documentation about V9.1 over the next two weeks. Separately, YuOpenSSL has released 3.0.13 as commercial DCUs allowing applications to be used with OpenSSL without needing separate DLLs. Angus
  6. I mean this one: https://quality.embarcadero.com/browse/RSP-43274 (Arithmetic operations on record fields return incorrect results in certain cases if the "Optimization" compiler option is enabled.) This looks like a showstopper bug for me, because it can generate wrong result anywhere in the application. Turning off optimizations will "solve" the problem, but the result will be that all my customers will write to me about how the new version of the app is slow. And as for distribution of the hotfix - is it really impossible to distribute the fix in year 2024 other than through a non-functioning Getit? Downloading files from my.embarcadero.com works normally, so why not put the patch there?
  7. Delphi 12 seems to have more than a normal amount of regressions. I've listed some of them on its wiki page on GitHub: https://github.com/ideasawakened/DelphiKB/wiki/D29.ATHENS.12.0.0.0 GetIt being down stops fixes for these regressions being released. There aren't workarounds for all of these issues.
  8. Apparently the minds in charge think different.
  9. I have to agree. Their information - or rather, lack thereof - is really bad for their reputation.
  10. Creates .caf files by recording audio? You realise you can record to AAC format on iOS, which can be played on Android?
  11. Forgot the moral of all that The best way for high performance is to not push the threads (job or whatever), let them pull/poll on their own time. By centralizing the email handling with watcher in intervals, you will be removing huge bottleneck in case there is many emails, while the dispatchers will be almost a sleep sending and using SMTP because it is slow, so yes you can have 64 dispatcher at the same time and will not notice the CPU usage goes above %1, while the watcher can read hundreds in one go and also this is very short and fast process.
  12. Hi, Of course it is possible. You asked about threads and Remy gave a perfect answer to your question. Now let put my thoughts here: 1) Now you are thinking right and want to do the right thing, i mean eliminate the failing point or at least minimize and if possibly implement a recovery. 2) In my opinion best threads are threads that doesn't talk to each other. 3) You have Sqlite as storage and can serve as central coordinator or a hub while serving its propose to store data/task. What i suggest is to redesign you process a little differently, 1) Lets say you generated an email ( being to recover/restore/reset password or an invoice ...), this generated in a thread (any thread), then it will be pushed into a table in Sqlite, here comes the table itself with few extra columns, dtGenerated : will holds datatime of generation. dtSent : will hold the time it being picked to send ! intSend : the count of send tries. dtDelivered : hold the time when the email being delivered, and here when the SMTP finished receiving the email, we will consider this a success, enStatus : hold the status, Error, Failed, Pending , Delivered.... not so crucial but nice to have You can also put a an extra field to confirm the result of the sending from the SMTP, but this is an extra. Now one thread generate an email, and push it to the DB, there is another (one thread) its job to perform a query for emails in the DB with no dtSent value !, or with pending or ... the way you comfortable with. After grabbing these emails it will dispatch them to another one or more threads to perform the real SMTP sending, mean while and before dispatching them to these workers, that watcher threads will insert an ID of that email into special table called (lets say tbWorking) where that ID is key hence it is impossible to insert it twice, in Sqlite you can replace ID with simple ROWID from the email table, this is unique value, (also notice all DB servers has something similar like in Sqlite RowID is an Integer but in MYSQL it is hex or short string and there is ROWNUM i think..) If an email being sent successfully or not, then and only then the email table can be updated accordingly, and a delete should be issued to tbWorking, this tbWorking will server as lock free list that persist in case of catastrophic failure, like app crash or power cut, Threads will have a small and focused task to do, not generating emails, then store, them then, send them, then store the result... that is way too much work and it is also slow and will take time maximizing the risk of losing an email due to some other failure or Internet lose .... Anyway, what i wrote above is not a full solution that will fit you, most likely you will need to address the main point, what could happen and how to recover from each and every step and moment ? You need to think out side the box of generate-store-send-update and linear processing. I had done a project that similar to what you you need, but it was using MySQL and worked without a problem, With MySQL ?, the emails can be generated from completely different server running php and pushed to the MySQL, my server no matter if itself generated the email or from the web server remotely being added could and can send them all. Also don't forget to store logs for these operation, the logging the faster and more secure your process will be, i used two logging method with that, one on files and the other was in table in the DB, recoding the failures and successes. ps the watcher thread has one job to check for newly added or the emails not in tbWorking, it has low interval like 5-10 second, and will assume nothing on it first run, so it will/must update tbWorking on start, because filled value in that table on start means there is a conflict in need to be address, and the best way is to resend unless these are times email like resetting password then drop them. Hope that helps and give you insight.
  13. @Vincent Parrett - I agree. Simply moving to a cloud hosted VM, running your old services, will be expensive as heck. We have metrics to support that statistic.
  14. By pure chance this video came up on youtube this morning which articulates the point I made above ^ My guess is embarcadero are simply spinning up new vm's and not re-architecting their services - they might be in for a cloud bill shock in the future 🤔
  15. For photos, it's via SelectorImageStreamHandler. Videos are yet to be supported - thanks for the reminder 🙂 Edit: I've opened this issue in Kastri.
  16. Dalija Prasnikar

    FYI - Several Embarcadero services are currently unavailable

    https://blogs.embarcadero.com/we-are-experiencing-a-hardware-outage/ GetIt is still off line, but you can download RADStudio 12 ISO. There is a download link in that blog post.
  17. Due to the supply chain disturbances, we had a 5 month delivery wait for servers and parts for a while, so I can relate to delays. The problems here are: - Lack of proper communication. "No news. Next update at ..." is better than silence! - Insufficient contingency planning? - Insufficient backup and recovery plans? - No plan B? There are many capable cloud hosting services that doesn't take forever to spin up a pack of servers. The cost might be high, sure - but so is the cost of losing the trust of your customers.
×