Aihearkisto: Tietotekniikka

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

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

Re-engineering

Toisinaan tulee tilanteita, jolloin täytyy muuttaa toimiva tuote takaisin suunnittelumalliksi. Ne ovat yleensä tilanteita, joita ei ole alunperin suunniteltu, vaan suunnitelijan täytyy uudelleen suunnitelma ohjelma.

Video. 39-Year-Old Pac-Man Bug
Puck Man -spoiler
Video. Pack Man
[collapse]

Decomplite

Toimiva ja kääntyvä ohjelma on mahdollista kääntää takaisin lähdekoodiksi. Sitä sanotaan nimellä decompliaatio eli käännökseksi takaisinpäin alkuperäiseen muotoonsa kohti korkeamman tason ohjelmointikieltä. [1]

Tietysti decomplilaatio aiheuttaa sen, että ohjelma ei voi sisältää kaikkea sitä, jonka alkuperäinen lähdekoodi on sisältänyt. Tyypillisesti ohjelma ensin optimoidaan ja poistetaan turha tieto, josta käännös tehdään. Niiden palauttaminen alkuperäiseksi on mahdotonta.

Esimerkiksi muuttujien nimet ja kommentit eivät tule alkuperäiseksi, vaan ne täytyy keksiä uudestaan. Tämä on ihmisen osa, tietokone muuttaa ohjelman vain loogisesti alkuperäiseksi lähdekoodiksi.

McDonald´s-spoiler
Video. McDonald´s strory
[collapse]

REFERENSSIT

[1] RedGate: .NET decompiler

Basictulkki

Toteutin työn alla olleen projektini eli BASIC-tulkin. Teetätin sille oman piirilevyn. Tämä on jatkoa aiemmille sulautettujen harrasteprojekteilleni [3].

Projekti

Jos haluat tehdä saman projektin kuin minä olen tehnyt, niin tätä varten voit tilata minun suunnittelmani piirilevyn. Piirilevy teetettäny sisältää useimmat tärkeimmät komponentit, mutta ei välttämättä kaikkia. Tarvitset myös mm. PS/2-näppäimistön ja VGA-näytön. [1]

Piirilevyn lisäksi tarvitse myös kaksi Arduino Nanoa, joista ensimmäiseen tulee laittaa Tiny Basic. Toiseen Arduinoon tarvitset ohjelmistopohjaisen VGA-näytönohjaimen. [2]

PS/2

PS/2 on vanheneva standardi, jolla on toteutettu näppäimistön ja hiiren rajapinta tietokoneelle. Standardilla on kuitenkin yhä paikkansa harrasteprojekteissa. On hyvä tietää, että nykyajan Plug ’n Play-näppäimistö ei toimi USB-PS/2 -muuntimella PS/2-standardin mukaisesti. [4]

PS/2 spoiler
So how does a PS/2 keyboard interface work?
[collapse]

BASIC

BASIC on ohjelmointikieli, joka on alkujaan kehitetty opetuskäyttöön. Syntaksissa on pyritty selkeyteen ja helppoon kirjoitettavuuteen.

BASIC poikkeaa esimerkiksi Pascalin syntaksista siltä osin, että BASIC ei käytä puolipisteitä eli ’;’-merkkiä. Itse Delphillä eli olio-ohjelmointia tukevassa Pascalissa ohjelmoidessa aluksi jouduin ihmettelemään tätä ominaisuutta. Kyseisellä merkillä, tai oikeammin sen pois jättämisellä saattoi olla iso vaikutus esimerkiksi ehtolauseiden suorittamiseen. Pascalin syntaksi mahdollisti ehtolauseiden hyppäämiseen yli, mikä ei ole mahdollista esimerkiksi C-kielellä. Kyseinen ominaisuuden välttämättömyyteen en itse huomannut.

BASIC saavutti yksinkertaisuutensa ansiosta vahvan aseman harrastajapiireissä mikrotietokoneiden alkuaikoina. BASIC-tulkista on lukuisia eri versioita, joita on kehittäneet mm. yliopistojen opiskelijat. Bill Gates sai nerokkaan bisnesidean tehdä bisnestä omalla versiollaan, millä idealla teki ainakin miljoonia ellei miljardeja – kirjaimellisesti. Ilman tätä hänestä ei olisi koskaan tullut maailman rikkainta ihmistä. [7]

Kuva. Gatesin kirje harrastajille.

Harrastepiireissä Gatesin edellä julkaisema viesti ei välttämättä saavuttanut sitä arvoa, jonka se myöhemmin ansaitsee. Gatesin isä on oikeusoppinut, joten tämän ansiosta hän hyvin oli selvillä immateriaalisista oikeuksista sekä niiden puutteista 1970-luvulla.

BASIC spoiler
Video. Retro Programming – Creating sprites on the C64
Video. Retro Programming on the Commodore 64 – Episode 1 – Getting Started
video. Commodore64 C64 SPRITE SCROLLER IN BORDER
[collapse]

MITS tai joku muu taho olisi voinut estää halutessaan Gatesin aikoinaan, mutta useimmat eivät osanneet ennustaa tähän aikaan ohjelmistoalan potentiaalia. Gates käytti armeijalle suunnattua huoneen kokoista IBM:n mainframea kaupallisiin tarkoituksiinsa.

kuva. All wrongs reserved. [8]

Vielä nykyäänkin on jakoa näkemyksissä sen suhteen, että tulisi ohjelmistojen olla kaupallisia vai vapaata ja avointa lähdekoodia. Kylmänsodan aikana Yhdysvalloissa oli varmasti monien vanhojen jäärien mielestä erittäin perusteltua, että kriittinen osa tietokoneen suorittavaa ydintä pysyy yhdellä taholla.

Windows XP sisälsi vuodesta 2001 eli julkaisustaan koko ylläpidon ajan takaportin, jonka kautta kenen tahansa tietokone oli mahdollista lukita verkon yli [10]. Yhdysvallat on sabotoinut ainakin Iraniin ydinaseohjelmaa haittaohjelmien avulla.

Muuta

