<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Inspira Lab</title>
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://lab.inspira.io/"/>
  <updated>2016-04-03T12:07:56.000Z</updated>
  <id>https://lab.inspira.io/</id>
  
  <author>
    <name>Dominique Da Silva</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  
  <entry>
    <title><![CDATA[Use Marked 2 preprocessor to rewrite images links in markdown document]]></title>

    <link href="https://lab.inspira.io/2016/use-marked2-preprocessor-to-rewrite-images-links-in-markdown-document.html"/>
    <id>https://lab.inspira.io/2016/use-marked2-preprocessor-to-rewrite-images-links-in-markdown-document.html</id>
    <published>2016-04-03T08:48:04.000Z</published>
    <updated>2016-04-03T12:07:56.000Z</updated>
    
    <content type="html"><![CDATA[<p>When I started to write a blog with <a href="http://hexo.io/" target="_blank" rel="external">hexo</a>, a <strong>static site generator</strong> who use <strong>markdown</strong> files as source, I encountered the problem that URLs of images in the document did not reflects the paths of the images on the system.<br>Opened with most of markdown software, <strong>the images are not displayed</strong>,  the links in the document are not paths on the system. Initially, as I used absolutes links, I created a symlink of the folder on the root of my hard-drive, but this is not an ideal solution, and I couldn’t do that for every websites.</p>
<a id="more"></a>
<p><strong>Marked 2</strong> (<a href="http://marked2app.com/" target="_blank" rel="external">marked2app.com</a>) have a great functionality for this, you can use your own <strong>markdown preprocessor</strong> to parse the document before Marked generate and display the preview.</p>
<p>The simple idea here is to, in first place, see <strong>if the markdown file is located in a predefined directory</strong> (here it is the root of the blog), and if yes, <strong>replace every images’s links</strong> in the document with this root path to recreate a correct path to the image on the system.</p>
<h3 id="Bellow-a-script-example-written-in-Ruby-marked-markdown-preprocessor-rb"><a href="https://lab.inspira.io/2016/use-marked2-preprocessor-to-rewrite-images-links-in-markdown-document.html#Bellow-a-script-example-written-in-Ruby-marked-markdown-preprocessor-rb" class="headerlink" title="Bellow a script example written in Ruby (marked-markdown-preprocessor.rb):"></a>Bellow a script example written in Ruby (<a href="https://gist.githubusercontent.com/atika/491d9d160c81b7eea6c272e9d1c21ea6/raw/6cf979042356dd9a0558769ac28b05931ca10be5/marked-markdown-preprocessor.rb" target="_blank" rel="external">marked-markdown-preprocessor.rb</a>):</h3><p>(Please note that this script may not work on the Mac App Store version of Marked 2 due to OS X restriction)</p>
<script src="https://gist.github.com/491d9d160c81b7eea6c272e9d1c21ea6.js?file=marked-markdown-preprocessor.rb"></script>
<p>Place the script where you want, make it executable <code>chmod +x marked-markdown-preprocessor.rb</code> and add the path to this script in Marked preferences.</p>
<p><img src="https://lab.inspira.io/static/2016/04/marked2-preprocessor-preference-panel.png" alt="Marked 2 Preprocessor Preferences Panel"></p>
<p>The first checkbox is also useful with Hexo, it strips from the preview, all header data of the document, this YAML data are used to define title, tags, categories of the page.</p>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>When I started to write a blog with <a href="http://hexo.io/">hexo</a>, a <strong>static site generator</strong> who use <strong>markdown</strong> files as source, I encountered the problem that URLs of images in the document did not reflects the paths of the images on the system.<br>Opened with most of markdown software, <strong>the images are not displayed</strong>,  the links in the document are not paths on the system. Initially, as I used absolutes links, I created a symlink of the folder on the root of my hard-drive, but this is not an ideal solution, and I couldn’t do that for every websites.</p>]]>
    
    </summary>
    
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="url" scheme="https://lab.inspira.io/tags/url/"/>
    
      <category term="marked2" scheme="https://lab.inspira.io/tags/marked2/"/>
    
      <category term="marked" scheme="https://lab.inspira.io/tags/marked/"/>
    
      <category term="markdown" scheme="https://lab.inspira.io/tags/markdown/"/>
    
      <category term="preprocessor" scheme="https://lab.inspira.io/tags/preprocessor/"/>
    
      <category term="example" scheme="https://lab.inspira.io/tags/example/"/>
    
      <category term="ruby" scheme="https://lab.inspira.io/tags/ruby/"/>
    
      <category term="md" scheme="https://lab.inspira.io/tags/md/"/>
    
      <category term="file" scheme="https://lab.inspira.io/tags/file/"/>
    
      <category term="images" scheme="https://lab.inspira.io/tags/images/"/>
    
      <category term="replace" scheme="https://lab.inspira.io/tags/replace/"/>
    
      <category term="website" scheme="https://lab.inspira.io/tags/website/"/>
    
      <category term="hexo" scheme="https://lab.inspira.io/tags/hexo/"/>
    
      <category term="jekyll" scheme="https://lab.inspira.io/tags/jekyll/"/>
    
      <category term="path" scheme="https://lab.inspira.io/tags/path/"/>
    
      <category term="text" scheme="https://lab.inspira.io/tags/text/"/>
    
      <category term="document" scheme="https://lab.inspira.io/tags/document/"/>
    
      <category term="max" scheme="https://lab.inspira.io/tags/max/"/>
    
      <category term="app" scheme="https://lab.inspira.io/tags/app/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[SteelSeries Nimbus Gamepad (Sketch File)]]></title>

    <link href="https://lab.inspira.io/2016/steelseries-nimbus-gamepad-designed-with-sketch-app.html"/>
    <id>https://lab.inspira.io/2016/steelseries-nimbus-gamepad-designed-with-sketch-app.html</id>
    <published>2016-01-22T14:45:13.000Z</published>
    <updated>2016-01-23T14:45:13.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://lab.inspira.io/static/2016/01/nimbus-gamepad-sketch-design.png" alt="Nimbus Gamedpad Sketch File" title="Nimbus Gamedpad Sketch File"></p>
<a id="more"></a>
<div class="download">nimbus-remote-sketch.zip (527Kb) <a href="https://www.dropbox.com/s/67tff7qmlpi5w3p/nimbus-remote-sketch.zip?dl=1" target="_blank" rel="external">download</a></div>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><img src="https://lab.inspira.io/static/2016/01/nimbus-gamepad-sketch-design.png" alt="Nimbus Gamedpad Sketch File" title="Nimbus Gamedpad Sketch File"></p>]]>
    
    </summary>
    
      <category term="Designer" scheme="https://lab.inspira.io/categories/designer/"/>
    
    
      <category term="remote" scheme="https://lab.inspira.io/tags/remote/"/>
    
      <category term="sketch" scheme="https://lab.inspira.io/tags/sketch/"/>
    
      <category term="vector" scheme="https://lab.inspira.io/tags/vector/"/>
    
      <category term="draw" scheme="https://lab.inspira.io/tags/draw/"/>
    
      <category term="download" scheme="https://lab.inspira.io/tags/download/"/>
    
      <category term="sketchapp" scheme="https://lab.inspira.io/tags/sketchapp/"/>
    
      <category term="png" scheme="https://lab.inspira.io/tags/png/"/>
    
      <category term="appletv" scheme="https://lab.inspira.io/tags/appletv/"/>
    
      <category term="design" scheme="https://lab.inspira.io/tags/design/"/>
    
      <category term="steelseries" scheme="https://lab.inspira.io/tags/steelseries/"/>
    
      <category term="nimbus" scheme="https://lab.inspira.io/tags/nimbus/"/>
    
      <category term="gamepad" scheme="https://lab.inspira.io/tags/gamepad/"/>
    
      <category term="control" scheme="https://lab.inspira.io/tags/control/"/>
    
      <category term="controller" scheme="https://lab.inspira.io/tags/controller/"/>
    
      <category term="designed" scheme="https://lab.inspira.io/tags/designed/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Apple Siri Remote (Sketch)]]></title>

    <link href="https://lab.inspira.io/2015/apple-siri-remote-sketch.html"/>
    <id>https://lab.inspira.io/2015/apple-siri-remote-sketch.html</id>
    <published>2015-12-19T10:22:53.000Z</published>
    <updated>2015-12-20T09:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://lab.inspira.io/static/2015/12/apple-siri-remote-sketch.png" alt="Apple Siri Remote (Sketch)" title="Apple Siri Remote Sketch Design"></p>
<a id="more"></a>
<p><img src="https://lab.inspira.io/static/2015/12/apple-siri-remote-sketch-stroke.png" alt="Apple Siri Remote (Stroke)" title="Apple Siri Remote Sketch Design (Stroke)"></p>
<div class="download">apple-siri-remote-sketch.zip (960kb) <a href="https://www.dropbox.com/s/4rtyppo16aocyrn/apple-siri-remote-sketch.zip?dl=1" target="_blank" rel="external">download</a></div>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><img src="https://lab.inspira.io/static/2015/12/apple-siri-remote-sketch.png" alt="Apple Siri Remote (Sketch)" title="Apple Siri Remote Sketch Design"></p>]]>
    
    </summary>
    
      <category term="Designer" scheme="https://lab.inspira.io/categories/designer/"/>
    
    
      <category term="remote" scheme="https://lab.inspira.io/tags/remote/"/>
    
      <category term="apple" scheme="https://lab.inspira.io/tags/apple/"/>
    
      <category term="siri" scheme="https://lab.inspira.io/tags/siri/"/>
    
      <category term="sketch" scheme="https://lab.inspira.io/tags/sketch/"/>
    
      <category term="vector" scheme="https://lab.inspira.io/tags/vector/"/>
    
      <category term="draw" scheme="https://lab.inspira.io/tags/draw/"/>
    
      <category term="download" scheme="https://lab.inspira.io/tags/download/"/>
    
      <category term="sketchapp" scheme="https://lab.inspira.io/tags/sketchapp/"/>
    
      <category term="png" scheme="https://lab.inspira.io/tags/png/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Photoshop Action — Apple TV Icon template]]></title>

    <link href="https://lab.inspira.io/2015/apple-tv-icon-photoshop-action.html"/>
    <id>https://lab.inspira.io/2015/apple-tv-icon-photoshop-action.html</id>
    <published>2015-11-30T19:31:42.000Z</published>
    <updated>2015-12-12T22:00:00.000Z</updated>
    
    <content type="html"><![CDATA[
<video width="auto" height="auto" autobuffer="" autoplay autoloop="" loop>
    <source src="https://lab.inspira.io/static/2015/11/appletv-icon-lsr.mp4" type="video/mp4">
    <param name="autoplay" value="true">
    <param name="autoStart" value="0">
</video>

<p><strong>Photoshop action</strong> to create a <strong>PSD template</strong> for a layered icon (.lsr) for <strong>Apple TV</strong> (stack image)</p>
<h2 id="Photoshop-action"><a href="https://lab.inspira.io/2015/apple-tv-icon-photoshop-action.html#Photoshop-action" class="headerlink" title="Photoshop action:"></a>Photoshop action:</h2><table>
<thead>
<tr>
<th>action</th>
<th style="text-align:left">description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Xcode LSR Image</strong></td>
<td style="text-align:left">Create a classic PSD template for Apple TV icon</td>
</tr>
<tr>
<td><strong>Xcode LSR Image (generator)</strong></td>
<td style="text-align:left">Create a PSD template for the small and large Apple TV icon with layer named to be exported with Generator.</td>
</tr>
</tbody>
</table>
<a id="more"></a>
<p><strong>Edit 12 Dec 2015:</strong> Action has been updated to work with generator export.<br><del><strong>Edit 04 Dec 2015:</strong> Rename last layers group to <code>.png24</code> for Photoshop Generator export an non transparency image or Xcode will warn.</del></p>
<div class="download">tvos-stack-icon-photoshop-action.zip (1Kb) <a href="https://www.dropbox.com/s/aeh2vm3xzzqwhid/tvos-stack-icon-photoshop-action.zip?dl=1" target="_blank" rel="external">download</a> </div>

<!-- http://lab.inspira.io/files/tvos-stack-icon-photoshop-action.zip -->
<p><br></p>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<video width="auto" height="auto" autobuffer autoplay autoloop loop>
    <source src="https://lab.inspira.io/static/2015/11/appletv-icon-lsr.mp4" type="video/mp4">
    <param name="autoplay" value="true">
    <param name="autoStart" value="0">
</video>

<p><strong>Photoshop action</strong> to create a <strong>PSD template</strong> for a layered icon (.lsr) for <strong>Apple TV</strong> (stack image)</p>
<h2 id="Photoshop-action"><a href="https://lab.inspira.io/2015/apple-tv-icon-photoshop-action.html#Photoshop-action" class="headerlink" title="Photoshop action:"></a>Photoshop action:</h2><table>
<thead>
<tr>
<th>action</th>
<th style="text-align:left">description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Xcode LSR Image</strong></td>
<td style="text-align:left">Create a classic PSD template for Apple TV icon</td>
</tr>
<tr>
<td><strong>Xcode LSR Image (generator)</strong></td>
<td style="text-align:left">Create a PSD template for the small and large Apple TV icon with layer named to be exported with Generator.</td>
</tr>
</tbody>
</table>]]>
    
    </summary>
    
    
      <category term="apple" scheme="https://lab.inspira.io/tags/apple/"/>
    
      <category term="appletv" scheme="https://lab.inspira.io/tags/appletv/"/>
    
      <category term="tvos" scheme="https://lab.inspira.io/tags/tvos/"/>
    
      <category term="icon" scheme="https://lab.inspira.io/tags/icon/"/>
    
      <category term="lsr" scheme="https://lab.inspira.io/tags/lsr/"/>
    
      <category term="layer" scheme="https://lab.inspira.io/tags/layer/"/>
    
      <category term="photoshop" scheme="https://lab.inspira.io/tags/photoshop/"/>
    
      <category term="action" scheme="https://lab.inspira.io/tags/action/"/>
    
      <category term="template" scheme="https://lab.inspira.io/tags/template/"/>
    
      <category term="adobe" scheme="https://lab.inspira.io/tags/adobe/"/>
    
      <category term="stack" scheme="https://lab.inspira.io/tags/stack/"/>
    
      <category term="image" scheme="https://lab.inspira.io/tags/image/"/>
    
      <category term="parallax" scheme="https://lab.inspira.io/tags/parallax/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[CodeRunner 2 Tips]]></title>

    <link href="https://lab.inspira.io/2015/coderunner-2-tips.html"/>
    <id>https://lab.inspira.io/2015/coderunner-2-tips.html</id>
    <published>2015-11-28T09:49:06.000Z</published>
    <updated>2016-03-10T10:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://coderunnerapp.com/" target="_blank" rel="external">CodeRunner</a> is the best way to write code on your Mac. You can run code in almost any language instantly, and you’ll be surprised by the powerful set of features in such a lightweight and easy-to-use editor.</p>
