<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web関連  |  ryo blog</title>
	<atom:link href="index.xml" rel="self" type="application/rss+xml" />
	<link>../../../index.html</link>
	<description>Web関連のあれこれと日記</description>
	<lastBuildDate>Thu, 09 Jan 2020 05:30:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.18</generator>

<image>
	<url>../../../wp-content/uploads/2018/07/cropped-512-4-100x100.png</url>
	<title>Web関連  |  ryo blog</title>
	<link>../../../index.html</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Photoshop】カラーモードを変更</title>
		<link>../../../web/4009/index.html</link>
					<comments>../../../web/4009/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Thu, 09 Jan 2020 00:28:37 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<category><![CDATA[CMYK]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[RGB]]></category>
		<category><![CDATA[カラーモード]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=4009</guid>

					<description><![CDATA[Photoshopでカラーモードを変更する場合は「イメージ」→「モード」から変更します。 ただし、いくつか注意点があります。 目次 カラーモードCMYKとRGBカラーモード変更時の注意点CMYKで色を正確に表現するにはR [&#8230;]]]></description>
										<content:encoded><![CDATA[
Photoshopでカラーモードを変更する場合は「イメージ」→「モード」から変更します。



ただし、いくつか注意点があります。





  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">カラーモード</a><ol><li><a href="#toc2" tabindex="0">CMYKとRGB</a></li><li><a href="#toc3" tabindex="0">カラーモード変更時の注意点</a></li></ol></li><li><a href="#toc4" tabindex="0">CMYKで色を正確に表現するには</a></li><li><a href="#toc5" tabindex="0">RGBで色を正確に表現するには</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">カラーモード</span></h2>




画像の色情報にはいくつかの種類があります。<br><br>Photoshopのモード一覧を見てみると、以下のようになっています。



<figure class="wp-block-image size-large"><img loading="lazy" width="378" height="458" src="../../../wp-content/uploads/2020/01/mode_change.png" alt="" class="wp-image-4017" srcset="../../../wp-content/uploads/2020/01/mode_change.png 378w, ../../../wp-content/uploads/2020/01/mode_change-248x300.png 248w" sizes="(max-width: 378px) 100vw, 378px" /></figure>



この中でもっとも使われるのがCMYK、RGBだと思います。




<h3><span id="toc2">CMYKとRGB</span></h3>




この2つは、画像の使用目的によって使い分けます。<br><br>印刷するものにはCMYK、Webなどモニターに表示するものにはRGBです。



<strong>CMYK</strong>は




<ul><li>シアン(Cyan)</li><li>マゼンダ(Magenta)</li><li>イエロー(Yellow)</li><li>キー・プレート(Key plate) (黒)</li></ul>




のそれぞれの頭文字をとったもので、印刷時のインク量を色情報として記録します。<br><br><strong>RGB</strong>は




<ul><li>あか(Red)</li><li>みどり(Green)</li><li>あお(Blue)</li></ul>




の3色をもとにしたもので、それぞれの色の強さを1ピクセルごとに記録します。<br><br>PhotoshopでCMYKの画像を編集している場合の画面での表示は常時RGBに変換したもののようです。 




<h3><span id="toc3">カラーモード変更時の注意点</span></h3>




カラーモードを変更すると画像の色味が変わります。<br><br>CMYKとRGBは記録するときの基準の色が異なるのでカラーモードを変更するときは各ピクセルごとの色を計算し、変換します。<br><br>このとき、それぞれが表現できる色の範囲には限界があるので、そこから外れる色は近い色に変換されます。<br><br>CMYKからRGBでも、RGBからCMYKのどちらの変換も色味が変わることが多いので、変換前後で比較して調整してください。




<h2><span id="toc4">CMYKで色を正確に表現するには</span></h2>




CMYKを正確にディスプレイで表現することは非常に難しいです。<br><br>このカラーモードを使用するときは印刷物だと思われます。<br>実際に印刷して色を確認してください。<br><br>印刷会社など、それを専門としているところでは「カラーマネジメントモニター」と呼ばれる高級なディスプレイを使用しています。<br><br>そういったディスプレイでは、表示された色が本当に正しい色かセンサーを用いて調整ができるものもあり、かなりの精度が保証されています。




<h2><span id="toc5">RGBで色を正確に表現するには</span></h2>




不可能です。<br>あきらめてください。<br><br>流通しているディスプレイは玉石混交であり、かつディスプレイの個体差も考慮すると、すべてのデバイスで色を正確に再現することはほぼ不可能です。<br><br>その中でも一定の品質が期待できるiPhoneで確認し、色がきれいに出ていればおおむね問題ないでしょう。
]]></content:encoded>
					
					<wfw:commentRss>../../../web/4009/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>オブジェクトでmapメソッドを使う(JavaScript)</title>
		<link>../../../web/3988/index.html</link>
					<comments>../../../web/3988/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Fri, 15 Nov 2019 01:30:53 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=3988</guid>

					<description><![CDATA[配列の場合は以下のようにmapメソッドを使うことができます。 しかし、objectの場合はmapやforEachが使えません。 かわりにkeysメソッドを使います。 Object.keys()にオブジェクトを渡すと、オブ [&#8230;]]]></description>
										<content:encoded><![CDATA[
配列の場合は以下のようにmapメソッドを使うことができます。




<pre class="wp-block-code"><code>const array = [2, 3, 5]
console.log(array.map(e => e**2))
// [4, 9, 25]</code></pre>




しかし、objectの場合はmapやforEachが使えません。




<pre class="wp-block-code"><code>const object = {a: 2, b: 3, c: 5}
console.log(object.map(e => e**2))
// Error: object.map is not a function</code></pre>




かわりにkeysメソッドを使います。




<pre class="wp-block-code"><code>const object = {a: 2, b: 3, c: 5}
console.log(Object.keys(object).map(e => object[e]**2))
// [4, 9, 25]</code></pre>





<hr class="wp-block-separator"/>




Object.keys()にオブジェクトを渡すと、オブジェクトのキーの配列を返します




<pre class="wp-block-code"><code>const object = {a: 2, b: 3, c: 5}
console.log(Object.keys(object).map(e => e))
// ["a", "b", "c"]</code></pre>




これを使って配列のような処理が実行できます。



注意点として、Object.keys()は挿入した順番を保証していないので、objectにキーを追加した順番に処理を行いたいときは使えません。
]]></content:encoded>
					
					<wfw:commentRss>../../../web/3988/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu 16.04でMySQLのSTRICT_TRANS_TABLESをオフにする</title>
		<link>../../../web/387/index.html</link>
					<comments>../../../web/387/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Mon, 29 Oct 2018 07:43:01 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=387</guid>

					<description><![CDATA[目次 MySQLのSTRICT_TRANS_TABLESをオフにするSQLモードの変更まずは現状のSQLモードを確認SQLモードを変更する MySQLのSTRICT_TRANS_TABLESをオフにする 最近MySQLを [&#8230;]]]></description>
										<content:encoded><![CDATA[


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">MySQLのSTRICT_TRANS_TABLESをオフにする</a><ol><li><a href="#toc2" tabindex="0">SQLモードの変更</a><ol><li><a href="#toc3" tabindex="0">まずは現状のSQLモードを確認</a></li></ol></li><li><a href="#toc4" tabindex="0">SQLモードを変更する</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">MySQLのSTRICT_TRANS_TABLESをオフにする</span></h2>




最近MySQLをさわり始めたのですが、設定ファイルがいっぱいあって困惑したのでメモします。




<h3><span id="toc2">SQLモードの変更</span></h3>




あるCMSのインストールとテストをしようとしたら、STRICT_TRANS_TABLESをオフにしてくれと書いてあったのですが、いったいどこで変更するのやら？




<h4><span id="toc3">まずは現状のSQLモードを確認</span></h4>





<pre class="wp-block-code"><code>SELECT @@global.sql_mode;
/etc/mysql/mysql.conf.d/mysqld.cnf
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISIONNE_SUBSTITUTION

/etc/init.d/mysql restart</code></pre>




WordPress/Gutenbergの調子が悪くてこれ以上書けない笑<br><br>これは解決したけどどうやって解決したか忘れてしまった。<br><br>Gutenbergの調子よくなったけど今度は内容を忘れてしまった。<br><br>あるCMSってなんだろう。<br>WordPress？じゃないと思うけど&#8230;。<br><br>以下はいま使っているバージョン。




<pre class="wp-block-code"><code>mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.7.27-0ubuntu0.16.04.1 |
+-------------------------+
1 row in set (0.00 sec)</code></pre>





<h3><span id="toc4">SQLモードを変更する</span></h3>




なにはともあれ、sql_modeを変更するときは、以下のようにします。<br><br>これは何も設定しないとき。




<pre class="wp-block-code"><code>mysql> SET GLOBAL sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SELECT @@global.sql_mode;
+-------------------+
| @@global.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)</code></pre>




これはいろいろ設定するとき。




<pre class="wp-block-code"><code>mysql> SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.sql_mode;                                                                        +-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)</code></pre>




これがmysql 5.7のsql_modeの初期状態です。<br><br>また、my.cnfに書く方法もあります。
]]></content:encoded>
					
					<wfw:commentRss>../../../web/387/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>オーディオファイル切り分けの最初と最後の空白時間</title>
		<link>../../../web/320/index.html</link>
					<comments>../../../web/320/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Thu, 30 Aug 2018 01:35:42 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=320</guid>

					<description><![CDATA[録音をカットするとき、いつも悩むことがあります。最初の音が鳴った瞬間から最後の音が鳴り終わったところまでが1つのトラックですが、そこにピッタリ合わせてしまうといろいろ不都合が起きてしまいます。 目次 とりあえずカット曲の [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>録音をカットするとき、いつも悩むことがあります。<br/>最初の音が鳴った瞬間から最後の音が鳴り終わったところまでが1つのトラックですが、そこにピッタリ合わせてしまうといろいろ不都合が起きてしまいます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">とりあえずカット</a><ol><ol><li><a href="#toc2" tabindex="0">曲のはじまりのなやみ</a></li><li><a href="#toc3" tabindex="0">曲のおわりのなやみ</a></li></ol></li><li><a href="#toc4" tabindex="0">録音をウェブ上で聴く</a></li></ol></li><li><a href="#toc5" tabindex="0">世の中のアルバム</a></li><li><a href="#toc6" tabindex="0">というわけで</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">とりあえずカット</span></h2>



<p>ある吹奏楽の演奏会の録音をそれぞれの曲ごとのトラックへとカットする作業をやりました。とりあえず曲開始(最初の音が入った瞬間)の0.1秒前から開始して、最後の音が鳴り終わったところ(減衰して無音になったところ)までで切り出していました。<br/></p>



<h4><span id="toc2">曲のはじまりのなやみ</span></h4>



<p>曲の始まりはだいたい無音になっているのでわかりやすいのですが、今回は吹奏楽の録音だったので、気になるのはブレスの音です。<br/>音量大きくすると聞こえるんですね、これが。<br/>ブレスも曲のうちかなぁ&#8230;<br/>ちょっと悩んだのですが、ブレスするということは指揮者はもう振り始めているわけで、曲ということにしました。<br/></p>



<h4><span id="toc3">曲のおわりのなやみ</span></h4>



<p>トラックの最後で悩むのは最後の音の減衰を待たずに拍手が入ってしまうことです。<br/>奏者としては感激のあまり指揮者の礼を待たずに拍手してしまった感があってよいかもしれませんが、カットするときは曲の終わりがわからないので悩みます。<br/>今回は拍手の最初の音から5秒追加して、最後3秒をリニアフェードアウトの処理をしました。</p>



<h3><span id="toc4">録音をウェブ上で聴く</span></h3>



<p>カットした録音をウェブ上で聴けるようにしたところ、曲のはじまり0.1秒は短すぎました。<br/>また、曲の終わりも空間ほぼなし、拍手があっても+5秒で、これも短すぎました。<br/>まず、環境にもよりますがストリーミングのための読み込みとブラウザ処理のラグがあり、最初の0.5秒～1秒ほどは飛んでしまうことがあります。これが起こると最初の音はつぶれて聴こえません。曲の終わりも鳴り終わった直後に次の曲が始まってしまうので、せわしなくなってしまい、落ち着いて聴くことができません。<br/></p>



<h2><span id="toc5">世の中のアルバム</span></h2>



<p>参考として、CDなどの録音を調べてみました。<br/></p>



<p>カラヤンのニューイヤーコンサート1987では曲の先頭に0.2秒(0.15秒～0.25秒ほど)の空白があり、最後は拍手が入ってから終わるまで15秒ほどあり、フェードアウトかわかりませんがそのうち最後2～6秒は空白になっていました。</p>



<p>スタジオ録音のアルバムで手元にあったのは侍Brassの十拳剣で、曲の先頭の空白は1秒～2秒(平均1.2秒)で、終わりの空白は7秒～12秒(平均8秒ほど)でした。</p>



<p>また、侍Brassの楽団長中川英二郎氏が出したSlide Monstersでは、曲の先頭の空白は1.5秒～2.5秒(平均1.6秒ほど)で、終わりの空白は7秒～12秒(平均10秒ほど)でした。</p>



<h2><span id="toc6">というわけで</span></h2>



<p>今回はウェブ上で聴くことを目的としているので、読み込みのラグを考慮し先頭の空白は1秒以上とし、曲の最後は10秒以上取り、最後4秒ほどをフェードアウトすることにしました。</p>



<p><br/></p>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/320/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Adobe Premier と Adobe Media Encoder のかるーい使い方</title>
		<link>../../../web/316/index.html</link>
					<comments>../../../web/316/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Tue, 28 Aug 2018 04:33:11 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<category><![CDATA[Adobe]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=316</guid>

					<description><![CDATA[動画やアニメーションの制作とかメディア作って出版したりとか、そういうクリエイティブなことをするためのソフトですが、私は録画や録音したデータをただカットしたりエンコードしたりするときに使っています。 宝の持ち腐れとはまさに [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>動画やアニメーションの制作とかメディア作って出版したりとか、そういうクリエイティブなことをするためのソフトですが、私は録画や録音したデータをただカットしたりエンコードしたりするときに使っています。</p>



<p>宝の持ち腐れとはまさにこのこと。</p>



<p>ですが、無料のエンコードソフトや編集ソフトを使うと、映像内に文字列の消印を入れられてしまったり、対応しているファイル形式が少なかったりと制約が多く、なかなか自由にいきません。</p>



<p>Photoshop や Illustrator が目当てでAdobe CCを契約しましたが、すべてのソフトウェアが使えるのでせっかくなので使えそうなとこは使っています。</p>



<p>あ、最初に言っておきますが、別に使い方が軽いだけで、なにか動作が軽くなるとかそういう軽いではありません。</p>



<h3><span id="toc1">Adobe Premier と Adobe Media Encoder</span></h3>



<p>初めて動画編集やってみようと思ったとき、CCソフトウェア群の中に、Premier と Media Encoderがあって、え、なにが違うの？となったので簡単にまとめます。</p>



<p>ひとことで言うと、Media Encoder は補佐的なソフトです。Adobe Premier Pro で全ての作業ができますが、Media Encoder はないと不便です。<br/></p>



<h4><span id="toc2">Adobe Premier </span></h4>



<p>Adobe Premier は動画そのものの編集を行うソフトです。<br/>いくつかの動画ファイルをくっつけたり切り出したり、エフェクトをかけたり、やろうと思えばどんなこともできるらしいです。<br/>その機能は多彩すぎて把握しきれません。<br/>私は動画のカットやTC(タイムコード)の記録に使う程度です笑</p>



<h4><span id="toc3">Adobe Media Encoder</span></h4>



<p>Adobe Media Encoder はその名の通りエンコードを専門とするソフトウェアです。<br/>エンコードとは、いわゆるデータ形式を変換することです。<br/>これにはCPUやGPUの高い計算処理能力が必要で、一般的に時間がかかる作業です。(始めてしまえば放置だけど)<br/>Adobe Premier で作った動画ファイルを出力しようとしたときに<br/>ファイル > 書き出し > メディア<br/>などで独立したファイルとして書き出すことができますが、この操作の度に重いエンコード処理が走るとその都度作業を中断しなくてはなりません。<br/>そこで役立つのがこのAdobe Media Encoderです。<br/>メディア出力画面で、「書き出し」ではなく「キュー」を押すとAdobe Media Encoderが起動し、出力情報が登録されます。<br/>キューはストックされAdobe Media Encoder上で「キューを開始」ボタンを押すと、登録された順にエンコードが開始されます。<br/>エンコードをこのソフトで分けて行うことで、Adobe Premier側は常に操作することができます。</p>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/316/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ExpressでPOSTを受け取るとき</title>
		<link>../../../web/306/index.html</link>
					<comments>../../../web/306/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Tue, 24 Jul 2018 13:57:13 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<category><![CDATA[Express]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=306</guid>

					<description><![CDATA[JavaScriptで何らかのリクエストを送る、受け取るときって多いですが、 送信側 fetch APIでPOST 受信側 Express(Node.js) のときに、bodyが空っぽになっちゃって困った。 ってなったと [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>JavaScriptで何らかのリクエストを送る、受け取るときって多いですが、<br />
送信側 fetch APIでPOST<br />
受信側 Express(Node.js)<br />
のときに、bodyが空っぽになっちゃって困った。<br />
ってなったときのメモです。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">fetch APIでリクエストを送信</a></li><li><a href="#toc2" tabindex="0">ExpressでPOSTを受け取る</a><ol><li><a href="#toc3" tabindex="0">準備</a></li><li><a href="#toc4" tabindex="0">ExpressでPOSTを受け取る</a></li><li><a href="#toc5" tabindex="0">最終的なコード</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">fetch APIでリクエストを送信</span></h2>
<p>おおむね<a href="https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch">MDN web docs (fetch 概説)</a>で紹介されているものと同じです。</p>
<pre><code class="javascript">fetch('リクエスト先URL', {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    user: 'user',
    data: 'data'
  })
})
.then(response =&gt; {
  if (response.status === 200) {
    return response.json()
  } else {
    console.warn('Something went wrong on api server!');
  }
})
.then(json =&gt; {
  return callback(json)
})
.catch(error =&gt; {
  console.error(error);
})
</code></pre>
<h2><span id="toc2">ExpressでPOSTを受け取る</span></h2>
<h3><span id="toc3">準備</span></h3>
<p>ExpressでPOSTを受信するのはこんな感じです。</p>
<pre><code class="javascript">const express = require('express')
const app = express()
app.listen(3000)

app.post('/request', (req, res) =&gt; {
  console.log(req.body)
  res.send('OK')
})
</code></pre>
<h3><span id="toc4">ExpressでPOSTを受け取る</span></h3>
<p>さらにPOSTパラメータも受け取るにはbody-parserを使います。<br />
npmで入れてから、以下を追記します。</p>
<pre><code class="javascript">const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())
</code></pre>
<p>ここで、この一文を書かないと受信したbodyがからっぽになります。</p>
<pre><code class="javascript">app.use(bodyParser.json())
</code></pre>
<p>HTMLのformなどから送られるデータはurlencode形式ですが、上記したfetchで送られるPOSTデータはjson形式で送られるので、urlencodeとは別にjsonも初期化が必要です。</p>
<h3><span id="toc5">最終的なコード</span></h3>
<pre><code class="javascript">const express = require('express')
const app = express()

const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())

app.listen(3000)

app.post('/request', (req, res) =&gt; {
  console.log(req.body)
  res.send('OK')
})
</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/306/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>React Nativeでよくみるエラー</title>
		<link>../../../web/295/index.html</link>
					<comments>../../../web/295/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Mon, 23 Jul 2018 02:03:29 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=295</guid>

					<description><![CDATA[エラー文とその解決時のメモです。 遭遇するたびに追加していこうと思います。 目次 React NavigationでNavigationをネストしたとき経緯エラー文 React NavigationでNavigation [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>エラー文とその解決時のメモです。<br />
遭遇するたびに追加していこうと思います。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">React NavigationでNavigationをネストしたとき</a><ol><li><a href="#toc2" tabindex="0">経緯</a></li><li><a href="#toc3" tabindex="0">エラー文</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">React NavigationでNavigationをネストしたとき</span></h2>
<h3><span id="toc2">経緯</span></h3>
<p>画面遷移を実装するために公式のドキュメントでもおすすめされているReact Navigationを使って、<br />
作ったNavigationをネストしようとしたときに出たエラーです。</p>
<p><a rel="noopener" href="https://reactnavigation.org/" target="_blank">React Navigation</a></p>
<p>Expoで実行しつつ作っていたら</p>
<div class="warning-box">You should only render one navigator explicitly in your app, and other navigators should by rendered by including them in that navigator. Full details at: https://reactnavigation.org/docs/common-mistakes.html#explicitly-rendering-more-than-one-navigator</div>
<p>というWarningが出てました。</p>
<p><a rel="noopener" href="https://reactnavigation.org/docs/en/common-mistakes.html" target="_blank">Common mistakes &#8211; React Navigation</a></p>
<p>Warningに記されているURL先を確認すると、よくある間違いをやっていたようなので修正すると以下のエラーを出すようになりました。</p>
<h3><span id="toc3">エラー文</span></h3>
<div class="danger-box">The component for route &#8216;*&#8217; must be a React component. For example:</div>
<p>ドキュメントに書いてある通りにやってるのに変だなーと思っていたのですが、書いてある通りにやってなかったという。<br />
そのときのコードを公式ドキュメントのコードを元に再現すると、</p>
<pre><code class="javascript">export default App extends React.Component {
  render () {
    return &lt;AppNavigator /&gt;
  }
}

const AppNavigator = createSwitchNavigator({
  Auth: AuthenticationNavigator,
  Home: HomeScreen,
})

const AuthenticationNavigator = createStackNavigator({
  SignIn: SignInScreen,
  ForgotPassword: ForgotPasswordScreen,
})
</code></pre>
<p>こんな感じにしてました。<br />
constの宣言順が大事です。<br />
AuthenticationNavigatorを宣言する前にAppNavigatorで呼び出そうとしてたのが悪かったみたい。</p>
<pre><code class="javascript">export default App extends React.Component {
  render () {
    return &lt;AppNavigator /&gt;
  }
}

const AuthenticationNavigator = createStackNavigator({
  SignIn: SignInScreen,
  ForgotPassword: ForgotPasswordScreen,
})

const AppNavigator = createSwitchNavigator({
  Auth: AuthenticationNavigator,
  Home: HomeScreen,
})
</code></pre>
<p>解決しました。</p>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/295/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu Server 16.04にNode.jsをインストールする</title>
		<link>../../../web/227/index.html</link>
					<comments>../../../web/227/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Fri, 23 Feb 2018 07:05:25 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[サーバ]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=227</guid>

					<description><![CDATA[目次 Ubuntu 16.04LTSにNode.js実行環境を用意する使用するライブラリをインストールNVMのインストール Ubuntu 16.04LTSにNode.js実行環境を用意する Ubuntu 16.04 LT [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Ubuntu 16.04LTSにNode.js実行環境を用意する</a><ol><li><a href="#toc2" tabindex="0">使用するライブラリをインストール</a></li><li><a href="#toc3" tabindex="0">NVMのインストール</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">Ubuntu 16.04LTSにNode.js実行環境を用意する</span></h2>
<p>Ubuntu 16.04 LTSにNode.jsの環境を作るメモ。<br />
(Ubuntu 18.04でもこの方法でOKでした)<br />
今回はnvmを使った構築手順です。<br />
nvmはNode.jsのダウンロードとバージョン管理ができます。<br />
なお、以下のコマンドは基本的にrootで書いているので、使用の際には適宜sudoを付与ください。</p>
<h3><span id="toc2">使用するライブラリをインストール</span></h3>
<pre><code class="shell"># apt-get install build-essential libssl-dev
# apt-get install curl
</code></pre>
<h3><span id="toc3">NVMのインストール</span></h3>
<p>nvmはnodeのバージョンを管理するソフトウェアです。<br />
これを使ってnodeをインストールします。</p>
<pre><code class="shell"># curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
# source ~/.bashrc
</code></pre>
<p>これでnvmコマンドが使えるようになります。</p>
<p>ダウンロードできるNodeのバージョンは以下のコマンドで確認できます。</p>
<pre><code class="shell"># nvm ls-remote
</code></pre>
<p>バージョン番号を指定してNodeのインストールを行うには以下のようにします。(バージョン10.6.0の場合)</p>
<pre><code class="shell"># nvm install v10.6.0
</code></pre>
<p>ひとつだけの場合はすぐNodeが使用できるようになりますが、複数のバージョンをインストールして切り替えて使用することも可能です。</p>
<p>使いたいNodeのバージョンを切り替える場合は以下のコマンドです。</p>
<pre><code class="shell"># nvm use v10.6.0
</code></pre>
<p>現在インストール済みのNodeのバージョンなどの情報は以下のコマンドで確認できます。</p>
<pre><code class="shell"># nvm ls
</code></pre>
<p>nvmおよび現在使用しているNodeのバージョンは以下のコマンドでそれぞれ確認できます。</p>
<pre><code class="shell"># nvm --version
# node -v
</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/227/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>iOS Safariでiframe内の要素のスクロール量が取得できない</title>
		<link>../../../web/210/index.html</link>
					<comments>../../../web/210/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Fri, 17 Nov 2017 06:40:06 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=210</guid>

					<description><![CDATA[iOS Safariのiframe内要素のスクロール量が取得できない問題 iframe内に別ページを表示させてフレーム付きページのようなものを作ろうとしています。 iframe内に表示させるページをそのまま表示するとうま [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>iOS Safariのiframe内要素のスクロール量が取得できない問題</h2>
<p>iframe内に別ページを表示させてフレーム付きページのようなものを作ろうとしています。<br />
iframe内に表示させるページをそのまま表示するとうまく動作するjQueryが、iframe内に表示させると、scroll関連イベントが発火しない問題に悩まされています。<br />
ChromeやIE、デスクトップ版のSafariでは想定通りに動作するのですが、iPhone Safariのみうまく動かないのです。</p>
<p>調べてみるとiframe内の要素はscrollTopが常に0でイベントも発生しないことから、iPhoneにとってはスクロールもしていないみたいです。<br />
どうやら、iOS Safariでは親ページ基準でスクロール判定されている模様。<br />
iframe自体はCSSでウィンドウサイズぴったりに合わせているので、中身だけがスクロールしていて、iframeそのものはスクロールしていないということなのでしょう。</p>
<p>解決策としてはiframeの外から要素指定してやることらしいですが、まだうまくいっていません…。<br />
もう少しいろいろ試してみます。</p>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/210/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>オリジナルプレイヤーの作成</title>
		<link>../../../web/193/index.html</link>
					<comments>../../../web/193/index.html#respond</comments>
		
		<dc:creator><![CDATA[ryo4004]]></dc:creator>
		<pubDate>Tue, 14 Nov 2017 06:25:07 +0000</pubDate>
				<category><![CDATA[Web関連]]></category>
		<guid isPermaLink="false">https://blog.ryo4004.net/?p=193</guid>

					<description><![CDATA[目次 audioタグを使ったオリジナルプレイヤーの作り方audioタグの操作HTMLJavascriptを書く再生と停止のためのJavascriptコントローラの実装まとめ audioタグを使ったオリジナルプレイヤーの作 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">audioタグを使ったオリジナルプレイヤーの作り方</a></li><li><a href="#toc2" tabindex="0">audioタグの操作</a><ol><li><a href="#toc3" tabindex="0">HTML</a></li><li><a href="#toc4" tabindex="0">Javascriptを書く</a></li><li><a href="#toc5" tabindex="0">再生と停止のためのJavascript</a></li><li><a href="#toc6" tabindex="0">コントローラの実装</a></li></ol></li><li><a href="#toc7" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">audioタグを使ったオリジナルプレイヤーの作り方</span></h2>
<p>前回、audioタグの一番簡単な使い方について書きましたが、やはりブラウザによって表示が異なるのはデザインの観点でも困りますね。<br />
今回はデザインを統一するためにも、オリジナルのコントローラーを作成する方法について書いていけたらな、と思います。</p>
<p>ところで、プレイヤー？プレーヤー？<br />
どっちが正しいんでしょ。<br />
Google検索によると</p>
<ul>
<li>プレイヤー: 約 58,600,000 件</li>
<li>プレーヤー: 約 63,000,000 件</li>
</ul>
<p>でプレーヤーの方が多いですが、Wikipediaの表題はプレイヤーですね。<br />
まぁどっちでもいいか。</p>
<h2><span id="toc2">audioタグの操作</span></h2>
<p>さて、audioタグを操作するためには何が必要かというと、</p>
<ul>
<li>再生、停止機能</li>
<li>シーク機能</li>
<li>音量調整機能</li>
</ul>
<p>ブラウザのデフォルトコントローラでできるのはこのあたりでしょうか。</p>
<p>この機能はHTMLやCSSだけでは制御できないので、これらをJavascriptに置き換えていきます。</p>
<h3><span id="toc3">HTML</span></h3>
<p>まず、HTMLを用意します。</p>
<pre><code class="html">&lt;html lang="ja"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Music Player&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;audio src="" onclick="" preload="none" style="display:none;"&gt;&lt;/audio&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>audioタグはcontrols属性を追加しなければコントローラは表示されないと思いますが、CSSでdisplay:none;を設定しておけば、場所を取ることはないはず。</p>
<h3><span id="toc4">Javascriptを書く</span></h3>
<p>そして、Javascriptを書いていきます。<br />
場所はHTMLファイル内のどこでも大丈夫です。<br />
最近は&lt;/body&gt;の前に書くことが多いらしいですね。</p>
<pre><code class="javascript">&lt;script type="text/javascript"&gt;
var media = document.getElementsByTagName("audio")[0];
var src = "media/sample.mp3";
media.src = src;
&lt;/script&gt;
</code></pre>
<p>Javascriptは私もかじったようなものなので、詳細な説明は省きますが、<br />
mediaという変数を用意して、そこにページ内の1つ目のaudio要素を格納しています。<br />
これでmediaはインスタンスのような感じになります。<br />
ページ内に複数のaudioタグがある場合は、先頭から番号が振られ、末尾の[0]の数字で指定できます。<br />
配列と同じなので、最初は0です。</p>
<p>HTML内のaudioタグにはsrc属性を指定していないので、このままでは再生できません。<br />
ここでは、Javascript内で変数srcを用意し、そこにメディアファイルへのパス(URL)を格納します。<br />
それをそのまま、media.srcに指定します。</p>
<h3><span id="toc5">再生と停止のためのJavascript</span></h3>
<p>次に再生、停止するための関数を用意します。</p>
<pre><code class="javascript">&lt;script type="text/javascript"&gt;
function play() {
    media.play();
}
function pause() {
    media.pause();
}
function stop() {
    pause();
    media.currentTime = 0;
}
function start() {
    if(!media.paused){
        pause();
    }else{
        play();
    }
}
&lt;/script&gt;
</code></pre>
<p>mediaオブジェクトのメソッドを呼び出すだけの関数です。<br />
そのまま、playメソッドは再生、pauseメソッドは再生中のファイルを一時停止します。<br />
再生を停止するには、pause処理をしたあと、再生位置(currentTime)を0にすれば良いです。</p>
<h3><span id="toc6">コントローラの実装</span></h3>
<p>これを制御するコントローラを作ります。<br />
なんでもいいのですが、今回はdivにします。<br />
div要素をクリックしたときに各関数を呼び出せばOKです。</p>
<pre><code class="html">&lt;div id="play" onclick="start();"&gt;再生&lt;/div&gt;
&lt;div id="stop" onclick="stop();"&gt;停止&lt;/div&gt;
</code></pre>
<pre><code class="css">div {
    display: inline-block;
    width: 50px;
    height: 50px;
}
</code></pre>
<p>これが再生、停止ボタンになります。<br />
再生ボタンを押すと再生されます。<br />
再生中は一時停止ボタンとして利用できます。<br />
また、play()、pause()、stop()の各関数内で、divの内容を書き換えることで、より操作性が上がると思います。</p>
<pre><code class="javascript">document.getElementById('play').innerHTML = '一時停止';
</code></pre>
<p>コントローラの位置やサイズなどは自由に設定できます。</p>
<h2><span id="toc7">まとめ</span></h2>
<p>今回は簡易コントローラの実装方法について書いてきました。<br />
ここまでをまとめたHTMLです。</p>
<pre><code class="html">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Music Player&lt;/title&gt;
    &lt;style&gt;
    div {
        display: inline-block;
        width: 50px;
        height: 50px;
    }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;audio src="" onclick="" preload="none" style="display:none;"&gt;&lt;/audio&gt;
    &lt;div id="play" onclick="start();"&gt;再生&lt;/div&gt;
    &lt;div id="stop" onclick="stop();"&gt;停止&lt;/div&gt;
&lt;script type="text/javascript"&gt;
var media = document.getElementsByTagName("audio")[0];
var src = "music/003.mp3";
media.src = src;

function play() {
    media.play();
    document.getElementById('play').innerHTML = '一時停止';
}
function pause() {
    media.pause();
    document.getElementById('play').innerHTML = '再生';
}
function stop() {
    pause();
    media.currentTime = 0;
}
function start() {
    if(!media.paused){
        pause();
    }else{
        play();
    }
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>これでとりあえず、音楽ファイルの再生と停止はできるようになりました。<br />
ですがこれだけではメディアプレイヤーのコントローラとして心許ないので、次回はもう少し作りこんでいけたらいいなと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>../../../web/193/feed/index.xml</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
