Pieniä kysymyksiä ohjelmoinnista

Liittynyt
23.10.2016
Viestejä
658
Olen vähän hukassa Gitin kanssa. En ole ennen peruutellut committeja ja nyt halusin peruuttaa yhden commitin revert-komennolla. Alla kuva alkutilanteen logista.

upload_2019-10-3_9-42-24.png


Tässä tilanteessa käytin komentoa git revert 190ab91. Halusin siis takaisin tuohon punaisen rivin tilanteeseen. Revertin jälkeen tein commitin muutoksista ja päädyin seuraavaan tilanteeseen.

upload_2019-10-3_9-44-47.png


Oletin päätyväni takaisin master-branchiin. Miten saan muutettua tuon HEADin uudeksi masteriksi?
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
Olen vähän hukassa Gitin kanssa. En ole ennen peruutellut committeja ja nyt halusin peruuttaa yhden commitin revert-komennolla. Alla kuva alkutilanteen logista.



Tässä tilanteessa käytin komentoa git revert 190ab91. Halusin siis takaisin tuohon punaisen rivin tilanteeseen. Revertin jälkeen tein commitin muutoksista ja päädyin seuraavaan tilanteeseen.



Oletin päätyväni takaisin master-branchiin. Miten saan muutettua tuon HEADin uudeksi masteriksi?
Eikös sen voi push masteriin?
 
Liittynyt
23.10.2016
Viestejä
658
Löysin lopulta Stack Overflowsta sopivat komennot.

Ensin loin headiin uuden branchin:
Koodi:
git branch tmp
Sitten checkasin masterin ulos:
Koodi:
git checkout master
Yhdistin tmp branchin masteriin:
Koodi:
git merge tmp
Poistin tempin:
Koodi:
git brach -d tmp
Nyt olen tässä tilanteessa:
upload_2019-10-3_11-18-7.png


Eli kai tuo nyt sitten meni niin kuin pitää. Koodi ainakin vielä toimii. :)
 
Liittynyt
23.10.2016
Viestejä
1 474
Vaihtoehtoja:

a) Jos tekemäsi commit on jo masterissa, aja git revert [commitinNimi tai hash] , jolloin syntyy uusi commit joka reverttaa aikaisemman tehdyn commitin. Puske tämän jälkeen muutos masteriin

b) Jos haluat poistaa kaikki lokaalit commitit ja palauttaa tilanteen samaksi kuin masterissa, aja git reset --hard origin/master

c) Jos haluat poistaa välistä yksittäisiä lokaaleja committeja, aja git rebase -i HEAD~[tähän numero], jossa numero on kuinka monta monta committia taaksepäin haluat nähdä. Avautuvassa tekstieditorissa vaihda sana "pick" sanaan "drop" tai "d" niiltä commit-riveiltä, jotka haluat tiputtaa pois. Tällä tavalla ei voi fiksusti poistaa committeja, jotka on jo viety masteriin. Eli siis voi, mutta vaatii force-puskuja ja muiden työntekijöiden lokaalien kopioiden resetointeja, joten ei pitäisi tehdä oikeastaan ikinä.

Viimeinen tapa voi tuotaa konflikteja, jotka täytyy resolvata samoin kuin mergejen kanssa. Tällöin teet tarvittavat muutokset commitin resolvaamiseen, lisäät muutokset git add -u tai git add . , ja ajat git rebase --continue. Jos kaikki tuntuu menevän päin helvettiä, niin rebasesta pääsee pois aina git rebase --abort -komennolla. Jos odotettavissa on jotain yllätyksiä tai mahdollisia mokiin, suosittelen ensin uuden branchin luomista nykytilanteesta ("varmuuskopioksi"), ja vasta sitten rebasen tekemistä siellä missä oli sitä tekemässä.

Sitten kun tuon rebasen on opetellut oikeasti, niin on kyllä ihana vehje. Loppuu ne kamalat git-historiat, jossa on typofix, merge-from-master, fixin-fiksi, fiksin-fiksin-fiksi, oho-tää-olis-pitänyt-olla-mukana-3-committia-sitten historiat, jota on ihan kamala lukea jälkikäteen. Tosin rebasea saa tehdä lähinnä lokaalisti tai niin kauan, kun työskentelee omassa branchissa johon kukaan muu ei koske, koska rebasen kanssa joutuu toisinaan suorittamaan force-pusheja.

Itse käytän työelämässä rebasea nykyään päivittäin, koska annan toiselle koodarille mieluiten vertaisarvioitavaksi koodia, jonka voi fiksusti lukea commit kerrallaan ja se on "kerralla oikein", eikä niin että se on pakko lukea yhtenä isona kasana tai lukea fiksicommitteja yksi toisensa jälkeen.
 
Liittynyt
17.10.2016
Viestejä
14 664
Tosin rebasea saa tehdä lähinnä lokaalisti tai niin kauan, kun työskentelee omassa branchissa johon kukaan muu ei koske, koska rebasen kanssa joutuu toisinaan suorittamaan force-pusheja.
Erittäin hyvä pitää mielessä. Rebasea, squashia ja vaikka --amendia kannattaa välttää kun tavara on jo muiden nähtävillä. Sen jälkeen uudet muutokset noin yleensä kannattaa tuoda omin uusin commitein sekaannusten välttämiseksi. Mutta ennen "julkistamista" ovat todella hyödyllisiä tapoja siivota commit-historiaa loogisemmaksi.
 

kaarlos

