<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Waldemar Korłub, Autor w serwisie Inero Software - Software Consulting</title>
	<atom:link href="https://inero-software.com/author/stawrul/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>We unleash innovations using cutting-edge technologies, modern design and AI</description>
	<lastBuildDate>Fri, 08 Apr 2022 09:29:29 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Waldemar Korłub, Autor w serwisie Inero Software - Software Consulting</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Create Google Docs custom Add-on using Apps Script with TypeScript</title>
		<link>https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/</link>
		
		<dc:creator><![CDATA[Waldemar Korłub]]></dc:creator>
		<pubDate>Tue, 19 Jan 2021 11:20:57 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apps Script]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[Back-office automation]]></category>
		<category><![CDATA[corporate]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Workspace]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=3190</guid>

					<description><![CDATA[<p>Artykuł <a href="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/">Create Google Docs custom Add-on using Apps Script with TypeScript</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="row">
<p><div class="col-sm-3"></div></p>
<p><div class="col-sm-6">
<p></p>
<p><img decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" style="padding-top: 1rem;" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p style="padding-top: 1rem;"><a href="https://workspace.google.com/">Google Workspace (GW)</a> is a great tool for corporate collaboration that simplifies document flow between employees and allows you to use smart automation tricks to make your teamwork more agile and efficient. It also allows you to combine other Google services such as natural language processing and understanding, chatbots, Google Vision, built-in google databases and many others thus allowing to improve collaboration for corporate teams. In this post, I will show you how one of Google Workspace tricks, Google Apps Script, can be helpful in your corporate document creation and processing. We’re going to have a look behind the scenes of creating <i>Header and Footer</i> which is triggered with a single menu-item click! (not (CTRL+C, CTRL+V) x2 ). And to spice things up we’re going to write code in TypeScript in local IDE and then compile it to Apps Script code.</p>
<p>But before we do that, let’s just quickly explain what <strong>Apps Script</strong> is.</p>
<p>Basically speaking Apps Script is a Google Platform to develop business applications integrated with Google Workspace applications like Gmail, GDocs, etc. The code itself is a plain Javascript that has access to libraries that allows you to access the Google resources you need. (like a spreadsheet (GSheets) or the document (GDocs))</p>
<p>If you feel like you need to learn more about this then check <a href="https://developers.google.com/apps-script/overview"> The official AppScript overview page.</a></p>
<h3><span style="color: #511b73;"><b>Environment Setup</b></span></h3>
<h4><span style="color: #511b73;"><b>Online Editor (JavaScript)</b></span></h4>
<p>As mentioned before, we are going to develop the application in local IDE with Typescript, but if you think that you don’t need it (you really don’t have to). Then you can just open the online editor in your Google application like this:</p>
<p><img fetchpriority="high" decoding="async" data-attachment-id="3198" data-permalink="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/appscript1/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript1.png" data-orig-size="683,490" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AppScript1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript1-300x215.png" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript1.png" tabindex="0" role="button" class="aligncenter wp-image-3198 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/AppScript1.png" alt="Script editor in the tools menu" width="683" height="490" srcset="https://inero-software.com/wp-content/uploads/2021/01/AppScript1.png 683w, https://inero-software.com/wp-content/uploads/2021/01/AppScript1-300x215.png 300w, https://inero-software.com/wp-content/uploads/2021/01/AppScript1-418x300.png 418w" sizes="(max-width: 683px) 100vw, 683px" /></p>
<p>Once you do that, you can just start writing code that you want, the main AppScript file should already be created. Please note that if you choose this approach you’ll be writing JavaScript code (just skip the types if you want to follow my code from the next chapters)</p>
<h4><span style="color: #511b73;"><b>Local IDE (TypeScript/JavaScript)</b></span></h4>
<p>To write TypeScript code you’ll need (guess what) a local IDE. I am using IntelliJ, but you can go with VS Code and it also should do the job just fine. Unfortunately, this is not enough to make this work. You’ll also need NodeJs and a package manager (I used npm), which is going to help us install type definitions for TypeScript and clasp.</p>
<h5><span style="color: #511b73;"><b>Install commands:</b></span></h5>
<pre>npm install -g @google/clasp
npm i -S @types/google-apps-script
</pre>
<p><a href="https://github.com/google/clasp"> Clasp (Command Line Apps Script Projects) </a> is what’s going to connect our code with the documents stored on our Google Drive. I won’t go into the details of using this command line. Just the basics that I had to use myself. Of course, if you need more then here’s the <a href="https://developers.google.com/apps-script/guides/clasp">Apps Script clasp small guide</a>.</p>
<p>After you install clasp you have to log in to your Google account (so that you can access your GDrive). After typing the command below you’ll be taken to the google login website where you’ll follow the instructions.</p>
<pre>clasp login
</pre>
<p>Now you’re logged in and ready for action! 🙂 And by action, I mean creating a project. For that we’re going to use the following command:</p>
<pre>clasp create
</pre>
<p>Which is going to ask you for the type of application that you want:</p>
<p><img decoding="async" data-attachment-id="3195" data-permalink="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/appscript2/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript2.jpg" data-orig-size="316,136" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AppScript2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript2-300x129.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript2.jpg" tabindex="0" role="button" class="alignnone wp-image-3195 size-medium" src="https://inero-software.com/wp-content/uploads/2021/01/AppScript2-300x129.jpg" alt="types of application" width="300" height="129" srcset="https://inero-software.com/wp-content/uploads/2021/01/AppScript2-300x129.jpg 300w, https://inero-software.com/wp-content/uploads/2021/01/AppScript2.jpg 316w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>In today’s use-case, we’re going to select the docs.</p>
<p>After you do that your project should be ready to work on.</p>
<p>Few things to keep in mind:</p>
<ul>
<li>This is going to create a document in your GDrive.</li>
<li>The document’s name is going to be the same as the name of the folder in which you created the project with clasp create.</li>
<li>You probably will have to create file Code.ts yourself.</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>The Goal</b></span></h3>
<p>Okay, so the actual thing that we want to achieve is the header footer, which can be triggered with a single click, like this:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="3196" data-permalink="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/appscript3/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript3.jpg" data-orig-size="448,230" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AppScript3" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript3-300x154.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript3.jpg" tabindex="0" role="button" class="aligncenter wp-image-3196 size-medium" src="https://inero-software.com/wp-content/uploads/2021/01/AppScript3-300x154.jpg" alt="adding corporate header" width="300" height="154" srcset="https://inero-software.com/wp-content/uploads/2021/01/AppScript3-300x154.jpg 300w, https://inero-software.com/wp-content/uploads/2021/01/AppScript3.jpg 448w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>And the click would result in this:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="3197" data-permalink="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/appscript4/" data-orig-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript4.jpg" data-orig-size="576,804" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AppScript4" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript4-215x300.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2021/01/AppScript4.jpg" tabindex="0" role="button" class="aligncenter wp-image-3197 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/AppScript4.jpg" alt="Header footer" width="576" height="804" srcset="https://inero-software.com/wp-content/uploads/2021/01/AppScript4.jpg 576w, https://inero-software.com/wp-content/uploads/2021/01/AppScript4-215x300.jpg 215w" sizes="(max-width: 576px) 100vw, 576px" /><br />
<img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>The Code</b></span></h3>
<p>Now you’re probably ready to get to the actual coding. You can open the previously created Code.ts file and write some functions using google types definitions we installed before.</p>
<p>Again I am not going to go into details of every single interface and object defined in Apps Script, just the ones that were useful for this use case.</p>
<h4><span style="color: #511b73;"><b>Style</b></span></h4>
<p>First thing that we’re going to do is to define the text style:</p>
<pre>function getTextStyle(): any {
const style = {};
style[DocumentApp.Attribute.BOLD] = false;
style[DocumentApp.Attribute.FONT_FAMILY] = 'Calibri';

return style;
}

</pre>
<p>This function is going to be used in both header and footer to provide the appropriate font-weight and font-family.</p>
<h4><span style="color: #511b73;"><b>Logo</b></span></h4>
<p>To display the company logo we’re going to create a separate function, which takes in a document paragraph to which the logo is going to be connected and desired size as arguments.</p>
<pre>function addLogo(parentParagraph: GoogleAppsScript.Document.Paragraph, size: number): void {
const logoBlob = DriveApp.getFilesByName('Inero_Software_logo.png').next().getBlob();
parentParagraph.addPositionedImage(logoBlob)
.setLeftOffset(400)
.setHeight(size)
.setWidth(size);
}
</pre>
<p>As you can see here, we are using DriveApp, which allows us to get any file stored on our Google Drive, in this case, we are getting a logo (I don’t have to mention that it is on my GDrive, right?)</p>
<p>The setLeftOffset function is pushing the logo to it’s righteous place. (like you know, the image is on the right side not left… nevermind)</p>
<h4><span style="color: #511b73;"><b>Header</b></span></h4>
<p>First step of header and footer functions is checking whether the header already exists. (If somebody already has something in the header, adding more stuff through Apps Script could result in unwanted text/image setting.)</p>
<pre>function addHeader(): void {

let header = DocumentApp.getActiveDocument().getHeader();
if (!header) {
header = DocumentApp.getActiveDocument().addHeader();
}
…
}
</pre>
<p>The logic here is pretty straightforward. We take our GoogleDoc using DocumentApp.getActiveDocument() and get the Header of the document. If it doesn’t exist then create it.</p>
<p>Easy.</p>
<p>But you may be wondering, what’s the <a href="https://developers.google.com/apps-script/reference/document/document-app"> DocumentApp </a>. It is a class/service which allows you to open google docs stored on your GDrive (it doesn’t have to be the active one).</p>
<p>Next step is to put the content inside our header:</p>
<pre>function addHeader(): void {

...

const style = getTextStyle();
style[DocumentApp.Attribute.FONT_SIZE] = 11;

let firstParagraph = header.appendParagraph('Inero Software sp. z o. o').setAttributes(style);
header.appendParagraph('Ul. Trzy Lipy 3, 80-172 Gdańsk, PL').setAttributes(style);
header.appendParagraph('inero-software.com').setAttributes(style);

addLogo(firstParagraph, 60);

header.appendHorizontalRule();
}
</pre>
<p>You can see what’s happening here:</p>
<ul>
<li>We set font-size</li>
<li>We create 3 paragraphs, assign them the <b style="font-weight: bold;">text</b> and <span style="background-color: pink;"> style</span></li>
<li>We save the first paragraph to a variable, so we can use it as a reference point for inserting the logo</li>
<li>At last, but not least, we append the horizontal rule which gives a nice touch to our header</li>
</ul>
<p>The footer function is almost exactly the same, so I won’t be describing it. But here’s the code since for quick overview:</p>
<pre>function addFooter(): void {

let footer = DocumentApp.getActiveDocument().getFooter();
if (!footer) {
footer = DocumentApp.getActiveDocument().addFooter();
}

const style = getTextStyle();
style[DocumentApp.Attribute.FONT_SIZE] = 10;

let firstParagraph = footer.appendParagraph('inero-software.com').setAttributes(style);
footer.appendParagraph('hi@sandbox-www.devel.inero.com.pl').setAttributes(style);
footer.appendParagraph('VAT ID: PL583327270').setAttributes(style);

addLogo(firstParagraph, 40);
}
</pre>
<p>Is that it!?</p>
<p>No, we still need to create the aforementioned menu, right? Here’s the function:</p>
<pre>function onOpen(e): void {
DocumentApp.getUi().createAddonMenu()
.addItem('Add corporate Header &amp; Footer', 'addFooterAndHeader')
.addToUi();
}
</pre>
<p>Here DocumentApp allows us to access the user interface and add what we want to it. And what we want is the menuItem. <i>addItem()</i> function takes in the text which will be displayed in the UI and the function to trigger when clicked.</p>
<p>Function onOpen is one of the <a href="https://developers.google.com/apps-script/guides/triggers">simple triggers </a>, and onOpen is triggered whenever a document is opened (so every time you click F5 the <b style="font-weight: bold;">menuItem</b> is being added).</p>
<p>Here’s the function which is executed when you click the menuItem:</p>
<pre>function addFooterAndHeader(): void {
addHeader();
addFooter();
}
</pre>
<p>No explaining needed here…</p>
<p>Is that it!?</p>
<p>Yes, but only when it comes to code. One more thing left to do is to <b style="font-weight: bold;">push the code</b> to our Google Drive document. (you can skip it if you’re using the online editor)</p>
<p>It’s an easy thing to do, all you have to do is to go to your project directory, open your CLI, and type…</p>
<pre>clasp push
</pre>
<p>And that’s it! You can go to your google drive account, find your file and start the script through your own menu item. You will have to agree that you trust this add-on a few times, and that is a question only you can answer&#8230; Do you trust yourself? (or how google puts it &#8211; do you trust this unknown developer)<br />
<img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>Summary</b></span></h3>
<p><img decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" style="padding-top: 1rem;" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />I’d say that the whole operation was relatively easy to do. You can see how fast you can create a custom add-on that simplifies (automates) your back-office tasks (especially if you don’t care about type-checking and use the online editor, not the local setup). It’s enough if you check the docs to see how certain classes work and you’re good to go!</p>
<p>But what else could you do besides a simple header &amp; footer?</p>
<p>That may sound kind of corny but &#8211; whatever your imagination tells you. You could attach custom footers to your emails depending on who you write to, or maybe integrate google cloud search with your databases so that you could reference your data inside your emails within seconds. Seriously, a lot of possibilities.</p>
<p>Google Workspace, similarly to Microsoft SharePoint, provides great tools for back-office automation. Using GW you can integrate various services that Google offers and combine them including such services as natural language processing, machine learning, App Scripts, Google Vision and many others and adjust them to your corporate requirements.<br />
<i><br />
What&#8217;s your next (first?) Apps Script project?<br />
If it&#8217;s not a secret then share it with me on twitter <a href="https://twitter.com/IgorStencel"> @IgorStencel </a>.<br />
(If it is a secret though, we can chat about it privately through <a href="https://www.linkedin.com/in/igor-s-frontenddev/"> LinkedIn</a>, don&#8217;t be a stranger!)</i></p>
<p>In need of some <b style="font-weight: bold;">real help</b> with creating your dream Google Workspace Add-on?<br />
Contact us at <a> hi@inero-software.com</a></p>
<p><a href="https://inero-software.com/contact-us/"><strong><span style="color: #800080;">Inero Software</span></strong></a> provides knowledge and expertise on how to successfully use cutting edge technologies and data to shape corporate digital products of the future.</p>
<p><span data-contrast="auto">In the <a href="https://inero-software.com/category/blog/company/"><strong><span style="color: #800080;">blog post</span></strong></a> section you will find other articles about IT systems and more!</span></p>
<p></p></div>&gt;<br />
</p></div>
<p>Artykuł <a href="https://inero-software.com/create-google-docs-custom-add-on-using-apps-script-with-typescript/">Create Google Docs custom Add-on using Apps Script with TypeScript</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3190</post-id>	</item>
		<item>
		<title>RxJs for beginners (5 most useful operators)</title>
		<link>https://inero-software.com/rxjs-for-beginners-5-most-useful-operators/</link>
		
		<dc:creator><![CDATA[Waldemar Korłub]]></dc:creator>
		<pubDate>Thu, 26 Nov 2020 12:45:44 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[DOM event]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Http request]]></category>
		<category><![CDATA[Observable]]></category>
		<category><![CDATA[Operator]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=3159</guid>

					<description><![CDATA[<p>This time we’re going to take a look at RxJs operators, what they do, and how you should (or shouldn’t) use it. In case you decide that in fact you want to use it then you can read the rest of the article where I go over most common use&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/rxjs-for-beginners-5-most-useful-operators/">RxJs for beginners (5 most useful operators)</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div style="padding-top: 1rem;">This time we’re going to take a look at RxJs operators, what they do, and how you should (or shouldn’t) use it. In case you decide that in fact you want to use it then you can read the rest of the article where I go over most common use cases and usage examples.</div>
<p>WARNING: I assume that you know basics of asynchronous programming, if not then please read this before going any further: <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Concepts">Asynchronous Concepts</a></p>
<h3><span style="color: #511b73;"><b>So, what’s RxJs?</b></span></h3>
<p>According to the documentation:</p>
<blockquote><p>RxJS is a library for composing asynchronous and event-based programs by using observable sequences. It provides one core type, the Observable, satellite types (Observer, Schedulers, Subjects) and operators inspired by Array#extras (map, filter, reduce, every, etc) to allow handling asynchronous events as collections.</p></blockquote>
<p>In simple words, RxJs is a library which helps you in working with asynchronous tasks, events and streams and it does that by sharing some useful classes like aforementioned <em>Observable</em> and a ton of cool operators (due to my desire of keeping this post relatively short I am going to present only 5 operators that I find the most useful in my everyday work). Actually, RxJs has been so helpful to the Angular community that the Angular team decided to include it into Angular itself with the 6th version.</p>
<p>We are going to focus on <em>Observables</em> this time. <em>Observable</em> is a class that allows you to listen for events. To retrieve data from an <em>observable</em> you need to subscribe to it, when you do that it listens for events happening, so when they happen, you get the data. You can get more details on <em>observables</em> here: https://rxjs.dev/guide/observable.</p>
<p>Now let’s discuss 3 most common situations where developers are using <em>Observables</em></p>
<h4><span style="color: #511b73;"><b>Http Requests</b></span></h4>
<p>All HtttpClient methods are returning Observables and that is of course because it takes time for a server to process and return the data (or just return in case you’re sending a <em>get</em> request). That means that http request operation is asynchronous.</p>
<h4><span style="color: #511b73;"><b>DOM events</b></span></h4>
<p>Observables enable you to easily listen for DOM events like <em>click</em> or <em>keyup</em>. To listen to them you should use the <em>fromEvent</em> function that creates an <em>observable</em> accordingly. Here’s how this looks like:</p>
<p>fromEvent(document, &#8216;keyup&#8217;);</p>
<p>(Remember that if you want to receive the actual data you should subscribe to it by adding .subscribe() before semicolon)</p>
<h4><span style="color: #511b73;"><b>Stores</b></span></h4>
<p>Another very common use case for using <em>Observables</em> is using them with some kind of store, like NgRx or NgXs. Stores like that usually share observables in order to keep watch over the state of the application.</p>
<p>Now since you know the very basics like why and how, let’s get to the useful interesting stuff that can be one with RxJs operators.</p>
<h3><span style="color: #511b73;"><b>RxJs o</b></span><span style="color: #511b73;"><b>perators</b></span></h3>
<p>In our examples we are going to use simplest observable possible:</p>
<pre>const obs$ = from([1, 2, 3]); (dollar sign at the end of the variable is a naming convention used to singlaize that the variable is indeed an observable)
</pre>
<h4><span style="color: #511b73;"><b>How to use operators?</b></span></h4>
<p>Easiest way to use operators is by putting them inside a pipe. Pipe runs a function for every stream element passing by the operator, and operators are the functions that can be used within it.</p>
<h5><span style="color: #511b73;"><b>first</b></span></h5>
<p><em>First</em> operator is the first operator that we’re going to talk about (got the pun?). Most operators have self-describing titles and this case is no different. <em>First</em> operator basically allows you to listen for the first returned value of the <em>observable</em> and then stop (note that it is completely useless combined with Http requests that return the value once anyways)</p>
<pre>obs$.pipe(first()).subscribe(numbr =&gt; console.log(number));
</pre>
<p>Code above prints only 1 because it’s the first event emitted, 2 and 3 are ignored.</p>
<h5><span style="color: #511b73;"><b>tap</b></span></h5>
<p>Another useful operator worth mentioning is <em>tap</em>. Tap allows you to perform some kind of side effect for every event emission. For example you can log something or assign data to a variable (note: if you are using .subscribe it is basically the same thing).</p>
<pre>obs$.pipe(tap(numbr =&gt; console.log(number))).subscribe();
</pre>
<p>Code above prints 1, 2 and 3 because <em>tap</em> is triggered for every emitted value.</p>
<h5><span style="color: #511b73;"><b>map</b></span></h5>
<p><em>Map</em> is working the same way as in arrays. So it basically allows you to change structure of returned data. For example, let’s try to multiply every value returned by 2</p>
<pre>obs$.pipe(map(numbr =&gt; numbr * 2)).subscribe(value =&gt; console.log(value));
</pre>
<p>The code prints 2, 4 and 6 just as expected.</p>
<h5><span style="color: #511b73;"><b>startWith</b></span></h5>
<p><em>StartWIth</em> allows you to decide what first value is going to be. It is useful when you want to trigger the observable before the first event emission.</p>
<pre>obs$.pipe(startWith(999)).subscribe(value =&gt; console.log(value));
</pre>
<p>Printed values are: 999, 1, 2, 3.</p>
<h5><span style="color: #511b73;"><b>switchMap</b></span></h5>
<p><em>SwitchMap</em> is used mainly in typeahead cases but not limited to them. What it does &#8211; it cancels previous request when a new event arrives. In real life case you would for example listen for changes on the input and filter a table while typing (previous result is not relevant).<br />
To present switchMap fully &#8211; this time we are going to use a different example. <em>Observable</em> is going to be created out of DOM event keyup.</p>
<pre>const another$ = timer(1000);
fromEvent(document, 'keyup').pipe(
switchMap(() =&gt; another$)
).subscribe(() =&gt; console.log('log'));
</pre>
<p>What happens here is: After you click a button on keyboard, wait 1000 ms and then log a message. Now what happens ,if you click button 10 times quicker? Only one message is going to be logged, and that is because switchMap cancels previous timers leaving only the most recent one.</p>
<p>We went over 5 most useful operators in my opinion, described what RxJs is and discussed common use cases. I hope that this article will help you in your next project and interest you in exploring RxJs more 🙂</p>
<p><a href="https://inero-software.com/contact-us/"><strong><span style="color: #800080;">Inero Software</span></strong></a> provides knowledge and expertise on how to successfully use cutting edge technologies and data to shape corporate digital products of the future.</p>
<p><span data-contrast="auto">In the <a href="https://inero-software.com/category/blog/company/"><strong><span style="color: #800080;">blog post</span></strong></a> section, you can find other articles about our projects and more!</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>
<p>Artykuł <a href="https://inero-software.com/rxjs-for-beginners-5-most-useful-operators/">RxJs for beginners (5 most useful operators)</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3159</post-id>	</item>
		<item>
		<title>Angular: How to manage back-end long-running asynchronous tasks</title>
		<link>https://inero-software.com/angular-how-to-manage-back-end-long-running-asynchronous-tasks/</link>
		
		<dc:creator><![CDATA[Waldemar Korłub]]></dc:creator>
		<pubDate>Tue, 20 Oct 2020 13:48:28 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[DeliverM8]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[websockets]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=3080</guid>

					<description><![CDATA[<p>Today we’re going to talk about managing back-end long-running asynchronous tasks in Angular. This term may seem long and scary to you, but don’t freak out. After reading this article you’re going to be familiar with this concept and even be able to handle this use case in your own&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/angular-how-to-manage-back-end-long-running-asynchronous-tasks/">Angular: How to manage back-end long-running asynchronous tasks</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><br />
Today we’re going to talk about managing back-end long-running asynchronous tasks in Angular. This term may seem long and scary to you, but don’t freak out. After reading this article you’re going to be familiar with this concept and even be able to handle this use case in your own projects.</p>
<h3><span style="color: #511b73;"><b>Why Angular?</b></span></h3>
<p>At Inero Software we are using Angular at the front-end side of most of our projects and that is not without a reason.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<ul>
<li>It is suitable for big software systems because of its component-based architecture which provides a higher quality of code, better maintainability, and code reusability.</li>
<li>Native Typescript support, Typescript means Types and that means safer code.</li>
<li>Angular, unlike other frameworks, is fully stacked with predefined solutions to problems you may approach, you don’t have to think about which library to use for every single implementation case whether it be routing, reactive programming, or making Http requests.</li>
</ul>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>What’s a back-end long-running asynchronous task?</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />The easiest way to understand what’s a back-end long-running asynchronous task is to explain it with an example of our product which possesses this kind of task.</p>
<p>At <a href="https://inero-software.com/inero-software-team-work/">Inero Software</a> we are developing a product called <a href="http://deliverm8.com">DeliverM8</a> which is a delivery optimization platform. It has many functionalities but let’s focus on the important one for today&#8217;s article. Imagine that you run a company that is delivering products all around the country. You need a system that would display to you how many products and which products to put onto a truck and also <i>how</i> should they be ordered so that everything fits nicely.</p>
<p>Input requires the following data:</p>
<ul>
<li>How many products should be delivered?</li>
<li>What are their sizes?</li>
<li>Where do they go? (so we know which products should be on the beginning or end of the truck etc.)</li>
</ul>
<p>The output is a 3d visualization which looks like this:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="3093" data-permalink="https://inero-software.com/angular-how-to-manage-back-end-long-running-asynchronous-tasks/deliverm8_packing_example/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example.png" data-orig-size="1280,720" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="DeliverM8_Packing_Example" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-1030x579.png" tabindex="0" role="button" class="aligncenter wp-image-3093 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example.png" alt="A visualisation of elements" width="1280" height="720" srcset="https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example.png 1280w, https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-300x169.png 300w, https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-768x432.png 768w, https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2020/10/DeliverM8_Packing_Example-533x300.png 533w" sizes="(max-width: 1280px) 100vw, 1280px" /></p>
<p>As you may imagine &#8211; it does take time for a backend service to create output like this, the AI that stands behind <a href="https://inero-software.com/machine-learning-professionals/">DeliverM8</a> logic runs millions of operations per second in order to find the best optimal available element arrangement. This is <b>the back-end long-running asynchronous task</b>. Depending on the input this may take up to <b>10 minutes </b>and of course freezing of the frontend application until the data is retrieved is the last thing that we need, so what should we do?</p>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>Approaches</b></span></h3>
<p>A DISCLAIMER: All examples are made with Angular, but the concepts mentioned below can easily be applied to any other frameworks/languages.</p>
<h4><span style="color: #511b73;"><b>Synchronous</b></span></h4>
<p>Probably the worst option out there but should be mentioned nevertheless. If in fact, the user shouldn’t be using the application, while he is waiting for the response, then you can just put some kind of modal loading screen while the user awaits the data and the problem is solved.</p>
<h5><span style="color: #511b73;">How:</span></h5>
<p>You send a single POST request that tells the backend to start the calculations and return the data within the response of the beforementioned request.</p>
<h5><span style="color: #511b73;"><b>Example:</b></span></h5>
<pre>public loadTrucks(loadTruckData): Observable&lt;Route[]&gt; {
return this.http.post&lt;Route[]&gt;('/api/load-trucks', loadTruckData);
}
</pre>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h4><span style="color: #511b73;"><b>Polling</b></span></h4>
<p>Now polling is a slightly better option if the user wants to use the application while the data is loading and you don’t have that much time to invest in the solution and/or your backend is not providing you with WebSockets then polling is the way to go.</p>
<p>Polling means checking the status of (a backend endpoint in this case ), especially as part of a repeated cycle. Translating it to front-end language means making a get request every few seconds to see if the asynchronous task is finished. For backend that would mean creating a new GET endpoint that would return the calculated data. (if in fact it has been calculated before)</p>
<p>Not the most elegant solution out there but still pretty usable!</p>
<h5><span style="color: #511b73;"><b>How:</b></span></h5>
<p>We make one POST request that informs the backend to start the calculations and one more GET request to get the output data.</p>
<p>One of the ways of polling is combining RxJs’s <i>timer</i> with <i>switchMap</i>. Also remember to unsubscribe, because all sorts of intervals can easily produce memory leaks, in this example, we are using <i>takeUntil</i> operator that unsubscribes from the observable when it’s component is destroyed.</p>
<h5><span style="color: #511b73;"><b>Example:</b></span></h5>
<pre>timer(0, 5000).pipe( switchMap(() =&gt; this.truckService.getLoadedTrucks()), takeUntil(this.stopPolling) )
</pre>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h4><span style="color: #511b73;"><b>Websockets</b></span></h4>
<p>Websocket is a communication protocol (just like HTTP) “for a persistent, bi-directional, full duplex TCP connection from a user’s web browser to a server”. Basically what it means is that with WebSockets you can send out the data from the server and receive it in your frontend application without making any unnecessary requests (like you would using polling).</p>
<p>With the Websocket approach, you would send an HTTP POST request to start calculating the truckload. And at the same time, you would establish a WebSocket connection between the Frontend application and the server so that when the backend tasks finish the output is sent through that WebSocket connection.</p>
<h5><span style="color: #511b73;"><b>How:</b></span></h5>
<p>Send HTTP POST request that informs the backend to start the calculations and listen on Websocket connection with a backend that returns data when the calculations finish</p>
<h5><span style="color: #511b73;">Example:</span></h5>
<p>At first, you connect to a WebSocket:</p>
<pre>public connect() {
const socket = new <b><i>WebSocket</i></b>(this.webSocketUri);
this.stompClient = Stomp.over(socket);
this.stompClient.connect({},
() =&gt; this.subscribe()
}

</pre>
<p>And later on, you subscribe to its values:</p>
<pre>this.stompClient.subscribe('/user/queue/truck-load-updates-queue', (msg: Stomp.Frame) =&gt; {
const msgBody = <b><i>JSON</i></b>.parse(msg.body);
...
});
</pre>
<p>The subscription above is triggered after the calculation is done.<br />
<img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>Conclusion</b></span></h3>
<p>That’s it!</p>
<p>I’ve described to you the problem of back-end long-running asynchronous tasks and various ways of handling them in the frontend application.</p>
<p>Websockets are the best way to go if you are struggling with this problem, but if the user doesn’t mind getting his application blocked (or maybe it is intended to block the app for the time being) for the time when the backend is performing its tasks then you can simply go with KISS principle and just make one synchronous request.</p>
<p>Polling is also an option if the developers don’t feel like implementing WebSockets and additional network movement is of no concern.</p>
<p>Thanks for reading! And I hope you liked the article 🙂</p>
<p>Artykuł <a href="https://inero-software.com/angular-how-to-manage-back-end-long-running-asynchronous-tasks/">Angular: How to manage back-end long-running asynchronous tasks</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3080</post-id>	</item>
		<item>
		<title>What&#8217;s after Angular?</title>
		<link>https://inero-software.com/whats-after-angular/</link>
		
		<dc:creator><![CDATA[Waldemar Korłub]]></dc:creator>
		<pubDate>Thu, 16 Jul 2020 07:40:35 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[flutter]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[react]]></category>
		<category><![CDATA[reactivity]]></category>
		<category><![CDATA[svelte]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webassembly]]></category>
		<category><![CDATA[webcomponents]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=2905</guid>

					<description><![CDATA[<p>&#160; The frontend world is currently ruled by 3 colossuses known as Angular, React.js, and Vue.js, but are there any other alternatives? And if so, are they worth using? Let’s take a quick look at what else is out there as we see it in our team. The Standard Besides&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/whats-after-angular/">What&#8217;s after Angular?</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<p>The frontend world is currently ruled by 3 colossuses known as Angular, React.js, and Vue.js, but are there any other alternatives?</p>
<p>And if so, are they worth using? Let’s take a quick look at what else is out there as we see it in <a href="https://inero-software.com/inero-software-team-work/">our team</a>.</p>
<h3><span style="color: #511b73;"><b>The Standard</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Besides Angular (my main go-to when it comes to the frontend development) there is its main rival &#8211; React. <a href="https://www.g2i.co/blog/react-separation-of-concerns">Since React is a library not a framework like Angular, by definition it gives you more freedom when it comes to the composition of your application and development style that you want to approach</a>. React is known for its JSX syntax which allows you to mix javascript with HTML and CSS code.</p>
<p>Vue.js is different from React in this matter. It is structured like web-component so it’s separated into js, CSS, and HTML. Another thing that differs Vue.js from Angular and React.js is its origin. Vue is the only “independent” framework. What do I mean by that? There is no big company behind it like in other cases where Angular comes from Google and React has been created by Facebook. Vue.js is a better choice than Angular and React when you are looking for a small app or a quick MVP development. That is because setting up a project and its configuration in Vue takes much less time than in frameworks mentioned earlier.</p>
<p>Okay, but where’s the new stuff you say? There you go:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>Web Components</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Web components as it states on its website are: “&#8230;a set of web platform APIs that allow you to create new custom, reusable, encapsulated HTML tags to use in web pages and web apps. Custom components and widgets build on the Web Component standards, will work across modern browsers, and can be used with any JavaScript library or framework that works with HTML.”.</p>
<p>So essentially what it means is that you can create universal components with Web Components API which you can use with literally any framework (or no framework at all) that supports HTML and these components should work correctly on all modern browsers.</p>
<p>Probably the most popular library for creating web components right now is Polymer.<br />
Polymer is a JavaScript library based on Web Components API created by Google employees.<br />
Most important reasons for why Polymer is favored by Web Components developers are:<br />
• Data binding – Connects data from a custom element to its local DOM element. Both one-way and two-way.<br />
• Polymer CLI – Includes a build pipeline, a boilerplate generator for creating elements and apps, a linter, a development server, and a test runner.<br />
• Conditional and repeat templates – Gives you the ability to use loops and if statements in HTML<br />
And there’s much much more.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>WebAssembly</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />A different approach was proposed by creators of WebAssembly which basically allows you to use low-level languages like for example C, C++, and Rust to create web applications by compiling them to WebAssembly binary instruction format – assembly-like language that runs with near-native performance.</p>
<p>You probably wonder how is it possible to develop a web app with this kind of languages. Well, Wasm (WebAssembly) provides you with JS API, which contains all the functionalities that you would need in web development.</p>
<p>So is WebAssembly going to replace JavaScript in the web development world?</p>
<p>Not really. It is more of an addition to the current web technology stack. Wasm should be used in certain situations, and that situations are asset-heavy performance-needing applications. Usually with a lot of computations and 3d dynamic scenes. Here are a few examples of Wasm applications that should give you an idea of what I am talking about: Google Earth, Figma, AutoCad web.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #511b73;"><b>Flutter</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Another tool on the list is Flutter. Flutter originally was supposed to create mobile applications (and it still does), but in Flutter 1.9 web support has been added.<br />
Flutter uses Dart language and only this one language is used to develop applications for every intention is its frontend, backend, or mobile devices. So in theory your code for a mobile app or web app should not be that much different from each other.</p>
<p>One interesting thing about Flutter is a fact that it has built-in Material Design and Cupertino (iOS styled components) so it comes with a variety of very useful widgets and other advantages that those UI libraries offer (like motion APIs), you can check those out here.</p>
<p>This was just a really brief introduction to different frontend options out there, I’m going to make more detailed insight into those in next blog posts.</p>
<p>Now, at last, but not least:</p>
<h3><span style="color: #511b73;"><b>Svelte</b></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Svelte has been introduced in 2016 by its creator Rich Harris. Stating that it’s going to use a truly reactive approach, but before we get into it let’s quickly describe what Svelte actually is.<br />
Svelte is a JavaScript component framework similar to React or Vue but with a few major differences.</p>
<p>Probably the most important difference is the fact that Svelte does not have a virtual DOM. React and Vue both are using Virtual DOM and because of that, the browser itself has to convert their declarative structures into DOM operations. I won’t go into details of how does virtual DOM works, but basically, what it does it checks the state of the whole application before and after the change and looks for differences in those both states and then applies what’s different to real DOM (this operation is called diffing), sounds like a lot of unnecessary comparisons, right?</p>
<p>Here comes the reactivity.</p>
<p>Svelte unlike React runs at build time which means that svelte code is compiled to imperative code which updates DOM when and where it needs to. This is obviously a big performance boost.</p>
<p>You probably started to wonder why is virtual DOM used by those big frameworks like React or Vue then. I think I can use a quote from the Svelte creator’s blog:</p>
<p>“Virtual DOM is valuable because it allows you to build apps without thinking about state transitions, with performance that is generally good enough. That means less buggy code, and more time spent on creative tasks instead of tedious ones. But it turns out that we can achieve a similar programming model without using virtual DOM — and that&#8217;s where Svelte comes in”</p>
<p>Another thing that Svelte introduces is its own reactive statements which look like this:</p>
<pre>$: console.log(`the count is ${count}`);</pre>
<p>Essentially what it&#8217;s going to do is &#8211; it is going to log the string whenever count property changes and the only thing that you need to do to use it is to put $: in front of a statement which you want to become reactive. To give you a better idea of how is it working I&#8217;m going to create a component in which you can type your first name and last name assign them to fullName property and display it.</p>
<pre class="language-javascript">&lt;script&gt;
 let firstName = '';
 let lastName = ''
 $: fullName = firstName + lastName
&lt;/script&gt;

&lt;input bind:value={firstName}/&gt;
&lt;input bind:value={lastName}/&gt;
{fullName}</pre>
<p>I will not go into details of everything that&#8217;s happening here but what you should know that bind:value is a two-way binding so the properties are being updated while typing in the input. The important part here is the dollar syntax. Thanks to it fullName property is changed at the same moment as user is typing anything in any of those two inputs.</p>
<p>Of course, nothing is stopping you from writing a larger code with dollar syntax. If I wanted to update fullName only if firstName starts with letter &#8220;A&#8221; I could write something like this:</p>
<pre>let fullName = '';
$: {
  if(firstName[0] === 'A') {
      fullName = firstName + lastName;
   }
}</pre>
<p>Now, to display the difference in code written in React (which Svelte is most of the cases compared to) and Svelte. We’re going to create a simple app that is going to display how many seconds passed since it’s creation. (Inspired by Stateful Component on <a href="https://reactjs.org/">React website</a>).</p>
<p>Here’s the code which you would write in those two frameworks:</p>
<p>React:</p>
<pre>class Timer extends React.Component {
    constructor(props) {
      super(props);
      this.state = { seconds: 0 };
    }

    tick() {
      this.setState(state =&gt; ({
       seconds: state.seconds + 1
    }));
    }

    componentDidMount() {
        this.interval = setInterval(() =&gt; this.tick(), 1000);
    }

    render() {
      return (
       &lt;div&gt;
        Seconds: {this.state.seconds}
      &lt;/div&gt;
    );
  }
}

ReactDOM.render(
&lt;Timer /&gt;,
document.getElementById('timer-example')
);</pre>
<p>Svelte:</p>
<pre>&lt;script&gt;
 let seconds = 0;
 setInterval(() =&gt; seconds += 1, 1000);
&lt;/script&gt;

&lt;div&gt;
Seconds: {seconds}
&lt;/div&gt;</pre>
<p>You can see the difference right?<br />
Both of those applications do exactly the same job, but it is immediately noticeable how much code was needed in the React app and also how readable it is with its state, setState, and rendering functions. At the same time, Svelte requires about 8 lines of pretty, easily understandable code to get the task done.</p>
<p>If you are interested in what else Svelte has to offer and to understand better why this framework could be worth trying I deeply encourage you to watch Rich Harris speech.</p>
<p>&nbsp;</p>
<p><iframe title="Rich Harris - Rethinking reactivity" width="1191" height="670" src="https://www.youtube.com/embed/AdNJ3fydeao?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>Artykuł <a href="https://inero-software.com/whats-after-angular/">What&#8217;s after Angular?</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2905</post-id>	</item>
		<item>
		<title>A Holistic Digital Transformation – the Key to Business Optimization</title>
		<link>https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/</link>
		
		<dc:creator><![CDATA[Waldemar Korłub]]></dc:creator>
		<pubDate>Tue, 20 Aug 2019 11:00:01 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[BusinessProcess]]></category>
		<category><![CDATA[BusinessProcessesOptimization]]></category>
		<category><![CDATA[BusinessProcessModeling]]></category>
		<category><![CDATA[DigitalTransformation]]></category>
		<category><![CDATA[FourthIndustrialRevolution]]></category>
		<category><![CDATA[Industry4.0]]></category>
		<category><![CDATA[ProcessThinking]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=2860</guid>

					<description><![CDATA[<p>  Novelty keeps knocking on our door We&#8217;ve talked a lot about the changing environment in which we operate nowadays – either as individuals, enterprises or society as a whole. Certain voguish buzzwords, such as the Fourth Industrial Revolution, Industry 4.0 (its subset), or digital transformation can serve as useful&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/">A Holistic Digital Transformation – the Key to Business Optimization</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div></div>
<p><span style="font-weight: 400;"> </span></p>
<h3><span style="color: #511b73;"><b>Novelty keeps knocking on our door</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />We&#8217;ve talked a lot about the changing environment in which we operate nowadays – either as individuals, enterprises or society as a whole. Certain voguish buzzwords, such as the Fourth Industrial Revolution, Industry 4.0 (its subset), or digital transformation can serve as useful labels to name some of the processes powering the onset of a new era.</span></p>
<p><span style="font-weight: 400;">And while it&#8217;s less clear than when we switched from steam to electricity or from analogue electronic technology to digital electronics, the irreversible shift from simple digitization to innovation, based on combination of technologies (IoT, AI, robotics, augmented reality, 3-D printing, etc.), is forcing companies to reevaluate the way they do business.</span></p>
<p><span style="font-weight: 400;"> <img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h3><span style="color: #511b73;"><b>Behind the lingo</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />‘Fourth Industrial Revolution’ is a term first introduced in 2015, which encompasses the age of technologies that combine hardware, software, and biology (cyber-physical systems), highly advanced in the spheres of communication and connectivity. The current time is being marked by breakthroughs in emerging technologies in fields such as robotics, artificial intelligence, nanotechnology, decentralized consensus, quantum computing, biotechnology, the Internet of Things (IoT), fifth-generation wireless technologies (5G), 3D printing and fully autonomous vehicles.</span></p>
<p><span style="font-weight: 400;">‘Digital transformation’ on the other hand covers the fast-paced and profound metamorphosis of business and organizational processes, capabilities and models, designed to enable growth with a mix of digital technologies. Although chiefly used in a business context, digital transformation also impacts governments, public sector agencies and various organizations which are involved in tackling societal challenges.</span></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h3><span style="color: #511b73;"><b>Who thrives in the current era?</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Among the new desired competencies to attain with the use of the new tools are the capacities to be more agile, efficient, people-oriented, well-organized and able to change the status quo for the purpose of gaining new information and service-driven revenues. Some of the new digital solutions enable also new types of innovation and creativity, and these companies which strive towards continuous optimization across processes can truly have the chance to become leaders in the digital solutions realm.</span></p>
<p><span style="font-weight: 400;">Although already underway, digital transformation is not proceeding at the same pace everywhere. European consumers are heavily invested in digital technologies, however, the EU businesses have a long way to go to fully explore the potential of digitization. As European Commission’s 2019 Digital Economy and Society Index (DESI) shows, Finland, Sweden, the Netherlands and Denmark have the most advanced digital economies in the EU, followed by the UK, Luxembourg, Ireland and Estonia. On the opposite pole are Bulgaria, Romania, Greece and Poland, who score the lowest on DESI.</span></p>
<p><span style="font-weight: 400;">In a ‘Business digitization’ category – encompassing electronic information sharing, use of social media, big data analysis and cloud solutions, as well as e-Commerce – the highest level was reached by Ireland, followed by the Netherlands, Belgium and Denmark. When it comes to e-business technologies, the leading countries are again the Netherlands, Finland (forerunner in the use of cloud solutions) and Belgium (the most advanced in electronic information sharing).</span></p>
<p><span style="font-weight: 400;">As regards governments, which can make a very productive use of digitization by lifting the administrative burden off of citizens and firms – non-other state than Estonia has one of the most advanced e-governments in the world, with 99% of public services available online and 96% of people filing their tax returns electronically.</span></p>
<p><span style="font-weight: 400;"> <img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h3><span style="color: #511b73;"><b>Digital business transformation areas</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Among the domains predisposed to be subjected to digital transformation are business ecosystems, models, and processes, business asset management, organizational culture, partnership models, customer as well as worker and partner approaches.</span></p>
<p>&nbsp;</p>
<figure id="attachment_2866" aria-describedby="caption-attachment-2866" style="width: 606px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" data-attachment-id="2866" data-permalink="https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/digitaltransformationbpm/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM.jpg" data-orig-size="2800,3202" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="DigitalTransformationBPM" data-image-description="" data-image-caption="&lt;p&gt;Inero Software &amp;#8211; Digital Transformation Process&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-262x300.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-901x1030.jpg" tabindex="0" role="button" class="wp-image-2866 " src="https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-262x300.jpg" alt="Digital transformation in business areas" width="606" height="693" srcset="https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-262x300.jpg 262w, https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-768x878.jpg 768w, https://inero-software.com/wp-content/uploads/2019/08/DigitalTransformationBPM-901x1030.jpg 901w" sizes="(max-width: 606px) 100vw, 606px" /><figcaption id="caption-attachment-2866" class="wp-caption-text">Inero Software &#8211; Digital Transformation Process</figcaption></figure>
<p><span style="font-weight: 400;">Let us take a closer look at the issue of business processes and the question of how we can model them. Each business process is a collection of related, structured activities that happen within an organization or company, aiming to bring about a specific, desired effect. A business process is, for example, issuing of invoices. Namely, all the activities that run in a company from the moment a need to issue an invoice arises. This supposedly trivial example is in reality a quite lengthy business process that goes through several departments in the company until the entire process of a sale of a service or a product is finished, so a proof of purchase can be issued.</span></p>
<p><span style="font-weight: 400;">Of course, there is a plentitude of processes like this. They take place not only in companies but also in institutions, foundations and sole proprietorships. As a result of their complexity and distinctiveness, a management branch encompassing business process management and systems engineering was created, called: Business Process Modeling (BPM). BPM is the action of representing processes of an enterprise in order to analyze, improve, and automate them. The simulation is commonly performed by experts comprising business analysts, who provide expertise in the modeling discipline and subject matter professionals, who have specialized knowledge of the processes being modelled.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2867" data-permalink="https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/approvals-flowchart-of-a-business-process/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process.jpg" data-orig-size="725,580" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Approvals &amp;#8211; flowchart of a business process" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process-300x240.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process.jpg" tabindex="0" role="button" class="aligncenter wp-image-2867 size-full" src="https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process.jpg" alt="Flowchart of a business process" width="725" height="580" srcset="https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process.jpg 725w, https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process-300x240.jpg 300w, https://inero-software.com/wp-content/uploads/2019/08/Approvals-flowchart-of-a-business-process-375x300.jpg 375w" sizes="(max-width: 725px) 100vw, 725px" /></p>
<p><i><span style="font-weight: 400;">Approvals &#8211; flowchart of a business process; source: Wikipedia</span></i></p>
<p>&nbsp;</p>
<h3><span style="color: #511b73;"><b>Valuation of the benefits to digital transformation</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />The act of describing all stages of a particular business operation in the form of a model allows us to simulate how a business process progresses and capture the space for automation. It may expose some previously unidentified steps as suboptimal or unnecessary, in case unassociated people from different departments, responsible for only slices of the process, have not realized they were duplicating the work of their colleagues.</span></p>
<p><span style="font-weight: 400;">The traditional modeling tools were introduced to illustrate time and cost, while modern tools focus on improving multidimensional, cross-functional activities. New methodologies, aimed at streamlining commercial operations, include business process redesign, business process innovation, business process management, or integrated business planning, to name a few.</span></p>
<p><span style="font-weight: 400;">Business process modeling is primarily intended to enable attaining higher quality with lowered operational costs and less downtime, as well as to elevate customer satisfaction, but it also serves as documentation and formalization of the workflow.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2868" data-permalink="https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/bpmn-process-that-has-2-decisions-in-the-process-flow/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow.jpg" data-orig-size="1314,828" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="BPMN Process that has 2 decisions in the process flow" data-image-description="&lt;p&gt;Example of BPMN Model &lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-300x189.jpg" data-large-file="https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-1030x649.jpg" tabindex="0" role="button" class="aligncenter wp-image-2868 size-full" src="https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow.jpg" alt="process modeling" width="1314" height="828" srcset="https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow.jpg 1314w, https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-300x189.jpg 300w, https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-768x484.jpg 768w, https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-1030x649.jpg 1030w, https://inero-software.com/wp-content/uploads/2019/08/BPMN-Process-that-has-2-decisions-in-the-process-flow-476x300.jpg 476w" sizes="(max-width: 1314px) 100vw, 1314px" /></span><i><span style="font-weight: 400;">BPMN Process that has two decisions in the process flow; source: Wikipedia</span></i></p>
<p>&nbsp;</p>
<h3><span style="color: #511b73;"><b>Description and simulation of business processes</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />As more and more IT systems were being developed and implemented in ever larger companies, every so often understanding of business processes would become difficult. The reason behind it is a continual specialization of various industry segments, which makes it difficult for the programmers who automate business processes to understand them in their entirety. One of Inero Software&#8217;s cases was the task of automating the process of settling water and rain fees in the port of Gdynia. In order to program and improve this business process it required us to understand the specificity of the business that runs outside of our area.</span></p>
<p><span style="font-weight: 400;">An activity that aims to present business processes in such a way that they are understandable for both IT specialists and those who carry out these processes (non-IT specialists), is called Business Process Model and Notation (BPMN) – a standardized way of recording business processes. The motor behind its creation was the aforementioned intercommunication challenge. BPMN allows you to not only describe particular business processes, but also model them after they have already undergone a digital transformation. It is supported by over 70 various tools, among others <a href="https://www.igrafx.com/">iGrafx</a>, ADONIS, Borland, DYSANT and IBM tools.</span></p>
<p><span style="font-weight: 400;">Even though describing business processes with BPMN is more tricky to execute at large companies, it occurs there more often, as the gains are much more tangible. In a large company, divided on various departments, where daily interactions with people who often do not know each other or are located in different buildings or cities are limited, deploying BPMN to business processes not only grants us a view of all their stages, but also enables us to pick up substandard actions, making a huge difference in running smooth operations.</span></p>
<p><span style="font-weight: 400;"> <img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h3><span style="color: #511b73;"><b>There’s no end to innovation</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="Paragrapgh icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Even though BPMN represents just a fraction of the methodologies used over the years to document business processes, it’s certainly a good step into the digital age. More than just a buzzword, it’s a crucial element of ongoing technological evolution and innovation with a clear purpose, namely to allow us to enrich the overall culture of the professional activities we execute.</span></p>
<p><span style="font-weight: 400;"> </span></p>
<p><a href="https://inero-software.com/contact-us/"><strong><span style="color: #800080;">Inero Software</span></strong></a> provides knowledge and expertise on how to successfully use cutting edge technologies and data to shape corporate digital products of the future.</p>
<p><span data-contrast="auto">In the <a href="https://inero-software.com/category/blog/company/"><strong><span style="color: #800080;">blog post</span></strong></a> section you will find other articles about IT systems and more!</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">keywords:</span></p>
<p><span style="font-weight: 400;">#DigitalTransformation, #FourthIndustrialRevolution, #Industry4.0 #BusinessProcess #BusinessProcessModeling #BusinessProcessesOptimization, #BPM, #BPMN, #ProcessThinking</span></p>
<p>Artykuł <a href="https://inero-software.com/a-holistic-digital-transformation-the-key-to-business-optimization/">A Holistic Digital Transformation – the Key to Business Optimization</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2860</post-id>	</item>
	</channel>
</rss>
