1
0

Compare commits

...

4 Commits

12 changed files with 194 additions and 7 deletions

View File

@ -143,6 +143,7 @@ function App() {
<Route exact path='/en/software/project/kanji-application' element={<KanjiApplication />}></Route>
<Route exact path='/en/software/project/attachment-module' element={<AttachmentModule />}></Route>
<Route exact path='/en/software/project/teslamaze' element={<TeslaMaze />}></Route>
<Route exact path='/en/software/project/config-automation' element={<ConfigAutomation />}></Route>
<Route exact path='/en/software/project/embedded-internet-radio' element={<EmbeddedInternetRadio />}></Route>
<Route exact path='/en/software/project/windows10-cookbook' element={<Windows10Cookbook />}></Route>
<Route exact path='/en/software/project/ios-airports' element={<IOSAirports />}></Route>

View File

@ -48,13 +48,14 @@ const languageStrings = {
// Projects
attachment_module: 'Attachment module',
boebot: 'Board of Education robot',
config_automation: 'Configuration automation',
dxp_development: 'DXP development',
embedded_internet_radio: 'Embedded internet radio',
embedded_game: 'Embedded game',
ios_airports: 'iOS airport',
festival_simulator: 'Festival simulator',
kanji_application: 'Kanji applicatition',
metroid_horizontal_shooter: 'Horizontale shooter game',
metroid_horizontal_shooter: 'Metroid horizontal shooter game',
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
teslamaze: 'TeslaMaze',
wifi_prototype: 'Wi-Fi prototype board',
@ -110,13 +111,14 @@ const languageStrings = {
// Projects
attachment_module: 'Attachment module',
boebot: 'Board of Education robot',
config_automation: 'Configuratie automatisering',
dxp_development: 'DXP development',
embedded_internet_radio: 'Embedded internet radio',
embedded_game: 'Embedded spel',
ios_airports: 'iOS luchthavens',
festival_simulator: 'Festival simulator',
kanji_application: 'Kanji applicatie',
metroid_horizontal_shooter: 'Horizontale shooter',
metroid_horizontal_shooter: 'Metroid horizontale shooter spel',
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
teslamaze: 'TeslaMaze',
wifi_prototype: 'Wi-Fi prototype board',

View File

@ -56,4 +56,9 @@ Noun+とか || Verb (dictionary form)+とか
#### 関係する本
* **A Dictionary of Japanese Particles**, ISBN978-4-7700-2352-0
* **Nihongo So-Matome N4 ぶんぽう**, ISBN978-4-86639-075-8
* **Nihongo So-Matome N4 ぶんぽう**, ISBN978-4-86639-075-8
###### 関係する動画
* ['Learn Japanese ~し、~し | Learn N4 Japanese grammar'](https://www.youtube.com/watch?v=XIpRgfQEevQ) by: [Learn Japanese with Moon-chan](https://www.youtube.com/@JapanesewithMoon-chan)
* ['How to use し as because and difference between し, から and ので'](https://www.youtube.com/watch?v=85ehzPo0TQ0&t=12s) by: ['Miku Real Japanese'](https://www.youtube.com/@mikurealjapanese)

View File

@ -1,6 +1,6 @@
# Plamo
Het bouwen en schilderen van plastic schaalmodellen en mecha figuren is een hobby van me. Hier is een collectie van de dingen die I heb gemaakt en gebruik.
Het bouwen en schilderen van plastic schaalmodellen en mecha figuren is een hobby van me. Hier is een collectie van de dingen die ik heb gemaakt en gebruik.
---

View File

@ -19,6 +19,8 @@ const ConfigAutomation = () => {
</section>
<p><hr/></p>
<section id="list-development" className="content-section">
<h2 className="text-primary">Development</h2>
<p>This project started as a local Python 2 script when it started, to only automate very specific settings. It later moved to USB drives and eventually to a VM on a network.</p>
@ -36,6 +38,8 @@ const ConfigAutomation = () => {
</section>
<p><hr/></p>
<section id="list-deployment" className="content-section">
<h2 className="text-primary">Deployment</h2>
<p>Creating the release of this software had to be done by running a batch script to create a bundled set of Python files. These files were then uploaded to the VM located in a European distribution center in the Netherlands. This VM is then used to run the software from on a local network on which all configuration laptops were connected to. A WinSCP script would then sync the contents of all VM's in distribution centres located in Singapore, United States and China in 24 hours.</p>
@ -51,6 +55,8 @@ const ConfigAutomation = () => {
</section>
<p><hr/></p>
<section id="list-feedback" className="content-section">
<h2 className="text-primary">Feedback</h2>
<p>The application generated log files with each configuration and then upload these back to the VM after configuration was complete or halted. These logs were sorted under product name and the order number. But quite often, I found it very productive to go to the configuration area and simply talk with the technician to figure out what went wrong. Depending on the severity of the problem, it would get documented in Gitlab issues. On a weekly basis, issues would get assigned among developers.</p>
@ -65,6 +71,8 @@ const ConfigAutomation = () => {
</section>
<p><hr/></p>
<section id="list-lessons-learnt" className="content-section">
<h2 className="text-primary">Lessons learnt</h2>
<p>Being a programmer, I was mostly concerned with the software. But it requires hardware to run on. When the software does not work because of differences in the platform the software run on, what is there to do? I eventually started managing around 40 configuration laptops, using <a href="https://clonezilla.org/" target="_blank" rel="noopener noreferrer">Clonezilla</a> to create identical machines.</p>

View File

@ -18,6 +18,7 @@ const SoftwareMain = () => {
<p>{getString('code_pages_intro')}</p>
<ul>
<li><a href={'/' + language + '/software/elm/'}>Elm</a></li>
<li><a href={'/' + language + '/software/haskell/'}>Haskell</a></li>
</ul>
<hr />
@ -26,14 +27,16 @@ const SoftwareMain = () => {
<ul>
<li><a href="./project/kanji-application">{getString('kanji_application')}</a></li>
<li><a href="./project/dxp-development">{getString('dxp_development')}</a></li>
<li><a href="./project/wifi-prototype">{getString('wifi_prototype')}</a></li>
<li><a href="./project/config-automation">{getString('config_automation')}</a></li>
<li><a href="./project/embedded-game">{getString('embedded_game')}</a></li>
<li><a href="./project/metroid-horizontal-shooter">{getString('metroid_horizontal_shooter')}</a></li>
<li><a href="./project/raspberry-pi-jukebox">{getString('raspberry_pi_jukebox')}</a></li>
<li><a href="./project/teslamaze">{getString('teslamaze')}</a></li>
</ul>
</div>
<div style={{display: "inline-block"}}>
<ul>
<li><a href="./project/wifi-prototype">{getString('wifi_prototype')}</a></li>
<li><a href="./project/embedded-internet-radio">{getString('embedded_internet_radio')}</a></li>
<li><a href="./project/windows10-cookbook">{getString('windows10_cookbook')}</a></li>
<li><a href="./project/ios-airports">{getString('ios_airports')}</a></li>

View File

@ -0,0 +1,16 @@
import React from 'react';
import Breadcrumbs from '../../../UI/Breadcrumbs'
import MarkdownPage from '../../markdownPage'
const HaskellPage = ({ mdPath }) => {
return (
<article className='main-page'>
<Breadcrumbs separator=' > ' path="software/haskell">
{['software', 'haskell']}
</Breadcrumbs>
<MarkdownPage md={mdPath} />
</article>
)
}
export default HaskellPage;

View File

@ -0,0 +1,66 @@
## Curried functions
A function can return another function.
```haskell
add' :: Int -> (Int -> Int)
add' x y = x+y
```
Here, **add'** is a function that takes an **Int** for an argument and results in a function of type: **Int -> Int**.
The function definition takes an integer **x**, followed by an integer **y**, it can be [curried](https://en.wikipedia.org/wiki/Currying).
```haskell
addThree = add' 3 -- This is now a function with type: Int -> Int
result = addThree 5 -- Evaluates to 8
```
Another example,
```haskell
mult :: Int -> (Int -> (Int -> Int))
mult x y z = x*y*z
```
And is applied as following:
```haskell
mult x y z
-- Means same as:
((mult x) y) z
```
When used, it is like:
```haskell
multTwo = mult 2 -- This is now a function with type: Int -> (Int -> Int)
multTwoThree = multTwo 3 -- This is: Int -> Int
result = multTwoThree 4 -- Evaluates to 2 * 3 * 4 = 24
-- or just:
result = mult 2 3 4 -- Also evaluates to 24
```
**Partial application** is about using curried functions, applying only some arguments and getting back a new function.
```haskell
double = mult 2 -- This is now a function with type: Int -> (Int -> Int)
result = double 3 4 -- Evaluates to 2 * 3 * 4 = 24
quadruple = double 2 -- Now quadruple :: Int -> Int
result = quadruple 3 -- Evaluates to 2 * 2 * 3 = 12
```
The arrow function **->** in Haskell types is assumed to associate from the right.
```haskell
Int -> Int -> Int -> Int
-- is:
Int -> (Int -> (Int -> Int))
```
So, unless tuples are required, all functions in Haskell with multiple arguments are actually defined as curried functions, with a way to reduce excessive parenthesis.

View File

@ -0,0 +1,5 @@
### Haskell
I am learing functional programming and Haskell, these are my notes on the language.
* [Curried Functions](./curried-functions)

View File

@ -0,0 +1,66 @@
## Curried functions
Een functie kan een andere functie teruggeven.
```haskell
add' :: Int -> (Int -> Int)
add' x y = x+y
```
Hier, is **add'** functie die een **Int** als argument neemt en resulteerd in een functie van het type: **Int -> Int**.
De functie definitie neemt een integer **x**, gevolgd door integer **y**, die kan worden [ge-curried](https://en.wikipedia.org/wiki/Currying).
```haskell
addThree = add' 3 -- Dit is nu een functie met type: Int -> Int
result = addThree 5 -- Resulteerd in 8
```
Nog een voorbeeld
```haskell
mult :: Int -> (Int -> (Int -> Int))
mult x y z = x*y*z
```
En toegepast:
```haskell
mult x y z
-- Hetzelfde als:
((mult x) y) z
```
Als deze wordt gebruikt, kan dat zo:
```haskell
multTwo = mult 2 -- Dit is nu een functie met type: Int -> (Int -> Int)
multTwoThree = multTwo 3 -- Dit is is: Int -> Int
result = multTwoThree 4 -- Resulteerd in: 2 * 3 * 4 = 24
-- of gewoon:
result = mult 2 3 4 -- Resulteerd ook in 24
```
**Partial application** is het gebruiken van curried functies, door enkele argumenten te geven en een functie terug te krijgen.
```haskell
double = mult 2 -- Dit is nu een functie met type: Int -> (Int -> Int)
result = double 3 4 -- Resulteerd in: 2 * 3 * 4 = 24
quadruple = double 2 -- quadruple :: Int -> Int
result = quadruple 3 -- Resulteerd in: 2 * 2 * 3 = 12
```
De pijl **->** in Haskell types associeerd vanaf rechts.
```haskell
Int -> Int -> Int -> Int
-- is:
Int -> (Int -> (Int -> Int))
```
Tenzij tuples nodig zijn, zijn alle functies in Haskell met meerdere argumenten eigenlijk curried functies, met een manier om de vele haakjes weg te kunnen laten.

View File

@ -0,0 +1,5 @@
### Haskell
I ben functioneel programmeren en Haskell aan het leren, dit zijn mijn notities van deze taal.
* [Curried Functions](./curried-functions)

View File

@ -5,6 +5,7 @@ import JapanesePage from './Pages/Japan/JapanesePage';
import BlogPage from './Pages/Plamo/BlogPage';
import CSharpPage from './Pages/Software/csharp/CSharpPage';
import ElmPage from './Pages/Software/elm/ElmPage';
import HaskellPage from './Pages/Software/haskell/HaskellPage';
// Japan
export const japaneseRoutes = languages.map(lang => {
@ -39,8 +40,9 @@ export const programmingLanguageRoutes = languages.map(lang => {
// Main page.
const mainCSharp = <Route key={`${lang}-csharp-main`} exact path={`/${lang}/software/csharp/`} element={<CSharpPage mdPath={`Software/csharp/${lang}/main.md`} />} />
const mainElm = <Route key={`${lang}-elm-main`} exact path={`/${lang}/software/elm/`} element={<ElmPage mdPath={`Software/elm/${lang}/main.md`} />} />
const mainHaskell = <Route key={`${lang}-haskell-main`} exact path={`/${lang}/software/haskell/`} element={<HaskellPage mdPath={`Software/haskell/${lang}/main.md`} />} />
// Pages within Elm.
// Pages within C#.
let md = ['strings', 'types'];
const entriesCSharp = md.map(entry => {
const path = `/${lang}/software/csharp/${entry}`;
@ -56,5 +58,13 @@ export const programmingLanguageRoutes = languages.map(lang => {
return <Route key={`${lang}-${entry}`} exact path={path} element={<ElmPage mdPath={mdPath} />} />;
});
return [mainCSharp, mainElm, ...entriesCSharp, ...entriesElm];
// Pages within Haskell.
md = ['curried-functions'];
const entriesHaskell = md.map(entry => {
const path = `/${lang}/software/haskell/${entry}`;
const mdPath = `Software/haskell/${lang}/${entry}.md`;
return <Route key={`${lang}-${entry}`} exact path={path} element={<HaskellPage mdPath={mdPath} />} />;
});
return [mainCSharp, mainElm, mainHaskell, ...entriesCSharp, ...entriesElm, ...entriesHaskell];
}).flat();