<a id="more"></a>
<ul>
<li><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#1-_Change_Build_Directory">1. Change Build Directory</a></li>
<li><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#2-_Tip_to_have_Javascript_2C_HTML_and_CSS_in_the_same_file">2. Tip to have Javascript, HTML and CSS in the same file</a></li>
<li><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#3-_Run_AngularJS_Javascript">3. Run AngularJS Javascript</a></li>
</ul>
<h1 id="1-Change-Build-Directory"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#1-Change-Build-Directory" class="headerlink" title="1. Change Build Directory"></a>1. Change Build Directory</h1><h2 id="Shell-variable"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Shell-variable" class="headerlink" title="Shell variable"></a>Shell variable</h2><p>Create a shell variable named <strong><code>CR_BUILD_DIR</code></strong> on <code>CodeRunner Preferences &gt; Advanced</code> and set the absolute path to your build directory.</p>
<p><img src="https://lab.inspira.io/static/2015/11/coderunner_shell_variables.png" alt="CodeRunner Shell Variables" title="CodeRunner Shell Variables Panel"></p>
<h2 id="Languages"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Languages" class="headerlink" title="Languages"></a>Languages</h2><p>Set <code>Run command</code> to <strong><code>$compiler</code></strong> because the path to the program passed by the compile script will be absolute.<br>Click on <strong><code>Edit Script</code></strong> to edit the compile script and add this bloc of code:</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [[ ! -z <span class="variable">$CR_BUILD_DIR</span> ]]; <span class="keyword">then</span></span><br><span class="line">    build_path=<span class="string">"<span class="variable">$CR_BUILD_DIR</span>/objc"</span></span><br><span class="line">    mkdir -p <span class="variable">$build_path</span></span><br><span class="line">    out=<span class="string">"<span class="variable">$build_path</span>/<span class="variable">$out</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure>
<p><img src="https://lab.inspira.io/static/2015/11/coderunner_objc_panel.png" alt="CodeRunner Shell Variables" title="CodeRunner Shell Variables Panel"></p>
<p>Paste this block after the bloc <code>out=&quot;$out.out&quot;</code>, this will create a destination folder called <code>objc</code> and compile the script in.</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ ! -z <span class="variable">$CR_SANDBOXED</span> ]; <span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="_">-e</span> <span class="string">"To run Objective-C code, you need to use the non-App Store version of CodeRunner, which is free for App Store customers.\n\nDownload the non-App Store version of CodeRunner at https://coderunnerapp.com/. You will also need Xcode to run Objective-C code, which can be downloaded from the Mac App Store."</span></span><br><span class="line"><span class="built_in">exit</span> 1</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">out=`<span class="built_in">echo</span> <span class="string">"<span class="variable">$CR_FILENAME</span>"</span> | sed <span class="string">'s/\(.*\)\..*/\1/'</span>`</span><br><span class="line"><span class="keyword">if</span> [ <span class="_">-d</span> <span class="string">"<span class="variable">$out</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    out=<span class="string">"<span class="variable">$out</span>.out"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [[ ! -z <span class="variable">$CR_BUILD_DIR</span> ]]; <span class="keyword">then</span></span><br><span class="line">    build_path=<span class="string">"<span class="variable">$CR_BUILD_DIR</span>/objc"</span></span><br><span class="line">    mkdir -p <span class="variable">$build_path</span></span><br><span class="line">    out=<span class="string">"<span class="variable">$build_path</span>/<span class="variable">$out</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure>
<p>Do the same with Swift Language.</p>
<h1 id="2-Tip-to-have-Javascript-HTML-and-CSS-in-the-same-file"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#2-Tip-to-have-Javascript-HTML-and-CSS-in-the-same-file" class="headerlink" title="2. Tip to have Javascript, HTML and CSS in the same file"></a>2. Tip to have Javascript, HTML and CSS in the same file</h1><p>With the second version of CodeRunner is now possible to run code on a webview, the problem is that you can just run Javascript code like jQuery without a way to add HTML or Styles.</p>
<p>CodeRunner can run a shell script before executing the file, like the own used in Swift, the file is compiled with this script before running.</p>
<p>It gave me an idea to add a compile script who will separate the current file in 3 parts: Javascript, HTML and CSS, and return the complete HTML source code.</p>
<p>I don’t know if it is an optimal solution, it’s seems to work. You can download the script by downloading the below <strong>JavaScript AngularJS Code Runner Language</strong>.<br>In the file, the <code>script</code> tag is optional.</p>
<h2 id="Template"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Template" class="headerlink" title="Template"></a>Template</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">//&lt;script&gt;</span><br><span class="line">alert(&apos;Your javascript here&apos;);</span><br><span class="line"></span><br><span class="line">//&lt;html&gt;</span><br><span class="line">&lt;div class=&apos;mydiv&apos;&gt;An HTML Div&lt;/div&gt;</span><br><span class="line"></span><br><span class="line">//&lt;css&gt;</span><br><span class="line">.mydiv &#123;</span><br><span class="line">    background-color:orange;</span><br><span class="line">    padding: 8px 5px;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h2 id="Compilation-Script"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Compilation-Script" class="headerlink" title="Compilation Script"></a>Compilation Script</h2><p>This script cut the file in 3 parts (Javascript, HTLM and CSS) and return a complete formated HTML source page for CodeRunner display in the webview.</p>
<script src="https://gist.github.com/926592e2f3bdf5f18b8e.js?file=coderunner-javascript-html-css-compile-script.sh"></script>
<h2 id="Example"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Example" class="headerlink" title="Example"></a>Example</h2><p>Check the example with AngularJS below.</p>
<h1 id="3-Run-AngularJS-Javascript"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#3-Run-AngularJS-Javascript" class="headerlink" title="3. Run AngularJS Javascript"></a>3. Run AngularJS Javascript</h1><div class="download">coderunner-javascript-angularjs.zip (2Kb) <a href="https://www.dropbox.com/s/y4l0xsodm6pd2nb/coderunner-javascript-angularjs.zip?dl=1" target="_blank" rel="external">download</a></div>

<p><img src="https://lab.inspira.io/static/2015/11/coderunner_run_angularjs_javascript.png" alt="CodeRunner Running AngularJS" title="CodeRunner running AngularJS"></p>
<h2 id="Example-with-AngularJS"><a href="https://lab.inspira.io/2015/coderunner-2-tips.html#Example-with-AngularJS" class="headerlink" title="Example with AngularJS"></a>Example with AngularJS</h2><script src="https://gist.github.com/926592e2f3bdf5f18b8e.js?file=CodeRunner-AngularJS-Exemple.js"></script>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><a href="https://coderunnerapp.com/">CodeRunner</a> is the best way to write code on your Mac. You can run code in almost any language instantly, and you’ll be surprised by the powerful set of features in such a lightweight and easy-to-use editor.</p>]]>
    
    </summary>
    
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="shell" scheme="https://lab.inspira.io/tags/shell/"/>
    
      <category term="coderunner" scheme="https://lab.inspira.io/tags/coderunner/"/>
    
      <category term="code" scheme="https://lab.inspira.io/tags/code/"/>
    
      <category term="program" scheme="https://lab.inspira.io/tags/program/"/>
    
      <category term="objectivec" scheme="https://lab.inspira.io/tags/objectivec/"/>
    
      <category term="objc" scheme="https://lab.inspira.io/tags/objc/"/>
    
      <category term="swift" scheme="https://lab.inspira.io/tags/swift/"/>
    
      <category term="build" scheme="https://lab.inspira.io/tags/build/"/>
    
      <category term="directory" scheme="https://lab.inspira.io/tags/directory/"/>
    
      <category term="variable" scheme="https://lab.inspira.io/tags/variable/"/>
    
      <category term="compile" scheme="https://lab.inspira.io/tags/compile/"/>
    
      <category term="angularjs" scheme="https://lab.inspira.io/tags/angularjs/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Twitter Layout (PSD Files)]]></title>

    <link href="https://lab.inspira.io/2015/twitter-layout-template-photo-2014-psd.html"/>
    <id>https://lab.inspira.io/2015/twitter-layout-template-photo-2014-psd.html</id>
    <published>2015-07-04T22:55:13.000Z</published>
    <updated>2017-03-19T16:30:37.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>Download Twitter Layout Photoshop files (psd)</strong></p>
<p><img src="https://lab.inspira.io/static/2015/07/TwitterLayout.jpg" alt=""></p>
<a id="more"></a>
<p><img src="https://lab.inspira.io/static/2015/07/TwitterLayoutFilesIcons.png" alt=""></p>
<p><strong>Required:</strong> <em>The photo and the banner are Linked Smart Object, you must have at least Photoshop CC to work with the files.</em></p>
<p><strong>Photo size :</strong> 200x200 pixels (400x400 pixels @2x)<br><strong>Banner size :</strong> 1500x500 pixels (3000x1000 pixels @2x)</p>
<div class="download">twitter-layout-psd.zip (5Mb) <a href="https://www.dropbox.com/s/9tb7e0gjlrfp3y6/twitter-layout-psd.zip?dl=1" target="_blank" rel="external">download</a></div>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><strong>Download Twitter Layout Photoshop files (psd)</strong></p>
<p><img src="https://lab.inspira.io/static/2015/07/TwitterLayout.jpg" alt=""></p>]]>
    
    </summary>
    
      <category term="Designer" scheme="https://lab.inspira.io/categories/designer/"/>
    
    
      <category term="download" scheme="https://lab.inspira.io/tags/download/"/>
    
      <category term="photoshop" scheme="https://lab.inspira.io/tags/photoshop/"/>
    
      <category term="template" scheme="https://lab.inspira.io/tags/template/"/>
    
      <category term="image" scheme="https://lab.inspira.io/tags/image/"/>
    
      <category term="twitter" scheme="https://lab.inspira.io/tags/twitter/"/>
    
      <category term="layout" scheme="https://lab.inspira.io/tags/layout/"/>
    
      <category term="psd" scheme="https://lab.inspira.io/tags/psd/"/>
    
      <category term="design" scheme="https://lab.inspira.io/tags/design/"/>
    
      <category term="telecharger" scheme="https://lab.inspira.io/tags/telecharger/"/>
    
      <category term="model" scheme="https://lab.inspira.io/tags/model/"/>
    
      <category term="banner" scheme="https://lab.inspira.io/tags/banner/"/>
    
      <category term="photo" scheme="https://lab.inspira.io/tags/photo/"/>
    
      <category term="modele" scheme="https://lab.inspira.io/tags/modele/"/>
    
      <category term="dimensions" scheme="https://lab.inspira.io/tags/dimensions/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Un répertoire GIT privé avec un NAS Synology]]></title>

    <link href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html"/>
    <id>https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html</id>
    <published>2014-11-01T13:45:00.000Z</published>
    <updated>2015-05-31T20:51:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://lab.inspira.io/static/2014/11/git_private_repo_syno_diskstation.png"></a></p>
