ChatGPT osa 2

Aiemmin sanoin ChatGPT:n olevan vain puppugeneraattori. Tässä viikon aikana tullut enemmän tutustuttua, niin en enää usko niin. [1, 2]

PID säädin automaattisella konfiguraatiolla Commodore 64 -koneella



Arduino C++

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2  // Pin connected to the DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int relayPin = 3;  // Pin connected to the relay

void setup() {
  Serial.begin(9600);
  sensors.begin();
  pinMode(relayPin, OUTPUT);  // Set relay pin as output
}

void loop() {
  sensors.requestTemperatures();  // Request temperature reading
  float temp = sensors.getTempCByIndex(0);  // Get temperature of the first sensor
  Serial.println(temp);  // Send the temperature to C64
  
  delay(1000);  // Wait for 1 second before sending the next reading
}



C64 BASIC

10 REM Geothermal System PID Control with Auto-Tuning
20 PRINT "Geothermal PID Control System Starting..."
30 REM Initial Default PID Values
40 KP = 2
50 KI = 0.1
60 KD = 1
70 SETPOINT = 20 REM Initial Desired Temperature (°C)
80 TEMP = 0 REM Current Temperature
90 ERROR = 0 REM Error (SETPOINT - TEMP)
100 LAST_ERROR = 0 REM Last Error
110 INTEGRAL = 0 REM Integral Term
120 AUTO_TUNE = 1 REM 1 = Enable Auto-Tuning, 0 = Use Manual Values

130 PRINT "Press any key to start auto-tuning or press RETURN to use manual values."

140 REM Wait for key press before starting auto-tuning
150 IF PEEK(198) = 0 THEN GOTO 150 REM Wait for key press

160 REM Check if user pressed RETURN (no auto-tune)
170 IF PEEK(198) = 13 THEN AUTO_TUNE = 0

180 REM If Auto-Tuning is Enabled, Perform Automatic PID Calibration
190 IF AUTO_TUNE = 1 THEN GOSUB 2000

200 PRINT "Final PID Values: KP="; KP; " KI="; KI; " KD="; KD
210 PRINT "Press any key to continue..."

220 REM Open Serial Port (assuming C64 serial is at 9600 baud)
230 OPEN 1,8,15,"U0:9600,N,8,1" REM C64 opens serial port to listen

240 REM Loop to check temperature and control relays
250 REM Read Temperature from Serial Port
260 INPUT #1,TEMP$ REM Read temperature string from serial port
270 TEMP = VAL(TEMP$) REM Convert to numeric value
280 PRINT "Current Temperature: "; TEMP

290 REM Calculate PID terms
300 ERROR = SETPOINT - TEMP
310 INTEGRAL = INTEGRAL + ERROR
320 DERIVATIVE = ERROR - LAST_ERROR

330 REM Calculate PID Output
340 PID_OUTPUT = (KP * ERROR) + (KI * INTEGRAL) + (KD * DERIVATIVE)
350 PRINT "PID Output: "; PID_OUTPUT

360 REM Set Relay based on PID Output
370 IF PID_OUTPUT > 10 THEN GOSUB 5000 REM Activate heating if output > 10
380 IF PID_OUTPUT < -10 THEN GOSUB 6000 REM Deactivate heating if output < -10

390 REM Save the current error for the next loop
400 LAST_ERROR = ERROR

410 REM Add SID Sound for High and Low Temperatures
420 IF TEMP > 20 THEN GOSUB 7000 REM High temperature sound (too warm)
430 IF TEMP < 10 THEN GOSUB 8000 REM Low temperature sound (too cold)

440 REM Repeat every 1 second
450 FOR I = 1 TO 1000: NEXT I
460 GOTO 250

5000 REM Activate Heating Relay
5010 PRINT "Activating Heating..."
5020 POKE 53280, 255 REM Set user port to turn on heating relay
5030 RETURN

6000 REM Deactivate Heating Relay
6010 PRINT "Deactivating Heating..."
6020 POKE 53280, 0 REM Set user port to turn off heating relay
6030 RETURN

7000 REM High Temperature Sound (Too Warm)
7010 POKE 54296, 255 REM Set voice 1 frequency high (too warm)
7020 POKE 54277, 15 REM Set volume (loud)
7030 POKE 54279, 15 REM Enable sound
7040 FOR I = 1 TO 1000: NEXT I
7050 POKE 54279, 0 REM Disable sound
7060 RETURN

8000 REM Low Temperature Sound (Too Cold)
8010 POKE 54296, 100 REM Set voice 1 frequency low (too cold)
8020 POKE 54277, 15 REM Set volume (loud)
8030 POKE 54279, 15 REM Enable sound
8040 FOR I = 1 TO 1000: NEXT I
8050 POKE 54279, 0 REM Disable sound
8060 RETURN

2000 REM Auto-Tuning Routine
2010 PRINT "Auto-Tuning Started..."
2020 PRINT "Step 1: Applying Heat Step Input..."

2030 REM Apply Heat Pulse (Force System to React)
2040 POKE 53280, 255 REM Turn ON heating relay
2050 FOR I = 1 TO 5000: NEXT I REM Wait for system response (simulate heating)
2060 POKE 53280, 0 REM Turn OFF heating relay
2070 PRINT "Step 2: Measuring Response..."

2080 REM Measure Temperature Rise and Oscillation
2090 INPUT #1, TEMP$
2100 TEMP = VAL(TEMP$)
2110 T1 = TIMER REM Start time measurement

2120 REM Wait Until Temperature Peaks
2130 REPEAT:
2140 INPUT #1, TEMP$
2150 TEMP = VAL(TEMP$)
2160 UNTIL TEMP > SETPOINT + 2 REM Wait until temperature overshoots by 2°C
2170 T2 = TIMER REM Save time when peak is reached

2180 REM Calculate Approximate System Response Time
2190 RESPONSE_TIME = T2 - T1
2200 PRINT "Response Time Detected: "; RESPONSE_TIME; " Cycles"

2210 REM Assign Approximate PID Values Based on Response
2220 KP = 0.6 * (SETPOINT / RESPONSE_TIME)
2230 KI = 2 * KP / RESPONSE_TIME
2240 KD = KP * RESPONSE_TIME / 8

2250 PRINT "Auto-Tuning Complete!"
2260 RETURN

REFERENSSIT

[1] ChatGPT keskustelu Venäjän romahduksesta

[2] ChatGPT: Mitä on kvanttifysiikka?

Lapsen saaminen

Minutakin tulee kusipää. Samanlainen iljetys, joka maailman hirvein tuntemani ihminen voi olla. Lapsen saaminen on itsekkäin asia, jonka voi elämän aikana tehdä. Suurin ympäristörikos [2].

Kuva. Keinoja vähentää kasihuonekaasupäästöjä. [2]

Lapsesta tulee syntymän jälkeen juridinen henkilö, ennen sitä aikaa lasta ei voi juridisesti uhata tai murhata [1]. Minun mielestäni syntymättömän lapsen uhkaaminen tai murhaaminen esim. oman äidin toimesta pitäisi olla rikos, siihen ei saisi voida vedota juridisesti.

DeepSeek näkee asian toisin

Seuraava teksti on DeepSeekin kirjoittama [3]:

Lapsen saaminen – matka täynnä iloa, haasteita ja kasvua

Lapsen saaminen on yksi elämän merkittävimmistä ja muodonmuuttavimmista kokemuksista. Se on matka, joka tuo mukanaan valtavan määrän iloa, rakastavaa yhteyttä ja uusia näkökulmia elämään. Samalla se tuo haasteita, joihin ei aina voi täysin varautua. Tässä artikkelissa käsittelemme lapsen saamisen eri puolia – siitä, miten se muuttaa elämää ja mitä kannattaa ottaa huomioon ennen ja jälkeen lapsen syntymän.

Kuva. ChatGPT:n tekemä kuva.

Ennen lapsen tuloa: Valmistaudutaan yhdessä

Lapsen hankkiminen on usein pitkä prosessi, joka alkaa päätöksellä ryhtyä vanhemmiksi. Raskausaika on aikaa odotukseen, valmistautumiseen ja yhteiseen kasvuun. On tärkeää keskustella kumppanin kanssa odotuksista, arvoista ja siitä, miten jakaa vastuut lapsen syntymän jälkeen.

  • Terveys ja hyvinvointi: Raskausaikana äidin terveys on ensisijaisen tärkeää. Säännölliset lääkärintarkastukset, terveellinen ruokavalio ja kohtuullinen liikunta auttavat varmistamaan, että raskaus etenee mahdollisimman sujuvasti.
  • Tukiverkosto: Lapsen saaminen on helpompaa, kun on ympärillään tukeva yhteisö. Perheen, ystävien ja ammattilaisten tuki voi olla korvaamaton sekä raskausaikana että lapsen syntymän jälkeen.
  • Kodyn valmistelu: Lapsen tuloa odotellessa on hyvä varautua käytännön asioihin, kuten lastenhuoneen järjestelyyn, vaatteiden ja tarvikkeiden hankintaan. Muista kuitenkin, että lapsi tarvitsee ennen kaikkea rakkautta ja turvallisuutta – materiaaliset asiat ovat toissijaisia.

Lapsen syntymä: Elämän suurin ihme

Lapsen syntymä on voimakas ja emotionaalinen kokemus, joka jättää pysyvän jäljen vanhempien sydämiin. Ensimmäinen kosketus, ensimmäinen itku ja ensimmäinen katsekontakti ovat hetkiä, joita ei koskaan unohda. Syntymä voi olla myös fyysisesti ja henkisesti haastava, joten on tärkeää olla armollinen itselleen ja antaa itselle aikaa toipumiseen.

  • Synnytys ja sen vaiheet: Synnytys on uniikki kokemus, joka voi olla erilainen jokaiselle. On tärkeää keskustella synnytystoiveista lääkärin tai kätilön kanssa, mutta myös olla valmis muutoksiin, jos tilanne niin vaatii.
  • Ensimmäiset päivät: Kotiin pääsy synnytyksen jälkeen on usein sekalainen ajanjakso. Univaje, hormonien vaihtelut ja uusi vastuu voivat tuntua ylivoimaisilta. Muista, että apua on ok pyytää – olipa kyse sitten käytännön avusta tai henkisestä tuesta.

