- Liittynyt
- 17.10.2016
- Viestejä
- 15 731
Share ja imgur tulevat tuolta imgurista mukaan. Avaa tuo linkki niin näet pelkän kuvan.
Katos perkelettä! Sillähän noi ongelmat korjaantuivat
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.
Share ja imgur tulevat tuolta imgurista mukaan. Avaa tuo linkki niin näet pelkän kuvan.
Tuon SuomiSF-tekstin olisi siis tarkoitus olla jonkunlainen kuva/logo.
Mutta totta, tuon otsikon poistaminen paransi kyllä ulkoasua.
Siis miten tarkoitat? Pystysuuntainen valikko tuohon tekstin viereen? Tuon olisi tarkoitus olla sama kaikilla sivuilla. Muutama sivu, noissa on vielä vanhan näköinen valikko:
Jotain tällaista?
Mitkähän apinat näitä komponentteja mahtaa tehdä?
React Routerissa oli sitten jostain syystä vaihdettu useHistory useNavigateksi v6:ssa. Nähdäkseni toiminta ei ei muuttunut mitenkään. Eli kaikki tuota käyttäneet softat meni rikki, ja netti on nyt täynnä ohjeita, jotka eivät enää päde. Saahan siinä ihmetellä kun edes maaliskuussa tehty ohje redirectistä ei enää toiminut.
Silloin varmaan lähdetään tekemään suoraan v6 dokumentaation pohjalta.Ja muuten, miten nuo muutosdokumentit auttavat jos lähtee suoraan tekemään v6:lle?
Kyllä ne on yksiä v*tun apinoita, jotka rikkovat huvikseen rajapintoja.
We recommend waiting for the backwards compatibility package to be released before upgrading apps that have more than a few routes.
ehkä minä olen sitten sitä porukkaa, jolla on ihan riittävästi tekemistä ilman että pitää keksiä tällaisia lisähommia muille koodaajille
Mikään ei estänyt jättämästä sitä vanhaa interfacea vaikka "deprecated"-leimalla tuonne.
Yhä edelleen se apina on devaaja, joka päivittää lukematta dokumentaatiota ja release noteseja.
Jos joku on tosiaan sitä mieltä, että rajapintojen summittainen rikkominen on ok
Autentikaatiohomma ratkesi sillä, että potkin keksipurkin nurin. Nyt autentikaatiotokeni menee headerissä sekä sovelluksen että Postmanin kanssa. Ja nimenomaan piti flask_jwt_extended konffata niin, että se ei etsi keksipurkista noita tokeneita.
const personToKeyValue = (arr: IPerson[]): KeyValuePair[] => {
let retval: KeyValuePair[] = [];
arr.map(item => retval.push({ id: item.id, value: item.name }));
return retval;
}
const genreToKeyValue = (arr: IGenre[]): KeyValuePair[] => {
let retval: KeyValuePair[] = [];
arr.map(item => retval.push({ id: item.id, value: item.name }));
return retval;
}
const convToForm = (short: IShort): IShortForm => ({
authors: {() => short.authors.map(author => {id: author.id, name: author.name})}
})
Joo, tässä tapauksessa tosiaan voisi tehdä noin, mutta ajattelin siis geneeristä funktiota. Jos en määrittele tyyppiä, niin kääntäjä marmattaa että items on any-tyyppiä, se ei siis osaa päätellä tyyppiä. Tuo on minusta vähän heikkoa suorittamista, koska pitäisihän sen minusta olla mahdollista.
Genericit vaativat joka tapauksessa näköjään opettelua. Ei ole omassa historiassa hirveästi tarvinnut, lähinnä C++:n templateja jonkun verran. Haskellissa homma toimii sitten ihan eri tavalla (enkä voi väittää että sitäkään osaisin), siinä oli esimerkiksi hyvin toimivat polymorfiset funktiot.
// Generic Constraints for TypeScript: https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-constraints
interface KeyValueType {
id: string;
value: string;
}
// Enforce that objects will have a id and name attributes
interface HasIdAndName {
id: string;
name: string;
}
// Map from any type T that has attributes id and name into a object implementing KeyValueType
const extractKeyValueMappings = <T extends HasIdAndName>(xs:T[]): KeyValueType[] => xs.map(x => ({ id: x.id, value: x.name }));
// OK
console.log(extractKeyValueMappings([{ id: "me", name: "2", extra: "this does not matter" }]));
// ERROR
console.log(extractKeyValueMappings([{ id: "me", name: 2 }]));
// ~~~~~
// Type 'number' is not assignable to type 'string'.ts(2322)
// ERROR
console.log(extractKeyValueMappings([{ id: "me", value: "2" }]));
// ~~~~~~~~~~
// Type '{ id: string; value: string; }' is not assignable to type 'HasIdAndName'.
// Object literal may only specify known properties, and 'value' does not exist
// in type 'HasIdAndName'.ts(2322)
// ERROR
console.log(extractKeyValueMappings([{ id: "me" }]));
// ~~~~~~~~~~~~
// Property 'name' is missing in type '{ id: string; }' but required in type 'HasIdAndName'.ts(2741)
FROM node:latest
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json .
RUN mkdir -p ./node_modules
RUN chown -R node:node ./node_modules
RUN npm config set unsafe-perm true
RUN npm install --force
RUN npm install -g react-scripts
COPY . .
CMD ["npm", "start"]
/usr/local/lib/node_modules/react-scripts/node_modules/resolve/lib/sync.js:34
throw e;
^
Error: EACCES: permission denied, stat '/root/.node_modules'
at Object.statSync (node:fs:1590:3)
at isDirectory (/usr/local/lib/node_modules/react-scripts/node_modules/resolve/lib/sync.js:31:23)
at loadNodeModulesSync (/usr/local/lib/node_modules/react-scripts/node_modules/resolve/lib/sync.js:200:17)
at Function.resolveSync [as sync] (/usr/local/lib/node_modules/react-scripts/node_modules/resolve/lib/sync.js:107:17)
at getModules (/usr/local/lib/node_modules/react-scripts/config/modules.js:119:32)
at Object.<anonymous> (/usr/local/lib/node_modules/react-scripts/config/modules.js:142:18)
at Module._compile (node:internal/modules/cjs/loader:1159:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
at Module.load (node:internal/modules/cjs/loader:1037:32)
at Module._load (node:internal/modules/cjs/loader:878:12) {
errno: -13,
syscall: 'stat',
code: 'EACCES',
path: '/root/.node_modules'
}
En ihan ymmärrä tuota loppua ja mitä on muutosten vieminen toiseen suuntaan, mutta kontitettua softaa kehitetään muilta osin ihan niin kuin muutakin softaa, jota ei julkaista konttina, mutta julkaisuprosessiin vaan kuuluu itse sovelluksen buildauksen lisäksi uuden kontti-imagen buildaus ja pusku repositorioon, josta se saadaan haetuksi ajoympäristöön.Mutta sitten heräsi sellainen kysymys, että miten kontitettua softaa kehitetään? Näyttää ainakin tästä Dockerista (v 20.10.21) puuttuvan --keep-git-dir, joten muutosten vieminen toiseen suuntaan on vähän kinkkistä.
Ei välttämättä, jos on vaikka useampi kone, jossa kehittää. Tuossa just viime viikolla tein simppelimmän kontin, jossa ristiinkäännetään ARM-koodia. Ei niitä työkaluja tarvitse olla valmiina koneessa (vrt. vaikka osana CI-putkea).Pitäähän sulla yleensä olla softan tarvitsemat riippuvuudet lokaalistikin, että näet, että sovellus ylipäätään buildaantuu, ennen kuin sitä voi lähteä laittamaan konttiin. Ja nuo softan tarvitsemat riippuvuudet ei oo Dockerfilen asioita, vaan ne hallitaan sen itse sovelluksen tasolla ja yleensä jollain omalla build-työkalullaan (Noden tai Reactin kanssa se lienee tuo npm ja esim. Javan kanssa Maven tai Gradle).
Sit jos jonkun sovelluksen buildaaminen (tai ajaminen) tarvii semmoisia työkaluja, joita ei käytetyssä pohjaimagessa ole, niin ne tarvii asentaa erikseen Dockerfilessä ennen käyttöä. Kannattaa varmaan kattoa vähän jotain tutoriaalia konteista ja Dockerfilen rakentamisesta.
Miten nuo oikeudet oikein tarkistetaan? En nimittäin hiffaa, kun buildaan tuon, niin menen konttiin sisälle niin sieltä ei tunnu löytyvän noita lisäosia, esimerkiksi node_modules -kansiota ei löydy, vaikka buildivaiheessa kaikki tuntuu onnistuvan.Global react-scripts tarpeellinen, oikeudet? Dockerfile ja compose ladataan gittiin normaalisti, josta muut saa alustasta riippumatta saman kehitysympäristön/palvelimen.
CI-putket on asia ihan erikseen. Minä ymmärsin, että haluat vaan saada lokaalisti kehitettävän ja yksinkertaisen React-sovelluksen buildatuksi ja laitettua konttiin.Ei niitä työkaluja tarvitse olla valmiina koneessa (vrt. vaikka osana CI-putkea).
React scripts globaalisti asennettu kehitys koneessa, eikä package.json tiedostossa?En näköjään ymmärtänyt tuota vastausta. Jos otan tuon pois, niin tulee "sh: 1 react-scripts: not found" ja sama tulee ilman -g -parametriä.
npm install react-scripts
npm install typescript --save-dev
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install nodejs
npm install --save react react-dom @types/react @types/react-dom
npm install
src/
- components
- features
- Person
- index.js
- api
- PersonRoutes.tsx
- components
- forms
- PersonForm.tsx
- routes
- PersonPage.tsx
- types
- index.tsx
- services
- services
- utils
import { foo } from "../../../components/bar";
import { foo } from "@components/bar";