<p>Vous travaillez avec GIT pour gérer vos projets, voici un rapide aperçu pour configurer un répertoire GIT privé sur votre Diskstation.</p>
<a id="more"></a>
<h2 id="Configuration-du-NAS"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Configuration-du-NAS" class="headerlink" title="Configuration du NAS"></a>Configuration du NAS</h2><h3 id="Creez-le-dossier-partage"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Creez-le-dossier-partage" class="headerlink" title="Créez le dossier partagé"></a>Créez le dossier partagé</h3><p>Connectez-vous à l’interface du DiskStation et dans le panneau de configuration, créez un nouveau dossier partagé que vous pouvez nommer <strong>repos</strong>.</p>
<p><img src="https://lab.inspira.io/static/2014/11/diskstation-create-shared-folder-git-private.png" alt=""></p>
<p>Dans la partie <strong>Permissions</strong>, indiquez les utilisateurs ayant le droit d’accéder à ce dossier. Si vous comptez installer une interface web, comme Gitlist (cf. ci-dessous), dans les permissions de groupe autorisez le <strong>groupe http</strong> à accéder en lecture/écriture.</p>
<p><img src="https://lab.inspira.io/static/2014/11/dsm-permissions-git-shared-folder.png" alt="DiskStation Git folder permissions"></p>
<h3 id="Installer-le-Package-Git"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Installer-le-Package-Git" class="headerlink" title="Installer le Package Git"></a>Installer le Package Git</h3><p>Installez le <strong>Package Git</strong> depuis le Centre de Paquets de votre NAS Synology, ce paquet permettra d’autoriser l’accès à certaines commandes du Shell nécessaires à l’utilisation de GIT pour certains utilisateurs.</p>
<h3 id="Activer-SSH"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Activer-SSH" class="headerlink" title="Activer SSH"></a>Activer SSH</h3><p>Si ce n’est déjà fait, activer le service SSH dans le panneau de configuration</p>
<h2 id="Acces-par-cle-privee-au-Diskstation"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Acces-par-cle-privee-au-Diskstation" class="headerlink" title="Accès par clé privée au Diskstation"></a>Accès par clé privée au Diskstation</h2><p>Sur votre ordinateur copier la clé publique RSA situé dans le dossier .ssh de votre dossier utilisateur.</p>
<p>Connecter vous au NAS avec le terminal, et coller cette clé dans le fichier :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/volume1/homes/VOTRE_NOM/.ssh/authorized_keys</span><br></pre></td></tr></table></figure>
<p>Si le dossier .ssh n’existe pas, crée-le.</p>
<p>Cela permettra d’accéder au NAS sans authentification par mot de passe et de façon automatique et sécurisé.</p>
<h2 id="Sur-votre-ordinateur"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Sur-votre-ordinateur" class="headerlink" title="Sur votre ordinateur"></a>Sur votre ordinateur</h2><h3 id="Configurer-un-nouvel-host-pour-SSH"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Configurer-un-nouvel-host-pour-SSH" class="headerlink" title="Configurer un nouvel host pour SSH"></a>Configurer un nouvel host pour SSH</h3><p>Pour vous permettre d’accéder au répertoire GIT via SSH sans avoir à entrer le nom d’utilisateur et l’adresse IP de votre Diskstation, vous pouvez configurer un HOST sur votre machine.<br>Cela aura également l’avantage de centraliser ces paramètres en vue d’une future modification, mais également de masquer, l’adresse IP et votre nom d’utilisateur des projets GIT clonés.</p>
<p>Pour cela, éditez le fichier <strong>config</strong> se trouvant dans le dossier .ssh de votre dossier utilisateur.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.ssh/config</span><br><span class="line"><span class="comment"># Et entrez les informations suivantes</span></span><br><span class="line">Host GitStation</span><br><span class="line">user admin</span><br><span class="line">hostname 192.168.2.100</span><br><span class="line">port 22</span><br></pre></td></tr></table></figure>
<p>À partir de là, en tapant uniquement le nom donné vous serez automatiquement connecté au diskstation et avec le bon utilisateur.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh GitStation</span><br></pre></td></tr></table></figure>
<h3 id="Un-raccourci-pour-cloner-les-projets-GIT-du-NAS"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Un-raccourci-pour-cloner-les-projets-GIT-du-NAS" class="headerlink" title="Un raccourci pour cloner les projets GIT du NAS"></a>Un raccourci pour cloner les projets GIT du NAS</h3><p>Pour pouvoir cloner un répertoire se trouvant sur le NAS, sans avoir à chercher le nom du dossier du projet et saisir l’URL complète vers son répertoire, voici une petite astuce à ajouter dans votre fichier <strong>~/.bash_profile</strong></p>
<p>Depuis un terminal, vous aurez juste à saisir <strong>gitstation_clone</strong> pour obtenir une liste des répertoires et saisir le nom de la destination (ou pas) pour cloner le projet GIT sur votre ordinateur.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">gitstation_clone</span></span>() &#123;</span><br><span class="line">    PS3=<span class="string">'Quel répertoire Git souhaitez-vous cloner ? '</span></span><br><span class="line">    select gitrep <span class="keyword">in</span> $(ssh GitStation <span class="string">'ls /volume1/repos/'</span> | grep <span class="string">'.git'</span>) <span class="string">"Cancel"</span></span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">            <span class="keyword">if</span> [ <span class="variable">$opt</span> = <span class="string">'Cancel'</span> ]; <span class="keyword">then</span></span><br><span class="line">                    <span class="built_in">break</span></span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">                    clear</span><br><span class="line">                    <span class="keyword">if</span> [ <span class="string">"x<span class="variable">$gitrep</span>"</span> = <span class="string">"x"</span> ]; <span class="keyword">then</span> <span class="built_in">break</span>; <span class="keyword">fi</span></span><br><span class="line">                    <span class="built_in">echo</span> <span class="string">"Vous avez sélectionné : <span class="variable">$gitrep</span>"</span></span><br><span class="line">                    <span class="built_in">read</span> -p <span class="string">"Nom du dossier de destination : "</span> gitdest</span><br><span class="line">                    git <span class="built_in">clone</span> ssh://GitStation/volume1/repos/<span class="variable">$gitrep</span> <span class="variable">$gitdest</span></span><br><span class="line">            <span class="keyword">fi</span></span><br><span class="line">            <span class="built_in">break</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">MacBookPro:~ dom$ gitstation_<span class="built_in">clone</span></span><br><span class="line">1) myAwesomeProject.git</span><br><span class="line">2) testprojet2.git</span><br><span class="line">3) Cancel</span><br><span class="line">Quel répertoire Git souhaitez-vous cloner ? 1</span><br><span class="line">Vous avez sélectionné : myAwesomeProject.git</span><br><span class="line">Nom du dossier de destination : myAwesomeProject</span><br><span class="line">Cloning into <span class="string">'myAwesomeProject'</span>...</span><br><span class="line">Checking connectivity... done.</span><br></pre></td></tr></table></figure>
<h1 id="Creer-un-projet-GIT-sur-le-NAS"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Creer-un-projet-GIT-sur-le-NAS" class="headerlink" title="Créer un projet GIT sur le NAS"></a>Créer un projet GIT sur le NAS</h1><p>Vous pouvez créer le dossier sur le serveur en montant le dossier partagé dans le Finder, ou en vous connectant en SSH au NAS.</p>
<p><img src="https://lab.inspira.io/static/2014/11/create-init-git-project-private-bare-dsm.png" alt=""></p>
<p>Une fois dans le dossier partagé «repos» avec le terminal saisir cette commande pour initialisé un nouveau projet GIT.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init --bare myAwesomeProject.git</span><br></pre></td></tr></table></figure>
<p>Si vous avez l’intention d’accéder à ce Repo Git depuis <strong>plusieurs comptes utilisateur</strong> (différents identifiants) :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init --bare --shared myAwesomeProject.git</span><br></pre></td></tr></table></figure>
<p>Vous pourrez ensuite cloner ce répertoire sur votre ordinateur pour travailler dessus, soit avec le script ci-dessus (gitstation_clone) soit en tapant :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> ssh://GitStation/volume1/repos/myAwesomeProject.git</span><br></pre></td></tr></table></figure>
<p>Et si vous avez déjà créer un projet local et initialiser ce projet avec la commande git init, vous pouvez mettre à jour l’url du repo sur le serveur avec la commande :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git remote -v</span><br><span class="line">git remote add origin ssh://GitStation/volume1/repos/myAwesomeProject.git</span><br><span class="line"><span class="comment"># ou pour modifier</span></span><br><span class="line">git remote <span class="built_in">set</span>-url origin ssh://GitStation/volume1/repos/myAwesomeProject.git</span><br></pre></td></tr></table></figure>
<h2 id="Installation-de-GitList"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Installation-de-GitList" class="headerlink" title="Installation de GitList"></a>Installation de GitList</h2><p>GitList une fois installé sur votre Diskstation vous permettra d’accéder à une interface pour lister les projets se trouvant sur le Diskstation, pour l’installer c’est très simple.</p>
<p><img src="https://lab.inspira.io/static/2014/11/GitList-installation-diskstation-git.jpg" alt=""></p>
<p>Dans un premier temps, télécharger l’application GitList à l’adresse suivante <a href="http://gitlist.org/" target="_blank" rel="external">gitlist.org</a>, et copier ce dossier dans votre dossier partagé web du NAS.</p>
<p>Dupliquer le fichier <strong>config.ini</strong> et indiquez où se trouve vos projets GIT sur le NAS :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">repositories[] = <span class="string">'/volume1/repos/'</span> ; Path to your repositories</span><br></pre></td></tr></table></figure>
<h3 id="PHP-open-basedir"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#PHP-open-basedir" class="headerlink" title="PHP : open_basedir"></a>PHP : open_basedir</h3><p>Ensuite créer un dossier <strong>cache</strong> à la racine du répertoire GitList, et <strong>chmod 777</strong></p>
<p>Pour finir, et afin que GitList puisse accéder au dossier partagé contenant vos projets GIT, il faut modifier le paramètre open_basedir de PHP.<br>Pour celà dans la rubrique Services Web du panneau de configuration, et dans Paramètres PHP, cliquez sur Personnaliser PHP open_basedir et ajouter ceci à la fin <code>:/volume1/repos</code></p>
<p><img src="https://lab.inspira.io/static/2014/11/git-php-diskstation-open_basedir.png" alt=""></p>
<h2 id="Une-petite-icone-pour-le-volume"><a href="https://lab.inspira.io/2014/un-repertoire-git-prive-avec-un-nas-synology.html#Une-petite-icone-pour-le-volume" class="headerlink" title="Une petite icône pour le volume"></a>Une petite icône pour le volume</h2><p>Et enfin, voici une jolie petite icône afin de personnaliser votre dossier fraichement crée qui contiendra vos futurs projets GIT privés!</p>
<p><img src="https://lab.inspira.io/static/2014/11/git-icon-drive.png" alt=""></p>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><a href="https://lab.inspira.io/static/2014/11/git_private_repo_syno_diskstation.png"></a></p>
<p>Vous travaillez avec GIT pour gérer vos projets, voici un rapide aperçu pour configurer un répertoire GIT privé sur votre Diskstation.</p>]]>
    
    </summary>
    
      <category term="Developer" scheme="https://lab.inspira.io/categories/developer/"/>
    
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="bash" scheme="https://lab.inspira.io/tags/bash/"/>
    
      <category term="Mac OS X" scheme="https://lab.inspira.io/tags/mac-os-x/"/>
    
      <category term="php" scheme="https://lab.inspira.io/tags/php/"/>
    
      <category term="clone" scheme="https://lab.inspira.io/tags/clone/"/>
    
      <category term="cloner" scheme="https://lab.inspira.io/tags/cloner/"/>
    
      <category term="config" scheme="https://lab.inspira.io/tags/config/"/>
    
      <category term="diskstation" scheme="https://lab.inspira.io/tags/diskstation/"/>
    
      <category term="dsm" scheme="https://lab.inspira.io/tags/dsm/"/>
    
      <category term="git" scheme="https://lab.inspira.io/tags/git/"/>
    
      <category term="git server" scheme="https://lab.inspira.io/tags/git-server/"/>
    
      <category term="gitlist" scheme="https://lab.inspira.io/tags/gitlist/"/>
    
      <category term="host" scheme="https://lab.inspira.io/tags/host/"/>
    
      <category term="NAS" scheme="https://lab.inspira.io/tags/nas/"/>
    
      <category term="open_basedir" scheme="https://lab.inspira.io/tags/open-basedir/"/>
    
      <category term="permissions" scheme="https://lab.inspira.io/tags/permissions/"/>
    
      <category term="private" scheme="https://lab.inspira.io/tags/private/"/>
    
      <category term="privée" scheme="https://lab.inspira.io/tags/privee/"/>
    
      <category term="projet" scheme="https://lab.inspira.io/tags/projet/"/>
    
      <category term="remote" scheme="https://lab.inspira.io/tags/remote/"/>
    
      <category term="répertoire" scheme="https://lab.inspira.io/tags/repertoire/"/>
    
      <category term="repo" scheme="https://lab.inspira.io/tags/repo/"/>
    
      <category term="repository" scheme="https://lab.inspira.io/tags/repository/"/>
    
      <category term="shared" scheme="https://lab.inspira.io/tags/shared/"/>
    
      <category term="shell" scheme="https://lab.inspira.io/tags/shell/"/>
    
      <category term="ssh" scheme="https://lab.inspira.io/tags/ssh/"/>
    
      <category term="syno" scheme="https://lab.inspira.io/tags/syno/"/>
    
      <category term="synology" scheme="https://lab.inspira.io/tags/synology/"/>
    
      <category term="terminal" scheme="https://lab.inspira.io/tags/terminal/"/>
    
      <category term="url" scheme="https://lab.inspira.io/tags/url/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Redirigez un email vers une autre application avec Postfix et PHP sous Mac OS X]]></title>

    <link href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html"/>
    <id>https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html</id>
    <published>2014-10-30T23:00:00.000Z</published>
    <updated>2015-05-27T14:24:18.000Z</updated>
    
    <content type="html"><![CDATA[<p>Souvent certaines applications ne proposent que l’envoi d’un email comme procédé pour vous avertir d’un évènement, c’est le cas par exemple du logiciel de sauvegarde Carbon Copy Cloner.</p>
<a id="more"></a>
<p>Si vous souhaitez rediriger cet email vers un autre applicatif, il existe une petite astuce pour permettre la récupération de ce message et le transférer à un autre service.</p>
<h2 id="L’idee-Filtrage-Postfix"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#L’idee-Filtrage-Postfix" class="headerlink" title="L’idée : Filtrage Postfix"></a>L’idée : Filtrage Postfix</h2><p>L’idée ici est d’envoyer le mail au compte mail local et charger le serveur Postfix du Mac de filtrer cet email reçu en le transmettant à un script qui se chargera du travail</p>
<ul>
<li><p>ici en PHP.<br>Le script PHP nécessite des librairies pour pouvoir lire convenablement le fichier MIME qu’il recevra.</p>
<p>  Envoi du mail &gt; Filtrage Postfix &gt; Script PHP &gt; Redirection de la notification</p>
</li>
</ul>
<p>Ensuite si l’objet de ce mail correspond à une certaine chaine de caractère</p>
<ul>
<li>le message est transféré sous la forme d’une <strong>notification Push</strong> via <a href="https://pushover.net/" target="_blank" rel="external">Pushover</a> et le mail est supprimé.</li>
</ul>
<p>Si la chaine ne correspond pas</p>
<ul>
<li>le script PHP se charge de transmettre le mail à bonne destination via sendmail.</li>
</ul>
<p>Vous pouvez éditer cette partie si vous n’utilisez pas Pushover</p>
<ul>
<li>vous pouvez transmettre le message à Boxcar</li>
<li>au centre de notification de Mac OS X</li>
<li>dans un fichier texte que vous afficherez sur le bureau avec GeekTool ou tout autre moyen qui vous vient à l’idée.</li>
</ul>
<h2 id="Votre-email-local"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Votre-email-local" class="headerlink" title="Votre email local"></a>Votre email local</h2><p>Pour récupérer le nom de votre compte email local</p>
<ul>
<li>vous pouvez faire comme ça dans le terminal</li>
<li>c’est à cet email que vous enverrez le message :</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"`whoami`@`hostname`"</span></span><br></pre></td></tr></table></figure>
<p>Ce qui donnera quelque chose comme ça : <strong>utilisateur@nomdumac.local</strong></p>
<h2 id="Creer-le-script-PHP"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Creer-le-script-PHP" class="headerlink" title="Créer le script PHP"></a>Créer le script PHP</h2><h3 id="Installer-MailParse"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Installer-MailParse" class="headerlink" title="Installer MailParse"></a>Installer MailParse</h3><p>Tout d’abord</p>
<ul>
<li>il faut installer l’extension <strong>PEAR MailParse</strong> nécessaire à la classe PHP pour décrypter le mail et ensuite inclure celle-ci dans le <strong>php.ini</strong></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo pear install pecl/mailparse</span><br><span class="line">sudo vi /etc/php.ini</span><br><span class="line"> </span><br><span class="line"><span class="comment"># Puis ajouter ceci au php.ini pour activer l'extension</span></span><br><span class="line">extension=mailparse.so</span><br></pre></td></tr></table></figure>
<h3 id="Mime-Mail-Parser"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Mime-Mail-Parser" class="headerlink" title="Mime Mail Parser"></a>Mime Mail Parser</h3><p>Ensuite vous pouvez télécharger la classe qui va bien</p>
<ul>
<li>disponible sur Google Code</li>
<li>pour parser le contenu de l’email et décrypter le MIME (PHP Mime Mail Parser) :</li>
</ul>
<p><a href="https://code.google.com/p/php-mime-mail-parser/" target="_blank" rel="external">https://code.google.com/p/php-mime-mail-parser/</a></p>
<h3 id="Programme-PHP"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Programme-PHP" class="headerlink" title="Programme PHP"></a>Programme PHP</h3><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">require_once</span>(<span class="string">'lib/MimeMailParser.class.php'</span>);</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Pushover</span></span><br><span class="line">$token = <span class="string">"YOUR_APPLICATION_TOKEN"</span>;</span><br><span class="line">$user_key = <span class="string">"YOUR_USER_KEY"</span>;</span><br><span class="line"><span class="comment">// Debug</span></span><br><span class="line">$debug = <span class="keyword">false</span>;</span><br><span class="line">$debug_log_path = <span class="string">"/Users/YOUR_USERNAME/Desktop/"</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// DEBUG : PHP Errors Output</span></span><br><span class="line"><span class="keyword">if</span> ($debug) &#123;</span><br><span class="line">    ini_set(<span class="string">"log_errors"</span></span><br><span class="line">- <span class="number">1</span>);</span><br><span class="line">    ini_set(<span class="string">"error_log"</span></span><br><span class="line">- $debug_log_path.<span class="string">"php-error.log"</span>);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Read message from stdin</span></span><br><span class="line">$fd = fopen(<span class="string">"php://stdin"</span></span><br><span class="line">- <span class="string">"r"</span>);</span><br><span class="line">$email = <span class="string">""</span>;</span><br><span class="line"><span class="keyword">while</span> (!feof($fd)) &#123;</span><br><span class="line">    $line = fread($fd</span><br><span class="line">- <span class="number">1024</span>);</span><br><span class="line">    $email .= $line;</span><br><span class="line">&#125;</span><br><span class="line">fclose($fd);</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Parse mail message</span></span><br><span class="line">$parser = <span class="keyword">new</span> MimeMailParser();</span><br><span class="line">$parser-&gt;parseSource($email</span><br><span class="line">- <span class="string">'string'</span>);</span><br><span class="line">$Subject = iconv_mime_decode($parser-&gt;getHeader(<span class="string">'subject'</span>),<span class="number">0</span>,<span class="string">"UTF-8"</span>);</span><br><span class="line">$Body = trim($parser-&gt;getBody());</span><br><span class="line">$To = $parser-&gt;getHeader(<span class="string">'to'</span>);</span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> ($debug) &#123;</span><br><span class="line">    <span class="comment">// Write to Temp File </span></span><br><span class="line">    $file = fopen($debug_log_path.<span class="string">"postfix-filter.log"</span></span><br><span class="line">- <span class="string">"a"</span>);</span><br><span class="line">    fwrite($file</span><br><span class="line">- <span class="string">"Script successfully ran at "</span>.date(<span class="string">"Y-m-d H:i:s"</span>).<span class="string">"\n"</span>);</span><br><span class="line">    $output = <span class="string">"To:"</span>.$To.<span class="string">" - Subject:"</span>.$Subject.<span class="string">"\n"</span>.$Body.<span class="string">"\n-------\n"</span>;</span><br><span class="line">    fwrite($file</span><br><span class="line">- $output);</span><br><span class="line">    fclose($file);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Send notification and quit if subject match !</span></span><br><span class="line"><span class="keyword">if</span> (preg_match(<span class="string">'/\[CCC\] Sauvegarde/'</span>,$Subject)) &#123;</span><br><span class="line">    <span class="comment">// Send Message with Pushover</span></span><br><span class="line">    curl_setopt_array($ch = curl_init()</span><br><span class="line">- <span class="keyword">array</span>(</span><br><span class="line">        CURLOPT_URL =&gt; <span class="string">"https://api.pushover.net/1/messages.json"</span></span><br><span class="line">- CURLOPT_POSTFIELDS =&gt; <span class="keyword">array</span>(</span><br><span class="line">            <span class="string">"token"</span> =&gt; $token</span><br><span class="line">- <span class="string">"user"</span> =&gt; $user_key</span><br><span class="line">- <span class="string">"device"</span> =&gt; <span class="string">"iPhone"</span></span><br><span class="line">- <span class="string">"sound"</span> =&gt; <span class="string">"magic"</span></span><br><span class="line">- <span class="string">"title"</span> =&gt; $Subject</span><br><span class="line">- <span class="string">"message"</span> =&gt; $Body</span><br><span class="line">        )</span><br><span class="line">    ));</span><br><span class="line">    $curlresult = curl_exec($ch);</span><br><span class="line">    curl_close($ch);</span><br><span class="line">    <span class="keyword">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Continue transfering the message via sendmail</span></span><br><span class="line">$sendmail = <span class="string">'/usr/sbin/sendmail -G -i '</span> . $argv[<span class="number">2</span>];</span><br><span class="line">$handle = popen($sendmail</span><br><span class="line">- <span class="string">'w'</span>);</span><br><span class="line">fwrite($handle</span><br><span class="line">- $email);</span><br><span class="line">$sendmail_return_value = pclose($handle);</span><br></pre></td></tr></table></figure>
<h3 id="Rendre-le-fichier-executable-et-Test"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Rendre-le-fichier-executable-et-Test" class="headerlink" title="Rendre le fichier exécutable et Test"></a>Rendre le fichier exécutable et Test</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Rendre le fichier PHP exécutable</span></span><br><span class="line">chmod a+x postfix-filter.php</span><br><span class="line"><span class="comment"># Par la suite pour tester vous pourrez faire comme ça :</span></span><br><span class="line">postfix-filter.php SENDER RECIPIENT 0 &lt; ~/Desktop/mime.mail.exemple.message.txt</span><br></pre></td></tr></table></figure>
<h2 id="Du-cote-de-Postfix"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Du-cote-de-Postfix" class="headerlink" title="Du côté de Postfix"></a>Du côté de Postfix</h2><h3 id="Editez-le-fichier-master-cf-de-Postfix"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Editez-le-fichier-master-cf-de-Postfix" class="headerlink" title="Editez le fichier master.cf de Postfix"></a>Editez le fichier <strong>master.cf</strong> de Postfix</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/postfix/master.cf</span><br></pre></td></tr></table></figure>
<p>Ajoutez la règle de filtrage suivante :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">smtpd     pass  -       -       n       -       -       smtpd</span><br><span class="line">  -o content_filter=myAwesomeFilter:dummy</span><br></pre></td></tr></table></figure>
<p>Et à la fin du fichier ajoutez la ligne correspondant au filtre à appliquer</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">myAwesomeFilter   unix  -       n       n       -       -      pipe</span><br><span class="line">  flags=F user=YOUR_USERNAME argv=/path/to/the/script/postfix-filter.php <span class="variable">$&#123;size&#125;</span> <span class="variable">$&#123;sender&#125;</span> <span class="variable">$&#123;recipient&#125;</span></span><br></pre></td></tr></table></figure>
<p>Redémarrez Postfix</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo postfix reload</span><br></pre></td></tr></table></figure>
<p>Une fois les différents éléments du programme configurés avec vos paramètres</p>
<ul>
<li><p>vous pouvez transmettre un mail via l’application externe à votre nom d’utilisateur.<br>(Ne fonctionne pas dans cette configuration avec sendmail)</p>
<p>  Email : utilisateur@nomdumac.local<br>  Serveur : localhost<br>  Destinataire : utilisateur ou utilisateur@nomdumac.local</p>
</li>
</ul>
<p>Pour déboguer le mail :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail <span class="_">-f</span> /var/<span class="built_in">log</span>/mail.log</span><br></pre></td></tr></table></figure>
<p>Vous devriez avoir une ligne du type</p>
<pre><code>myMac.local postfix/pipe[8318]: 1778B30FDD0E: to=&lt;username@myMac.local&gt;, relay=myAwesomefilter, delay=1.6, delays=0.04/0.01/0/1.6, dsn=2.0.0, status=sent (delivered via myAwesomefilter service)
</code></pre><h2 id="Liens"><a href="https://lab.inspira.io/2014/redirigez-un-email-vers-une-autre-application-avec-postfix-et-php-sous-mac-os-x.html#Liens" class="headerlink" title="Liens"></a>Liens</h2><ul>
<li><a href="http://blog.thecodingmachine.com/fr/content/triggering-php-script-when-your-postfix-server-receives-mail" target="_blank" rel="external">Triggering a PHP script when your Postfix server receives a mail by David Négrier</a></li>
<li><a href="http://www.postfix.org/FILTER_README.html" target="_blank" rel="external">Postfix After-Queue Content Filter</a></li>
</ul>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Souvent certaines applications ne proposent que l’envoi d’un email comme procédé pour vous avertir d’un évènement, c’est le cas par exemple du logiciel de sauvegarde Carbon Copy Cloner.</p>]]>
    
    </summary>
    
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="notification" scheme="https://lab.inspira.io/tags/notification/"/>
    
      <category term="message" scheme="https://lab.inspira.io/tags/message/"/>
    
      <category term="push" scheme="https://lab.inspira.io/tags/push/"/>
    
      <category term="content" scheme="https://lab.inspira.io/tags/content/"/>
    
      <category term="content_filter" scheme="https://lab.inspira.io/tags/content-filter/"/>
    
      <category term="contenu" scheme="https://lab.inspira.io/tags/contenu/"/>
    
      <category term="email" scheme="https://lab.inspira.io/tags/email/"/>
    
      <category term="filter" scheme="https://lab.inspira.io/tags/filter/"/>
    
      <category term="filtering" scheme="https://lab.inspira.io/tags/filtering/"/>
    
      <category term="filtrage" scheme="https://lab.inspira.io/tags/filtrage/"/>
    
      <category term="Linux" scheme="https://lab.inspira.io/tags/linux/"/>
    
      <category term="Mac OS X" scheme="https://lab.inspira.io/tags/mac-os-x/"/>
    
      <category term="mail" scheme="https://lab.inspira.io/tags/mail/"/>
    
      <category term="mime" scheme="https://lab.inspira.io/tags/mime/"/>
    
      <category term="parser" scheme="https://lab.inspira.io/tags/parser/"/>
    
      <category term="php" scheme="https://lab.inspira.io/tags/php/"/>
    
      <category term="postfix" scheme="https://lab.inspira.io/tags/postfix/"/>
    
      <category term="queue" scheme="https://lab.inspira.io/tags/queue/"/>
    
      <category term="redirect" scheme="https://lab.inspira.io/tags/redirect/"/>
    
      <category term="redirection" scheme="https://lab.inspira.io/tags/redirection/"/>
    
      <category term="sendmail" scheme="https://lab.inspira.io/tags/sendmail/"/>
    
      <category term="smtpd" scheme="https://lab.inspira.io/tags/smtpd/"/>
    
      <category term="transfer" scheme="https://lab.inspira.io/tags/transfer/"/>
    
      <category term="transmit" scheme="https://lab.inspira.io/tags/transmit/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Imprimer une page web dans Readdle Printer Pro depuis Safari]]></title>

    <link href="https://lab.inspira.io/2013/imprimer-une-page-web-dans-readdle-printer-pro-depuis-safari.html"/>
    <id>https://lab.inspira.io/2013/imprimer-une-page-web-dans-readdle-printer-pro-depuis-safari.html</id>
    <published>2013-11-28T23:00:00.000Z</published>
    <updated>2013-11-28T23:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://lab.inspira.io/categories/tips" class="tips_label">Tips</a></p>