Virallinen JimmZ-boikotoija
Premium-jäsen
Liittynyt
13.11.2016
Viestejä
1 533
Rebasen käyttö on mielestäni ainoa oikea tapa pitää feature-branchia ajan tasalla kehityshaaraan nähden. Lisäksi useamman kuin yhden commitin syntyminen yhdestä feature branchista vaatii mielestäni jotain perustelua, kuten esimerkiksi sen että ekassa commitissa tehdään joku refaktorointi ja toisessa commitissa toteutetaan uutta toiminnallisuutta.

Versiohistoria joka on täynnä mergecommitteja on täysin lukukelvoton. Lisäksi asioiden backporttaaminen muuttuu aika helvetilliseksi jos kussakin feature-branchissa on N kappaletta committeja sekä muutama origin/develop merge. Päähaaran committien järjestys muuttuu ennen pitkää niin epämääräiseksi, ettei siitä ota enää kukaan selvää. Rebasella kun pitää feature-branchin ajan tasalla ja merget --ff-onlylla niin kehityshaara pysyy siistinä.

Toki on tilanteita joissa merge committeja syntyy pakosti, mutta siihen tarkoitukseen niiden olemassaolo on ihan perusteltua.
 
Viimeksi muokattu:
Liittynyt
19.10.2016
Viestejä
1 562
Rebasen käyttö on mielestäni ainoa oikea tapa pitää feature-branchia ajan tasalla kehityshaaraan nähden. Lisäksi useamman kuin yhden commitin syntyminen yhdestä feature branchista vaatii mielestäni jotain perustelua, kuten esimerkiksi sen että ekassa commitissa tehdään joku refaktorointi ja toisessa commitissa toteutetaan uutta toiminnallisuutta.
Yleensä taidetaan suosia pieniä ja usein tehtäviä committeja isojen refaktorointien ja kokonaisten vaatimusten toteuttamisen sijaan.
 

kaarlos

Virallinen JimmZ-boikotoija
Premium-jäsen
Liittynyt
13.11.2016
Viestejä
1 533
Yleensä taidetaan suosia pieniä ja usein tehtäviä committeja isojen refaktorointien ja kokonaisten vaatimusten toteuttamisen sijaan.
Tämä toimii jos committien sisältö on jotenkin perusteltu. Itse en ymmärrä mitä hyötyä on jostain "implemented first part", "implemented second part", ... sarjasta committeja on kellekään.

"Kokonainen vaatimus" on mielestäni myös väärä kokoluokka tässä. Yksittäinen pull requestihan voi olla ja pitäisikin olla se pieneksi pureskeltu osa jotain yksittäistä user storya.
 
Liittynyt
23.10.2016
Viestejä
1 474
Tämä toimii jos committien sisältö on jotenkin perusteltu. Itse en ymmärrä mitä hyötyä on jostain "implemented first part", "implemented second part", ... sarjasta committeja on kellekään.
Jos tarkoitus on vertaisarvioida koodia ennen sen menoa masteriin, niin katson paljon mieluummin 10x 20-100 rivin committia kuin sen tonnin jytkäleen.

Lisäksi ihmiset valittavat, ettei commit-historiaa muka tulisi käytettyä ikinä, mutta minä ainakin olen ollut mukana projekteissa, joissa sen selaaminen on ollut lähes viikottaista, kun on mietiskellyt mistä joku feature on ilmestynyt ja kuka siitä tietää parhaiten... Jotkut itseään senioriksi kutsuneet mäkättivät tästä minulle että ihan turhaa, kunnes pointtasin että niin no, tutkin just eilen miks oot kommentoinu tänne että tekee xyz kun parametreiksi antaa önnönnöö, mutta en löydä sitä toiminnallisuutta mistään.

Pidän myös henkilökohtaisesti luettavuuden vuoksi siitä, että feature menee masteriin sellaisina committeina kuin se oli alunperin, eikä squashata joksikin järkyttäväksi kasaksi mergessä.

Ongelmia tulee, kun jokaisella on 15 tiimissä eri näkemys asiasta. Hienoa oli, kun oli aikaisemmin projekti jossa oli 3 henkilöä, jolla kaikilla oli sama näkemys rebasen ja versiohallinnan käytöstä.
 
Liittynyt
17.10.2016
Viestejä
22 046
Rebase on aika vaikea konsepti. Suosittelen vahvasti, että laitetaan ensin kaikille työntekijöille (erityisesti uusille junioreille) GIT-prosessi kuntoon ja sitten mietitään versionhallinnan erikoisuuksia.

Yleensä taidetaan suosia pieniä ja usein tehtäviä committeja isojen refaktorointien ja kokonaisten vaatimusten toteuttamisen sijaan.
Olen itse tätä koulukuntaa.

--

Omat projektit on kyllä paljon pienempiä suuruusluokaltaan kuin esim. @arcane projektit vaikuttaa olevan. Ja eri testauskäytännöt, kuin koodin vertaisarviointi. Vuoden alussa oli vielä vertaisarviointia, nyt on testaussessioita, jotka painottuu toiminnallisuuden varmistamiseen.
 
Liittynyt
19.10.2016
Viestejä
1 562
Tämä toimii jos committien sisältö on jotenkin perusteltu. Itse en ymmärrä mitä hyötyä on jostain "implemented first part", "implemented second part", ... sarjasta committeja on kellekään.
Ei varmaan tuollaisista commiteista isommin hyötyä olekaan. Kyllä committien tulisi pyrkiä olemaan mahdollisimman hyvin toimivia kokonaisuuksia vaikka ne olisivatkin pieniä. Samoin commit-viestien tulisi pyrkiä olemaan järkeviä, mitä "implemented first part" ei todennäköisesti ole.