Ohjelmistoalalla on iso etu ekosysteemistä. Tämä siis tarkoittaa kehittäjäyhteisöä, joka tekee yhteistyötä. Käyttöjärjestelmä on tämän kokonaisuuden kulmakivi, joka tarjoaa rajapinnat laitteistolle. Sillä on valtava vaikutus ohjelmistokehitykseen. Esimerkiksi Commadoressa BASIC-tulkki toimii eräänlaisena käyttöjärjestelmänä.

Video. C64 The Ocean Loader 🌊

Bill Gatesin merkittävin saavutus ei mielestäni ole ohjelmoinnissa itsessään. Enemmänkin kyse on hänen hyvästä kyvystään organisoida ja johtaa tavalla, joka tuo kaikille osapuolille hyötyä.

Kyse ei siis todellakaan ole siitä, että Microsoftin BASIC olisi ollut niin täydellinen. Enemmänkin kyse oli siitä, että tämä mahdollisti ohjelmistoalan kaupallisen kehittymisen yhdessä laitekehittäjien kanssa.

Assembler spoiler
Video. Commodore 64 Assembly Language Programming With Turbo Macro Pro
Video. 39-Year-Old Pac-Man Bug (Partly?) Fixed: Commodore 64
[collapse]

Uskoisin, että BASIC on vain ns. Debug-työkalu laitekehittäjille, jolla he voivat testata helposti esimerkiksi äänipiirin toimintaa. Jos sen saa toimimaan Mikkisoftan BASIC:llä, niin silloin sen voi todetat toimivaksi. Laitevalmistajia ei välttämättä itseään kiinnosta kehittää ohjelmistoja omille laitteilleen, vaan riittää kun heidän kehittämänsä piirilevyt ja mikropiirit toimivat. Tämä Debug-työkalu on lopulta jätetty tietokoneeseen mukaan, koska ei ole keksitty mitään muutakaan parempaa ohjelmaa tietokoneelle käytettäväksi. [7]

Video. The Epic Commodore C64 SID Collection – 11 hours of C64 Music

1980-luvun tietokoneet olivat saavuttaneet tason, jossa niillä voitiin tehdä musiikkia. Hyvin tunnettu on C64, jonka SID eli 6581-piirillä on tehty erityisen paljon musiikkia. Tämä piiri on eräänlainen kolme kanavainen syntetisaattori, jota voi ohjata ohjelmallisesti.

Musiikki. Grazie

Ohjelmistoalasta on tullut valtava bisnes, eikä loppu näy. Saattaa olla, että ohjelmistoala on vasta alkukuopissaan. Paljon on tapahtunut kehistystä lyhyessä ajassa. Toisaalta välttämättä pitkällä aikavälillä ei kuitenkaan ole tapahtunut mitään erityisen mullistavaa. Vieläkin ohjelmointi on hyvin samanlaista iffittelyä kuin vuosikymmeniä sitten.

Venäjän Sota
Video. Fennovoiman toimitusjohtaja saa puhelun Työ- ja elinkeinoministeriöstä. [11, 12, 13]
Kuva. Venäjän hyökkäys. [13]
Kuva. Huolto satojamiljoonien watin teholla säteilevien ydinsauvojen päällä, sekä vastaava reaktori Neuvostoliiton jälkeiseltä ajalta. [14]

B52-pommikoneet pääsevät lopulta alkuperäiseen tarkoitukseensa: kuljettamaan ydinkärjellä varustettu risteilyohjus pääkallopaikalle. Tämä tietysti vaatii sen, että Venäjä antaa tähän mahdollisuuden. Tämä on mitä mainoin tapa kohottaa kyseisen pommikoneen mainetta.

Video. Vietnam War – Part 1 [Real Footage]
Video. DOS Game: Ganja Farmer.
Video. Homeless Vietnam veteran in NYC uses his military training to survive homelessness.
Video. Boeing B-52 Re-engine: The Right Choice for the Air Force.
Video. Boeing B-52H – Showcase #154 – Mods & Addons for Microsoft Flight Simulator 2020 4K.
Video. The United States sent four strategic bombers carrying nuclear weapons to the Russian borders.

Command ’n Conquer Red Alert on mainio peli, jossa kuvastetaan vaihtoehtoista historiaa. Pelissä Einstein menee aikakoneellaan historiaan, jossa poistaa Hitlerin 1900-luvun alussa.

Mielenkiintoinen asia on, että pelissä neuvostoliitolla on käytössä Natsi-Saksassa kehityettyjä asetyypejä, kuten V2-raketti, Landkreuzer P. 1000 Ratte -tankki, 1500 tonnin monsteritankki, suihkuhävittäjä ja myös mm. sukellusveneet. [15]

Video. Red Alert Remastered – Allies Mission 14 (final mission) – No Remorse [Hard]
Video. Red Alert Remastered – Allies Mission 1 – In the Thick of It [Hard]
[collapse]

LÄHTEET

[1] OSHWLAB: VGA PS/2 Basic
[2] Instructables: Arduino Basic PC With VGA Output
[3] Tuppu.fi: ATX-virtalähteen käynnistäminen Arduinolla
[4] HackADay: Decoding PS/2 keyboard
[5] GitHub: VGAX
[6] GitHub: Tuppu
[7] Tuppu.fi: QWERTY
[8] Wiki: Tiny BASIC
[9] Tuppu.fi: Big Blue
[10] NinjaGambleyen: The NSA’s backdoor in Microsoft Windows
[11] Tuppu.fi: Työelämä paskaa, mutta elämän sisältö
[12] YLE: Osakkaat huolestuivat Fennovoiman ydinvoimahankkeesta
[13] Liveuamap: Venäjän hyökkäys
[14] Tuppu.fi: Ukrainan miehitys
[15] Gentleman’s Military Interest Club: Landkreuzer P.1000 ”Ratte” and P.1500 ”Monster”
[16] The Red Alert Units

Big Blue

IBM eli Big Blue on yksi tietotekniikan merkittävimmistä yrityksistä ellei kaikista merkittävin. IBM:n historia alkaa aivan tietotekniikan alusta, mutta IBM:n on yhä yksi suurimmista alan yrityksistä. IBM:n asema oli heikoimmillaan mikrotietokoneiden alkuaikoina, mutta muuten se on aina ollut merkittävä, onnistunut ja hyvämainen yritys.