<p>Si vous utilisez l’application de Readdle, Printer Pro, vous avez la possibilité d’imprimer ou réaliser un PDF d’une page internet. Avec cette astuce, vous pourrez ouvrir la page directement dans Printer Pro en cliquant sur un signet de Safari.</p>
<ol>
<li>Copier le code suivant :</li>
</ol>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">javascript:<span class="keyword">void</span>((function()%<span class="number">7</span>Bwindow.location%<span class="number">3</span>D%<span class="number">27</span>p%<span class="number">27</span>%<span class="number">2</span>Bwindow.location.href%<span class="number">3</span>B%<span class="number">7</span>D)())</span><br></pre></td></tr></table></figure>
<ol>
<li><strong>Créer un nouveau signet</strong> de cette page dans Safari.</li>
<li><strong>Modifier le signet</strong> et remplacer le lien du signet par le code.</li>
</ol>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><a href="https://lab.inspira.io/categories/tips" class="tips_label">Tips</a></p>
<p>Si vous utilisez l’application de Readdle, Printer Pro, vous avez la possib]]>
    
    </summary>
    
      <category term="Tips" scheme="https://lab.inspira.io/categories/tips/"/>
    
    
      <category term="web" scheme="https://lab.inspira.io/tags/web/"/>
    
      <category term="impression" scheme="https://lab.inspira.io/tags/impression/"/>
    
      <category term="ios" scheme="https://lab.inspira.io/tags/ios/"/>
    
      <category term="ipad" scheme="https://lab.inspira.io/tags/ipad/"/>
    
      <category term="iphone" scheme="https://lab.inspira.io/tags/iphone/"/>
    
      <category term="javascript" scheme="https://lab.inspira.io/tags/javascript/"/>
    
      <category term="printer" scheme="https://lab.inspira.io/tags/printer/"/>
    
      <category term="pro" scheme="https://lab.inspira.io/tags/pro/"/>
    
      <category term="readdle" scheme="https://lab.inspira.io/tags/readdle/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Wunderlist 2 sur votre bureau avec GeekTool]]></title>

    <link href="https://lab.inspira.io/2013/wunderlist-2-sur-votre-bureau-avec-geektool.html"/>
    <id>https://lab.inspira.io/2013/wunderlist-2-sur-votre-bureau-avec-geektool.html</id>
    <published>2013-06-12T22:00:00.000Z</published>
    <updated>2013-06-12T22:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Edit 1: La méthode décrite ci-dessous ne fonctionne plus, l’application Wunderlist 3 pour Mac semble ne plus utiliser la base SQLite pour stocker les rappels</p>
<p>Edit 2: Wunderlist a publié son API et si vous utilisez <a href="http://tracesof.net/uebersicht/" target="_blank" rel="external">Ubersicht</a> vous pouvez utiliser ce widget de <a href="https://github.com/NikitaBazhenov" target="_blank" rel="external">NikitaBazhenov</a> : <a href="https://github.com/NikitaBazhenov/UbersichtWunderlistTasks" target="_blank" rel="external">UbersichtWunderlistTasks</a></p>
<p>Pour le moment il n’existe pas d’API pour Wunderlist qui permettrait de réceptionner les données pour les traiter dans un script, la seule solution pour l’instant est de récupérer les informations de la base de données Sqlite locale qu’utilise le programme Wunderlist sous Mac OsX.</p>
<a id="more"></a>
<p>Cette astuce implique que vous ayez <strong>Wunderlist 2</strong> d’installer sur votre Mac et qu’il soit lancé pour effectuer la synchronisation des données locales avec le serveur de Wunderlist.</p>
<p>Vous pouvez adapter le script à votre convenance pour changer les couleurs de la liste ou inverser le point si vous souhaitez qu’elle soit alignée au fer à droite.<br>Le script affiche la liste des tâches par catégories, la date d’échéance, les sous-tâches et si celle-ci est prioritaire.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span><br><span class="line"> </span></span><br><span class="line">WUNDERDB=WKModel.sqlite</span><br><span class="line"><span class="built_in">cd</span> ~/Library/Containers/com.wunderkinder.wunderlistdesktop/Data/Library/Application\ Support/Wunderlist/</span><br><span class="line"> </span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">printTask</span></span>()&#123;</span><br><span class="line">    TASK=<span class="string">"<span class="variable">$1</span>"</span></span><br><span class="line">    task_name=$(<span class="built_in">echo</span> <span class="variable">$TASK</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 2)</span><br><span class="line">    task_id=$(<span class="built_in">echo</span> <span class="variable">$TASK</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 1)</span><br><span class="line">    task_date=$(<span class="built_in">echo</span> <span class="variable">$TASK</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 4)</span><br><span class="line"> </span><br><span class="line">    <span class="comment"># DATE  </span></span><br><span class="line">    <span class="keyword">if</span> [[ <span class="string">"<span class="variable">$task_date</span>"</span> =~ [0-9]+ ]]; <span class="keyword">then</span> due_date=<span class="string">"\033[36m ("</span>$( date -r$((<span class="variable">$task_date</span>+978346800)) +<span class="string">"%d/%m %H:%M"</span> )<span class="string">")\033[0m "</span>; <span class="keyword">else</span> due_date=<span class="string">""</span>; <span class="keyword">fi</span></span><br><span class="line"> </span><br><span class="line">    <span class="comment"># NAME</span></span><br><span class="line">    <span class="keyword">if</span> [[ `<span class="built_in">echo</span> <span class="variable">$TASK</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 3` <span class="_">-eq</span> 1 ]]; <span class="keyword">then</span></span><br><span class="line">            <span class="comment"># STARRED</span></span><br><span class="line">            <span class="built_in">echo</span> <span class="_">-e</span> `tput setab 0` <span class="string">'\033[1;31m• \033[0m'</span> `tput setab 9` <span class="variable">$task_name</span> <span class="string">"<span class="variable">$due_date</span>"</span></span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            <span class="comment"># NOT STARRED</span></span><br><span class="line">            <span class="built_in">echo</span> <span class="_">-e</span> `tput setab 9` <span class="string">'• '</span> `tput setab 9` <span class="variable">$task_name</span> <span class="string">"<span class="variable">$due_date</span>"</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line"> </span><br><span class="line">    <span class="comment"># SUBTASK</span></span><br><span class="line">    sqlite3 <span class="variable">$WUNDERDB</span> <span class="string">"select Z_PK, ZTITLE, ZSTARRED, ZPARENTTASK from ZRESOURCE where ZPARENTTASK="</span><span class="variable">$task_id</span><span class="string">" ORDER BY ZORDERINDEXDOUBLE"</span> | <span class="keyword">while</span> <span class="built_in">read</span> SUBTASK; <span class="keyword">do</span></span><br><span class="line">        subtask_name=$(<span class="built_in">echo</span> <span class="variable">$SUBTASK</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 2)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"      › "</span><span class="variable">$subtask_name</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment"># BOITE DE RECEPTION</span></span><br><span class="line">tput setab 0; <span class="built_in">echo</span> <span class="_">-e</span> <span class="string">"\033[1;36m  BOÎTE DE RECEPTION  \033[0m"</span>; tput setab 9;</span><br><span class="line">sqlite3 <span class="variable">$WUNDERDB</span> <span class="string">"select Z_PK, ZTITLE, ZSTARRED, ZDUEDATE from ZRESOURCE where ZTASKLIST isnull and ZCOMPLETEDAT isnull and ZOWNER1 isnull and ZPARENTTASK isnull ORDER BY ZORDERINDEXDOUBLE"</span> | <span class="keyword">while</span> <span class="built_in">read</span> TASK; <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">print</span>Task   <span class="string">"<span class="variable">$TASK</span>"</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"> </span><br><span class="line"><span class="comment"># CATEGORIES</span></span><br><span class="line">sqlite3 <span class="variable">$WUNDERDB</span> <span class="string">"select Z_PK, ZTITLE from ZRESOURCE where ZOWNER1=1;"</span> | <span class="keyword">while</span> <span class="built_in">read</span> CAT; <span class="keyword">do</span></span><br><span class="line"> </span><br><span class="line">    the_name=`<span class="built_in">echo</span> <span class="_">-e</span> <span class="string">"<span class="variable">$CAT</span>"</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 2 | tr <span class="string">'[:lower:]'</span> <span class="string">'[:upper:]'</span>`</span><br><span class="line">    the_id=`<span class="built_in">echo</span> <span class="variable">$CAT</span> | cut <span class="_">-d</span> <span class="string">'|'</span> <span class="_">-f</span> 1`</span><br><span class="line">    i=0</span><br><span class="line"> </span><br><span class="line">    sqlite3 <span class="variable">$WUNDERDB</span> <span class="string">"select Z_PK, ZTITLE, ZSTARRED, ZDUEDATE from ZRESOURCE where ZTASKLIST="</span><span class="variable">$the_id</span><span class="string">" and ZCOMPLETEDAT isnull ORDER BY ZORDERINDEXDOUBLE"</span> | <span class="keyword">while</span> <span class="built_in">read</span> TASK; <span class="keyword">do</span></span><br><span class="line">        i=$((i+1))</span><br><span class="line">        <span class="keyword">if</span> [[ <span class="variable">$i</span> <span class="_">-eq</span> 1 ]]; <span class="keyword">then</span> <span class="built_in">echo</span> <span class="_">-e</span> <span class="string">"\n"</span>; tput setab 0; <span class="built_in">echo</span> <span class="_">-e</span> <span class="string">"\033[1;36m <span class="variable">$the_name</span> \033[0m"</span>; tput setab 9; <span class="keyword">fi</span> </span><br><span class="line">        <span class="built_in">print</span>Task   <span class="string">"<span class="variable">$TASK</span>"</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Edit 1: La méthode décrite ci-dessous ne fonctionne plus, l’application Wunderlist 3 pour Mac semble ne plus utiliser la base SQLite pour stocker les rappels</p>
<p>Edit 2: Wunderlist a publié son API et si vous utilisez <a href="http://tracesof.net/uebersicht/">Ubersicht</a> vous pouvez utiliser ce widget de <a href="https://github.com/NikitaBazhenov">NikitaBazhenov</a> : <a href="https://github.com/NikitaBazhenov/UbersichtWunderlistTasks">UbersichtWunderlistTasks</a></p>
<p>Pour le moment il n’existe pas d’API pour Wunderlist qui permettrait de réceptionner les données pour les traiter dans un script, la seule solution pour l’instant est de récupérer les informations de la base de données Sqlite locale qu’utilise le programme Wunderlist sous Mac OsX.</p>]]>
    
    </summary>
    
    
      <category term="display" scheme="https://lab.inspira.io/tags/display/"/>
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="desktop" scheme="https://lab.inspira.io/tags/desktop/"/>
    
      <category term="afficher" scheme="https://lab.inspira.io/tags/afficher/"/>
    
      <category term="bash" scheme="https://lab.inspira.io/tags/bash/"/>
    
      <category term="geektool" scheme="https://lab.inspira.io/tags/geektool/"/>
    
      <category term="lion" scheme="https://lab.inspira.io/tags/lion/"/>
    
      <category term="liste" scheme="https://lab.inspira.io/tags/liste/"/>
    
      <category term="mountain" scheme="https://lab.inspira.io/tags/mountain/"/>
    
      <category term="tâches" scheme="https://lab.inspira.io/tags/taches/"/>
    
      <category term="task" scheme="https://lab.inspira.io/tags/task/"/>
    
      <category term="wunderlist" scheme="https://lab.inspira.io/tags/wunderlist/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Créer, convertir et attacher une image Sparse encryptée]]></title>

    <link href="https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html"/>
    <id>https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html</id>
    <published>2013-03-01T23:00:00.000Z</published>
    <updated>2013-03-01T23:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://lab.inspira.io/categories/tips" class="tips_label">Tips</a></p>
