(NOTES) NOTES (2023)

List of my small freelance project 2023

In this year I done a lot of small freelance projects. Unfortunately I can not listed all of them, some project I made with NDA and some project I made not from my own account. This is a couple of short projects I can list and projects what I can not mention in other my topics.

1. Nifty Football.

Refactoring of this game Nifty Football.

Unfortunately, this project was unsuccessfully for me, I was working a couple of days with this project and after that customer decided discard his order for refactoring and rewrite project from scratch. However project was interesting and I pass a couple of my first tasks. Technically project contains

All components must be packed to Docker and deployed on Amazon

Even starting project in my developer environment not be simple task, project uses Windows API and all times shutdown in my developer environment.

However, I pass all difficulties

and start this project in my developer environments.

I receive this project on NET.Core 3.1 and my first task was be change working framework to .NET 8.0. This was not simple automatically task with disconnected mind, this was be task rewriting code. For example project used AvalonUI and upgrade process require rewriting code https://docs.avaloniaui.net/docs/stay-up-to-date/upgrade-from-0.10.

And a lot of other changing, for example new version Avalon UI don't supported old Theme and I must changed it.

Project has backend API, my next task was advance backend API, I start rewriting...

but unexpectedly, on this step customer discard their order to simple refactoring with me and small money and decided to invest money to full rewrite this game from scratch with another programmer's team, with long development time and huge money.

2. Solve issue with CISCO phone.

Project successfully finished technically and financially.

3. Refactoring desktop application with embedded Excel.

Project successfully finished technically and financially.

4. Tune Auron message bus and write trigger for delivery.

Project interrupted because customer unexpectedly disappear.

5. WebScrapper based on Puppeteer library .

Huge NET CORE 6 project with about 10 thousands code line, but core of this code can not started, headless browser don't opened as expected. There are no any feedback from author of this package. Project interrupted from my initiative.

6. Android application for Truck broker.

Project interrupted because customer has no enough money.

7. Windows desktop program for VoIP telephony.

This is Instruction for customer for first version.

8. Payment gateway.

Project with NDA, this is Liqpay requirement for customer.

9. Various modification ancient ASP projects.

For example this is only one point, adding sorting to table. This is IIFE sorting script https://github.com/AAlex-11/LetsRememberJsFuture/blob/main/Html/IIFE-SortTable.html

And millions other bug fixing like this.

10. Refactoring landing page, add animation, mobile phone supporting and other CSS/JS/jQuery tasks.

I don't working for russian customer since 2014 year, but this is exception, because this is project for small kids, who even can not speaking correctly and can not writing. This is small cheap project for a couple of hours during a couple of days, but this project demonstrate what I can doing on frontend.

For this site I have created a lot of animations, I don't sure how many time my animation will serve on that site, therefore I place a couple of it directly on this page.

   1:  #shift:hover{
   2:     transform: translate(0px, 0px);
   3:     transition: opacity 1500ms ease 0s, transform 1500ms ease 0s;
   4:  }  
   5:  #shift{
   6:     transform: translate(200px, 0px);
   7:     transition: opacity 850ms ease-in-out 0s, transform 1500ms ease-in-out 0s;
   8:  }     

   1:            $(function() {
   2:                for (let i = 1; i < 7; i++) {
   3:                    let k1 = $('<image id="k' + i + '" src="images/k' + i + '.png">').addClass('kube');
   4:                    $('#kube1').append(k1)
   5:                }
   6:            });
   7:            setInterval(() => {
   8:                let i = (Math.floor(Math.random() * 6))
   9:                let el = document.querySelector(`#k${i}`)
  10:                let timer = el.classList.add("trans")
  11:                setTimeout(() => {
  12:                    el.classList.remove("trans")
  13:                }, 400)
  14:                document.querySelector(`#k${i}`)
  15:            }, 500)

Animation on MouseOver
   1:              function colorize(tag) {
   2:                  let lg1 = document.querySelector(tag)
   3:                  let tx1 = lg1.innerText
   4:                  let out1 = '',
   5:                      tmp = ''
   6:                  for (let i = 0; i < tx1.length; i++) {
   7:                      tmp = `<span style="color:${getRandomColor()}";background-color:${getRandomColor()}>${tx1[i]}<span>`
   8:                      out1 = out1 + tmp;
   9:                  }
  10:                  lg1.innerHTML = out1
  11:              }
  13:              function getRandomColor() {
  14:                  var letters = '0123456789ABCDEF';
  15:                  var color = '#';
  16:                  for (var i = 0; i < 6; i++) {
  17:                      color += letters[Math.floor(Math.random() * 16)];
  18:                  }
  19:                  return color;
  20:              }
  22:              function activateLink(tag) {
  23:                  let lg1 = document.querySelector(tag)
  24:                  let lg1timer
  25:                  lg1.onmouseover = () => {
  26:                      lg1timer = setTimeout(function() {
  27:                          colorize(tag)
  28:                      }, 300)
  29:                  };
  30:                  lg1.onmouseout = () => clearInterval(lg1timer);
  31:              }
  33:              window.addEventListener('load', function() {
  34:                  colorize('#Colorized')
  35:                  activateLink('#Colorized')
  36:              })