COBOL

IBM on kehittänyt valtavasti erittäin merkittäviä tietotekniikan teknologioita, joista iso osa on pitänyt asemansa näihin päiviin asti. Yhtään ei voi väheksyä sellaisia asioita kuin SQL, joka on yhä kaikista merkittävin tietokantojen ohjelmointikieli.

IBM kehitti korkeantason ohjelmointikieli COBOL:in, jonka ideana oli olla mahdollisimman ihmisläheinen ohjelmointikieli. Se siis poikkeaa suunnitteluperustaltaan valtavasti sellaisesta ohjelmointikielestä kuin C-kieli, joka on mahdollisimman laiteläheinen ohjelmointikieli [4]. Näiden välissä on FORTRAN, jonka vaikutteita voi huomata COBOL:sta. COBOL itsessään on kehitetty FLOW-MATIC -ohjelmointikielen pohjalta, kun taas FORTAN pohjautuu Speedcoding-ohjelmointikieleen, joka on ensimmäinen korkean tason ohjelmointikieli.

Kuva. COBOL.

COBOL:in maine on ollut erittäin surkea viimeisten vuosikymmenien aikana. Oikeastaan vasta viimeisien vuosien aikaan COBOL on saavuttanut uutta kehitystä. Nykyään ymmärretään, että COBOL on yhä merkittävä ohjelmointikieli. [2]

Video. Introduction to COBOL programming language.

Mitä edellisestä videosta parhaiten jää esille. Mielestäni merkittävää on se, että COBOL yhä pyörittää maailman merkittävimpiä luottokorttijärjestelmiä. COBOL on erittäin luotettava ohjelmointikieli, jonka päällä järjestelmät toimivat vakaasti. IBM on aloittanut COBOL-ohjelmoinnin opettamisen uudelleen vuonna 2020 [1].

spoiler

Perinteinen kysymys on, että mikä ohjelmointikieli on paras. Ainakin seuraava video osoittaa, että kymmenen suosituimman ohjelmointikielen asema vaihtelee hyvin paljon ajan suhteen. Joskus Suomipelit.com -foorumilla kuulin, että joku oli työkseen ohjelmoinut kymmentä eri ohjelmointikieltä. Se oli vuosituhannen vaihteen vastaus, kun joku kysyin, että mitä ohjelmoinintikieltä kannattaa opetella ensimmäiseksi ohjelmointikieleksi. Ensimmäinen opeteltava ohjelmointikieli on vaikein, sen jälkeen niitä oppii helpommin.

Video. Suosituimmat ohjelmointikielet 1965-2019.

Itse näkisin, että ohjelmointikielen syntaksi itsessään on melko turha asia vertailla. Paljon enemmän merkitsee, että mitä kirjastoja ja muuta vastaava ohjelmointikielessä on. Käytännössä tarkoitan, että mitä asioita ohjelmointikieli tukee. Joskus voi olla hyvä, että ohjelmointikieli on matalan tason ohjelmointikieli, jossa on mahdollisimman vähän ylimääräistä. Kuten edellisestä videosta voi huomata, niin Internet on muuttanut hyvin paljon käytettyjen ohjelmointikielten asemaa.

[collapse]

Mainframe

IBM on uudistanut isoajokoneensa eli Mainframet uudella Z-sarjalla. Yhteen isoajokoneeseen sopii 2 miljoonaa konttia, joissa jokaisessa voidaan ajaa omaa mikroserviceä eli ohjelmaansa. [3]

Video. IBM Mainframe.

Seuraavassa videossa voi nähdä, että minkälaisia ovat olleet aiemmat Main Frame -tietokoneet. Nämä ovat huoneen kokoisia tietokoneita, jotka ovat aivan erilaisia kuin vuosituhanteen vaihteessa olleiden vuosien mikrotietokoneiden kultakaudella.

Video. IBM 1401 Mainframe runs ”Edith”
Minitietokone spoiler

Minitietokone on tietokone, joka on huomattavasti pienempi kuin huoneen kokoinen IBM:n Mainframe-tietokone. PDP-8 oli ensimmäinen tietokone, jota on kutsuttu minitietokoneeksi. Minitietokone on käytännössä jääkaapin kokoinen tietokone, kun taas ”täysikokoinen/normaali” tietokone on huoneen kokoinen. Nämä käsitteet ovat nykyään jo vanhentuneita, mutta vanhoista tietokoneista puhuttaessa ne ovat yhä valideja. PDP-8 on Digital Equipment Corporation -yrityksen valmistama tietokone.

”And if I transported you back to 1966 and showed you how to write and edit PDP-8 code by punching paper tape on a 10 character per second teletype, you might need 24 hours to recover from the disappointment. But then you would be able to write the code. The code just hasn’t changed that much.” [5]

[collapse]
Video. IBM 360 Mainframe

IBM on yhä vakuuttunut, että huoneen kokoiset tietokoneet ovat tulevaisuutta. IBM ei voi luottaa siihen että mikrototokoneet olisivat tulevaisuuden juttu.

Video. IBM Mainframe Games

Minulla on tällä hetkellä nykyisessä työpaikassani DL Softwarella työkaverina Jorma, joka on toiminut pitkään COBOL-ohjelmoijana. Me työskentelemme tällä hetkellä yhdessä Delphi-kehityksessä. Jorma sanoi, että COBOL on legacya ei Delphi (”Object Pascal”).

1930 Teletype using as Linux Terminal spoiler
Video. Using a 1930 Teletype as a Linux Terminal
[collapse]

REFERENSSIT

[1] IBM: COBOL cource
[2] Tuppu.fi: osaajapula COBOL-koodareista
[3] IBM: Z
[4] Tuppu.fi: C-kielen ihanuus
[5] Tuppu.fi: Rakkaudesta koodiin

QWERTY

Disclaimer spoiler

Artikkeli saattaa sisältää hieman kirjoitusvihreitä, mutta se kuuluu asiaan.

[collapse]

QWERTY-näppäimistö on asia, jonka varmasti useimmat ovat elämänsä aikana kohdanneet. Kyseessä on standardi, jonka jokainen opettelee jossain vaiheessa elämäänsä. Iso osa elämästä kuluu tämän standardin parissa, minä kirjoitan tällä hetkellä tämän standarin avulla blogiini artikkelia.

