Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - teele

Sivuja: [1] 2 3 ... 43
1
 curlilla

Koodia: [Valitse]
curl -D - --user käyttäjänimi:salasana https://www.dy.fi/nic/update?hostname=omasivu1.dy.fi,omasivu2.dy.fi

ja käyttäjänimeksi sähköposti ja salasanaan oma salasana.

Kiitoksia taas neuvoista   :)

2

Eipäs vielä näytäkään ratkeavan. Kokeilin pilvikoneen päätteessä

Koodia: [Valitse]
curl -D - --user käyttäjänimi:salasana https://www.dy.fi/nic/update?hostname=omasivu1.dy.fi,omasivu2.dy.fi

jossa ajatuksena oli päivittää kahden sivuston osoitetiedot dy.fi -palveluun.

Vastauksena tuli

Koodia: [Valitse]
HTTP/1.1 401 Unauthorized
Server: nginx/1.10.3 (Ubuntu)
Date: Sun, 13 Oct 2024 10:19:59 GMT
Content-Type: text/plain;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=10
Last-Modified: Sun, 13 Oct 2024 10:19:59 GMT
Cache-Control: no-cache
Pragma: no-cache
WWW-Authenticate: Basic realm="dy.fi update"

badauth

eli luultavasti salasana tai käyttäjätunnus ovat väärin. Yritin selvittää, mikä voisi olla käyttäjätunnukseni parin vuoden takaisista paperilapuista, mutta eei ehkä onnistunut sittenkään, salasana näytti ainakin olleen selvästi merkittynä.

Pääsen kyllä kirjautumaan käyttäjänä dy.fi -palveluun. Kirjautuduttaessa kysytään sp-osoite ja salasana. Salasana lienee siis oikein, vaikka sp-osoite ei enää olekaan käytössä.

Kirjauduttuani näin, että varaamani sivuilla oli voimassaoloaikaa 6 päivää ja 22 tuntia ja minuutteja päälle, vaikka en ollut ymmärtääkseni päivittänyt niitä ainakaan pariin päivään. Päivittäisikö dy.fi sivut sittenkin jostain syystä ihen itse?

Toisaalta olisiko hetznerin pilvipalvelin käynnistynyt hetznerin omien syiden takia uudestaan, jolloin myös pilvikoneeni olisi käynnistynyt uudestaan?

Pitäisikö curlissa laittaa käyttäjänimeksi sittenkin se sähköpostiosoite, jota käytetään kirjautumissa? (kokeilin tässä jo pari kertaa eri vaihtoehtoja, enkä viitsisi ihan heti yrittää osoitepäivitystä uudelleen, koska dy.fi -sivulla olevasta tekstistä päätellen näyttää siltä, että siellä ei tykätä liian usein tehtävistä päivityksistä, vaikka omat päivitykseni ovat ilmeisesti jääneet vain yrityksiksi)


3

anacron on myös hyvä vihje. Olen nähnyt siitä ohjeita jossain, oikeastaan on monia asioita, joista on jotain hämärää mielikuvaa, mutta niiden harjoittelu puuttuu.

Alkuperäinen ongelma oli, että tiesin vain suunnilleen, miten pilvikoneella olevien osotteiden päivitys dy.fi -palvelussa menee, mutta ohjelmakoodin osalta asia oli täysin mysteeri. wget ja curl tuovat lisävalaistusta asiaan ja sitten, kun opin anacronin, asia hoitunee sillä ja curlilla tai wgetillä tai ehkä sopivalla c++ -ohjelmalla.

Ideana on tosiaan vähän opiskella asioita, niin kuin kirjoitit   :)

4
 juu, kokeilin tällaista

Koodia: [Valitse]
write an equivalent program in pure c++ that performs wget -q -O - --http-user=tunnus --http-passwd=salasana https://www.dy.fi/nic/update?hostname=omakone.dy.fi  and shows socket interactions expicitely


tekoäly vastasi näin

Koodia: [Valitse]
Creating a C++ program that mimics the behavior of wget with explicit socket interactions involves using low-level socket programming. Below is a simple example that demonstrates how to perform an HTTP GET request with basic authentication. This example uses the standard C++ libraries along with POSIX socket functions.

Please note that this code is for educational purposes and may require additional error handling and features for production use.

`cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include

std::string base64_encode(const std::string &in) {
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

std::string out;
int val = 0, valb = -6;
for (unsigned char c : in) {
val = (val << 8) + c;
valb += 8;
while (valb >= 0) {
out.push_back(base64_chars[(val >> valb) & 0x3F]);
valb -= 6;
}
}
while (valb >= 0) {
out.push_back(base64_chars[(val >> valb) & 0x3F]);
valb -= 6;
}
while (out.size() % 4) out.push_back('=');
return out;
}

void http_get(const std::string &hostname, const std::string &path, const std::string &user, const std::string &pass) {
int sockfd;
struct sockaddr_in server_addr;
struct hostent *host;

// Create socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
throw std::runtime_error("Socket creation failed");
}

// Get host information
if ((host = gethostbyname(hostname.c_str())) == nullptr) {
close(sockfd);
throw std::runtime_error("Host not found");
}

// Set up the server address structure
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80); // HTTP port
std::memcpy(&server_addr.sin_addr.s_addr, host->h_addr, host->h_length);

// Connect to the server
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
close(sockfd);
throw std::runtime_error("Connection failed");
}

// Prepare the HTTP GET request
std::ostringstream request;
std::string auth = user + ":" + pass;
std::string encoded_auth = base64_encode(auth);

request << "GET " << path << " HTTP/1.1\r\n"
<< "Host: " << hostname << "\r\n"
<< "Authorization: Basic " << encoded_auth << "\r\n"
<< "Connection: close\r\n"
<< "\r\n";

// Send the request
std::string req_str = request.str();
send(sockfd, req_str.c_str(), req_str.size(), 0);

// Receive the response
char buffer[4096];
while (true) {
ssize_t bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
if (bytes_received <= 0) break; // Connection closed or error
buffer[bytes_received] = '\0'; // Null-terminate the buffer
std::cout << buffer; // Print the response
}

// Close the socket
close(sockfd);
}

int main() {
try {
std::string hostname = "www.dy.fi";
std::string path =


eli taitaa kyllästyä vastauksen pituuteen ihan loppumatkalla. Mutta nyt tuli kuitenkin esille http-request ihan uutena, mielenkiintoisena asiana. Pitänee varmaan tutustua siihen, niin pääsee vähän enenmmän kärryille nettiviesteistä ja niitten kirjoittamisesta ja lähettämisesta ja vastaan ottamisesta.

Tekoaly oli hyvä vihje, se oli jo melkein unohtunut, kun kesällä sitä kokeillessa se kirjoitti aika levotonta koodia.   Kiitos  :)

5


Näin meni netin tekoälyllä:

Koodia: [Valitse]

write an equivalent program in pure c++ that performs curl -D - --user tunnus:salasana https://www.dy.fi/nic/update?hostname=omakone.dy.fi

Certainly! To perform an HTTP request in C++ similar to the curl command you provided, you can use the libcurl library, which is a popular choice for handling URL requests. Below is an example of how you can write a C++ program that performs the same action as your curl command.

First, make sure you have libcurl installed on your system. You can usually install it via your package manager. For example, on Ubuntu, you can use:

bash
sudo apt-get install libcurl4-openssl-dev


Here’s a simple C++ program that performs the equivalent operation:

cpp
#include
#include

int main() {
// Initialize CURL
CURL *curl;
CURLcode res;

// Replace with your actual username and password
const char* username = "tunnus";
const char* password = "salasana";
const char* url = "https://www.dy.fi/nic/update?hostname=omakone.dy.fi";

curl = curl_easy_init();
if(curl) {
// Set the URL
curl_easy_setopt(curl, CURLOPT_URL, url);

// Set the username and password for authentication
curl_easy_setopt(curl, CURLOPT_USERPWD, std::string(username) + ":" + std::string(password).c_str());

// Enable verbose output
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

// Perform the request
res = curl_easy_perform(curl);

// Check for errors
if(res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}

// Clean up
curl_easy_cleanup(curl);
} else {
std::cerr << "Failed to initialize CURL" << std::endl;
}

return 0;
}


includet pitää katsoa tarkemmin, mutta en ole vielä kokeillut käännöstä.

Mutta tekoäly näyttää hieman pinnanneen. Sehän ei kirjoittanut ohjelmaa pelkällä c++:lla, vaan käytti curlia, niin socket-oppeja tekoälyn koodista ei saa.

Jos haluaa dy.fi-palvelussa päivittää kahden sivun osoitteen, se menee ehkä näin

Koodia: [Valitse]
curl -D - --user tunnus:salasana https://www.dy.fi/nic/update?hostname=omasivu1.dy.fi,omasivu2.dy.fi

Toivottavasti, en ole ehtinyt tarkistaa, mutta muistelisin, että jossain dy.fi-ohjeissa oli, että jos haluaa useamman osoitteen päivitystä, eli osoitteet voisi laittaa pilkuilla erotettuina peräkkäin

Homma etenee, kiitos neuvoista. :)




6
En ole mistään löytänyt tavis-tasoisia dy.fi -sivuston käyttöohjeita.

Esimerkiksi oman sivun nettiosoitteen päivittäminen pitänee tehdä kahden viikon tai viikon välein dy.fi :lle, jotta sivun osoite pysyy aktiivisena palvelussa. Nyt päivitys menee ilmeisesti perl-skriptin kautta, joka ajetaan palvelimen uudelleenkäynnistyksen yhteydessä.

Oman palvelimeni päivitysjärjestely on tehty ihan palvelinkokeilujen alussa ystävällisen asiantuntijan osaamisella, mutta en valitettavasti pysynyt hyvin nopeasti edenneiden työvaiheiden mukana. Nyt kun palvelin on jo jonkun aikaa ollut toiminnass, voisi olla järkevää opetella itsekin, miten se ja sen dy.fi-päivitys toimivat.

Tällä keskustelualustalla nm on jo ehkä vuosi - kaksi sitten kertonut, että dy.fi-päivityksen voisi tehdä jopa selaimen avulla, mutta silloin en päässyt asiassa eteen päin. Vaarana on, että pelkät kokeiluni ilman osaamista voisivat johtaa oman nettisivun katoamiseen kokonaan dy.fi-palvelusta.

Miten pitäisi toimia, että voisi lähettää oman nettisivun osoitteen ja sen päivityksen dy.fi-palveluun esimerkiksi c++:lla tai selaimella, ja miten varmistan, että lähetys on todella onnistunut?

hmm, olisiko tämä sittenkin Ohjelmointi ja palvelimet alueen aihe?

7

Tarkoitus olisi lukea socketista pieni, alle 1024 merkijono ja kokeilen tällaista lukuohjelman pätkää

Koodia: [Valitse]

  int my_read()
  {
    if((new_sock = accept(listening_sock, (struct sockaddr *)&address, (socklen_t*)&address_length)) < 0)
      {
        perror("Accept");
        exit(EXIT_FAILURE);
      }
    n_of_read_chars = read(new_sock, in_buffer, 1024 - 1); // tila loppumerkille
    in_buffer[n_of_read_chars ] = '\0';  // lisätään loppumerkki
   
    return 0; // lukeminen onnistui
  }

eli jos luettavaa tulee ja listen huomaa sen, tehdään uusi socketti, josta luetaan (toivottavasti vain korkeintaan) 1023 merkkiä. Lukemisen varattu puskuritila on 1024 ja viimeisen luetun merkin jälkeen pitäisi lisätä '\0'. 

Onko koodissa näkyvissä todennäköisiä ongelmia, mahdollistaako se esimerkiksi ylivuodon ja osaako se lukea varmasti kaiken alle 1023 pituisen tulevan viestin, kun socket on

Koodia: [Valitse]
socket( AF_INET, SOCK_STREAM, 0))




8
Jos pavelimella olevan sivun osoitteesta unohtuu sivunimi, näkyy selaimessa hakemistolistaus.

Netissä olevan ohjeen mukaan

https://www.simplified.guide/apache/disable-directory-listing

näkymän voi estää .htaccess -asetuksella

/var/www/mysite/.htaccess -tiedostossa, mutta omalla palvelimella sivu on pehmolinkattu ja erilaisessa paikassa.

Muokk.

Sivulla

https://stackoverflow.com/questions/2530372/how-do-i-disable-directory-browsing?rq=4

neuvottiin, että .thaccess -tiedoston rivillä pitää olla enter lopussa, ehkä sen puute vaikutti ensimmäisessä kokeilussa. Nyt palvelimella on myös index.html -sivu, niin toivottavasti hakemistorakennata ei saa näkyville.

Parasta tietysti olisi, jos hakemistolistauksen näkyminen olisi estetty jo oletuksena joka paikassa, miten sen saisi kätevimmin päälle. En ole vielä uskaltanut kokeilla netistä löytyviä erilaisia ehdotuksia mahdollisten sivuvaikutusten takia.




Jos samaan hakemistoon, jossa sivu sijaitsee, laittaa .htacces tiedoston ja siihen (ainoan) rivin

Koodia: [Valitse]
$ cat .htaccess
Options -Indexes
$

haekmistotiedot näkyvät silti. Missä .htaccess pitäisi olla ja pitäisikö siinä olla jotain muutakin kuin vain yksi Options -rivi.

Olisko vain pelkän index.html -sivun lisääminen sivun hakemistoon turvallinen tapa estää hakemiston näkyminen, vaikka joku sitä yrittäisi luvattomasti kaivaakin.

 

9
Ubuntu tietokoneissa / 23.10 -> 24.04 päivitys
« : 07.09.24 - klo:13.42 »

Koneessa on

Koodia: [Valitse]
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 23.10
Release: 23.10
Codename: mantic

Sitten yritettiin

Koodia: [Valitse]
$ sudo do-release-upgrade
Etsitään uutta Ubuntu-julkaisua
Uutta julkaisua ei löytynyt.

Pitääkö olla lts-versio, jotta sen päivitys onnistuisi. Miten 23.10 -koneen päivitys pitäisi tehdä, pitääkö olla kokonaan uusi 24.04 tikulla.


10
 
Taisi ratketa sillä ohjeella, varmistelen vielä koko koodin kanssa, sitten laitan ratkaistuksi

Kiitos neuvosta  :)

11
Nettiohjeiden mukaan ! -operaattorin pitäisi kääntää totuusarvo, mutta en keksi, miksi niin ei näytä tapahtuvan tässä pienessä kokeiluohjelmassa

Koodia: [Valitse]

<?php 

if(1)
{
  echo(
"luku alkaa \n\n");
  
$qs readline("anna arvo1 arvo2 arvo3 ja arvot4: ");
  echo(
"\n\n luku loppu \n\n");
  
  
$_POST[&#39;arvo1&#39;] = explode(&#39; &#39;, $qs)[0] . &#39; &#39;;
  
$_POST[&#39;arvo2&#39;] = explode(&#39; &#39;, $qs)[1] . &#39; &#39;;
  
$_POST[&#39;arvo3&#39;] = explode(&#39; &#39;, $qs)[2] . &#39; &#39;;
  
$_POST[&#39;arvot4&#39;] = implode(&#39; &#39;, array_slice(explode(&#39; &#39;, $qs), 3));
/*
  echo( $_POST[&#39;arvo1&#39;] );
  echo( $_POST[&#39;arvo2&#39;] );
  echo("\n\n loppu \n\n");
*/
  
}  // if loppuu

if(empty($_POST["arvo1"]))
  {
    die(
"arvo1 puuttuu");
  }
 
 echo(
$_POST["arvo1"] ) ;
 echo( 
" arvon1:n pituus on " strlen(trim($_POST["arvo1"] )) . "\n"  );
  
if( !
is_int(trim($_POST["arvo1"] ))  )
  {
    die(
"\narvo1:n on oltava kokonaisluku\n ");  // <<<====== vaikka arvo on 1, tullaan tänne ????
  
}

$my_number str_replace(&#39; &#39;, &#39;&#39;, $_POST[&#39;arvo1&#39;] );    // tyhjät pois 
$my_number filter_var($my_numberFILTER_SANITIZE_STRING);
$my_number substr($my_number040); 

?>


kokeilu meni näin

Koodia: [Valitse]
php kokeilu_05.php

luku alkaa

anna arvo1 arvo2 arvo3 ja arvot4: 1 aa oo 2 3 4

 luku loppu

1  arvon1:n pituus on 1

arvo1:n on oltava kokonaisluku


Voi olla, että kyseessä on joku yksinkertainen logiikkavirhe omassa logiikassani, mutta itse sitä on vaikea huomata

Miten pitäisi testata, että syötettävä arvo on kokonaisluku php:ssä.



12
Kiitoksia vastauksista

Taitaa tosiaan olla niin, että ihan yritetyn kaltainen rakenne ei onnistu. Voisi käyttää vain osoitteita tai sitten ohjelmarakenne pitää miettiä uudeksi. Onneksi harrastellessa ei ole niin kiirettä :)

13
Yritin tehdä kahta luokka niin, että luokka1 käyttää luokka2:n tyyppistä muuttujaa ja luokka2 käyttää luokka1:n tyyppistä muuttujaa.

Kokeilun rakenne on tällainen

luokka1
{ fun1( luokka2 x);
}

luokka2
{ fun2 (luokka1 y);
}

Käännös ei onnistu, koska luokka1:ssä luokka2:ta ei tunnisteta. Netissä on std::forward- ja std::class -asioista ohjeita, mutta en ainakaan vielä ole keksinyt, miten niistä voisi olla apua.

Joskus muistan nähneeni directiivin forward, jonka voisi kuvitella ratkaisevan tällaisen asian, mutta ainakaan vielä hakutuloksissa sitä ei ole näkynyt.

Mikä olisi ratkaisu, on kokeiltu myös luokkien esittelyä etukäteen ja määrittelyä suoraan funktioineen.

14

Joillakin sivuilla on järjestelmävalvonnan mukaan paljon suorintintehoa vievää koodia, vaikka näkyvä toiminnallisuus on vain tekstejä ja linkkejä.

Voisiko jollain vakiona tulevalla Firefoxin työkalulla nähdä, mitä sivusto tekee taustalla, voiko se olla piilolauhintasivu tms.

Tietysti javascriptin voi aina tällaista sivua katsellessa laittaa pois päältä, mutta siinä on taas pari ylimääräistä napsua, ja sitten on vielä uteliaisuus: mitä se sivu oikein tekee :)

15

No, hyvä!

Nyt pitää hankkia sopivat johdot, niin pääsee kokeilemaan.

Kiitos vastauksesta  :)

16
Käytössäni on vanha stereo, jossa on aux in left- ja right-paikat. Tuloherkkyys (input sensitivity) on 400mV ja impedanssi > 3 Ohmia.

Millaista äänen laatua voi odottaa, jos yhdistää puhelimen kuulokepaikasta piuhat aux in -sisääntuloihin.

Onko puhelimien kuulokelähdöissä joku standardilähtöalue niin, että 400mV suunnilleen toimii.


17
Lainaus
Eikö tämä toisaalta hukkaa tilaa, jos osa merkkijonoista on lyhyempiä kuin taulukon leveys?

Niinpä, ehkä std::vector<std::string> olisi sittenkin sopivin, ainakin helpoin.

Kiitos nopeasta vastauksesta  :)


18
Esimerkkitapauksena voisi olla vaikka tekstisivu, jossa on 40 riviä ja jokaisen rivin maksimi- tai vaikiopituus on 80 merkkiä.

Varmaan tavallisella c:llä pitäisi tehdä kaksiulotteinen taulukko

char sivu[rivimäärä][merkkimäärä]

mutta haluaisin sivun c++ -tyylisesti eli rivit vakiopituisina stringeinä ja rivit vektoriin tai arrayhin niin, että kääntäjä ymmärtää, että mitään lisätilaa sivulle ei koskaan tarvita ja jos riviä muutetaan, se pysyy aina omassa tilassaan eli uusi rivi mahtuu vanhan rivin tilaan.

Jos vakiotilavaatimusta ei olisi, sivu olisi varmaan

std::vector<std::string> -muotoinen.

Toiveena olisi siis saada kääntäjä tekemään sellaista koodia, joka ei vaatisi mitään ylimääräistä tilaa eriputuisille stringeille tai muille varauksille.







19
 
Asia on juuri niin. Pitäisi tulostaa i, eikä olisi pitänyt valita sellaista muuttujanimeä, josta on vaikea päätellä, että kyseessähän on taulkon elementti.

Yritin kirjoittaa sellaista koodia, jossa voisi mahdollisimman helposti vaihtaa alla olevan rakenteen int ktab[10] std::vector ktab -rakenteeksi ja päinvastoin. sizeof ei oikein toiminut iteraatiorajana, mutta kokeiltu for -rakenne taitaisi toimia.

Kiitos vastauksesta, pähkinän ratkaisu helpotti tilannetta ainakin täällä päässä  :)

20
Taas on tullut vastaan pieni ainakin toistaiseksi ratkaisematon pulma.

Koodia: [Valitse]

#include <vector>
#include <iostream>

int main()
{
  int ktab[10];
  ktab[4] = 44;
  for(auto i : ktab) std::cout << ktab[i] << " ";
  std::cout <<ktab[4];
return 0;
}


Ohjelma on kännetty näin
Koodia: [Valitse]
g++ -std=c++20 -pedantic koe.cpp -o koe

Käännös ja suoritus menevät hyvin, mutta tulostus on tällainen
Koodia: [Valitse]
0 0 0 0 0 0 0 0 0 0 44

Ajatuksena on, että taulukon kohdan 4 pitäisi näkyä myös for-osassa. Eikö automaattinen for toimikaan säilöjen ulkopuolella, virheilmoituksia eikä varoituksia kuitenkaan tule.

Olisiko tällainen kesäpähkinä sopiva: Etsi  virhe edellä esitetyssä päättelyssä     




Sivuja: [1] 2 3 ... 43