Vanhemmuuden arki: Oppimista ja kasvua

Vanhemmuus on jatkuva oppimisprosessi, jossa jokainen päivä tuo mukanaan uusia haasteita ja iloja. Ensimmäiset hymytykset, ensimmäiset sanat ja ensimmäiset askeleet ovat merkittäviä virstanpylväitä, jotka tuovat valtavan ylpeyden tunteen. Samalla vanhemmuus koettelee kärsivällisyyttä, joustavuutta ja omaa itsetuntoa.

  • Rutiinit ja rakenne: Lapsi tarvitsee turvallisuuden tunnetta, jota rutiinit ja säännöllisyys tuovat. Nukkumaanmenoaikojen, ruokailujen ja leikkiaikojen säännöllisyys auttavat luomaan rauhallisen ympäristön.
  • Oma hyvinvointi: Vanhempien on tärkeää huolehtia myös omasta hyvinvoinnistaan. Väsymys ja stressi voivat vaikuttaa sekä omaan jaksamiseen että lapsen hyvinvointiin. Ota aikaa itsellesi, nuku tarpeeksi ja pyydä apua tarvittaessa.
  • Yhteys lapsen kanssa: Lapsi tarvitsee ennen kaikkea rakkautta, huomiota ja turvallista läsnäoloa. Puhu lapsellesi, leiki hänen kanssaan ja nauti yhteisistä hetkistä. Nämä hetket luovat perustan lapsen turvallisuudentunteelle ja itsetunnolle.

Vanhemmuus on matka, ei määränpää

Lapsen saaminen on elämän suuria seikkailuja, joka muuttaa vanhempia ja heidän maailmaansa ikuisesti. Se on matka, jossa oppii olemaan kärsivällisempi, joustavampi ja rakastavampi. Vaikka vanhemmuus tuo mukanaan haasteita, se tuo myös valtavasti iloa, onnea ja merkitystä elämään.

Muista, että täydellistä vanhemmuutta ei ole olemassa – jokainen tekee parhaansa, ja se on aina tarpeeksi. Nauti matkasta, ota apua vastaan ja anna itsellesi armoa. Lapsesi tarvitsee sinua sellaisena, kuin olet – rakastavana ja läsnäolevana vanhempana.

DeepSeek -spoiler

Me: do you know Commodore 64?

DeepSeek:

Yes, the Commodore 64 (C64) is a legendary home computer that was introduced by Commodore International in January 1982. It became one of the best-selling computers of all time, with estimates of units sold ranging between 12.5 to 17 million. The C64 was known for its affordability, robust hardware, and extensive software library, which included games, productivity tools, and programming languages.

Key Features of the Commodore 64:

  • Processor: 8-bit MOS Technology 6510 CPU (a variant of the 6502) running at 1 MHz.
  • Memory: 64 KB of RAM, which was quite substantial for its time.
  • Graphics: VIC-II chip capable of displaying 16 colors, with resolutions up to 320×200 pixels.
  • Sound: SID (Sound Interface Device) chip, which provided advanced audio capabilities for its era, including three voices and multiple waveforms.
  • Storage: Used cassette tapes and floppy disks (via the 1541 disk drive) for data storage.
  • Ports: Included ports for connecting to TVs, monitors, joysticks, and other peripherals.

Software and Games:

The C64 had a vast library of software, including iconic games like Pac-Man, The Bard’s Tale, Maniac Mansion, and Elite. It also supported programming in BASIC, and many users learned to code on this machine.

Legacy:

The Commodore 64 remains a beloved system among retro computing enthusiasts and is often emulated on modern devices. Its influence on the gaming and computing industries is significant, and it holds a special place in the history of personal computing.

If you have specific questions about the Commodore 64 or its software, feel free to ask!

Me: do you can write assembly code for Commodore 64?

DeepSeek:

Yes, I can help you write assembly code for the Commodore 64! The C64 uses the 6502/6510 microprocessor, and its assembly language is a low-level programming language that directly controls the hardware. Below is a simple example of assembly code for the Commodore 64, written for the Kick Assembler or C64 Studio assembler.

This example will display a message on the screen:

Example: Display ”HELLO, COMMODORE 64!” on the screen

; Commodore 64 Assembly Code - Display a message
; Assembler: Kick Assembler or C64 Studio

* = $0801               ; Start of BASIC program area (2049 in decimal)

; BASIC stub to start the assembly program
    .byte $0C, $08, $0A, $00, $9E, $20, $32, $30, $36, $31, $00, $00, $00 ; BASIC sys2061

* = $080D               ; Start of assembly code (2061 in decimal)

; Main program
start:
    ldx #$00            ; Initialize X register to 0

print_loop:
    lda message,x       ; Load character from message into accumulator
    beq end             ; If the character is 0 (end of string), exit loop
    sta $0400,x         ; Store character in screen memory (start at $0400)
    inx                 ; Increment X to move to the next character
    jmp print_loop      ; Repeat the loop

end:
    rts                 ; Return to BASIC

; Data section
message:
    .text "HELLO, COMMODORE 64!" ; The message to display
    .byte $00           ; Null terminator for the string

Explanation:

  1. BASIC Stub: The first part of the code is a small BASIC program that calls the machine language program starting at memory address $080D (2061 in decimal).
  2. Screen Memory: The C64’s screen memory starts at $0400. Each character on the screen corresponds to a byte in this memory area.
  3. Loop: The program loops through each character in the message string and stores it in screen memory.
  4. Null Terminator: The string ends with a $00 byte, which signals the end of the string.

How to Run:

  1. Assemble the code using an assembler like Kick Assembler or C64 Studio.
  2. Load the resulting program into a C64 emulator (like VICE) or a real Commodore 64.
  3. Run the program by typing RUN in BASIC.

Output:

The message ”HELLO, COMMODORE 64!” will appear at the top-left corner of the screen.

If you’d like to explore more advanced topics (e.g., sprites, sound, or interrupts), let me know! I can help you write more complex assembly programs for the C64.

Me: do you can write a game for Commodore 64?

DeepSeek:

Absolutely! Let’s create a simple game for the Commodore 64 in assembly language. We’ll make a ”Catch the Falling Object” game where the player controls a paddle at the bottom of the screen to catch a falling object. If the player catches the object, the score increases. If the object reaches the bottom without being caught, the game ends.


Game Overview:

  1. Player: A paddle at the bottom of the screen, controlled with the joystick.
  2. Object: A single character (e.g., a ball) that falls from the top of the screen.
  3. Score: Displayed at the top of the screen.
  4. Game Over: If the object reaches the bottom without being caught.

Assembly Code for the Game:

Here’s the full assembly code for the game:

; Commodore 64 Assembly Code - "Catch the Falling Object" Game
; Assembler: Kick Assembler or C64 Studio

* = $0801               ; Start of BASIC program area (2049 in decimal)

; BASIC stub to start the assembly program
    .byte $0C, $08, $0A, $00, $9E, $20, $32, $30, $36, $31, $00, $00, $00 ; BASIC sys2061

* = $080D               ; Start of assembly code (2061 in decimal)

; Constants
JOYSTICK_PORT = $DC00   ; Joystick port 2
SCREEN_MEMORY = $0400   ; Start of screen memory
OBJECT_CHAR = $51       ; Character for the falling object (e.g., a ball)
PADDLE_CHAR = $57       ; Character for the paddle (e.g., a block)
SCORE_POS = $0400       ; Position to display the score

; Variables
object_x        .byte $00   ; X position of the object
object_y        .byte $00   ; Y position of the object
paddle_x        .byte $0F   ; X position of the paddle
score           .byte $00   ; Player's score

; Main program
start:
    jsr init_screen     ; Initialize the screen
    jsr init_game       ; Initialize game variables

game_loop:
    jsr read_joystick   ; Read joystick input
    jsr move_paddle     ; Move the paddle
    jsr move_object     ; Move the falling object
    jsr check_collision ; Check if the object is caught
    jsr draw_game       ; Draw the game screen
    jsr delay           ; Add a delay to control game speed
    jmp game_loop       ; Repeat the game loop

; Initialize the screen
init_screen:
    lda #$93            ; Clear the screen
    jsr $FFD2           ; Call KERNAL routine to print
    rts

; Initialize game variables
init_game:
    lda #$0F            ; Set initial paddle position
    sta paddle_x
    lda #$00            ; Set initial object position (top-middle)
    sta object_x
    sta object_y
    sta score           ; Reset score
    rts

; Read joystick input
read_joystick:
    lda JOYSTICK_PORT   ; Read joystick port
    and #$04            ; Check if joystick is moved left
    beq move_left
    lda JOYSTICK_PORT
    and #$08            ; Check if joystick is moved right
    beq move_right
    rts

move_left:
    dec paddle_x        ; Move paddle left
    rts

move_right:
    inc paddle_x        ; Move paddle right
    rts

; Move the falling object
move_object:
    inc object_y        ; Move object down
    lda object_y
    cmp #$18            ; Check if object reached the bottom
    bne object_done
    jmp game_over       ; Game over if object reaches the bottom
object_done:
    rts

; Check if the object is caught by the paddle
check_collision:
    lda object_y
    cmp #$16            ; Check if object is near the paddle
    bne no_collision
    lda object_x
    cmp paddle_x        ; Check if object is above the paddle
    beq caught
no_collision:
    rts

caught:
    inc score           ; Increase score
    lda #$00            ; Reset object position
    sta object_y
    rts

; Draw the game screen
draw_game:
    ldx #$00            ; Clear the screen
clear_loop:
    lda #$20            ; Space character
    sta SCREEN_MEMORY,x
    sta SCREEN_MEMORY+$100,x
    sta SCREEN_MEMORY+$200,x
    sta SCREEN_MEMORY+$300,x
    inx
    bne clear_loop

    ldx object_y        ; Draw the falling object
    lda object_x
    clc
    adc #$40            ; Calculate screen position
    sta SCREEN_MEMORY,x

    ldx #$17            ; Draw the paddle
    lda paddle_x
    clc
    adc #$40            ; Calculate screen position
    sta SCREEN_MEMORY,x

    lda score           ; Display the score
    clc
    adc #$30            ; Convert to ASCII
    sta SCORE_POS
    rts