"Kokonainen vaatimus" on mielestäni myös väärä kokoluokka tässä. Yksittäinen pull requestihan voi olla ja pitäisikin olla se pieneksi pureskeltu osa jotain yksittäistä user storya.
No oli mikä oli, mutta pointtina oli kuitenkin kokoluokka. Toki jos nämä yksittäiset ovat tarpeeksi pieniä (ja pienempi on yleensä parempi), ne voinevat mahtua yhteenkin committiin, mutta valitettavasti välillä tulee isompia kokonaisuuksia, joista on vaikea irrottaa tuollaisia "pieneksi pureskeltuja osia". Tällöin ei välttämättä ole mielekästä rajata committeja tasan tällaisiin paloihin vaan niitä voi olla järkevää tehdä useampikin kutakin osaa kohti.
 

kaarlos

Virallinen JimmZ-boikotoija
Premium-jäsen
Liittynyt
13.11.2016
Viestejä
1 533
No oli mikä oli, mutta pointtina oli kuitenkin kokoluokka. Toki jos nämä yksittäiset ovat tarpeeksi pieniä (ja pienempi on yleensä parempi), ne voinevat mahtua yhteenkin committiin, mutta valitettavasti välillä tulee isompia kokonaisuuksia, joista on vaikea irrottaa tuollaisia "pieneksi pureskeltuja osia". Tällöin ei välttämättä ole mielekästä rajata committeja tasan tällaisiin paloihin vaan niitä voi olla järkevää tehdä useampikin kutakin osaa kohti.
Optimitilanteessa toki juuri näin. Tavallisesetihan commiteissa on joku yhteinen tunniste (tyyliin Jira-tiketin ID) jolla yksittäisen toiminnallisuuden voi "tägätä" vaikka se koostuisi useammasta commitista.

Oman kokemuksen perusteella valitettavan monien committikäytäntö on se että "lähden töistä ja committaan päivän hommat", sen sijaan että koittaisi koostaa noista jotain järkeviä kokonaisuuksia. Valitettavan usein tuo "itsenäisesti toimiva kokonaisuus" kuviokin rikkoutuu jos huomaa että CI:ssä oman haaran buildi menee punaiselle commitin pushin jälkeen. Voihan noita toki amendailla sitten fikseillä aina välissä.

Usean commitin käytäntö on fine niin pitkään kuin tekijä käyttää rebasea eikä mergeä, jolloin commitit pysyvät loogisessa kronologisessa järjestyksssä.
 
Liittynyt
23.10.2016
Viestejä
658
Miten saan custom fontin toimimaan svg-tiedostossa, jota käytän React-sovelluksessa. Mulla on svg:ssä tällainen style-tagi:

Koodi:
  <style>
    @font-face {
      font-family: 'aachenbold';
      src: url('aachen_bold-webfont.woff2') format('woff2'),
          url('aachen_bold-webfont.woff') format('woff');
      font-weight: normal;
      font-style: normal;
    }

    text {
      font-family: 'aachenbold'
    }
  </style>
Lokaalisti toimii hienosti, mutta tietenkään Reactin kanssa ei, koska tuota fonttitiedostoa ei löydy. Mihin hakemistoon se fontti kuuluu laittaa ja miten viittaan siihen tuosta font-facen sourcesta?
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
Miten saan custom fontin toimimaan svg-tiedostossa, jota käytän React-sovelluksessa. Mulla on svg:ssä tällainen style-tagi:

Koodi:
  <style>
    @font-face {
      font-family: 'aachenbold';
      src: url('aachen_bold-webfont.woff2') format('woff2'),
          url('aachen_bold-webfont.woff') format('woff');
      font-weight: normal;
      font-style: normal;
    }

    text {
      font-family: 'aachenbold'
    }
  </style>
Lokaalisti toimii hienosti, mutta tietenkään Reactin kanssa ei, koska tuota fonttitiedostoa ei löydy. Mihin hakemistoon se fontti kuuluu laittaa ja miten viittaan siihen tuosta font-facen sourcesta?
tarvit loaderin joka pakkaa noi fontit bundlen kyytiin

npm install file-loader

webpack.config.js (rewired: kanssa config-overrides.js)
Koodi:
{
  test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
  use: [
    {
      loader: "file-loader",
      options: {
        name: "[name].[ext]",
        outputPath: "fonts/"
      }
    }
  ]
}
jos kysessä CRA (create-react-app) proju niin tarviit vielä customize-cra ja react-app-rewired plugarit jolla puukotat webpack conffin sisään.
 
Viimeksi muokattu:
Liittynyt
28.08.2018
Viestejä
788
en saanut while loopissa funktiota toimimaan. miten loopin sisälle voi laittaa funktion vai onko edes mahdollista siirtyä kesken loopin funktioniin?
 
Viimeksi muokattu:

Hessu

Tukijäsen
Liittynyt
29.10.2016
Viestejä
4 420
en saanut while loopissa funktiota toimiaan. miten loopin sisälle voi laittaa funktion vai onko edes mahdollista siirtyä kesken loopin funktioniin?
Varmaankin tarkoitat, että kutsut while loopin sisältä toista funktiota? Tuo onnistuu kyllä. Laita koodinpätkä tänne (editorissa on plussan kuva ja siitä saat liitettyä koodin näppärästi tänne) niin näkee ongelmakohdat.
 
Liittynyt
28.08.2018
Viestejä
788
kysymykseni on myös python ketjussa. olen sen verran aloittelija että haen vielä mikä on oikea paikka kysyä.
alla koodini. ja ongelmani on aivan alhaalla kommentoin ongelma kohdan "### *"
Koodi:
"""ohjelma luo halutun kokoisen boardin ja käyttäjä liikuttaa pelaajaa boardilla."""
import datetime
import random


date = datetime.datetime.now()
print(date)
nimi = input("kerro pelaajan nimi: ")
print("Heippa "+ nimi +" nyt pelataan!")

