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 ... 45
1

Kokeilu onnistui. Heti ensimmäisestä vastauksissa olleista linkeistä onnistuttiin nuottipapperi tulostamaan pdf-tiedostoksi.

Rosegarden näyttää myös mielenkiintoiselta, ehkä se pitäisi laittaa kokeiluun flatpackina tai odottaa, että se tulee vakiopaketteihin.

Kiitoksia  vastauksista  :)

2
Voisiko perusohjelmilla, write, impress, tms., tehdä tavallisen nuottiviivaston, jossa on sävel- ja bassoalueet tavalliseen tapaan, siis sellaisen Aaron pienokoulu -nuottiviivaston.

Oma koneeni on pieni, enkä haluaisi asennella ylimääräisiä ohjelmia. (lilypod olisi oikein mukava, mutta, koska sen nuottimerkinnät eivät liene vakiomuotoisia, ei sitäkään viitsisi asennella tilaa viemään. Vakiomuotoiset nuottimerkinnät olisivat mielestäni sellaisia, joita ymmärretään esim. midistandardejen mukaan)

Tekoälyltä saadut ohjeet nuottiviivaston tekemiseksi writelle eivät vaikuttaneet kovin päteviltä.


3
 Jälleen "mielenkiintoinen" c++ strinstream -ongelma. En millään keksi, miksi alla olevassa lyhyessä kokeiluohjelmassa ei koskaan löydetä syötteen lopussa olevia ylimääräisiä merkkejä.

Kolmen kentän arvot (nu ss os) luetaan oikein ja haluttu määrä int arvojakin (j) onnistutaan lukemaan, mutta en koskaan onnistu havaitsemaan ylimääräisiä merkkejä viimeisen j:n jäljessä.
Miksi char-muuttujia lukevaan while-silmukkaan ei koskaan mennä eikä ylimääräinen_merkki saa koskaan luettuja arvoja (näyttäisi, että ääkköset toimivat g++ -kääntäjässä muuttujan nimessä)

Koodia: [Valitse]

#include <iostream>
#include <string>
#include <sstream>

#include <vector>

struct ParsedData
{ int nu;
  std::string ss;
  std::string os;
  std::vector<int> valinnat;  // valinnat
 
};

int j;  // valinta intinä

bool string_to_vector(const std::string& syote, ParsedData& tulos)
{ std::stringstream ss(syote);
  if(!(ss >> tulos.nu >> tulos.ss >> tulos.os))
    {
     return false; // Jäsentäminen epäonnistui.
    }
        std::cout <<tulos.nu << tulos.ss << tulos.os << std::endl;
  while(ss >> j)
    {
      tulos.valinnat.push_back(j);
          std::cout << j << std::endl;
    }
 char ylimääräinen_merkki = 'q'; //ääkköset toimivat muuttujassa myös???  <<===============
   //if(ss >> ylimääräinen_merkki)
   while(ss >> ylimääräinen_merkki) //   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<???????
     {                              //  <<<<<<<<<<<<<<<<<<<< tänne ei päästä koskaan ?????
       //return false;  // Ylimääräistä dataa löytyi.
       std::cout << "yy ";   //  ei koskaan tulla tänne ??????
     }
  return true; // Jäsentäminen onnistui ja syöte oli täysin käytetty.
}

// Pääohjelma, joka esittelee funktion käyttöä.
int main(int argc, char *argv[])

  ParsedData tulos;
  if( string_to_vector(argv[1], tulos) )
    { std::cout << "onnistui" << std::endl;
    }   
  else
    { std::cout << "tuli virhe" << std::endl;
    }
 
  return 0;
}

/
// g++ kokeilu.cpp -o kokeilu -pedantic
// ./kokeilu '33 ppppp ööö 11   12 oooo'

Muokk. 1

Toisaalta aika tyhmä kysymys. Kun while(ss >> j) eli lukeminen virrasta ei enää onnistu, se ei onnistu myöheminkään while(ss >> ylimääräinen_merkki). Ei auta, vaikka merkki ei ole int.