; Add a delay to control game speed
delay:
    ldx #$FF
delay_loop:
    dex
    bne delay_loop
    rts

; Game over routine
game_over:
    lda #$00            ; Reset object position
    sta object_y
    lda #$00            ; Reset score
    sta score
    rts

How the Game Works:

  1. Joystick Input: The player moves the paddle left or right using the joystick.
  2. Falling Object: The object starts at the top of the screen and falls down one row per frame.
  3. Collision Detection: If the object reaches the paddle’s position, the score increases, and the object resets to the top.
  4. Game Over: If the object reaches the bottom without being caught, the game resets.

How to Run:

  1. Assemble the code using Kick Assembler or C64 Studio.
  2. Load the resulting program into a C64 emulator (like VICE) or a real Commodore 64.
  3. Run the program by typing RUN in BASIC.

Enhancements:

  • Add sound effects when the object is caught or the game ends.
  • Increase the speed of the falling object as the score increases.
  • Add multiple falling objects for more challenge.

Let me know if you’d like to expand on this game or add more features! 🎮

Me: how about add sound effect to the code?

DeepSeek:

Sure! Let’s add sound effects to the ”Catch the Falling Object” game we created earlier. We’ll use the Commodore 64’s SID (Sound Interface Device) chip to play simple sound effects when:

  1. The player catches the object (a ”ping” sound).
  2. The object reaches the bottom without being caught (a ”buzz” sound).

Updated Code with Sound Effects:

Here’s the modified assembly code with sound effects added:

; Commodore 64 Assembly Code - "Catch the Falling Object" Game with Sound Effects
; Assembler: Kick Assembler or C64 Studio

* = $0801               ; Start of BASIC program area (2049 in decimal)

; BASIC stub to start the assembly program
    .byte $0C, $08, $0A, $00, $9E, $20, $32, $30, $36, $31, $00, $00, $00 ; BASIC sys2061

* = $080D               ; Start of assembly code (2061 in decimal)

; Constants
JOYSTICK_PORT = $DC00   ; Joystick port 2
SCREEN_MEMORY = $0400   ; Start of screen memory
OBJECT_CHAR = $51       ; Character for the falling object (e.g., a ball)
PADDLE_CHAR = $57       ; Character for the paddle (e.g., a block)
SCORE_POS = $0400       ; Position to display the score
SID_VOICE1 = $D400      ; SID voice 1 registers
SID_VOLUME = $D418      ; SID volume register

; Variables
object_x        .byte $00   ; X position of the object
object_y        .byte $00   ; Y position of the object
paddle_x        .byte $0F   ; X position of the paddle
score           .byte $00   ; Player's score

; Main program
start:
    jsr init_screen     ; Initialize the screen
    jsr init_game       ; Initialize game variables

game_loop:
    jsr read_joystick   ; Read joystick input
    jsr move_paddle     ; Move the paddle
    jsr move_object     ; Move the falling object
    jsr check_collision ; Check if the object is caught
    jsr draw_game       ; Draw the game screen
    jsr delay           ; Add a delay to control game speed
    jmp game_loop       ; Repeat the game loop

; Initialize the screen
init_screen:
    lda #$93            ; Clear the screen
    jsr $FFD2           ; Call KERNAL routine to print
    rts

; Initialize game variables
init_game:
    lda #$0F            ; Set initial paddle position
    sta paddle_x
    lda #$00            ; Set initial object position (top-middle)
    sta object_x
    sta object_y
    sta score           ; Reset score
    rts

; Read joystick input
read_joystick:
    lda JOYSTICK_PORT   ; Read joystick port
    and #$04            ; Check if joystick is moved left
    beq move_left
    lda JOYSTICK_PORT
    and #$08            ; Check if joystick is moved right
    beq move_right
    rts

move_left:
    dec paddle_x        ; Move paddle left
    rts

move_right:
    inc paddle_x        ; Move paddle right
    rts

; Move the falling object
move_object:
    inc object_y        ; Move object down
    lda object_y
    cmp #$18            ; Check if object reached the bottom
    bne object_done
    jsr play_buzz       ; Play "buzz" sound
    jmp game_over       ; Game over if object reaches the bottom
object_done:
    rts

; Check if the object is caught by the paddle
check_collision:
    lda object_y
    cmp #$16            ; Check if object is near the paddle
    bne no_collision
    lda object_x
    cmp paddle_x        ; Check if object is above the paddle
    beq caught
no_collision:
    rts

caught:
    inc score           ; Increase score
    lda #$00            ; Reset object position
    sta object_y
    jsr play_ping       ; Play "ping" sound
    rts

; Draw the game screen
draw_game:
    ldx #$00            ; Clear the screen
clear_loop:
    lda #$20            ; Space character
    sta SCREEN_MEMORY,x
    sta SCREEN_MEMORY+$100,x
    sta SCREEN_MEMORY+$200,x
    sta SCREEN_MEMORY+$300,x
    inx
    bne clear_loop

    ldx object_y        ; Draw the falling object
    lda object_x
    clc
    adc #$40            ; Calculate screen position
    sta SCREEN_MEMORY,x

    ldx #$17            ; Draw the paddle
    lda paddle_x
    clc
    adc #$40            ; Calculate screen position
    sta SCREEN_MEMORY,x

    lda score           ; Display the score
    clc
    adc #$30            ; Convert to ASCII
    sta SCORE_POS
    rts

; Add a delay to control game speed
delay:
    ldx #$FF
delay_loop:
    dex
    bne delay_loop
    rts

; Game over routine
game_over:
    lda #$00            ; Reset object position
    sta object_y
    lda #$00            ; Reset score
    sta score
    rts

; Play "ping" sound (object caught)
play_ping:
    lda #$21            ; Set frequency high byte
    sta SID_VOICE1+1
    lda #$00            ; Set frequency low byte
    sta SID_VOICE1
    lda #$11            ; Set attack/decay
    sta SID_VOICE1+5
    lda #$F0            ; Set sustain/release
    sta SID_VOICE1+6
    lda #$10            ; Start sound
    sta SID_VOICE1+4
    rts

; Play "buzz" sound (object missed)
play_buzz:
    lda #$FF            ; Set frequency high byte
    sta SID_VOICE1+1
    lda #$00            ; Set frequency low byte
    sta SID_VOICE1
    lda #$11            ; Set attack/decay
    sta SID_VOICE1+5
    lda #$F0            ; Set sustain/release
    sta SID_VOICE1+6
    lda #$20            ; Start sound (noise waveform)
    sta SID_VOICE1+4
    rts

Explanation of Sound Effects:

  1. Ping Sound:
  • A short, high-pitched sound played when the player catches the object.
  • Uses a triangle waveform for a clean, pleasant tone.
  1. Buzz Sound:
  • A harsh, buzzing sound played when the object reaches the bottom without being caught.
  • Uses a noise waveform for a rougher, more alarming tone.

How to Run:

  1. Assemble the code using Kick Assembler or C64 Studio.
  2. Load the resulting program into a C64 emulator (like VICE) or a real Commodore 64.
  3. Run the program by typing RUN in BASIC.

Enhancements:

  • Add more complex sound effects or music using the SID chip.
  • Adjust the pitch or duration of the sound effects dynamically based on the game state.
  • Add a victory tune when the player reaches a certain score.

Let me know if you’d like to explore more advanced sound programming or other features! 🎶

[collapse]
DeepSeek matopeli -spoiler

Me: Osaatko kirjoittaa matopelin koodin C-kielellä?

DeepSeek:

Kyllä, voin auttaa sinua kirjoittamaan yksinkertaisen matopelin C-kielellä! Tässä on perusversio pelistä, joka käyttää ncurses-kirjastoa ruudun päivittämiseen ja näppäimistön käsittelyyn. Tämä peli on tarkoitettu Linux-ympäristöön, koska ncurses on yleensä saatavilla Linux-järjestelmissä.

1. Asenna ncurses

Ennen kuin aloitat, varmista, että ncurses on asennettuna. Voit asentaa sen seuraavalla komennolla:

sudo apt-get install libncurses5-dev libncursesw5-dev

2. Matopelin koodi

Tässä on yksinkertainen matopeli C-kielellä:

#include <ncurses.h>
#include <stdlib.h>
#include <time.h>

#define WIDTH 60
#define HEIGHT 20

typedef struct {
    int x, y;
} Position;

typedef struct {
    Position body[100];
    int length;
    char direction;
} Snake;

typedef struct {
    Position pos;
} Food;

Snake snake;
Food food;
int score = 0;

void init_game() {
    initscr();
    cbreak();
    noecho();
    curs_set(0);
    keypad(stdscr, TRUE);
    timeout(100);

    snake.length = 1;
    snake.body[0].x = WIDTH / 2;
    snake.body[0].y = HEIGHT / 2;
    snake.direction = 'R';

    srand(time(NULL));
    food.pos.x = rand() % WIDTH;
    food.pos.y = rand() % HEIGHT;
}

void draw() {
    clear();

    // Piirrä mato
    for (int i = 0; i < snake.length; i++) {
        mvprintw(snake.body[i].y, snake.body[i].x, "O");
    }

    // Piirrä ruoka
    mvprintw(food.pos.y, food.pos.x, "X");

    // Piirrä pisteet
    mvprintw(0, 0, "Score: %d", score);

    refresh();
}