Sukupolvien takainen virhe

On hyvä mennä asioiden alkulähteille, jotta voi ymmärtää nykyistä tilannetta. QWERTY:n tapauksessa tämä on erittäin hyvä tapa miettiä, että miksi me kaikki elämme tämän standardin parissa.

Historia ulottuu vähintään seuraavan kuvan mukaiseen patenttiin, joka on vuodelta 1878. Kirjoituskoneen näppäimistössä ei ollut numeroita 1 ja 2, koska ne voitiin korvata näppäimillä I ja O. M-kirjain on nyttemmin alemmalla rivillä kuin patentissa olevassa näppäinasettelussa. Muuten näppäimistö on hyvin samanlainen kuin nykyisessä QWERTY-näppäimistössä. Näin kaikki välttämättömät merkit saatiin toimimaan koneistossa, jolloin QWERTY-kirjoituskone saatiin tuotantoon.

Kuva 1. QWERTY-näppäimistön patentti vuodelta 1878.

Näppäimistöä on ajan myötä kehitetty. On esimerkiksi Shift-näppäin, joka siirtää iskureiden ja näppäinten välisiä mekanismeja näppäimistössä. Se mahdollistaa isojen ja pienien kirjainten käyttämisen samalla näppäimistöllä. Paljon muutakin kehitystä on tullut, kuten esimerkiksi eri kielialueille sopivat näppäimet. Näppäimistössä voidaan nähdä tietynlaista tiedollista kerrostumaa, joka perityy laaja-alaisesti koko tietotekniikaan.

Huonoin mahdollinen standardi

QWERTY-näppäimistö on yksi huonoimmista mahdollisista näppäinasetteluista, joka oli mahdollista valita. Tämän takia tätä näppäinasettelua on tutkittu erittäin paljon. Tästä on tullut jopa kouluesimerkki standardista, joka on surkeaudestaan huolimatta tullut standardiksi. Jopa itse valmistaja yritti hävittää tämän asetelman paremmalla näppäinasettelulla, mutta ei itse siihen kyennyt [13].

Video. Kirjoitusmtari.

Ihmiset ovat oppinete käyttämään tätä standardia, joten he eivät mistään hinnasta suostu vaihtamaan parempaan standardiin. Kyse ei missään nimessä ole tekninen ongelma, näppäimet voidaan aivan hyvin asettaa toiseen järjestykseen. Tähän on ollut monesti erittäin hyvä mahdollisuus, esimekiksi kotitietokoneiden yhteydessä. Silti tämä äärimmäisen surkea standardi on opettu käyttöön.

Kaikki asiantuntijat ovat hyvin yksimielisiä siitä, että QWERTY on aivan surkea standardi. Silti kaikki haluavat käyttää tätä yhtä maailman huonointa standardia, jopa minä itse. Jollain toisella standardilla minä olisin selvinnyt valtavasti vähemmillä kirjoitusvirheillä. Etenkin kymmensormijärjestelmän oppiminen johtaa hirveään määrää kirjoitusvirheitä, tätä kirjoitustapaa ei ole keksitty silloin kuin QWERTY (lausutaan: ngggkhhver´thyy) tuli markkinoille.

Miksi näin?

Standardin taustalla on tilanne, jossa kukaan ei todennäköisesti ole tajunnut, että miten kauaskantoinen päätös on tehty. Ihmiset vain kuvittelevat, että mystisessä QWERTY:ssä voisi olla jotain hyvää. Näin ei vain ole, ABC-asettelu olisi paljon järkevämpi. Se olisi valtavasti helpompi oppia, sopisi erilaisille kielille yhtäläisesti. QWERTY tavallaan syjäytti vuosituhansia vanhan aakkosten järjestyksen. QWERTY voi jopa muomata ihmiskunnan evoluutiota, kun ihmisten täytyy sopetutua standardin säähnötihin [11].

Todennäköisimpänä syynä tälle näppäimistölle pidetään sitä, että luotettava kirjoituskone oli mahdollista toteuttaa sijoittamalla napit mahdollisimman epäloogiseen järjestyksessä. Näppäimet ladottiin siihen järjestykseen, että surkealaatuinen kone saatiin toimaan [12, 19]. Rinnakkain monen napin painamiseta johtuvasta koneiston jumittumisen takia näppäimistöstä piti tehdä mahdollisimman hidas kirjoittaa, etenkin tekniikan rajoitteisiin tottumattomalle. Suunnitteluperuste on siis täysin vastoin myöhemmän ajan tarvetta. Tämän seurauksena tämä standardi olisi tullut; se oli kaikessa surkeudessaan riittävän toimiva konsepti.

”… and THERE WERE NOTES IN ALL THE MARGINS. ON EVERY PAGE OF THE SPEC. HE HAD READ THE WHOLE GODDAMNED THING AND WRITTEN NOTES IN THE MARGINS.” -Joel [7, 12, 17, 18, 19, 20]

”Later I had it explained to me. “Bill doesn’t really want to review your spec, he just wants to make sure you’ve got it under control. His standard M.O. is to ask harder and harder questions until you admit that you don’t know, and then he can yell at you for being unprepared.” -Joel [12, 19]

Lotus avoided thousands functions: ”“Lotus had to fit in 640K. That’s not a lot of memory. If you ignore 1900, you can figure out if a given year is a leap year just by looking to see if the rightmost two bits are zero.”” [12, 19]

4K BASIC spoiler

”Is Basic going to have the same functions? Will they all work the same way?”” [12]

Kuva. 4K Basicin lähdekoodit, Gatesin Billi koodaillut
4k Basic
https://youtu.be/dEqWA_mmPCk
[collapse]
Kuva. Pieni askel ihmiselle, suuri askel ihmiskunnalle.

Myös epäillään, että teksti TYPEWRITE on helppo kirjoittaa osaamattoman kirjoittajan käsissä. Standardi on siis ollut markkinallisessa mielessä valtava menestys. Esimerkiksi Mikkisoftan entinen toimitusjohtaja ja perustaja Bill Gates kertoo tästä standardista kirjassaan Valtatie Tulevaisuuteen [14]. Samassa kirjassaan hän kertoo myös GIF-standadrdista, joka on varsin rajoittunut ja äärimmäisen heikkolaatuinen ja tehoton merkkijonojen toistuvuuteen perustuva videokuvan pakkausstandardi [2, 5].