Toisaalta voisi ajatella, että vaikka int:in lukeminen ei onnistu, char:in lukeminen voisi kuitenkin onnistua.

Millähän keinolla tilanteessa voisi tarkistaa, onko virrassa vielä ylimääräisia merkkejä sen jälkeen, kun viimeisen int:in lukeminen on onnistunut. Ehkä joutuu try -rakenteisiin :(

Muokk. 2

Tekoäly kertoi, että

Lainaus
to test whether a stream has reached the end or encountered a bad character, use the stream status functions such as .eof(), .fail(), .bad(), and .good(). The .eof() function checks if the end of the stream has been reached, .fail() detects input failures (such as reading unexpected characters), and .bad() indicates a serious error that makes the stream unusable.

joten asia varmaan ratkeaa.
 

4
std::stringstreamin pitäisi toimia kumpaankin suuntaan

"A stringstream is a part of the C++ Standard Library, defined in the <sstream> header file. It allows us to read from and write to strings like they are streams."

sivun

https://www.geeksforgeeks.org/cpp/stringstream-c-applications/

mukaan. Saman sivun mukaan

stringstream
   Both input and output

istringstream
   Input only (like cin)

ostringstream
   Output only (like cout)

En vielä ole ehtinyt kokeilla std::istringstreamia, mutta kokeilen heti

Muokk.

juu, taisinpa sekoittaa, piti kääntää <<,   mutta tarkistelen asiaa, ehkä sekoitan jotain muutakin

Kiitos neuvosta  :)

5
Kokeilin lukea tekstiä stringstreamilla, mutta miksi se ei koskaan ymmärrä, että anettu syöte on loppu eli miksi ja mistä se lukee ylimääräisen merkin alla olevassa esimerkissä.

Kokeilin syötteenä sanaa qwer ilman loppuvälilyöntiä, yhden loppuvälilyönnin kanssa ja useamman loppuvälilyönnin kanssa. Aina mennään if :iin << -operaattorin kanssa.

Miten  std::strinstreamin saisi ymmärtämään, että syöte on loppunut eikä ylimääräisiä merkkejä pitäisi olla.


Koodia: [Valitse]

#include <iostream>
#include <string>
#include <sstream>

int main()
{
  std::string syote1 =  "qwer    ";   // "qwer " tai "qwer" aina if menee läpi
  std::stringstream ss(syote1);
  std::string merkkijono;

  std::getline(ss, merkkijono, ' ');
  std::cout << syote1 << "|||" << std::endl;
  std::cout << merkkijono << "|||" << std::endl;
  char ylimaarainenMerkki;

  std::cout << "eka: " << (int)ylimaarainenMerkki << std::endl;
  if(ss << ylimaarainenMerkki   )
    {
      std::cout << "tästä virhe" << std::endl;
      std::cout << "toka: " << (int)ylimaarainenMerkki << std::endl;
      std::cout << "ylimaarainenMerkki on: " << ylimaarainenMerkki << std::endl;
    } 
  return 0;
}

// g++ testi_01.cpp -o testi_01 -pedantic
// ./testi_01


6

Ydin poistettu, asennettu uudestaan ja siivottu nm:n ohjeiden mukaan. Kaikki vaikuttaa toimivan.

Kiitoksia :)


7


Hmmm, enpä ole tainnut tässä varakoneessa koskaan laittaa sudo apt autoremovea tai muusta syystä vanhat ytimet ovat mukana

Mutta jos laitan sen nyt, voi olla vaarna, että se poistaakin tämän 6. 8. 0 -79 -version. Mikä olisi varma komento, jolla uusimman eli 6. 8. 0 -83 -version voi poistaa.

Jostain syystä viimeinen listauksessa näkyvä ydin on generic eikä signed niin, kuin muut näyttäisivät olevan, mutta onko asialla mitään merkitystä.

Tässä ytimien listaus