void update() {
    // Liikuta matoa
    Position prev = snake.body[0];
    Position next;

    switch (snake.direction) {
        case 'U':
            next.x = prev.x;
            next.y = prev.y - 1;
            break;
        case 'D':
            next.x = prev.x;
            next.y = prev.y + 1;
            break;
        case 'L':
            next.x = prev.x - 1;
            next.y = prev.y;
            break;
        case 'R':
            next.x = prev.x + 1;
            next.y = prev.y;
            break;
    }

    // Tarkista törmäykset
    if (next.x < 0 || next.x >= WIDTH || next.y < 0 || next.y >= HEIGHT) {
        endwin();
        printf("Game Over! Final Score: %d\n", score);
        exit(0);
    }

    for (int i = 1; i < snake.length; i++) {
        if (next.x == snake.body[i].x && next.y == snake.body[i].y) {
            endwin();
            printf("Game Over! Final Score: %d\n", score);
            exit(0);
        }
    }

    // Siirrä matoa
    for (int i = snake.length - 1; i > 0; i--) {
        snake.body[i] = snake.body[i - 1];
    }
    snake.body[0] = next;

    // Tarkista onko mato syönyt ruoan
    if (snake.body[0].x == food.pos.x && snake.body[0].y == food.pos.y) {
        snake.length++;
        score += 10;
        food.pos.x = rand() % WIDTH;
        food.pos.y = rand() % HEIGHT;
    }
}

int main() {
    init_game();

    while (1) {
        draw();
        int ch = getch();

        switch (ch) {
            case KEY_UP:
                if (snake.direction != 'D') snake.direction = 'U';
                break;
            case KEY_DOWN:
                if (snake.direction != 'U') snake.direction = 'D';
                break;
            case KEY_LEFT:
                if (snake.direction != 'R') snake.direction = 'L';
                break;
            case KEY_RIGHT:
                if (snake.direction != 'L') snake.direction = 'R';
                break;
            case 'q':
                endwin();
                return 0;
        }

        update();
    }

    endwin();
    return 0;
}

3. Koodin selitys

  • Struktuurit:
  • Position: Tallentaa x- ja y-koordinaatit.
  • Snake: Sisältää madon ruumiinosien sijainnit, madon pituuden ja suunnan.
  • Food: Sisältää ruoan sijainnin.
  • Funktiot:
  • init_game(): Alustaa pelin, asettaa madon aloituspaikan ja luo ensimmäisen ruoan.
  • draw(): Piirtää madon, ruoan ja pisteet ruudulle.
  • update(): Päivittää madon sijainnin, tarkistaa törmäykset ja ruoan syönnin.
  • Pääohjelma:
  • Käyttää ncurses-kirjastoa näppäimistön käsittelyyn ja ruudun päivittämiseen.
  • Peli päättyy, kun mato törmää seinään tai itseensä.

4. Kääntäminen ja suorittaminen

Kääntääksesi ja suorittaaksesi pelin, käytä seuraavia komentoja:

gcc -o snake_game snake_game.c -lncurses
./snake_game

5. Pelin ohjaus

  • Käytä nuolinäppäimiä liikuttaaksesi matoa.
  • Paina q lopettaaksesi pelin.

Tämä on hyvin yksinkertainen versio matopelistä, ja siihen voi lisätä monia ominaisuuksia, kuten tasoja, nopeuden kasvattamista tai vaikeustason muutoksia. Jos sinulla on kysyttävää tai haluat lisäominaisuuksia, kerro vain! 😊

Me: Osaatko kirjoittaa yksinkertaisen käyttöjärjestelmän vuorontajan C-kielellä?

Kyllä, voin auttaa sinua kirjoittamaan yksinkertaisen vuorontajan (scheduler) C-kielellä! Tässä esimerkissä luomme yksinkertaisen pyöreän vuorontajan (Round Robin Scheduler), joka hallitsee useita prosesseja ja jakaa CPU-aikaa niille tasaisesti.

1. Yksinkertainen Round Robin Scheduler

Tässä on esimerkki yksinkertaisesta vuorontajasta, joka käyttää pyöreää vuorontajaa (Round Robin) prosessien hallintaan:

#include <stdio.h>
#include <stdlib.h>

#define TIME_QUANTUM 2  // Kukin prosessi saa 2 aikayksikköä CPU-aikaa kerrallaan

typedef struct {
    int pid;            // Prosessin ID
    int burst_time;     // Prosessin suoritusaika
    int remaining_time; // Jäljellä oleva suoritusaika
} Process;

void round_robin(Process processes[], int n) {
    int time = 0;
    int completed = 0;

    while (completed < n) {
        for (int i = 0; i < n; i++) {
            if (processes[i].remaining_time > 0) {
                printf("Aikayksikkö %d: Prosessi %d suorituksessa\n", time, processes[i].pid);

                // Vähennä prosessin jäljellä olevaa aikaa
                if (processes[i].remaining_time > TIME_QUANTUM) {
                    time += TIME_QUANTUM;
                    processes[i].remaining_time -= TIME_QUANTUM;
                } else {
                    time += processes[i].remaining_time;
                    processes[i].remaining_time = 0;
                    completed++;
                    printf("Prosessi %d suoritettu loppuun.\n", processes[i].pid);
                }
            }
        }
    }
}

int main() {
    int n;

    printf("Syötä prosessien määrä: ");
    scanf("%d", &n);

    Process *processes = (Process *)malloc(n * sizeof(Process));

    for (int i = 0; i < n; i++) {
        processes[i].pid = i + 1;
        printf("Syötä prosessin %d suoritusaika: ", processes[i].pid);
        scanf("%d", &processes[i].burst_time);
        processes[i].remaining_time = processes[i].burst_time;
    }

    printf("\nAloitetaan vuorontaja...\n");
    round_robin(processes, n);

    free(processes);
    return 0;
}

2. Koodin selitys

  • TIME_QUANTUM: Kukin prosessi saa tietyn määrän CPU-aikaa (tässä tapauksessa 2 aikayksikköä) kerrallaan.
  • Process-struktuuri:
  • pid: Prosessin yksilöllinen tunniste.
  • burst_time: Prosessin kokonaisaika, joka se tarvitsee suorittamiseen.
  • remaining_time: Kuinka paljon aikaa prosessilla on vielä jäljellä suoritettavana.
  • round_robin-funktio:
  • Jakaa CPU-aikaa prosesseille pyöreän vuorontajan mukaisesti.
  • Kun prosessi on suoritettu loppuun (remaining_time = 0), se poistetaan vuorosta.
  • Pääohjelma:
  • Kysyy käyttäjältä prosessien määrän ja kunkin prosessin suoritusajan.
  • Kutsuu round_robin-funktiota prosessien suorittamiseksi.

3. Esimerkkituloste

Syötä prosessien määrä: 3
Syötä prosessin 1 suoritusaika: 6
Syötä prosessin 2 suoritusaika: 4
Syötä prosessin 3 suoritusaika: 2

Aloitetaan vuorontaja...
Aikayksikkö 0: Prosessi 1 suorituksessa
Aikayksikkö 2: Prosessi 2 suorituksessa
Aikayksikkö 4: Prosessi 3 suorituksessa
Prosessi 3 suoritettu loppuun.
Aikayksikkö 6: Prosessi 1 suorituksessa
Aikayksikkö 8: Prosessi 2 suorituksessa
Prosessi 2 suoritettu loppuun.
Aikayksikkö 10: Prosessi 1 suorituksessa
Prosessi 1 suoritettu loppuun.

4. Kääntäminen ja suorittaminen

Kääntääksesi ja suorittaaksesi ohjelman, käytä seuraavia komentoja:

gcc -o scheduler scheduler.c
./scheduler

5. Laajennettavat ominaisuudet

Tämä on hyvin yksinkertainen vuorontaja, ja siihen voi lisätä monia ominaisuuksia, kuten:

  • Prioriteetit: Anna prosesseille eri prioriteetit.
  • I/O-operaatiot: Lisää tuki I/O-operaatioille.
  • Monisäikeisyys: Toteuta vuorontaja monisäikeisessä ympäristössä.

Jos sinulla on kysyttävää tai haluat lisäominaisuuksia, kerro vain! 😊

Me: Osaatko kirjoittaa matopelin assemblerilla?

DeepSeek:

Kyllä, voin auttaa sinua kirjoittamaan yksinkertaisen matopelin assemblerilla! Tässä on esimerkki x86-64 -assemblerilla kirjoitetusta matopelistä, joka on suunniteltu Linux-ympäristöön. Tämä peli käyttää ncurses-kirjastoa ruudun päivittämiseen ja näppäimistön käsittelyyn.

1. Asenna ncurses

Ennen kuin aloitat, varmista, että ncurses on asennettuna. Voit asentaa sen seuraavalla komennolla:

sudo apt-get install libncurses5-dev libncursesw5-dev

2. Matopelin koodi

Tässä on yksinkertainen matopeli x86-64 -assemblerilla:

section .data
    snake db 'O', 0
    food db 'X', 0
    score db 'Score: ', 0
    game_over db 'Game Over! Final Score: ', 0

section .bss
    snake_x resb 100
    snake_y resb 100
    food_x resb 1
    food_y resb 1
    snake_length resb 1
    direction resb 1

section .text
    global _start

_start:
    ; Alusta ncurses
    call initscr
    call cbreak
    call noecho
    call curs_set
    call keypad
    call timeout

    ; Alusta mato
    mov byte [snake_length], 1
    mov byte [snake_x], 40
    mov byte [snake_y], 10
    mov byte [direction], 'R'

    ; Alusta ruoka
    call rand
    mov byte [food_x], al
    call rand
    mov byte [food_y], al

game_loop:
    ; Piirrä ruutu
    call clear

    ; Piirrä mato
    movzx ecx, byte [snake_length]
    mov esi, snake_x
    mov edi, snake_y
draw_snake:
    movzx eax, byte [esi]
    movzx ebx, byte [edi]
    call mvprintw
    add esi, 1
    add edi, 1
    loop draw_snake

    ; Piirrä ruoka
    movzx eax, byte [food_x]
    movzx ebx, byte [food_y]
    call mvprintw

    ; Piirrä pisteet
    mov eax, 0
    mov ebx, 0
    call mvprintw

    ; Päivitä ruutu
    call refresh

    ; Lue näppäimistö
    call getch

    ; Päivitä suunta
    cmp eax, KEY_UP
    je up
    cmp eax, KEY_DOWN
    je down
    cmp eax, KEY_LEFT
    je left
    cmp eax, KEY_RIGHT
    je right
    jmp update

up:
    mov byte [direction], 'U'
    jmp update

down:
    mov byte [direction], 'D'
    jmp update

left:
    mov byte [direction], 'L'
    jmp update

