Kebmans blogg

Arma 3: Fyll bensin på ditt helikopter

Posted in Data, Programmering, Scripting, Spill by kebman on 28/09/2013

En enkel oppskrift på hvordan kode fylling av drivstoff på ditt helikopter i Arma 3.

Forhåndskunnskaper: Du må minimum kunne plassere objekter ved hjelp av editoren i spillet. Hvis du ikke kan det enda, se her: http://www.youtube.com/watch?v=oN8s58xEi0k
Ellers er prosessen forklart veldig nøye. Teskje-metoden here we come! 😀

Oppskrift

Åpne opp kartet du har lyst å jobbe med og plasser enten en player eller et helikopter som du gjør til player.
Gi helikopteret navnet myHeli. Lagre kartet med Mission Name «Trigger» og som User Mission.

Plasser så en trigger (finnes under flagg-ikonet).
Sett størrelsen slik at det passer med landingsplassen din.
Pass også på at den er satt til Repeatedly og at enten din gruppe, eller alle, kan trigge den.
Repeatedly betyr ganske enkelt at du kan bruke triggeren til å fylle bensin så mange ganger du måtte ønske.

I boksen Condition, skriv følgende kode:

({getPosATL _x select 2 < 0.1} count thisList) > 0 && fuel myHeli < 0.9;

Forklaring av koden

Den første delen av koden gjør at triggeren kun fyrer av om helikopteret er under 0,1 meter over bakken (Merk: i USA bruker de punktum for å skille mellom desimaler, mens vi bruker komma her i Norge).
Den andre delen av koden (etter &&) gjør at triggeren kun fyrer av om helikoptere har under 90 prosent drivstoff i tanken.

getPosATL finner plassering og høyde over land. Det kommer som en array _x bestående av posisjonskoordinatene 0=X, 1=Y og 2=Z.
Vi er selvsagt bare interessert i høydevektoren Z, derfor står select 2 der.
For at det ikke skal fylles drivstoff før helikopteret står på bakken, vil ikke «listen» bli telt som 1 før høyden er under 0,1 meter over land.

I tillegg vil ikke triggeren skyte av før helikopteret har under 90 prosent drivstoff.
&& står simpelten for en logisk «og», som betyr at begge delene av kondisjonalen må være sann før triggeren fyrer av. Det holder ikke at bare én av dem er det.

I boksen On Act (On Activation), skriv følgende kode:

nul = [] execVM "fuel.sqf";

Forklaring til koden

Dette lager en null-array, fordi det av en eller annen grunn kun kan kjøres fra en sånn… Og execVM kjører ganske enkelt filen fuel.sqf.

Denne filen finnes naturlig nok ikke enda, derfor er det på tide at du starter opp din beste tekst-editor (Notepad++, f.eks., men vanlig Notisblokk funker også).

I tekst-editoren, skriv inn følgende skript:

heliFuel = fuel myHeli;
addFuel = 0.1;
while {heliFuel < 1.0} do {
     myHeli setfuel heliFuel + addFuel;
     addFuel = addFuel + 0.1;
     sleep 0.2;
};

Lagre skriptet som fuel.sqf i mission-folderen. Denne ligger vanligvis på C:\Users\DittBrukernavn\Documents\Arma 3\missions\Trigger.Map . I alle fall gjelder det Windows 7
For alt jeg vet har du den på D-disken. Bytt i så fall C: ut med D:. DittBrukernavn bytter du selvfølgelig med ditt brukernavn.
.Map er det kartet du har valgte, enten Stratis, Altis eller et annet kart.

Forklaring av skriptet

heliFuel = fuel myHeli lagrer simpelten hvor mye drivstoff helikopteret har igjen i tanken i variabelen heliFuel.
addFuel lagrer hvor mye som skal fylles hver gang skriptet slår en ny løkke. Det definerer altså hvor fort tanken fylles opp. Jo høyere tall, jo fortere går det, men det er ingen grunn til å sette tallet over 1, siden 1 er normalisert til å bety «full tank».
while-løkken kjører så lenge det er plass til mer drivstoff i tanken (så lenge heliFuel er under 1), men ikke noe mer enn det.
Inni while-løkken, legger setfuel ganske enkelt den eksisterende mengden drivstoff (heliFuel) sammen med ny mengde drivstoff (addFuel).
sleep pauser ganske enkelt løkken så mange sekunder det er angitt (0,2 sekunder i dette tilfellet).

