Wednesday, December 28, 2022

Using scanf to get user input from console

In C, you can use scanf to get character input from console. However, if you do it multiple times, you will realize that pressing enter after the first scanf affects the next scanf call. This happens when you have a space after your prompt, e.g. printf("Choice: "); char c; scanf("%c"). Either don't put a space at the end of printf or use a space in scanf like so: scanf(" %c")

Friday, September 16, 2022

When is inheritance useful?

A major disadvantage of inheritance is not being able to follow the program flow by ctrl + clicking function calls due to some functionality being implemented in ancestor classes. Therefore, I prefer composition over inheritance whenever possible. The one case where inheritance shines is reusing workflows. Let's say all your child classes have a run() method that calls f1(), f2() and f2() in order, where f1, f2, f3 functions are implemented in child classes. If we move the run() method to the ancestor class, child classes would just call that run method, saving you from duplicating the f1, f2, f3 calls in each child.

Monday, September 5, 2022

Studying Algorithms and Data Structures Effectively

There are many ways to solve programming problems. The ideal solution is the one running the fastest and consuming the least amount of memory. The field of algorithms and data structures equips you with the tools to find the best solution. A good solution might run  a million times faster than a naive/brute force solution, which might be the difference between a successful and failed project. It has similarities to mathematics because mathematics always tries to find more concise formulae. For example you can find the sum of consecutive integers from 1 to n by summing each number one by one which has a time complexity of O(n). Or you could think a little more about the problem and observe that there are n/2 pairs of the value of n+1, yielding the famous Gauss formula of n/2*(n+1), which has a time complexity of O(1), i.e. the brute force method gets slower and slower as n increases while the formula always runs at constant time! See a similar Codility problem. A good solution is also environmentally friendly since it consumes less energy.

When studying algorithms and data structures, besides course material, I recommend solving the relevant leetcode questions. Start with the easy ones but note that if this is your first attempt at solving "easy" questions, they won't be easy at all, watch this video for a general approach. Don't just focus on the answer, analyze your solution process even after your solution passes all tests so that it really sinks in.

The good news is that once you solve easy questions, medium ones are not that difficult. The website NeetCode organizes problems nicely according to data structure type and difficulty, I personally use the NeetCode 150 group (see my notes). Python is a concise language to solve coding problems, this 26 minute video teaches you enough python for that. After you finish 29 easy questions on NeetCode 150, move to medium questions, and finally solve the hard ones. It will probably take a couple of months to solve all 150 questions. Besides strengthening you algorithms and data structures foundation, you also will have practiced for coding interviews.

If you want to practice more in a specific area, you can use chatGPT to generate additional questions/problems, e.g. "generate a medium level coding question related to trie data structure"

Visualizing algorithms: Visualgo

Thursday, August 11, 2022

Leetcode notes

You can find solutions of Leetcode problems online. Sometimes my own solutions are more intuitive to me. Here I present my solutions that I find interesting in Python3 and my notes.

Friday, July 29, 2022

Behavioral interview preparation as a student

From Google to Toptal, behavioral questions are an integral part of the interview process. Questions like "what did you do when you realized that the deadline could not be met", "tell me about a case where your teammate was underperforming and your response" try to assess your communication and conflict resolution skills. As a student, you should treat such crisis as opportunites. A bad way to handle teammates that do not shoulder their share is to quarrel with them and take their share too without trying to negotiate a settlement. You should at least get their point of view in a coolheaded manner. Even if you cannot win them over for the cause, you will improve your communication skills and you will have stories to tell in interviews. Watch this video for tips.

Sunday, June 26, 2022

Podcast with a sofware engineer working in Munich

I recently did a podcast (in Turkish) with my cousin who works as the software engineering department head of a company in Munich. In it, we also answered the following questions which were previously asked by my mentee, Nansy:

Question: Did he have to learn on his own or was his university knowledge sufficient?
Answer: You have to learn on your own too.

Question: How important is GPA really?
Answer: Not much if you don't plan to do graduate studies. If your GPA is not great, you have to be able to give reasons for it. Good reasons: Worked on my projects/hobbies, worked part time, traveled around the world. Bad reasons: Watched movies, played games.

Question: How can someone decide which area/language/framework to learn and focus on when there are so many?
Answer: Picking an industry/sector will narrow down the selection. Make sure that your computer engineering fundamentals like algorithms and data structures are sound.

Saturday, June 25, 2022

Summer project ideas

Software project ideas for summer 2022:

1. Web Application:
1.1. [PHP] Create a WordPress plugin to rent expensive dresses. It should have a calendar for rent start-end dates. Payment should use iyzico sandbox. It should support vendor/product review.
1.2. Create a multi-vendor Shopify app, similar to and better than Multi Vendor Marketplace. Look at its negative reviews for inspiration, e.g. "looks very trashy and confusing", "error-free bulk data upload"
1.3. Leetcode clone for embedded software development: Exercises and unit tests, board simulators (timer, interrupt, peripheral sim (RAM, SSD, NIC) for driver writing exercises). Vision: Become the TopTal of embedded software development.
1.4. Clone Twitter (simplified LeetCode problem)
1.5. Build a Google Docs clone.
1.6. Build a Codility clone. Step 1: Online code compiler
1.7. Write a Chrome extension to create gif