right:
    mov byte [direction], 'R'
    jmp update

update:
    ; Liikuta matoa
    movzx esi, byte [snake_length]
    dec esi
    movzx edi, byte [snake_x + esi]
    movzx ebx, byte [snake_y + esi]
    mov byte [snake_x + esi + 1], dil
    mov byte [snake_y + esi + 1], bl

    ; Päivitä madon pää
    cmp byte [direction], 'U'
    je move_up
    cmp byte [direction], 'D'
    je move_down
    cmp byte [direction], 'L'
    je move_left
    cmp byte [direction], 'R'
    je move_right

move_up:
    dec byte [snake_y]
    jmp check_collision

move_down:
    inc byte [snake_y]
    jmp check_collision

move_left:
    dec byte [snake_x]
    jmp check_collision

move_right:
    inc byte [snake_x]
    jmp check_collision

check_collision:
    ; Tarkista seinät
    cmp byte [snake_x], 0
    jl game_over
    cmp byte [snake_x], 80
    jg game_over
    cmp byte [snake_y], 0
    jl game_over
    cmp byte [snake_y], 24
    jg game_over

    ; Tarkista ruoka
    movzx eax, byte [snake_x]
    movzx ebx, byte [snake_y]
    cmp eax, [food_x]
    jne no_food
    cmp ebx, [food_y]
    jne no_food

    ; Syö ruoka
    inc byte [snake_length]
    call rand
    mov byte [food_x], al
    call rand
    mov byte [food_y], al

no_food:
    jmp game_loop

game_over:
    ; Lopeta peli
    call endwin
    mov eax, 1
    xor ebx, ebx
    int 0x80

; Apufunktiot
initscr:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

cbreak:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

noecho:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

curs_set:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

keypad:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

timeout:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

clear:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

mvprintw:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

refresh:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

getch:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

endwin:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

rand:
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    mov esi, 0
    mov edi, 0
    mov ebp, 0
    mov esp, 0
    ret

3. Koodin selitys

  • section .data: Sisältää pelin tietoja, kuten madon ja ruoan symbolit, sekä pistetiedot.
  • section .bss: Varataan muistia madon ja ruoan sijainneille.
  • section .text: Pääohjelma ja apufunktiot.

4. Kääntäminen ja suorittaminen

Kääntääksesi ja suorittaaksesi ohjelman, käytä seuraavia komentoja:

nasm -f elf64 snake.asm -o snake.o
gcc -o snake snake.o -lncurses
./snake

5. Pelin ohjaus

  • Käytä nuolinäppäimiä liikuttaaksesi matoa.
  • Paina q lopettaaksesi pelin.

Tämä on hyvin yksinkertainen versio matopelistä, ja siihen voi lisätä monia ominaisuuksia, kuten tasoja, nopeuden kasvattamista tai vaikeustason muutoksia. Jos sinulla on kysyttävää tai haluat lisäominaisuuksia, kerro vain! 😊

[collapse]
BASIC-tulkki -spoiler

Ei edes DeepSeek osaa tai ehdi kaikkea.

Me: do you know MITS Altair 8800?

DeepSeek: The server is busy. Please try again later.

Me: Do you know Altair 8800?

DeepSeek: The server is busy. Please try again later.

Me: Do to know BASIC interpreter?

DeepSeek:

Yes, I am familiar with the BASIC interpreter. BASIC (Beginner’s All-purpose Symbolic Instruction Code) is a family of high-level programming languages designed to be easy to use. The BASIC interpreter is a program that executes BASIC code directly, without the need for compilation. This means that you can write a line of BASIC code, and the interpreter will execute it immediately, making it a great tool for learning programming and for rapid prototyping.

One of the most famous BASIC interpreters is the one that was included with the Altair 8800, which was developed by Microsoft founders Bill Gates and Paul Allen. This version of BASIC, known as Altair BASIC, was one of the first products developed by Microsoft and played a significant role in the early days of personal computing.

BASIC interpreters have been widely used in various systems, from early microcomputers to modern programming environments. They are known for their simplicity and ease of use, which has made them a popular choice for beginners in programming.

Me: Could you write an assembly code of BASIC interpreter for the Altair 8800?

DeepSeek: The server is busy. Please try again later.

Me: Could you write an assembly code of BASIC interpreter?

DeepSeek:

Writing a full BASIC interpreter in assembly language is an extremely complex task, especially for a platform like the Altair 8800, which uses the Intel 8080 microprocessor. A BASIC interpreter involves parsing, tokenizing, executing code, managing variables, handling input/output, and more. It would require thousands of lines of assembly code and a deep understanding of both the 8080 instruction set and the design of interpreters.

However, I can provide a simplified example of how you might start writing a tiny interpreter-like program in 8080 assembly. This example won’t be a full BASIC interpreter but will demonstrate some foundational concepts, such as reading input, parsing simple commands, and executing them.


Example: A Tiny Command Interpreter in 8080 Assembly

This program reads a simple command (like PRINT "HELLO") and performs a basic action.

; Tiny Command Interpreter for Altair 8800 (Intel 8080)
; This is a simplified example, not a full BASIC interpreter.

ORG 0100H       ; Start program at memory address 0100H

START:
    MVI A, 0AH  ; Load newline character into A
    CALL PRINT_CHAR ; Print newline

    LXI H, PROMPT ; Load address of PROMPT message
    CALL PRINT_STRING ; Print the prompt

    LXI H, INPUT_BUFFER ; Point HL to input buffer
    CALL READ_INPUT ; Read user input

    CALL PARSE_INPUT ; Parse the input

    JMP START   ; Loop back to start

; Subroutine to print a character in A
PRINT_CHAR:
    OUT 01H     ; Send character to output port (assume port 01H is console)
    RET

; Subroutine to print a null-terminated string pointed to by HL
PRINT_STRING:
    MOV A, M    ; Load character from memory (HL)
    CPI 0       ; Compare with null terminator
    RZ          ; Return if null terminator
    CALL PRINT_CHAR ; Print the character
    INX H       ; Move to next character
    JMP PRINT_STRING ; Repeat

; Subroutine to read input into buffer pointed to by HL
READ_INPUT:
    IN 00H      ; Read character from input port (assume port 00H is keyboard)
    CPI 0DH     ; Check for carriage return (end of input)
    RZ          ; Return if carriage return
    MOV M, A    ; Store character in buffer
    INX H       ; Move to next buffer position
    JMP READ_INPUT ; Repeat

; Subroutine to parse the input
PARSE_INPUT:
    LXI H, INPUT_BUFFER ; Point HL to input buffer
    MOV A, M    ; Load first character
    CPI 'P'     ; Check if it's 'P' (for PRINT)
    JZ PRINT_COMMAND ; Jump to PRINT handler
    ; Add more commands here
    RET

; Handler for PRINT command
PRINT_COMMAND:
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI 'R'     ; Check for 'R'
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI 'I'     ; Check for 'I'
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI 'N'     ; Check for 'N'
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI 'T'     ; Check for 'T'
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    ; If we get here, it's a PRINT command
    CALL HANDLE_PRINT ; Handle PRINT command
    RET

; Handler for unknown commands
UNKNOWN_COMMAND:
    LXI H, UNKNOWN_MSG ; Load address of unknown command message
    CALL PRINT_STRING ; Print the message
    RET

; Handler for PRINT command
HANDLE_PRINT:
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI ' '     ; Check for space
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    INX H       ; Move to next character
    MOV A, M    ; Load next character
    CPI '"'     ; Check for opening quote
    JNZ UNKNOWN_COMMAND ; If not, handle as unknown
    INX H       ; Move to next character
PRINT_LOOP:
    MOV A, M    ; Load character from buffer
    CPI '"'     ; Check for closing quote
    RZ          ; Return if closing quote
    CALL PRINT_CHAR ; Print the character
    INX H       ; Move to next character
    JMP PRINT_LOOP ; Repeat

; Data section
PROMPT:
    DB "READY>", 0
UNKNOWN_MSG:
    DB "UNKNOWN COMMAND", 0AH, 0
INPUT_BUFFER:
    DS 80       ; Reserve 80 bytes for input buffer

END

Explanation:

  1. Input Handling: The program reads input from the user and stores it in a buffer.
  2. Command Parsing: It checks if the input starts with PRINT and handles it accordingly.
  3. Output: For the PRINT command, it prints the text enclosed in quotes.
  4. Loop: The program loops back to the start after handling a command.

Limitations:

  • This is a very simplified example and does not implement a full BASIC interpreter.
  • It lacks features like variable handling, arithmetic, loops, and more.
  • A real BASIC interpreter would require a much more sophisticated design, including a tokenizer, parser, and execution engine.

If you’re interested in learning more, I recommend studying the source code of existing BASIC interpreters, such as Microsoft’s Altair BASIC or Tiny BASIC, which are historically significant and well-documented.

Me: where I can find the source code of Microsoft’s Altair BASIC?

DeepSeek: The server is busy. Please try again later.

[collapse]

REFERENSSIT

[1] Lääkäriliitto: Syntymättömän oikeudet
[2] LSN: No, Having One Child Does Not Add 60 Tons Per Year to Your Carbon Footprint
[3] DeepSeek

Pohjavesien saastuminen osa 2

Vuoden kuluvat, pohjavedet saastuvat. Voisi sanoa, että pohjavedet saastutetaan. Homma jatkuu samaa rataa. Vanhat kaatopaikat vuotavat vielä vuosikymmenet. Pohjavedet saastuvat vuosituhansiksi. Homma jatkuu tuttuun malliin. [1]

Jätteet yhteen läjään

Minäkin olen elänyt aikaa, jolloin oli vielä kaatopaikkoja. Tämä on nerokas keksintö, jossa kaikki jätteet kerätään yhteen kasaan. Ajan myötä jätteet hajoavat ja muuttuvat myrkkyliejuksi. Vuosikymmenten jälkeen suojamuovi hajoaa ja myrkkyliete valuu maaperään, josta lopulta pohjaveteen.

Video. Opettava video jätehoidosta

Kaatopaikkoja käytettiin todennäköisesti sen takia, että se on ns. väliaikainen ratkaisu. Kerätään muovit samaan läjään ja sekoitetaan maata yhteen. Joku tulevista sukupolvista sitten käsittelee ne jätteet.