Som du ser er det et ganske lite skript. Kanskje tenker du da at det kunne vært i kondisjonal-feltet i triggeren. Grunnen til at det ikke kan være der, er fordi triggeren ikke godtar pauser. Det er kun mulig i eksterne skript, derfor trenger det å være i sin egen fil.

Valgfritt

Om du vil at det skal se ekstra bra ut, plasser også ut et helipad-objekt under triggeren fra Empty > Objects (Signs).
Det er nemlig litt lettere å finne igjen trigger-området i spillet om du også har en synlig landingsplass assosisert med den. 😉

Reklamer

SMPTE-synkronisering på GitHub

Posted in Data, Filmredigering, Internett, Programmering, Programvare, Scripting, Teknologi, Video by kebman on 13/05/2013

Endelig har jeg oppdaget GitHub og lagt ut mitt første prosjekt der. Driver på med et videoprosjekt nå, men jeg fikk noen problemer med SMPTE-koder (tidskoder for video) som ikke stemte med hverandre da jeg logget. Først sjekket jeg ut noen programmer, men de dugde ikke, så da bare satte jeg i gang å lage min egen kode.

Sjekk det ut her: https://github.com/kebman/Simple-SMPTE-class-in-PHP

Norske tegn med HTML

Posted in Design, Hobby, Internett, Scripting, Teknologi, Typografi, Webdesign by kebman on 02/07/2012

Mange har problemer med å få norske tegn og bokstaver første gangen de koder HTML. Med HTML5 er løsningen enklere enn noen gang.

Basiskoden for å få gyldig HTML5 ser slik ut:

<!DOCTYPE html>
<html>
<head>
	<title>Min tittel</title>
</head>
<body>
	<p>Min første hjemmeside.</p>
</body>
</html>

Kodetabell

Men fortsatt ser de norske bokstavene skikkelig rare ut når du åpner HTML-filen i en nettleser. Det kommer av et eldgammelt problem med datamaskinene; at de var laget kun for det engelske alfabetet. For å korrigere problemet, laget produsentene ekstra kodetabeller som også inneholdt europeiske tegn – deriblant vår egen æ, ø og å – men nettleserne tar bare høyde for disse om du fysisk angir riktig kodetabell med HTML-kode.

Du angir riktig kodetabell ved å legge inn følgende HTML-kode i hodet av HTML-dokumentet ditt:
<meta charset="utf-8" />

Hele HTML-koden vil da se slik ut:

<!DOCTYPE html>
<html>
<head>
	<title>Min tittel</title>
	<meta charset="utf-8" />
</head>
<body>
	<p>Min første hjemmeside.</p>
</body>
</html>

Her er kodetabellen UTF-8 fra Unicode brukt. Dette er den kodetabellen som har har de vanligste europeiske tegnene i seg, og derfor også den kodetabellen som er mest utbredt.

Feilsøking

Om norske tegn fortsatt vises feil er det stort sett en av to grunner til det:

  1. Det er ikke angitt noen kodetabell i HTML-koden, eller feil tabell er angitt.
  2. Filen er lagret med en annen kodetabell enn den du har satt i HTML-koden i tekstredigeringsprogrammet du har brukt.

Selv om du angir riktig kodetabell i HTML-koden, hjelper det ikke om du har lagret selve datafilen med feil kodetabell i redigeringsprogrammet. Noen redigeringsprogram har en fast kodetabell de bruker, men i de fleste programmene kan du angi hvilken kodetabell selve datafilen din skal lagres med. Pass på at det da at du har valgt UTF-8, eller Unicode (UTF-8) som tegnformat før du lagrer filen. Hvor du endrer det, er forskjellig fra hvilket program du bruker, men som regel finnes det i innstillingene.

I redigeringsprogrammet jeg bruker, TextWrangler, er det angitt på barren under tekstredigeringsvinduet, og det er bare å klikke på teksten, så kommer det en liste med alle kodetabellene jeg måtte ønske.

Tegnkoding i xHTML

Med xHTML er det litt mer plunder å få norske tegn.

For det første, trenges XML-versjon sammen med kodetabell helt øverst i dokumentet, før !DOCTYPE, slik:
<?xml version="1.0" encoding="UTF-8"?>

Og endelig må det velges riktig kodetabell for HTML-koden i hodet, slik:
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

Hvordan gjøre ordsøk i MySQL

Posted in Programmering, Programvare, Scripting, Teknologi by kebman on 25/02/2012

Så du trenger å søke etter ord i databasen din? Her er noen kjappe eksempler på hvordan du kan gjøre det.