2. Mobile app
2.1. Develop an Android application that gets video from a PC using the mobile hotspot on the phone:
2.2. Payment sharing/bill splitting between a group of friends

3. Automotive:
2.1. Write a simple 2D self driving car demo.
2.2. Collect acceleration data from an RC car, send it to the cloud, on the cloud backend identify road quality from acceleration data and show it on a web page.
2.3. Make openpilot work on CARLA.

4. Website development: Find an existing website that has performance issues, do performance profiling and write a faster  version of it.

5. Finance, cryptocurrency, cybersecurity
5.1. Write a Lightning Network clone
5.2. Develop an air gapped Bitcoin wallet.
5.3. Write a uTorrent clone (peer to peer distributed file sharing)

6. Gaming
6.1 Write a game that involves puzzle piece placement and path finding and runs in the browser.
6.2. Write a peer-to-peer real time multiplayer game that uses the lockstep protocol (see consensus).
6.3 Clone Just Dance Now. Convert it to use webcam to detect and rate your movement accuracy.

7. Music: Write an app that normalizes sound levels of tracks in a playlist so that the user does not have to fiddle with the volume setting.

8. Aerospace
8.1. Write a web app that lets the user change kinematic parameters of a simple aircraft and observe the effects on a 2D trajectory.
8.2. Write a web app that does a simplified 2D version of the moon landing, including orbital calculations.

9. Miscellaneous:
9.1. Improve GeoTools
  • Create a fork and push your updates to this fork.
  • Draw a polygon (e.g. hexagon) on map. Zoom - unzoom with mouse wheel. Drawing should be updated while zooming, it should not wait until mouse wheel stops.
  • Pan with the right mouse click and drag. Drawing should be updated while panning, it should not wait until mouse button is released.
  • Show country borders.
  • On startup, map should center on Turkey and Turkey borders should fill the view.
  • Document your progress/challenges, preferably create a public blog and write a developer diary there.
To generate more software project ideas, you can use chatGPT, ProductHunt and KickStarter

Wednesday, June 8, 2022

Finding a job

Finding a job can be divided into two stages:

  • Stage 1, getting an interview:
    • Past experience and your contributions
      • Full time work
      • Part time work
      • Internships
      • Side projects, Hackathons
    • Education
    • Tailoring resume/CV for the job you plan to apply
    • Polishing LinkedIn profile, getting badges, contacting recruiters
    • Preparing for and passing online assessment tests
  • Stage 2, passing the interview:
    • Preparing for coding questions
    • Preparing for behavioral questions
      • How do you resolve conflict with your superior / team mate?
      • What do you do when it becomes clear that a deadline cannot be met?

Wednesday, June 1, 2022

Algorithms that you should know by heart

Algorithms that you should know by heart and be able to code without using the internet:

Tuesday, May 24, 2022

Programming job opportunities by country

In my last blog post, I showed programming jobs by city, using LinkedIn. This got me thinking about job opportunities by country, normalized by population. Here is a sample for Python jobs:

We see that per capita, there are 124 times more Python jobs in the USA than in Egypt. Netherlands is close to the USA. Comparing Germany and Turkey, Germany has 79 / 3 = 26 times more jobs. These figures provide a rough estimation of opportunity differences in the tech industry. And since talent needs opportunity to flourish, it correlates with the direction and speed of brain drain (human capital flight).

Programming language selection

When selecting a programming language to specialize in, it makes sense to check industry demand. I used LinkedIn's job search and got the following job post numbers:


As you can see, the first four (Python, Java, JavaScript and C++) are close to each other and C# is a distant fifth.

Friday, May 20, 2022

Summer time

Doing extra-curricular projects will be a differentiating factor throughout your professional career because it will demonstrate your interest in the field, desire to learn and motivation. These are highly sought after qualities which separate the top engineers from the average. Below is a question from an online application which shows the importance of having a mobile and a web app project:


Summer is a good time to go the extra mile because there is no exam pressure. Of course there are internships to do, fun places to go, books to read and re-charging for the up coming semester.

If you think you can spare some time during the summer, I can help you with the following in a low-pressure setting:

  • Coding projects to enrich your GitHub portfolio
    • Ideas
    • Design guidance
    • Management (sprint planning with Trello)
    • Implementation (code review, debugging)
    • Documentation
    • Testing
  • Meetings
    • Tech discussions, e.g. self driving cars, cryptocurrency, internet of things, games, medicine/bioinformatics. Sectors: Automotive, aerospace, medicine, bioinformatics, games, finance (incl. crypto), cyber security etc.
    • Team building: You are not just my mentees but potential founders / colleagues for me and for each other. Think of all these activities as parts of an extended interview.
    • Start-up idea brainstorming.