Nyt muovinkierrätyksen aika on tullut. Lapsena ihmettelin, että miksi muovia ei kierrätetä. Kyse on ollut vain rahasta; muovien kierrätys maksaa. Toinen syy on ihmisten laiskuus. Odotetaan, että joku toinen hoitaa homman. Nyt muovien kierrätys ottaa ensimmäisiä askelia [4].

Ikuisuusmyrkyt hanasta

Ihmiset ovat tuottaneet vuosikymmenien aikana myrkkyjä, jotka eivät hajoa käytännössä koskaan. Näitä aineita on käytetty huolettomasti teollisuudessa. Helpottavat paperiteollisuutta, tekevät elintarvikepakkauksista miellyttävämpiä [6, 7]. Lopulta ne myrkyt päätyvät ihmisten aivoihin [8]. Tutkimusten mukaan ihmisten aivoista puoli prosenttia on muovia [9].

Uskomattominta on, että näitä aineita ei kukaan ole Suomessa valvonut ja seurannut. Nyt vasta vuosikymmenien päästä ilmenee, että ne ovat pitkään saaneet vapaasti kulkeutua pohjavesiin. Nyt vasta kun vuosikymmenien hitaan kulkeutumisen jälkeen niitä tulee ihmisten vesijohtohanasta, niin asia herää uutiseksi. [2, 3]

Kukaan ei tiedä, että miksi länsimaissa hedelmällisyys laskee. Syytä on etsitty, mutta kukaan ei tiedä. Asiaa on ihmetelty jo 30 vuotta sitten. [5]

Jatketaan samaan malliin

Mikään näistä asioista ei varmasti ole suuri yllätys. Asiat on hyvin tarkasti tiedetty. Ihmiset vain eivät välitä. Ainakaan mitään ei tehdä, jos sillä ei voi tehdä rahaa. Typeriä asioita tehdään, jos sillä saa edes hieman tulosta eli rahaa.

Sim City -spoiler

Tiettyjen bakteerikantojen lisääminen poppeli puiden eli haapojen juuriin tekee niistä tehokkaan keinon saasteiden käsittelyssä. Puut imevät saastuneesta maaperästä myrkyllisiä metalleja ja muita haitallisia kemikaaleja. Näin maaperän saasteita voidaan poistaa, bakteerit ja puut käsittelevät ihmisten saasteita. [10]

Video. How to remove Ground Pollution in SimCity 5!
Video. SimCity 5 – Ground Pollution Problem – tutorial & tips – Sim City 2013
Video. SimCity 4 Gameplay – Cleaning up a Dirty City
[collapse]

Tämä on ihmisten realiteetti. Ihminen on lähtökohtaisesti ahne ja paha olento. Toisaalta ihmisellä on myös positiivinen puoli. Se tulee sitten esiin kun pahuus tulee vesihanasta juomalasiin asti.

REFERENSSIT

[1] Pohjavesien saastuminen
[2] YLE: Myrkky juomavedessä
[3] YLE: Ikuiset kemikaalit myrkyttivät joen
[4] Muoviteollisuus Ry: Muovien kierrätys
[5] Duodecim: Miesten hedelmällisyys heikentynyt puoleen 50 vuodessa. julkaistu 1993.
[6] T&T: Tuore tutkimus löysi myrkkykemikaaleja wc-paperista ympäri maailmaa
[7] Ruokavirasto: PFAS-yhdisteet
[8] EHN: PFAS can enter and accumulate in the brain, study confirms
[9] theGuardian: Microplastics are infiltrating brain tissue, studies show
[10] European Comission: Bacteria turn trees into pollution-eating machine

Lakkojen joulukuu

Suomessa alkaa lakot tällä viikolla. Monessa teollisuuden työpaikassa tuotanto pysähtyy. [2]

IT-alalla

Tilanne ei ole paljon sen parempi millään alalla. Rakennusalan tilanne on varmasti se huonoin.

Kuva 1. Työtilanne Suomessa. [1]

Kokemuksia Suomesta

Tässä muutamia Google Translatella suomen kielelle käännettyjä kommentteja. Tällainen on ihmisten mielipide Suomen työtilanteesta IT-alalla.

bac0nFriedRice:

”Viimeisten 2 vuoden aikana tiimini oli irtisanonut puolet ihmisistä ja tuonut paljon intialaisia ​​kehittäjiä tilalle. Meillä on 25-30 % vähemmän henkilöstöä kuin ennen, mutta työmäärämme on pysynyt suunnilleen sama. Ymmärrän sen, yritykset haluavat leikata kustannuksia ja tehdä voittoa. Ei halveksuntaa he ovat ahkeria ihmisiä, mutta se ei ole niin kuin täällä jo olevat ihmiset, joka on Suomen koulutusjärjestelmän tuote on niin huono, että heidän pitäisi palkata ulkomailta. Tunnen todella pahaa ystävieni puolesta, pian he ajattelevat muuttavansa pois Suomesta ja rehellisesti sanottuna se on kuin vuodattaisi verta kykyjä, joita kipeästi haluat houkutella. Talous ottaa oikosulkua, joka ei varmasti ole hyvä pitkällä aikavälillä.”

”Tämänhetkinen työtilanne Suomessa…
Joten viimeisen kuukauden aikana minulla oli 2 ystävää, jotka pingasivat minua, jos nykyinen yritykseni palkkaa. Toinen on pian valmisteleva tohtoriksi LUT:sta ja toinen on diplomi-insinööri Aallosta, molemmat ovat tietotekniikan pääaineena. Olen nähnyt heidän työnsä ja tiedän, että he ovat täysin työkykyisiä, mutta kuukausiin he eivät löydä varmaa työtä.” [1]

TurboGramps:

”Suomalaiset yritykset ja johto lyövät luukkuja ja odottavat talven ohimenemistä. Ne eivät pysty kääntymään, koska markkinat ovat taantumassa ja euro on kallis. He eivät myöskään ole parhaita sivusuuntaisessa tai luovassa ajattelussa. Pankit eivät myöskään anna luottoa, koska niiden ei tarvitse, koska nollakorkoisten lainojen vuosikymmen maksaa nyt osinkoja. Venäjän toimet ovat pelottaneet offshore-sijoittajia.

Myös yhtiömme ovat lihavia, ylihallittuja beurokraattisia painajaisia. Tehokkuus on paskaa. Ainoat työntekijät, joita olen nähnyt, ovat enemmän ihmisiä, jotka värittävät huippuja ja varaavat tiimikokouksia. Työntekijöitä on enemmän kuin scrum-mestareita, keskijohtoa, projektipäälliköitä, tuoteomistajia, compliance-vastaavia, riskikonsultteja ja vastaavia.

Sillä välin kasvun tappaa verottaja, joka saalistaa pieniä ja keskisuuria yrityksiä. Ja tehottomia suuryrityksiä tuetaan. Asiaa pahentaa entisestään se, että monikansalliset yritykset syrjäyttävät startupit.

15 vuoden ilman kasvua, ilman tutkimusta ja kehitystä olemme nyt 20 vuotta jäljessä melkein kaikessa.” [1]

thornolf_bjarnulf:

”Olen työskennellyt yrityksessäni yli 2 ja puoli vuotta. Minulla oli YKSI TODELLA VIIKKO ilman projektia, ja minut lomautettiin sen vuoksi.

Rakastamme Suomea – emme tietenkään kaikkea – mutta olemme todella yrittäneet tehdä siitä kotimme täällä. Tyttöystäväni on nyt suomen kielen lähes B2, tekee osa-aikatyötä ja opiskelee suomea, tekee noin 45+ tuntia viikossa (suomea ja toisen kielen opettamista osa-aikatyönä). Hän on tehnyt niin kovasti töitä.

Mutta rehellisesti sanottuna, tämän lomautuksen jälkeen olemme miettineet lähtemistä yhä enemmän. Pelkään niin, että kun löydän toisen työn, sama toistuu. Maahanmuuttajien on jo super vaikeaa rakentaa jotain vakaata toiseen maahan, ja jos se on syntyperäisillekin suomalaisille tuskaa… :/” [1]

aragon0510:

”en tiedä sinusta, mutta työpaikallani, suuressa konsulttiyhtiössä ja osastollani, meillä on noin 10 ihmistä ilman työtä noin 2 3 viikkoa, eivätkä he ole onnistuneet saamaan uutta asiakasta, mutta samalla Aikanaan oli 3 4 pientä + 2 (hieman) isompaa asiakasta vaihtamassa muihin halvempiin toimittajiin.

Työkuormituspuolella se on vähiten sitten vuoden alun, vaikka keväällä viimeisimmistä muutosneuvotteluista irtisanottiin juuri kuin 10ish. Jos he todella haluavat optimoida kustannuksia, leikata enemmän rasvaa vuoden lopun talousraporttia varten keväällä, he voivat yhtä hyvin potkia uuteen CN:ään vielä 10 lisää ensi vuonna. Corpo-puoli tuo lisää kehittäjiä, mutta ne ovat hyvin tietyille asiakkaille.

Suomen asia on se, että se on liian kallis kirjaimellisesti mihin tahansa. Asiakkaamme ja vastaavat yritykset eivät voi saada edes voittoa, vaikka vaivaudutaan ostamaan lisää palveluita työnantajaltamme? Työnantaja ei voi myydä eikä hänellä ole enää töitä, irtisanotaan työvoimat.” [1]

Sensitive_Day_7643:

”Intialaiset – 10 vuoden kokemus halvemmalla palkalla

Ystäväsi – ehkä 2-3 vuoden kokemus suuremmalla palkalla

En usko, että yritys välittää tunteistasi, raha on rahaa.” [1]

TA_jg:

”Olen vanha ihminen, joka työskentelee IT-alalla Suomessa. ”Vanha” tarkoittaa monia asioita, ja yksi niistä, minulla on enemmän anekdoottisia todisteita kuin useimmilla ihmisillä ympärilläni. Jaan osan siitä kanssasi. Olen tarkoituksella äärimmäinen; vaikka se ei olekaan niin paha kuin annoin sen kuulostavan, se on pahempaa kuin mitä useimmat uskovat. Täältä se tulee:

