- Liittynyt
- 19.10.2016
- Viestejä
- 4 614
Eikös sen voi push masteriin?
Toisaalta, tulkitsenko oikein, että originissa olisi haluttu versio, ja revertoitavaa tauhkaa vain lokaalisti?
Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Eikös sen voi push masteriin?
git branch tmp
git checkout master
git merge tmp
git brach -d tmp
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.
Yleensä taidetaan suosia pieniä ja usein tehtäviä committeja isojen refaktorointien ja kokonaisten vaatimusten toteuttamisen sijaan.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.
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.
Yleensä taidetaan suosia pieniä ja usein tehtäviä committeja isojen refaktorointien ja kokonaisten vaatimusten toteuttamisen sijaan.
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.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.
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."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.
<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>
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?
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: [
{
loader: "file-loader",
options: {
name: "[name].[ext]",
outputPath: "fonts/"
}
}
]
}
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.en saanut while loopissa funktiota toimiaan. miten loopin sisälle voi laittaa funktion vai onko edes mahdollista siirtyä kesken loopin funktioniin?
"""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)
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 "### *"
Mitä eroa noilla kahdella lähestymistavalla on, molemmat tuntuu toimivan?
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ä.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.
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ä.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.
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ä.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ä.
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?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?
Toimii täydellisesti, useampi ajo ei haittaa! Kiitos paljon!Näköjään Python ei oletuksena tue rekursiota suoraan, mutta sain sen mätsäämään niihin kaikista sisäkkäisimpiin kommentteihin. Ehkä pystyt ajamaan sen useampaan kertaan? Tai vielä parempi, jos joku muu onnistuu sen tekemään tämän pohjalta.
Regex101 - online regex editor and debugger
http://192.168.1.8/request?S_227_85
request?S_227_85=3.8;?
<?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;
?>
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(';', ``));
})
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?
...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)"
fetch(url, { mode: 'no-cors' })
.then((response) => response.text())
.then((text) => {
...
})
.catch((err) => console.warn(err));
Yritän saada toteutettua selaimella tiedonhakua toiselta sivulta ilman serveriä vaativaa php:ta tai muita palvelinpään komponetteja.
Toimisiko jqueryä käyttäen paremmin ehkä ?
get - komennolla
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.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.
Vähän turhan kallis. Täytyy ruveta katselemaan jos Amazonin puolella pääsisi halvemmalla.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.Eikö Herokussa ole mitään omia bucketteja?
Kokeilin nyt näin: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));
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(';', ''));
})
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.
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.
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ä.
Helpoin homma on kyllä askarrella pikku palvelin kotiin. Joka sitten vain hoitaa pelkät corsit tai jopa askartelet kokonaisen rajapinnan sinne samalla.
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ä).
workbooks.opentext
sheet("lehti")
select
range("A1").select
selection.copy
Application.Wait Now + TimeValue("00:00:01")
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?
Yksi päivitysmakro alkoi toimimaan kun lisäsin workbooks.open perään UpdateLinks := True, mutta toinen ei. Erikoista.Voi elämä. Mulla on kasa vuodelta nakki exceleitä, joiden päivitys tapahtuu VBA makroilla tyyliin
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:workbooks.opentext sheet("lehti") select range("A1").select selection.copy
avauksen jälkeen mutta onhan tuo nyt ihan idioottimainen tapa korjata vika.Koodi:Application.Wait Now + TimeValue("00:00:01")
Osaako joku auttaa? Googlesta en oiken saanut irti.
Kokeilin heti ensimmäisenä. Ja se ei auttanut, CORS-herja ei poistunut. Mutta tuo mode- ratkaisi tämän.Kokeilitko tuota Zvonan tapaa? --> chrome://flags/#out-of-blink-cors.
Ja ota se { mode: 'no-cors' } samalla pois siitä kyselystä ja kokeile uudestaan.
Tuolla toteutettuna sekä fetchilla että importilla: https://codepen.io/zvona/pen/jOOazxW?editors=1010Kokeilin 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 :-(
Herjasi Corsista. Poistin kommentit 'no-cors' rivin edestä, niin suoritti skriptin, mutta alertissa lukee: "with Fetch:" eikä muuta.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)
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?
Käytämme välttämättömiä evästeitä, jotta tämä sivusto toimisi, ja valinnaisia evästeitä käyttökokemuksesi parantamiseksi.