board = []
koko = 25
koko1 = koko-1

#piirretään kartta
for x in range(koko):
    board.append(["[ ]"] * koko)

def print_board(board):
    for row in board:
        print(" ".join(row))
print_board(board)

#Aloitus paikan ja pelaajan määrittely
x = 4
y = 4
vuoro = 0
pelaaja = "[@]"
lähtöruutu = board[x][y]
uusisijainti = board[x][y]
board[x][y] = pelaaja
print_board(board)

#vihollisen lähtötiedot
x1 = 10
y1 = 15
enemy = "{Ö}"
liiku =["w","a","s","d"]
valinta = "a"

def vastustajamove():
    global valinta
    valinta = random.choice(liiku)
    return valinta


print("tämä on testi: " + valinta)

def vastustajasuunta():
        global x1
        global y1
        suunta = valinta
        if suunta == "w":
            x1 = x1 - 1
        elif suunta == "a":
            y1 = y1 - 1
        elif suunta == "s":
            x1 = x1 + 1
        elif suunta == "d":
            y1 = y1 + 1
        if x1 < 0 or y1 < 0 or x1 > koko1 or y1 > koko1:
            print("alue ylitetty")

#vihollisen liike
vastustajamove()
vastustajasuunta()
uusisijainti2 = board[x1][y1]
board[x1][y1] = enemy

#vihollisen liike2
vastustajamove()
vastustajasuunta()
uusisijainti2 = board[x1][y1]
board[x1][y1] = enemy

#vihollisen liike3
vastustajamove()
vastustajasuunta()
uusisijainti2 = board[x1][y1]
board[x1][y1] = enemy

#vihollisen liike4
vastustajamove()
vastustajasuunta()
uusisijainti2 = board[x1][y1]
board[x1][y1] = enemy

#vihollisen liike5
vastustajamove()
vastustajasuunta()
uusisijainti2 = board[x1][y1]
board[x1][y1] = enemy

# vuoron aloitus ja  itse peli



while vuoro <= 20:
    suunta = (input("suunta W,A,S,D:? "))
    if suunta == "w":
        x = x - 1
        vuoro = vuoro + 1
    elif suunta == "a":
        y = y - 1
        vuoro = vuoro + 1
    elif suunta == "s":
        x = x + 1
        vuoro = vuoro + 1
    elif suunta == "d":
        y = y + 1
    else:
        print("väärä suunta")
        vuoro = vuoro + 1
    if x < 0 or y < 0 or x > koko1 or y > koko1:
        print("alue ylitetty")
        break

    uusisijainti = board[x][y]
    board[x][y] = pelaaja
    vastustajamove()  ### MIKSI TÄMÄ EI TOIMI TÄSSÄ
    vastustajasuunta() ### MIKSI TÄMÄ EI TOIMI TÄSSÄ
    uusisijainti2 = board[x1][y1] ###liittyy edellisiin funkkareihin
    board[x1][y1] = enemy ### liittyy edellisiin funkkareihin
    print(vuoro)
    print_board(board)
 
Liittynyt
17.10.2016
Viestejä
14 664
kysymykseni on myös python ketjussa. olen sen verran aloittelija että haen vielä mikä on oikea paikka kysyä.
alla koodini. ja ongelmani on aivan alhaalla kommentoin ongelma kohdan "### *"
Se toinen ketju on ihan hyvä paikka. Yleisenä neuvona: kun joku "ei toimi", niin kerro millä tavalla ei toimi. Eli mitä pitäisi tapahtua, mitä nyt tapahtuu, tuleeko joku virheilmoitus (mikä) jne. "Ei toimi" on yleensä täydellisen hyödytön kuvaus ongelmasta.
 
Liittynyt
06.11.2016
Viestejä
1 786
React useState
Koodi:
onClick={() => setCount(count + 1)}
vs
Koodi:
onClick={() => setCount(prevCount => prevCount + 1)}
Mitä eroa noilla kahdella lähestymistavalla on, molemmat tuntuu toimivan?
 
Liittynyt
17.10.2016
Viestejä
14 664
Mitä eroa noilla kahdella lähestymistavalla on, molemmat tuntuu toimivan?
Eipä juuri mitään. Ensimmäinen vaatii, että sulla on se count tiedossa - eli olet sen aiemmin selvittänyt - jotta voit käyttää sitä setCountin parametrina. Jälkimmäisessä se arvo saadaan suoraan (sisemmän) funktion parametrina. Eli käytä kumpaa haluat.
 
Liittynyt
23.10.2016
Viestejä
658
tarvit loaderin joka pakkaa noi fontit bundlen kyytiin

npm install file-loader

webpack.config.js (rewired: kanssa config-overrides.js)
Koodi:
{
  test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
  use: [
    {
      loader: "file-loader",
      options: {
        name: "[name].[ext]",
        outputPath: "fonts/"
      }
    }
  ]
}
jos kysessä CRA (create-react-app) proju niin tarviit vielä customize-cra ja react-app-rewired plugarit jolla puukotat webpack conffin sisään.
Kiitos vastauksesta. En lähtenyt puukottamaan webpackia. Laitoin SVG:n koodina .jsx:n sekaan, jolloin pystyin hyödyntämään CSS:ssä asetettuja fontteja. Täytyy kyllä varmaan jossain vaiheessa perehtyä vähän tuohon webpackiin. Todella vähän kokemusta siitä, kun tuo CRA on niin kätevä.
 