Toisaalta kaikki ei-IT-ihmiset, joiden on työskenneltävä kanssamme ja jotka tietävät, kuinka paljon saamme palkkaa, VIHAavat MEitä TÄYSIN. Liiketoiminta, HR, johto, saamme usein paremman palkan kuin he. He eivät ymmärrä, miten joku pesemätön, töykeä outo, jolla on farkkuhousut ja huppari toimistossa, saa niin paljon rahaa ilman vastuuta.

Tämä on tietysti vain yksi puoli asiasta. Itse asiassa vuosikymmeniä ammatillisesti ja ihmisenä kasvamisen jälkeen olen huomannut, että valtava enemmistö tällä hetkellä IT-alalla työskentelevistä ihmisistä ei ole vain paskapäitä, vaan myös epäpäteviä. Koko alaa ohjaavat idiootit, jotka kompastuivat menestykseen uransa varhaisessa vaiheessa ja ovat nyt ”ajatusjohtajia” tai miksi sitä haluatte kutsua. En mainitse nimiä, mutta jos joku kysyy mielipidettäni tietystä henkilöstä tai alan kuumasta aiheesta, voin kertoa sen hänelle.

Edes yliopistoon käyminen ei merkitse nykyään juurikaan, ellei kyseessä ole erittäin hyvä yliopisto (joita on ehkä puolitoista yhteensä koko Suomessa). Silloinkin, jos satut olemaan 1:10, jolla on luonnollinen taipumus, kyllä, saatat kasvaa ammattilaiseksi muutaman vuosikymmenen kuluessa.

(Lyhyesti sanottuna: yliopistojen opetussuunnitelma on nykyään erilainen ja minun henkilökohtaisesti mielestäni hyödytön. Kun menin kouluun, ei Suomessa, meillä oli vielä ”yleinen” koulutus. Vuosi toisensa jälkeen katselin kuinka se huononi oppimiseen tietyt tekniikat ja menetelmät, jotka on keksinyt joku, jolla on 90 prosentin todennäköisyys olla tyhmä.)

Päätän huutamiseni sanomalla, että maailma tarvitsee noin 1/10 nykyisestä ”kehittäjien” määrästä.

Joten kyllä, se tulee olemaan erittäin rankkaa tulevalla vuosikymmenellä.” [1]

Kuva. That’s not what we do around here.

REFERENSSIT

[1] Reddit: Current job situation in Finland
[2] Teollisuusliitto: Lakot teknologiateollisuudessa alkavat ilmoitetusti tiistaina 3.12.

Chat GPT

Tekoäly kehittyy kovaa tahtia. Tekoälyn hypetys on tällä hetkellä kovalla tasolla. Noin vuosi sitten puhuttiin, että tekoäly korvaa suurimman osan vaativista asiantuntijatöistä.

Oma kokemus

Kokeilin tänä vuonna käyttää kovasti hypetettyä chatGPT-tekoälyä [1]. Olin jossain mielessä positiivisesti yllättynyt tekoälyn kyvyistä. Olen vuosituhannen alussa käyttänyt vastaavaa tekoälyä, joka kommunikoi käyttäjän kanssa ja oppii käyttäjä syötteestä.

Suurin ero aiempiin verkossa toimiviin Alan Turingin -ideaan pohjautuvassa tekoälyssä oli se, että tämä uusi ChatGPT muistaa aiemman dialogin vaiheet[4]. Eli aiemmin tekoälyt eivät ole muistaneet, että mitä juuri edellisessä vastauksessa olivat sanoneet.

Tekoälyn idea

Vietin juuri viikonloppuna isänpäivää. Toteutin tekoälyn antaman neuvon. Seinäjoella tällä alueella paikallisiin ruokiin kuului mm. lohi, poro, sienet ja siika, ne ovat suomalaisia ruokia. Taisi jotain muutakin olla.

Kysyin, että miten siika kannattaa valmistaa. Kuulemma savustamalla. Kysyin vielä, että millä kannattaa savustaa. Kuulemma kannattaa käyttää pähkinä tai mantelipuuta, koska siika on vähärasvainen kala.

Nyt sitten ostin mantelipuuta savustettavaksi ja siikaa. Tekoäly kertoi tämän minulle.

Kahen kilon siika -spoiler

Vuosia vanha reality-video. Ehkä suomalaisen internetin yksi parhaita videomeemejä Cola Ollin jälkeen.

Video. Kahen kilo siika
[collapse]

Tietotekniikan historia

Tietotekniikka on kehittynyt huimaa tahtia. Vasta nyt tulee teknologioita, joita on ennustettu jo sata vuotta sitten. Scifi  muuttuu todellisuudeksi. [2, 3]

Joskus kuulee sanottavan, että ”kukapa olisi osannut ennustaa”. On sitä jotkut osanneet ennustaa toteen. Tietysti nämä Sci-Fi ennusteet ovat usein vain pelkkää hypoteettista ennustamista. Moni ennuste on mennyt täysin väärin.

Moni ennustettu asia on toteutunut, mutta varmasti itse ennusteen tehnyt ihminen ei ole osannut ennustaa, että miten se käytännössä on toteutunut. Muistan tekniikan maailmasta artikkelin, jossa lainattiin 1800-luvun vanhaa arkistoitua lehteä. Siinä artikkelissa kerrottiin, että tulevaisuudessa kaikki laitteet kytkeytyvät yhteen puhelinverkon kaltaiseen radioverkkoon, jossa ne viestivät keskenään.

REFERENSSIT

[1] ChatGPT
[2] Laskulaitteiden ja tietokoneiden kehitys. TTY, Liikala & Kela. 2016
[3] Tuppu.fi:Tietotekniikan kehitys
[4] Investopedia: Turing test

Trump vs. Harris

Yle ei voi sopimisteknisistä syistä näyttää Yhdysvaltain tärkeintä vaalikeskustelua, joten tässä se Youtubesta [1]. Harva pääsi neljältä aamuyöstä Suomen aikaa katsomaan sitä suorana.

”Sopimusteknisistä syistä johtuen väittely on mahdollista esittää ainoastaan suorana lähetyksenä eikä se näin ollen ole jälkikäteen katsottavissa Yle Areenasta.” YLE [1]

Video. DEBATE REPLAY: VP Harris and former President Trump l ABC News Presidential Debate

Trumpin iho näyttää tummemmalta kuin Harriksen iho. Onko Donald Trump käynyt solariumissa tai muuten erityisesti ruskettanut ihoaan poikkeuksellisen paljon?

Ihonvärin vertailu

Kamalan ja Trumpin ihonväriä voi vertailla omien aistien lisäksi mm. Paintilla. Seuraavassa kuvassa on vertailtuna Trumpin ja Obaman ihonväri pikselistä keskeltä otsaa, kun he seisovat vastaavassa asennossa ja valaistuksessa. Tämä on ainutlaatuinen hetki, jolloin molemmat ehdokkaat ovat samassa ja täysin vertailukelpoisessa ympäristössä kuvattuna.

Kuva. Trumpin ja Harriksen ihonväri otsasta katsottuna videon RGB-väriskaalalla.

Trumpin iho on punaisempi, mutta Harriksen iho on sinisempi ja hieman vihreämpi. Mitä isompi arvo, niin sitä vaaleampi iho. Se miten ihmissilmä värit aistii, niin on hyvin yksilöllistä ja geneettistä [2].

Trump: (192+134+107) / 3 / 255 =56,6 % valkoinen
Harris: (183+138+115) / 3 / 255 = 57,0 % valkoinen

Näyttäisi siltä, että RBG eli videon värien tallennusmuodossa Harris olisi hivenen vaaleampi kuin Trump. Tämä ei anna absoluuttista totuutta koko spektristä, mutta pitäisi olla lähellä sitä. Molemmat henkilöt ovat kuvattuna samalla kameralla ja vastaavalla valaistuksella.

Trumpin ihon punertava väri voi viitata sihen, että hän olisi ruskettanut ihoaan liikaa eli iho olisi palanut. Iho punottaa sen takia. Tämä tekisi ihosta punaisemman. Tämä väite vaatisi, että Trumpin ihoa pitäisi vertailla aiempaan ajankohtaan tai hänen sukulaisiinsa samassa valaistuksessa ja kuvauskonfiguraatiolla. Tämä on minulle käytännössä mahdotonta toteuttaa.

Trumpin iho suodattaa korkeamman aallonpituuden värejä eli sinistä sävyä. Se mielestäni voi viitata siihen, että Trumpi olisi käynyt ruskettamassa ihoaan. Ihon rusketuksen luonnollinen tarve on suojata ihoa ultravioletilta säteilyltä.

REFERENSSIT

[1] YLE: Harrisin ja Trumpin vaaliväittely
[2] JAMA Network: Molecular Genetics of Color Vision and Color Vision Defects

Ei saa luoda stigmaa

Nyt on ilmennyt apinarokkoa uudestaan Euroopassa. Samainen virus, joka pari vuotta sitten edellisen kerran aiheutti pandemian. Tällä kertaa kyse on tappavammasta ensimmäisen linjan apinarokosta.

Leviää seksivälitteisesti

Edellisellisen pandemian aikana apinarokko levisi ensisijaisesti seksitautina [1]. On hyvin oletettavaa, että tämä nykyinen uusi pandemia on samanlainen.

Iltalehti uutisoi, että suurin osa tartunnan saaneista on lapsia. Se puhuisi sen puolesta, että tartunta ei leviäisi pääasiassa seksivälitteisesti. [2]

Miksi ei kuitenkin voisi olla, että tauti leviää lapsien ja apinoiden välillä seksin välityksellä. Kun virus kehittyy, niin sen jälkeen viruksen kyky tarttua muuttuu. Näin virus saa enemmän tartuntapintaa.

Luodaanko nyt uusi HIV

Hiv tuli huonoon maineeseen homomiesten tautina. Apinarokko tulee tunnetuksi pedofiiliasta ja eläimiinsekaantumisesta, jonka keskuudessa se on kehittynyt.