Koodia: [Valitse]
$ dpkg -l | grep linux-image
rc  linux-image-5.19.0-32-generic                 5.19.0-32.33~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-41-generic                 5.19.0-41.42~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-42-generic                 5.19.0-42.43~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-43-generic                 5.19.0-43.44~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-45-generic                 5.19.0-45.46~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-46-generic                 5.19.0-46.47~22.04.1                     amd64        Signed kernel image generic
rc  linux-image-5.19.0-50-generic                 5.19.0-50.50                             amd64        Signed kernel image generic
rc  linux-image-6.2.0-26-generic                  6.2.0-26.26~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-31-generic                  6.2.0-31.31~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-32-generic                  6.2.0-32.32~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-33-generic                  6.2.0-33.33~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-34-generic                  6.2.0-34.34~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-35-generic                  6.2.0-35.35~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-36-generic                  6.2.0-36.37~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-37-generic                  6.2.0-37.38~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.2.0-39-generic                  6.2.0-39.40~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-14-generic                  6.5.0-14.14~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-15-generic                  6.5.0-15.15~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-17-generic                  6.5.0-17.17~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-21-generic                  6.5.0-21.21~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-25-generic                  6.5.0-25.25~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-26-generic                  6.5.0-26.26~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-27-generic                  6.5.0-27.28~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-28-generic                  6.5.0-28.29~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-35-generic                  6.5.0-35.35~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-41-generic                  6.5.0-41.41~22.04.2                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-44-generic                  6.5.0-44.44~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.5.0-45-generic                  6.5.0-45.45~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.8.0-40-generic                  6.8.0-40.40~22.04.3                      amd64        Signed kernel image generic
rc  linux-image-6.8.0-45-generic                  6.8.0-45.45~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.8.0-47-generic                  6.8.0-47.47~22.04.1                      amd64        Signed kernel image generic
rc  linux-image-6.8.0-48-generic                  6.8.0-48.48                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-49-generic                  6.8.0-49.49                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-50-generic                  6.8.0-50.51                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-51-generic                  6.8.0-51.52                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-52-generic                  6.8.0-52.53                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-53-generic                  6.8.0-53.55                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-54-generic                  6.8.0-54.56                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-55-generic                  6.8.0-55.57                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-56-generic                  6.8.0-56.58+1                            amd64        Signed kernel image generic
rc  linux-image-6.8.0-57-generic                  6.8.0-57.59                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-58-generic                  6.8.0-58.60+1                            amd64        Signed kernel image generic
rc  linux-image-6.8.0-59-generic                  6.8.0-59.61                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-60-generic                  6.8.0-60.63                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-62-generic                  6.8.0-62.65                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-63-generic                  6.8.0-63.66                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-64-generic                  6.8.0-64.67                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-71-generic                  6.8.0-71.71                              amd64        Signed kernel image generic
rc  linux-image-6.8.0-78-generic                  6.8.0-78.78                              amd64        Signed kernel image generic
ii  linux-image-6.8.0-79-generic                  6.8.0-79.79                              amd64        Signed kernel image generic
ii  linux-image-6.8.0-83-generic                  6.8.0-83.83                              amd64        Signed kernel image generic
ii  linux-image-generic                           6.8.0-83.83                              amd64        Generic Linux kernel image




8

Koodia: [Valitse]
Tiedostojärjestelmä  Koko  Käyt Vapaa Käy% Liitospiste
tmpfs                380M  2,1M  378M   1% /run
/dev/sda6            255G   23G  220G  10% /
tmpfs                1,9G  4,0K  1,9G   1% /dev/shm
tmpfs                5,0M  8,0K  5,0M   1% /run/lock
efivarfs             120K  111K  4,7K  96% /sys/firmware/efi/efivars
/dev/sda2            296M   57M  240M  19% /boot/efi
tmpfs                380M  124K  380M   1% /run/user/1000




Ainoastaan efivars näyttää täydeltä.


9
Graafisen kälin tarjoaman päivityksen jälkeen käynnistys pysähtyy nopeasti tyhjään ruutuun. Vikasietotilan käynnistysilmoituksista näkyy, että