GIF-pakattu video. [2]

5. Marraskuuta 1999 päätettiin, että kaikki GIF-tiedotot taltidoiaan hsitorlliseen arkistoon. Kuten edellinen video osoittaa, niin GIF on yhä meidän keskuudessamme. [2]

Ihmiskunnan tuska

Kaiken tämän jälkeen sukupolvi toisensa jälkeen on joutunut opettelemaan kirjoittamaan tällä hirveällä kirjoitusjärjestelmällä. Valtava määrä mielipahaa on seurannut siitä, että kaikkien täytyy kärsiä tämän standardin kanssa.

Tämä kaiken jäljeen ei voi kuin hämmästellä, että miten kaikki asiat ovat voineet mennä näin huonosti. Toivo ihmisyydestä on kadonnut. Maailma on sairas paikka elää. Toiset tekevät toinen toistaan huonompia teknisä stanradia ja järjestelmiä maan päälle jäävien ihmisten kiusaksi. Toinen toistaan surkeampia ihmistiä tuskailemaan näiden järkyttävän surkeiden standardien ja systeemien keskelle.

Postal Dude spoiler
Video. Postal Brain Damaged
Video. Postal 4

[15]

[collapse]

Läheskään aina ei oikea ja paras ole se asia, joka voittaa. Todella usein historia on todistanut, että asia on aivan päinvastoin. Maailmaa hallitsevat psykopaattiset jräjestelmät ja ihmiset. Miksi näin on, miksi ihmiset haluvat tällaista? Haluaako ihmiset näin otdistaa omaa paremmuuttaan, vai haluaako ihmiset vain leipää ja sirkushuveja? [10]

Yhtenvetspoiler

Toivottavasti surkea standardi teki tehtävänsä. Toivottavasti teksti oli ymmärrettävää. Jos ei ollut, niin toivottavasti vika ei ole tekninen. Jos oli, niin voi kokeilla lukea uudestaan hittamin ajatuseksella läpi. Elämä ei ole mikään lukikilailu, kuten Hitler luuli.

[collapse]

LÄHTEET

[1] Forbes: Why Was The QWERTY Keyboard Layout Invented?
[2] Popular Mechanics: THE GIF IS DEAD. LONG LIVE THE GIF.
[5] LZW and GIF explained
[6] GeekNack: Bill Gates — Leadership Style & Principles
[7] CQ: Young Bill Gates Was an Angry Office Bully
[10] Tuppu.fi: Panem et Circenses
[11] Genetic Cars HTML5
[12] Joel on Software: My First BillG Review
[13] Geeks for geeks: QWERTY – Best or Worst Keyboard Layout
[14] Tuppu.fi: Hengilöesitettelyssä Bill Gates
[15] Africa Guide
[16] Wiki: Format War
[17] Wiki: Epoch
[18] Wiki: List of non-standard dates
[19] Wiki: Bug Compatibility
[20] Bill & Melinda Gates Foundation

Backup II

Olin jo täysin varma, että minun OVH-palvelimeni on mennyt lopullisesti. Yllättäen sain seuraavan viestin OVH:n kautta. He ovat sittenkin saaneet palautettua minun virtuaalisen palvelimeni. Tämä oli varsin iloinen uutinen, aiemman palvelimen menettäminen pysyvästi olisi ollut ikävä asia. [1]

Kuva 1. Palvelemeni on sittenkin saatu palautettua.

En tiedä, että mistä he ovat varmuuskopion kaivaneet. Hieno juttu, että heillä on ollut kuitenkin mahdollisuus palauttaa sivuni täydellisesti palaneesta palvelimesta. Varmuuskopiointi ei kuulunut palveluun oletuksena, joten sinällään tämä oli tietynlainen ekstrapalvelu. Veloitus on lopetettu kaikkien palvelinkeskuksessa olevien palveluiden osalta.

PORTFOLIO

Itse olin erityisen surullinen siitä, että oma portfolioni olisi kadonnut ikuisiksi ajoiksi. Vaikka siinä ei sinällään mitään hirveän merkittävää ole, niin itselleni se on tärkeä sivusto. Siellä on minun tekemiäni pelejä jne. [2]

Oli hirveää oivaltaa, että minulla ei ollut yhtäkään varmuuskopiota portfoliostani. Kopioita on ollut, mutta ajan saatossa ne ovat menneet menojaan. Olen formatoinut kiintolevyjä, vaihtanut USB-tikkuja ja vaihtanut tietokoneita.

Olen kuvitellut, että pilvipalvelut olisivat varma tapa varmuuskopioida tietoja. Tämä luulo ei kuitenkaan pidä paikkaansa, vaan myös pilvipalveluista voi tieto kadota. Ei ole mikään itsestään selvyys, että pilvipalveluihin laitettu tieto säilyisi ikuisesti tallessa.

Tilasin ulkomailta kiintolevyjen lukemiseen sopivan laitteen [4]. Muistelin, että olen epäonnistuneesti yrittänyt yhdistää kaksi levyosiota, jolla kadonneita tietoja voisi olla. Tietyillä työkaluilla voi hakea tiedostoja, vaikka levyjärjestelmä on rikki tai kiintolevy on formatoitu [3].

Yritin myös palauttaa sivustoa WebArchiven kautta, kuten erittäin hyvä kaverini Masi Kajander suosittelisi [5]. Itse yritin myös Googlen kautta, mutta Googlen välimuistista sivut ehtivät katoamaan.

LÄHTEET

[1] Tuppu.fi: backup
[2] Tuomasliikala.fi: Portfolio
[3] CleverFiles: 3 steps to Recover Hard Disk
[4] eBay: SATA/IDE Drive to USB 2.0 Adapter Cable
[5] WebArchive: Portfolio | Tuomas Liikala

ATX-virtalähteen käynnistäminen Arduinolla

