<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja_JP"><generator uri="https://jekyllrb.com/" version="4.2.1">Jekyll</generator><link href="https://code.lioon.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://code.lioon.net/" rel="alternate" type="text/html" hreflang="ja_JP" /><updated>2023-06-03T12:34:47+09:00</updated><id>https://code.lioon.net/feed.xml</id><title type="html">開発メモ</title><subtitle>開発メモ</subtitle><author><name>Lioon</name></author><entry><title type="html">[Server] Access Deniedエラーがクッキーやキャッシュを削除しても解決しない</title><link href="https://code.lioon.net/server/yet-another-access-denied-error.html" rel="alternate" type="text/html" title="[Server] Access Deniedエラーがクッキーやキャッシュを削除しても解決しない" /><published>2023-03-19T00:00:00+09:00</published><updated>2023-03-19T17:02:52+09:00</updated><id>https://code.lioon.net/server/yet-another-access-denied-error</id><content type="html" xml:base="https://code.lioon.net/server/yet-another-access-denied-error.html"><![CDATA[<p>いつもアクセスしているウェブサイトが突然<code class="language-plaintext highlighter-rouge">Access Denied</code>のエラーになることがある。
この手に対策によく見るのは、クッキーやキャッシュを削除しろというものだ。単にサーバーがメンテテナンス中で、しばらく経てば直るということもある。しかし、先日、私が経験したのは、そのどちらでも解決しなかったので、参考までに書いておこうと思う。
<!--more--></p>

<p>ある日、ときどき利用する、あるネットショップにアクセスすると、<code class="language-plaintext highlighter-rouge">Access Denied</code>が表示されて閲覧できないことに気付いた。</p>

<p>ブラウザはGoogle Chromeを使っていて、複数のGoogleアカウントで使いわけている。そのひとつでなぜかアクセスできない。他のアカウントだと問題ないので、買い物をするのに困ったわけではない。</p>

<p>クッキーを削除しても変化なし。キャッシュを削除したり、ブラウザを再起動してみたり、WAN側を再起動してIPアドレスを変更してみたりしたが同じ。シークレットウィンドウでアクセスすると正常に閲覧できるという、いまひとつよくわからない状態だった。</p>

<p>いろいろ調べた結果、原因は、Chromeが最初に送信するHTTPリクエストの<code class="language-plaintext highlighter-rouge">accept-language</code>ヘッダーの違いで、サーバーのアクセス制限にひっかかっていることがわかった。</p>

<p>正常にアクセスできるHTTPリクエストは次のとおり。</p>

<p><code class="language-plaintext highlighter-rouge">accept-language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7</code></p>

<p>一覧にすると次の4つが設定されている。</p>
<ul>
  <li>ja-JP</li>
  <li>ja</li>
  <li>en-US</li>
  <li>en
末尾のq=0.9などは優先順位で1と0の間の数字を指定する。最優先は<code class="language-plaintext highlighter-rouge">ja-JP</code>の1.0でその数値は省略されている。</li>
</ul>

<p>一方、Access DeniedされたHTTPリクエストには、微妙な違いがあった。</p>

<p><code class="language-plaintext highlighter-rouge">accept-language: ja,en-US;q=0.9,en;q=0.8</code></p>

<ul>
  <li>ja</li>
  <li>en-US</li>
  <li>en
<code class="language-plaintext highlighter-rouge">ja-JP</code>がない。</li>
</ul>

<p>しかし、どちらのChomeも、設定画面の優先言語は同じになっている。</p>

<p><img src="/assets/images/2023-03-19-yet-another-access-denied-error/ng.png" alt="優先言語の設定NG" /></p>

<p>設定画面では同じなのに、なぜ<code class="language-plaintext highlighter-rouge">accept-language</code>の値が違うのか？の理由はさておき、とりあえず、Access DeniedになるChromeで、優先言語の設定を次のように<code class="language-plaintext highlighter-rouge">英語(アメリカ合衆国)</code>を削除して試しみた。</p>

<p><img src="/assets/images/2023-03-19-yet-another-access-denied-error/ok.png" alt="優先言語の設定OK" /></p>

<p>これで正常にアクセスができるようになった。</p>

