BIhints - spilling the beans since 2006 en Beware of Performance Monitor defaults spamming transaction log <span class="field field--name-title field--type-string field--label-hidden">Beware of Performance Monitor defaults spamming transaction log</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>The <a href="">Performance Monitor</a> in TM1 is a great tool to gather helpful statistics about your system and pinpoint all sorts of bottlenecks.<br /><br /> You can start the Performance Monitor in 2 ways:</p> <ul><li><a href="">In Server Explorer -&gt; Server -&gt; Start Performance Monitor</a></li> <li><a href="">add PerformanceMonitorOn=T in tm1s.cfg</a>, this is a dynamic parameter, it will come into action within 60 seconds</li> </ul><p><br /> Once performance monitor is turned on, it starts populating the }Stats control cubes and it updates them every minute.<br /> Well, so far so good...<br /><strong>BUT</strong> by default in TM1, ALL cubesΒ in }CubeProperties are set to log ALL transactions. That seems like a sane default, nobody wants to lose track of whom, when and by how much changed a cell in a cube.<br /> So by default, the Performance Monitor will start spamming the transaction log, every minute of your entire server uptime. The problem is most acute with }StatsByCube, it logs one line for every cube, and for every }Element_Attributes_dimension cube.<br /><br /> There is a simple remedy: <strong>turn off logging in }CubeProperties for all <a href="">}Stats cubes</a> </strong>(IBM documentation is incomplete)<br /> A quick Turbo Integrator process can do the job too:</p> <pre> CellPutS('NO', '}CubeProperties', '}StatsByClient', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsByCube', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsByCubeByClient', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsByRule', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsByProcess', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsByChore', 'LOGGING'); CellPutS('NO', '}CubeProperties', '}StatsForServer', 'LOGGING'); </pre> <p>The size of the spamming could be just a few megabytes per day, though it will have an impact on how long your transaction searches take.<br /> Also, the transaction log does not log rotate for a good reason, you don't want to lose any precious transactions. So, it will happily fill up the local drive and after a few months or years the server finally crashes.<br /> If you notice the issue only now, it's not all lost. You don't have to keep all this spam thanks to this bash one-liner that will clean up your 50 gigabyte logs:</p> <p><br /><code>for f in tm1s20*log; do awk -F, '$8 != "\"}StatsByCube\""' "$f" &gt; "$f".tmp &amp;&amp; mv "$f".tmp "$f"; done # one line to rule them all </code></p> <p>You will notice it is removing only "}StatsByCube". I could have added the other }StatsBy cubes, but these are literally 2 orders of magnitude less spammy than }StatsByCube on its own.</p> <p>Challenge for you: try to achieve the same as the bash one-liner above in any language in less than the 79 characters above. I made it easy, I left a lot of superfluous characters. Constructive comments and answers are welcome.<br /><br /> Β </p></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 2023-08-17 18:46</span> <div class="field field--name-field-categories field--type-entity-reference field--label-inline clearfix"> <div class="field__label">Categories</div> <div class="field__items"> <div class="field__item"><a href="/tm1/monitor" hreflang="en">monitor</a></div> <div class="field__item"><a href="/tm1/admins" hreflang="en">admins</a></div> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=101&amp;2=comment&amp;3=comment" token="6QbhZvmuztz5eyBEvbf12HQemOhvyC203Xrq2eHf-g8"></drupal-render-placeholder> </section> Thu, 17 Aug 2023 16:46:31 +0000 admin 101 at tm1s.cfg parameters cheatsheet <span class="field field--name-title field--type-string field--label-hidden">tm1s.cfg parameters cheatsheet</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>The number of parameters in the tm1s.cfg has been steadily rising as more features have been made available over the years in TM1. So, a cheatsheet summarising all these parameters can help as an overview of the different settings that a TM1 server can be configured with.</p> <p>This cheatsheet is now available in the following formats:</p> <ul><li><a href="/sites/default/files/tm1scfg.csv">csv</a> so you can build your own variations of the cheatsheet</li> <li><a href="/sites/default/files/tm1s.cfg">tm1s.cfg</a> including all parameters, only the required parameters are uncommented, every parameter is set to its known default value (as of 2023-02-14 and according to the IBM online documentation). There should not be a need to explicitly define a parameter when you just want to stick to the default value. However, be cautious that IBM may change default values and that could lead to issues when upgrading versions.</li> <li><a href="/sites/default/files/">md</a> markdown to save in your <a href="">personal knowledge management</a> repository full of markdown files to <a href="">ripgrep</a> through <a href="">fzf.vim</a></li> <li>pdf for an allegedly pretty overview (coming soon)</li> <li>html below or <a href="/sites/default/files/tm1scfg.html">here on its own</a> that you can "Save as" to use as a local copy.</li> </ul><p>The cheatsheet is generated with python scripts (coming soon) responsible for the conversion of the csv file to a pandas dataframe and then exported to different formats. The <a href="">csv</a> file currently holds the following fields:</p> <ol><li>parameter: name of the parameter</li> <li>optional: indicates if the parameter is either required or optional.</li> <li>restart: indicates if the parameter is either dynamic or static πŸ”„, in the later case, it requires a service restart when its value has been modified</li> <li>url: URL address of the official IBM Planning Analytics documentation for that parameter</li> <li>default: default value of that parameter when it is not explicitly declared</li> <li>type: type of that parameter (bool, int, float, str, time). This will be useful for scripts checking tm1s.cfg validity</li> <li>context: arbitrary categorisation for the context of the parameter e.g. it can be Network related, Rules related, etc..</li> <li>dependency: that may hold the name of another parameter that the current parameter may rely on to operate</li> <li>description: short description about what the parameter does</li> </ol><p>The categorisation is completely arbitrary, most parameters could fit in several categories, so I just picked one that seemed most appropriate. This is a limitation and probably something to look into for the design of future versions of that csv file.</p> <p _d-id="1381">And finally, the tm1s.cfg parameters cheatsheet in html.</p> <p _d-id="1381"><span _d-id="2642" class="--l --r hover:bg-light-blue hover:cursor-pointer lmt__write_highlight_sentence py-[3px] sentence_highlight"><span _d-id="2644" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]"><span _d-id="2670" class="--l --r lmt__sentence_beginning_anchor_highlight relative">N</span>ote</span> <span _d-id="2647" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">that</span> there is a <span _d-id="2650" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">drop</span> <span _d-id="2653" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">down</span> menu at the top of the <span _d-id="2656" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">Context</span> column<span _d-id="2659" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">.</span> <span _d-id="2662" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">This</span> <span _d-id="2665" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">allows</span> you to show only </span><span _d-id="2672" class="--l --r hover:bg-light-blue hover:cursor-pointer lmt__write_highlight_sentence py-[3px] sentence_highlight"><span _d-id="2683" class="--l --r lmt__sentence_beginning_anchor_highlight relative">p</span>arameters <span _d-id="2675" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">that</span> <span _d-id="2678" class="--l --r border-[#B7D0B3] border-b-2 group-hover:text-blue-chill lmt__write_highlight relative text-[#1B4F13]">relate</span> to a specific aspect of your TM1 </span><span _d-id="2685" class="--l --r hover:bg-light-blue hover:cursor-pointer lmt__write_highlight_sentence py-[3px] sentence_highlight"><span _d-id="2686" class="--l --r lmt__sentence_beginning_anchor_highlight relative">s</span>erver. If you are on mobile, you probably need to rotate your screen for a wide display in order to display all 5 columns.</span></p> <h1>tm1s.cfg parameters cheatsheet</h1> <p><strong>parameters in bold</strong> are required.<br /> πŸ”„ = static parameter, the TM1 service must be restarted for the new value of that parameter to take effect.</p> <table class="dataframe table-striped" id="table"><thead><tr style="text-align: right;"><th>parameter</th> <th>default</th> <th>restart</th> <th>context<br /><select onchange="filterTable(3, this)"><option value="">All</option><option value="Authentication and Encryption">Authentication and Encryption</option><option value="Cache">Cache</option><option value="Calculations">Calculations</option><option value="Chores">Chores</option><option value="Cognos Analytics">Cognos Analytics</option><option value="Cubes">Cubes</option><option value="Dimensions">Dimensions</option><option value="Files">Files</option><option value="Java">Java</option><option value="Linux">Linux</option><option value="Logs and Messages">Logs and Messages</option><option value="MDX">MDX</option><option value="Multithreading">Multithreading</option><option value="Network">Network</option><option value="ODBC">ODBC</option><option value="Rules">Rules</option><option value="Sandboxes">Sandboxes</option><option value="Subsets">Subsets</option><option value="TM1Web">TM1Web</option><option value="Turbo Integrator">Turbo Integrator</option><option value="Views">Views</option><option value="deprecated">deprecated</option></select></th> <th>description</th> </tr></thead><tbody><tr><td><strong><a href="">AdminHost</a></strong></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>computer name or IP address of the Admin Host on which an Admin Server is running.</td> </tr><tr><td><a href="">AllowReadOnlyChoreReschedule</a></td> <td>F</td> <td>πŸ”„</td> <td>Chores</td> <td>Provides users with READ access to a chore and the ability to activate deactivate and reschedule chores.</td> </tr><tr><td><a href="">AllowSeparateNandCRules</a></td> <td>F</td> <td>πŸ”„</td> <td>Rules</td> <td>if true then rule expressions for N: and C: levels can be on separate lines using identical AREA definitions.</td> </tr><tr><td><a href="">AllRuleCalcStargateOptimization</a></td> <td>F</td> <td>πŸ”„</td> <td>Rules</td> <td>if true then it can improve performance in calculating views that contain only rule-calculated values. In some unique cases enabling this parameter can result in performance degradation so you should test the effect of the parameter in a development environment before deploying to your production environment.</td> </tr><tr><td><a href="">ApplyMaximumViewSizeToEntireTransaction</a></td> <td>F</td> <td>Β </td> <td>Views</td> <td>Applies MaximumViewSize to the entire transaction instead of to individual calculations.</td> </tr><tr><td><a href="">AuditLogMaxFileSize</a></td> <td>100 MB</td> <td>Β </td> <td>Logs and Messages</td> <td>maximum file size that an audit log file can grow to before it is closed and a new file is created.</td> </tr><tr><td><a href="">AuditLogMaxQueryMemory</a></td> <td>100 MB</td> <td>Β </td> <td>Logs and Messages</td> <td>maximum amount of memory that TM1 can use when running an audit log query and retrieving the set of results.</td> </tr><tr><td><a href="">AuditLogOn</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>if true turns audit logging on.</td> </tr><tr><td><a href="">AuditLogUpdateInterval</a></td> <td>60</td> <td>Β </td> <td>Logs and Messages</td> <td>maximum amount of minutes that TM1 waits before moving the events from the temporary audit file into the final audit log.</td> </tr><tr><td><a href="">AutomaticallyAddCubeDependencies</a></td> <td>T</td> <td>πŸ”„</td> <td>Rules</td> <td>Determines if cube dependencies are set automatically or if you must manually identify the cube dependencies for each cube.</td> </tr><tr><td><a href="">CacheFriendlyMalloc</a></td> <td>F</td> <td>πŸ”„</td> <td>Cache</td> <td>Allows for memory alignment that is specific to the IBM Power Platform.</td> </tr><tr><td><a href="">CalculationThresholdForStorage</a></td> <td>50</td> <td>Β </td> <td>Rules</td> <td>minimum number of rule calculations required for a single cell or Stargate view beyond which TM1 stores the calculations for use during the current server session.</td> </tr><tr><td><a href="">CAMPortalVariableFile</a></td> <td>Β </td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>The path to the variables_TM1.xml file in your IBM Cognos installation.</td> </tr><tr><td><a href="">CAMUseSSL</a></td> <td>F</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>all communications between TM1 and the Cognos Analytics server must use SSL.</td> </tr><tr><td><a href="">CheckCAMClientAlias</a></td> <td>T</td> <td>Β </td> <td>Cognos Analytics</td> <td>When audit logging is enabled with the AuditLogOn parameter the CheckCAMClientAlias parameter determines whether user modifications within Cognos Authentication Manager (CAM) groups are written to the audit log.</td> </tr><tr><td><a href="">CheckFeedersMaximumCells</a></td> <td>3000000</td> <td>Β </td> <td>Rules</td> <td>Limits the number of cells checked by the Check Feeders option in the Cube Viewer.</td> </tr><tr><td><a href="">ClientCAMURI</a></td> <td>Β </td> <td>Β </td> <td>Cognos Analytics</td> <td>The URI the Cognos Server Connection uses to authenticate TM1 clients.</td> </tr><tr><td><a href="">ClientExportSSLSvrCert</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>TM1 client should retrieve the certificate authority certificate which was originally used to issue TM1 certificate from the MS Windows certificate store.</td> </tr><tr><td><a href="">ClientExportSSLSvrKeyID</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>identity key used by a TM1 client to export the certificate authority certificate which was originally used to issue TM1 certificate from the MS Windows certificate store.</td> </tr><tr><td><a href="">ClientMessagePortNumber</a></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>secondary port used to accept client messages concerning the progress and ultimate cancellation of a lengthy operation without tying up thread reserves.</td> </tr><tr><td><a href="">ClientPingCAMPassport</a></td> <td>900</td> <td>Β </td> <td>Cognos Analytics</td> <td>interval in seconds that a client should ping the Cognos Authentication Management server to keep their passport alive.</td> </tr><tr><td><a href="">ClientPropertiesSyncInterval</a></td> <td>Β </td> <td>Β </td> <td>Logs and Messages</td> <td>frequency (in seconds) at which client properties are updated in the }ClientProperties control cube. Set to 1800 seconds to update cube every 30 minutes.</td> </tr><tr><td><a href="">ClientVersionMaximum</a></td> <td>Β </td> <td>Β </td> <td>Network</td> <td>maximum client version that can connect to TM1.</td> </tr><tr><td><a href="">ClientVersionMinimum</a></td> <td>8.4.00000</td> <td>Β </td> <td>Network</td> <td>minimum client version that can connect to TM1.</td> </tr><tr><td><a href="">ClientVersionPrecision</a></td> <td>0</td> <td>Β </td> <td>Network</td> <td>precisely identify the minimum and maximum versions of clients that can connect to TM1.</td> </tr><tr><td><a href="">CognosMDX.AggregateByAncestorRef</a></td> <td>F</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>When possible replaces aggregation over a member set with a reference to an ancestor if the aggregated member set comprises a complete set of descendants and all members have the weight 1.</td> </tr><tr><td><a href="">CognosMDX.CellCacheEnable</a></td> <td>T</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>Allows the IBM Cognos MDX engine to modify TM1 consolidation and calculation cell cache strategies.</td> </tr><tr><td><a href="">CognosMDX.PrefilterWithPXJ</a></td> <td>F</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>Expands the data source provider cross join approach to nested filtered sets.</td> </tr><tr><td><a href="">CognosMDX.SimpleCellsUseOPTSDK</a></td> <td>T</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>Applies IBM Cognos MDX engine consolidation and calculation cell cache strategies to all cells in query results.</td> </tr><tr><td><a href="">CognosMDX.UseProviderCrossJoinThreshold</a></td> <td>0</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>Applies the data source provider cross join strategy even if it is not explicitly enabled in Cognos Analytics.</td> </tr><tr><td><a href="">CognosTM1InterfacePath</a></td> <td>Β </td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>location of the IBM Cognos Analytics server to use when importing data from a Cognos Package to TM1 configuration using the Package Connector.</td> </tr><tr><td><a href="">CreateNewCAMClients</a></td> <td>T</td> <td>Β </td> <td>Cognos Analytics</td> <td>The CreateNewCAMClients server configuration parameter determines how TM1 configuration handles an attempt to log on to the server with CAM credentials in the absence of a corresponding TM1 client.</td> </tr><tr><td><strong><a href="">DataBaseDirectory</a></strong></td> <td>Β </td> <td>πŸ”„</td> <td>Files</td> <td>data directory from which the database loads cubes dimensions and other objects.</td> </tr><tr><td><a href="">DefaultMeasuresDimension</a></td> <td>F</td> <td>πŸ”„</td> <td>Cubes</td> <td>Identifies if a measures dimension is created. TM1 does not require that a measures dimension be defined for a cube. You can optionally define a measures dimension by modifying the cube properties.</td> </tr><tr><td><a href="">DisableMemoryCache</a></td> <td>F</td> <td>πŸ”„</td> <td>Cache</td> <td>Disables the memory cache used by TM1 memory manager.</td> </tr><tr><td><a href="">DisableSandboxing</a></td> <td>F</td> <td>Β </td> <td>Sandboxes</td> <td>if false then users have the ability to use sandboxes across the server.</td> </tr><tr><td><a href="">DownTime</a></td> <td>Β </td> <td>Β </td> <td>Chores</td> <td>time when the database will come down automatically.</td> </tr><tr><td><a href="">EnableNewHierarchyCreation</a></td> <td>F</td> <td>πŸ”„</td> <td>Dimensions</td> <td>multiple hierarchy creation is enabled or disabled.</td> </tr><tr><td><a href="">EnableSandboxDimension</a></td> <td>F</td> <td>Β </td> <td>Sandboxes</td> <td>virtual sandbox dimension feature is enabled or disabled.</td> </tr><tr><td><a href="">EnableTIDebugging</a></td> <td>F</td> <td>Β </td> <td>Turbo Integrator</td> <td>TurboIntegrator debugging capabilities are enabled or disabled.</td> </tr><tr><td><a href="">EventLogging</a></td> <td>T</td> <td>Β </td> <td>Logs and Messages</td> <td>event logger is either turned on or off.</td> </tr><tr><td><a href="">EventScanFrequency</a></td> <td>1</td> <td>Β </td> <td>Logs and Messages</td> <td>period to check the collection of threads where 1 is the minimum number and 0 disables the scan.</td> </tr><tr><td><a href="">EventThreshold.PooledMemoryInMB</a></td> <td>0</td> <td>Β </td> <td>Logs and Messages</td> <td>threshold for which a message is printed for the event that the database's pooled memory exceeds a certain value.</td> </tr><tr><td><a href="">EventThreshold.ThreadBlockingNumber</a></td> <td>5</td> <td>Β </td> <td>Logs and Messages</td> <td>warning is printed when a thread blocks at least the specified number of threads.</td> </tr><tr><td><a href="">EventThreshold.ThreadRunningTime</a></td> <td>600</td> <td>Β </td> <td>Logs and Messages</td> <td>warning is printed when a thread has been running for the specified length of time.</td> </tr><tr><td><a href="">EventThreshold.ThreadWaitingTime</a></td> <td>20</td> <td>Β </td> <td>Logs and Messages</td> <td>warning is printed when a thread has been blocked by another thread for the specified length of time.</td> </tr><tr><td><a href="">ExcelWebPublishEnabled</a></td> <td>F</td> <td>Β </td> <td>TM1Web</td> <td>Enables the publication of MS Excel files to IBM Cognos TM1 Web as well as the export of MS Excel files from TM1 Web when MS Excel is not installed on the web server. Enable the ExcelWebPublishEnabled parameter when you have TM1 10.1 clients that connect to TM1 10.2.2 servers.</td> </tr><tr><td><a href="">FileRetry.Count</a></td> <td>5</td> <td>Β </td> <td>Logs and Messages</td> <td>number of retry attempts.</td> </tr><tr><td><a href="">FileRetry.Delay</a></td> <td>2000</td> <td>Β </td> <td>Logs and Messages</td> <td>time delay between retry attempts.</td> </tr><tr><td><a href="">FileRetry.FileSpec</a></td> <td>Β </td> <td>Β </td> <td>Logs and Messages</td> <td>Β </td> </tr><tr><td><a href="">FIPSOperationMode</a></td> <td>2</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Controls the level of support for Federal Information Processing Standards (FIPS).</td> </tr><tr><td><a href="">ForceReevaluationOfFeedersForFedCellsOnDataChange</a></td> <td>F</td> <td>πŸ”„</td> <td>Rules</td> <td>When this parameter is set a feeder statement is forced to be re-evaluated when data changes.</td> </tr><tr><td><a href="">HTTPOriginAllowList</a></td> <td>Β </td> <td>Β </td> <td>Network</td> <td>a comma-delimited list of external origins (URLs) that are trusted and can access TM1.</td> </tr><tr><td><strong><a href="">HTTPPortNumber</a></strong></td> <td>5001</td> <td>πŸ”„</td> <td>Network</td> <td>port number on which TM1 listens for incoming HTTP(S) requests.</td> </tr><tr><td><a href="">HTTPRequestEntityMaxSizeInKB</a></td> <td>32</td> <td>Β </td> <td>Network</td> <td>This TM1 configuration parameter sets the maximum size for an HTTP request entity that can be handled by TM1.</td> </tr><tr><td><a href="">HTTPSessionTimeoutMinutes</a></td> <td>20</td> <td>Β </td> <td>Authentication and Encryption</td> <td>timeout value for authentication sessions for TM1 REST API.</td> </tr><tr><td><a href="">IdleConnectionTimeOutSeconds</a></td> <td>Β </td> <td>Β </td> <td>Authentication and Encryption</td> <td>timeout limit for idle client connections in seconds.</td> </tr><tr><td><a href="">IndexStoreDirectory</a></td> <td>Β </td> <td>πŸ”„</td> <td>Files</td> <td>Added in v2.0.5 Designates a folder to store index files including bookmark files.</td> </tr><tr><td><a href="">IntegratedSecurityMode</a></td> <td>Β </td> <td>Β </td> <td>Authentication and Encryption</td> <td>the user authentication mode to be used by TM1.</td> </tr><tr><td><a href="">IPAddressV4</a></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>IPv4 address for an individual TM1 service.</td> </tr><tr><td><a href="">IPAddressV6</a></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>IPv6 address for an individual TM1 service.</td> </tr><tr><td><a href="">IPVersion</a></td> <td>ipv4</td> <td>πŸ”„</td> <td>Network</td> <td>Internet Protocol version used by TM1 to identify IP addresses on the network.</td> </tr><tr><td><a href="">JavaClassPath</a></td> <td>Β </td> <td>πŸ”„</td> <td>Java</td> <td>parameter to make third-party Javaβ„’ libraries available to TM1.</td> </tr><tr><td><a href="">JavaJVMArgs</a></td> <td>Β </td> <td>πŸ”„</td> <td>Java</td> <td>list of arguments to pass to the Java Virtual Machine (JVM). Arguments are separated by a space and the dash character. For example JavaJVMArgs=-argument1=xxx -argument2=yyy.</td> </tr><tr><td><a href="">JavaJVMPath</a></td> <td>Β </td> <td>πŸ”„</td> <td>Java</td> <td>path to the Java Virtual Machine .dll file (jvm.dll) which is required to run Java from TM1 TurboIntegrator.</td> </tr><tr><td><a href="">keyfile</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>file path to the key database file. The key database file contains the server certificate and trusted certificate authorities. The server certificate is used by TM1 and the Admin server.</td> </tr><tr><td><a href="">keylabel</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>label of the server certificate in the key database file.</td> </tr><tr><td><a href="">keystashfile</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>file path to the key database password file. The key database password file is the key store that contains the password to the key database file.</td> </tr><tr><td><a href="">Language</a></td> <td>Β </td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>language used for TM1. This parameter applies to messages generated by the server and is also used in the user interface of the server dialog box when you run the server as an application instead of a Windows service.</td> </tr><tr><td><a href="">LDAPHost</a></td> <td>localhost</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>domain name or dotted string representation of the IP address of the LDAP server host.</td> </tr><tr><td><a href="">LDAPPasswordFile</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>password file used when LDAPUseServerAccount is not used. This is the full path of the .dat file that contains the encrypted password for the Admin Server's private key.</td> </tr><tr><td><a href="">LDAPPasswordKeyFile</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>password key used when LDAPUseServerAccount is not used.</td> </tr><tr><td><a href="">LDAPPort</a></td> <td>389</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>port TM1 uses to bind to an LDAP server.</td> </tr><tr><td><a href="">LDAPSearchBase</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>node in the LDAP tree where TM1 begins searching for valid users.</td> </tr><tr><td><a href="">LDAPSearchField</a></td> <td>cn</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>The name of the LDAP attribute that is expected to contain the name of TM1 user being validated.</td> </tr><tr><td><a href="">LDAPSkipSSLCertVerification</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Skips the certificate trust verification step for the SSL certificate used to authenticate to an LDAP server. This parameter is applicable only when LDAPVerifyServerSSLCert=T.</td> </tr><tr><td><a href="">LDAPSkipSSLCRLVerification</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Skips CRL checking for the SSL certificate used to authenticate to an LDAP server. This parameter is applicable only when LDAPVerifyServerSSLCert=T.</td> </tr><tr><td><a href="">LDAPTimeout</a></td> <td>0</td> <td>Β </td> <td>Authentication and Encryption</td> <td>number of seconds that TM1 waits to complete a bind to an LDAP server. If the LDAPTimeout value is exceeded TM1 immediately aborts the connection attempt.</td> </tr><tr><td><a href="">LDAPUseServerAccount</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Determines if a password is required to connect to TM1 when using LDAP authentication.</td> </tr><tr><td><a href="">LDAPVerifyCertServerName</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>server to use during the SSL certificate verification process for LDAP server authentication. This parameter is applicable only when LDAPVerifyServerSSLCert=T.</td> </tr><tr><td><a href="">LDAPVerifyServerSSLCert</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Delegates the verification of the SSL certificate to TM1. This parameter is useful for example when you are using LDAP with a proxy server.</td> </tr><tr><td><a href="">LDAPWellKnownUserName</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>user name used by TM1 to log in to LDAP and look up the name submitted by the user.</td> </tr><tr><td><a href="">LoadPrivateSubsetsOnStartup</a></td> <td>F</td> <td>πŸ”„</td> <td>Subsets</td> <td>This configuration parameter determines if private subsets are loaded when TM1 starts.</td> </tr><tr><td><a href="">LoadPublicViewsAndSubsetsAtStartup</a></td> <td>T</td> <td>πŸ”„</td> <td>Views</td> <td>Added in v2.0.8 This configuration parameter enables whether public subsets and views are loaded when the TM1 starts and keeps them loaded to avoid lock contention during the first use.</td> </tr><tr><td><a href="">LockPagesInMemory</a></td> <td>F</td> <td>πŸ”„</td> <td>deprecated</td> <td>Deprecated as of IBM TM1 with Watson version When this parameter is enabled memory pages used by TM1 process are held in memory (locked) and do not page out to disk under any circumstances. This retains the pages in memory over an idle period making access to TM1 data faster after the idle period.</td> </tr><tr><td><a href="">LoggingDirectory</a></td> <td>Β </td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>directory to which TM1 saves its log files.</td> </tr><tr><td><a href="">LogReleaseLineCount</a></td> <td>5000</td> <td>Β </td> <td>Logs and Messages</td> <td>number of lines that a search of the Transaction Log will accumulate in a locked state before releasing temporarily so that other Transaction Log activity can proceed.</td> </tr><tr><td><a href="">MagnitudeDifferenceToBeZero</a></td> <td>Β </td> <td>πŸ”„</td> <td>Calculations</td> <td>order of magnitude of the numerator relative to the denominator above which the denominator equals zero when using a safe division operator.</td> </tr><tr><td><a href="">MaskUserNameInServerTools</a></td> <td>T</td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>Determines whether usernames in server administration tools are masked until a user is explicitly verified as having administrator access.</td> </tr><tr><td><a href="">MaximumCubeLoadThreads</a></td> <td>0</td> <td>πŸ”„</td> <td>Multithreading</td> <td>Specifies whether the cube load and feeder calculation phases of server loading are multi-threaded so multiple processor cores can be used in parallel.</td> </tr><tr><td><a href="">MaximumLoginAttempts</a></td> <td>3</td> <td>Β </td> <td>Authentication and Encryption</td> <td>maximum number of failed user login attempts permissible on TM1.</td> </tr><tr><td><a href="">MaximumMemoryForSubsetUndo</a></td> <td>10240</td> <td>Β </td> <td>Cache</td> <td>maximum amount of memory in kilobytes to be dedicated to storing the Undo/Redo stack for the Subset Editor.</td> </tr><tr><td><a href="">MaximumSynchAttempts</a></td> <td>1</td> <td>πŸ”„</td> <td>Network</td> <td>maximum number of times a synchronization process on a planet database will attempt to reconnect to a network before the process fails.</td> </tr><tr><td><a href="">MaximumTILockObjects</a></td> <td>2000</td> <td>πŸ”„</td> <td>Turbo Integrator</td> <td>This configuration parameter sets the maximum lock objects for a TurboIntegrator process. Used by the synchronized() TurboIntegrator function.</td> </tr><tr><td><a href="">MaximumUserSandboxSize</a></td> <td>500 MB</td> <td>Β </td> <td>Sandboxes</td> <td>maximum amount of RAM memory (in MB) to be allocated per user for personal workspaces or sandboxes.</td> </tr><tr><td><a href="">MaximumViewSize</a></td> <td>500 MB</td> <td>Β </td> <td>Views</td> <td>maximum amount of memory (in MB) to be allocated when a user accesses a view.</td> </tr><tr><td><strong><a href="">MDXSelectCalculatedMemberInputs</a></strong></td> <td>T</td> <td>Β </td> <td>MDX</td> <td>Changes the way in which calculated members in MDX expressions are handled when zero suppression is enabled.</td> </tr><tr><td><a href="">MemoryCache.LockFree</a></td> <td>F</td> <td>Β </td> <td>Cache</td> <td>Switches global garbage collection to use lock free structures.</td> </tr><tr><td><a href="">MessageCompression</a></td> <td>T</td> <td>πŸ”„</td> <td>Network</td> <td>Enables message compression for large messages that significantly reduces network traffic.</td> </tr><tr><td><a href="">MTCubeLoad</a></td> <td>F</td> <td>Β </td> <td>Multithreading</td> <td>Enables multi-threaded loading of individual cubes.</td> </tr><tr><td><a href="">MTCubeLoad.MinFileSize</a></td> <td>10KB</td> <td>Β </td> <td>Multithreading</td> <td>minimum size for cube files to be loaded on multiple threads.</td> </tr><tr><td><a href="">MTCubeLoad.UseBookmarkFiles</a></td> <td>F</td> <td>Β </td> <td>Multithreading</td> <td>Enables the persisting of bookmarks on disk.</td> </tr><tr><td><a href="">MTCubeLoad.Weight</a></td> <td>10</td> <td>Β </td> <td>Multithreading</td> <td>number of atomic operations needed to load a single cell.</td> </tr><tr><td><a href="">MTFeeders</a></td> <td>F</td> <td>Β </td> <td>Multithreading</td> <td>Applies multi-threaded query parallelization techniques to the following processes: the CubeProcessFeeders TurboIntegrator function cube rule updates and construction of multi-threaded (MT) feeders at start-up.</td> </tr><tr><td><a href="">MTFeeders.AtStartup</a></td> <td>F</td> <td>Β </td> <td>Multithreading</td> <td>If the MTFEEDERS configuration option is enabled enabling MTFeeders.AtStartup applies multi-threaded (MT) feeder construction during server start-up.</td> </tr><tr><td><a href="">MTFeeders.AtomicWeight</a></td> <td>10</td> <td>Β </td> <td>Multithreading</td> <td>number of required atomic operations to process feeders of a single cell.</td> </tr><tr><td><a href="">MTQ</a></td> <td>-1</td> <td>Β </td> <td>Multithreading</td> <td>maximum number of threads per single-user connection when multi-threaded optimization is applied. Used when processing queries and in batch feeder and cube load operations.</td> </tr><tr><td><a href="">MTQ.OperationProgressCheckSkipLoopSize</a></td> <td>10000</td> <td>Β </td> <td>Multithreading</td> <td>fine-tune multi-threaded query processing.</td> </tr><tr><td><a href="">MTQ.SingleCellConsolidation</a></td> <td>T</td> <td>Β </td> <td>Multithreading</td> <td>fine-tune multi-threaded query processing.</td> </tr><tr><td><a href="">MTQQuery</a></td> <td>T</td> <td>Β </td> <td>Multithreading</td> <td>enable multi-threaded query processing when calculating a view to be used as a TurboIntegrator process datasource.</td> </tr><tr><td><a href="">NetRecvBlockingWaitLimitSeconds</a></td> <td>0</td> <td>πŸ”„</td> <td>Network</td> <td>have the database perform the wait period for a client to send the next request as a series of shorter wait periods. This parameter changes the wait from one long wait period to shorter wait periods so that a thread can be canceled if needed.</td> </tr><tr><td><a href="">NetRecvMaxClientIOWaitWithinAPIsSeconds</a></td> <td>0</td> <td>πŸ”„</td> <td>Network</td> <td>maximum time for a client to do I/O within the time interval between the arrival of the first packet of data for a set of APIs through processing until a response has been sent.</td> </tr><tr><td><a href="">NIST_SP800_131A_MODE</a></td> <td>T</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>the database must operate in compliance with the SP800-131A encryption standard.</td> </tr><tr><td><a href="">ODBCLibraryPath</a></td> <td>Β </td> <td>πŸ”„</td> <td>ODBC</td> <td>name and location of the ODBC interface library (.so file) on UNIX.</td> </tr><tr><td><a href="">ODBCTimeoutInSeconds</a></td> <td>0</td> <td>Β </td> <td>ODBC</td> <td>timeout value that is sent to the ODBC driver using the SQL_ATTR_QUERY_TIMEOUT and SQL_ATTR_CONNECTION_TIMEOUT connection attributes.</td> </tr><tr><td><a href="">OptimizeClient</a></td> <td>0</td> <td>Β </td> <td>Cache</td> <td>Added in v2.0.7 This parameter determines whether private objects are loaded when the user authenticates during TM1 startup.</td> </tr><tr><td><a href="">OracleErrorForceRowStatus</a></td> <td>0</td> <td>πŸ”„</td> <td>ODBC</td> <td>ensure the correct interaction between TurboIntegrator processes and Oracle ODBC data sources.</td> </tr><tr><td><a href="">PasswordMinimumLength</a></td> <td>Β </td> <td>Β </td> <td>Authentication and Encryption</td> <td>minimum password length for clients accessing TM1.</td> </tr><tr><td><a href="">PasswordSource</a></td> <td>TM1</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Compares user-entered password to the stored password. This parameter is applicable only to TM1s on cloud or local. It is not applicable to TM1 Engine in Cloud Pak for Data or Amazon Web Services.</td> </tr><tr><td><a href="">PerfMonIsActive</a></td> <td>T</td> <td>Β </td> <td>Logs and Messages</td> <td>turn updates to TM1 performance counters on or off.</td> </tr><tr><td><a href="">PerformanceMonitorOn</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>Automatically starts populating the }Stats control cubes when a TM1 starts.</td> </tr><tr><td><a href="">PersistentFeeders</a></td> <td>F</td> <td>πŸ”„</td> <td>Rules</td> <td>To improve reload time of cubes with feeders set the PersistentFeeders configuration parameter to true (T) to store the calculated feeders to a .feeders file.</td> </tr><tr><td><a href="">PortNumber</a></td> <td>12345</td> <td>πŸ”„</td> <td>Network</td> <td>server port number used to distinguish between multiple TM1s running on the same computer.</td> </tr><tr><td><a href="">PreallocatedMemory.BeforeLoad</a></td> <td>F</td> <td>Β </td> <td>Cache</td> <td>Added in v2.0.5 Specifies whether the preallocation of memory occurs before TM1 loading or in parallel.</td> </tr><tr><td><a href="">PreallocatedMemory.Size</a></td> <td>0</td> <td>Β </td> <td>Cache</td> <td>Added in v2.0.5 Triggers the preallocation of pooled TM1 memory.</td> </tr><tr><td><a href="">PreallocatedMemory.ThreadNumber</a></td> <td>4</td> <td>Β </td> <td>Multithreading</td> <td>Added in v2.0.5 Specifies the number of threads used for preallocation memory in multi-threaded cube loading.</td> </tr><tr><td><a href="">PrivilegeGenerationOptimization</a></td> <td>F</td> <td>πŸ”„</td> <td>Cache</td> <td>When TM1 generates security privileges from a security control cube it reads every cell from that cube.</td> </tr><tr><td><a href="">ProgressMessage</a></td> <td>T</td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>whether users have the option to cancel lengthy view calculations.</td> </tr><tr><td><a href="">ProportionSpreadToZeroCells</a></td> <td>T</td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>Allows you to perform a proportional spread from a consolidation without generating an error when all the leaf cells contain zero values.</td> </tr><tr><td><a href="">PullInvalidationSubsets</a></td> <td>T</td> <td>Β </td> <td>Subsets</td> <td>Reduces metadata locking by not requiring an R-lock (read lock) on the dimension during subset creation deletion or loading from disk.</td> </tr><tr><td><a href="">RawStoreDirectory</a></td> <td>Β </td> <td>Β </td> <td>Logs and Messages</td> <td>location of the temporary unprocessed log file for audit logging if logging takes place in a directory other than the data directory.</td> </tr><tr><td><a href="">ReceiveProgressResponseTimeoutSecs</a></td> <td>Β </td> <td>Β </td> <td>Network</td> <td>The ReceiveProgressResponseTimeoutSecs parameter configures TM1 to sever the client connection and release resources during a long wait for a Cancel action.</td> </tr><tr><td><a href="">ReduceCubeLockingOnDimensionUpdate</a></td> <td>F</td> <td>πŸ”„</td> <td>Dimensions</td> <td>Reduces the occurrence of cube locking during dimension updates.</td> </tr><tr><td><a href="">RulesOverwriteCellsOnLoad</a></td> <td>F</td> <td>πŸ”„</td> <td>Rules</td> <td>Prevents cells from being overwritten on TM1 load in rule-derived data.</td> </tr><tr><td><a href="">RunningInBackground</a></td> <td>F</td> <td>πŸ”„</td> <td>Linux</td> <td>When you add the line RunningInBackground=T to TM1 configuration TM1 on UNIX runs in background mode.</td> </tr><tr><td><a href="">SaveFeedersOnRuleAttach</a></td> <td>T</td> <td>Β </td> <td>Rules</td> <td>When set to False postpones writing to feeder files until SaveDataAll and CubeDataSave are called instead of updating the files right after rules are changed and feeders are generated at TM1 start time.</td> </tr><tr><td><a href="">SaveTime</a></td> <td>Β </td> <td>Β </td> <td>Chores</td> <td>time of day to execute an automatic save of TM1 data; saves the cubes every succeeding day at the same time. As with a regular shutdown SaveTime renames the log file opens a new log file and continues to run after the save.</td> </tr><tr><td><a href="">SecurityPackageName</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>If you configure TM1 to use Integrated Login the SecurityPackageName parameter defines the security package that authenticates your user name and password in MS Windows.</td> </tr><tr><td><a href="">ServerCAMURI</a></td> <td>Β </td> <td>Β </td> <td>Cognos Analytics</td> <td>URI for the internal dispatcher that TM1 should use to connect to Cognos Authentication Manager (CAM).</td> </tr><tr><td><a href="">ServerCAMURIRetryAttempts</a></td> <td>3</td> <td>πŸ”„</td> <td>Cognos Analytics</td> <td>number of attempts made before moving on to the next ServerCAMURI entry in TM1 configuration.</td> </tr><tr><td><a href="">ServerLogging</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>Generates a log with the security activity details on TM1 that are associated with Integrated Login.</td> </tr><tr><td><a href="">ServerName</a></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>name of the server. If you do not supply this parameter TM1 names the server Local and treats it as a local server.</td> </tr><tr><td><a href="">ServicePrincipalName</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>service principal name (SPN) when using Integrated Login with TM1 Web and constrained delegation.</td> </tr><tr><td><a href="">SpreadErrorInTIDiscardsAllChanges</a></td> <td>F</td> <td>πŸ”„</td> <td>Turbo Integrator</td> <td>If SpreadErrorInTIDiscardsAllChanges is enabled and a spreading error occurs as part of a running TurboIntegrator script all changes that were made by that TurboIntegrator script are discarded.</td> </tr><tr><td><a href="">SpreadingPrecision</a></td> <td>1e-8</td> <td>Β </td> <td>Calculations</td> <td>Use the SpreadingPrecision parameter to increase or decrease the margin of error for spreading calculations. The SpreadingPrecision parameter value is specified with scientific (exponential) notation.</td> </tr><tr><td><a href="">SQLRowsetSize</a></td> <td>50</td> <td>Β </td> <td>ODBC</td> <td>Added in v2.0.3 Specifies the maximum number of rows to retrieve per ODBC request.</td> </tr><tr><td><a href="">SSLCertAuthority</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>name of TM1's certificate authority file. This file must reside on the computer where TM1 is installed.</td> </tr><tr><td><a href="">SSLCertificate</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>full path of TM1's certificate file which contains the public/private key pair.</td> </tr><tr><td><a href="">SSLCertificateID</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>name of the principal to whom TM1's certificate is issued.</td> </tr><tr><td><a href="">StartupChores</a></td> <td>Β </td> <td>πŸ”„</td> <td>Chores</td> <td>StartupChores is a configuration parameter that identifies a list of chores that run at database startup.</td> </tr><tr><td><a href="">SubsetElementBreatherCount</a></td> <td>-1</td> <td>Β </td> <td>Subsets</td> <td>handles locking behavior for subsets.</td> </tr><tr><td><a href="">SupportPreTLSv12Clients</a></td> <td>F</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>As of TM1 10.2.2 Fix Pack 6 ( all SSL-secured communication between clients and databases in TM1 uses Transport Layer Security (TLS) 1.2. This parameter determines whether clients prior to can connect to the or later TM1 server.</td> </tr><tr><td><a href="">SvrSSLExportKeyID</a></td> <td>Β </td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>identity key used to export TM1's certificate from the MS Windows certificate store.</td> </tr><tr><td><a href="">SyncUnitSize</a></td> <td>1000</td> <td>πŸ”„</td> <td>Network</td> <td>frequency of saving a check point during a synchronization process in case there is a network connection failure.</td> </tr><tr><td><a href="">tlsCipherList</a></td> <td>Β </td> <td>πŸ”„</td> <td>Network</td> <td>comma-separated list of supported cipher suites in priority sequence.</td> </tr><tr><td><a href="">TopLogging</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>Added in v2.0.7 Enables dynamic logging of the threads that are running in an instance of TM1.</td> </tr><tr><td><a href="">TopScanFrequency</a></td> <td>5</td> <td>Β </td> <td>Logs and Messages</td> <td>Added in v2.0.7 Specifies the logging frequency (interval) in seconds for the TopLogging logger which enables dynamic logging of the threads that are running in an instance of TM1.</td> </tr><tr><td><a href="">TopScanMode.Sandboxes</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>Added in v2.0.7 Enables logging of the active sandboxes for the current TM1 the total memory that is consumed for all sandboxes by a user and the number of sandboxes for this user.</td> </tr><tr><td><a href="">TopScanMode.SandboxQueueMetrics</a></td> <td>F</td> <td>Β </td> <td>Logs and Messages</td> <td>Added in v2.0.7 Enables logging of sandbox queue metrics. The name of the node for the sandbox the status of the sandbox in the queue and the length of time the sandbox was in the queue before it was processed is logged for each sandbox in the queue.</td> </tr><tr><td><a href="">TopScanMode.Threads</a></td> <td>T</td> <td>Β </td> <td>Logs and Messages</td> <td>Added in v2.0.7 Enables logging of the current processing state of each thread. This information includes the name of the user or process that started the thread the API function that the thread is executing the lock status of the last object that was locked the number of objects that are used by the thread and the total time in seconds that the current API function or chore process has been processing.</td> </tr><tr><td><a href="">UnicodeUpperLowerCase</a></td> <td>T</td> <td>πŸ”„</td> <td>Logs and Messages</td> <td>This configuration parameter instructs TM1 to identify and handle Unicode object names preventing the creation of identical Unicode object names that vary only in case.</td> </tr><tr><td><a href="">UseExcelSerialDate</a></td> <td>F</td> <td>πŸ”„</td> <td>Calculations</td> <td>Enables the use of MS Excel serial dates instead of TM1 serial dates.</td> </tr><tr><td><a href="">UseLocalCopiesforPublicDynamicSubsets</a></td> <td>T</td> <td>Β </td> <td>Subsets</td> <td>Allows public dynamic subsets to improve performance and reduce locking by using local copies of the subset when possible.</td> </tr><tr><td><a href="">UserDefinedCalculations</a></td> <td>T</td> <td>Β </td> <td>Subsets</td> <td>Enables the Rollup and Insert Subset options to create user-defined consolidations in the Subset Editor in TM1 and enables the Create Custom Consolidation button in TM1(r)Web clients.</td> </tr><tr><td><a href="">UseSQLFetch UseSQLFetchScroll UseSQLExtendedFetch</a></td> <td>F</td> <td>Β </td> <td>ODBC</td> <td>These parameters instruct TM1 to use a particular fetch call.</td> </tr><tr><td><a href="">UseSSL</a></td> <td>T</td> <td>πŸ”„</td> <td>Authentication and Encryption</td> <td>Enables or disables SSL on TM1.</td> </tr><tr><td><a href="">UseStargateForRules</a></td> <td>T</td> <td>πŸ”„</td> <td>Rules</td> <td>rules use Stargate views.</td> </tr><tr><td><a href="">VersionedListControlDimensions</a></td> <td>T</td> <td>πŸ”„</td> <td>Dimensions</td> <td>Removes contention on control dimensions such as }Cubes }Dimensions }Groups }Clients. Allows creation of new objects without IX locking the dimension.</td> </tr><tr><td><a href="">ViewConsolidationOptimization</a></td> <td>T</td> <td>πŸ”„</td> <td>Views</td> <td>Enables or disables view consolidation optimization on TM1.</td> </tr><tr><td><a href="">ViewConsolidationOptimizationMethod</a></td> <td>TREE</td> <td>πŸ”„</td> <td>Views</td> <td>method used to achieve view consolidation optimization when the ViewConsolidationOptimization parameter is enabled on TM1.</td> </tr><tr><td><a href="">ZeroWeightOptimization</a></td> <td>T</td> <td>πŸ”„</td> <td>Calculations</td> <td>Determines whether consolidated members with a weight of 0 are factored into the computation of consolidated cell values or consolidation functions. Consolidation functions include ConsolidatedCount ConsolidatedMax ConsolidatedMin ConsolidatedAvg ConsolidatedCount and ConsolidatedCountUnique.</td> </tr></tbody></table><script> <!--//--><![CDATA[// ><!-- function filterTable(columnIndex, selectElement) { var table, rows, row, cell, i, j, filter; table = document.getElementById("table"); rows = table.getElementsByTagName("tr"); filter = selectElement.value.toUpperCase(); for (i = 1; i < rows.length; i++) { row = rows[i]; cell = row.getElementsByTagName("td")[columnIndex]; if (cell) { if (cell.innerHTML.toUpperCase().indexOf(filter) > -1) { = ""; } else { = "none"; } } } } //--><!]]> </script></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 2023-05-16 14:10</span> <div class="field field--name-field-categories field--type-entity-reference field--label-inline clearfix"> <div class="field__label">Categories</div> <div class="field__items"> <div class="field__item"><a href="/tm1/admins" hreflang="en">admins</a></div> <div class="field__item"><a href="/tm1/documentation" hreflang="en">Documentation</a></div> <div class="field__item"><a href="/tm1/python" hreflang="en">python</a></div> <div class="field__item"><a href="/tm1/pandas" hreflang="en">pandas</a></div> <div class="field__item"><a href="/tm1/tm1scfg" hreflang="en">tm1s.cfg</a></div> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=100&amp;2=comment&amp;3=comment" token="js1OXzAhu0LgUEfe-P8TE3ikEcH4X4UZUHyZdtad028"></drupal-render-placeholder> </section> Tue, 16 May 2023 12:10:44 +0000 admin 100 at Undocumented MDX in TM1 <span class="field field--name-title field--type-string field--label-hidden">Undocumented MDX in TM1</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><img alt="PAW MDX Editor highlighting keywords" data-entity-type="file" data-entity-uuid="25a6adb4-e94a-43b0-b6c0-a18904c833a1" height="321" src="/sites/default/files/inline-images/tm1-keywords-highlighting.gif" width="384" loading="lazy" /></p> <p>Oh, something interesting is happening here. In the PAW MDX Editor, the interface is changing the colour of a word, AXIS in this case, to indicate it is a reserved word. But now, I'm wondering, how does it know that this word is an MDX reserved word?<br /> A quick look in the chromium dev tools (Control-Shift-i) Network tab shows there is no traffic exchange to the server while I type in the MDX Editor window. Apparently, the MDX Editor already knows what to highlight, therefore the keywords to be highlighted must be in the cache somewhere.<br /> I will pick the TM1SORT keyword to search through the browser cache because that word is specific to MDX in TM1, so it is unlikely to return many hits from the cache, unlike other keywords such as children or dimension.<br /> Again in the chromium dev tools, press Control-Shift-F, TM1SORT in the input field and bullseye, just 1 hit in mdv.js.<br /> You can see in that mdv.js file the creation of 2 new mime-types "text/x-tm1setmdx" and "text/x-tm1viewmdx". So we have the following keywords lists for tm1setmdx and tm1viewmdx.</p> <ul><li>That list is not exhaustive, only keywords highlighted by the MDX Editor are shown, e.g. <a href="">InStr</a> or <a href="">Tm1ToggleExpandMode</a> will not be highlighted, but these functions actually work.</li> <li>Some keywords are grouped in subcategories according to their context</li> <li>Most keywords below are linked to their corresponding definition on the <a href="">Microsoft MDX Reference website</a>.</li> <li><em>Functions and Entity Properties listed below in italic</em> are <a href="">not yet referenced</a> in the excellent TM1 MDX Reference written by George Tonkin (gtonkin) at <a href=""></a></li> </ul><h3>TM1 MDX for Sets and Views</h3> <p><strong>Reserved Words for Statements</strong></p> <p><a href="">Data Manipulation Statements</a>: <a href="">CLEAR</a> CALCULATIONS WITH MEMBER AS <a href="">SELECT</a> CELL NON EMPTY VISUAL ON COLUMNS ROWS PAGES SECTIONS CHAPTERS MEASURE FROM WHERE <a href="">UPDATE</a> PROPERTIES</p> <p><a href="">Scripting Statements</a>: <a href="">CALCULATE</a> <a href="">FREEZE</a> <a href="">SCOPE</a></p> <p><a href="">Data Definition Statements</a>: CREATE CALCULATION SET SESSION GLOBAL <a href="">CUBE</a> <a href="">USE_EQUAL_ALLOCATION</a> <a href="">USE_WEIGHTED_ALLOCATION</a> <a href="">USE_WEIGHTED_INCREMENT</a> DROP <a href="">GROUP GROUPING HIDDEN NOT_RELATED_TO_FACTS PROPERTY</a> <a href="">CURRENTCUBE TYPE</a></p> <p><a href="">Operators</a>: <a href="">AND</a> <a href="">IS</a> <a href="">NOT</a> <a href="">OR</a> <a href="">XOR</a></p> <p>ACTIONPARAMETERSET AVERAGE BY CACHE CELLFORMULASETLIST COLUMN CREATEPROPERTYSET CREATEVIRTUALDIMENSION END ERROR <a href="">FALSE</a> <a href="">FOR</a> IGNORE INDEX NEST NO_ALLOCATION NULL PASS <a href="">ROOT</a> SORT STORAGE STRTOVAL THIS TOTALS TREE <a href="">TRUE</a> UNIQUE USE</p> <p><strong>Functions</strong></p> <p>Array Functions: <em><a href="">SetToArray</a> </em></p> <p>Hierarchy Functions: <em><a href="">Dimensions</a> </em></p> <p>Level Functions: <a href="">Levels</a></p> <p>Logical Functions: <a href="">IsAncestor</a> <a href="">IsEmpty</a> <a href="">IsGeneration</a> <a href="">IsLeaf</a> <a href="">IsSibling</a></p> <p>Member Functions: <a href="">Ancestor</a> <a href="">ClosingPeriod</a> <a href="">Cousin</a> <em><a href="">LinkMember</a> </em><a href="">Members</a> <a href="">OpeningPeriod</a> <a href="">ParallelPeriod</a> <a href="">StrToMember</a> <em><a href="">ValidMeasure</a> </em></p> <p>Numeric Functions: <a href="">Aggregate</a> <a href="">Avg</a> <em><a href="">CalculationCurrentPass</a> </em><em><a href="">CalculationPassValue</a></em><em> </em><a href="">CoalesceEmpty</a> <a href="">Correlation</a> <a href="">Count</a> <a href="">Covariance</a> <a href="">CovarianceN</a> <a href="">DistinctCount</a> <a href="">IIf</a> <a href="">LinRegIntercept</a> <a href="">LinRegPoint</a> <a href="">LinRegr2</a> <a href="">LinRegSlope</a> <a href="">LinRegVariance</a> <a href="">LookupCube</a> <a href="">Max</a> <a href="">Median</a> <a href="">Min</a> <em><a href="">Predict</a> </em><em><a href="">RollupChildren</a></em> <a href="">Stddev</a> <a href="">StddevP</a> <a href="">Stdev</a> <a href="">StdevP</a> <a href="">StrToValue</a> <a href="">Sum</a> <a href="">Var</a> <a href="">Variance</a> <a href="">VarianceP</a> <a href="">VarP</a></p> <p>Set Functions: <a href="">AddCalculatedMembers</a> <a href="">Ancestors</a> <a href="">Ascendants</a> <em><a href="">Axis</a> </em><a href="">BottomCount</a> <a href="">BottomPercent</a> <a href="">BottomSum</a>Β  <a href="">CrossJoin</a> <a href="">Descendants</a> <a href="">Distinct</a> <a href="">DrilldownLevel</a> <a href="">DrilldownLevelBottom</a> <a href="">DrilldownLevelTop</a> <a href="">DrilldownMember</a> <a href="">DrilldownMemberBottom</a> <a href="">DrilldownMemberTop</a> <a href="">DrillupLevel</a> <a href="">DrillupMember</a> <a href="">Except</a> <a href="">Extract</a> <a href="">Filter</a> <a href="">Generate</a> <a href="">Head</a> <a href="">Hierarchize</a> <a href="">Intersect</a> <a href="">LastPeriods</a> <em><a href="">Mtd</a> </em><a href="">NameToSet</a> <em><a href="">NonEmptyCrossjoin</a></em> <a href="">Order</a> <a href="">PeriodsToDate</a> <em><a href="">Qtd</a> </em><em><a href="">StripCalculatedMembers</a></em> <a href="">StrToSet</a><em> </em><a href="">Subset</a> <a href="">Tail</a> <a href="">ToggleDrillState</a> <a href="">TopCount</a> <a href="">TopPercent</a> <a href="">TopSum</a> <a href="">Union</a> <em><a href="">VisualTotals</a></em> <em><a href="">Wtd</a></em> <em><a href="">Ytd</a></em></p> <p>String Functions: <a href="">CoalesceEmpty</a> <a href="">Generate</a> <a href="">IIf</a> Left <a href="">LookupCube</a> <a href="">MemberToStr</a> Right <a href="">SetToStr</a> <a href="">TupleToStr</a> <a href="">UserName</a></p> <p>Tuple Functions: <a href="">StrToTuple</a></p> <p>other functions: <em><a href="">Call</a></em> <em>Ignore</em> <a href="">Rank</a>Β Β Β Β Β Β </p> <p><strong>TM1 Functions</strong></p> <p>TM1BANGPREFIX <a href="">TM1DRILLDOWNMEMBER</a> TM1IGNORE_BADTUPLES <a href="">TM1FILTERBYLEVEL</a> <a href="">TM1FILTERBYPATTERN</a> TM1FORMAT_STRING <a href="">TM1MEMBER</a> TM1ROLLUP TM1RULEDERIVED <a href="">TM1SORT</a> <a href="">TM1SORTBYINDEX</a> TM1SUBSETBASIS <a href="">TM1SUBSETALL</a> <a href="">TM1SUBSETTOSET</a> TM1SUBSET_IDENT TM1TOGGLEDRILLSTATE <a href="">TM1TUPLESIZE</a> TM1UPDATE TM1UPDATEABLE</p> <p><strong>Entity Properties</strong></p> <p><a href="">AllMembers</a> <a href="">Children</a> <a href="">Count</a> <a href="">Current</a> <a href="">CurrentMember</a> <em><a href="">DataMember</a></em> <a href="">DefaultMember</a> <em><a href="">Dimension</a></em> <a href="">FirstChild</a> <a href="">FirstSibling</a> <em><a href="">Hierarchy</a></em> <a href="">Item</a> <a href="">Lag</a> <a href="">LastChild</a> <a href="">LastSibling</a> <a href="">Lead</a> <a href="">Level</a> <a href="">Levels</a> <a href="">Members</a> <a href="">Name</a> <a href="">NextMember</a> <em><a href="">Ordinal</a></em> <a href="">Parent</a> <a href="">PrevMember</a> <a href="">Properties</a> <a href="">Siblings</a> <a href="">UniqueName</a> <a href="">Value</a></p> <h3>TM1 MDX for Views only</h3> <p><strong>Cell Properties</strong></p> <p><a href="">BACK_COLOR</a> CELL_EVALUATION_LIST <a href="">CELL_ORDINAL</a> <a href="">FORE_COLOR</a> <a href="">FONT_NAME</a> <a href="">FONT_SIZE</a> <a href="">FONT_FLAGS</a> <a href="">FORMAT_STRING</a> <a href="">FORMATTED_VALUE</a> NON_EMPTY_BEHAVIOR <a href="">SOLVE_ORDER</a> <a href="">VALUE</a></p> <p><strong>Member Properties</strong></p> <p><a href="">CALCULATION_PASS_DEPTH</a> <a href="">CALCULATION_PASS_NUMBER</a> <a href="">CONDITION</a> <a href="">DISABLED</a></p> <p><a href="">CATALOG_NAME CHILDREN_CARDINALITY DESCRIPTION DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_NUMBER LEVEL_UNIQUE_NAME MEMBER_CAPTION MEMBER_NAME MEMBER_TYPE MEMBER_UNIQUE_NAME PARENT_COUNT PARENT_LEVEL PARENT_UNIQUE_NAME SCHEMA_NAME</a> MEMBER_GUID MEMBER_ORDINAL CUBE_NAME</p> <p><strong>Flags</strong></p> <p><a href="">ABSOLUTE RELATIVE ALL</a></p> <p>DEFAULT_MEMBER <a href="">POST</a> <a href="">RECURSIVE </a></p> <p><a href="">EXCLUDEEMPTYΒ  INCLUDEEMPTY</a></p> <p><a href="">ASC BASC Β  DESC BDESC</a></p> <p><a href="">SELF AFTER BEFORE BEFORE BEFORE_AND_AFTER SELF_AND_AFTER SELF_AND_BEFORE SELF_BEFORE_AFTER LEAVES</a></p> <h3>Essential reference guides for MDX in TM1</h3> <p>gtonkin's guide <a href=""></a></p> <p>Wim Gielis' MDX examples <a href=""></a></p> <p>MDX IBM TM1 Reference <a href=""></a></p> <p>Microsoft MDX Language Reference <a href=""></a></p> <p>Β </p> <p>As per usual with undocumented features, use at your own risk and all the yada yada yada that goes with it. There is no guarantee that any of these functions actually work as expected according to the Microsoft's original MDX reference documentation.<br /> For now, I just dump these keywords here, and that material will probably lead to a new series of posts about MDX in TM1.</p> <p>Python script I used to grab the keywords from the <a href="">tm1forum MDX reference tables</a> and compare which are missing:</p> <pre> import requests from bs4 import BeautifulSoup mdv = "AllMembers Children Count Current CurrentMember DataMember DefaultMember Dimension FirstChild FirstSibling Hierarchy Item Lag LastChild LastSibling Lead Level Levels Members Name NextMember Ordinal Parent PrevMember Properties Siblings UniqueName Value" mdv = mdv.upper() # fetch on tm1forum gtonkin's MDX reference page url = "" response = requests.get(url) # Parse HTML soup = BeautifulSoup(response.content, "html.parser") # Find all tables tables = soup.find_all("table") # Loop through the tables in that html document and extract the first column that should contain MDX keywords words = [] for table in tables: rows = table.find_all("tr") for row in rows: cells = row.find_all("td") if len(cells) &gt; 0: words.append(cells[0].get_text().upper()) print(f"All MDX words documented on tm1forum:\n{words}" ) print(f"Still undocumented:\n{sorted(set(mdv.split()).difference(set(words)))}" ) </pre></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 2023-04-27 10:40</span> <div class="field field--name-field-categories field--type-entity-reference field--label-inline clearfix"> <div class="field__label">Categories</div> <div class="field__items"> <div class="field__item"><a href="/tm1/developers" hreflang="en">developers</a></div> <div class="field__item"><a href="/tm1/mdx" hreflang="en">MDX</a></div> <div class="field__item"><a href="/tm1/paw" hreflang="en">PAW</a></div> <div class="field__item"><a href="/tm1/rtfm_fail" hreflang="en">RTFM FAIL</a></div> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=98&amp;2=comment&amp;3=comment" token="GuzD-p87H_iMGzhXSG-7GsvLKPVAbPv4TFIYyf7wmGQ"></drupal-render-placeholder> </section> Thu, 27 Apr 2023 08:40:45 +0000 admin 98 at TM1 PAW Dark Mode <span class="field field--name-title field--type-string field--label-hidden">TM1 PAW Dark Mode</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>When it comes to display, some people swear by <a href="">dark mode</a>. A lot of websites and apps already jumped on that dark mode <a href=";q=dark%20mode&amp;hl=en-GB">trend</a>, though PAW is not exactly there yet.</p> <p>There is a dark theme available in PAW workbooks settings. But the side tabs in edit mode don't turn dark, only the workbook in the centre does.<br /><img alt="PAW book editing" data-entity-type="file" data-entity-uuid="a95a36f1-7eab-471b-9f06-77cbda929e73" height="209" src="/sites/default/files/inline-images/paw-book-editing.png" width="626" loading="lazy" /></p> <p><br /> That means, you will have to get yourself one of those <a href="">schickimicki</a> blinders:<br /><br /><img alt="I ❀️ editing paw workbooks in dark mode" data-entity-type="file" data-entity-uuid="7750c9c3-01b7-43b2-9ad1-f951dca2ea48" height="285" src="/sites/default/files/inline-images/schickimicki-blinders.png" width="199" loading="lazy" /><br /><br /> Never mind, I will share a few tips now to switch the entire PAW workbench to a real dark theme mode. And this time, we won't need to <a href="/pimp-my-paw">ask Xzibit</a> to <a href="">throw the kitchen sink at the problem</a>.<br /><br /> You can have a true dark mode for PAW, and for any other website, thanks to the <strong>Dark ReaderΒ  </strong><img alt="Dark Reader browser extension" data-entity-type="file" data-entity-uuid="49f1d812-9560-4225-adea-dfd088c60fac" height="21" src="/sites/default/files/inline-images/dark-reader.png" width="21" loading="lazy" /> extension for <a href="">chromium</a> and add on for <a href="">firefox</a>.<br /> Ah yes, I hear you, you're at work, you can't just install any funny old extension in the company's browser. PAW is often used in locked down environments where installing any kind of browser extension is prohibited.<br /> No worries, I got you covered too with the next tips, you will not need to install anything.</p> <p>For Chrome, you need to edit a flag:Β </p> <ol><li>enter chrome://flags in ChromeΒ address bar</li> <li>search for dark mode</li> <li>switch "Auto Dark Mode for Web Content" to Enabled</li> </ol><p>The downside is that you need to restart the browser to switch that setting on or off so you may need to log back in your sites again.</p> <p>For Edge, follow the same steps, chrome://flags Edge will autoreplace chrome://flags with edge://flags and then you can toggle the same "Dark Mode" flag</p> <p>And if you don't want to restart your browser, you can turn on that sweet dark mode with just one CSS line. Just follow these steps:</p> <ol><li>Select the PAW tab in your browser</li> <li>Open the browser Developer Tools panel (Ctrl-Shift-i)</li> <li>Click on Elements tab</li> <li>Click on the "&lt;html lang=..." line under Elements</li> <li>Click on Styles tab in the right panel</li> <li>In the Filter window, enter "html"</li> <li>Add the following line inside the html {} style:</li> </ol><p><strong>filter: invert(100%) hue-rotate(180deg);</strong></p> <p>and the workspace should now look like this (minus the highlighted numbered steps in red):</p> <p><img alt="PAW Dark Mode" data-entity-type="file" data-entity-uuid="5ab1b3e5-6053-49b7-8f29-c08e0904ba82" height="381" src="/sites/default/files/inline-images/paw-dark-mode.png" width="623" loading="lazy" /><br /><br /> Nice, but that's a lot of steps, and they must be repeated every time you load PAW. It is faster and more convenient to use the bookmarklet below, so save that javascript code as a bookmark:</p> <pre> javascript:(function() { const html = document.querySelector('html'); const style = html.getAttribute('style') || ''; html.setAttribute('style', style + ' filter: invert(100%) hue-rotate(180deg);'); })(); </pre> <p>Next time you open the PAW interface, click on that bookmark and it will turn the interface to dark mode. That should work for most other websites too.</p> <p><br /> While we are on that topic, I will throw in a tip for android phones, it will trigger dark mode for any blinding android app although results may be less than ideal:</p> <p>Go to: Settings β†’ Accessibility β†’ Text and display β†’ Colour inversion (on|off)</p> <p>Last, but not least: <strong>staying away from screens at night</strong> is the best tip of all.</p></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 2023-04-26 14:32</span> <div class="field field--name-field-categories field--type-entity-reference field--label-inline clearfix"> <div class="field__label">Categories</div> <div class="field__items"> <div class="field__item"><a href="/tm1/users" hreflang="en">users</a></div> <div class="field__item"><a href="/tm1/paw" hreflang="en">PAW</a></div> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=97&amp;2=comment&amp;3=comment" token="wIdXtZVON3VV7yM9XwEabzXB6PCrS4K8x_s_nzrt1ZQ"></drupal-render-placeholder> </section> Wed, 26 Apr 2023 12:32:12 +0000 admin 97 at Pimp my PAW <span class="field field--name-title field--type-string field--label-hidden">Pimp my PAW</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><img alt="PAW mdx view block" data-entity-type="file" data-entity-uuid="6c2fcde3-b71b-443d-8e22-29631813de1b" height="301" src="/sites/default/files/inline-images/mdx-block.jpg" width="373" /></p> <p>I'm in the PAW Workbench, I open a view and I click on the "Edit MDX" button. I get a packed MDX block, with no indentation whatsoever, pretty hard to read. If only there was an option to format that MDX block to something much easier to read.....</p> <p>Β **RING** **RING** Oh, I'm sorry, I must interrupt this blogpost, someone is at the door.</p> <p>Please hold on.</p> <p>- I'm sorry, who are you?</p> <p>- Yo dawg! I'm Xzibit!</p> <p>- Wait! What? What are you doing on this blog?</p> <p>- <a href="">Yo dawg</a> I herd you like APIs so we put an API in yo API so you can MDX while you MDX.</p> <p><img alt="Yo dawg I herd you like APIs so we put an API in yo API so you can MDX while you MDX." data-entity-type="file" data-entity-uuid="9ae7d5c7-7154-4af0-bd16-c7dfaeaca9b2" height="229" src="/sites/default/files/inline-images/i-herd-you-like-apis.jpg" width="354" /></p> <p>- Is this a joke? This does not make any sense!</p> <p>- It will make sense, buckle up yo.</p> <p>This is going to be the setup:</p> <p><a href="">chromium</a> &lt;---<a href="">mitmproxy</a>---&gt; <a href="">PAW server</a></p> <ol><li>chromium opens the MDX Editor, that triggers a POST /api/v1/MDX call to the PAW server</li> <li>mitmproxy catches the json response from the PAW server</li> <li>a python script modifies that json data on-the-fly according to our needs</li> <li>mitmproxy hands over the modified data to chromium</li> <li>finally chromium displays the reformatted MDX expression</li> </ol><p>The whole process is completely transparent to the client and the server. We are inserting ourselves in the middle of an SSL encrypted connection, it will require installing a fake Certificate Authority to keep both client and server happy. And I don't like clicking around, so we will prepare that setup from the commandline.</p> <p>First, we install the script that mitmproxy will be using to process the PAW server responses.</p> <pre> mkdir ~/.mitmproxy &amp;&amp; cat &gt; ~/.mitmproxy/ &lt;&lt; EOF from sql_formatter.core import format_sql from mitmproxy import http import json def response(flow: http.HTTPFlow) -&gt; None: #intercept MDX API responses if flow.request.pretty_url.endswith("/api/v1/MDX"): content = json.loads(flow.response.content) mdx_pretty = format_sql(content['Mdx']) # inject the expression back in the flow content['Mdx'] = mdx_pretty flow.response.content = bytes(json.dumps(content),"UTF-8") EOF # </pre> <p>Before installing the <a href="">mitmproxy/mitmproxy</a> docker image, we need to extend that docker image with the python package "<a href="">sql formatter</a>". sql formatter is not ideal to format MDX, but that will be good enough for the sake of that proof of concept:</p> <pre> docker build --tag mitmproxy-sqlfmt - &lt;&lt; EOF FROM mitmproxy/mitmproxy RUN pip install sql_formatter EOF # </pre> <p>Now run that new build with the script and a localhost web interface on port 8081 to display what goes through the proxy:</p> <pre> docker run --rm -it -p 8080:8080 -p -v ~/.mitmproxy:/home/mitmproxy/.mitmproxy mitmproxy-sqlfmt mitmweb -s ~/.mitmproxy/ --web-host</pre> <p>On its first run, the container generates all the necessary certificates in ~/.mitmproxy .</p> <p>With a browser, navigate to <a href=""></a> this is mitmweb interface that allows you to see all the exchanges between the client and PAW server. We will not use that browser to access the PAW server, this is only to watch what's happening in the background.</p> <p><img alt="mitmweb start" data-entity-type="file" data-entity-uuid="40bed1c8-ab6e-42f3-a74f-2e6bb350565a" height="311" src="/sites/default/files/inline-images/mitmweb-start.jpg" width="218" /></p> <p>As it is suggested on that screenshot, we will now configure a chromium client to use that proxy.</p> <p>But first, a word of warning, installing fake CAs is messy, and it creates a huge security vulnerability in your browser, anybody in possession of the CA keys could read the traffic from your browser. So, we are going to sandbox chromium with <a href="">firejail</a> in order to keep that setup isolated in a dedicated directory ~/jail and that will be much easier to clean up afterwards.</p> <p>We initialise the certificates database in the jail with <a href="">certutil from mozilla-nss-tools</a> and populate it with the newly generated mitmproxy certificate. That will spare us from messing with the browser settings at chrome://settings/certificates</p> <pre> mkdir -p ~/jail/.pki/nssdb &amp;&amp; certutil -d sql:$HOME/jail/.pki/nssdb -A -t "CT,c,c" -n mitmproxy -i ~/.mitmproxy/mitmproxy-ca-cert.pem </pre> <p>We launch the sandboxed chromium in <a href="">firejail</a> with the preconfigured proxy address</p> <pre> firejail --env=https_proxy= --private=~/jail chromium</pre> <p>With this jailed chromium, navigate to the URL where your PAW server is located, log in, open the workbench and open some cube view, as you normally would.</p> <p>Now, you see on the screenshot below, on the bottom left, clicking on the "Edit MDX" button resulted in a POST /api/v1/MDX call to the PAW server. On the right, in the response from the server, the value for the key "Mdx" is correctly showing "\n" and space indentations. And finally, the "Edit MDX" window is showing the MDX expression almost formatted to our liking.</p> <p><img alt="mitmweb MDX expression beautify" data-entity-type="file" data-entity-uuid="c660e518-1e27-4308-a5fc-f0fbd2acaa5f" height="782" src="/sites/default/files/inline-images/mitmweb-mdx-beautify.jpg" width="696" /></p> <p>- OK! But this is definitely not something that I would deploy to users.</p> <p>- Right yo! This setup is only intended for educational purposes, and it is about as useful as print "hello world!". But It gives you a different approach to dig in the PAW API, and a way to inject it with python code through the <a href="">mitmproxy scripting API</a>.</p> <p>- Thanks Xzibit!</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 2023-04-10 10:03</span> <div class="field field--name-field-categories field--type-entity-reference field--label-inline clearfix"> <div class="field__label">Categories</div> <div class="field__items"> <div class="field__item"><a href="/tm1/developers" hreflang="en">developers</a></div> <div class="field__item"><a href="/tm1/paw" hreflang="en">PAW</a></div> <div class="field__item"><a href="/tm1/mitmproxy" hreflang="en">mitmproxy</a></div> <div class="field__item"><a href="/tm1/docker" hreflang="en">docker</a></div> <div class="field__item"><a href="/tm1/python" hreflang="en">python</a></div> <div class="field__item"><a href="/tm1/api" hreflang="en">API</a></div> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=96&amp;2=comment&amp;3=comment" token="hqAObdmz1JIx2F4qvSI2mMi09fjYe_8U6ypp8EdTQ-A"></drupal-render-placeholder> </section> Mon, 10 Apr 2023 08:03:02 +0000 admin 96 at blogging is starting again <span property="schema:name" class="field field--name-title field--type-string field--label-hidden">blogging is starting again</span> <span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span property="schema:dateCreated" content="2023-04-10T07:44:13+00:00" class="field field--name-created field--type-created field--label-hidden">Mon, 2023-04-10 09:44</span> Mon, 10 Apr 2023 07:44:13 +0000 admin 95 at BIhints moved <span property="schema:name" class="field field--name-title field--type-string field--label-hidden">BIhints moved</span> <span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/14" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span property="schema:dateCreated" content="2019-11-21T14:04:13+00:00" class="field field--name-created field--type-created field--label-hidden">Thu, 2019-11-21 15:04</span> Thu, 21 Nov 2019 14:04:13 +0000 admin 94 at