Site was written on Webflow JS, this rotation is example of WebFlow function (mouseover):

All tabs contents was placed to one huge page with 10 thousands code lines. I split site to a number of tabs in order to do site more understandable. And than load html content from separate parts by jQuery.

Also I made a couple of @media CSS for visible site correctly on various mobile phones

Also I have prepared video on Blender and create a lot of images from GIMP for this site.

11. Lidget project.

This is huge project builded on DevExpress

Project has 64,000 code lines on 701 files, and about 1000 buttons.

Project used huge DB with dozens of Tables and hundreds of SQL procedures.

Also project used about 7,000 lines of SQL request

and a lot of dynamically created SQL request

Also project has Frontend, I don't changed it.

My common task will be make changing business logic of this project, changing mailing system in order to calculate reaction time of regional manager and repair a lot of bugs in site logic (for example previous programmer has permanently confused with link to Agent from Customer entity and Enquiry entity).

And I need to changing reporting subsystem (what based on AspPdf)

Code created stupid simple plain procedure code with thousands of line on each modules, for example this module has more than 2500 code lines, I delete code after 1700 lines (this code need for me in order to my business task for refactoring this site)

And create more usable class hierarchy with Poco-classes and levels of application logic

One of the interesting changing i describe more details. Database of this project has been build based on characters as flag (instead of integer value as usually)

Therefore I decide to change meaningless characters "A","B" to Enum types, based on Char types.

This is my solution for string based Enum - Abstract class

   1:  Imports System.Reflection
   2:  Imports Microsoft.VisualBasic
   4:  Public MustInherit Class StringEnum
   5:      Implements IComparable
   6:      Public Property Id As Integer
   7:      Public Property Value As String
   9:      Protected Sub New(ByVal id As Integer, ByVal _Value As String)
  10:          MyBase.New
  11:          Dim num As Integer = id
  12:          Dim str As String = _Value
  13:          Me.Id = num
  14:          Me.Value = str
  15:      End Sub
  17:      Public Function CompareTo(ByVal other As Object) As Integer Implements IComparable.CompareTo
  18:          Return Me.Id.CompareTo(DirectCast(other, StringEnum).Id)
  19:      End Function
  21:      Public Overrides Function Equals(ByVal obj As Object) As Boolean
  22:          Dim flag As Boolean
  23:          Dim otherValue As StringEnum = TryCast(obj, StringEnum)
  24:          If (otherValue IsNot Nothing) Then
  25:              Dim typeMatches As Boolean = Me.GetType.Equals(obj.GetType)
  26:              Dim id As Integer = Me.Id
  27:              flag = typeMatches And id.Equals(otherValue.Id)
  28:          Else
  29:              flag = False
  30:          End If
  31:          Return flag
  32:      End Function
  34:      Public Shared Function GetAll(Of T As StringEnum)() As IEnumerable(Of T)
  35:          Return DirectCast(GetType(T).GetFields(BindingFlags.DeclaredOnly Or BindingFlags.Static Or BindingFlags.Public), IEnumerable(Of FieldInfo)).
  36:              Select(Of Object)(Function(f As FieldInfo) f.GetValue(Nothing)).
  37:              Cast(Of T)
  38:      End Function
  40:      Public Overrides Function ToString() As String
  41:          Return Me.Value
  42:      End Function
  43:  End Cla

And implementation of that abstract class

Also for this project I used 2 my liked method of refactoring VB.NET code - define interface and create Generic function with Constraint, in this way I reduce code (if it possible without violation Tight Coupling principle), for beginners pay attention to difference between Inherits and Implements (stupid languages like C# never understand difference between this two unrelated OOP futures)

And my second favorite way to expand existing functionality - to add more parameters as return value of existing function, transform single value function to Tuple return function

Btw, look how VB.NET support multi-string SQL constant (I'm not sure that stupid languages like C# support similar future):

Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: http://www.vb-net.com/Freelance2023/Index.htm