tag:blogger.com,1999:blog-75077297880532704152024-02-02T23:54:16.189+02:00Somewhere in between... bits and music notes...#define Born_to_code 1Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.comBlogger128125tag:blogger.com,1999:blog-7507729788053270415.post-67631971394982489962024-01-26T17:29:00.005+02:002024-01-26T17:39:05.985+02:00EduXR - The XR Micro Learning Platform<p>Introducing our cutting-edge Augmented Reality (AR) educational application designed to revolutionize the learning experience for students across various courses and classes. This versatile app aligns seamlessly with official school curricula, offering an immersive journey through interactive experiments that bring abstract concepts to life.</p><p><br /></p><p>Key Features:</p><p><b>Multi-Course Compatibility</b>: Our AR application covers a spectrum of subjects, ensuring a comprehensive educational experience across diverse disciplines. From physics to biology, chemistry to mathematics, students can explore and understand each course with captivating augmented reality simulations.</p><p><b>Official Curriculum Integration</b>: Aligned with official school curricula, the app ensures that students are learning in line with educational standards. The content is curated to enhance understanding and complement classroom teachings, providing a supplementary, interactive layer to the traditional learning process.</p><p><b>Multi-Year/Class Support</b>: Tailored to cater to students of various levels, the app spans multiple years and classes. Whether you're a high school freshman or a senior, the AR experience evolves to meet the complexity and depth of the subjects studied, ensuring a continuous and progressive learning journey.</p><p><b>Multilingual Interface</b>: Breaking down language barriers, our application supports multiple languages, making it accessible to a global audience. Students can learn and engage in their preferred language, fostering inclusivity and facilitating a more personalized learning experience.</p><p><b>Cross-Platform Compatibility</b>: Our commitment to accessibility is reflected in the app's compatibility with multiple mobile platforms. Whether you use iOS or Android, our AR application is designed to function seamlessly on your device, bringing the wonders of augmented reality education to your fingertips.</p><p><b>Interactive Assessments</b>: At the conclusion of each course or class, students can assess their understanding through interactive tests within the app. These assessments not only gauge knowledge retention but also provide instant feedback, including a percentage score. This feature empowers students to track their progress and reinforces the concepts learned in a dynamic and engaging manner.</p><p>Embark on an educational journey like never before with our AR application, where learning transcends traditional boundaries, and understanding is achieved through immersive experiences. </p><p><br /></p><p>Welcome to the future of education!</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='637' src='https://www.blogger.com/video.g?token=AD6v5dzzKQWVEJ4oQ36HequDFrKQ3RLdzGJ_fxFxL9WeppiOerHMd2eeNS6tuQtLder8JOihPRRpJJ7dTpiLUTPy1w' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><p><br /></p>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-91122797266240751832023-05-31T22:21:00.012+03:002023-06-01T01:59:34.839+03:00Micro API Design Pattern<p> Hello there,</p><p>From the architectural/design point of view these are the common API design patterns:</p><p></p><ul style="text-align: left;"><li>monolith - all endpoints in one project (or dependencies)</li><li>micro services - separated by domain (and with specific components such as service registry or API gateway).</li></ul><p></p><p>These have their own pros and cons and I would like to propose a hybrid approach - Micro APIs.</p><p>Technically, all micro APIs are hosted in a monolith but are not loaded as a normal dependencies - they are discovered at runtime. This approach is using the plugin-based design but applied to APIs. Basically, one can have all the benefits from the micro-services architectural/design pattern (as the micro APIs/plugins can be developed per domain and with different technologies, as long as the host can handle them) and still be manageable as a monolith (of course, this will not stop the host to be scaled and I think that sometimes a smart load balancer may redirect the traffic to the nodes that are domain specific, hence micro service).</p><p>Each micro API will have it's own API endpoints handlers (e.g. controllers), services and data models (aka DTO, ViewModels, etc.). Using patterns like dependency injection each micro API can use services from the host, if needed (e.g. configuration, logging, etc.).</p><p>A micro API project might look like this:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg_MPH6Qj2YyVhFeAkacxn6ofTxiGVO9OJ1jpn91uaAvTqcJsqaLBUKDIWozbcqERf0lPxV8_ZnG07g-oTGgA6RMrFlHhUtcpbUGjKl2prBp8C8HUx34UCz7Uu6W56BjcNqzipE0_YtvtKJZbPuQk1JoixDj7c8k0w29Poag5WB9GRQIC1AF48CG5mxrg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="194" data-original-width="201" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEg_MPH6Qj2YyVhFeAkacxn6ofTxiGVO9OJ1jpn91uaAvTqcJsqaLBUKDIWozbcqERf0lPxV8_ZnG07g-oTGgA6RMrFlHhUtcpbUGjKl2prBp8C8HUx34UCz7Uu6W56BjcNqzipE0_YtvtKJZbPuQk1JoixDj7c8k0w29Poag5WB9GRQIC1AF48CG5mxrg" width="249" /></a></div><br />An ASP.NET Core/6/7 implementation might look like this:<p></p><p>1/ At Startup.cs the host will try to discover the plugins from some location (this can be changed if needed).</p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #abb2bf;">RegisterPlugins</span>(<span style="color: #abb2bf;">services</span>);
</pre><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #e06c75;">private</span> <span style="color: #e06c75;">void</span> <span style="color: #98c379;">RegisterPlugins</span>(<span style="color: #abb2bf;">IServiceCollection</span> <span style="color: #d19a66;">serviceCollection</span>)
{
<span style="color: #e06c75;">var</span> <span style="color: #abb2bf;">pluginsPath</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">Path</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">Combine</span>(<span style="color: #abb2bf;">AppContext</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">BaseDirectory</span>, <span style="color: #e5c07b;">@".\Plugins"</span>);
<span style="color: #e06c75;">string</span>[] <span style="color: #abb2bf;">pluginPaths</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">Directory</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">GetFiles</span>(<span style="color: #abb2bf;">pluginsPath</span>, <span style="color: #e5c07b;">"*.Plugin.dll"</span>, <span style="color: #abb2bf;">SearchOption</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AllDirectories</span>);
<span style="color: #e06c75;">var</span> <span style="color: #abb2bf;">pluginAssemblies</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">pluginPaths</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">Select</span>(<span style="color: #d19a66;">pluginPath</span> <span style="color: #e06c75;">=></span> <span style="color: #abb2bf;">pluginPath</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">LoadAssembly</span>());
<span style="color: #e06c75;">foreach</span> (<span style="color: #abb2bf;">var</span> <span style="color: #abb2bf;">assembly</span> <span style="color: #e06c75;">in</span> <span style="color: #abb2bf;">pluginAssemblies</span>)
{
<span style="color: #abb2bf;">assembly</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">LoadBaseServices</span>(<span style="color: #abb2bf;">serviceCollection</span>);
<span style="color: #abb2bf;">serviceCollection</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AddAutoMapper</span>(<span style="color: #abb2bf;">assembly</span>);
<span style="color: #abb2bf;">serviceCollection</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AddControllers</span>()
<span style="color: #e06c75;">.</span><span style="color: #abb2bf;">PartManager</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">ApplicationParts</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">Add</span>(<span style="color: #e06c75;">new</span> <span style="color: #abb2bf;">AssemblyPart</span>(<span style="color: #abb2bf;">assembly</span>));
}
<span style="color: #676f7d;">// init plugins</span>
<span style="color: #e06c75;">var</span> <span style="color: #abb2bf;">serviceProvider</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">serviceCollection</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">BuildServiceProvider</span>();
<span style="color: #e06c75;">var</span> <span style="color: #abb2bf;">registrars</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">serviceProvider</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">GetServices</span><<span style="color: #abb2bf;">IServiceRegistrar</span>>();
<span style="color: #e06c75;">foreach</span> (<span style="color: #abb2bf;">var</span> <span style="color: #abb2bf;">registrar</span> <span style="color: #e06c75;">in</span> <span style="color: #abb2bf;">registrars</span>)
{
<span style="color: #abb2bf;">registrar</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">Register</span>(<span style="color: #abb2bf;">serviceCollection</span>);
}
}</pre><p>This will try to load all plugins and add the controllers as an application part.</p><p>2/ In order to use DI, a micro API would have to implement an IServiceRegistrar interface where all the DI services from that micro API will be registered in the services collection.</p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #e06c75;">public</span> <span style="color: #e06c75;">interface</span> <span style="color: #61afef;">IServiceRegistrar</span>
{
<span style="color: #e06c75;">void</span> <span style="color: #98c379;">Register</span>(<span style="color: #abb2bf;">IServiceCollection</span> <span style="color: #d19a66;">services</span>); </pre><p><span style="background-color: #282c34; color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;">}</span></p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #e06c75;">public</span> <span style="color: #e06c75;">sealed</span> <span style="color: #e06c75;">class</span> <span style="color: #61afef;">ServiceRegistrar</span> : <span style="color: #abb2bf;">IServiceRegistrar</span>
{
<span style="color: #e06c75;">public</span> <span style="color: #e06c75;">void</span> <span style="color: #98c379;">Register</span>(<span style="color: #abb2bf;">IServiceCollection</span> <span style="color: #d19a66;">services</span>)
{
<span style="color: #abb2bf;">services</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AddScoped</span><<span style="color: #abb2bf;">IMaptService</span>, <span style="color: #abb2bf;">MaptService</span>>();
} </pre><p><span style="background-color: #282c34; color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"> }</span> </p><p>3/ The micro API controllers will be the normal ASP.NET Core/6/7 controllers - no changes here.</p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;">[<span style="color: #abb2bf;">ApiController</span>]
[<span style="color: #abb2bf;">Route</span>(<span style="color: #e5c07b;">"api/[controller]"</span>)]
[<span style="color: #abb2bf;">Authorize</span>]
<span style="color: #e06c75;">public</span> <span style="color: #e06c75;">class</span> <span style="color: #61afef;">MaptController</span> : <span style="color: #abb2bf;">ControllerBase</span>
{
<span style="color: #e06c75;">readonly</span> <span style="color: #abb2bf;">IMapper</span> <span style="color: #abb2bf;">_mapper</span>;
<span style="color: #e06c75;">readonly</span> <span style="color: #abb2bf;">IMaptService</span> <span style="color: #abb2bf;">_maptService</span>;
<span style="color: #e06c75;">public</span> <span style="color: #61afef;">MaptController</span>(<span style="color: #abb2bf;">IMapper</span> <span style="color: #d19a66;">mapper</span>, <span style="color: #abb2bf;">IMaptService</span> mapt<span style="color: #d19a66;">Service</span>)
{
<span style="color: #abb2bf;">_mapper</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">mapper</span>;
<span style="color: #abb2bf;">_maptService</span> <span style="color: #e06c75;">=</span> mapt<span style="color: #abb2bf;">Service</span>;
}
[<span style="color: #abb2bf;">HttpGet</span>]
<span style="color: #e06c75;">public</span> <span style="color: #abb2bf;">IActionResult</span> <span style="color: #98c379;">Get</span>()
{
<span style="color: #e06c75;">return</span> <span style="color: #abb2bf;">StatusCode</span>(<span style="color: #c678dd;">200</span>, <span style="color: #e06c75;">new</span> <span style="color: #abb2bf;">MaptViewModel</span> { <span style="color: #abb2bf;">Result</span> <span style="color: #e06c75;">=</span> <span style="color: #e5c07b;">"OK"</span> });
}
}</pre><p>4/ If you now run the WebAPI host and enable Swagger (e.g. Swashbuckle.AspNetCore) you will notice that even if the micro API project is not statically linked/referred by the WebAPI host, the micro APIs endpoints will appear in the Swagger documentation and will be available to be consumed.</p><p>If an existing micro API is removed then the impact on the host is minimal or non-existing (the host is auto-cleaning). Same for adding a micro API, the host will load it in it's memory context and expose any endpoints of the micro API.</p><p>Hope this will help you in designing new ways of consuming APIs!</p><p>Happy Coding!</p><p><br /></p><p>The helper functions (which can be part of a common project/assembly):</p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #e06c75;">public</span> <span style="color: #e06c75;">class</span> <span style="color: #61afef;">PluginLoadContext</span> : <span style="color: #abb2bf;">AssemblyLoadContext</span>
{
<span style="color: #e06c75;">private</span> <span style="color: #abb2bf;">AssemblyDependencyResolver</span> <span style="color: #abb2bf;">_resolver</span>;
<span style="color: #e06c75;">public</span> <span style="color: #61afef;">PluginLoadContext</span>(<span style="color: #e06c75;">string</span> <span style="color: #d19a66;">pluginPath</span>)
{
<span style="color: #abb2bf;">_resolver</span> <span style="color: #e06c75;">=</span> <span style="color: #e06c75;">new</span> <span style="color: #abb2bf;">AssemblyDependencyResolver</span>(<span style="color: #abb2bf;">pluginPath</span>);
}
<span style="color: #e06c75;">protected</span> <span style="color: #e06c75;">override</span> <span style="color: #abb2bf;">Assembly</span> <span style="color: #98c379;">Load</span>(<span style="color: #abb2bf;">AssemblyName</span> <span style="color: #d19a66;">assemblyName</span>)
{
<span style="color: #e06c75;">string</span> <span style="color: #abb2bf;">assemblyPath</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">_resolver</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">ResolveAssemblyToPath</span>(<span style="color: #abb2bf;">assemblyName</span>);
<span style="color: #e06c75;">if</span> (<span style="color: #abb2bf;">assemblyPath</span> <span style="color: #e06c75;">!=</span> <span style="color: #e06c75;">null</span>)
{
<span style="color: #e06c75;">return</span> <span style="color: #abb2bf;">LoadFromAssemblyPath</span>(<span style="color: #abb2bf;">assemblyPath</span>);
}
<span style="color: #e06c75;">return</span> <span style="color: #e06c75;">null</span>;
}
<span style="color: #e06c75;">protected</span> <span style="color: #e06c75;">override</span> <span style="color: #abb2bf;">IntPtr</span> <span style="color: #98c379;">LoadUnmanagedDll</span>(<span style="color: #e06c75;">string</span> <span style="color: #d19a66;">unmanagedDllName</span>)
{
<span style="color: #e06c75;">string</span> <span style="color: #abb2bf;">libraryPath</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">_resolver</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">ResolveUnmanagedDllToPath</span>(<span style="color: #abb2bf;">unmanagedDllName</span>);
<span style="color: #e06c75;">if</span> (<span style="color: #abb2bf;">libraryPath</span> <span style="color: #e06c75;">!=</span> <span style="color: #e06c75;">null</span>)
{
<span style="color: #e06c75;">return</span> <span style="color: #abb2bf;">LoadUnmanagedDllFromPath</span>(<span style="color: #abb2bf;">libraryPath</span>);
}
<span style="color: #e06c75;">return</span> <span style="color: #abb2bf;">IntPtr</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">Zero</span>;
}
}</pre><p><br /></p><pre style="background: rgb(40, 44, 52); color: #bbbbbb; font-family: "Cascadia Mono"; font-size: 13px;"><span style="color: #e06c75;">public</span> <span style="color: #e06c75;">static</span> <span style="color: #e06c75;">class</span> <span style="color: #61afef;">PluginHelpers</span>
{
<span style="color: #e06c75;">public</span> <span style="color: #e06c75;">static</span> <span style="color: #abb2bf;">Assembly</span> <span style="color: #98c379;">LoadAssembly</span>(<span style="color: #e06c75;">this</span> <span style="color: #e06c75;">string</span> <span style="color: #d19a66;">path</span>)
{
<span style="color: #e06c75;">string</span> <span style="color: #abb2bf;">pluginLocation</span> <span style="color: #e06c75;">=</span> <span style="color: #abb2bf;">Path</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">GetFullPath</span>(<span style="color: #abb2bf;">path</span>);
<span style="color: #e06c75;">return</span> <span style="color: #e06c75;">new</span> <span style="color: #abb2bf;">PluginLoadContext</span>(<span style="color: #abb2bf;">pluginLocation</span>)<span style="color: #e06c75;">.</span><span style="color: #abb2bf;">LoadFromAssemblyName</span>(<span style="color: #abb2bf;">AssemblyName</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">GetAssemblyName</span>(<span style="color: #abb2bf;">pluginLocation</span>));
}
<span style="color: #e06c75;">public</span> <span style="color: #e06c75;">static</span> <span style="color: #e06c75;">void</span> <span style="color: #98c379;">LoadBaseServices</span>(<span style="color: #e06c75;">this</span> <span style="color: #abb2bf;">Assembly</span> <span style="color: #d19a66;">assembly</span>, <span style="color: #abb2bf;">IServiceCollection</span> <span style="color: #d19a66;">services</span>)
{
<span style="color: #e06c75;">foreach</span> (<span style="color: #abb2bf;">Type</span> <span style="color: #abb2bf;">type</span> <span style="color: #e06c75;">in</span> <span style="color: #abb2bf;">assembly</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">GetTypes</span>())
{
<span style="color: #e06c75;">if</span> (<span style="color: #e06c75;">typeof</span>(<span style="color: #abb2bf;">ICommand</span>)<span style="color: #e06c75;">.</span><span style="color: #abb2bf;">IsAssignableFrom</span>(<span style="color: #abb2bf;">type</span>))
{
<span style="color: #abb2bf;">services</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AddSingleton</span>(<span style="color: #e06c75;">typeof</span>(<span style="color: #abb2bf;">ICommand</span>), <span style="color: #abb2bf;">type</span>);
}
<span style="color: #e06c75;">if</span> (<span style="color: #e06c75;">typeof</span>(<span style="color: #abb2bf;">IServiceRegistrar</span>)<span style="color: #e06c75;">.</span><span style="color: #abb2bf;">IsAssignableFrom</span>(<span style="color: #abb2bf;">type</span>))
{
<span style="color: #abb2bf;">services</span><span style="color: #e06c75;">.</span><span style="color: #abb2bf;">AddSingleton</span>(<span style="color: #e06c75;">typeof</span>(<span style="color: #abb2bf;">IServiceRegistrar</span>), <span style="color: #abb2bf;">type</span>);
}
}
} }<span style="background-color: transparent;"> </span></pre>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-45658791315130377682023-01-09T12:16:00.004+02:002023-01-09T12:16:49.437+02:00XCape Privacy Policy<p><span style="background-color: white;">XCape</span><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"> is not collecting any user data.</span></p><div><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></span></div><div class="post-body entry-content" id="post-body-1458165412211148328" itemprop="description articleBody" style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 1.4; position: relative; width: 578px;"><div style="clear: both;"></div></div><div class="post-footer" style="background-color: white; color: #999999; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.5px; line-height: 1.6; margin: 0.5em 0px 0px;"></div>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-14581654122111483282023-01-04T16:26:00.001+02:002023-01-04T16:26:05.008+02:00Join'Em Privacy Policy<p>Join'Em is not collecting any user data.</p>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-79660906506915811622022-04-06T11:30:00.008+03:002022-04-06T17:29:23.217+03:00SteamVR Input in MRTK 2.6 and later<p> Hello,</p><p>I've seen a lot of interest on this topic and I would like to put the info in one place.</p><p style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small; text-align: left;">First, you need to download <a data-saferedirecturl="https://www.google.com/url?q=https://assetstore.unity.com/packages/p/steamvr-plugin-32647&source=gmail&ust=1649315918295000&usg=AOvVaw1SEU9z7vf2hQGiZoonhSNO" href="https://assetstore.unity.com/packages/p/steamvr-plugin-32647" style="color: #1155cc;" target="_blank">SteamVR</a><a data-saferedirecturl="https://www.google.com/url?q=https://assetstore.unity.com/packages/p/steamvr-plugin-32647&source=gmail&ust=1649315918295000&usg=AOvVaw1SEU9z7vf2hQGiZoonhSNO" href="https://assetstore.unity.com/packages/p/steamvr-plugin-32647" style="color: #1155cc;" target="_blank"> asset</a> and use my implementation of SteamVR XRSDK Device Manager and controllers from <a data-saferedirecturl="https://www.google.com/url?q=https://github.com/microsoft/MixedRealityToolkit-Unity/issues/8835%23issuecomment-932080590&source=gmail&ust=1649315918295000&usg=AOvVaw3au_uhN-duaZatFLPipWRf" href="https://github.com/microsoft/MixedRealityToolkit-Unity/issues/8835#issuecomment-932080590" style="color: #1155cc;" target="_blank">here</a>.</p><p style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small; text-align: left;">There are two parts: one is in SteamVR and one is in MRTK. <br />If you already know the actions you need for SteamVR, then you need to generate the SteamVR_Input action classes (these are used by the custom implementation of the SteamVR layer in MRTK) by going to Unity Editor menu, Windows -> SteamVR Input and hit Generate. If you need to change the bindings, you will need to create the bindings in the bindings UI.</p><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi5vWOLkmNzzD3kGYoLaUu1R9GnCG_vnhAfHCScymKcEjmFVz1CmTT97Lqq52WaUNZLSmFCwg7rj6GzHP-pYSba-6DmTpTkYogYx_xnNVSi0gi51IND2qVvq3gXy_8AFWioqc3w-EyZpUN729FWfZsqPeEgdABMjlh9aUqx2Q9csv3aQCQsKsAYIalm5g" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="648" data-original-width="633" height="413" src="https://blogger.googleusercontent.com/img/a/AVvXsEi5vWOLkmNzzD3kGYoLaUu1R9GnCG_vnhAfHCScymKcEjmFVz1CmTT97Lqq52WaUNZLSmFCwg7rj6GzHP-pYSba-6DmTpTkYogYx_xnNVSi0gi51IND2qVvq3gXy_8AFWioqc3w-EyZpUN729FWfZsqPeEgdABMjlh9aUqx2Q9csv3aQCQsKsAYIalm5g=w403-h413" width="403" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Then, you need to add the SteamVR XRSDK manager to data providers and use the Player prefab from SteamVR - this will give you the avatar hands (ofc, you can create a separate one with whatever hands you want but you will need to animate that).</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgw6TpMAHv--aWgtnxdMZyCayN38XqjVLp-tyyE1KFFxihrmHKtn4wlNjOe4sM-LRdUrrs2DRQhvVrwG7KQVM2730wmCZ1tQO5GqCqVOVnaO6xf6UPCgP-6prbYtTdKnE3Lf38EsdG9EQwE56gO9kk3fX6G0sDtxqHeX2nO4sqVUG0tgl9W14aRxhcF-g" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="329" data-original-width="327" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgw6TpMAHv--aWgtnxdMZyCayN38XqjVLp-tyyE1KFFxihrmHKtn4wlNjOe4sM-LRdUrrs2DRQhvVrwG7KQVM2730wmCZ1tQO5GqCqVOVnaO6xf6UPCgP-6prbYtTdKnE3Lf38EsdG9EQwE56gO9kk3fX6G0sDtxqHeX2nO4sqVUG0tgl9W14aRxhcF-g" width="239" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgxgV8Tiq7NbW5VULutZzkub38-x2HyyoWwpSabfx7GmKF1LMMWdmFVph6xLSb6dIrcOL12E2bItcgrQgcH-WePPv5O-nUhDIw0RLxkGZEKAvUd3RdQcIxz4mEDBkEp-7d1d8n7gPDT2eXp_1ckZpcyT25g7tmoyVKqHwSIh2F-_JEf8TLraidbx9T5kQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="18" data-original-width="383" height="15" src="https://blogger.googleusercontent.com/img/a/AVvXsEgxgV8Tiq7NbW5VULutZzkub38-x2HyyoWwpSabfx7GmKF1LMMWdmFVph6xLSb6dIrcOL12E2bItcgrQgcH-WePPv5O-nUhDIw0RLxkGZEKAvUd3RdQcIxz4mEDBkEp-7d1d8n7gPDT2eXp_1ckZpcyT25g7tmoyVKqHwSIh2F-_JEf8TLraidbx9T5kQ" width="320" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Then you need to add SteamVRXRSDKControllers in the Controller Definitions area.</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj-6-OYA8MbbH3IKkakwH32nhkQTXz0-ifbU8apZDHDVVUH-x3zMEO2uMFAu6owyRP5RNaxZ9WoKljWz2hcYjxa5D8uHV12Z4LyhPKXTIffIkG4KLhPk_cu3GPNRTqQX_1RGKDoP2HAdSYGeSTIIQEKPxvGMMyL3tWDRYh978w9GpapSwvxKe-wWcf-ew" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="323" data-original-width="313" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEj-6-OYA8MbbH3IKkakwH32nhkQTXz0-ifbU8apZDHDVVUH-x3zMEO2uMFAu6owyRP5RNaxZ9WoKljWz2hcYjxa5D8uHV12Z4LyhPKXTIffIkG4KLhPk_cu3GPNRTqQX_1RGKDoP2HAdSYGeSTIIQEKPxvGMMyL3tWDRYh978w9GpapSwvxKe-wWcf-ew" width="233" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"> </div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Then you need to alter input mappings for the Generic OpenVR Controller Definitions (if you plan to add specific actions - in my case I used Touchpad click as Select):</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgydHmQy-4xulL8wvPtS0kNRF_frZo0xTUm04jGazaTzMiCYgvqcHv78jpJdpTELA8avldXJzoQczu4wZICu055GOBBX3eFTETUqHyLuKXGq6g5AMnoqfhrYohkRrhw3c0hnxC9XezzM9DI8E1G2Avo2Z-iCdikNQ_aanNulP_N8adm_ED_71i50enlmA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="142" data-original-width="317" height="143" src="https://blogger.googleusercontent.com/img/a/AVvXsEgydHmQy-4xulL8wvPtS0kNRF_frZo0xTUm04jGazaTzMiCYgvqcHv78jpJdpTELA8avldXJzoQczu4wZICu055GOBBX3eFTETUqHyLuKXGq6g5AMnoqfhrYohkRrhw3c0hnxC9XezzM9DI8E1G2Avo2Z-iCdikNQ_aanNulP_N8adm_ED_71i50enlmA" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjZxATVWV5CsF87TtDZVCzLKzSMNs5kSarHxmUcpgkLM27NzxzlZZd_42_1KHrkGo4MqRKM-C7CXSXxENuysHCCGpWPXnhxbLJQ2MYonIg5Su1Q5rWsEsUzmc6kqTM071f5URwSABSDSEt17ZxErKTPpLZEIwdpo9ccrDdsFCGBTPsiY7YZM4Kh4g7VTA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="282" data-original-width="273" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjZxATVWV5CsF87TtDZVCzLKzSMNs5kSarHxmUcpgkLM27NzxzlZZd_42_1KHrkGo4MqRKM-C7CXSXxENuysHCCGpWPXnhxbLJQ2MYonIg5Su1Q5rWsEsUzmc6kqTM071f5URwSABSDSEt17ZxErKTPpLZEIwdpo9ccrDdsFCGBTPsiY7YZM4Kh4g7VTA" width="232" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Then you need to Update mappings by going to Unity Editor and in the menu: Mixed Reality Toolkit -> Update -> Controller mappings profiles. This will update some assets from MRTK.</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Then you need to activate the SteamVR for MRTK by adding the preprocessor directive STEAMVR_INTEGRATION in Unity Editor/Player/Other.</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjn0CS62hW4XjgUCOqsiS871zYpJC8kCpEOmwpHOfbkQ8pws6q_3Wv-xO3SV8hQjdzt0CehMaIG8cn_poz8SQrj-7uO6iDfitfVrtcw43EF78Ro3UUAOop_AbPd_NtE9c1Xp77d4jYcTbiAsTSX3q2yzJlludrC5UYh7SY_YqVhEPBl0EeNjma8k6EIMA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="138" data-original-width="280" height="158" src="https://blogger.googleusercontent.com/img/a/AVvXsEjn0CS62hW4XjgUCOqsiS871zYpJC8kCpEOmwpHOfbkQ8pws6q_3Wv-xO3SV8hQjdzt0CehMaIG8cn_poz8SQrj-7uO6iDfitfVrtcw43EF78Ro3UUAOop_AbPd_NtE9c1Xp77d4jYcTbiAsTSX3q2yzJlludrC5UYh7SY_YqVhEPBl0EeNjma8k6EIMA" width="320" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Finally, you need to activate the OpenVR Loader in XR Management.</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjmzw70TN7MqiZLwMD3qBhEW0UMQLqogTPv3cVUTUNWXNm16iIeGy3D8xR-gYdNfmPYM_62JkL6SPTK4AnWrYKp4AJ1pCkvgAyoXCsi-ciZFf9jr79TYzjCEAzSZnIPdoQsgyNl8Zv4KLaitBqNSqd3QY9obwLRwLFWidn-qwUSaZTfjoagcgC8mgievQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="304" data-original-width="279" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjmzw70TN7MqiZLwMD3qBhEW0UMQLqogTPv3cVUTUNWXNm16iIeGy3D8xR-gYdNfmPYM_62JkL6SPTK4AnWrYKp4AJ1pCkvgAyoXCsi-ciZFf9jr79TYzjCEAzSZnIPdoQsgyNl8Zv4KLaitBqNSqd3QY9obwLRwLFWidn-qwUSaZTfjoagcgC8mgievQ" width="220" /></a></div><br /><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">If you hit Play in Editor, the app will start and you should see the MRTK default gizmo controllers synced with the SteamVR avatar hands.</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">That's about it!</div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"><br /></div><div style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">Have fun!</div>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-87838103827064943662021-11-30T00:01:00.000+02:002021-11-30T00:01:00.485+02:00Virus FightAR Privacy Policy<p> Virus FightAR is not collecting any user data.</p>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-14544831719877563842019-07-23T21:45:00.001+03:002019-07-23T21:47:08.799+03:00ReplayVR - Support pageHey there,<br />
<br />
This is the page for ReplayVR asset. Checkout the ReplayVR-Demo project on Github: <a href="https://github.com/eusebiu/ReplayVR-Demo">https://github.com/eusebiu/ReplayVR-Demo</a><br />
<br />
Please add your comments or requests in the comments section or on the github issues page.<br />
<br />
Thank you!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-68277236046745324122017-01-03T18:47:00.001+02:002017-01-03T18:47:50.447+02:00Upgrading Node.js and Npm on Raspberry PiHappy New Year!<br />
<br />
This holiday I bought myself a Raspberry Pi (with a camera module) as I wanted to play with Node-RED on a real Internet-Of-Things device (the pi has Raspbian Jesse).<br />
<br />
The default version of NodeJs on NOOBs is 0.12.x and some of the flows nodes do not work on this (e.g. node-red-contrib-python-function) since they might use ECMA6 syntax (e.g. lambda expression).<br />
So, I had to upgrade the Node.js version to a newer version like 6.x.<br />
<br />
After remo nodered, nodejs and npm I installed them back with the correct version (using sudo apt-get install nodejs npm nodered). Unfortunately, installing them this way do not install the node-red-start/stop commands. After a quick search online I found these commands:<br />
<br />
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service<br />
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start<br />
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop<br />
sudo chmod +x /usr/bin/node-red-st*<br />
sudo systemctl daemon-reload<br />
<br />
sudo systemctl enable nodered.service<br />
<br />
These commands will install the node-red-start/stop commands and make it start when the device boots!<br />
<br />
Pretty nice!<br />
<br />
Happy coding!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-83811739547691130852016-05-23T19:56:00.001+03:002016-05-23T20:13:10.440+03:00Web Inspector CAB for Rho WM6.5<br />
Download from here:<br />
https://drive.google.com/folderview?id=0B_5lxJaDe7iiQVVHRzNpVDNMV2c&usp=sharing<br />
<br />
<br />
Guide here:<br />
http://ebzebra.github.io/docs/1.3/index.html#guide-debuggingjs?UsingRemoteDebugInspector<br />
<br />
VS2008:<br />
http://stackoverflow.com/questions/24510831/create-a-windows-mobile-6-5-3-project-in-visual-studio-2008<br />
https://support.microsoft.com/en-us/kb/931937<br />
<br />Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-12660438040953503052015-06-01T16:45:00.001+03:002015-06-01T16:45:33.091+03:00IBM MobileFirst Platform Foundation (Worklight) - nodename nor servname provided or not known (some ip)Hey there,<br />
<br />
Due to Mac@IBM initiative, I've moved my primary workstation to 2014 MacBook Pro (15') with an OSX Yosemite 10.10.3.<br />
<br />
Being a Mobile Architect in IBM Mobile Center of Competency, I also do a lot of work with IBM MobileFirst Platform Foundation (aka Worklight).<br />
In one of my current projects (developed with IBM MFPF) I got the error in the title when building an iPad environment.<br />
Looking in /etc/hosts and /private/etc/hosts the mappings were correct. The solution was to change the host name using the scutil command:<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; line-height: inherit; margin: 0px; max-width: initial; overflow: initial; padding: 0px; word-break: normal; word-wrap: normal;">scutil --set HostName "localhost" </code></pre>
<br />
Happy IMF coding! :)<br />
<br />
<br />
<br />Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-85824444835408019042014-12-12T21:53:00.002+02:002014-12-12T21:53:36.125+02:00Intel® RealSense™ AppChallenge - Early submissionMy early demo submission can be viewed here: <a href="https://www.youtube.com/watch?v=2tFjSIIM6BM">https://www.youtube.com/watch?v=2tFjSIIM6BM</a><br />
For the code see the description of the video.Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-43575458038218472682014-11-28T22:34:00.001+02:002014-11-28T22:40:38.662+02:00Intel® RealSense™ AppChallenge - Phase 2 - Demo 1Hello,<br />
<br />
This week I got the Intel® RealSense™ Camera and I've started creating the Visual Studio extension for the Intel® RealSense™ AppChallange.<br />
<br />
First, I've installed the Intel® RealSense™ SDK which has some very nice samples for both C++ and C#.<br />
Then I've installed Visual Studio 2013 Community edition (Thank you Microsoft!) and then VS 2013 SDK.<br />
<br />
All tools are now in place!<br />
<br />
The Natural Interaction Visual Studio (2013) extension is designed to be initialized when a solution is loaded - here the devices are discovered and entities initialized (e.g. SpeechRecognition). Once this happens, the user can go to the menu TOOLS and then Options... to view the Natural Interaction extension settings. In my case, I used a small vocabulary file for the "Start debugging" and "Stop debugging" sentences.<br />
<br />
After some hours of coding, I've come to the following (promising) result: <a href="http://screencast.com/t/uvvmbfBHXkrQ">http://screencast.com/t/uvvmbfBHXkrQ</a>.<br />
<br />
This is Demo 1 - more commands (like Step into, step out) will follow. Also, the gestures are to be expected in the near future... but that is for another post!<br />
<br />
Have fun!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-591555176945997412014-11-24T00:20:00.000+02:002014-11-28T22:40:04.640+02:00Intel® RealSense™ AppChallenge - Phase 2Hello,<br />
<br />
Last week I was nominated as a Phase 2 finalist for <a href="https://realsenseappchallenge.intel.com/landing/#overview" target="_blank">Intel® RealSense™ AppChallenge</a> to develop a Natural Interaction Visual Studio extension.<br />
This week I will get the Dev kit that contains the Intel® RealSense™ 3D camera and I will start developing the VS extension.<br />
<br />
I'll post here how the project gos!<br />
<br />
Stay tuned!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-40788728567127674202014-10-19T21:35:00.001+03:002014-10-28T14:37:08.063+02:00OCR Archive support pagePlease leave a comment if you find any issues with the app (for Android or iOS).<br />
Google Play: <a href="https://play.google.com/store/apps/details?id=org.marcueusebiu.mobile.PersonalDigitalArchive">https://play.google.com/store/apps/details?id=org.marcueusebiu.mobile.PersonalDigitalArchive</a><br />
Apple AppStore: <a href="https://itunes.apple.com/us/app/ocr-archive/id925446034?ls=1&mt=8">https://itunes.apple.com/us/app/ocr-archive/id925446034?ls=1&mt=8</a>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-18644966199770404872014-09-24T12:03:00.001+03:002014-09-24T12:04:07.990+03:00Personal Digital Archive with OCRHey there,<br />
<br />
Check out my new start-up: <a href="https://www.indiegogo.com/projects/personal-digital-archive-with-ocr">https://www.indiegogo.com/projects/personal-digital-archive-with-ocr</a>Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-55269366859697658972013-10-15T23:09:00.002+03:002013-10-15T23:09:18.965+03:00AccessViolationException: Attempted to read or write protected memory - COM librariesHello,<br />
<br />
In one of my project I have a .NET library that is registered to COM in order to be used from a C++ library.<br />
Due to some error, I had to change the interface of an type; I added a new property ID and I set the type of this ID property to be <b><span style="font-family: Courier New, Courier, monospace;">int</span></b>.<br />
Once <b>testing was done</b>, I deployed the library in production and I started to see the following error:<br />
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. T<br />
his is often an indication that other memory is corrupt.<br />
at System.String.wstrcpy(Char* dmem, Char* smem, Int32 charCount)<br />
at System.String.CtorCharPtrStartLength(Char* ptr, Int32 startIndex, Int32 length)<br />
at System.StubHelpers.BSTRMarshaler.ConvertToManaged(IntPtr bstr)<br />
...<br />
<br />
The source of this error was pretty obvious (since the modification I stated earlier was the only one).<br />
I remembered that the type in which I've added the new property ID is mapped to an Entity Framework type (using AutoMapper) and in this entity the ID was of type <b><span style="font-family: Courier New, Courier, monospace;">decimal</span></b>. After changing the type from <b><span style="font-family: Courier New, Courier, monospace;">int</span> </b>to <b><span style="font-family: Courier New, Courier, monospace;">decimal</span></b>, the AccessViolationException was gone...<br />
<br />
:|<br />
<br />Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-3795747010925485132013-10-13T20:32:00.000+03:002013-10-13T20:32:12.096+03:00Programming languages guide (on Apple AppStore)My second app was approved on Apple AppStore.<br />
You can find it <a href="https://itunes.apple.com/us/app/programming-languages-guide/id715822184?ls=1&mt=8" target="_blank">here</a>.<br />
<br />
For support and questions, please comment here!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-69162764252345223372013-09-13T09:15:00.000+03:002013-09-13T09:17:42.141+03:00Technical Dictionary En-Ro App (on Apple AppStore)Hello,<br />
<br />
One of my apps was just approved and you can find it <a href="https://itunes.apple.com/us/app/technical-dictionary-en-ro/id698983750?ls=1&mt=8" target="_blank">here</a>.<br />
<br />
For any questions or issues, please comment here!<br />
<br />
Thanks!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-37780865021452828852013-09-03T13:11:00.000+03:002013-09-04T12:54:17.391+03:00Create/distribute iOS apps (Cordova/PhoneGap)Hello,<br />
<br />
A while ago I've started creating some mobile apps. Since native development (Java/Objective-C) can take some time, I decided to learn an HTML5 mobile framework. One of the most popular (and free/OSS) frameworks is Apache Cordova. You can learn a lot about Cordova on the web...<br />
<br />
Since I've wanted to publish some apps, I've also had to became an Apple Developer, buying an Apple Developer ID/Subscription for iOS apps. After that I was able to connect to Member Center and iTunes Connect to configure my account.<br />
<br />
Back to the technical part... Once I finished testing the app on the simulators, I had to create an archive of distribution. The first problem I encountered was <b>CopyPNG </b>error. Since I've created the images on Windows, the build process was unable to copy the png images. In order to fix this I had to open the png images in the Preview app and Export them to png and override the images.<br />
After all images errors were fixed, I got another error during linking because <b>libCordova</b>.a was not found (this is actually a bug in the PhoneGap project template). The solution here was to properly set the path to libCordova.a:<br />
- Go to project settings and Build Tab. Search for "Other Linker Flags"<br />
- Double click on the linker flags for Release and Change ${TARGET_BUILD_DIR}/libCordova.a to ${BUILT_PRODUCTS_DIR}/libCordova.a.<br />
Do a clean... build... and an Archive.<br />
<br />
Now I am able to test the app on the device and publish it!<br />
<br />
Happy coding!<br />
<br />
P.S. I also had some problems when I've entered my banking account information... In Romania it's enough to have only the IBAN + name but iTunesConnect wanted the bank account number (which I thought it's the same as the IBAN). After some trials and errors (and a lot of google searching) I came with nothing - the iTunes Connect kept saying that the bank account number is 16 characters long and it's verified against the IBAN; I tried various configurations and none worked... Around 2 AM I decided to go to sleep and go to the bank next day and ask them about my bank account number. But in my way to the bed, I thought that if I remove the first 8 characters (which identifies the country and the bank) I'd get something that something that must identify me. The next day I tried my last idea and it worked. So it looks like the<b> bank account number are the last 16 characters in the IBAN</b>.(at least this works in Romania)Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-90642505996143581022013-03-21T16:09:00.001+02:002013-03-21T16:09:14.125+02:00Freeze/persist ASP.NET GridView header (with images)Hello,<br />
<br />
From time to time we all get a nasty task like 'freeze the grid header and if it is possible do it for most browsers'.<br />
In my case the grid was and ASP.NET WebForms GridView. There are many solutions online (jQuery plugins of some CSS stuff) regarding this but in my case none of those worked by default. What was different in my case was the header; the header cells were some images generated by some aspx file.<br />
The default behavior of the solutions I found was that the header was not in sync with the text cells. This happens because the images were not loaded when the table element (the gridview) was generated.<br />
These are the steps that worked for me:<br />
1. Set the GridView to have thead as header and tbody as body. In RowDataBound set the GridView.HeaderRow.TableSection = TableRowSection.TableHeader;<br />
2. Use the idea from here: http://css-tricks.com/snippets/jquery/persistant-headers-on-tables/<br />
3. Modify a little bit the code to wait for loading images and then modify the width of the th elements:<br />
<br />
window.onload = function () {<br />
$("table.tableWithFloatingHeader").each(function () {<br />
$(this).wrap("<div class="divTableWithFloatingHeader" style="position: relative;">
</div>
");<br />
$("tr:first", this).before($("tr:first", this).clone());<br />
clonedHeaderRow = $("tr:first", this);<br />
clonedHeaderRow.addClass("tableFloatingHeader");<br />
clonedHeaderRow.css("position", "absolute");<br />
clonedHeaderRow.css("top", "0px");<br />
clonedHeaderRow.css("left", "0px");<br />
clonedHeaderRow.css("visibility", "hidden");<br />
<br />
var row_ths = $("tr:nth-child(2)", this).children("th");<br />
var crow_ths = $("tr:nth-child(1)", this).children("th"); ;<br />
<br />
for (var i = 0; i < row_ths.size(); ++i) {<br />
crow_ths.eq(i).width(row_ths.eq(i).width() + 2);<br />
}<br />
});<br />
<br />
That's about it!<br />
<br />
<br />Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-14454660540078328982013-02-15T19:33:00.002+02:002013-02-15T19:33:47.228+02:00ADO.NET EF duplicates/overrides data (Oracle)Hello,<br />
<br />
In my current project we are using ADO.NET Entity Framework 4 (Oracle implementation).<br />
Today, one of my users noticed that in some data grid the rows were duplicated (that was in the UI).<br />
<br />
I found out the LINQ query that got the data from the DB and there's nothing wrong with it (at a glance). Running the equivalent (not the one the EF generates) SQL query, brought back correct data. Debugging on the server revealed that the data was indeed duplicated (actually, it was overridden - the second row was the same as the first). This gave me the idea to look inside the model. I looked inside model's PKs of the generated and it looked like there were wrongly generated - 6 columns were PKs.<br />
<br />
The solution was to put only one PK (fortunately I had such a column) and fix some null columns errors.<br />
If you don't have one, you can generate one - see previous post!<br />
<br />
Now the data is the same as the SQL query returned.<br />
<br />
Happy day...! :)<br />
<br />Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-5658735295250034962013-01-17T15:06:00.001+02:002013-01-17T15:06:17.311+02:00HRESULT: 0x80010105 (RPC_E_SERVERFAULT)Hello,<br />
<br />
My current project is using ASP.NET Webforms and we are using a COM component for some simulations.<br />
During some UI integration tests, we got the error from the title: HRESULT: 0x80010105 (RPC_E_SERVERFAULT) during a call to the COM component.<br />
Obviously, I tried reproducing the error on my development machine but the error was nowhere to be found - everything worked!<br />
After a quick search on Google, I've encountered this article (<a href="http://msdn.microsoft.com/en-us/magazine/cc163544.aspx">http://msdn.microsoft.com/en-us/magazine/cc163544.aspx</a>) where the solution is presented: set the AspCompat="true" in the @Page directive of the ASP.NET page.<br />
Once I've done that, the error dissapeared!<br />
<br />
Hope it helps some of you... :)<br />
<br />
Happy coding!Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-32756814647412862092012-08-28T17:52:00.002+03:002012-08-28T17:52:24.421+03:00Oracle ADO.NET EF with transactions<br />
ModelContext.Connection.Open();<br />
using (var tx = ModelContext.Connection.BeginTransaction())<br />
{<br />
try<br />
{<br />
// do stuff...<br />
tx.Commit();<br />
return true;<br />
}<br />
catch<br />
{<br />
tx.Rollback();<br />
throw;<br />
}<br />
finally<br />
{<br />
if (ModelContext.Connection != null)<br />
ModelContext.Connection.Close();<br />
}<br />
}<br />
Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-70659963775409955182012-08-17T12:25:00.000+03:002012-08-21T10:32:32.558+03:00How to model a thought/idea (in AI context)?That is the (ultimate) question for AI...<br />
<br />
Derived question: How can we model the thought that gave birth to that (or any) question?Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0tag:blogger.com,1999:blog-7507729788053270415.post-17842692683263669362012-08-06T16:45:00.003+03:002012-08-06T16:46:11.225+03:00XBox Live funny error<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSG0bM7mccGVdtgh8eiG6GyI9b7VS7vspkyu3ahxnewIGa8Rq0KfJBizqbXQBreW1YbrlE0JZYRGewQHJ4TctPNVn4QDvfLcYvQiWVGM9hivBZ8GSblsrDLovjHz18gwu-ktqaVe2baHOZ/s1600/XBoxError.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSG0bM7mccGVdtgh8eiG6GyI9b7VS7vspkyu3ahxnewIGa8Rq0KfJBizqbXQBreW1YbrlE0JZYRGewQHJ4TctPNVn4QDvfLcYvQiWVGM9hivBZ8GSblsrDLovjHz18gwu-ktqaVe2baHOZ/s1600/XBoxError.PNG" /></a></div>
So... where's my prize? :)Eusebiu Marcuhttp://www.blogger.com/profile/01950274837800720441noreply@blogger.com0