Fulltext-søking er kanskje den greieste måten å søke etter ord i SQL-databaser. Det er veldig kjapt og fungerer bra så lenge ordet er lenger enn tre bokstaver. Grunnen til dette er at det krever ekstra kapasitet å indeksere kortere ord, spesielt om de opptrer ofte. Slik bruker du fulltext-søk:

SELECT * FROM tabell
WHERE MATCH(felt)
AGAINST('søkeord' IN BOOLEAN MODE);

Men hva om du ønsker å søke etter ord med færre enn fire bokstaver? Vel, her er noen alternativer.

Ved å bruke LIKE kan du søke etter felter som inneholder ditt søkeord, enten det er del av større ord eller ikke. Du får som regel ganske mange treff med denne, og det er ikke like kjapt som Fulltext-søk.

SELECT * FROM tabell
WHERE felt
LIKE '%søkeord%';

Eksperimenter med å fjerne prosenttegn foran eller bak. Prosenttegnet fungerer som et «wildcard» eller en joker, og betyr «hvilken som helst tegn».

Men kanskje du bare vil ha hele ord som står alene? Prøv i så fall regular expressions.

SELECT * FROM tabell
WHERE felt
REGEXP '[[:<:]]søkeord[[:>:]]';

Merk at denne vil også gi treff på ord som har bindestrek foran eller bak. En annen hake er at regular expressions kan være litt tregt fordi det krever en del ekstra prosesseringskraft. Det er ikke alltid det er så viktig, men skal du lage noe som er stort og blir hyppig brukt av svært mange brukere, risikerer du fort at forsinkelsene blir merkbare.

Vil du kun ha helt enslige ord, må du søke etter ord som har mellomrom foran og bak. Prøv i så fall denne:

SELECT * FROM tabell
WHERE Locate('søkeord ', felt) > 0
AND Locate(' søkeord', felt) > 0;

Legende:

  • tabell: Databasetabellen du ønsker å søke i
  • felt: Feltet i tabellen som du ønsker å søke i
  • søkeord: Søkeordet du ønsker å bruke

Problem med dobbellagring av filer

Posted in Programmering, Programvare, Teknologi by kebman on 23/07/2010

For hvert uerstattelig bilde jeg tok, måtte det tas backup. Siden jeg ikke var så nøye med hvordan jeg gjorde det, har det endt opp i et bildekaos som bare tar mer og mer plass på harddiskene mine. Her er hvordan jeg er i ferd med å løse problemet.

Sjekk også Organisering: Nøkkelen til fotografisk lykke.

Jeg har lenge hatt proble med dobbellagring av filer, spesielt siden jeg driver med foto og jeg tar backup i hytt og pine. Dette har utviklet seg til et reelt problem som tar opp svært mye diskplass, uten at det er lett å gjøre noe med av redsel for å slette filer jeg egentlig har lyst å beholde. Løsningen er selvfølgelig programvare som finner duplikater og dobbellagrede filer, men det var lettere sagt enn gjort å finne.

Gjør det selv

Jeg har lett litt rundt, men ikke funnet noen produkter som gjør akkurat det jeg ønsker på en tilfredsstillende måte. Min kompis Lars Thomas sa at det ikke var noe problem for en kar som meg, og at jeg bare fikk skrive programmet selv. «Hehehehe» var alt jeg klarte å svare på det, men siden det nå tross alt er ferie tok jeg faktisk på meg utfordringen.

Siden jeg er i den heldige situasjon å jobbe på et UX-basert system* (Mac OS X) med Perl forhåndsinstallert, skriptingspråket som også kalles «The Swiss Army Chainsaw», satte jeg i gang med det. Til nå har dette egentlig bare vært en glede å holde på med.

De nødvendige steg

Å komme frem til et program som presenterer dobbellagrede filer har mange mindre steg. Det aller første man må gjøre er å finne ut hvordan man åpner ei fil og sjekker innholdet. Så er det jo greit å kunne få ei liste over filene i ei mappe, for eksempel, slik at man kan åpen alle filene. Deretter må man finne ut hvordan man sammenligner disse på mest mulig effektiv måte.

Sjekk summen

Tilfeldigvis finnes det allerede små programmer som lager sjekksum (checksum) av filer, og forhåndssintstallert med de fleste UX-systemer er MD5. De er egentlig ment for å sjekke at en fil som ble sendt over nett ikke har blitt ødelagt på veien ved å lage en sjekksum utav fila. Er sjekksummen den samme som da den ble sendt, er ingenting forandret i filen. Samme teknikken kan brukes til å finne duplikater. Istedenfor at man prøver å sammenligne hele filer opp mot hverandre, som er upraktisk siden noen filer er svære, kan man bare sammenligne sjekksummen. Har man to filer med samme sjekksum, er sjansen stor for at det er dobbellagring ute og går.