Olen innostunut harrastamaan elektroniikkaa ja sulautettujen ohjelmointia Hacklabissa. Koen sen hyvänä lisänä omalle osaamiselleni, joka on ohjelmoinnin puolesta jo hyvällä mallilla. On oman koulutuksen takia hyvä kuitenkin tuntea tietokoneen toiminta rautatasolla, lähtien virtalähteen toiminnasta.

Arduinon erityinen vahvuus on matala hinta (kopiot alkaen 3€), jolloin se on järkevä valinta korvaamaan muuten hyvin monimutkaisia analogisia ohjausjärjestelmiä. Arduinossa on 32 kB flash-muistia ohjelmalle ja 4 kB RAM muistia muuttujille, arvojen vastaen Voyager luotaimen ohjainta. Arduinon 16 MHz nopeus on samaa luokkaa kuin 1990-luvun alun PC-tietokoneissa. 32 bitin väyläleveys ja käskykanta on jopa parempi kuin vastaavan nopeuksissa pöytätietokoneissa.

Jones spoiler

Itselleni elektroniikasta tulee mieleen Jones in the Fast Lane -peli. Kyseisessä pelissä voi opiskella korkeateknillisessä yliopistossa mm. elektroniikkaa. Pelin on julkaissut Sierra vuonna 1990. [2]

Kuva Jones in the Fast Lane. [2]

Itse olen joitain opettavaisia pelejä pelaillut [4]. Mielestäni Jones (suom. Kukko Pärssinen [10]) on niistä yksi parhaimpia. Peli antaa lapsille erittäin hyvän käsityksen työelämän tarpeista osana muuta elämää. Nämä ovat asioita, joita ei välttämättä opi edes peruskoulussa.

Video. Jones in the Fast Lane.

”Kukko opiskelee tietysti SÄHKÖLLÄ koska kukon mukaan siellä liikutaan RAUDAN ALAPUOLELLA!!!!” [10]

Itse olen hieman elektroniikkaa harrastanut, olen tehnyt Kemon sarjoja. Se on saksalaisen yhtiön tekemä opettavainen elektroniikkasarja lapsille nuorille 1980-luvulla. Se ei ole vieläkään menettänyt merkitystään. Aivan hiljattain tinasin loppuun oman lämpötermostaattisarjan. Iloa riitti, kun sitä pääsi testaamaan, omat aiemmat tinaukset toimivat osana uusia tinauksiani yli kymmenen vuoden jälkeen. [5]

[collapse]

ATX Virtalähde

Nykyaikaisissa tietokoneissa on ATX (Advanced Technology Extended) -virtalähde, joka on jatkoa aiemmalle AT (Advanced Technology) virtalähteelle vuoden 1995 lopussa. Tässä artikkelissa keskityn ATX-virtalähteeseen.

ATX on nykyaikaisten käyttöjärjestelmien tarpeita paremmin palveleva standardi, sallien mm. tietokoneen sammuttamisen ohjelmallisesti [3]. Windows osaa sammuttaa tietokoneen ATX-virtalähteellä, mutta AT-virtalähteen yhteydessä tietokoneissa käyttäjän piti itse sammuttaa tietokone.

AT spoiler

Vanhoissa Windows 95 tietokoneissa tuli ohjelmallisen sammuttamisen jälkeen käyttäjälle ilmoitus, että on turvallista sammuttaa tietokone fyysisesti. Käytännössä se tarkoittaa virtanapin painamista. Tämä ei ollut käyttöjärjestelmän vika, vaan sen ajan virtalähteet eivät tukeneet tietokoneen ohjelmallista sammuttamista.

https://www.youtube.com/watch?v=WgLfQUkuDHw
Video. All Microsoft Windows ”It is now safe to turn off the computer” screens (AWBS Sequel)
[collapse]

Tietokoneen virtalähteen on erittäin hyvä virtalähde myös muun elektroniikan tarpeisiin. Se antaa useita satoja wattia tehoa, joka riittävästi useimpiin elektroniikkaharrastuksen laitteisiin. Johtimia on paljon, joten yleisesti pienessä elektroniikassa tarvittavia 12, 3.3 ja 5 voltin johtimia riittää. Jännite on myös erittäin tasalaatuista.

ATX pinnit

ATX virtalähteen emolevylle tulevassa kaapelissa on 24 pinniä. Näistä erityisen kiinnostavia ovat vihreä ja purppura johdin. Niiden avulla on mahdollista käynnistää virtalähde käyttäen Arduinoa. Myös mustaa johdinta tarvitaan ohjelmointikortin maadoitukseen.

Kun vihreän ja mustan johdon yhdistää, niin silloin virtalähde on käynnissä. Käytännössä se siis tarkoittaa sitä, että PS-On johdin on kytkettynä maahan. Tätä varten saa hieman virtaa viiden voltin Standby-johtimesta eli purppurasta johtimesta. Purppura johdin toimii tietokonevalmistaja Dellin vastauksen mukaan mm. valmiustilan LED-vilkun virranlähteenä. [1]

Kuva ATX 2.0 specifikaatio. [1]

Kun virtalähde antaa purppurasta +5 volttia, niin silloin Dellin vastauksen mukaan ”klassisen” specifikaation perusteella pitäisi kaikkien johtimien jännitteiden olla kunnossa. Jos purppuran johtimen jännite on enemmän tai vähemmän, niin silloin emolevyn tai käyttöjärjestelmän vastuulla on reagoida tilanteeseen. Aluksi emolevy odottaa, että jännite nousee viiteen volttiin käynnistyksessä. [1]

Virtalähteen käynnistäminen johtimilla

Aivan samoin kuin autoja sai käyntiin suoraa johtimista aikoinaan, niin onneksi sama on mahdollista vielä nykyajan ATX-virtalähteiden yhteydessä. Se tapahtuu yksinkertaisimmillaan kytkemällä vihreä johdin mustaan johtimeen, kuten seuraavassa kuvassa on havainnollistettuna. [6]

Kuva. Virtalähde käynnitettynä johtimella. [6]

Tätä käynnistystapaa edistyneempi kytkentä on laittaa vipukytkin, jolla virtalähteen saa päälle ja pois. Tällöin johdinta ei tarvitse irrottaa fyysisesti irti kaapelista, jolloin virtalähteen käyttäminen on helpompaa. [6]