If your summer is not 100% occupied and you want to stand out, send me a message so that we can make plans.

Tuesday, May 17, 2022

Testimonials

Recent comments from my mentees:

"Working with you was an insanely beneficial learning experience. Your approach to tackling problems is much more efficient than what I used to do." Amer

"I usually get confused by the details, you showed me how not to loose sight of the overall picture." Nansy

Monday, May 16, 2022

Programming the PIC microcontroller

Recently I helped my students with a PIC18F8722 microcontroller project. Hardware setup:

  1. UNI-DS6 Development System + microboard with PIC18F8722 and seven segment display
  2. PICkit 3 In-Circuit Debugger
  3. Windows 10 PC + MPLAB X IDE + XC8 compiler
Notes:
  • Pay attention on how the cable is connected to PICKit 3.
  • Difference between PORT and LAT: The latch is the output latch onto which values are written. The port is the voltage at the actual pin… So in most situations, you will write to the latch and read from the portWhen you're reading from LATx, you're reading what is in the Data Register, when you read from PORTx, you're reading the actual I/O pin value. PIC uses read-modify-write to write operations and this can be a problem, so they use this shadow register to avoid it.
  • Setting timer and interrupt bits:
//Clear interrupts
INTCONbits.GIE = 0; //Global interrupt enable
INTCONbits.TMR0IE = 0; //Timer0 interrupt enable.
TMR0L = 0;    
TMR1 = 0;

//TIMER 0 (PIC18F8722)
INTCONbits.GIE = 1; //Global interrupt enable
INTCONbits.TMR0IE = 1; //Timer0 interrupt enable.
INTCONbits.TMR0IF = 0;
T0CONbits.T08BIT = 1;
T0CONbits.T0CS = 0; //internal clock selected
T0CONbits.PSA = 1; //prescaler is NOT assigned
T0CONbits.T0PS0 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS2 = 0;
T0CONbits.TMR0ON = 1;

//TIMER 1
T1CONbits.RD16 = 1;
T1CONbits.T1CKPS0 = 0;
T1CONbits.T1CKPS1 = 0;
T1CONbits.T1OSCEN = 0;
T1CONbits.TMR1CS = 0;
T1CONbits.TMR1ON = 1;
T1CONbits.T1RUN = 1;
  • Using two timers with interrupt:
void __interrupt() isr(void) {
    if(TMR0IF) { //Timer 0 overflow
        TMR0IF = 0; //Clear Timer 0 interrupt flag
        TMR0 = 0; //Timer 0 counter
    }
    if(TMR1IF) { //Timer 1 overflow
        TMR1IF = 0; //Clear Timer 1 interrupt flag
        TMR1 = 30000; //Set counter so that overflow takes less time
    }
}
  • Calculating timer overflow period:
    • For 40MHz oscillator, use #pragma config OSC = HSPLL
    • Frequency of instruction cyles = 40Mhz/4 = 10MHz → 1 instruction cyle = 0.1us
    • 8 bit timer overflows every 2^8 instruction cycles = 256 * 0.1 = 25.6us
    • 16 bit timer overflows every 2^16 instruction cycles = 6553.6us = 6.5536ms
  • XC8 problem: Cannot use const int nTimer0_500ms = 19531; int maxTimer0 = nTimer0_500ms; XC8 displays message “error: (712) can't generate code for this expression” at the int maxTimer0 = nTimer0_500ms line. I had to use #define nTimer0_500ms (19531).
  • cTimer0 > 2 * 19531 → we expected 1s delay but the board LEDs behaved strangely. When we used a prescaler of 1:2 (000), it worked as expected.
  • Make Timer 1 faster by setting TMR1 to e.g. 30000 so that it start counting from TMR1 and number of counts until overflow would be 2^16 - TMR1.
  • Finding a binary number corresponding to row: nb += 1 << iRow
  • PORTA = 0b0011: Turn on first two LEDs in column A of board
  • Turn on 4th bit of a number: nb |= 1<<4
  • Turn off 4th bit of a number: nb &= ~(1<<4)
  • You have to check button presses multiple times to give user time and to do debouncing.

Sunday, April 24, 2022

Saturday, April 23, 2022

AI explanation problem

AI / machine learning is quite useful but not being able to see the justification of a particular classification outcome is quite annoying for me. As Mr. Tizhoosh puts it in Introduction to Digital Pathology:
After weeks of training of some sort of agent I can just tell you "yes" but I cannot tell you "why"... The pathologist writes a full scale report and he/she has to justify it.

Friday, April 22, 2022

Advanced Driver Assistance Systems (ADAS)

I recently bought and watched Udemy's Advanced Driver Assistance Systems (ADAS). It is a good beginner course to get an overview of concepts and challenges/steps to reach the goal of full self driving cars. It is especially useful if you plan on working in the smart/self-driving automotive industry.

Another good idea is to check out openpilot, which powers comma.ai. Here is a video of George Hotz showcasing openpilot.

Companies in Türkiye working on ADAS / autonomous driving:

  • TOGG
  • Ford Otosan