Under er scriptet jeg har har fått til så langt. Alt du lurer på står kommentert i grått. Jada, vet det er overkommentert, men da lærer du lettere.

Perl-skriptet:

#!/usr/bin/perl
# Lager sjekksum av alle filene i en mappe, og printer dem til skjerm.

use strict;
use warnings;
use Digest::MD5 qw(md5_hex); # Importerer MD5 biblioteket. Tingen som gjør det mulig å lage sjekksum av filer.
use Cwd; # Dette biblioteket importeres for bedre kontroll over mappevisning.
#
# Håndtering av mapper:
#
opendir(DIR, "."); # Åpner mappen du er i.
# my @files = readdir(DIR); # lister opp ALLE filene, inkludert ./ og ../.
# my @files = grep(/\.$filetype$/,readdir(DIR)); # Mulighet for å lese kun filer av type $filetype. Kommentert ut. Variabelen $filetype må også deklareres om det skal funke siden vi bruker "strict".

my @files = grep( -f ,readdir(DIR)); # Lister opp alle filer, unntaken mapper og symbolske lenker. De sistnevnte forhindres av UNIX-kommandoen "grep -f", som du også kan kjøre fra terminalen, f.eks med en pipe når du bruker UNIX-kommandoen "ls" (samme som "dir" i DOS, altså å liste opp filene i en mappe).
closedir
(DIR); # God praksis.
# Deklarerer variabler siden vi bruker "strict":
my $file; # For øyeblikket tom, men vil bli fylt for hvert element i arrayen @file_liste ettersom den blir loopet igjennom.
my $pwd = &Cwd::cwd()."/"; # Får tak i den fulle statiske adressen (tråden/path) til mappen du er i. Ekvivalenten til UNIX-kommandoen "pwd".
#
# Håndtere sjekksummering av filer:
#
foreach $file (@files) { # Loop igjennom alle filene i nåværende mappe (directory).
   open(FILE, $file) or die "Får ikke åpnet '$file': $!"; # Åpne hver fil.
   binmode(FILE); # Åpne hver fil som binærdata.

   my $md5 = Digest::MD5->new; # Opprette en ny metode for sjekksummering av en fil, så lenge (while) slutten av datastrømmen enda ikke er nådd.
   while (<FILE>) {
      $md5->add($_);
   }
   close(FILE); # Alltid god praksis.
   print $md5->b64digest, " $pwd$file\n"; # Print MD5 sjekksum til skjerm for hver fil i arrayen @file_list.
}
Creative Commons License
Checksum Files in Dic by Kebman is licensed under a Creative Commons Attribution 3.0 Unported License.

Alt skriptet gjør til nå er å åpne mappen skript-filen ligger i, lese igjennom alle filene, lage en sjekksum av dem med MD5, og skrive resultatet til skjermen. Intet mer. Men i alle fall kan det brukes til å finne duplikater i samme mappe ved å inspisere sjekksummene.

Resultatet blir seende slik ut når du kjører det fra terminalen:

MacBook-Pro-usr:checksum_test usr$ perl Checksum_Files_in_Dic.pl
N03psjKibdP/7GV3itPLXw /Users/usr/dup_test/23.txt
tTE3ieMQOwLCyaRtWenETg /Users/usr/dup_test/24.txt
N03psjKibdP/7GV3itPLXw /Users/usr/dup_test/3 en.txt
c4kPP/IdNgVZcbwYN9HjeA /Users/usr/dup_test/4 en.txt
nF0fIWxHfWb5NPbytia0cg /Users/usr/dup_test/5.txt
N03psjKibdP/7GV3itPLXw /Users/usr/dup_test/99.data.txt

En bedre versjon ville istedenfor skrevet resultatene fra alle valgte mapper til en database, gjort en sammenligning der, og så kun printet eventuelle duplikater til skjerm. En liten database holder, som f.eks SQLite, som også allerede er installert på de fleste Mac-er.

Føl deg fri til å stjele Perl-koden min og bruke den som du måtte ønske. 🙂 Den er CC-lisensiert for fri bruk av både private og kommersielle aktører.

* UX-basert system er et system basert på operativsystemet UNIX. Dette systemet har mange avarter. Mest kjent er kanskje Linux, men det gjelder også Mac OS X og mange flere.