<p>ということは、今回のネットショップに関して言えば、今回の事象は、HTTPリクエストのアクセス制御にひっかかっていたと言える。</p>

<p>試しに言語設定をいろいろ変更してみて、わかったのは、accept-languageの値の先頭が<code class="language-plaintext highlighter-rouge">ja,en-US</code>で始まるときにアクセス制御がかかるようだ。<code class="language-plaintext highlighter-rouge">ja-JP,ja,en-US</code>だと問題ないので、単にサーバーの設定の問題のように思えるが、どちらの振舞いが正しいのかはわからない。</p>

<p>利用者の立場として、Access Deniedになる原因にはこんなこともあるのだと妙に感心したので記事にしてみた。今回は<code class="language-plaintext highlighter-rouge">accept-language</code>だったが、どのヘッダーでアクセス拒否されているかは調べてみないとわからない。Google ChomeのDevToolsが役に立った。</p>

<p>ところで、Chromeの優先言語の設定は同じ日本語なのに、リクエストヘッダーの<code class="language-plaintext highlighter-rouge">accept-language</code>の値が<code class="language-plaintext highlighter-rouge">ja</code>だったり、<code class="language-plaintext highlighter-rouge">ja-JP,ja;q=0.9</code>する現象については、原因がまたわかったら記事にしたいと思います。</p>]]></content><author><name>Lioon</name></author><category term="server" /><summary type="html"><![CDATA[いつもアクセスしているウェブサイトが突然Access Deniedのエラーになることがある。 この手に対策によく見るのは、クッキーやキャッシュを削除しろというものだ。単にサーバーがメンテテナンス中で、しばらく経てば直るということもある。しかし、先日、私が経験したのは、そのどちらでも解決しなかったので、参考までに書いておこうと思う。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/og-icon.png" /><media:content medium="image" url="https://code.lioon.net/og-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Shell] 標準出力と標準エラー出力</title><link href="https://code.lioon.net/shell/shell-redirect-pipeline.html" rel="alternate" type="text/html" title="[Shell] 標準出力と標準エラー出力" /><published>2022-02-01T18:09:38+09:00</published><updated>2022-02-02T11:13:05+09:00</updated><id>https://code.lioon.net/shell/shell-redirect-pipeline</id><content type="html" xml:base="https://code.lioon.net/shell/shell-redirect-pipeline.html"><![CDATA[<p>ターミナルなどでコマンドを実行すれば、そのターミナルの画面にコマンドの出力が表示される。
これは、そのコマンドの標準出力が、そのターミナルに紐付いているからだ。</p>

<p>コマンドの出力をファイルへ保存したいなら、シェルのリダイレクトという機能を使って、標準出力をファイルへ紐付ける。
<!--more--></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND &gt; file.txt
</code></pre></div></div>

<p>一方、コマンドのエラーメッセージは、<code class="language-plaintext highlighter-rouge">標準エラー出力</code>へ送られるが、この<code class="language-plaintext highlighter-rouge">標準エラー出力</code>もターミナルに紐付いている。変更するには<code class="language-plaintext highlighter-rouge">2&gt;</code>を使う。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 2&gt; error.txt
</code></pre></div></div>

<p>この<code class="language-plaintext highlighter-rouge">2</code>という番号はファイルディスクリプタ(File Descriptor)と呼ばれる。
標準出力が1、標準エラー出力が2というのが決っているようだ。指定しなければ、1がデフォルトになる。</p>

<p>標準出力と標準エラー出力の両方を変更するなら、次のように書く。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 2&gt; error.txt 1&gt; file.txt
</code></pre></div></div>

<p>ファイルディスクリプタの1は書かなくても同じなので、これでいい。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 2&gt; error.txt &gt; file.txt
</code></pre></div></div>

<p>標準エラー出力を標準出力と同じに紐付けるなら、<code class="language-plaintext highlighter-rouge">&amp;</code>を使う。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 2&gt;&amp;1
</code></pre></div></div>

<p>標準出力1と標準エラー出力2を同じファイルへ紐付ける。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 1&gt;file.txt 2&gt;&amp;1
</code></pre></div></div>

<p>次のように順番が逆だとうまく動かない。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND 2&gt;&amp;1 1&gt;file.txt  # 悪い例
</code></pre></div></div>

<p>なぜなら、最初に<code class="language-plaintext highlighter-rouge">2&gt;&amp;1</code>を指定しても この時点では標準出力はターミナルに紐付いているので、標準エラー出力はターミナルに紐付いてしまうからである。</p>

<p>コマンドの標準出力を別のコマンドの標準入力へ紐付ける仕組みはパイプと呼ばれる。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND1 | COMMAND2
</code></pre></div></div>

<p>標準エラー出力もパイプで送るのであれば、リダイクレトを使う。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND1 2&gt;&amp;1 | COMMAND2
</code></pre></div></div>

<p>zshやbashのマニュアルを読むともっと複雑な書き方があるが、これぐらいをしっかり身に付けておけば、普段使いには十分な気がする。</p>

<p>例えば、zshには、上の書き方の省略形があるが、すぐに忘れそうだ。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ COMMAND1 |&amp; COMMAND2
</code></pre></div></div>]]></content><author><name>Lioon</name></author><category term="shell" /><summary type="html"><![CDATA[ターミナルなどでコマンドを実行すれば、そのターミナルの画面にコマンドの出力が表示される。 これは、そのコマンドの標準出力が、そのターミナルに紐付いているからだ。 コマンドの出力をファイルへ保存したいなら、シェルのリダイレクトという機能を使って、標準出力をファイルへ紐付ける。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/og-icon.png" /><media:content medium="image" url="https://code.lioon.net/og-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Ruby] RubyGemsの’-‘と’_’の使い分け</title><link href="https://code.lioon.net/ruby/ruby-gem-naming-hyphen-underscore.html" rel="alternate" type="text/html" title="[Ruby] RubyGemsの’-‘と’_’の使い分け" /><published>2022-01-31T00:00:00+09:00</published><updated>2022-02-02T00:42:18+09:00</updated><id>https://code.lioon.net/ruby/ruby-gem-naming-hyphen-underscore</id><content type="html" xml:base="https://code.lioon.net/ruby/ruby-gem-naming-hyphen-underscore.html"><![CDATA[<p><code class="language-plaintext highlighter-rouge">Bundler gem</code>コマンドを使って、Gemを新規作成すると、名前の”-“と”_“の違いによって生成ファイルが異なる。</p>

<!--more-->

<p>‘_‘の例</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle gem my_tool -t -b

生成されるモジュール

module MyTool
      ....
end
</code></pre></div></div>

<p>’-‘の例</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle gem my-tool -t -b

生成されるモジュール

module My
  module Tool
    ....
  end
end
</code></pre></div></div>

<p>このふるまいは、RubyGemsの規約に従っているようで、次のページに説明があった。</p>

<p><a href="https://guides.rubygems.org/name-your-gem/">Name your gem - RubyGems Guides</a></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">_</code>は複合語に使う</li>
  <li><code class="language-plaintext highlighter-rouge">-</code>はGemの拡張に使う</li>
</ul>

<p>例えば、Jekyllなら、Jekyll本体が<code class="language-plaintext highlighter-rouge">jekyll</code>で、<code class="language-plaintext highlighter-rouge">jekyll-archives</code>はその拡張のひとつである。<code class="language-plaintext highlighter-rouge">-</code>で区切られているので、モジュールは、<code class="language-plaintext highlighter-rouge">module JekyllArchives</code>ではなく、<code class="language-plaintext highlighter-rouge">module Jekyll</code>のなかに、<code class="language-plaintext highlighter-rouge">module Archives</code>が定義されていると予想できるし、実際、そうなっている。</p>]]></content><author><name>Lioon</name></author><category term="ruby" /><summary type="html"><![CDATA[Bundler gemコマンドを使って、Gemを新規作成すると、名前の”-“と”_“の違いによって生成ファイルが異なる。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/og-icon.png" /><media:content medium="image" url="https://code.lioon.net/og-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Emacs] elisp: ポイントを移動する</title><link href="https://code.lioon.net/emacs/elisp-move-position.html" rel="alternate" type="text/html" title="[Emacs] elisp: ポイントを移動する" /><published>2022-01-29T00:00:00+09:00</published><updated>2022-05-21T23:53:16+09:00</updated><id>https://code.lioon.net/emacs/elisp-move-position</id><content type="html" xml:base="https://code.lioon.net/emacs/elisp-move-position.html"><![CDATA[<p>ポイントを移動する関数がいろいろ用意されているので、ちょっとメモ。
<!--more--></p>
<h2>2段階で移動する</h2>
<p>先頭から何行目か移動してから、行内でさらに移動する</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">progn</span>
  <span class="p">(</span><span class="nv">beginning-of-buffer</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">end-of-line</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>次のように引数Nを指定すると、N/10の位置に移動する。
5を指定すると5/10なので、ちょうど真ん中、
10なら、末尾へ移動する。</p>
<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">beginning-of-buffer</span> <span class="nv">N</span><span class="p">)</span>
</code></pre></div></div>

<h2>先頭から何文字目かに移動</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(goto-char (+ (point) 10))
</code></pre></div></div>
<p>現在値を <code class="language-plaintext highlighter-rouge">(point)</code> で取得し、その結果に文字数を加減することで、新しいポイントへ移動する。</p>

<h2>任意の文字へ移動</h2>
<div class="language-elisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">re-search-forward</span> <span class="s">"word"</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>
</code></pre></div></div>

<p>どのやりかたでも、まず</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">beginning-of-buffer</span><span class="p">)</span>
</code></pre></div></div>

<p>を実行して、カーソルを先頭へ移動したほうがいいかも。</p>]]></content><author><name>Lioon</name></author><category term="emacs" /><summary type="html"><![CDATA[ポイントを移動する関数がいろいろ用意されているので、ちょっとメモ。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/og-icon.png" /><media:content medium="image" url="https://code.lioon.net/og-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Jekyll] URLの書き方</title><link href="https://code.lioon.net/jekyll/jekyll-old-path-style.html" rel="alternate" type="text/html" title="[Jekyll] URLの書き方" /><published>2019-06-05T10:24:00+09:00</published><updated>2022-01-16T12:17:16+09:00</updated><id>https://code.lioon.net/jekyll/jekyll-old-path-style</id><content type="html" xml:base="https://code.lioon.net/jekyll/jekyll-old-path-style.html"><![CDATA[<p>JekyllのHTMLを書いていて、パスの書き方で混乱してしまったのメモ。</p>

<p>レイアウト用のHTMLを編集していたら、ファイルのパスをこんな書き方にしていた。
<!--more--></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"{{ site.baseurl }}/assets/image.jpg"</span><span class="nt">/&gt;</span>feed<span class="nt">&lt;/a&gt;</span>

</code></pre></div></div>

<p>以前、古いテーマを参考にして、自分のソースでもこの書き方にしてしまったようだ。Jekyllの仕組みがわかっていれば、理屈はわかるが、いささか ad hoc なやり方のようにも見える。</p>

<p>今は、Jekyllのフィルターを使う(とはいえ、2016年10月に<a href="https://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/">Jekyll 3.3</a>で導入されているので、ずいぶん前の話)。</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"{{ "</span><span class="err">/</span><span class="na">assets</span><span class="err">/</span><span class="na">image.jpg</span><span class="err">"</span> <span class="err">|</span> <span class="na">relatvie_url</span> <span class="err">}}"</span><span class="nt">/&gt;</span>feed<span class="nt">&lt;/a&gt;</span>

</code></pre></div></div>
<p>やはり、このほうがJekyll、というかLiquidらしくて、いい感じ。</p>

<p><code class="language-plaintext highlighter-rouge">_config.xml</code>の<code class="language-plaintext highlighter-rouge">baseurl</code>を例えば、<code class="language-plaintext highlighter-rouge">"/base"</code>と指定していれば、</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/base/assets/image.jpg"</span><span class="nt">/&gt;</span>feed<span class="nt">&lt;/a&gt;</span>

</code></pre></div></div>
<p>こんな感じのHTMLが生成される。</p>

<p>絶対パスでも考え方は同じで、absolute_urlフィルターを使えばよい。</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"{{ "</span><span class="err">/</span><span class="na">assets</span><span class="err">/</span><span class="na">image.jpg</span><span class="err">"</span> <span class="err">|</span> <span class="na">absolute_url</span> <span class="err">}}"</span><span class="nt">/&gt;</span>feed<span class="nt">&lt;/a&gt;</span>

</code></pre></div></div>

<p>わざわざ説明する話でもないけれど、紛らわしいこともあるので、一応、記事にしてみた。</p>

<p>参考: <a href="https://jekyllrb.com/docs/templates/">Templates - Jekyll • Simple, blog-aware, static sites</a>\</p>]]></content><author><name>Lioon</name></author><category term="jekyll" /><summary type="html"><![CDATA[JekyllのHTMLを書いていて、パスの書き方で混乱してしまったのメモ。 レイアウト用のHTMLを編集していたら、ファイルのパスをこんな書き方にしていた。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/jekyll-logo-light-transparent.png" /><media:content medium="image" url="https://code.lioon.net/jekyll-logo-light-transparent.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Emacs] ImageMagickとの連携でEXIF情報を取り除く</title><link href="https://code.lioon.net/emacs/emacs-imagemagick-remove-exif.html" rel="alternate" type="text/html" title="[Emacs] ImageMagickとの連携でEXIF情報を取り除く" /><published>2019-05-13T12:22:00+09:00</published><updated>2022-02-02T00:42:18+09:00</updated><id>https://code.lioon.net/emacs/emacs-imagemagick-remove-exif</id><content type="html" xml:base="https://code.lioon.net/emacs/emacs-imagemagick-remove-exif.html"><![CDATA[<p>JPGファイルからEXIFやGPSなどの付加情報を取り除きたいことがある。</p>

<p>今までは専用のツールを使っていたが、ふとImageMagickでできるのでは？と調べたら、案の定できることがわかったのでメモ。</p>

<!--more-->

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ convert -strip 入力ファイル 出力ファイル
</code></pre></div></div>

<p>このように<code class="language-plaintext highlighter-rouge">-strip</code>オプションを使えるだけでよい。入力と出力を同じファイル名にすれば上書きになるが、簡単に</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mogrify -strip 入力ファイル
</code></pre></div></div>

<p>としても上書きできる。</p>

<p>さらにEmacsと組合せることで、GUIなソフト並に手軽に、EXIF情報の掃除ができる。</p>

<p>要するに、<code class="language-plaintext highlighter-rouge">dired-do-shell-command</code>を使うだけで、別にImageMagickに限った話ではない。Emacsユーザーにはお馴染の話だろうが、やっぱりEmacsは最高だと思ったので、あえて説明しておく。</p>

<p>Diredバッファを開き、変換したいファイルを選択しておく。</p>

<pre><code class="language-emacs:">  /Users/bird/images:
  total used in directory 28960 available 6194084
  drwxr-xr-x    9 bird  staff      306  5 13 09:42 .
  drwxr-xr-x@ 164 bird  staff     5576  5 13 09:39 ..
* -rw-r--r--@   1 bird  staff  2272263  5  5 17:27 image1.jpg
* -rw-r--r--    1 bird  staff  1849400  5  5 17:27 image2.jpg
  -rw-r--r--    1 bird  staff  2443233  5  5 17:27 image3.jpg
</code></pre>

<p><code class="language-plaintext highlighter-rouge">!</code>キー押下で<code class="language-plaintext highlighter-rouge">dired-do-shell-command</code>を実行すると、次のようなプロンプトが表示されるはず。</p>

<pre><code class="language-bash:">! on * [2 files]: 
</code></pre>

<p>ここで、次のようなコマンドを入力する。</p>
<pre><code class="language-bash:">convert -strip ? new-`?`
</code></pre>

<p>` ? <code class="language-plaintext highlighter-rouge">と</code><code class="language-plaintext highlighter-rouge"> </code>?<code class="language-plaintext highlighter-rouge"> </code>`がファイル名に置き換わり、この例では二つのコマンドがそれぞれ実行される。</p>

<pre><code class="language-bash:">convert -strip image1.jpg new-image1.jpg
convert -strip image2.jpg new-image2.jpg	
</code></pre>

<p>これでEXIF等がないJPGファイルが得られる。Diredを使えば、ファイル名を指定する手間が減るので便利だ。</p>

<p>もし上書きでいいのであれば、mogrifyを使って</p>
<pre><code class="language-bash:">mogrify -strip
</code></pre>
<p>とすれば、さらに手軽。しかし、その分、誤ってオリジナルを消してしまうリスクが増えるので、こっちは覚えないほうがいいかも。</p>

<p>ちなみに、<code class="language-plaintext highlighter-rouge"> ? </code>と<code class="language-plaintext highlighter-rouge">`?`</code>の違いは、<code class="language-plaintext highlighter-rouge"> ? </code>が前後にスペースが必要なのに対して、<code class="language-plaintext highlighter-rouge">`?`</code>はスペースが使えない場所で使う。</p>]]></content><author><name>Lioon</name></author><category term="emacs" /><category term="imagemagick" /><summary type="html"><![CDATA[JPGファイルからEXIFやGPSなどの付加情報を取り除きたいことがある。 今までは専用のツールを使っていたが、ふとImageMagickでできるのでは？と調べたら、案の定できることがわかったのでメモ。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/emacs.png" /><media:content medium="image" url="https://code.lioon.net/emacs.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">ImageMagickでheicをjpegへ変換</title><link href="https://code.lioon.net/command/imagemagick-heic-jpg.html" rel="alternate" type="text/html" title="ImageMagickでheicをjpegへ変換" /><published>2019-05-04T00:00:00+09:00</published><updated>2019-06-04T10:19:00+09:00</updated><id>https://code.lioon.net/command/imagemagick-heic-jpg</id><content type="html" xml:base="https://code.lioon.net/command/imagemagick-heic-jpg.html"><![CDATA[<p>iOS11になってカメラのフォーマットはHEIF(<a href="https://ja.wikipedia.org/wiki/High_Efficiency_Image_File_Format">Wikipedia</a>) がデフォルトになっている。</p>

<p>そういうことを知らずに、iPhone7で撮影した写真をMacに取り込んだら、拡張子が、<em>.heic</em> になっていたから、ちょっとビビった。</p>

<!--more-->

<p>いろいろ調べてみると、HEIFはすでに国際標準規格になっているようで、安心してJPEGから移行できそうだ。それに、HEIF自体はコンテナすぎないという仕様がなかなかクールで気に入った。<br />
<a href="https://av.watch.impress.co.jp/docs/topic/minitopi/1098867.html">【ミニトピ】iOS 11の写真/動画形式「HEIF」と「HEVC」。従来とは何が違う? - AV Watch Watch</a></p>

<p>問題は、今使っているMacが10.11のEl Capitanなので、残念ながら、heicには対応していないこと。</p>

<p>というわけで、画像ファイルのフォーマット変換といえば、ImageMagick。</p>

<p>HomebrewのImageMagickは、3ヶ月ほど前のバージョンで、標準でlibheifが有効になっている。
使っていたのが、古いバージョンだったので、まずはアップデート。</p>

<pre><code class="language-bash:">$ brew upgrade imagemagick
</code></pre>

<p>これで、次にようにすれば、変換できる。</p>
<pre><code class="language-bash:">$ mogrify -format jpg image.heic
</code></pre>
<p>image.jpgが生成されるはず。</p>

<p>複数のファイルをまとめて変換するなら、ワイルドカードを使えばよい。</p>

<pre><code class="language-bash:">$ mogrify -format jpg *.heic
</code></pre>
<p>逆にHEICファイルへ変換することもできるようだ。</p>

<pre><code class="language-bash:">$ mogrify -format heic image.png
</code></pre>

<p>ファイル名を変更するなら、<code class="language-plaintext highlighter-rouge">convert</code>を使う。</p>

<pre><code class="language-bash:">$ convert image.heic image.jpg
</code></pre>

<p>画像を確認すると、exifやGPSなどの付加情報は保持されている(逆に消したい場合は、<code class="language-plaintext highlighter-rouge">-strip</code>をつける)
当然、heicでしか保持できない付加情報は、除かれてしまうだろう。
画像ファイルのオリジナルとして、heicファイルを保管しておき、必要に応じてconvertしていこうと思う。</p>

<h2>更新履歴</h2>
<ul>
  <li>2019-05-13 mogrifyコマンドを追加。誤記訂正。</li>
  <li>2019-06-03 表現を修正</li>
</ul>]]></content><author><name>Lioon</name></author><category term="command" /><category term="imagemagick" /><summary type="html"><![CDATA[iOS11になってカメラのフォーマットはHEIF(Wikipedia) がデフォルトになっている。 そういうことを知らずに、iPhone7で撮影した写真をMacに取り込んだら、拡張子が、.heic になっていたから、ちょっとビビった。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/numbers.jpg" /><media:content medium="image" url="https://code.lioon.net/numbers.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Emacs] org-modeのcaptureで独自の日付形式を使いたい</title><link href="https://code.lioon.net/emacs/org-capture-custom-date-format.html" rel="alternate" type="text/html" title="[Emacs] org-modeのcaptureで独自の日付形式を使いたい" /><published>2018-06-04T00:00:00+09:00</published><updated>2022-02-02T00:42:18+09:00</updated><id>https://code.lioon.net/emacs/org-capture-custom-date-format</id><content type="html" xml:base="https://code.lioon.net/emacs/org-capture-custom-date-format.html"><![CDATA[<p>org-modeのcapture機能で、独自フォーマットの日付を挿入する方法を紹介します。</p>

<!--more-->

<p>通常は、テンプレートに<code class="language-plaintext highlighter-rouge">%T</code>とか<code class="language-plaintext highlighter-rouge">%t</code>などの変数を書いておくのが、org-mode的だと思うのですが、独自のフォーマットが使いたいときは、次の形式を使います。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>%&lt;...&gt;
</code></pre></div></div>
<p>例えば、</p>

<pre><code class="language-plain">%&lt;%Y-%m-%d %H:%M&gt;
</code></pre>
<p>は</p>
<pre><code class="language-plain">2018-06-01 12:34
</code></pre>
<p>のように変換されます。</p>

<pre><code class="language-plain">%&lt;%m月%d日の記録&gt;
</code></pre>
<p>と書いて</p>
<pre><code class="language-plain">06月01日の記録
</code></pre>
<p>こんな感じに変換できます。</p>

<p>書式は、elispの<code class="language-plaintext highlighter-rouge">format-time-string</code>と同じです。</p>

<p>EmacsのInfo <code class="language-plaintext highlighter-rouge">Emacs Lisp</code>の<code class="language-plaintext highlighter-rouge">40.8 Parsing and Formatting Times</code>の次の項目を参照してください。</p>

<p>– Function: format-time-string format-string &amp;optional time zone</p>

<p>以上、メモでした。</p>]]></content><author><name>Lioon</name></author><category term="emacs" /><category term="org-mode" /><summary type="html"><![CDATA[org-modeのcapture機能で、独自フォーマットの日付を挿入する方法を紹介します。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/emacs.png" /><media:content medium="image" url="https://code.lioon.net/emacs.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Shell] findコマンドのパターンマッチングはテキスト的</title><link href="https://code.lioon.net/shell/find-path-matching.html" rel="alternate" type="text/html" title="[Shell] findコマンドのパターンマッチングはテキスト的" /><published>2018-03-02T00:00:00+09:00</published><updated>2022-01-16T12:17:16+09:00</updated><id>https://code.lioon.net/shell/find-path-matching</id><content type="html" xml:base="https://code.lioon.net/shell/find-path-matching.html"><![CDATA[<p>findコマンドは、いろいろオプションがありすぎて、あまり深入りせずに適度に付き合ってきました。</p>

<p>ですが、ちょっとやりたいことがあって、いろいろいじっていたところ、基本的なことで勘違いしていることに気付きました。</p>

<!--more-->

<p>今まで、例えば、<code class="language-plaintext highlighter-rouge">_assets</code>という名前のディレクリだけを表示したいとき、次のように実行していました。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ find . -type d  -path '*_assets*'
./_assets
./_assets/images
./_assets/images/fc
./_assets/images/lowspeed
./_assets/images/rakuten
./_assets/images/run
./_assets/js
</code></pre></div></div>

<p>-pathオプションには<code class="language-plaintext highlighter-rouge">-path '_assets'</code>でなく、<code class="language-plaintext highlighter-rouge">-path '*_assets*'</code>と、アスタリスクで囲って指定してやらないと、なにもマッチされません。<code class="language-plaintext highlighter-rouge">-path '_assets'</code>だとなにもヒットしないのです。</p>

<p>なんだか気持ち悪いけれど、そういうもの、ということで深入りしてませんでした。</p>

<p>ですが、いろいろいじってMANページ読んで、いまさら気付いたのです。これ、検索結果の文字列にマッチされているだけなんですね。ディレクトリ構造として認識して処理してるわけじゃない。</p>

<p>前述の例から条件を変えて、<code class="language-plaintext highlighter-rouge">-path './_assets'</code>にして試してみると、</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> $ find . -type d  -path './_assets'
 ./_assets
</code></pre></div></div>

<p>このように、完全にマッチした行だけ表示されます。</p>

<p>さらに、検索するディレクトリを<code class="language-plaintext highlighter-rouge">.</code>ではなく、<code class="language-plaintext highlighter-rouge">./</code>へ変更すると、</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> $ find ./ -type d  -path './_assets'
 # 結果なし
</code></pre></div></div>

<p>なにもヒットしなくなります。これは検索している場所は同じなのですが、実行結果のパスの表記が違ってくるのです。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ find ./ -type d  -path '*_assets*'
.//_assets
.//_assets/images
.//_assets/images/fc
.//_assets/images/lowspeed
.//_assets/images/rakuten
.//_assets/images/run
.//_assets/js
</code></pre></div></div>

<p>単純に、<code class="language-plaintext highlighter-rouge">.//_assets</code>と<code class="language-plaintext highlighter-rouge">./_assets</code>をテキストとしてマッチさせているだけなので、マッチしないから何もヒットしないのですね。表現の形式が違うだけで、同じディレクトリを示しているので、マッチするものだと思い込んでました。</p>

<p>となれば、こんなマッチングもできるはず。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ find ./ -type d  -path '*s/fc*'
.//_assets/images/fc
.//_site/assets/fc
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">/</code>はパスの区切りという思い込みがあったので、今までこんな発想はありませんでした。</p>

<p>単純にテキストとしてマッチさせているだけなので、findって意外と簡単だなと思えるようになりました。</p>]]></content><author><name>Lioon</name></author><category term="shell" /><summary type="html"><![CDATA[findコマンドは、いろいろオプションがありすぎて、あまり深入りせずに適度に付き合ってきました。 ですが、ちょっとやりたいことがあって、いろいろいじっていたところ、基本的なことで勘違いしていることに気付きました。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/brain.png" /><media:content medium="image" url="https://code.lioon.net/brain.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">[Emacs] shellモードの初期化ファイル</title><link href="https://code.lioon.net/emacs/shell-bashrc.html" rel="alternate" type="text/html" title="[Emacs] shellモードの初期化ファイル" /><published>2018-02-24T00:00:00+09:00</published><updated>2022-02-02T00:42:18+09:00</updated><id>https://code.lioon.net/emacs/shell-bashrc</id><content type="html" xml:base="https://code.lioon.net/emacs/shell-bashrc.html"><![CDATA[<p>Emacsのshellモードは、shellの<code class="language-plaintext highlighter-rouge">~/.bash_profile</code>や<code class="language-plaintext highlighter-rouge">~/.bashrc</code>のような初期化ファイルを起動時に読んでくれないようです。</p>

<p>不便なので調べてみたところ、きちんとそれ用のファイルが用意されていました。</p>

<!--more-->

<p>通常のshellのスクリプトの代りに、<code class="language-plaintext highlighter-rouge">~/.emacs_${shell名}</code>のファイルを用意しておけば、shellモードの起動時に読み込まれます。このファイルがなければ、<code class="language-plaintext highlighter-rouge">~/.emacs.d/init_${shell名}</code>が読み込まれます。</p>

<p>僕はbashを使っているので、次のようなファイルを用意すればいいわけです。</p>
<ul>
  <li>~/.emacs_bash</li>
  <li>~/.emacs.d/init_bash</li>
</ul>]]></content><author><name>Lioon</name></author><category term="emacs" /><category term="shell" /><category term="忘備録" /><summary type="html"><![CDATA[Emacsのshellモードは、shellの~/.bash_profileや~/.bashrcのような初期化ファイルを起動時に読んでくれないようです。 不便なので調べてみたところ、きちんとそれ用のファイルが用意されていました。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://code.lioon.net/emacs.png" /><media:content medium="image" url="https://code.lioon.net/emacs.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>