Liittynyt
23.10.2016
Viestejä
658
Mun sivu pyörii Herokussa ja tietokanta on pilvessä MongoDB Atlas -palvelussa. M0 tier (ilmainen) ei pidä sisällään varmuuskopiointipalveluita. Varmuuskopiointi tulisi hoitaa mongodump-komennolla. Mutta käytännössä miten tämän saisi automatisoitua? Pitäisikö mulla olla joku oma serveri, joka päivittäin ajelee tuota mongodump-komentoa vai pitäisikö tuota mongodumpia ajaa kotikoneelta? En haluaisi maksaa tuosta Atlaksesta. Onko tähän mitään helppoa ja järkevää ratkaisua?

Olisikohan vaan helpointa opetella käyttämään omaa servua, niin ei tarvitsisi säätää näitten palveluiden kanssa. Jo muutaman päivän tässä koittanut tajuta, että miten saan tehtyä cron jobeja Herokussa. Nyt sen sain selvitettyä, mutta oman servun kanssa tuo olisi mennyt helpommin.
 
Liittynyt
16.10.2016
Viestejä
543
Mun sivu pyörii Herokussa ja tietokanta on pilvessä MongoDB Atlas -palvelussa. M0 tier (ilmainen) ei pidä sisällään varmuuskopiointipalveluita. Varmuuskopiointi tulisi hoitaa mongodump-komennolla. Mutta käytännössä miten tämän saisi automatisoitua? Pitäisikö mulla olla joku oma serveri, joka päivittäin ajelee tuota mongodump-komentoa vai pitäisikö tuota mongodumpia ajaa kotikoneelta? En haluaisi maksaa tuosta Atlaksesta. Onko tähän mitään helppoa ja järkevää ratkaisua?

Olisikohan vaan helpointa opetella käyttämään omaa servua, niin ei tarvitsisi säätää näitten palveluiden kanssa. Jo muutaman päivän tässä koittanut tajuta, että miten saan tehtyä cron jobeja Herokussa. Nyt sen sain selvitettyä, mutta oman servun kanssa tuo olisi mennyt helpommin.
Pysy pilvissä vaan ja niiden natiiveissa palveluissa. Sait kuitenkin sen schedulerin toimimaan? Teet jonkun cloud bucketin/storagen jonne dumppaat datat sillä schedulerilla. Noin olisin itsekin tehnyt. Omat VM:t on aika jäätäviä loppujen lopuksi ja niissä sitä säätöä sit onkin. Tietty menee oma aikansa noita pilvipalveluita treenata, mutta se on todella arvokasta tietoa työmarkkinoilla. Jos alkaa Heroku pännii niin AWS ja GCP (app engine, datastore, cloud scheduler) tarjoavat myös vastaavia palveluita ilmaiseksi. Tätähän tää nykyään softakehitys on, että pitää osata myös "infran" hallinta pilvissä.
 
Liittynyt
23.10.2016
Viestejä
658
Pysy pilvissä vaan ja niiden natiiveissa palveluissa. Sait kuitenkin sen schedulerin toimimaan? Teet jonkun cloud bucketin/storagen jonne dumppaat datat sillä schedulerilla. Noin olisin itsekin tehnyt. Omat VM:t on aika jäätäviä loppujen lopuksi ja niissä sitä säätöä sit onkin. Tietty menee oma aikansa noita pilvipalveluita treenata, mutta se on todella arvokasta tietoa työmarkkinoilla. Jos alkaa Heroku pännii niin AWS ja GCP (app engine, datastore, cloud scheduler) tarjoavat myös vastaavia palveluita ilmaiseksi. Tätähän tää nykyään softakehitys on, että pitää osata myös "infran" hallinta pilvissä.
Juu schedulerin sain pystyyn. Käytännössä itse sovelluksen lisäksi lisäsin kaksi dynoa (clock ja worker) Herokuun. Nuo kommunikoi keskenään AMQP:n avulla. Clockiin olen määritellyt ajastukset, eli sinne voin lisätä ajastettuja prosesseja ihan cron-syntaksia käyttäen. Aina kun joku cron-prosessi tikkaa, niin lähtee AMQP:tä käyttäen viesti, jonka vastaanottaa worker-tiedosto JSON-muotoisena. Workerissa olen sitten määritellyt, että mikä npm-scripti ajetaan milläkin viestillä.

Hieman overkilliltä tuo tällä hetkellä tuntuu, mutta skaalautuu mukavasti, jos tarvii lisätä enemmänkin noita taskeja. Hieman hiertää se, että mulla on development ja production versioiden välissä staging-vaihe, jossa tuo mun scheduleri ei toimi. Herokun ilmaisversiossa saa olla maksimissaan kaksi dynoa käytössä, eli saisin vain itse sovelluksen lisäksi ajettua joko workeria tai clockia. Production-serveristä maksan Hobby-pakettia, jolla ainakin nuo kolme dynoa saan samanaikaisesti käyntiin.

Mutta siis voisinko käyttää tuohon tietokannan varmuuskopiointiin vaikka Amazonin S3:a? Mongodump komentoon voi käsittääkseni lisätä --out parametrin, johon sitten laittaisin poluksi S3:n polun tai jotain vastaavaa?
 
Liittynyt
27.05.2019
Viestejä
411
Onko täällä ketään regex-jumalaa joka osais auttaa? Pitäs saada (*tän tyyliset*) kommentit poistettua koodista mahdollisimman monessa tapauksessa, ja nyt jumittaa miten saan sisäkkäiset kommentit hoidettua. Tän hetkinen regex täällä Regex101 - online regex editor and debugger esimerkkeineen ja siis kohta 3 ei toimi. Ja tarvis pysyä tuossa python flavorissa mielellään.
 