<h2 id="Creer-une-image-encryptee"><a href="https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html#Creer-une-image-encryptee" class="headerlink" title="Créer une image encryptée"></a>Créer une image encryptée</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> -n <span class="string">"votremotdepasse"</span> | hdiutil create -encryption <span class="string">"AES-256"</span> -stdinpass -size 200g -type SPARSE -fs HFS+ -volname ImageEnc.sparseimage</span><br></pre></td></tr></table></figure>
<h2 id="Convertir-une-image-normale-en-image-cryptee"><a href="https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html#Convertir-une-image-normale-en-image-cryptee" class="headerlink" title="Convertir une image normale en image cryptée"></a>Convertir une image normale en image cryptée</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> -n <span class="string">"votremotdepasse"</span> | hdiutil convert Image.sparseimage -format UDSP -o Image.enc.sparseimage -encryption <span class="string">"AES-256"</span> -stdinpass</span><br></pre></td></tr></table></figure>
<h2 id="Monter-une-image-encryptee"><a href="https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html#Monter-une-image-encryptee" class="headerlink" title="Monter une image encryptée"></a>Monter une image encryptée</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> -n <span class="string">"votremotdepasse"</span> | hdiutil attach -stdinpass Image.enc.sparseimage</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      <![CDATA[<p><a href="https://lab.inspira.io/categories/tips" class="tips_label">Tips</a></p>
<h2 id="Creer-une-image-encryptee"><a href="https://lab.inspira.io/2013/creer-convertir-et-attacher-une-image-sparse-encryptee.html#Creer-une-image-encryptee" class=]]>
    
    </summary>
    
      <category term="Tips" scheme="https://lab.inspira.io/categories/tips/"/>
    
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="bash" scheme="https://lab.inspira.io/tags/bash/"/>
    
      <category term="attach" scheme="https://lab.inspira.io/tags/attach/"/>
    
      <category term="convert" scheme="https://lab.inspira.io/tags/convert/"/>
    
      <category term="convertir" scheme="https://lab.inspira.io/tags/convertir/"/>
    
      <category term="crypté" scheme="https://lab.inspira.io/tags/crypte/"/>
    
      <category term="encryption" scheme="https://lab.inspira.io/tags/encryption/"/>
    
      <category term="monter" scheme="https://lab.inspira.io/tags/monter/"/>
    
      <category term="sécurité" scheme="https://lab.inspira.io/tags/securite/"/>
    
      <category term="sparcebundle" scheme="https://lab.inspira.io/tags/sparcebundle/"/>
    
      <category term="sparseimage" scheme="https://lab.inspira.io/tags/sparseimage/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Afficher/Masquer les icônes du bureau sous Mac OS X]]></title>

    <link href="https://lab.inspira.io/2013/afficher-masquer-les-icones-du-bureau-sous-mac-os-x.html"/>
    <id>https://lab.inspira.io/2013/afficher-masquer-les-icones-du-bureau-sous-mac-os-x.html</id>
    <published>2013-02-25T23:00:00.000Z</published>
    <updated>2013-02-25T23:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Voici un petit bout de code pour masquer ou afficher le bureau et ses icones sous mac osx, ça le désactive totalement, donc vous n’aurez plus accès aux raccourcis clavier du finder ou au glisser-déposer en étant sur le bureau.<br>Il suffit de lancer ce script via un gestionnaire de raccourcis tel que Spark ou BetterTouchTool.</p>