Koodia: [Valitse]
/dev/root:  can't open blockdev
UFS: cannot open root device UUID = xxxxxxxxxxxxxxxxxx or unknown-block(0,0): error -6
please append a correct boot option: available partitions:
ext3
ext2
ext4
squashfs
vfat
fuseblk
kernel panic - not syncing: VFS unable to mount root fs on unknown-block(0,0)
CPU: 1    PID: 1  comm: swapper/0
tained 6.8.0-83 generic #83-Ubuntu



Millä tavalla tilanteessa voisi alkaa hakea ratkaisua, olisiko kyseessä levyllekirjoitusvirhe päivitystilanteessa, puuttuuko ext1 jostain syystä.....   79-Ubuntu näyttää toimivan hyvin, kirjoitan tätäkin sillä, kun käynnistin koneen aikaisempaan ydinversioon.





10

PHP:ssä on mail-funktio säähköpostin lähettämiseen. Onnistuuko sähköpostailu oikeasti tavallisiin sähköpostiosoitteisiin php:llä, eivätkä sähköpostipalvelut sisällä sellaisia suodattimia, joilla juuri php:llä tehdyt postiti karsittaisiin. Lähettävätkö "oikeat" sähköpostipalvelut joitain varmistuksia, jotka kertovat, että kyse ei ole epäluotettavasta lähteestä tulevasta postista tai roskapostista.

Onko php::ssä myös helppoa vakiotapaa sähköpostin vastaanottamiseen tai miten voisi tavallisena linux-peruskäyttäjänä saada sähköpostit omaan koneeseen, silloin kun se on päällä.

Voisiko pieni yhteisö toimia ilman ulkopuolisia sp-palveluita suunnilleen php:n avulla niin, että ehkä vain yhdessä palvelinkoneessa olisi sp-ohjelma.


11

Tässä kävi niin kuin joskus ennenkin: Kun laitoin viivkoodinlukijan kiinni parin päivän päästä kiinni, se toimikin ihan hyvin.

Kokeilin myös koodinlukijaa toisessa koneessa sen jälkeen, kun se ei "toiminut", ja toisessa koneessa se toimi ihan hyvin.

Asia on nyt siis ratkennut, mutta en tiedä, mikä oli ongelman syy ongelman ilmetessä.


12
Viivakoodinlukija ei näytä tunnistavan laskujen viivakoodia. Tunnistamattomuutta on ollut joskus aikaisemmin, ja epäilen, että se voisi liittyä uusiin ydinversioihin. Nythän on taas tullut ydinpäivityksiä, jotka tietysti otin.

Aikaisemmin viivakoodinlukijan tunnistamattomuus on korjautunut, kun seuraavilla kerroilla laskuja on ollut maksussa, ja toivottavasti näin tapahtuu nytkin. Mutta kysyisin, ovatko tunnistusongelmat tunnettu asia ja liittyykö se johonkin muuhun, esimerkiksi sarjaportin lukemiseen tms,


13

Päivittelin päätteeltä ja tuli mm. tällaiset ilmoitukset

Koodia: [Valitse]
The following upgrades have been deferred due to phasing:
  libmalcontent-0-0 simple-scan
The following packages have been kept back:
  libgl1-amber-dri
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded

Kolmatta päivittämätöntä en keksinyt ilmoituksista.

Pitää vielä laittaa autoclean ainakin  ja   ...


Kiitokset hyvistä päätepäivitysohjeista   :)




14

Kun otan tarjottuja päivityksiä u 24.04 -versiossa, tulee ilmoitus, että kaikkia päivityksiä ei voiasentaa.

Pitäisikö tilanteessa toimia jollain tavalla, vai onko ilmoitus vain tiedoksi taviskäyttäjälle. Mistä ne paketit, joita ei voi asentaa löytyvät, jos niitä haluaa tutkia jostain lokista..

 

15
tällaista näyttäisi olevan

Koodia: [Valitse]
su
Password:
root@kt1-hki:/home/kt1# cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"

# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"

# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"

# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"

# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"

# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d


muokk.

kirjauduin pilveen uudellen, sudoilu näytti toimivan kt1:nä, ja otin päivitykset ....

Tämänkin säikeen voinee laittaa ratkaistuksi eikä tarvinnut edes opiskella hetzneriä, mikä on toisaalta helpotus, mutta tulevaisuudessa voi kuitenkin sekin olla edessä.

