# Design Like A Pro: 25+ Hidden Gems That Make Your Project Shine

**URL:** <https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945>\
**Category:** Presentation Content\
**Tags:** perspective\
**Created:** [May 6, 2025, 9:51pm UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945 "2025-05-06T21:51:09Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mknowles](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mknowles/32/70604_2.png) [@mknowles](https://forum.inductiveautomation.com/u/mknowles)\
**Post date:** [May 6, 2025, 9:51pm UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945/1 "2025-05-06T21:51:09Z")

</div>

Thank you to all that attended the recent Design Like A Pro: 25+ Hidden Gems That Make Your Project Shine webinar. You can find the webinar recording [here](https://inductiveautomation.com/resources/webinar/design-like-a-pro-25-hidden-gems-that-make-your-project-shine).

* * *

Here are the answers to some of the common questions asked during the webinar:

_Can we integrate Ignition SCADA with other SCADA systems?_

- Yes, Ignition is built around open standards, purposefully, to play well in most environments. Common ways to connect to other platforms are [OPC UA](https://docs.inductiveautomation.com/docs/8.1/ignition-modules/opc-ua/opc-ua-client-connection-settings), [RESTful APIs](https://docs.inductiveautomation.com/docs/8.1/platform/scripting/scripting-in-ignition/web-services-suds-and-rest/http-methods), and [common databases](https://docs.inductiveautomation.com/docs/8.1/platform/database-connections/connecting-to-databases) among others

_If using Docker do you need an internet connection?_

- If using Docker in a production environment or where a license needs to be applied. You currently will need to have access to our [licensing servers](https://docs.inductiveautomation.com/docs/8.1/platform/licensing-and-activation/leased-licensing#leased-license-activation) to keep Ignition licensed.

_What is the use case for having Ignition in a docker? When would it be useful?_

- Using Docker is great for containerizing the implementation. It's very useful for development environments when you are trying out new features or want full test/dev environments that include other applications and can be easily (and quickly) spun up or down. Also if you want to start implementing container orchestration platforms like Kubernetes, or you want to take more of an infrastructure as code approach to your deployment.

_Is it a good approach to use Docker for production environments or only for development environments?_

- Docker is a perfectly fine implementation for production environments. We have many folks using Docker in production today. It really boils down to supporting the deployment. If Docker is going to and another layer on top that folks supporting the implementation aren't as familiar with, it may not make as much sense to go that route.

_Is there a way to not have to unlicense, delete/update/create a docker license, and then relicense when using a Docker container._

- You can use the IGNITION\_LICENSE\_KEY and IGNITION\_ACTIVATION\_TOKEN [environment variables](https://docs.inductiveautomation.com/docs/8.1/platform/docker-image#environment-variables) in your compose file to automatically apply your license

_How to size a server running Docker?_

- This really depends on how much you are looking to run on it. But basically it should have enough resources for each containerized application you have running. Containers have full access to their hosts resources just like any application running on it would unless you specifically put limits on them. For Ignition specifically the same basic guidelines for resources that are laid out in our[server sizing and architecture guide](https://inductiveautomation.com/resources/article/ignition-server-sizing-and-architecture-guide) would be a good place to look. The Ignition containers themselves can use a -m command to set the max Java heap size in the config file.

_What is your guys Database of choice to pair with Ignition?_

- Reese's favorite database is MSSQL for larger production systems because of previous experience around it. However, he typically uses Postgres for his dev environments because of how lightweight it is. Adam's favorite database is PostgreSQL in his test and development setups.
- A beneficial feature of Ignition is that customers can work with their preferred database. Supported databases are Microsoft SQL Server, Oracle, MySQL, MariaDB, PostgreSQL, and any database with a JDBC driver.

_How is basis auto different from grow=1?_

- Basis set to auto will automatically size to the content within the component. Grow set to 1 will grow as large as it can based on the container that the component is within.

_Do you recommend keeping restful script calls on the screen calling it or in a gateway event?_

- It depends on the application. If the RESTful call is looking up corresponding information that an end user is requesting on demand, I would run that in the client. If it is more of an automated process, it makes the most sense to put that in a project script that could be called by a tag event change script, for example.

_What are the best practices for string formatting in loggers?_

- String formatting in Ignition is based on python string formatting. See this [W3 schools page](https://www.w3schools.com/python/python_string_formatting.asp) on formatting string in Python. Additionally, [here is a section](https://docs.inductiveautomation.com/docs/8.1/platform/scripting/python-scripting/variables-datatypes-and-objects/strings#string-formatting) in our user manual on String Formatting. If you would like to log messages only under certain conditions, you could certainly use conditional statements in your code, such as an if else statement, to achieve that.

_Does creating a custom property duplicate the data?_

- Great callout! Yes, it would duplicate the dataset within the session. So you did have a large dataset Reese and Adam would recommend putting that binding directly on the component to visualize that. A lot of times that type of thing is coming from a database, so Reese and Adam would recommend implementing the named query binding, script binding, etc. on the component rather than at the page level. You may, however, still use some of the custom props on the view as parameters in the binding, and these would certainly be best placed as a view prop rather than a direct binding.

_Can we configure a time series DB like Influx DB or ApacheIOTDB to the Ignition docker container setup for DEV purposes?_

- Yes! Absolutely. Influx DB has an [official docker image](https://hub.docker.com/_/influxdb) on Docker Hub. So you could use that along with Ignition in a development environment to test out functionality.

_What is best practice for the link parameter where the view is opened by independent users in different sessions? Can it still be stored in the UDT?_

- You can put a binding on the link parameter if you would like to make it more dynamic. The source of that link could be a UDT, script, query, etc.

_How do you obtain a one stop shop package with encryption security and scalability from small to large processes._

- There is a shared responsibility of implementing Ignition in a secure manner. Ignition has many capabilities for a secure deployment that you can choose to implement. See the [security hardening guide](https://inductiveautomation.com/resources/article/ignition-security-hardening-guide) for more information on best practices with deploying Ignition within a secure environment.

_Any tips on converting a project over from other HMI, especially with mass tag conversion?_

- A lot of times you can export tag config from other platforms. Assuming that the format could be received or exported as a CSV, you can use scripting within Ignition to read a CSV, parse it, and configure tags. Here are the docs pages that talk about the different pieces of that process. [Exporting and Importing a CSV | Ignition User Manual](https://docs.inductiveautomation.com/docs/8.1/platform/scripting/scripting-examples/exporting-and-importing-a-csv) [system.tag.configure | Ignition User Manual](https://docs.inductiveautomation.com/docs/8.1/appendix/scripting-functions/system-tag/system-tag-configure)

_Can one import an svg file to the map function, using it as a background, and then dynamically change the different components color with a binding or a script._

- Yes you could do that, You would need to use a [coordinate container](https://docs.inductiveautomation.com/docs/8.1/appendix/components/perspective-components/perspective-container-palette/perspective-coordinate-container) to achieve this. The individual components of the SVG can be bound to other properties, tag values, queries, etc to change the color.

* * *

You can find the Docker Compose YAML and a backup of the project referenced during the webinar on the Ignition Exchange [here](https://inductiveautomation.com/exchange/2786/overview).

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 7, 2025, 12:50am UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945/2 "2025-05-07T00:50:13Z")

</div>

> [@mknowles](#):
>
> Does creating a custom property duplicate the data?

> [@mknowles](#):
>
> Yes, it would duplicate the dataset within the session.

Actually, no, not for datasets. A Perspective wrapper for a `Dataset` instance does **not** create another dataset instance. The original java dataset object is propagated without inner duplication through both property bindings and through simple expression bindings with just a property reference.

Bindings that _manipulate_ a dataset to return some massaged information _do_ duplicate selected inner data, just not the dataset object itself.

I highly recommend using datasets in Perspective, with access set to private when in a custom property.

---

<div class="post-metadata">

**Author:** ![hunterdg](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/hunterdg/32/67774_2.png) [@hunterdg](https://forum.inductiveautomation.com/u/hunterdg)\
**Post date:** [May 8, 2025, 7:04am UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945/3 "2025-05-08T07:04:42Z")

</div>

> [@mknowles](#):
>
> string formatting in loggers

> Example #3 - Java's Formatter syntax
> 
> ```python
> # This code would log a formatted message with level info. Similar to the "Python String Formatting syntax" example above, but using Java's Formatter syntax
> # Note the 'f' at the end of the method name.
> who = 'Bob Jones'
> num = 5
> logger = system.util.getLogger("myLogger")
> logger.infof("Machine started by %s, employee ID %d", who, num)
> 
> ```

> **[system.util.getLogger | Ignition User Manual](https://www.docs.inductiveautomation.com/docs/8.1/appendix/scripting-functions/system-util/system-util-getLogger#:~:text=Example%20%233%20%2D%20Java's%20Formatter%20syntax)**
>
> Returns a Logger object that can be used to log messages to the console.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [May 10, 2025, 12:19am UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945/4 "2025-05-10T00:19:59Z")

</div>

> [@pturmel](#):
>
> with access set to private when in a custom property.

This should be the default setting for _all_ custom props when they're created 😕 99% of people wouldn't even think to do this unless they've stumbled upon some tidbit of information on the forum. The user manual makes no reference (that I could find) in the [relevant section](https://www.docs.inductiveautomation.com/docs/8.1/ignition-modules/perspective/working-with-perspective-components/perspective-component-properties#restricting-property-access) to setting props to `public` taking a hit to gateway performance, regardless of how small this is. Lots of small hits from multiple components' props on lots of client sessions can snowball into a much larger hit overall

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 10, 2025, 12:21pm UTC](https://forum.inductiveautomation.com/t/design-like-a-pro-25-hidden-gems-that-make-your-project-shine/105945/5 "2025-05-10T12:21:31Z")

</div>

> [@nminchin](#):
>
> taking a hit to gateway performance

Not so much a hit to gateway performance in general, but the difference in traffic to the browser adds up.