Käynnistäminen sähköpiirillä

Jos erityistä kiinnostusta on, niin silloin voi rakentaa oman piirilevy, jolla voi elektronisesti ohjata virtalähteen käynnistymistä. Tällaisesta kytkennästä on seuraavassa kuvassa esimerkki.

Kuva. On/Off-kytkintäpiirin piirikaavio. [7]

Innokas elektroniikan harrastaja voi kokeilla tätä piirilevy kytkentää esimerkiksi seuraavanlaisella  bread boardilla. Minusta on erittäin arvostettavaa ja hienoa, että näin hyvä kytkentä on saatu tehtyä. Olen itsekin miettinyt vastaavan rakentamista.

Video. ON/OFF kytkentä. [7]

Tämä kuitenkin vaatii paljon komponentteja, joiden tilaaminen vie oman aikansa. En myöskään itse täysin vakuuttunut tämän kytkennän täydellisyyteen, vaikka hienosti näyttää toimivan. Digitaalisella ohjauksella saavutetaan etuja, joita ei voida helposti luoda elektronisilla kytkennöillä.

Kytkennät Arduinoon

Seuraavassa kuvassa on hyvin esimerkillinen kytkennät, jolla tavalla on suositeltavaa kytkeä ATX-virtalähde kiinni Arduinon ohjelmointikorttiin. Kyseisessä kytkennässä on käytettynä Transistoria, jota ohjataan digitaalisella 12. Kun pinniin 12 tulee +5V:n jännite tilassa 1, niin silloin ATX Ground ja ATX Power On yhdistyvät. Ylimääräistä virrankulutusta rajoitetaan 1k ohmin vastuksilla. [8]

Kuva. ATX virtalähde kykettynä Arduinoon. [8]

Itse teen kytkennän ilman ylimääräisiä transistoreita. Tällöin laitan ATX Power On -johtimen suoraan digitaaliseen ulostuloon. Laitan ohjelmallisesti pinnin tilaan 0 eli maahan, jolloin se vastaa 0 voltin jännitettä. Näin kytkentöjen tekemisestä tulee hieman yksinkertaisempia.

Virrat Arduinolle tulevat virtalähteen lepovirran kautta. Lisäksi tätä varten tulee olla painonappi ja merkkiLED. Siihen tarkoitukseen sopivat erinomaisesti tietokoneen kotelon omat käynnistysnappi ja merkkiLEDit. Aluksi testailuissa itse käytän tyypillisiä elektroniikassa käytettyjä piirilevyyn laitettavia LEDejä ja kytkintä.

Seuraavan kuvan mukainen kytkentä on suositeltu tapa tehdä painonapin kytkentä piirilevyllä. Kuvassa on kytketty toinen puoli kytkimestä jännitteensyöttöön ja toinen maahan. Maadoituksen puolella kytkennässä on 10k ohmin vastus. Sen tulee olla näin suuri, koska sen tarkoitus on estää johdinta toimimasta antennina. 16 MHz taajuudella johtimissa esiintyy häiriöitä, jos johdin jää ”roikkumaan ilmaan”.

Kuva. Painonapin kytkeminen Arduinoon. [8]

Pull-Down -vastuksen laittaminen ei kuitenkaan ole välttämätöntä, koska Arduinossa on sisäänrakennetut vastukset tätä tarkoitusta varten. Se tarkoittaa sitä, että riittää kun vain asettaa ohjelmallisesti halutun pinnin sisääntuloksi ja tilaan 1.

Näiden lisäksi LEDillä tulee käyttää etuvastusta. 220 ohmia on hyvä vastus antamaan sopivasti virtaa LEDille 5 voltin ulostulosta. LEDin oma vastus on erittäin matala, joten ilman vastusta se ylikuumenee hetkessä. LED on diodi, joten se johtaa virtaa vain toiseen suuntaan. Täten LED tulee muistaa laittaa oikein päin. Vaihtoehtoisesti voi laittaa kytkentään kaksi LEDiä rinnakkain, jolloin jompi kumpi LED on päällä riippuen virran suunnasta.

LÄHTEET

[1] Dell: ATX Dell PSU to Offical ATX 2.0 spec pinout
[2] Tuppu.fi: Työelämä
[3] Geeks for geeks: Difference between AT and ATX Power supply
[4] Tuppu.fi: Opettavaiset tietokonepelit
[5] Bebek: rakennussarjat
[6] OverClockersClub: How To Turn On An ATX Power Supply Without A Motherboard
[7] CircuitDigest: Soft Latch Switch Circuit
[8] Arduino Forum: ATX power supply
[9] Github: Arduino Buttons
[10] Kukko Pärssinen

Kotipalvelin – iteraatio 2

JOHDANTO

En sittenkään ole vielä lopettanut oman palvelimeni kehittämistä.

TYÖNKUVAUS

Jatkan tämän verkkojärjestelmäni kehittämistä, vaikka en ole investoinut mihinkään kalliiseen reitittimeen. Nyt toimii onneksi jo sillatun modeemin kautta sekä oma verkkoliikenne että palvelimen liikenne. En ole mikään verkkoguru, niin ollut hieman ylimääräistä ongelmaa ymmärtää, että mistä postista minnekin ne paketit liikkuvat. Olen jo esinuorena oppinut koodaamaan niin, että yksinkertaisesti yrityksen ja erehdyksen kautta brute forcella paukuttelin C-kääntäjään erilaisia yhdistelmiä. Se on minun tapani oppia; selvittää ja poissulkea ei-toimivat tavat tehdä jotain.

Lopusta tarkoitin Photoshop 3. eli ensimmäinen versio, jossa on layerit eli eriytetyt kerroksittaiset piirtopinnat yhden bitmapin sijaan.

TULOKSET

Kun en tiennyt asioista vielä, niin suhtauduin kriittisesti tähän kaapelimodeemiin, joka nyt nolottaa itsetunnon takia. Mutta nyt kun tietää signaalin tulevan samaa johdinta kuin television signaali, sekä miten kauniissa synkronissa valot vilkuttaa pöydällä, niin nyt sitä osaa arvostaa erittäin paljon. Livenä tuike on paljon näyttävämpää kuin videolla, jossa on luultavasti joitain optimointeja vähentämään kuvassa esiintyvää vilkuntaa. Ilmeisesti ledipiiri on jostain joulutuikusta, koska vilkkuminen on ihan samanlaista jopa tietokone ollessa sammuksissa, kunhan vain tietokoneen virtajohto on kiinni.