Yhtenä oppina tilanteesta voisi olla se, että vaikka pilvikoneen ainoa pääkäyttäjä on kadonnut sudoilulistalta ja koneen hallinta ei onnistu tutulla tavalla enää, ei kannata panikoitua, vaan voi kokeilla myös su -reittiä.

Kiitoksia neuvoista  :)


16
kokeilin komentoa su ja se näytti toimivan, kysyttiin salasana ja olin kirjautuneena roottina, sitten kokeilin

Koodia: [Valitse]
adduser kt1 sudo
Adding user `kt1' to group `sudo' ...
Adding user kt1 to group sudo
Done.

toivottavasti sudo on oikea ryhmän nimi eikä esimerkiksisudoers tms.

ja sitten yritin niiäpäivityksiä

Koodia: [Valitse]
sudo apt upgrade
[sudo] password for kt1:
kt1 is not in the sudoers file.  This incident will be reported.

netissä oli ohje, että komento tulee voimaan, jos koneen käynnistää uudelleen, mutta ainkaan kt1 ei voi laittaa sudo reboot komentoa, kuten edelllä näkyy. uskaltaisiko kokeilla sitä roottina .... ?


muokk.
nyt groups komennolla näkyy

Koodia: [Valitse]
groups kt1
kt1 : kt1 sudo kt2 kt3




17



Viimeisin sudo-komento oli do-release-upgrade, ja sitten kun ekan kerran yritin ottaa tarjottuja tietoturvapäivityksiä, yllätys oli, että en enää kuulukaan sudoiluryhmään.

Pilvikoneen päätteessä on vain muutama päivitysten tarkastamiseen ja uudelleenkäynnistämiseen liittyvä komento ollut käytössä, joita ajelen peruuttamalla pari komentoa vanhemman suuntaan, eli en uskoisi, että olen poistanut kt1 -käyttäjää


18

Selvittelin tilannetta

Koodia: [Valitse]
groups kt1
kt1 : kt1 kt2 kt3 i

eli pääkäyttäjäni on kt1 ja sitten olen tehnyt pari muuta käyttäjää linux-oikeuksien harjoitteluun

kt1 ei näytä kuuluvan sudoers -ryhmään, pitäisikö se näkyä

mutta olen muuten vähän jäljessä selvittelyjeni kanssa, seuraavaksi yritän opiskella niitä hetzner-ohjeita, joita jo ollen edellä saanut ....


19
Pilvikone on hetznerin pienin vaihtoehto, johon ruksattiin käyttikseksi ubuntu muutamia vuosia sitten. En ole sen jälkeen ollut hetznerin kanssa tekemisissä enkä tunne sen etäkonehallintaa :(

Millään ubuntu-kikalla tilanteesta ei selvinne?  Hetznerin hallinnointi on ihan uusi alue, jossa pitäisi ymmärtää etäkoneista edes jotain, eikä hallintakonsolia ole tarvinnut käyttää koskaan.

Jos jollain on vihjettä siitä miten hetznerin pilvikoneen voisi käynnistää sellaiseen tilaan, että sudoilijan saa lisättyä, se tieto voisi olla nyt pelastus.

20
 
Ubuntu 20.04 -jakelun tukiaika loppui ja jouduin päivittämään pilvikoneeni do-release-upgrade -komennolla. Kaikki näytti menneen hyvin ja pilvikoneella ollut nettisivukin toimi.

Mutta kun yritin pääkäyttäjänä ssh:lla kirjautua koneelle, tuli ilmoitus, että pääkäyttäjäni ei ole enää sudoilulistalla. Nyt en pääse tekemään tarjottuja tietoturvapäivityksiä enkä varmaan paljon muutakaan, mikä olisi tarpeellista.

Miten tilanteesta voi selvitä? Pääkäyttäjä oli tietääkseni ainoa sudoilija, jolleivät jotkut ohjelmat automaattisesti lisänneet itseään sudoilijoiksi.

Sivuja: [1] 2 3 ... 45