Liittynyt
16.10.2016
Viestejä
543
Juu schedulerin sain pystyyn. Käytännössä itse sovelluksen lisäksi lisäsin kaksi dynoa (clock ja worker) Herokuun. Nuo kommunikoi keskenään AMQP:n avulla. Clockiin olen määritellyt ajastukset, eli sinne voin lisätä ajastettuja prosesseja ihan cron-syntaksia käyttäen. Aina kun joku cron-prosessi tikkaa, niin lähtee AMQP:tä käyttäen viesti, jonka vastaanottaa worker-tiedosto JSON-muotoisena. Workerissa olen sitten määritellyt, että mikä npm-scripti ajetaan milläkin viestillä.

Hieman overkilliltä tuo tällä hetkellä tuntuu, mutta skaalautuu mukavasti, jos tarvii lisätä enemmänkin noita taskeja. Hieman hiertää se, että mulla on development ja production versioiden välissä staging-vaihe, jossa tuo mun scheduleri ei toimi. Herokun ilmaisversiossa saa olla maksimissaan kaksi dynoa käytössä, eli saisin vain itse sovelluksen lisäksi ajettua joko workeria tai clockia. Production-serveristä maksan Hobby-pakettia, jolla ainakin nuo kolme dynoa saan samanaikaisesti käyntiin.

Mutta siis voisinko käyttää tuohon tietokannan varmuuskopiointiin vaikka Amazonin S3:a? Mongodump komentoon voi käsittääkseni lisätä --out parametrin, johon sitten laittaisin poluksi S3:n polun tai jotain vastaavaa?
Joo noi pilvistoraget kuten S3 ovat ihan julkisia urleja jonne saa dumpattua dataa http postilla mistä haluat, esim curl. Tietty sulla pitää olla AWS avainpari millä autentikoidut ensiksi. Eikö Herokussa ole mitään omia bucketteja?
 
Liittynyt
26.10.2019
Viestejä
9
Yritän saada toteutettua selaimella tiedonhakua toiselta sivulta ilman serveriä vaativaa php:ta tai muita palvelinpään komponetteja.

Samassa sisäverkossa on Oumannin lämmönsäädin jossa web-liittymä. Kun säätimelle lähettää komennon:

Koodi:
http://192.168.1.8/request?S_227_85
...palauttaa säädin:

Koodi:
request?S_227_85=3.8;?
...jossa 3.8 on ulkolämpötila.

Aikaisemmin olen saanut tarvitsemani tiedon php:lla:

Koodi:
<?php
function hae($url) {
 $data = file_get_contents($url);
 return $data;
}
$teksti = hae("http://192.168.1.8/request?S_227_85");
$lampo = substr($teksti, 16, 4);
echo $lampo;
?>
Nyt kun yritän käyttää JavaSciptiä, esim:

Koodi:
fetch('http://192.168.1.8/request?S_227_85').then (teksti => {
 let lampo = teksti.substr(17,4);
 alert("Ulkolämpötila on: ' + lampo.replace(';', ``));
})
...ei tapahdu mitään. Selaimen konsoli kertoo että "Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.1.8/request?S_227_85. (Reason: CORS header 'Access-Control-Allow-Origin' missing)"

Tämä liittynee JS:n tietoturvaominaisuuksiin. Onko tämä mitenkään kierrettävissä? Lämmönsäätimen palvelinasetuksiin tai koodiin ei luonnollisesti ole pääsyä.

JavaScript ei ole välttämätön, mutta en keksi muutakaan jos erillistä serveriä ei ole käytettävissä.
 
Liittynyt
03.07.2018
Viestejä
347
Jos haluaisin koodata windows 7 ja 10 työpöydälle widgetin joka säilyy siinä aina ja sen kuvake tulee kellotauluun eikä normaalin ohjelma-valikkoon silloin kun on käynnissä,
niin millä open source systeemillä sellaisen voi koodata ?
Niin että koodia voi editoida ja buildata .exe -tiedostoksi, tai jopa asennuspaketiksi ilmaiseksi?
 
Liittynyt
28.10.2016
Viestejä
2 369
Jos haluaisin koodata windows 7 ja 10 työpöydälle widgetin joka säilyy siinä aina ja sen kuvake tulee kellotauluun eikä normaalin ohjelma-valikkoon silloin kun on käynnissä,
niin millä open source systeemillä sellaisen voi koodata ?
Niin että koodia voi editoida ja buildata .exe -tiedostoksi, tai jopa asennuspaketiksi ilmaiseksi?
Varmaan helpointa tehdä tuo ihan Visual Studion ilmaisversiolla ja C#-kielellä.
 
Liittynyt
18.10.2016
Viestejä
272
...ei tapahdu mitään. Selaimen konsoli kertoo että "Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.1.8/request?S_227_85. (Reason: CORS header 'Access-Control-Allow-Origin' missing)"
Jos kyse oli vain sinun selaimesta, niin kokeilepa disabloida tuo: chrome://flags/#out-of-blink-cors

Toinen vaihtoehto, joka voisi toimia on no-cors, eli:
Koodi:
fetch(url, { mode: 'no-cors' })
  .then((response) => response.text())
  .then((text) => {
    ...
  })
  .catch((err) => console.warn(err));


 
Liittynyt
17.10.2016
Viestejä
14 664
Toimisiko jqueryä käyttäen paremmin ehkä ?
get - komennolla
CORS on selaimen ominaisuus. Sillä ei pitäisi olla mitään merkitystä, millä kirjastolla sen requestin tekee. Joko siis se mekanismi kytketään pois (ei hyvä, paitsi omiin testeihin), tai sitten rakennetaan väliin oma palvelin, joka tarjoaa sen data niin, ettei CORS blokkaa pyyntöjä.
 
Liittynyt
23.10.2016
Viestejä
658
Hieman overkilliltä tuo tällä hetkellä tuntuu, mutta skaalautuu mukavasti, jos tarvii lisätä enemmänkin noita taskeja. Hieman hiertää se, että mulla on development ja production versioiden välissä staging-vaihe, jossa tuo mun scheduleri ei toimi. Herokun ilmaisversiossa saa olla maksimissaan kaksi dynoa käytössä, eli saisin vain itse sovelluksen lisäksi ajettua joko workeria tai clockia. Production-serveristä maksan Hobby-pakettia, jolla ainakin nuo kolme dynoa saan samanaikaisesti käyntiin.
Itseasiassa huomasin, että juu saan Hobby-dynossa kyllä lisättyä dynoja muille prosesseille, mutta niistä joutuu maksamaan erikseen. Eli nyt kolmella dynolla hintaa tulee 21€/kk. :btooth: Vähän turhan kallis. Täytyy ruveta katselemaan jos Amazonin puolella pääsisi halvemmalla.

Eikö Herokussa ole mitään omia bucketteja?
Ei näytä olevan. Googlettelin vähän ja Herokusta löytyy addoneita 3rd party data storagejen käyttöön, mutta mitään omaa ratkaisua niillä ei taida olla.
 
Liittynyt
26.10.2019
Viestejä
9
Toinen vaihtoehto, joka voisi toimia on no-cors, eli:
Koodi:
fetch(url, { mode: 'no-cors' })
  .then((response) => response.text())
  .then((text) => {
    ...
  })
  .catch((err) => console.warn(err));
Kokeilin nyt näin:

Koodi:
fetch('http://192.168.1.8/request?S_227_85', { mode: 'no-cors' }).then(teksti => {
    let lampo = teksti.substr(17,4);
    alert('Ulkolämpötila on: ' +
    lampo.replace(';', ''));
})
Mutta nyt konsoli herjaa: "TypeError: teksti.substr is not a function"

Ei tarvitse varmaankaan mainita että JavaScript ei ole minulle tuttu.

 
Liittynyt
06.11.2016
Viestejä
1 786
Kokeilin nyt näin:

Koodi:
fetch('http://192.168.1.8/request?S_227_85', { mode: 'no-cors' }).then(teksti => {
    let lampo = teksti.substr(17,4);
    alert('Ulkolämpötila on: ' +
    lampo.replace(';', ''));
})
Mutta nyt konsoli herjaa: "TypeError: teksti.substr is not a function"

Ei tarvitse varmaankaan mainita että JavaScript ei ole minulle tuttu.
Koodi:
fetch('http://192.168.1.8/request?S_227_85', { mode: 'no-cors' })
.then(res => res.text())
.then(teksti => {
    let lampo = teksti.substr(17,4);
    alert('Ulkolämpötila on: ' +
    lampo.replace(';', ''));
})
Skippasit tuon yhden stepin. Yrität repiä tuosta response oliosta tuota nyt.
 
Liittynyt
18.10.2016
Viestejä
272
Ei mitään.

Tuossa tuli mieleen myös link/import:in käyttäminen tähän tarkoitukseen: https://codepen.io/zvona/pen/XWWgwXK.

Liittyy hieman tuohon edellä mainittuun jQueryn tapaan tuoda ulkoista sisältöä (aikoinaan tehtiin <script src='...'>:llä).
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
Yritän saada toteutettua selaimella tiedonhakua toiselta sivulta ilman serveriä vaativaa php:ta tai muita palvelinpään komponetteja.

Samassa sisäverkossa on Oumannin lämmönsäädin jossa web-liittymä. Kun säätimelle lähettää komennon:

Koodi:
http://192.168.1.8/request?S_227_85
...palauttaa säädin:

Koodi:
request?S_227_85=3.8;?
...jossa 3.8 on ulkolämpötila.

Aikaisemmin olen saanut tarvitsemani tiedon php:lla:

Koodi:
<?php
function hae($url) {
 $data = file_get_contents($url);
 return $data;
}
$teksti = hae("http://192.168.1.8/request?S_227_85");
$lampo = substr($teksti, 16, 4);
echo $lampo;
?>
Nyt kun yritän käyttää JavaSciptiä, esim:

Koodi:
fetch('http://192.168.1.8/request?S_227_85').then (teksti => {
 let lampo = teksti.substr(17,4);
 alert("Ulkolämpötila on: ' + lampo.replace(';', ``));
})
...ei tapahdu mitään. Selaimen konsoli kertoo että "Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.1.8/request?S_227_85. (Reason: CORS header 'Access-Control-Allow-Origin' missing)"

Tämä liittynee JS:n tietoturvaominaisuuksiin. Onko tämä mitenkään kierrettävissä? Lämmönsäätimen palvelinasetuksiin tai koodiin ei luonnollisesti ole pääsyä.

JavaScript ei ole välttämätön, mutta en keksi muutakaan jos erillistä serveriä ei ole käytettävissä.

Javascript ei itsessään blockaile mitään, nykyaikaiset selaimet kylläkin, eli vaihtamalla selimeksi jonku vanhan kikkareen voit toki onnistua.

Phpllä homma toimii koska koodi ajataan palvelimella.

Helpoin homma on kyllä askarrella pikku palvelin kotiin. Joka sitten vain hoitaa pelkät corsit tai jopa askartelet kokonaisen rajapinnan sinne samalla.
 
Liittynyt
19.10.2016
Viestejä
3 427
Helpoin homma on kyllä askarrella pikku palvelin kotiin. Joka sitten vain hoitaa pelkät corsit tai jopa askartelet kokonaisen rajapinnan sinne samalla.
Menee vähän offtopikiksi, mutta black fridayn aikaan on usein ihan hauskoja hostaus-tarjouksia. Maksan pari vuotta sitten otetusta ihan kohtuullisilla spekseillä varustetusta boksista muutaman euron per kolme kuukautta.
 
Liittynyt
26.10.2019
Viestejä
9
nnakulle ja ojisamalle: Käytössä on kyllä oma palvelin ja sitä olen hyödyntänyt tähän asti, mutta haen nyt ratkaisua jossa sitä ei tarvittaisi. Kun tarve on saada vain html-sivu jossa lukee toisaalta haettu ulkolämpötila eikä muuta, palvelimen pystytys sitä varten ei oikein ole järkevää.

Ei mitään.

Tuossa tuli mieleen myös link/import:in käyttäminen tähän tarkoitukseen: https://codepen.io/zvona/pen/XWWgwXK.

Liittyy hieman tuohon edellä mainittuun jQueryn tapaan tuoda ulkoista sisältöä (aikoinaan tehtiin <script src='...'>:llä).
Viitsisitkö vääntää rautalangasta miten sovellan tuota tähän omaan tapaukseeni?
 
Liittynyt
26.10.2019
Viestejä
9
Pohdiskelua...

Kun katson skriptin suoritusta konsolista, on response tyhjä kun alert-ruutu tulee tyhjänä esiin. Heti kun kuittaan ruudun painamalla ok, ilmestyy response sellaisena kun pitääkin.

Ymmärrän tämän niin, että tuo alert suoritetaan liian aikaisin eikä skripti ole vielä ehtinyt saada palautetta. Vai?
 

Starglazer

Tukijäsen
Liittynyt
17.10.2016
Viestejä
3 096
Voi elämä. Mulla on kasa vuodelta nakki exceleitä, joiden päivitys tapahtuu VBA makroilla tyyliin
Koodi:
workbooks.opentext
sheet("lehti")
select
range("A1").select
selection.copy
Nyt iski ongelma, kun Excel päivittyi versioon 2016 etteivät nämä makrot enää toimi, vaan näyttää ettei tiedosto ehdi avautua kunnolla ennen kuin makrot lähtevät rullaamaan eteenpäin. Tulee siis herjaa esimerkiksi "Method 'Visible' of object '_Worksheet' failed. Millä kikalla saisi nuo toimimaan? Osan sain toimimaan todella ammattimaisesti lisäämällä
Koodi:
Application.Wait Now + TimeValue("00:00:01")
avauksen jälkeen mutta onhan tuo nyt ihan idioottimainen tapa korjata vika.
Osaako joku auttaa? Googlesta en oiken saanut irti.
 
Liittynyt
06.11.2016
Viestejä
1 786
Pohdiskelua...

Kun katson skriptin suoritusta konsolista, on response tyhjä kun alert-ruutu tulee tyhjänä esiin. Heti kun kuittaan ruudun painamalla ok, ilmestyy response sellaisena kun pitääkin.

Ymmärrän tämän niin, että tuo alert suoritetaan liian aikaisin eikä skripti ole vielä ehtinyt saada palautetta. Vai?
Kokeilitko tuota Zvonan tapaa? --> chrome://flags/#out-of-blink-cors.
Ja ota se { mode: 'no-cors' } samalla pois siitä kyselystä ja kokeile uudestaan.
 

Starglazer

Tukijäsen
Liittynyt
17.10.2016
Viestejä
3 096
Voi elämä. Mulla on kasa vuodelta nakki exceleitä, joiden päivitys tapahtuu VBA makroilla tyyliin
Koodi:
workbooks.opentext
sheet("lehti")
select
range("A1").select
selection.copy
Nyt iski ongelma, kun Excel päivittyi versioon 2016 etteivät nämä makrot enää toimi, vaan näyttää ettei tiedosto ehdi avautua kunnolla ennen kuin makrot lähtevät rullaamaan eteenpäin. Tulee siis herjaa esimerkiksi "Method 'Visible' of object '_Worksheet' failed. Millä kikalla saisi nuo toimimaan? Osan sain toimimaan todella ammattimaisesti lisäämällä
Koodi:
Application.Wait Now + TimeValue("00:00:01")
avauksen jälkeen mutta onhan tuo nyt ihan idioottimainen tapa korjata vika.
Osaako joku auttaa? Googlesta en oiken saanut irti.
Yksi päivitysmakro alkoi toimimaan kun lisäsin workbooks.open perään UpdateLinks := True, mutta toinen ei. Erikoista.
 
Liittynyt
26.10.2019
Viestejä
9
Kokeilitko tuota Zvonan tapaa? --> chrome://flags/#out-of-blink-cors.
Ja ota se { mode: 'no-cors' } samalla pois siitä kyselystä ja kokeile uudestaan.
Kokeilin heti ensimmäisenä. Ja se ei auttanut, CORS-herja ei poistunut. Mutta tuo mode- ratkaisi tämän.

Nyt vain pitäisi saada tuo response tallennettua muuttujaan, mutta se ei näytä onnistuvan :-(
 
Liittynyt
18.10.2016
Viestejä
272
Kokeilin heti ensimmäisenä. Ja se ei auttanut, CORS-herja ei poistunut. Mutta tuo mode- ratkaisi tämän.

Nyt vain pitäisi saada tuo response tallennettua muuttujaan, mutta se ei näytä onnistuvan :-(
Tuolla toteutettuna sekä fetchilla että importilla: https://codepen.io/zvona/pen/jOOazxW?editors=1010

Ainoana erona se, että tuossa ei no-cors -modea voi käyttää, koska vastaava palvelin nimenomaan olettaa corsia (näin käsittääkseni)
 
Toggle Sidebar

Statistiikka

Viestiketjut
239 551
Viestejä
4 190 430
Jäsenet
70 766
Uusin jäsen
Kotitie

Hinta.fi

Ylös Bottom