REFERENSSIT

[1] Yale Medicine: Mpox
[2] IL: Näin pelätty apinarokko tarttuu

Kesäloma

Tuli käytyä matkalla Euroopassa, 8300 km ja 16 eri maata. Näistä 13 maata oli minulle itselleni uusia. Italia oli matkan etäisin kohde. Tein lomamatkan mm. ilmastosyistä omalla autolla lentokoneen sijaan.

Paras paikka

Oman kokemukseni mukaan matkan paras paikka oli Latviassa. Baltiassa on todella mukava meri, jonka yli kesäinen ilta-aurinko laskeutuu. Aurinko saa enemmän kuin Suomessa, mutta silti iho ei pala liian helposti.

Huonona puolena on se, että meri on samaa maailman saastuneinta merta kuin Suomen rannikolla. Veden lämpötila on myös viileämpi kuin Välimerellä. Kaunis hiekkaranta ei tätä asiaa korvaa. [1]

Autolautta Helsingistä Tallinnaan maksaa 77 euroa, aikaa lautalla kuluu 2,5 tuntia. Baltiassa välimatkat ovat lyhyitä, autolla Baltianmaiden välillä liikkuminen tapahtuu Suomeen verrattuna nopeasti.

Myyttien rikkominen

Olen usein kuullut, että ulkomailta ei saa ruisleipää tai maitoa. Nämä kaksi väitettä eivät oman kokemukseni mukaan päde ainakaan Euroopassa. Ruisleivän ostaminen Italiassa voi olla Suomeen verrattuna hieman erilaista, mutta kyllä sitä sielläkin on [2]. Kauraleivän löytäminen sen sijaan oli vaikeaa jopa jo Tanskassa.

Olen kuullut väitteen, että saksalaiset ovat suorasanaisia. Oman kokemukseni mukaan huomattavasti suorasiaisempia ihmiset ovat Alankomaissa, tulevat heti ohjeistamaan, jos huomaavat jonkun toimivan epävarmasti. Esimerkiksi parkkihallissa työntekijä tuli ohjeistamaan, että pysäköinti on ilmaista, mutta kauppojen sulkemisajan jälkeen pysäköimisestä saa 140 euron hintaisen rengaslukon.

Saksalaiset olivat hyvinkin kohteliaita, en huomannut minkäänlaista negatiivista asennetta. Tarkkoja he ovat, se pitää paikkansa, mutta eivät he ole epäkohteliaita. Jopa pienet lapset tervehtivät, osaavat olla kohteliaasti. Tietysti he myös olettavat muiden toimivan samoin heidän maassaan.

Usein kuuluu väitteen, että Suomi on erityisen kallis maa. Polttoaine maksaa muualla Euroopassa hyvin saman verran kuin Suomessa, jos jätetään Itä-Eurooppa huomioimatta. Liha ja muut elintarvikkeet kaupassa ovat lähellä samaa tasoa kuin Suomessa; melonin kilohinta on euron tuntumassa ja monet edulliset lihat kymmenen euroa kilolta. Ravintoloiden listahintojen päälle tulee tippimaksu. Monessa maassa käsite hypermarket on sama kuin Suomessa tavallinen market eli kaupan pihalla on parkkipaikka. Ainoastaan alkoholi on Suomessa poikkeuksellisen kallista.

Latviassa oli edullisemmat kauppojen hinnat oman matkani osalta. Ainut poikkeus on alkoholi, sen hintataso on Tanskasta Viroon ja siitä etelää huomattavasti Suomea halvempaa, Italiassa kuohuviinipullo maksoi 3 euroa. Muulta osin en itse kokenut Italiaa Suomeen verrattuna halpana maana. Leirintämaksut olivat lähes kaikkialla samaa tasoa, Suomen Lapissa on tähän asti ollut kaikista halvin telttapaikka.

En väitä Suomea halvaksi maaksi ollenkaan. Kuitenkin väite siitä, että Suomi olisi erityisen kallis maa, niin en jaa sitä näkemystä [3]. Ehkä Suomi on ollut erityisen kallis maa, mutta tällä hetkellä hintataso on lähellä Saksan hintatasoa. Arvonlisävero selittää maiden välisen kuluttajahintojen erotuksen.

Erilaiset tiet

Saksalaisten moottoriteiden valtavista nopeuksista en ole ihan samaa mieltä, suurin osa ajaa moottoritiellä rauhallisesti. Samalla lailla BMW:t ja Audit ajavat Suomessa kuin Saksan moottoriteillä. Erona se, että Suomessa lapsiperheiden Volvot myös ajavat samoin kuin autobanalle kehitetyt autot. Yleisesti Euroopassa moottoriteiden nopeusrajoitus on 130 km/h.

Kun Saksasta ajoi Alankomaihin, niin siellä päivällä yleisnopeusrajoitus oli 100 km /h, yöllä 130 km/h. Iso syy on valtavissa ruuhkissa, 10 kaistainen tie Amsterdamiin oli tukossa ruuhka-aikaan. Tällöin toiseen suuntaan suositeltu ajonopeus voi olla 40 km/h ja toiseen suuntaan 120 km/h.

Tanska, Belgia ja Alankomaat ovat pyöräilijän unelmakaupunkeja. Etenkin Amsterdamissa pyöräilijöitä oli syytä varoa, sitä varten oli jopa erillinen varoitusmerkki oikealle kääntyvien autojen liikennevaloissa. Monet ajoivat työmatkan polkupyörällä, paljon oli jopa matkailijoita telttailemassa pyöräillen.

Ohjeita ulkomailla ajeleville

Jos haluat käydä Luxemburg cityssä autolla, niin on kannattaa etsiä se keskustan ainut yleinen parkkihalli valmiiksi navigaattoriin. Onneksi tarvitsi vain kerran ajaa keskustan kävelykadun läpi ja kiertää kaupunki uudestaan, että pääsi kaupungin ainoaan parkkihalliin. Kyseisen parkkihallin mukaan autoni oli Belgiasta. Vaikka poliisit seurasivat autoani, niin onneksi poliisit eivät pysäyttäneet siellä, en haluaisi tietää paikallisen maan sakkojen tasoa.

Sveitsissä dataliikenne maksaa valtavasti, siellä voi tulla alle päivässä monenkymmenen euron verran puhelinlaskua vaikka ei paljoa verkkoa käyttäisikään. Siellä myös täytyy ostaa erillinen lupa moottoritielle.

Tanskan sillan ylityksessä kannattaa olla tarkkana, että minkälaisia valintoja siellä on valittuna. En tiedä maksoinko rekan siltamaksun, oli kuitenkin kolme kertaa enemmän kuin mitä piti olla.

Ylipäätänsä monenlaista erilaista kameraa ja vastaavaa laitetta on Itä-Euroopassa. En itse tiedä miten ne edes toimii, mutta kyltin mukaan voi saada jopa 2000 euron sakon roskaamisesta. Jokaisessa maassa on omat tapansa, että miten autoilijoilta saadaan rahaa.

Onneksi ei sattunut mitään, matka meni hyvin.

REFERENSSIT

[1] YLE.fi: Maailman saastunein meri
[2] Deligted Cooking: What is Italian Rye Bread?
[3] Vauva.fi: Onko Suomi kallis maa?

Osta halvalla ja myy kalliilla

Mikä olisikaan parempi talousneuvo kuin ostaa halvalla ja myydä kalliilla? Ongelmana vain on tietää, että milloin jokin on halpaa ja milloin kallista. Toisinaan se ei ole niin vaikeaa, annan hyvän esimerkin.

Grillattu porsaankylki

Mikä olisikaan mainiompi ruoka kuin siankylki? Niitä saa sateisena päivänä kauppojen kahtena viimeisenä aukiolotuntina jopa 60 % alennuksella! 🌧️

Sitten kun on lämmin kesäsää, niin on hyvä ottaa pakastimesta halvalla ostettu siankylki ja tarjota muille. Niiden hinta voi myös nousta luonnostaan kovan kysynnän vuoksi, joten säästöä tulee jopa yli 60 prosenttia.

Keinottelua pelolla

Äärimmäisessä tilanteessa sikoja ei edes ehditä teurastamaan tarpeeksi vastaamaan kysyntää. Kaupan ala itse myös luo keinotekoisia pulia. Näin kävi esimerkiksi keväällä, kun moni ihminen osti ylihinnalla bensaa huoltoasemien salaliiton seurauksena [2].

En tiedä mistä esimerkiksi ruoan hinta muodostuu, sen hinta on noussut valtavasti. Ruokamenoissa voi säästää valtavasti tekemällä itse kaikki ruuat mahdollisimman vähän jalostetuista lähtöaineista [3].

Big Mac buns -spoiler
Video. HOW McDonald’s Hamburger Buns ARE MADE 🍔
[collapse]

Zeitgeist – Money Mechanics

Finanssikriisin jälkeen opiskellessani ammattikorkeakoulussa katsoin Zeitgeistin elokuvan, jossa kerrottiin modernista talousjärjestelmästä. Olen tätä elokuvaa miettinyt useasti, mielestäni se on mielenkiintoinen ja jopa looginen.

Video. Zeitgeist – Money Mechanics Part 1.

Tämän mukaan valtioilla on niin paljon velkaa, että valtiot eivät todennäköisesti koskaan pysty maksamaan velkaa takaisin. Velkaa on niin paljon, että reaalitalous siihen nähden on liian pieni. Korkoa korolle- ilmiö. Asuntolainaa ostaessa rahat ovat omalla tilillä vain muutamia päiviä. Vasta kun velka on maksettu kokonaan pois, niin sitten vasta oikeasti omistaa oman asuntonsa.

Tilanne on finanssikriisin jälkeen muuttunut. Länsimaat ovat velkaisia, mutta Kiina omistaa länsimaiden varat. Muuten tilanne ei ole paljoa muuttunut, korot ovat lähellä nollaa eli historiallisen matalalla tasolla.

RERERENSSIT

[1] Martat: Säästövinkit
[2] Talouselämä: Bensapulasta uusi arvio: ”Huoli on kyllä suuri”
[3] Tuppu.fi: Big Mac Indeksi

Ketterä blogi