<a id="more"></a>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span><br><span class="line"> </span></span><br><span class="line"><span class="keyword">if</span> [[ `defaults <span class="built_in">read</span> com.apple.finder CreateDesktop` <span class="_">-eq</span> 1 ]]; <span class="keyword">then</span></span><br><span class="line">    defaults write com.apple.finder CreateDesktop -bool <span class="literal">false</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    defaults write com.apple.finder CreateDesktop -bool <span class="literal">true</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">killall Finder</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Voici un petit bout de code pour masquer ou afficher le bureau et ses icones sous mac osx, ça le désactive totalement, donc vous n’aurez plus accès aux raccourcis clavier du finder ou au glisser-déposer en étant sur le bureau.<br>Il suffit de lancer ce script via un gestionnaire de raccourcis tel que Spark ou BetterTouchTool.</p>]]>
    
    </summary>
    
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="bureau" scheme="https://lab.inspira.io/tags/bureau/"/>
    
      <category term="desktop" scheme="https://lab.inspira.io/tags/desktop/"/>
    
      <category term="icones" scheme="https://lab.inspira.io/tags/icones/"/>
    
      <category term="afficher" scheme="https://lab.inspira.io/tags/afficher/"/>
    
      <category term="bash" scheme="https://lab.inspira.io/tags/bash/"/>
    
      <category term="hide" scheme="https://lab.inspira.io/tags/hide/"/>
    
      <category term="icons" scheme="https://lab.inspira.io/tags/icons/"/>
    
      <category term="masquer" scheme="https://lab.inspira.io/tags/masquer/"/>
    
      <category term="show" scheme="https://lab.inspira.io/tags/show/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Notification Push avec Pushover (en Bash)]]></title>

    <link href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html"/>
    <id>https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html</id>
    <published>2013-01-26T23:00:00.000Z</published>
    <updated>2018-03-17T13:54:21.777Z</updated>
    
    <content type="html"><![CDATA[<p>Si vous avez des applications à monitorer, des scripts de sauvegardes et que vous souhaitez vous assurer du bon déroulement du programme ou simplement être averti d’un évènement, la première méthode qui vient à l’esprit et de s’envoyer un email récapitulatif.<br>J’ai cherché une solution qui me permettrait de recevoir des <strong>notifications Push</strong> sur mon iBidule, et j’ai découvert un service qui correspondait exactement à ce que je souhaitais.</p>
<a id="more"></a>
<h3 id="Bash-Script-Update-v-1-6"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Bash-Script-Update-v-1-6" class="headerlink" title="Bash Script Update - v.1.6"></a>Bash Script Update - v.1.6</h3><pre><code>12-03-2018 : Added image attachment
30-01-2016 : Added -getopts- arguments to set retry/expire
23-04-2015 : HTML markup language option
</code></pre><h2 id="Pushover-iOS"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Pushover-iOS" class="headerlink" title="Pushover iOS"></a>Pushover iOS</h2><p><strong>Pushover</strong> est une application qui <strong>existe aussi bien pour iOS que pour Android</strong> et qui permet de vous envoyer des notifications depuis vos programmes. Pour utiliser le service, vous devez acquérir l’application pour environ 4€. Vous pourrez ensuite transmettre des notifications à hauteur de 7500 messages par mois. Différents exemples d’utilisation de l’API sont disponibles sur le site.</p>
<p>Site de Pushover : <a href="https://pushover.net/" target="_blank" rel="external">pushover.net</a><br>Pushover iOS : <a href="https://itunes.apple.com/us/app/pushover-notifications/id506088175?ls=1&amp;mt=8" target="_blank" rel="external">itunes.apple.com</a><br>Pushover Android : <a href="https://play.google.com/store/apps/details?id=net.superblock.pushover&amp;ts=1359296372" target="_blank" rel="external">play.google.com</a></p>
<h2 id="Pushover"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Pushover" class="headerlink" title="Pushover"></a>Pushover</h2><ol>
<li><p>Vous achetez <strong>Pushover sur l’App Store ou Google Play</strong>, vous obtenez une clé utilisateur à utiliser dans vos applications. Un email est également fourni pour les applications ou vous ne pouvez intégrer l’API, un message envoyé à cet email est transmis à l’application mobile.</p>
</li>
<li><p>Ensuite, vous installez l’application et déclarez ainsi les <strong>différents appareils mobiles</strong> que vous avez. Ceci permet d’envoyer la notification à tout les appareils, ou uniquement à un appareil précis.</p>
</li>
<li><p>Enfin, vous <strong>créez des applications sur l’interface web de Pushover</strong>, en sélectionnant un intitulé, une icone, vous obtenez ainsi une clé pour chacune des applications créées. Vous pouvez ainsi, soit envoyer un message par défaut ou bien envoyer un message à une application, et celui-ci sera affiché avec l’icone et l’intitulé par défaut si aucun titre n’est fournie.<br>Pour ma part j’ai créé trois applications, avec trois icônes distinctes : monitoring, backup et alert.</p>
</li>
</ol>
<p>J’apprécie ce type de service, simple en apparence et terriblement efficace.</p>
<p>Donc ce que je vous propose, c’est un <strong>script en Bash</strong> qui permet d’<strong>envoyer des notifications</strong> depuis vos applications via le service de Pushover.</p>
<h2 id="Le-Script-en-Bash"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Le-Script-en-Bash" class="headerlink" title="Le Script en Bash"></a>Le Script en Bash</h2><p>Pour utiliser ce programme, copier le code dans un fichier nommé <strong>pushover</strong> dans un dossier accessible à tout les utilisateurs (ex: <code>/usr/local/bin/pushover</code>).</p>
<p>Ensuite, après avoir acheté Pushover et configuré les différentes applications sur l’interface web, vous pouvez éditer l’entête du script. <strong>Ajoutez la clé utilisateur hash</strong> personnelle, que vous trouverez sur le site.</p>
<p>Pour les applications, imaginez que vous avez une application MONITORING avec une icône, vous pouvez créer une variable MONITORING_TOKEN contenant la clé hash fournie pour l’application. Ensuite pour envoyer un message à cette application précise, vous aurez juste à ajouter :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/<span class="built_in">local</span>/bin/pushover <span class="_">-a</span> monitoring</span><br></pre></td></tr></table></figure>
<p>Pour ensuite obtenir le détail des options, vous pouvez taper dans le terminal :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pushover -h</span><br></pre></td></tr></table></figure>
<p>Pour transmettre un message, vous pouvez définir le titre, le message, l’application de destination, la priorité, le son (à choisir parmi ceux disponibles dans l’application), un lien, un titre pour ce lien, et un appareil.<br>Concernant <strong>la priorité</strong>, sur le site web, vous pouvez définir des heures où vous souhaitez ne pas être dérangé. En mettant une priorité à 1, cette option n’est pas prise en compte, et la priorité du message sera haute, si vous définissez une priorité sur -1, le message sera délivré, mais sans alerte sonore.</p>
<p>Ce programme est écris en Bash pour usage sur un serveur ou depuis mes applications de sauvegardes, mais vous pouvez intégrer le service dans de nombreuses applications, comme en PHP sur votre site.</p>
<script src="https://gist.github.com/9108fd745ef83a7a6f21.js?file=pushover"></script>
<h2 id="Push-Notification-avec-Fail2Ban"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Push-Notification-avec-Fail2Ban" class="headerlink" title="Push Notification avec Fail2Ban"></a>Push Notification avec Fail2Ban</h2><p>Un exemple concret peut être l’usage de ce script avec Fail2Ban, une fois le script configuré et fonctionnel, vous pouvez éditer la configuration de Fail2Ban pour recevoir des notifications sur l’application Pushover.</p>
<h3 id="Editez-le-fichier-jail-local"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Editez-le-fichier-jail-local" class="headerlink" title="Editez le fichier jail.local"></a>Editez le fichier jail.local</h3><p>Créez une nouvelle règle action :</p>
<figure class="highlight pl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">action_nmwl = %(banaction)<span class="keyword">s</span>[name=%(__name_<span class="number">_</span>)<span class="keyword">s</span>, port=<span class="string">"%(port)s"</span>, protocol=<span class="string">"%(protocol)s]</span><br><span class="line">                pushover[name=%(__name__)s, dest="</span>%(destemail)<span class="keyword">s</span><span class="string">", logpath=%(logpath)s]</span><br><span class="line">               %(mta)s-whois-lines[name=%(__name__)s, dest="</span>%(destemail)<span class="keyword">s</span><span class="string">", logpath=%(logpath)s]</span><br><span class="line"></span><br><span class="line">action = %(action_nmwl)s</span></span><br></pre></td></tr></table></figure>
<p>Cette règle utilise l’envoi d’un mail avec un rapport complet, et une notification via Pushover.<br>Dans vos règles plus bas, vous pouvez choisir l’action, soit un simple mail, soit un rapport complet avec notification pushover…</p>
<p>Dans le dossier <strong>action.d</strong>, créez un nouveau fichier <strong>pushover.conf</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[Definition]</span><br><span class="line">actionstart = /usr/<span class="built_in">local</span>/bin/pushover -t <span class="string">"[Fail2Ban]  started"</span> -m <span class="string">"The jail  has been started successfully."</span> <span class="_">-a</span> monitor -p-1</span><br><span class="line">actionstop = /usr/<span class="built_in">local</span>/bin/pushover -t <span class="string">"[Fail2Ban]  stopped"</span> -m <span class="string">"The jail  has been stopped."</span> <span class="_">-a</span> monitor -p-1</span><br><span class="line">actionban = /usr/<span class="built_in">local</span>/bin/pushover -t <span class="string">"[Fail2Ban]  banned "</span> -m <span class="string">"The IP  has just been banned by Fail2Ban after  attempts against ."</span> <span class="_">-a</span> alert <span class="_">-s</span> Gamelan</span><br><span class="line">actionunban =</span><br></pre></td></tr></table></figure>
<p>Testez l’action de <strong>actionban</strong> avant, pour ma part j’ai ajouté une ligne plus complète qui récupère les coordonnées GPS en fonction de l’IP et qui ajoute au message un lien vers Google Map :</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">actionban = /usr/<span class="built_in">local</span>/bin/pushover -t <span class="string">"[Fail2Ban]  banned "</span> -m <span class="string">"The IP  (`/usr/local/bin/geoip  | sed -n '2,3p' | tr '\n' ' ' | sed 's/ *$//'`) has just been banned by Fail2Ban after  attempts against ."</span> <span class="_">-a</span> alert <span class="_">-s</span> Gamelan -n <span class="string">"Google Map"</span> -u <span class="string">"http://maps.google.com/maps?q=`/usr/local/bin/geoip  | sed -n '7,8p' | tr '\n' ',' | sed 's/,$//'`"</span></span><br></pre></td></tr></table></figure>
<h2 id="Notification-connection-Shell"><a href="https://lab.inspira.io/2013/notification-push-avec-pushover-en-bash.html#Notification-connection-Shell" class="headerlink" title="Notification connection Shell"></a>Notification connection Shell</h2><p>Si vous souhaitez être averti de toute connection au shell via ssh.</p>
<p>Dans le fichier <strong>/etc/bash.bashrc</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/<span class="built_in">local</span>/bin/pushover <span class="_">-a</span> alert -t <span class="string">"[SSH] `whoami | tr '[:lower:]' '[:upper:]'` LOGIN @ `date +'%d %b %T'` "</span> -m <span class="string">"Nouvelle connexion de : `who | grep <span class="variable">$(whoami)</span>` [IP `echo <span class="variable">$SSH_CLIENT</span> | cut -d ' ' -f 1`] on server"</span> <span class="_">-s</span> Bugle &amp;gt; /dev/null</span><br></pre></td></tr></table></figure>
<p>Éditez et tester les règles à votre convenance.<br>À partir de là vous pouvez vous envoyer des notifications depuis tout programme, être alerté d’une connection à une interface d’administration, être averti du bon déroulement d’une sauvegarde, monitorer un serveur…</p>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Si vous avez des applications à monitorer, des scripts de sauvegardes et que vous souhaitez vous assurer du bon déroulement du programme ou simplement être averti d’un évènement, la première méthode qui vient à l’esprit et de s’envoyer un email récapitulatif.<br>J’ai cherché une solution qui me permettrait de recevoir des <strong>notifications Push</strong> sur mon iBidule, et j’ai découvert un service qui correspondait exactement à ce que je souhaitais.</p>]]>
    
    </summary>
    
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="bash" scheme="https://lab.inspira.io/tags/bash/"/>
    
      <category term="alerte" scheme="https://lab.inspira.io/tags/alerte/"/>
    
      <category term="monitoring" scheme="https://lab.inspira.io/tags/monitoring/"/>
    
      <category term="notification" scheme="https://lab.inspira.io/tags/notification/"/>
    
      <category term="message" scheme="https://lab.inspira.io/tags/message/"/>
    
      <category term="push" scheme="https://lab.inspira.io/tags/push/"/>
    
      <category term="server" scheme="https://lab.inspira.io/tags/server/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Réduire sa bande passante (bandwidth throttling)]]></title>

    <link href="https://lab.inspira.io/2012/reduire-sa-bande-passante-bandwidth-throttling.html"/>
    <id>https://lab.inspira.io/2012/reduire-sa-bande-passante-bandwidth-throttling.html</id>
    <published>2012-03-04T23:00:00.000Z</published>
    <updated>2015-05-26T16:50:05.000Z</updated>
    
    <content type="html"><![CDATA[<p>Il arrive parfois lors d’un développement web que l’on souhaite réduire sa vitesse de connexion afin de pouvoir tester le chargement des pages et des ressources, si vous travaillez sous Mac OsX voici une astuce qui va vous permettre de réduire votre bande passante en utilisant le firewall intégré ipfw.</p>
<ol>
<li>Dans un premier temps, création d’un pipe :</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ipfw pipe 1 config bw 15KByte/s</span><br></pre></td></tr></table></figure>
<ol>
<li>Ensuite ajout du tunnel au firewall :</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo ipfw add 100 pipe 1 src-port 80</span><br><span class="line"><span class="comment"># OU BIEN UNIQUEMENT EN LOCAL</span></span><br><span class="line">sudo ipfw add 100 pipe 1 ip from any to 127.0.0.1 src-port 80</span><br><span class="line"><span class="comment">#POUR VOIR LA LISTE DES TUNNELS</span></span><br><span class="line">sudo ipfw list</span><br></pre></td></tr></table></figure>
<ol>
<li>Pour supprimer la limitation :</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo ipfw delete 100</span><br><span class="line"><span class="comment"># ou</span></span><br><span class="line">ipfw pipe 1 delete</span><br><span class="line"><span class="comment"># ou</span></span><br><span class="line">ipfw pipe flush</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Il arrive parfois lors d’un développement web que l’on souhaite réduire sa vitesse de connexion afin de pouvoir tester le chargement des ]]>
    
    </summary>
    
    
      <category term="bandwidth" scheme="https://lab.inspira.io/tags/bandwidth/"/>
    
      <category term="connexion" scheme="https://lab.inspira.io/tags/connexion/"/>
    
      <category term="développement" scheme="https://lab.inspira.io/tags/developpement/"/>
    
      <category term="ipfw" scheme="https://lab.inspira.io/tags/ipfw/"/>
    
      <category term="réduire" scheme="https://lab.inspira.io/tags/reduire/"/>
    
      <category term="throttling" scheme="https://lab.inspira.io/tags/throttling/"/>
    
      <category term="vitesse" scheme="https://lab.inspira.io/tags/vitesse/"/>
    
      <category term="web" scheme="https://lab.inspira.io/tags/web/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Mac OsX – Sauvegardez/Restaurez la position des icônes du bureau]]></title>

    <link href="https://lab.inspira.io/2010/mac-osx-sauvegardez-restaurez-la-position-des-icones-du-bureau.html"/>
    <id>https://lab.inspira.io/2010/mac-osx-sauvegardez-restaurez-la-position-des-icones-du-bureau.html</id>
    <published>2010-01-28T23:00:00.000Z</published>
    <updated>2015-05-26T17:11:09.000Z</updated>
    
    <content type="html"><![CDATA[<p>Il peut arriver que lorsque l’on a une configuration multi-écran, que les icônes du bureau, faute de place, se repositionnent automatiquement et se retrouvent mélangées.<br>Si vous cherchez une solution qui permet de sauvegarder et restaurer la position des icônes du bureau de MacOSX, je vous conseille ce programme Applescript réalisé par Gregory J. Parker.</p>
<a id="more"></a>
<p><img src="https://lab.inspira.io/static/2010/01/dim.png" alt=""></p>
<p>Pour télécharger Dektop Icon Manager : <a href="http://www.parker9.com/desktopIconManager2.0.html" target="_blank" rel="external">http://www.parker9.com/desktopIconManager2.0.html</a></p>
<p>Il suffit d’installer le programme compilé et de le lancer pour sauvegarder ou restaurer la position. Le programme est réalisé sous Applescript Studio, vous disposez donc d’une petite interface et les informations sont stockées dans un fichier de préférence de votre bibliothèque.</p>
<div lang="en"><br><img src="https://lab.inspira.io/static/flags/gb.png" alt="English Flag"><br>On multi-display configuration, sometimes, all the icons on the Finder Desktop lost her position. I found a little applescript programs who name is Dektop Icon Manager who can help you to backup and restore all position of desktop icons. You can download it on the developer home page of Gregory J. Parker : <a href="http://www.parker9.com/desktopIconManager2.0.html" target="_blank" rel="external">download</a><br></div>

<p><br> </p>
<style>
    div:lang(en) {
        background-color:#F7FCFC;
        border: solid 1px #F3F9F9;
        padding:5px 20px;
        border-radius: 8px;
    }
</style>

]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Il peut arriver que lorsque l’on a une configuration multi-écran, que les icônes du bureau, faute de place, se repositionnent automatiquement et se retrouvent mélangées.<br>Si vous cherchez une solution qui permet de sauvegarder et restaurer la position des icônes du bureau de MacOSX, je vous conseille ce programme Applescript réalisé par Gregory J. Parker.</p>]]>
    
    </summary>
    
    
      <category term="Applescript" scheme="https://lab.inspira.io/tags/applescript/"/>
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="bureau" scheme="https://lab.inspira.io/tags/bureau/"/>
    
      <category term="desktop" scheme="https://lab.inspira.io/tags/desktop/"/>
    
      <category term="icones" scheme="https://lab.inspira.io/tags/icones/"/>
    
      <category term="position" scheme="https://lab.inspira.io/tags/position/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[YUI Compressor launcher (Finder Toolbar)]]></title>

    <link href="https://lab.inspira.io/2010/yui-compressor-launcher-finder-toolbar.html"/>
    <id>https://lab.inspira.io/2010/yui-compressor-launcher-finder-toolbar.html</id>
    <published>2010-01-12T23:00:00.000Z</published>
    <updated>2016-03-20T13:17:23.000Z</updated>
    
    <content type="html"><![CDATA[<p>Lorsque vous développez en javascript et concevez des feuilles de style CSS, vous pouvez être emmené à utiliser l’outil mis à disposition par Yahoo afin d’optimiser les fichiers et réduire leur taille : YUI Compressor.</p>
<p>Je vous propose un script réalisé en <strong>AppleScript</strong> qui permet de lancer YUI Compressor et traiter vos fichiers.</p>
<a id="more"></a>
<h2 id="Installation"><a href="https://lab.inspira.io/2010/yui-compressor-launcher-finder-toolbar.html#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>Le programme Java de YUI Compressor est à installer dans le dossier <strong>/usr/local/bin</strong>. Le script lance le programme nommé : yuicompressor-2.4.2.jar.<br>Si vous souhaitez mettre à jour le fichier ou changer le dossier d’installation de YUI Compressor, vous pouvez adapter le programme à votre convenance en ouvrant l’application pour éditer le script.</p>
<h2 id="Principe-de-YUI-Compressor-launcher"><a href="https://lab.inspira.io/2010/yui-compressor-launcher-finder-toolbar.html#Principe-de-YUI-Compressor-launcher" class="headerlink" title="Principe de YUI Compressor launcher :"></a>Principe de YUI Compressor launcher :</h2><ul>
<li>Récupère <strong>les fichiers du Finder sélectionnés</strong></li>
<li>Vérifie que <strong>le fichier comporte l’extension JS</strong> (Javascript) ou<br>CSS (Cascading Style Sheet)</li>
<li><strong>Exécute YUI Compressor</strong> et crée une nouvelle version du fichier<br>sous la forme : nom-min.js</li>
</ul>
<h1 id="Code-source-applescript"><a href="https://lab.inspira.io/2010/yui-compressor-launcher-finder-toolbar.html#Code-source-applescript" class="headerlink" title="Code source (applescript) :"></a>Code source (applescript) :</h1><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"Finder"</span></span><br><span class="line">    <span class="keyword">set</span> myFiles <span class="keyword">to</span> selection</span><br><span class="line">    <span class="keyword">set</span> thisFolder <span class="keyword">to</span> (target <span class="keyword">of</span> <span class="keyword">front</span> window) <span class="keyword">as</span> Unicode <span class="built_in">text</span></span><br><span class="line">    <span class="keyword">set</span> thisFolder <span class="keyword">to</span> <span class="keyword">POSIX path</span> <span class="keyword">of</span> thisFolder</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">repeat</span> <span class="keyword">with</span> i <span class="keyword">from</span> <span class="number">1</span> <span class="keyword">to</span> <span class="built_in">number</span> <span class="keyword">of</span> items <span class="keyword">in</span> myFiles</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">set</span> file_name <span class="keyword">to</span> <span class="built_in">name</span> <span class="keyword">of</span> <span class="built_in">item</span> i <span class="keyword">in</span> myFiles</span><br><span class="line">        <span class="keyword">set</span> file_ext <span class="keyword">to</span> <span class="built_in">name</span> extension <span class="keyword">of</span> <span class="built_in">item</span> i <span class="keyword">in</span> myFiles</span><br><span class="line">        <span class="keyword">set</span> file_path <span class="keyword">to</span> <span class="built_in">item</span> i <span class="keyword">in</span> myFiles <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line"> </span><br><span class="line">        <span class="keyword">if</span> (file_ext = <span class="string">"js"</span> <span class="keyword">or</span> file_ext = <span class="string">"css"</span>) <span class="keyword">then</span></span><br><span class="line">            <span class="comment">-- Get the file name without extension</span></span><br><span class="line">            <span class="keyword">set</span> file_name_noext <span class="keyword">to</span> <span class="built_in">name</span> <span class="keyword">of</span> <span class="built_in">item</span> i <span class="keyword">in</span> myFiles <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">            <span class="keyword">set</span> file_name_noext <span class="keyword">to</span> (<span class="keyword">the</span> <span class="built_in">reverse</span> <span class="keyword">of</span> <span class="keyword">every</span> <span class="built_in">character</span> <span class="keyword">of</span> file_name_noext) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">            <span class="keyword">set</span> x <span class="keyword">to</span> <span class="keyword">the</span> <span class="built_in">offset</span> <span class="keyword">of</span> <span class="string">"."</span> <span class="keyword">in</span> file_name_noext</span><br><span class="line">            <span class="keyword">set</span> file_name_noext <span class="keyword">to</span> (<span class="built_in">text</span> (x + <span class="number">1</span>) <span class="keyword">thru</span> <span class="number">-1</span> <span class="keyword">of</span> file_name_noext) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">            <span class="keyword">set</span> file_name_noext <span class="keyword">to</span> (<span class="keyword">the</span> <span class="built_in">reverse</span> <span class="keyword">of</span> <span class="keyword">every</span> <span class="built_in">character</span> <span class="keyword">of</span> file_name_noext) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line"> </span><br><span class="line">            <span class="comment"># YUI Compressor</span></span><br><span class="line">            <span class="keyword">if</span> file_ext <span class="keyword">contains</span> <span class="string">"js"</span> <span class="keyword">then</span></span><br><span class="line">                <span class="built_in">do shell script</span> <span class="string">"java -jar /usr/local/bin/yuicompressor-2.4.2.jar "</span> &amp;amp; <span class="string">"-o "</span> &amp;amp; <span class="keyword">quoted form</span> <span class="keyword">of</span> thisFolder &amp;amp; file_name_noext &amp;amp; <span class="string">"-min.js "</span> &amp;amp; <span class="keyword">quoted form</span> <span class="keyword">of</span> thisFolder &amp;amp; file_name</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> file_ext <span class="keyword">contains</span> <span class="string">"css"</span> <span class="keyword">then</span></span><br><span class="line">                <span class="built_in">do shell script</span> <span class="string">"java -jar /usr/local/bin/yuicompressor-2.4.2.jar "</span> &amp;amp; <span class="string">"-o "</span> &amp;amp; <span class="keyword">quoted form</span> <span class="keyword">of</span> thisFolder &amp;amp; file_name_noext &amp;amp; <span class="string">"-min.css "</span> &amp;amp; <span class="keyword">quoted form</span> <span class="keyword">of</span> thisFolder &amp;amp; file_name</span><br><span class="line">            <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            <span class="comment">#Uniquement des fichiers JS et CSS</span></span><br><span class="line">            <span class="built_in">display dialog</span> <span class="string">"Le fichier traité doit être un fichier Javascript ou CSS."</span> <span class="keyword">with</span> title <span class="string">"YUI Compressor"</span> <span class="keyword">with</span> icon <span class="number">1</span> buttons &#123;<span class="string">"OK"</span>&#125; default button &#123;<span class="string">"OK"</span>&#125;</span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">repeat</span></span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br></pre></td></tr></table></figure>
<p>Pour télécharger YUI Compressor, voici le lien sur le site de Yahoo Developer :<br><a href="http://developer.yahoo.com/yui/compressor/" target="_blank" rel="external">http://developer.yahoo.com/yui/compressor/</a></p>
<div lang="en"><br><br><img src="https://lab.inspira.io/static/flags/gb.png" alt="English Flag"><br><br>If you use YUI compressor to optimize your Javascript and CSS files on Mac OSX. You can use this Finder toolbar script to launch the compressor and minimize your files. The program, made with applescript, open the selected files and create new one on the same folder with a different name (like name-min.js).<br>YUI compressor must be installed on the folder /usr/local/bin and the script search for yuicompressor-2.4.2.jar. If you have a different configuration, you can adapt the program itself.<br></div>

<p><br> </p>
<style>
    div:lang(en) {
        background-color:#F7FCFC;
        border: solid 1px #F3F9F9;
        padding:5px 20px;
        border-radius: 8px;
    }
</style>

]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Lorsque vous développez en javascript et concevez des feuilles de style CSS, vous pouvez être emmené à utiliser l’outil mis à disposition par Yahoo afin d’optimiser les fichiers et réduire leur taille : YUI Compressor.</p>
<p>Je vous propose un script réalisé en <strong>AppleScript</strong> qui permet de lancer YUI Compressor et traiter vos fichiers.</p>]]>
    
    </summary>
    
    
      <category term="YUI" scheme="https://lab.inspira.io/tags/yui/"/>
    
      <category term="Yahoo" scheme="https://lab.inspira.io/tags/yahoo/"/>
    
      <category term="compressor" scheme="https://lab.inspira.io/tags/compressor/"/>
    
      <category term="Javascript" scheme="https://lab.inspira.io/tags/javascript/"/>
    
      <category term="JS" scheme="https://lab.inspira.io/tags/js/"/>
    
      <category term="optimization" scheme="https://lab.inspira.io/tags/optimization/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Google Notifier – Configurer 2 comptes]]></title>

    <link href="https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html"/>
    <id>https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html</id>
    <published>2009-12-11T23:00:00.000Z</published>
    <updated>2015-05-26T17:36:55.000Z</updated>
    
    <content type="html"><![CDATA[<p>Si vous avez un compte Gmail, un utilitaire comme Google Notifier est bien pratique pour alerter lors de la réception de nouveaux courriers. Cela permet d’avoir un programme léger qui vérifie la boîte de réception sans devoir laisser votre client mail ouvert.</p>
<a id="more"></a>
<p>Le problème est que lorsque l’on a deux comptes Gmail (Pro et Perso), Google Notifier ne permet la configuration que d’un seul compte.</p>
<p>Voici une petite astuce pour lancer deux instances du programme sous Mac OSX :</p>
<h3 id="01-Dupliquez-le-programme-de-Google-Notifier--D-et-renommez-le"><a href="https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html#01-Dupliquez-le-programme-de-Google-Notifier--D-et-renommez-le" class="headerlink" title="01 Dupliquez le programme de Google Notifier (+D) et renommez-le :"></a>01 Dupliquez le programme de Google Notifier (+D) et renommez-le :</h3><p><img src="https://lab.inspira.io/static/2009/12/gmail_01.png" alt=""></p>
<h3 id="02-Un-clic-droit-sur-le-nouveau-programme-permet-d’ouvrir-le-menu-contextuel-cliquez-alors-sur-Afficher-le-contenu-du-paquet"><a href="https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html#02-Un-clic-droit-sur-le-nouveau-programme-permet-d’ouvrir-le-menu-contextuel-cliquez-alors-sur-Afficher-le-contenu-du-paquet" class="headerlink" title="02 Un clic droit sur le nouveau programme permet d’ouvrir le menu contextuel, cliquez alors sur Afficher le contenu du paquet :"></a>02 Un clic droit sur le nouveau programme permet d’ouvrir le menu contextuel, cliquez alors sur <strong>Afficher le contenu du paquet</strong> :</h3><p><img src="https://lab.inspira.io/static/2009/12/gmail_02.png" alt=""></p>
<h3 id="03-A-la-racine-un-dossier-Contents-a-l’interieur-un-fichier-Info-plist"><a href="https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html#03-A-la-racine-un-dossier-Contents-a-l’interieur-un-fichier-Info-plist" class="headerlink" title="03 À la racine, un dossier Contents, à l’intérieur un fichier Info.plist."></a>03 À la racine, un dossier <strong>Contents</strong>, à l’intérieur un fichier <strong>Info.plist</strong>.</h3><p>Ouvrez ce fichier dans votre éditeur de texte et <strong>modifiez la ligne suivante</strong> :</p>
<p><strong>com.google.GmailNotifier</strong> en <strong>com.google.GmailNotifier2</strong></p>
<p><img src="https://lab.inspira.io/static/2009/12/gmail_03.png" alt=""></p>
<p>C’est le fichier de préférence pour la nouvelle instance du programme.</p>
<h3 id="04-Enfin-ouvrez-le-dossier-Ressources-vous-pouvez-modifier-la-couleur-des-icones-qui-affiche-l’etat-dans-un-editeur-d’image-Format-PNG"><a href="https://lab.inspira.io/2009/google-notifier-configurer-2-comptes.html#04-Enfin-ouvrez-le-dossier-Ressources-vous-pouvez-modifier-la-couleur-des-icones-qui-affiche-l’etat-dans-un-editeur-d’image-Format-PNG" class="headerlink" title="04 Enfin, ouvrez le dossier Ressources, vous pouvez modifier la couleur des icônes qui affiche l’état dans un éditeur d’image (Format PNG)"></a>04 Enfin, ouvrez le dossier <strong>Ressources</strong>, vous pouvez modifier <strong>la couleur des icônes</strong> qui affiche l’état dans un éditeur d’image (Format PNG)</h3><p><img src="https://lab.inspira.io/static/2009/12/gmail_04.png" alt=""></p>
<p>Vous pouvez également configurer chaque Notifier afin de sélectionner un son d’alerte différent pour chacun d’entres eux.</p>
<p>Il ne manque plus qu’à les lancer à l’ouverture de session pour être averti des nouveaux messages.</p>
<p>Info : <strong>Les mises à jour ne sont plus effectuées</strong> sur ce nouveau programme. Il faudra effectuer de nouveau la procédure si vous souhaitez avoir la dernière version.</p>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Si vous avez un compte Gmail, un utilitaire comme Google Notifier est bien pratique pour alerter lors de la réception de nouveaux courriers. Cela permet d’avoir un programme léger qui vérifie la boîte de réception sans devoir laisser votre client mail ouvert.</p>]]>
    
    </summary>
    
    
      <category term="OSX" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="Google" scheme="https://lab.inspira.io/tags/google/"/>
    
      <category term="Gmail" scheme="https://lab.inspira.io/tags/gmail/"/>
    
      <category term="Notification" scheme="https://lab.inspira.io/tags/notification/"/>
    
      <category term="Notifier" scheme="https://lab.inspira.io/tags/notifier/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Gestion Multi-Display en Applescript]]></title>

    <link href="https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html"/>
    <id>https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html</id>
    <published>2009-11-10T23:00:00.000Z</published>
    <updated>2015-05-26T17:39:57.000Z</updated>
    
    <content type="html"><![CDATA[<p>Afin de travailler plus aisément et plus rapidement en configuration multi-écran, j’ai pris le temps d’écrire quelques scripts en langage Applescript. J’ai décidé de les partager sur ce blog, j’ai par conséquent adapté les programmes afin de pouvoir les distribuer.<br>Ces scripts ont été réalisés pour une configuration ou <strong>le moniteur principal est en face et le moniteur secondaire sur la gauche</strong>. Si vous avez une autre configuration, il vous faudra les adapter.</p>
<a id="more"></a>
<p>Pour utiliser les raccourcis claviers (exemple : +1) pour lancer les scripts et déplacer les fenêtres, vous pouvez utiliser <a href="http://www.red-sweater.com/fastscripts/" target="_blank" rel="external">FastScripts</a> ou <a href="http://www.shadowlab.org/Software/software.php?sign=Sprk" target="_blank" rel="external">Spark</a>.<br>Pour ma part j’ai associé ces scripts aux boutons additionnels de la souris.</p>
<p><strong>Important :</strong> il faut activer l’accès aux périphériques d’aide dans les préférences «Accès universel» de Mac OSX.</p>
<h2 id="MultiScreen-Move"><a href="https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html#MultiScreen-Move" class="headerlink" title="MultiScreen Move"></a>MultiScreen Move</h2><p><img src="https://lab.inspira.io/static/2009/11/multiscreen-osx_01.png" alt=""></p>
<p>Programme actionscript qui permet de <strong>déplacer la fenêtre active sur le second moniteur</strong> en adaptant la largeur et la hauteur. Si la fenêtre est sur le second moniteur, le script la repositionne sur l’écran principal.<br>Vous pouvez utiliser ce programme pour déplacer les fenêtres des programmes de messagerie instantanée, si la fenêtre est trop haute, elle sera diminuée.</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- #Diminution# est la valeur à soustraire aux dimensions de la fenêtre</span></span><br><span class="line"><span class="keyword">set</span> diminution <span class="keyword">to</span> <span class="number">50</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Largeur &amp;amp; Hauteur du second moniteur</span></span><br><span class="line"><span class="keyword">set</span> screen2_width <span class="keyword">to</span> <span class="number">1360</span></span><br><span class="line"><span class="keyword">set</span> screen2_height <span class="keyword">to</span> <span class="number">768</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Si comme moi vous avez un second moniteur plus petit, entrez ici le décalage Y par rapport au moniteur principal</span></span><br><span class="line"><span class="keyword">set</span> screen2_Yoffset <span class="keyword">to</span> <span class="number">68</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Calcul de la position finale sur le second moniteur</span></span><br><span class="line"><span class="keyword">set</span> screen2_pos <span class="keyword">to</span> &#123;-screen2_width + (diminution / <span class="number">2</span>), (diminution / <span class="number">2</span>) + screen2_Yoffset&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Entrez ici la position de retour de la fenêtre sur l'écran principal</span></span><br><span class="line"><span class="keyword">set</span> screen1_pos <span class="keyword">to</span> &#123;<span class="number">200</span>, <span class="number">100</span>&#125;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"System Events"</span></span><br><span class="line">    <span class="keyword">set</span> FrontApplication <span class="keyword">to</span> (<span class="keyword">get</span> <span class="built_in">name</span> <span class="keyword">of</span> <span class="keyword">every</span> process <span class="keyword">whose</span> <span class="built_in">frontmost</span> <span class="keyword">is</span> <span class="literal">true</span>) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">    <span class="keyword">tell</span> process FrontApplication</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">set</span> &#123;winWidth, winHeight&#125; <span class="keyword">to</span> size <span class="keyword">of</span> <span class="keyword">front</span> window</span><br><span class="line">        <span class="keyword">set</span> &#123;winX, winY&#125; <span class="keyword">to</span> position <span class="keyword">of</span> <span class="keyword">front</span> window</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">if</span> (winX &amp;lt; <span class="number">0</span>) <span class="keyword">then</span>           <span class="comment">-- déplace la fenêtre située sur l'écran 2 &amp;gt; sur l'écran principal</span></span><br><span class="line">            <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen1_pos</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            <span class="keyword">if</span> (winWidth &amp;gt; screen2_width - diminution) <span class="keyword">then</span></span><br><span class="line">                <span class="comment">-- Diminue la largeur</span></span><br><span class="line">                <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> &#123;screen2_width - diminution, winHeight&#125;</span><br><span class="line">                <span class="keyword">set</span> winWidth <span class="keyword">to</span> (screen2_width - diminution)</span><br><span class="line">            <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">            <span class="keyword">if</span> (winHeight &amp;gt; screen2_height - diminution) <span class="keyword">then</span></span><br><span class="line">                <span class="comment">-- Diminue la hauteur</span></span><br><span class="line">                <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> &#123;winWidth, screen2_height - diminution&#125;</span><br><span class="line">            <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line"> </span><br><span class="line">            <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen2_pos</span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br></pre></td></tr></table></figure>
<h2 id="Move-Full-Screen"><a href="https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html#Move-Full-Screen" class="headerlink" title="Move Full Screen"></a>Move Full Screen</h2><p><img src="https://lab.inspira.io/static/2009/11/multiscreen-osx_02.png" alt=""></p>
<p>Programme actionscript qui permet de déplacer la fenêtre active sur le second moniteur en plein écran. Si la fenêtre est déjà sur le second moniteur, le script la repositionne sur l’écran principal.</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Position sur l'écran Principal</span></span><br><span class="line"><span class="keyword">set</span> screen1_pos <span class="keyword">to</span> &#123;<span class="number">200</span>, <span class="number">0</span>&#125;</span><br><span class="line"><span class="keyword">set</span> screen1_size <span class="keyword">to</span> &#123;<span class="number">1200</span>, <span class="number">1050</span>&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Position sur l'écran secondaire (FullScreen)</span></span><br><span class="line"><span class="keyword">set</span> screen2_pos <span class="keyword">to</span> &#123;<span class="number">-1360</span>, <span class="number">68</span>&#125;</span><br><span class="line"><span class="keyword">set</span> screen2_size <span class="keyword">to</span> &#123;<span class="number">1360</span>, <span class="number">768</span>&#125;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"System Events"</span></span><br><span class="line">    <span class="keyword">set</span> FrontApplication <span class="keyword">to</span> (<span class="keyword">get</span> <span class="built_in">name</span> <span class="keyword">of</span> <span class="keyword">every</span> process <span class="keyword">whose</span> <span class="built_in">frontmost</span> <span class="keyword">is</span> <span class="literal">true</span>) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">    <span class="keyword">tell</span> process FrontApplication</span><br><span class="line"> </span><br><span class="line">        <span class="comment">-- verifie la position de la fenêtre</span></span><br><span class="line">        <span class="keyword">set</span> &#123;winX, winY&#125; <span class="keyword">to</span> position <span class="keyword">of</span> <span class="keyword">front</span> window</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">if</span> (winX &amp;lt; <span class="number">0</span>) <span class="keyword">then</span></span><br><span class="line">            <span class="comment">--move/return to principal screen 1</span></span><br><span class="line">            <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen1_pos</span><br><span class="line">            <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen1_size</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            <span class="comment">--fullscreen screen 2</span></span><br><span class="line">            <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen2_pos</span><br><span class="line">            <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> screen2_size</span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br></pre></td></tr></table></figure>
<h2 id="MultiScreen-Split-2-Finder-Window"><a href="https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html#MultiScreen-Split-2-Finder-Window" class="headerlink" title="MultiScreen Split 2 Finder Window"></a>MultiScreen Split 2 Finder Window</h2><p><img src="https://lab.inspira.io/static/2009/11/multiscreen-osx_03.png" alt=""></p>
<p>Programme actionscript qui permet de créer et d’ouvir deux fenêtres du Finder en mode liste et de les positionner côte à côte sur le second moniteur.</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Largeur &amp;amp; Hauteur du second moniteur</span></span><br><span class="line"><span class="keyword">set</span> screen2_width <span class="keyword">to</span> <span class="number">1360</span></span><br><span class="line"><span class="keyword">set</span> screen2_height <span class="keyword">to</span> <span class="number">768</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Si comme moi vous avez un second moniteur plus petit, entrez ici le décalage Y par rapport au moniteur principal</span></span><br><span class="line"><span class="keyword">set</span> screen2_Yoffset <span class="keyword">to</span> <span class="number">68</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">-- Dossiers initiaux</span></span><br><span class="line"><span class="keyword">set</span> workingFolder1 <span class="keyword">to</span> <span class="string">"WD320:travaux"</span></span><br><span class="line"><span class="keyword">set</span> workingFolder2 <span class="keyword">to</span> <span class="string">"WD320:travaux"</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"Finder"</span></span><br><span class="line">    <span class="keyword">set</span> windowNumber <span class="keyword">to</span> <span class="number">1</span></span><br><span class="line"> </span><br><span class="line">    <span class="keyword">set</span> Window1 <span class="keyword">to</span> make new Finder window</span><br><span class="line">    <span class="keyword">set</span> target <span class="keyword">of</span> Window1 <span class="keyword">to</span> workingFolder2</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">set</span> Window2 <span class="keyword">to</span> make new Finder window</span><br><span class="line">    <span class="keyword">set</span> target <span class="keyword">of</span> Window2 <span class="keyword">to</span> workingFolder1</span><br><span class="line"> </span><br><span class="line">    <span class="comment">--Configuration de l'affichage des deux fenêtres</span></span><br><span class="line">    <span class="keyword">repeat</span> <span class="number">2</span> <span class="keyword">times</span></span><br><span class="line">        <span class="built_in">activate</span></span><br><span class="line">        <span class="keyword">tell</span> window windowNumber</span><br><span class="line">            <span class="keyword">set</span> current view <span class="keyword">to</span> <span class="built_in">list</span> view</span><br><span class="line">            <span class="keyword">set</span> toolbar visible <span class="keyword">to</span> <span class="literal">true</span></span><br><span class="line">            <span class="keyword">set</span> sidebar width <span class="keyword">to</span> <span class="number">0</span></span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line">        <span class="keyword">set</span> windowNumber <span class="keyword">to</span> windowNumber + <span class="number">1</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">repeat</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">--Déplacement des 2 fenêtres du Finder sur le deuxieme écran</span></span><br><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"System Events"</span></span><br><span class="line">    <span class="keyword">set</span> FrontApplication <span class="keyword">to</span> (<span class="keyword">get</span> <span class="built_in">name</span> <span class="keyword">of</span> <span class="keyword">every</span> process <span class="keyword">whose</span> <span class="built_in">frontmost</span> <span class="keyword">is</span> <span class="literal">true</span>) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">    <span class="keyword">tell</span> process FrontApplication</span><br><span class="line">        <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> &#123;-screen2_width, screen2_Yoffset&#125;</span><br><span class="line">        <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">1</span> <span class="keyword">to</span> &#123;screen2_width / <span class="number">2</span>, screen2_height&#125;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">set</span> position <span class="keyword">of</span> window <span class="number">2</span> <span class="keyword">to</span> &#123;-screen2_width / <span class="number">2</span>, screen2_Yoffset&#125;</span><br><span class="line">        <span class="keyword">set</span> size <span class="keyword">of</span> window <span class="number">2</span> <span class="keyword">to</span> &#123;screen2_width / <span class="number">2</span>, screen2_height&#125;</span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br></pre></td></tr></table></figure>
<h2 id="Position-de-la-fenetre-active"><a href="https://lab.inspira.io/2009/gestion-multi-display-en-applescript.html#Position-de-la-fenetre-active" class="headerlink" title="Position de la fenêtre active"></a>Position de la fenêtre active</h2><p>Utilitaire qui permet <strong>d’obtenir la position de la fenêtre</strong> (offset). Pour cela, positionnez la fenêtre sur le second moniteur en plein écran et lancer ce script depuis le menu, vous devriez obtenir la position de celle-ci, ce qui vous permettra de configurer les autres programmes.</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"System Events"</span></span><br><span class="line">    <span class="keyword">set</span> theWindow <span class="keyword">to</span> window <span class="number">1</span> <span class="keyword">of</span> (<span class="keyword">first</span> process <span class="keyword">whose</span> <span class="built_in">frontmost</span> <span class="keyword">is</span> <span class="literal">true</span>)</span><br><span class="line">    <span class="keyword">set</span> thePosition <span class="keyword">to</span> position <span class="keyword">of</span> theWindow</span><br><span class="line">    <span class="built_in">display alert</span> <span class="built_in">name</span> <span class="keyword">of</span> theWindow &amp;amp; <span class="string">" : "</span> &amp;amp; ((<span class="keyword">first</span> <span class="built_in">item</span> <span class="keyword">of</span> thePosition) <span class="keyword">as</span> <span class="built_in">string</span>) &amp;amp; <span class="string">", "</span> &amp;amp; ((<span class="keyword">second</span> <span class="built_in">item</span> <span class="keyword">of</span> thePosition) <span class="keyword">as</span> <span class="built_in">string</span>)</span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br></pre></td></tr></table></figure>
<p><br></p>
<div lang="en"><br>    <img src="https://lab.inspira.io/static/flags/gb.png" alt="English Flag"><br>    I share today some simple, but useful applescript to interact with windows on Mac OSX and multi-display configuration. If you search for simple scripts to move windows/programs and switch screen faster, you find it. I write 3 scripts : one to move and reduce the window on the second monitor, one to move and adapt full screen the window, and one who open two Finder windows and positionning them on the second monitor. Others ideas ?<br></div>

<p><br> </p>
<style>
    div:lang(en) {
        background-color:#F7FCFC;
        border: solid 1px #F3F9F9;
        padding:5px 20px;
        border-radius: 8px;
    }
</style>




]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Afin de travailler plus aisément et plus rapidement en configuration multi-écran, j’ai pris le temps d’écrire quelques scripts en langage Applescript. J’ai décidé de les partager sur ce blog, j’ai par conséquent adapté les programmes afin de pouvoir les distribuer.<br>Ces scripts ont été réalisés pour une configuration ou <strong>le moniteur principal est en face et le moniteur secondaire sur la gauche</strong>. Si vous avez une autre configuration, il vous faudra les adapter.</p>]]>
    
    </summary>
    
    
      <category term="affichage" scheme="https://lab.inspira.io/tags/affichage/"/>
    
      <category term="Applescript" scheme="https://lab.inspira.io/tags/applescript/"/>
    
      <category term="display" scheme="https://lab.inspira.io/tags/display/"/>
    
      <category term="écran" scheme="https://lab.inspira.io/tags/ecran/"/>
    
      <category term="fenêtre" scheme="https://lab.inspira.io/tags/fenetre/"/>
    
      <category term="gestion" scheme="https://lab.inspira.io/tags/gestion/"/>
    
      <category term="mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="multi" scheme="https://lab.inspira.io/tags/multi/"/>
    
      <category term="osx" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="screen" scheme="https://lab.inspira.io/tags/screen/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
  </entry>
  
  
  <entry>
    <title><![CDATA[Quickfile (Finder Toolbar)]]></title>

    <link href="https://lab.inspira.io/2009/quickfile-finder-toolbar.html"/>
    <id>https://lab.inspira.io/2009/quickfile-finder-toolbar.html</id>
    <published>2009-09-24T22:00:00.000Z</published>
    <updated>2017-05-24T12:21:02.000Z</updated>
    
    <content type="html"><![CDATA[<p>Je vous propose ici un programme qui vous permettra, en un clic, de créer un nouveau fichier dans le dossier actif. Il utilisera, si défini, un modèle de fichier en fonction de l’extension donnée.</p>
<p>C’est un script qui permet de créer rapidement un fichier sous Mac OSX en utilisant un modèle !</p>
<a id="more"></a>
<h2 id="Principe-de-base-du-Script-«Quickfile»"><a href="https://lab.inspira.io/2009/quickfile-finder-toolbar.html#Principe-de-base-du-Script-«Quickfile»" class="headerlink" title="Principe de base du Script «Quickfile»"></a>Principe de base du Script «Quickfile»</h2><ul>
<li>Clic sur le bouton de la barre d’outil par l’utilisateur</li>
<li><strong>Détecte le dossier</strong> où se trouve l’utilisateur et <strong>demande le nom du fichier</strong>.</li>
<li>Vérification que le <strong>fichier n’existe pas</strong> (si oui il redemande un nouveau nom).</li>
<li>Si une <strong>extension est ajoutée</strong> au nom (exemple: .php)<ul>
<li>il vérifie la présence du <strong>dossier de template</strong> à l’endroit où se trouve le script.</li>
</ul>
</li>
<li>Si le dossier <strong>«QuickFileModels»</strong> existe et contient un fichier template (sous la forme <extension>.txt)<ul>
<li>il récupère le contenu du fichier</li>
</ul>
</extension></li>
<li>Le fichier est crée à l’endroit où vous vous trouvez.<ul>
<li>Création du fichier vide ou depuis le template.</li>
</ul>
</li>
</ul>
<h2 id="Installation"><a href="https://lab.inspira.io/2009/quickfile-finder-toolbar.html#Installation" class="headerlink" title="Installation"></a>Installation</h2><ul>
<li>Copier le fichier du script <strong>QuickFile.app</strong> et le dossier <strong>QuickFileModels</strong> dans le dossier de script de l’utilisateur (exemple : <utilisateur>/Library/Scripts/Finder Toolbar/)</utilisateur></li>
<li><strong>Glisser le fichier</strong> QuickFile.app dans la barre d’outils d’une fenêtre du Finder.</li>
<li><strong>Éditer vos modèles</strong> dans le dossier <strong>QuickFileModels</strong> (nom : <extension>.txt)</extension></li>
<li>Vous pouvez tester en ouvrant un dossier et en cliquant sur le bouton pour créer rapidement le nouveau fichier.</li>
</ul>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"Finder"</span></span><br><span class="line">    <span class="comment">-- Le dossier utilisé</span></span><br><span class="line">    <span class="keyword">set</span> thisFolder <span class="keyword">to</span> (target <span class="keyword">of</span> <span class="keyword">front</span> window) <span class="keyword">as</span> Unicode <span class="built_in">text</span></span><br><span class="line">    <span class="comment">-- Choix du nom du fichier</span></span><br><span class="line">    <span class="keyword">set</span> thefilename <span class="keyword">to</span> <span class="keyword">my</span> ChooseName(thisFolder)</span><br><span class="line">    <span class="comment">-- Le chemin complet</span></span><br><span class="line">    <span class="keyword">set</span> theFilePath <span class="keyword">to</span> thisFolder &amp;amp; thefilename</span><br><span class="line"></span><br><span class="line">    <span class="comment">-- Création du fichier</span></span><br><span class="line">    <span class="keyword">set</span> newFile <span class="keyword">to</span> make new <span class="built_in">file</span> <span class="keyword">with</span> properties &#123;<span class="built_in">name</span>:thefilename&#125; <span class="keyword">at</span> thisFolder <span class="keyword">as</span> <span class="built_in">alias</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">-- verification de l'extension fournie et ajout de texte si true</span></span><br><span class="line">    <span class="keyword">set</span> theExtension <span class="keyword">to</span> <span class="keyword">my</span> extensionFilter(thefilename)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (theExtension <span class="keyword">is</span> <span class="keyword">not</span> <span class="string">""</span>) <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">set</span> templateContent <span class="keyword">to</span> <span class="keyword">my</span> CheckTemplate(theExtension)</span><br><span class="line"></span><br><span class="line">        <span class="comment">-- SI LE TEMPLATE EXISTE (CONTENU TEXTE) ON ENREGISTRE LE TEXTE</span></span><br><span class="line">        <span class="keyword">if</span> (templateContent <span class="keyword">is</span> <span class="keyword">not</span> <span class="string">""</span>) <span class="keyword">then</span></span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">                <span class="keyword">set</span> fileID <span class="keyword">to</span> <span class="built_in">open for access</span> <span class="built_in">file</span> theFilePath <span class="keyword">with</span> <span class="built_in">write</span> permission</span><br><span class="line">                <span class="built_in">write</span> templateContent <span class="keyword">to</span> fileID <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">                <span class="built_in">close access</span> fileID</span><br><span class="line">            <span class="keyword">on</span> <span class="keyword">error</span></span><br><span class="line">                <span class="keyword">try</span></span><br><span class="line">                    <span class="built_in">close access</span> fileID</span><br><span class="line">                <span class="keyword">end</span> <span class="keyword">try</span></span><br><span class="line">                <span class="built_in">display dialog</span> <span class="string">"Le Template n'a pas pu être enregistré."</span></span><br><span class="line">            <span class="keyword">end</span> <span class="keyword">try</span></span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">on</span> ChooseName(thisFolder)</span><br><span class="line">    <span class="comment">-- DEMANDE LE NOM DU FICHIER &amp;amp; VERIFIE SIL EXISTE PAS</span></span><br><span class="line">    <span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"Finder"</span></span><br><span class="line">        <span class="keyword">set</span> thefilename <span class="keyword">to</span> <span class="built_in">text</span> returned <span class="keyword">of</span> (<span class="built_in">display dialog</span> <span class="string">"NOM DU FICHIER :"</span> &amp;amp; <span class="literal">return</span> &amp;amp; <span class="string">"(Un template sera choisie en fonction de l'extension)"</span> default answer <span class="string">"newFile.txt"</span>)</span><br><span class="line">        <span class="keyword">set</span> theFilePath <span class="keyword">to</span> thisFolder &amp;amp; thefilename</span><br><span class="line"></span><br><span class="line">        <span class="comment">-- Verification que le fichier n'existe pas</span></span><br><span class="line">        <span class="keyword">if</span> exists <span class="built_in">file</span> theFilePath <span class="keyword">then</span></span><br><span class="line">            <span class="built_in">display alert</span> <span class="string">"Le fichier ‘"</span> &amp;amp; thefilename &amp;amp; <span class="string">"’ existe déjà."</span> <span class="keyword">as</span> informational</span><br><span class="line">            <span class="keyword">set</span> thefilename <span class="keyword">to</span> <span class="keyword">my</span> ChooseName(thisFolder)</span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"><span class="built_in">    return</span> thefilename</span><br><span class="line"><span class="keyword">end</span> ChooseName</span><br><span class="line"></span><br><span class="line"><span class="keyword">on</span> extensionFilter(thefilename)</span><br><span class="line">    <span class="comment">-- RECUPERE EXTENSION CHOISIE</span></span><br><span class="line">    <span class="keyword">set</span> theExtension <span class="keyword">to</span> thefilename <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">    <span class="keyword">set</span> theExtension <span class="keyword">to</span> (<span class="keyword">the</span> <span class="built_in">reverse</span> <span class="keyword">of</span> <span class="keyword">every</span> <span class="built_in">character</span> <span class="keyword">of</span> theExtension) <span class="keyword">as</span> <span class="built_in">string</span> <span class="comment">-- inversion du nom</span></span><br><span class="line">    <span class="keyword">set</span> x <span class="keyword">to</span> <span class="keyword">the</span> <span class="built_in">offset</span> <span class="keyword">of</span> <span class="string">"."</span> <span class="keyword">in</span> theExtension <span class="comment">-- on recupere la position du point de l'extension</span></span><br><span class="line">    <span class="keyword">if</span> (x &amp;lt; <span class="number">6</span> <span class="keyword">and</span> x <span class="keyword">is</span> <span class="keyword">not</span> <span class="number">0</span>) <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">set</span> theExtension <span class="keyword">to</span> (<span class="built_in">text</span> <span class="number">1</span> <span class="keyword">thru</span> (x - <span class="number">1</span>) <span class="keyword">of</span> theExtension) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">        <span class="keyword">set</span> theExtension <span class="keyword">to</span> (<span class="keyword">the</span> <span class="built_in">reverse</span> <span class="keyword">of</span> <span class="keyword">every</span> <span class="built_in">character</span> <span class="keyword">of</span> theExtension) <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="comment">-- MISE A ZERO</span></span><br><span class="line">        <span class="keyword">set</span> theExtension <span class="keyword">to</span> <span class="string">""</span></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line"><span class="built_in">    return</span> theExtension</span><br><span class="line"><span class="keyword">end</span> extensionFilter</span><br><span class="line"></span><br><span class="line"><span class="keyword">on</span> CheckTemplate(theExtension)</span><br><span class="line">    <span class="comment">-- VERIFIE SI UN TEMPLATE EXISTE ET LE RENVOI SI OUI</span></span><br><span class="line">    <span class="keyword">set</span> myPath <span class="keyword">to</span> (<span class="built_in">path to</span> <span class="keyword">me</span>) <span class="comment">--chemin du script</span></span><br><span class="line">    <span class="keyword">tell</span> <span class="built_in">application</span> <span class="string">"Finder"</span></span><br><span class="line">        <span class="keyword">set</span> templateFolder <span class="keyword">to</span> folder <span class="keyword">of</span> myPath <span class="keyword">as</span> <span class="built_in">alias</span></span><br><span class="line">        <span class="keyword">set</span> templateFolder <span class="keyword">to</span> folder <span class="string">"QuickFileModels"</span> <span class="keyword">of</span> templateFolder <span class="keyword">as</span> <span class="built_in">alias</span></span><br><span class="line">        <span class="keyword">set</span> theTemplate <span class="keyword">to</span> templateFolder &amp;amp; theExtension &amp;amp; <span class="string">".txt"</span> <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> exists <span class="built_in">file</span> theTemplate <span class="keyword">then</span></span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">                <span class="comment">-- LE TEMPLATE EXISTE ON ON PEUX RECUPERER LE TEXTE</span></span><br><span class="line">                <span class="keyword">set</span> <span class="keyword">the</span> theTemplate <span class="keyword">to</span> <span class="keyword">the</span> theTemplate <span class="keyword">as</span> <span class="built_in">string</span></span><br><span class="line">                <span class="keyword">set</span> fileID <span class="keyword">to</span> <span class="built_in">open for access</span> theTemplate <span class="comment">--with write permission</span></span><br><span class="line">                <span class="keyword">set</span> lecontenu <span class="keyword">to</span> <span class="built_in">read</span> fileID</span><br><span class="line">                <span class="built_in">close access</span> fileID</span><br><span class="line">            <span class="keyword">on</span> <span class="keyword">error</span></span><br><span class="line">                <span class="keyword">try</span></span><br><span class="line">                    <span class="built_in">close access</span> fileID</span><br><span class="line">                <span class="keyword">end</span> <span class="keyword">try</span></span><br><span class="line"><span class="built_in">                return</span> <span class="literal">false</span></span><br><span class="line">            <span class="keyword">end</span> <span class="keyword">try</span></span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            <span class="comment">-- SI LE TEMPLATE N'EXISTE PAS RETOURNE UN CONTENU VIDE</span></span><br><span class="line">            <span class="keyword">set</span> lecontenu <span class="keyword">to</span> <span class="string">""</span></span><br><span class="line">        <span class="keyword">end</span> <span class="keyword">if</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">end</span> <span class="keyword">tell</span></span><br><span class="line"><span class="built_in">    return</span> lecontenu</span><br><span class="line"><span class="keyword">end</span> CheckTemplate</span><br></pre></td></tr></table></figure>
<div lang="en"><br><img src="https://lab.inspira.io/static/flags/gb.png" alt="English Flag"><br>Quick File is an simple applescript program designed to quickly create new file from the finder toolbar and directly in the folder you are. I made this script specially to share it with other user of Mac OSX.<br>Install this application and the template folder in your script directory, and drag the application in the finder toolbar. Now you can start to create file based on template situated in the folder « QuickFileModels ».<br>How it’s work ? Tell a new name for the file, verify that the file doesn’t exist, and check if an template exist with the same extension (work with extension like .txt / .js / .as / .php and… .psd).<br>This application is distributed as it. I am not responsible for any bad use of this program (I’m not a developer). If you think of functionality to give this script better or to report any bug, don’t hesitate to tell me.<br></div>


<p><br></p>
<style>
    div:lang(en) {
        background-color:#F7FCFC;
        border: solid 1px #F3F9F9;
        padding:5px 20px;
        border-radius: 8px;
    }
</style>
]]></content>
    
    <summary type="html">
    
      <![CDATA[<p>Je vous propose ici un programme qui vous permettra, en un clic, de créer un nouveau fichier dans le dossier actif. Il utilisera, si défini, un modèle de fichier en fonction de l’extension donnée.</p>
<p>C’est un script qui permet de créer rapidement un fichier sous Mac OSX en utilisant un modèle !</p>]]>
    
    </summary>
    
    
      <category term="Applescript" scheme="https://lab.inspira.io/tags/applescript/"/>
    
      <category term="script" scheme="https://lab.inspira.io/tags/script/"/>
    
      <category term="OSX" scheme="https://lab.inspira.io/tags/osx/"/>
    
      <category term="création de fichier" scheme="https://lab.inspira.io/tags/creation-de-fichier/"/>
    
      <category term="Finder" scheme="https://lab.inspira.io/tags/finder/"/>
    
      <category term="Mac" scheme="https://lab.inspira.io/tags/mac/"/>
    
      <category term="toolbar" scheme="https://lab.inspira.io/tags/toolbar/"/>
    
  </entry>
  
</feed>
