- Na webu https://www.denondj.com/downloads v sekci STAND ALONE DJ SYSTEMS > PRIME 4
- stáhneme nejnovější firmware ( Firmware update (USB Updater) ) – budeme aktualizovat přes USB flash disk
- stažený .zip rozbalíme – v rozbalené složce bychom měli najít soubor s příponou .img
- Zkopírujte soubor xxxx.img do kořenové složky USB flešky naformátované do: exFat nebo Fat32
- Takto připravenou flešku vložte do PRIME 4 a zapneme přehrávač
- Po zapnutí držte 2 vteřiny tlačítko VIEW
- Klepněte na sekci UTILITY
- Přejeďte dolů a vyberte volbu: UPDATE FIRMWARE, poté potvrďte volbou REBOOT a potvrďte provedení aktualizace
- Nyní se přehrávač aktualizuje, neodpojujte ho od napájení
- Po dokončení aktualizace se restartuje restartuje a spustí s novým firmwarem
Nette ajax – Naja
Načítání obsahu webových stránek bez nutnosti obnovení stránky prostřednictvím AJAXového volání je dnes běžnou praxí.
Zavést toto funkčnost web postaveném na Nette frameworku, je velice jednoduché a rychlé. Ukážeme si jak na to s ajaxovou knihovnou s názvem Naja. Pokud děláte úplně nový projekt, doporučuji Nette 3.0, zapomeňte na nette.ajax.js ale rovnou použijte Naju. Nette,ajax.js je již „hotový“ a dál se nevyvijí. Naja je jeho nástupce.
Instalace a zprovoznění Naja knihovny
npm install naja –save-dev
Pro sloučení všech js souborů a jejich minifikaci používám Gulp. V Gulp tasku přidáme Naja.js do našeho jednoho velkého minifikovaného main.min.js souboru:
var uglify = require('gulp-uglify-es').default;
//…..
gulp.task('jsMain', done => {
gulp
.src(['node_modules/jquery/dist/jquery.min.js',
'node_modules/popper.js/dist/umd/popper.min.js',
'node_modules/bootstrap/dist/js/bootstrap.min.js',
'node_modules/tether/dist/js/tether.min.js',
'node_modules/naja/dist/Naja.js',
'venor/nette/forms/src/assets/netteForms.min.js',
'src/js/main.js'], {allowEmpty: true})
.pipe(uglify({
mangle: false,//disable rename variables and functions
}))
.pipe(concat('main.min.js'))
.pipe(gulp.dest('www/js'));
done();
});
TIP: je potřeba použít knihovnu gulp-uglify-es ( gulp-uglify nestačí)
npm gulp-uglify-es --save-dev
Pak jen jednoduše tento 1 minifikovaný JS vložíme do šablony:
<script src="{$basePath}/js/main.min.js"></script>
Do souboru /src/js/main.js (který se také přidává do main.min.js přidáme tento kód pro inicializaci Naji):
document.addEventListener( 'DOMContentLoaded', () => { naja.initialize(); } );
A máme hotovo. Nyní jen přidáme class=“ajax“ prvků, které chceme mít ajaxově, stejně jako u Nette.ajax.js
Demo signálu
Po kliknutí na tlačítko aktualizujeme ajaxem snippet, ve kterém se překreslí aktuální datum. Jednoduché 🙂
Presenter:
<?php declare(strict_types=1); namespace App\FrontModule\Presenters; use App; use Nette\Utils\DateTime; class HomepagePresenter extends BasePresenter { private $dateTime; public function handleActualiseDateTime() { $this->dateTime = new DateTime(); if ($this->isAjax()) { $this->redrawControl('dateTimeSnippet'); } } public function renderDefault(): void { if ($this->dateTime === null) { $this->dateTime = new DateTime(); } $this->template->dateTime = $this->dateTime; } }
Šablona:
<div class="col-12"> <hr/> {snippet dateTimeSnippet} {$dateTime|date:'j. n. Y H:i:s'} {/snippet} <a n:href="actualiseDateTime!" class="ajax">AKTUALIZOVAT</a> </div>
C# vytvoření objektu bez classy
var v = new { Amount = 108, Message = "Hello" };
Git checkout na nejnovější tag
Jak se v gitu přepnout na verzi s posledním tagem?
#!/bin/bash
...
latesttag=$(git describe --tags)
echo checking out ${latesttag}
git checkout ${latesttag}
Android Espresso – první jednoduchý test
Testujete? Já se o to pokouším. Pro komplexnější testování UI prvků aplikace doporučuji nástroj Espresso.
Pokud vytvoříte v Android Studiu nový projekt, máte základ připraven. Android Studio vytvoří základní strukturu a základní testy automaticky. Jedná se o složky:
- androidTest – do této složky dáváme UI testy. Používáme: Espresso a JUnit
- test – do teto složky dáváme Unit testy, pro tyto testy používáme: Mockito, Robolectric a JUnit
Naše Espresso testy tedy budeme umísťovat do složky androidTest. Pro první test stačí do souboru build.gradle (ve složce app) přidat závislost:
androidTestImplementation 'com.android.support.test:rules:1.0.2'
Můj build.gradle vypadá takto:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "cz.vencax.hellobuild"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
}
Pojďme vytvořit náš první Espresso test. Otestujeme, zda TextView obsahuje text Hello World!
package cz.vencax.hellobuild;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.containsString;
@RunWith(AndroidJUnit4.class)
@LargeTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class FirstTest {
@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);
@Before
public void setUp() throws Exception {
//Before Test case execution
}
@Test
public void test1ChatId() {
//onView(withId(R.id.helloTextView)).check(matches(isDisplayed()));
onView(withId(R.id.helloTextView)).check(matches(withText(containsString("Hello World!"))));
}
@After
public void tearDown() throws Exception {
//After Test case Execution
}
}
Test spustíme kliknutím pravým tlačítkem na soubor s testem v levé části Android Studia – Project. Nebo z příkazové řádky:
gradlew connectedAndroidTest
Azure DevOps – private agent pro Android build
Azure DevOps je sklělý nástroj pro vývojáře. Nabízí ZDARMA soukromé git repozitáře, nástroj pro tasky (řízení práce), a build nástroje. To vše „zdarma“. Kompletně jsem na tuto platformu přešel a jsem maximálně spokojený. Android aplikace automaticky po pushi do Gitu otestuji, provedu build a vydám novou vývojovou verzi. Build agent má však omezení na běh max. 10h/měsíc, na malé projekty bohatě dostačuje. Pokud jste náročnější a tento limit vám nestačí, jednoduše nainstalujete na svůj server svého soukromého agenta, který provádí build. Pak jste omezeni pouze výkonem vašeho serveru. Pojďme si zprovoznit soukromého agenta pro build Android aplikace:
Stáhneme a nainstalujete Java SDK
Stáhneme a nainstalujeme Android Studio
Přidání proměnných do Path
Pro build je nutné přidat do path následující proměnné: java, JAVA_HOME, JDK, AndroidSDK
Jak zjistím kde mám nainstalován Android SDK abych ho přidal do Path?
Android Studio -> Menu -> Tools -> SDK Manager -> položka Android SDK Location.
Do Uživatelsky definovaných proměnných v mém případě přidáme Název proměnné: ANDROID_HOME a Hodnota proměnné: C:\Users\Test\AppData\Local\Android\Sdk
do Path stejným způsobem přidáme ještě tyto hodnoty:
java : C:\Program Files\Java\jdk-11.0.2
JAVA_HOME : C:\Program Files\Java\jdk-11.0.2
JDK : C:\Program Files\Java\jdk-11.0.2
Po přidání mi build ještě nefungoval, bylo nutné provést restart zařízení.
Pokus o ruční build
Pro build by v cmd mělo fungovat (spustíme v root android projektu):
gradlew assembleDebug nebo gradlew assembleRelease
Jak nainstalovat agenta
Nejprve musíme vytvořit token pro autentizaci agenta. Přihlásíme se do TFS a vpravo nahoře klikneme na uživatele -> Security ->Personal access tokens -> New Token. Vytvoříme nový token, kterému nastavíme expiraci (jde na max 1 rok?) a oprávnění. Zobrazí se nám token, který si uschovejte, budeme ho potřebovat pro agenta.
Na URL https://dev.azure.com/{your_organization}/_admin/_AgentPool (v mém případě je {your_organization} venca-x). Zde vidíme seznam agentů a jejich stav. Pro vytvoření nového agenta klikneme na tlačítko Download agent. Vybereme cílovou platformu a nainstalujeme podle postupu. Po nainstalování není nutné spouštět agenta jako administrátor. Instalace probíhá přes Windows PowerShell.
Jak zobrazím mé agenty a jejich dostupnost?
Jděte na adresu:
https://dev.azure.com/{your_organization}/_admin/_AgentPool kde v sekci Default vidíte vaše soukromé agenty a jejich stav. Po kliknutí na Capabilities vidíte všechny vlastnosti daného agenta. Zde je důležité aby byly vlastnosti:
java, JAVA_HOME, JDK, AndroidSDK
Raspberry Pi 3 B+ : watchdog
Pro čtení dat z meteostanice a následné odeslání na server posílám Raspberry Pi 3 B+. Super levný pracant s dostačujícím výkonem. Bohužel, několikrát měsíčně „vytuhne“ a neposílá meteo data na server.
Co je to watchdog?
Watchdog, zkráceně WDT (z angličtiny – „hlídací pes“) je obvod/periferie, která resetuje systém při jeho zacyklení. K zacyklení systému může dojít v důsledku chyby v hardware nebo software systému.
Instalujeme watchdog
modprobe bcm2835_wdt
echo "bcm2835_wdt" | sudo tee -a /etc/modules
sudo apt-get install watchdog
sudo update-rc.d watchdog defaults
Upravíme konfigurační soubor:
vim /etc/watchdog.conf
Ve kterém odkomentujeme tyto řádky (odebereme # na začátku řádku):
#watchdog-device
#max-load-1
Dále do konfiguračního souboru přidáme řádek:
watchdog-timeout = 15
Konfigurační soubor uložíme, restartujeme raspberry.
Otestovat můžeme příkazem:
:(){ :|:& };:
Vidíte, že tento příkaz systém zahltí. Po chvíli vás odpojí od Putty a pak přestane odpovídat na ping – zafungoval watchdog a probíhá restart. Po restartu Raspberry opět naběhne
Composer – instalujeme fork balíčku
Dnes si ukážeme jak nainstalovat fork balíčku. Proč instalovat fork? Důvodů může být mnoho: nekompatibilita s PHP,
nekompatibilita závislostí balíčku, … Já konkrétně popíši řešení s knihovnou h4kuna/fio, která je závislá na „nette/utils“: „^2.2“, ovšem já používám vývojový „nette/utils“: „^3.0“, proto není možné balíček vůbec nainstalovat.
Na Githubu tedy uděláme fork h4kuna/fio, čímž se knihovna „zkopíruje“ pod náš Github účet a můžeme do ni přispívat kódem(bez schválení původního autora). Uděláme tedy commit, který upraví h4kuna/fio aby byl použitelný: https://github.com/venca-x/fio/commit/627218b174f75f452b25c02b3699641865efaa02
Já konkrétně jsem upravil soubor composer.json (ve forknutém balíčku – v master větvi):
„nette/utils“: „^2.2“ na „nette/utils“: „^3.0“
a jelikož používám vývojovou verzi Nette 3.0 přidal na konec:
„minimum-stability“: „dev“
Tím máme hotovo a můžeme tento forknutý balíček nainstalovat. Ale jak?
Do souboru composer.json v našem projektu přidáme závislost na balíček, který nám předtím předtím nešel nainstalovat (ve vývojové verzi, naši úpravu forknutého balíčku jsme pushli do master větve):
„h4kuna/fio“: „dev-master“
ale pro tento balíček dáme náš zdroj – forknutý repozitář:
"repositories": [
{
"type": "git",
"url": "https://github.com/venca-x/fio.git"
}
],
Tím máme hotovo. Snad někomu pomůže stejně dobře jako mne 🙂
Google Home – příkazy
I přesto, že Google slíbil, že jeho asistentka bude v roce 2018 umět česky, zatím jsme se nedočkali. I přesto je skvěle použitelný a dokáže dělat domácího sluhu.
Několik nejznámějších příkazů pro Google Home. Všechny příkazy začínáme frází OK google nebo Hey google.
Play some music
Play some by Shakira
Set the volume to 70%
Next song
Stop
Pause
Play mamka playlist on Spotify
How far away is the moon?
What’s the weather tomorrow in Czech Republic?
What’s the weather today?
What’s the latest news?
How is the S&P500 doing?
How many euros are in a Canadian dollar?
Tell my about my day
Add butter to my shopping list
Set a timer for 15 minutes
Coll Mom
What can you do?
How many calories are in an apple?
How do you say ‚nice to meet you‘ in Korean?
How do I say good morning in French
What’s 25 times 83?
What is the capital of Spain?
What is the radius of the sun?
What is the nearesr pharmacy?
When do they close?
What is their phone number?
Where is the nearest flower store?
Play how to cook steak videos on TV
Pause the Living Room speaker
Dim the lights in the kitchen
Is the light on in Tiler’s room?
Tell me a joke
Tell me a fun fact
I’m bored
What sound does a whale make?
What sound does a cow make?
Ok Google, Show me on TV
Show me photos of (Person) on TV
Show me photos of (Place) on TV
Show me photos of (Thing) on TV
Npm a Forever: automatické spuštění aplikace
Forever je jednoduchý nástroj, který zajišťuje nepřetržitý běh daného skriptu. Pokud restatujete server, nebo aplikace spadne, forever se postará o opětovné spuštění.
Nainstalujte forever globálně přes NPM:
npm install forever -g
forever.json
Tento soubor vytvoříme do node projektu, který chceme spouštět. Pokud máte projekt umístění na: /var/www/nodes/project vytvoříme soubor: /var/www/nodes/forever.json
[ { "uid": "appName1", "append": true, "watch": true, "script": "index.js", "sourceDir": "/var/www/nodes/project/", "workingDir": "/var/www/nodes/project/" } ]
Automatické spuštění foreveru pomocí služby cron
Do cron souboru přidáme následující řádek:
crontab -e
@reboot /usr/local/bin/forever start /var/www/nodes/forever.json > /dev/null 2>&1
Monitoring forever
Seznam spuštěných aplikací:
forever list
Zastavení konkrétní aplikace:
forever stop uid
Zastavení všech aplikací:
forever stopall
Zastavení logu:
forever logs 0