[{"content":"The Xiaomi air purifier is a wifi device and to be able to use it in Jeedom you'll need to extract its token.\nIt's possible to extract the token by using an old version of the Mi-Home app or using various strange manipulations.\nFor me it never worked and by chance I found the Xiaomi Cloud tokens extractor.\nBefore to use it, you need to add your purifier in the Mi-Home app and then you can execute the \u0026quot;token_extractor.exe\u0026quot;.\nThe tool will ask you to enter your Mi-Home login, your password and the server to use. The last information isn't mandatory and if omitted the tool will scan all countries and will list different information about your devices.\nFor the purifier we just need to get the token.\nAs I've the Xiaomi Home plugin in Jeedom I thought it would be easy to add my new toy but it never worked (the information returned by the commands were always empty).\nAfter a few searches, I found the miiocli tool that can be installed on your Jeedom host (you'll be able to see a list of compatible devices on the Github page).\nFirst connect via SSH to your Jeedom host and execute the following command to install the JQ tool (used to manipulate JSON structure)\nsudo apt-get install jq -y Then you can install the miiocli tool:\nsudo apt-get install libffi-dev libssl-dev -y sudo pip3 install python-miio To be able to see what you can do with the Air Purifier 3C, you can type the help command and it will describe the options and commands you can use:\nsudo miiocli airpurifiermb4 --ip [YourPurifierIP] --token [YourPurifierToken] --help The parameter \u0026quot;airpurifiermb4\u0026quot; is the device type to use with the command and is linked to the Xiaomi Air Purifier 3C.\nWhen you validate the previous command, you'll see all the commands available to control your purifier.\nIn the following screenshot, I added a new script in Jeedom to be able to control my device.\nThe first command is used to get a json with all the information from the purifier (power, air quality, ...) and then I save it in a file on my server (don't forget to set the IP of your purifier and its token).\nThe second command is used to query the json file and get the power value (enter the IP of your Jeedom host).\nThe third command is used to power on the purifier and so on...\nAs you understood the sample, you'll be able to add more commands to get the rest of the information and with a few click you'll have a widget to control your device and I'm sure most of you will have a better design.\n","permalink":"https://www.fabmoll.be/posts/XiaomiAirPurifierInJeedom.html","summary":"\u003cp\u003eThe Xiaomi air purifier is a wifi device and to be able to use it in Jeedom you'll need to extract its token.\u003c/p\u003e\n\u003cp\u003eIt's possible to extract the token by using an old version of the Mi-Home app or using various strange manipulations.\u003c/p\u003e\n\u003cp\u003eFor me it never worked and by chance I found the \u003ca href=\"https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor\" target=\"_blank\"\u003eXiaomi Cloud tokens extractor\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBefore to use it, you need to add your purifier in the Mi-Home app and then you can execute the \u0026quot;token_extractor.exe\u0026quot;.\u003c/p\u003e","title":"Add the Xiaomi Air Purifier 3C in Jeedom"},{"content":"If you configured a certificate to access your Jeedom with HTTPS and you don't want to let the HTTP access available, you can change your Apache settings to redirect HTTP access to the HTTPS automatically.\nYou'll need to ssh on your Jeedom server and edit the following file:\nnano /etc/apache2/sites-available/000-default.conf The part we want to modify is the virtual host defined for the HTTP port (80)\n\u0026lt;VirtualHost *:80\u0026gt; ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog /var/www/html/log/http.error \u0026lt;/VirtualHost\u0026gt; And we'll edit the file to rewrite the HTTP access to the HTTPS access\n\u0026lt;VirtualHost *:80\u0026gt; ServerAdmin webmaster@localhost DocumentRoot /var/www/html RewriteEngine on RewriteCond %{SERVER_NAME} =My.JeedomDomain.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] ErrorLog /var/www/html/log/http.error \u0026lt;/VirtualHost\u0026gt; You need to replace the \u0026quot;My.JeedomDomain.com\u0026quot; by your actual domain name used to access your Jeedom from outside your network.\nWhen it's done, you just need to enable the rewrite module and restart Apache:\na2enmod rewrite systemctl restart apache2 ","permalink":"https://www.fabmoll.be/posts/ForceHttpsAccessInApache.html","summary":"\u003cp\u003eIf you configured a certificate to access your Jeedom with HTTPS and you don't want to let the HTTP access available, you can change your Apache settings to redirect HTTP access to the HTTPS automatically.\u003c/p\u003e\n\u003cp\u003eYou'll need to ssh on your Jeedom server and edit the following file:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enano /etc/apache2/sites-available/000-default.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe part we want to modify is the virtual host defined for the HTTP port (80)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;VirtualHost *:80\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ServerAdmin webmaster@localhost\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        DocumentRoot /var/www/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ErrorLog /var/www/html/log/http.error\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/VirtualHost\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd we'll edit the file to rewrite the HTTP access to the HTTPS access\u003c/p\u003e","title":"Force HTTPS access in Apache"},{"content":"A few days ago, I created a post on how to redirect the HTTPS external traffic to a Jeedom in a private network.\nEverything will work but you'll see in your browser that the website isn't secure. The reason is that there is no certificate available on your webserver (on your Jeedom).\nTo generate, use and auto renew a certificate we'll use CertBot\nCertbot is a free, open source software tool for automatically using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS.\nCertbot is made by the Electronic Frontier Foundation (EFF), a 501(c)3 nonprofit based in San Francisco, CA, that defends digital privacy, free speech, and innovation.\nFirst, open a SSH connection to your Jeedom.\nInstall snapd\nsudo snap install core; sudo snap refresh core Install Certbot\nsudo snap install --classic certbot Check if you can run the certbot command\nsudo ln -s /snap/bin/certbot /usr/bin/certbot To get a certificate and have certbot automatically change your Apache configuration to serve it and to turn on HTTPS access in a single step, use the following command:\nsudo certbot --apache The certbot comes with a cron to automatically renew your certificate. But if you want to check if the auto renewal is working, you can use this command:\nsudo certbot renew --dry-run If it completes without errors, your certificate will be renewed automatically.\nPlease note that your HTTP(80) and HTTPS(443) port must be opened or the auto renewal will not work.\nNow you can try to access your Jeedom with the HTTPS url and you'll see that the browser will display that the connection is \u0026quot;secure\u0026quot;.\nAs a wise man said once:\nHTTPS \u0026amp; SSL doesn\u0026#39;t mean \u0026quot;trust this.\u0026quot; It means \u0026quot;this is private.\u0026quot; You may be having a private conversation with Satan.\n\u0026mdash; Scott Hanselman (@shanselman) April 4, 2012 Please note that you'll need to change your Jeedom configuration to add the HTTPS URL (and port) to be able to use the HTTPS URL to access Jeedom.\n","permalink":"https://www.fabmoll.be/posts/SecureTheAccessToYourJeedomWithCertbot.html","summary":"\u003cp\u003eA few days ago, I created a \u003ca href=\"/posts/RedirectHTTPPortToJeedom\"\u003epost\u003c/a\u003e on how to redirect the HTTPS external traffic to a Jeedom in a private network.\u003c/p\u003e\n\u003cp\u003eEverything will work but you'll see in your browser that the website isn't secure.\nThe reason is that there is no certificate available on your webserver (on your Jeedom).\u003c/p\u003e\n\u003cp\u003eTo generate, use and auto renew a certificate we'll use \u003ca href=\"https://certbot.eff.org/\" target=\"_blank\"\u003eCertBot\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCertbot is a free, open source software tool for automatically using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS.\u003c/p\u003e\n\u003cp\u003eCertbot is made by the Electronic Frontier Foundation (EFF), a 501(c)3 nonprofit based in San Francisco, CA, that defends digital privacy, free speech, and innovation.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Secure the access to your Jeedom with Certbot"},{"content":"In the previous blog post we saw how to create a custom domain name to point to our public IP address. The main goal was to be able to access our Jeedom from outside our private network.\nBut if you just type your public IP address or use the new custom domain name to access Jeedom you'll just hit your modem or firewall and they'll not know what do to with the traffic. And you can be sure the traffic will not go to your Jeedom by default.\nIf you're using a Dream Machine Pro (controller 6.2.26) you can redirect the HTTP/HTTPS traffic to your Jeedom by following these steps:\nOpen your Dream Machine Network Manager web page Go to Advanced features - Advanced Gateway Settings and click on the Create a new Port Forwarding button Fill in the form as below and validate You can repeat the process to redirect the HTTPS port (443).\nNow if you enter your custom domain in a browser, you'll be able to access your Jeedom in your private network\n","permalink":"https://www.fabmoll.be/posts/RedirectHTTPPortToJeedom.html","summary":"\u003cp\u003eIn the previous blog \u003ca href=\"/posts/CreateADynHostToAccessJeedom\"\u003epost\u003c/a\u003e we saw how to create a custom domain name to point to our public IP address.\nThe main goal was to be able to access our Jeedom from outside our private network.\u003c/p\u003e\n\u003cp\u003eBut if you just type your public IP address or use the new custom domain name to access Jeedom you'll just hit your modem or firewall and they'll not know what do to with the traffic. And you can be sure the traffic will not go to your Jeedom by default.\u003c/p\u003e","title":"Redirect HTTP/HTTPS port to your Jeedom"},{"content":"If you want to access your Jeedom from outside your private network, you can do it using your public IP address or using a custom domain name pointing to your public IP address (if the HTTP or HTTPS port is opened).\nFor me and maybe for you, it's easier to remember a custom domain name and I decided to go with one on OVH.\nNow that I have my custom domain I would like to use it to access my Jeedom and trust me or not, I didn't know it was so simple.\nCreate a new user Go in the DynHost menu and choose to create a username.\nEnter a username suffix Enter the sub-domain that you want to define to point to your Jeedom Define a password to use with your username and confirm Create a DynHostRecord When it's done, you can add a new DynHost record and re-enter the sub-domain name you choosed earlier, enter the target IP (the public IP address of your Jeedom) and confirm.\nIf you want to know your public IP address you can go to whatismyipaddress and copy the address displayed in the IPv4 field.\nIn an upcoming blog post, we'll see how to automatically refresh your public IP address to DynHost (if you don't have a fixed IP address) and how to redirect incoming traffic on the HTTP port to your Jeedom.\n","permalink":"https://www.fabmoll.be/posts/CreateADynHostToAccessJeedom.html","summary":"\u003cp\u003eIf you want to access your Jeedom from outside your private network, you can do it using your public IP address or using a custom domain name pointing to your public IP address (if the HTTP or HTTPS port is opened).\u003c/p\u003e\n\u003cp\u003eFor me and maybe for you, it's easier to remember a custom domain name and I decided to go with one on \u003ca href=\"https://www.ovh.com/\" target=\"_blank\"\u003eOVH\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNow that I have my custom domain I would like to use it to access my Jeedom and trust me or not, I didn't know it was so simple.\u003c/p\u003e","title":"Create a DynHost to access your Jeedom"},{"content":"A few days ago, I started to learn CSS and HTML. I already played with CSS and HTML but I had a very very limited knowledge.\nAs I don't like to repeat a code or a property value, I found recently that you can apply a color (defined once) in different properties.\nLet's see an example:\ndiv { color: blue; border: 1px solid currentColor; } With the currentColor property you indicate that you'll use the value of the color property in other properties that accept a color value.\nWith my example, the border color will be blue.\nYou can even use it in a cascade:\nbody { color: blue; } div { border: 1px solid currentColor; } ","permalink":"https://www.fabmoll.be/posts/CSScurrentColorValue.html","summary":"\u003cp\u003eA few days ago, I started to learn CSS and HTML.  I already played with CSS and HTML but I had a very very limited knowledge.\u003c/p\u003e\n\u003cp\u003eAs I don't like to repeat a code or a property value, I found recently that you can apply a color (defined once) in different properties.\u003c/p\u003e\n\u003cp\u003eLet's see an example:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003ediv\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ecolor\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003eblue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eborder\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003epx\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003esolid\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003ecurrentColor\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWith the \u003cstrong\u003ecurrentColor\u003c/strong\u003e property you indicate that you'll use the value of the color property in other properties that accept a color value.\u003c/p\u003e","title":"CSS currentColor value"},{"content":" Well, Mr. Hunt, this is not Mission: Difficult, its Mission: Impossible. Difficult should be a walk in the park for you. - Boss, Mission: Impossible 2\nSometimes, a simple update is harder than you think. Since years, I've a Jeedom running on a Raspberry 3B+ and the last Jeedom update installed is the version 4.0.x hosted in a Debian 9 Stretch.\nA few days ago I saw that the Jeedom 4.1.x was available with some really nice improvements.\nThe condition to be able to install this version is to have the Debian 10 Buster installed. As we can read in the install documentation, the best thing to do is to backup your Jeedom and install everything from scratch.\nAnd that's what I did, downloaded the ISO x86, burned the SDCard, booted on it and installed Jeedom with the command line.\nRight after that, I restored my Jeedom backup (I'll not describe that part here).\nNow the fun part begins: Boot from the SSD.\nWhen you check some websites, you'll read that you just need to install Debian on the SSD, plug it in the Raspberry and restart the device to boot from the SSD. But there are lies! (It was in my case)\nThe best thing I could find was to clone my SDCard to my SSD and it was really easy with the rpi-clone script.\nrpi-clone is a shell script that is for cloning a running Raspberry Pi booted source disk (SD card or USB disk) to a destination disk which will be bootable. Destination disks are SD cards in the SD card slot or a USB card reader, USB flash disks, or USB hard drives.\nFirst, clone the repository and copy the setup in your /usr/local/sbin directory:\ngit clone https://github.com/billw2/rpi-clone.git cd rpi-clone sudo cp rpi-clone rpi-clone-setup /usr/local/sbin Stop the following services:\nsudo service mysql stop sudo service cron stop sudo service apache2 stop sudo service nginx stop Connect your SSD to your Raspberry and clone your SDCard to your SSD:\nrpi-clone sda -f When it's done, you can restart the services:\nsudo service mysql start sudo service cron start sudo service apache2 start The next thing to do is to configure your Raspberry to be able to boot on the USB port. For that, you'll need to backup your current config.txt file, set the boot mode and then restart the Raspberry:\ncp /boot/config.txt /boot/config.txt.old echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt sudo reboot When your device restarted, you can check if the boot mode is set to boot on USB with the following command:\nvcgencmd otp_dump | grep 17 \u0026gt;17:3020000a If it returns 17:3020000a, the setting has been taken into account. Now we need to change the boot config to be able to boot on the SSD.\nGet the PARTUUID from your SSD (/dev/sda2):\nsudo blkid Backup your current cmdline file:\nsudo cp /boot/cmdline.txt /boot/cmdline.txt.bak Edit the cmdline file and replace the PARTUUID with the value we copied from the sudo blkid command, save and quit:\nsudo nano /boot/cmdline.txt When it's done, you can reboot again:\nsudo reboot After the reboot, the following command should display the /dev/sda2 device:\nfindmnt -n -o SOURCE / \u0026gt; /dev/sda2 Almost finished, now you need to change fstab to use the PARTUUID from your SSD device, save, quit and reboot again:\nsudo nano /etc/fstab sudo reboot The next step is done to create a new partition on your SSD. As you'll see later, the partition size on your SSD is the same as your SDCard. Here we want to use the entire SSD disk size:\nYou'll need to reboot again when the partition is created. This time it may take a little longer.\nIt's not yet finished, now you need to resize the partition:\nIf everything went well, you should see the new partition size with the df command:\ndf -h ","permalink":"https://www.fabmoll.be/posts/UpdateJeedomFromVersion4_0_xTo4_1_x.html","summary":"\u003cblockquote\u003e\n\u003cp\u003eWell, Mr. Hunt, this is not Mission: Difficult, its Mission: Impossible. Difficult should be a walk in the park for you. - \u003cem\u003eBoss, Mission: Impossible 2\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSometimes, a simple update is harder than you think.\nSince years, I've a \u003ca href=\"https://www.jeedom.com/en/\" target=\"_blank\"\u003eJeedom\u003c/a\u003e running on a Raspberry 3B+ and the last Jeedom update installed is the version 4.0.x hosted in a Debian 9 Stretch.\u003c/p\u003e\n\u003cp\u003eA few days ago I saw that the Jeedom 4.1.x was available with some really nice \u003ca href=\"https://doc.jeedom.com/en_US/core/4.1/changelog\" target=\"_blank\"\u003eimprovements\u003c/a\u003e.\u003c/p\u003e","title":"Update Jeedom from version 4.0.x to 4.1.x"},{"content":"Since the beginning I've never had an issue with my Xiaomi sensors but for no reason one of them started to not update his status.\nIf I close the door Jeedom still displays the door as opened.\nI couldn't find the reason and I discovered that a simple refresh command could reset the status and display the right information.\nIf you don't want to refresh the status manually, you can do it with a scenario.\nFirst, create a triggered scenario on the Xiaomi sensor for the opening command and give a name to your scenario.\nThen in the scenario definition:\nadd a Sleep action for 10 seconds add a refresh command from your Xiaomi sensor add an IF condition and check if the opening command value is equal to 1 (open) add a THEN condition to execute your current scenario If the status changes, the scenario will wait 10 seconds and then execute the sensor refresh command. If the status is still equal to 1 (open), it will execute again the current scenario.\nNow if the door is closed and the status is not up to date the scenario will update it after 10 seconds.\n","permalink":"https://www.fabmoll.be/posts/RefreshTheXiaomiDoorSensorStatusWithAScenario.html","summary":"\u003cp\u003eSince the beginning I've never had an issue with my Xiaomi sensors but for no reason one of them started to not update his status.\u003c/p\u003e\n\u003cp\u003eIf I close the door Jeedom still displays the door as opened.\u003c/p\u003e\n\u003cp\u003eI couldn't find the reason and I discovered that a simple refresh command could reset the status and display the right information.\u003c/p\u003e\n\u003cp\u003eIf you don't want to refresh the status manually, you can do it with a scenario.\u003c/p\u003e","title":"Refresh the Xiaomi door sensor status with a scenario in Jeedom"},{"content":"When your Pi-hole doesn't act as a DHCP server (because you already have another one) you'll able to see only the IP addresses of the devices.\nNot really user-friendly when you need to analyze the log of the Pi-Hole.\nBut don't be afraid, there is a solution!\nTo be able to see the device name, you just need to enable the Use Conditional Forwarding setting in the Settings - DNS.\nWhen the option is enabled, enter the local network to use and the IP address of your DHCP server as described in the screenshot, save and it's done. It's magic.\n","permalink":"https://www.fabmoll.be/posts/HowToDisplayDeviceNameInYourPiHole.html","summary":"\u003cp\u003eWhen your \u003ca href=\"https://pi-hole.net/\" target=\"_blank\"\u003ePi-hole\u003c/a\u003e doesn't act as a DHCP server (because you already have another one) you'll able to see only the IP addresses of the devices.\u003c/p\u003e\n\u003cp\u003eNot really user-friendly when you need to analyze the log of the Pi-Hole.\u003c/p\u003e\n\u003cp\u003eBut don't be afraid, there is a \u003cspan style=\"color:green\"\u003esolution\u003c/span\u003e!\u003c/p\u003e\n\u003cp\u003eTo be able to see the device name, you just need to enable the \u003cstrong\u003eUse Conditional Forwarding\u003c/strong\u003e setting in the Settings - DNS.\u003c/p\u003e\n\u003cp style=\"text-align:center;\"\u003e\n\u003cimg src=\"../images/HowtodisplaydevicenameinyourPi-hole.jpg\" alt=\"Enable Use Conditional Forwarding\" align=\"center\"/\u003e\u003c/p\u003e","title":"How to display device name in your Pi-hole"},{"content":"Holidays are nice when you want to try something new.\nIn my case, I wanted to install a Pi-Hole.\nIf you never heard about Pi-Hole, it's a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software.\nMy post isn't a How-to install/configure/... the thing.\nHere we'll see how to create firewall rules on the Dream Machine Pro to refuse all DNS queries except the one to the Pi-Hole.\nThe first thing to do is to create two groups in the firewall settings.\nOne to specify the DNS port to block (53) and another one to contain the IP addresses that will be used to accept DNS queries (The Pi-Hole address and maybe some other DNS addresses).\nI use groups to be able to add/remove address or port as I wish.\nFirst group\nName: DNS Port Type: Port Port value: 53 Second group\nName: DNS to Accept Type: Address IPV4 Address: The address of your PI-Hole and maybe some other public DNS addresses When it's done, we need to create two firewall rules. One to block all outbound traffic to the port 53 and another one to accept all outbound traffic to the port 53 but only for the addresses we trust.\nFirst rule\nName: Accept DNS Group Rule applied: Before predefined rules Action: Accept Source Type: Address/Port group Source IPv4 Address Group: Any Source Port Group: Any Destination Type: Address/Port group Destination IPv4 Address Group: DNS to Accept (the second group we created) Destination Port Group: DNS Port (the first group we created) Second rule\nName: Drop other DNS Rule applied: Before predefined rules Action: Drop Source Type: Address/Port group Source IPv4 Address Group: Any Source Port Group: Any Destination Type: Address/Port group Destination IPv4 Address Group: Any Destination Port Group: DNS Port (the first group we created) With these rules, the devices connected to our LAN will only use the DNS we trust and if a malware tries to bypass our DNS, it will be blocked by the second firewall rule.\n","permalink":"https://www.fabmoll.be/posts/AcceptDNSQueriesToSpecificIPAddressesWithinYourDreamMachinePro.html","summary":"\u003cp\u003eHolidays are nice when you want to try something new.\u003cbr\u003e\nIn my case, I wanted to install a \u003ca href=\"https://pi-hole.net/\" target=\"_blank\"\u003ePi-Hole\u003c/a\u003e.\u003cbr\u003e\nIf you never heard about Pi-Hole, it's a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software.\u003c/p\u003e\n\u003cp\u003eMy post isn't a \u003cem\u003eHow-to\u003c/em\u003e install/configure/... the thing.\u003cbr\u003e\nHere we'll see how to create firewall rules on the Dream Machine Pro to refuse all DNS queries except the one to the Pi-Hole.\u003c/p\u003e","title":"Accept DNS queries to specific IP addresses within your Dream Machine Pro"},{"content":"In some cases you'll handle the PPPoE connection in your router.\nThe main reason is to connect to the Proximus network from your router and let your personal hardware manage the DHCP.\nIf you know your login and password, it's really easy. But if like me, you lost your original password / don't remember it / never saved it in your favorite password tool / ... you're doomed. Or not.\nProximus made it simple, you can login on their website and in the MyProducts section you need to select your \u0026quot;Internet\u0026quot; product.\nFrom there you'll be able to define a new password without the need to enter your old password.\nWhen the password is changed, it will take effect within two hours.\nMy first error was to change it too in my modem -\u0026gt; No more Internet at home.\nIn fact you can use the old password as long as Proximus didn't validate your new password.\nTwo hours later... No Internet!\nThe WAF was aligned with the two hours but not with more.\nI had two solutions:\nTry a new password on Proximus website (and wait two more hours) Contact the Support I don't remember my web search but I found a ticket about the PPPoE connection with the Proximus modem and the new password rule.\nIn fact, the new password must be eight characters long and it must only contain alphanumeric characters.\nThe thing I didn't say is that I used a password generator to have something complex on my first try.\nSo before to call the Support, I changed my password to match the rule (on Proximus website and in my router) and it worked right away.\n","permalink":"https://www.fabmoll.be/posts/ChangeProximusInternetPassword.html","summary":"\u003cp\u003eIn some cases you'll handle the PPPoE connection in your router.\u003cbr\u003e\nThe main reason is to connect to the Proximus network from your router and let your personal hardware manage the DHCP.\u003c/p\u003e\n\u003cp\u003eIf you know your login and password, it's really easy.  But if like me, you lost your original password / don't remember it / never saved it in your favorite password tool / ... you're doomed.  Or not.\u003c/p\u003e","title":"Change Proximus Internet password"},{"content":"It's the second time I need to change the status bar color in a Xamarin.Forms (Android) and I didn't remember how to do it.\nAs I don't want to search it again, I decided to add the information here.\nThe status bar is the top part of the application where you can find the battery level, the network status,...\nIn your Android project, just add the following line in the styles.xml file and use the color you like:\n\u0026lt;item name=\u0026#34;android:statusBarColor\u0026#34;\u0026gt;#3F4550\u0026lt;/item\u0026gt; ","permalink":"https://www.fabmoll.be/posts/ChangeStatusBarColorInXamarinForms.html","summary":"\u003cp\u003eIt's the second time I need to change the status bar color in a Xamarin.Forms (Android) and I didn't remember how to do it.\u003c/p\u003e\n\u003cp\u003eAs I don't want to search it again, I decided to add the information here.\u003c/p\u003e\n\u003cp\u003eThe status bar is the top part of the application where you can find the battery level, the network status,...\u003c/p\u003e\n\u003cp style=\"text-align:center;\"\u003e\n\u003cimg src=\"../images/ChangeStatusBarColorInXamarinForms.jpg\" alt=\"Folder structure\" align=\"center\"/\u003e\u003c/p\u003e\n\u003cp\u003eIn your Android project, just add the following line in the styles.xml file and use the color you like:\u003c/p\u003e","title":"Change the status bar color in your Xamarin.Forms app"},{"content":"For each of my items in the ListView, I wanted to display the title of the show and the remaining episodes.\nBut it can be really difficult to see the label on an image.\nA solution I used in my previous Windows Phone app was to add a border with a background color. So I decided to use the same tip with the Frame control.\n\u0026lt;Frame Grid.Row=\u0026#34;0\u0026#34; HeightRequest=\u0026#34;22\u0026#34; VerticalOptions=\u0026#34;End\u0026#34; BackgroundColor=\u0026#34;#80000000\u0026#34; \u0026gt; \u0026lt;StackLayout Orientation=\u0026#34;Horizontal\u0026#34;\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding Title}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;5,0,0,0\u0026#34; LineBreakMode=\u0026#34;TailTruncation\u0026#34; HorizontalOptions=\u0026#34;StartAndExpand\u0026#34; FontAttributes=\u0026#34;Bold\u0026#34; FontSize=\u0026#34;Subtitle\u0026#34;/\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding User.Remaining}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;0,0,5,0\u0026#34; HorizontalOptions=\u0026#34;End\u0026#34; FontAttributes=\u0026#34;Bold\u0026#34; FontSize=\u0026#34;Subtitle\u0026#34; /\u0026gt; \u0026lt;/StackLayout\u0026gt; \u0026lt;/Frame\u0026gt; As you can see, the HeightRequest seems to be ignored. It's bigger than expected. In fact, the Frame control has a default padding of 20. To have the expected result, you just need to set the Frame's Padding to 0.\n\u0026lt;Frame Grid.Row=\u0026#34;0\u0026#34; HeightRequest=\u0026#34;22\u0026#34; VerticalOptions=\u0026#34;End\u0026#34; BackgroundColor=\u0026#34;#80000000\u0026#34; Padding=\u0026#34;0\u0026#34;\u0026gt; \u0026lt;StackLayout Orientation=\u0026#34;Horizontal\u0026#34;\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding Title}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;5,0,0,0\u0026#34; LineBreakMode=\u0026#34;TailTruncation\u0026#34; HorizontalOptions=\u0026#34;StartAndExpand\u0026#34; FontAttributes=\u0026#34;Bold\u0026#34; FontSize=\u0026#34;Subtitle\u0026#34;/\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding User.Remaining}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;0,0,5,0\u0026#34; HorizontalOptions=\u0026#34;End\u0026#34; FontAttributes=\u0026#34;Bold\u0026#34; FontSize=\u0026#34;Subtitle\u0026#34; /\u0026gt; \u0026lt;/StackLayout\u0026gt; \u0026lt;/Frame\u0026gt; And now the HeightRequest defined is applied.\n","permalink":"https://www.fabmoll.be/posts/FrameHeightRequestNotApplied.html","summary":"\u003cp\u003eFor each of my items in the ListView, I wanted to display the title of the show and the remaining episodes.\u003cbr\u003e\nBut it can be really difficult to see the label on an image.\u003c/p\u003e\n\u003cp\u003eA solution I used in my previous Windows Phone app was to add a border with a background color. So I decided to use the same tip with the \u003cstrong\u003eFrame\u003c/strong\u003e control.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-csharp\" data-lang=\"csharp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;Frame Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e HeightRequest=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;22\u0026#34;\u003c/span\u003e VerticalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;End\u0026#34;\u003c/span\u003e  BackgroundColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#80000000\u0026#34;\u003c/span\u003e \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;StackLayout Orientation=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Horizontal\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;Label Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e  Text=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding Title}\u0026#34;\u003c/span\u003e TextColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#FFFFFF\u0026#34;\u003c/span\u003e Margin=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;5,0,0,0\u0026#34;\u003c/span\u003e LineBreakMode=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;TailTruncation\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    HorizontalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;StartAndExpand\u0026#34;\u003c/span\u003e FontAttributes=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Bold\u0026#34;\u003c/span\u003e FontSize=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Subtitle\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;Label Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e  Text=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding User.Remaining}\u0026#34;\u003c/span\u003e TextColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#FFFFFF\u0026#34;\u003c/span\u003e Margin=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0,0,5,0\u0026#34;\u003c/span\u003e HorizontalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;End\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    FontAttributes=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Bold\u0026#34;\u003c/span\u003e FontSize=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Subtitle\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/StackLayout\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/Frame\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp style=\"text-align:center;\"\u003e\n\u003cimg src=\"../images/FrameHeightRequestnotappliedBadHeightRequest.jpg\" alt=\"Wrong HeightRequest\" align=\"center\"/\u003e\u003c/p\u003e","title":"Frame HeightRequest not applied"},{"content":"In my previous blog post I saw that the syntax highlighting was weird on a phone.\nA carriage return was added automatically instead of taking advantage of the power of a scrollbar.\nTo avoid the carriage return and let the scrollbar work as expected we need to override the CSS with the following style: pre code { white-space: pre; word-wrap: normal; } Just create the following folder structure in your input directory, create a file named override.css and add the pre code style in it.\nBuild your blog and start the preview to see the result. ","permalink":"https://www.fabmoll.be/posts/SyntaxHighlightingInWyam.html","summary":"\u003cp\u003eIn my previous blog \u003ca href=\"/posts/RowHeightInListViewItemTemplate\"\u003epost\u003c/a\u003e I saw that the syntax highlighting was weird on a phone.\u003cbr\u003e\nA carriage return was added automatically instead of taking advantage of the \u003cem\u003epower\u003c/em\u003e of a scrollbar.\u003c/p\u003e\n\u003cp style=\"text-align:center;\"\u003e\n\u003cimg src=\"../images/SyntaxHighlightingInWyamCarriageReturn.jpg\" alt=\"Syntax with carriage return\" align=\"center\"/\u003e\u003c/p\u003e\nTo avoid the carriage return and let the scrollbar work as expected we need to override the CSS with the following style:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003epre\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ecode\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ewhite-space\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003epre\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003eword-wrap\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003enormal\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eJust create the following folder structure in your input directory, create a file named \u003cstrong\u003eoverride.css\u003c/strong\u003e and add the \u003cstrong\u003epre code\u003c/strong\u003e style in it.\u003c/p\u003e","title":"Syntax Highlighting In Wyam"},{"content":"In my App I wanted to have a view for my TV shows.\nAs I have a WPF and Windows Phone background, I tried to set the row height on the Grid RowDefinition.\n\u0026lt;ListView ItemsSource=\u0026#34;{Binding Shows}\u0026#34; VerticalOptions=\u0026#34;FillAndExpand\u0026#34; \u0026gt; \u0026lt;ListView.ItemTemplate\u0026gt; \u0026lt;DataTemplate\u0026gt; \u0026lt;ViewCell\u0026gt; \u0026lt;Grid\u0026gt; \u0026lt;Grid.ColumnDefinitions\u0026gt; \u0026lt;ColumnDefinition Width=\u0026#34;*\u0026#34;/\u0026gt; \u0026lt;/Grid.ColumnDefinitions\u0026gt; \u0026lt;Grid.RowDefinitions\u0026gt;\t\u0026lt;RowDefinition Height=\u0026#34;100\u0026#34;/\u0026gt; \u0026lt;/Grid.RowDefinitions\u0026gt; \u0026lt;ffimageloading:CachedImage Grid.Row=\u0026#34;0\u0026#34; Source=\u0026#34;{Binding Image.Banner}\u0026#34; Aspect=\u0026#34;AspectFill\u0026#34;\tRetryCount= \u0026#34;3\u0026#34; RetryDelay= \u0026#34;600\u0026#34; HeightRequest=\u0026#34;100\u0026#34; DownsampleToViewSize = \u0026#34;true\u0026#34;\t/\u0026gt; \u0026lt;Frame Grid.Row=\u0026#34;0\u0026#34; HeightRequest=\u0026#34;20\u0026#34; VerticalOptions=\u0026#34;End\u0026#34; Padding=\u0026#34;0\u0026#34; BackgroundColor=\u0026#34;#80000000\u0026#34; \u0026gt; \u0026lt;StackLayout Orientation=\u0026#34;Horizontal\u0026#34;\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding Title}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;5,0,0,0\u0026#34; LineBreakMode=\u0026#34;TailTruncation\u0026#34; HorizontalOptions=\u0026#34;StartAndExpand\u0026#34;/\u0026gt; \u0026lt;Label Grid.Row=\u0026#34;0\u0026#34; Text=\u0026#34;{Binding User.Remaining}\u0026#34; TextColor=\u0026#34;#FFFFFF\u0026#34; Margin=\u0026#34;0,0,5,0\u0026#34; HorizontalOptions=\u0026#34;End\u0026#34;/\u0026gt; \u0026lt;/StackLayout\u0026gt; \u0026lt;/Frame\u0026gt; \u0026lt;/Grid\u0026gt; \u0026lt;/ViewCell\u0026gt; \u0026lt;/DataTemplate\u0026gt; \u0026lt;/ListView.ItemTemplate\u0026gt; \u0026lt;/ListView\u0026gt; But the result was completely wrong. The black frame is too big and the show title is not displayed.\nI tried to change the row definition of the Grid to Auto and let the image take the needed height but the result was the same.\nIn fact, you have to set the HasUnevenRows property of the ListView to True to force the row height otherwise the ListView will use his default row height size (and the behaviour will be really strange).\n\u0026lt;ListView ItemsSource=\u0026#34;{Binding Shows}\u0026#34; VerticalOptions=\u0026#34;FillAndExpand\u0026#34; HasUnevenRows=\u0026#34;True\u0026#34; \u0026gt; For iOS, I read that you have to set the RowHeight on the ListView or the size will be ignored. I couldn't verify the behaviour but since my items have the same height, I can set the RowHeight property on the ListView and remove the HasUnevenRows property to use its default value (False).\n\u0026lt;ListView ItemsSource=\u0026#34;{Binding Shows}\u0026#34; VerticalOptions=\u0026#34;FillAndExpand\u0026#34; RowHeight=\u0026#34;100\u0026#34;\u0026gt; And here is the result:\n","permalink":"https://www.fabmoll.be/posts/RowHeightInListViewItemTemplate.html","summary":"\u003cp\u003eIn my App I wanted to have a view for my TV shows.\u003cbr\u003e\nAs I have a WPF and Windows Phone background, I tried to set the row height on the Grid RowDefinition.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-csharp\" data-lang=\"csharp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;ListView ItemsSource=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding Shows}\u0026#34;\u003c/span\u003e VerticalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;FillAndExpand\u0026#34;\u003c/span\u003e \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;ListView.ItemTemplate\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;DataTemplate\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;ViewCell\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;Grid\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;Grid.ColumnDefinitions\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         \u0026lt;ColumnDefinition Width=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;/Grid.ColumnDefinitions\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;Grid.RowDefinitions\u0026gt;\t\t\t\t\t\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         \u0026lt;RowDefinition Height=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;100\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;/Grid.RowDefinitions\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;ffimageloading:CachedImage Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e Source=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding Image.Banner}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        Aspect=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;AspectFill\u0026#34;\u003c/span\u003e\t\t\t\t\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        RetryCount= \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;3\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        RetryDelay= \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;600\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        HeightRequest=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;100\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        DownsampleToViewSize = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\t/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;Frame Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e HeightRequest=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;20\u0026#34;\u003c/span\u003e VerticalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;End\u0026#34;\u003c/span\u003e Padding=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        BackgroundColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#80000000\u0026#34;\u003c/span\u003e \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u0026lt;StackLayout Orientation=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Horizontal\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            \u0026lt;Label Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e  Text=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding Title}\u0026#34;\u003c/span\u003e TextColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#FFFFFF\u0026#34;\u003c/span\u003e Margin=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;5,0,0,0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            LineBreakMode=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;TailTruncation\u0026#34;\u003c/span\u003e HorizontalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;StartAndExpand\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            \u0026lt;Label Grid.Row=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e  Text=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{Binding User.Remaining}\u0026#34;\u003c/span\u003e TextColor=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;#FFFFFF\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            Margin=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;0,0,5,0\u0026#34;\u003c/span\u003e HorizontalOptions=\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;End\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u0026lt;/StackLayout\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;/Frame\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;/Grid\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;/ViewCell\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/DataTemplate\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/ListView.ItemTemplate\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/ListView\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBut the result was completely wrong. The black frame is too big and the show title is not displayed.\u003c/p\u003e","title":"Row height in ListView ItemTemplate"},{"content":"Yeah! The first post.\nI really wanted to start my blog and I finally decided to install everything to do so.\nEven if you only see a simple page, I had a fun time with my Azure Pipeline.\nThe source code of my blog is hosted on Azure DevOps and with one push to the Git repository, the Pipeline compiles my blog and publishes the result automatically to my GitHub Pages. It's magic!\nLike you can see, there are still several things to configure on this blog but if I don't start now I'll never start!\nEnjoy ;)\n","permalink":"https://www.fabmoll.be/posts/first-post.html","summary":"\u003cp\u003eYeah! The first post.\u003cbr\u003e\nI really wanted to start my blog and I finally decided to install everything to do so.\u003cbr\u003e\nEven if you only see a simple page, I had a fun time with my Azure Pipeline.\u003c/p\u003e\n\u003cp\u003eThe source code of my blog is hosted on \u003ca href=\"https://azure.microsoft.com/en-us/services/devops/\" target=\"_blank\"\u003eAzure DevOps\u003c/a\u003e and with one push to the Git repository, the Pipeline compiles my blog and publishes the result automatically to my GitHub Pages. It's magic!\u003cbr\u003e\nLike you can see, there are still several things to configure on this blog but if I don't start now I'll never start!\u003cbr\u003e\nEnjoy ;)\u003c/p\u003e","title":"A new adventure"},{"content":"My name is Fabrice Moll. I'm a Software Developer. I like movies, manga, anime and... more. This blog, its content and opinions are my own.\nYou can subscribe to my feed and you can find me on X.\n","permalink":"https://www.fabmoll.be/about.html","summary":"\u003cp\u003eMy name is Fabrice Moll. I'm a \u003ca href=\"https://github.com/fabmoll\" target=\"_blank\"\u003eSoftware Developer\u003c/a\u003e. I like movies, manga, anime and... more.\n\u003cstrong\u003eThis blog, its content and opinions are my own\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eYou can subscribe to my \u003cimg src=\"/images/icon-rss.png\" alt=\"RSS\" class=\"inline-icon\"\u003e \u003ca href=\"/feed.xml\"\u003efeed\u003c/a\u003e and you can find me on \u003csvg class=\"inline-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\" role=\"img\" aria-label=\"X\"\u003e\u003cpath d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/\u003e\u003c/svg\u003e \u003ca href=\"https://x.com/fabmoll\" target=\"_blank\"\u003eX\u003c/a\u003e.\u003c/p\u003e","title":"About Me"}]