<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Abdul Malik Ikhsan</title>
    <description>The latest articles on Forem by Abdul Malik Ikhsan (@samsonasik).</description>
    <link>https://forem.com/samsonasik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F10393%2F459648.jpeg</url>
      <title>Forem: Abdul Malik Ikhsan</title>
      <link>https://forem.com/samsonasik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/samsonasik"/>
    <language>en</language>
    <item>
      <title>Your Favorite Framework is not Enough</title>
      <dc:creator>Abdul Malik Ikhsan</dc:creator>
      <pubDate>Fri, 24 Mar 2017 00:45:00 +0000</pubDate>
      <link>https://forem.com/samsonasik/your-favorite-framework-is-not-enough</link>
      <guid>https://forem.com/samsonasik/your-favorite-framework-is-not-enough</guid>
      <description>&lt;p&gt;Yes! You may be a fan of a very awesome wow Framework &lt;strong&gt;X&lt;/strong&gt;. But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nobody's perfect. Living by supporting each other is the game called life.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Kamen Rider Skull.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can of course tweak very hard to make your lovely framework works as your wish for your needs, but time will limit it.&lt;/p&gt;

&lt;p&gt;Whenever there is another tools that just right for that, you should just use them - combine them - profit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Use Case
&lt;/h2&gt;

&lt;p&gt;I got a project using PHP, and I use Zend Framework. Everything seems perfect in the beginning, all I needs were in there, until a reporting feature coming. I need a html to pdf converter. After I tried many PHP libs, I found a one that suit my needs, which named &lt;a href="https://github.com/KnpLabs/snappy"&gt;Snappy&lt;/a&gt; , which can be easily required via composer command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;composer require knplabs/knp-snappy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lib require non-php executable command line tools, named &lt;a href="https://wkhtmltopdf.org/"&gt;wkhtmltopdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I remember correctly, my client want to code also in his windows, the server is using linux, and for my dev tools, I am using OS X. Virtual Machine is not a solution at that time as I have limited resource, so, I downloaded 3 versions (windows, linux, and mac) of the executable files in my application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── bin
│   ├── linux
│   │   └── wkhtmltopdf
│   ├── mac
│   │   └── wkhtmltopdf
│   └── windows
│       ├── bin
│       │   ├── wkhtmltoimage.exe
│       │   ├── wkhtmltopdf.exe
│       │   └── wkhtmltox.dll
│       ├── include
│       │   └── wkhtmltox
│       └── lib
│           └── wkhtmltox.lib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I created a simple code to detect os which returns &lt;code&gt;wkhtmltopdf&lt;/code&gt; executable file like the following :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getWkhtmlToPdfLocation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;PHP_OS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'Darwin'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'Linux'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'Darwin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'mac'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$os&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/bin/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$os&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/wkhtmltopdf'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/bin/windows/bin/wkhtmltopdf.exe'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I need to generate a pdf from html report, and download it, then I do following action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Knp\Snappy\Pdf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Zend\View\Model\ViewModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ... demo: not actual code&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;generatereportAction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/path/to/report.pdf'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    

    &lt;span class="nv"&gt;$snappy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getWkhtmlToPdfLocation&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nv"&gt;$snappy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generateFromHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getOutput&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sendResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I created separate methods to buffer html output and send response to ease you to see the logic for above action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// ... demo: not actual code&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getOutput&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$viewModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ViewModel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$viewModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/application/report'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setTerminal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// renderer is a Zend\View\Renderer\PhpRenderer instance&lt;/span&gt;
    &lt;span class="nv"&gt;$output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$viewModel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;sendResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getResponse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getHeaders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHeaderLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'application/pdf'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getHeaders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHeaderLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Disposition'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'attachment; filename="'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getHeaders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addHeaderLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Length'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;filesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;//remove file after not needed&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, You can of course wrap them inside service, models, use bundled module for its service to be usable in many applications, you name it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Be open minded.&lt;/p&gt;

</description>
      <category>framework</category>
      <category>collaboration</category>
    </item>
    <item>
      <title>How to Politely Ask for Help from Open-source Contributors and Maintainers</title>
      <dc:creator>Abdul Malik Ikhsan</dc:creator>
      <pubDate>Tue, 14 Mar 2017 15:06:27 +0000</pubDate>
      <link>https://forem.com/samsonasik/how-to-politely-asking-help-to-open-source-contributorsmaintainers</link>
      <guid>https://forem.com/samsonasik/how-to-politely-asking-help-to-open-source-contributorsmaintainers</guid>
      <description>

&lt;p&gt;There are many open-source contributors/maintainers out there. Some of them may look not seem like "patient people", closing issues without comment, or not replying at all. There are reasons behind it: this may not be a priority, they may be busy in another project (which is paid), or your problem can be marked as "feature request" which will take another maintenance burden, and possibly open new bug(s), or, you simply did not follow the contribution guidelines.&lt;/p&gt;

&lt;p&gt;Apart from all of these reasons, the maintainers are still human, and we need to respect it. Here are some suggestions for effectively requesting assistance from maintainers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Always Read Contributing Document
&lt;/h3&gt;

&lt;p&gt;Don't blindly create issues unless you want them to be closed blindly too. OSS usually have documentation, and if it is available in any capacity, you should read it before creating an issue or asking for help.&lt;/p&gt;

&lt;h3&gt;
  
  
  Never tell "Please fix/merge it, urgent!"
&lt;/h3&gt;

&lt;p&gt;Or any other "I need it today" statements. Remember, unless you pay for it, they do not owe you anything. Never. Act. Like. A. Boss.&lt;/p&gt;

&lt;p&gt;Always wait for a few days. If you really need a fix, you can write better statements, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there anything I can do to get it merged? Thank you.&lt;/li&gt;
&lt;li&gt;Any other information about the issue you need? Thank you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, you should always say thank you, even if it is never merged. And if the person you asked for help is back and tried to help you, say thanks again. Well, for merged pull request, saying "thanks" to maintainers can fill up his/her inbox, so consider it for issues primarily.&lt;/p&gt;

&lt;p&gt;While waiting for the merge, you can do fork the repository and use your fix temporary in your project until it merged. Remember, it is open-source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid asking for help privately
&lt;/h3&gt;

&lt;p&gt;Your issue can be another person's issue as well, so, unless it is a security issue, you should ask it publicly (issue, irc, forum). While the maintainers don't have a chance to answer, other contributors may can.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Active
&lt;/h3&gt;

&lt;p&gt;Always be active, provide a reproducible code/repository, a clear explanation about your issue, and/or a failure test case. If you don't provide them, it will be very hard to get good feedback.&lt;/p&gt;

&lt;p&gt;P.S&lt;br&gt;
I got mention in twitter from &lt;a href="https://twitter.com/apr/status/841702332937170946"&gt;@apr&lt;/a&gt; that this article misses a link to &lt;a href="http://www.catb.org/esr/faqs/smart-questions.html"&gt;Eric Steven Raymond's document&lt;/a&gt;. While I didn't read that before, and I didn't pull anything from that, I can say that the document is very good and I think you need to read that.&lt;/p&gt;


</description>
      <category>opensource</category>
      <category>contributing</category>
    </item>
  </channel>
</rss>