Jostain syystä isäntäkoneella pitää olla Apache aktiivisena käynnistäessä, jotta virtuaalikoneiden DHCP-toimii oikein. Toisaalta Apache pitää sammuttaa ennen kuin liikenne toimii virtuaalikoneille. Ilmeisesti myös kaapelimodeemi virtakytkimen kliksuttelu on oleellinen osa tätä rituaalia.

musiikkispoileri
[collapse]

Virtuaalipalvelimille määrää voisi kasvattaa todella helposti, kun on valmiit imaget, joista voisi vain ottaa niitä käyttöön. Siinä kymmenen neitseellisen virtuaalikoneen jälkeen tämä 6 watin lämpötehoinen halpa kahdella ytimellä varustetun prosessorin resurssit ovat hyvin käytössä.

Olen hieman miettinyt, että miten tämä kaikki liikenne menee tässä omassa palvelinkeskuksessani. Tuntuu hieman siltä, että tämä kaapelimodeeemin kaapelista tuleva signaali tulee varsin dumppina siltauksena ulos tästä pöntöstä. Osoite on kuitenkin varsin staattinen, ehkä palvelin pyytää uutta osoitetta vasta edellisen muuttuessa ei-toimivaksi.

Kuvan 1. mukaisesti taas yrittää porukka kräkkeröidä palvelintani Kiinan kautta. Osoite on jo monta kertaa merkitty tunnetuksi kräkkeriksi [1]. Toivottavasti käyttämäni öökkeset-salasanassa edes hieman suojaa. root-käyttäjää Otin myös uutena asiana Debianin UFW-palomuurin käyttöön, joka blokkasi tosi hyvin suurimman osan porttien koputtelijoista.

Kuva 1. Hieman palomuuriin conffausta, ettei palvelin kaadu levytilan loppuessa kesken.

Vähemmän näitä verkkojuttuja on tullut tehtyä, niin voisi olla mielenkiintoista kokeilla, että voisiko sitä IP-osoittetta asettaa staattisesti haluamakseen. Ehkä tämä Arris vain muuntaa kaapelin signaalin signaalin taajuuksien kaista-alueet suoraan IP-osoitteeksi, en tiedä. Ihan sama.


Onko tämä kaapeli sitten jotenkin huoneistokohtainen, vai spämmiikö tämä nyt sitten sillatussa tilassa näitä paketteja kummallekin fyysiselle verkkoadapterille. Pitäisi ehkä hieman kokeilla staattiseksi puukotetuilla IP-soitteilla, että mitä tuo Arris oikein lähettää ja minne. Ihan kiva tietysti myös, jos voi aina vaihtaa staattisesti oman IP.-osoitteen toiseksi osoiteavaruudesta, luo tietoturvaa itselleni verkko selatessa. Hyvä lisä salatun VPN:n ja Tor-selaimen lisäksi, että jopa lähtöosoitteen liikenteelle voi vaihtaa itse manuaalisesti.

Kuva 2. pientä domainien konffailua palvelimelleni.


Voisi olla hyvä minun jatkossa hieman sivistää itseäni, ehkäpä suurin heikkous itselläni on tämä verkkoliikenne. C-kielellä ohjelmakoodin pyörittely sujuu ja muuta vastaavaa. Samoin Front-End -ohjelmoinnisssa olen jo oppinut hieman kaikenlaista, ettei ainakaan selaimeen voi luottaa yhtäään, että mitä se sattuu lä’hettämään palvelimelle. PHP-kieltä nyt osaa kaikki, itse jopa aika hyvä siinä mm. tietoturvan ymmärryksen osalta.


Hyvä kaverini Def on jo saanut tehtyä itse oman DNS-palvelimen, joka lähettää halutunlaisia asioita. Ilmeisesti C-kielellä koodattu vastaamaan normaalia DNS-palvelinta. Hän myös löydysi Linuxin HTTPS-sertifikaatin tarkistuksesta puutteita. Välivaiheet tallennettiin 8 tavun charreina välivaiheissa prosessorin rekisteriin. josta niiden lukeminen oli mahdollista ja salaus pystyttiin purkamaan konekielellä. Korjaus hyväksyttiin hiljattain Linuxiin otettavaksi käyttöön.

FURTHERIA

Minulla on jo pidemmän aikaa ollut tavoitteena päästä muuttamaan ulkomaille töihin. Tämän johdosta olen visioinut uuden sivuston taikka blogin kirjoittamista englanniksi, jolloin kehittyisin siinä valtavasti. Aivan samoin kuin on tämä kotipalvelimen toteutus, niin samoin englannin kieli ei ole minun kaikista vahvin osaamisalueeni, vaan kirjoitettu englanti vaatii harjoitusta. [1]

En odota mitään parempaa elämää ulkomailta, mutta ehkä hieman erilaista ja vaihtelua. Kaikilta puolin en ole ollut tai ole tyytyväinen siihen kohtaloon, joka Suomella on minulle tarjota. En myöskään ihan usko, että kaikki kykyni tulisi ihan täysin 100% käyttöasteella yhteiskunnan hyödyksi. Prioriteetissa kyse ei siis edes ole yksinomaan tai ensisijaisesti rahasta tai materiaalisesta elintasosta, vaikka silläkin on aina oma merkittävä painoarvonsa. [1]

Olen myös harkinnut Suomea ja tämän maan päätöksiä kritisoivaa sivustoa. En kuitenkaan tällä hetkellä halua sellaista kirjoittaa, kun asun tässä maassa. Ei Suomi ole aivan Kiina, mutta kuitenkin ns. sivistysmaista ehkä kaikista lähinnä sitä. Enempää en ota nyt kantaa tämän maan päätöksentekoon. [1]

REFERENSSIT

[1] AbuseIPDB: 193.201.224.218
[2] Wikionary: -leptic
[3] Pastebin: Visionaring
[4] Pastebin: Pohdinta
[5] MyMainIP