iTunesとiOSミュージックで発生する歌詞表示のバグ

標準

今日、「けいおん!!」のオープニング曲である「GO!GO!MANIAC」にiTunesから歌詞をつけてみたのですが、歌詞付与で初めてトラブルに遭遇しました。

2016年11月2日追記:iOS10.1.*で修正されていることを確認しました。これを修正するには、アップデートが最も有効な手段でしょう。

トラブル内容は、GO!GO!MANIACの歌詞だけ、HTMLの改行タグが浮き出てくるというものです。分からないことに、他の歌の歌詞では同問題は発生しませんでした。これが問題が発生した時の歌詞表示のスクリーンショットです。

バグってしまった歌詞表示

歌詞表示ってHTML形式だったんですね。しかし、これは困りました。辛うじて認識出来るものの、可読性は地の底です。検索してみたところ、iTunesのフォーラムが出てきました。

そのフォーラムによると、iOS10にのみ発生しているバグで、iOS10.1にはバグフィックスが施される予定、とのことです。肝心の原因は、歌詞に「&(アンパサンド)」が含まれている時に発生するようで、「&」を「and」などに置換することで解消出来ます。

というわけで対処するとこんな感じにしっかりと歌詞表示がされるようになりました。

回復した歌詞表示

ちなみに下記画像が例の問題になった部分の歌詞です。「We have a fabulous BODY, SOUL & LOVE」が元歌詞のところを置き換えました。

問題の歌詞部分

PHPでTwitterのユーザー情報を取得する

標準

今回は、PHPでTwitterのユーザー情報を取得してみたいと思います。このユーザーの情報は内部ID(Twitterのシステム内部で定められている、一意のIDの事。このIDは変更することが出来ない。)や、スクリーンネーム、名前を始めとして、アカウント作成した日時などありとあらゆる情報を取得できます。こちらは非常に簡単に作成出来るので、早速作っていきます。

使用するライブラリ

今回も例のごとく abraham/twitteroauth を使っていきます。使い方の詳細は前章を御覧ください。

コード

今回はプロフィール情報としても特に重要だと考える一部の情報を呼び出し、列挙する方法について書いていきます。最終的にコードは以下のようになりました。

<?php
$connection=new TwitterOAuth($api_key, $api_secret, $access_token, $access_token_secret);
$user_data=$connection->get("users/show",["screen_name"=>$user_screen_name]);

echo "name: " . $user_data->name;
echo "screen name: @" . $user_data->screen_name;
echo "location: " . $user_data->location;
echo "description: " . $user_data->description;
echo "url: " . $user_data->entities->url->urls[0]->expanded_url;
if($user_data->protected) {echo "protected";} else {echo "unprotected";}
echo "followers: " . number_format($user_data->followers_count);
echo "follows: " . number_format($user_data->friends_count);
echo "listed: " . number_format($user_data->listed_count);
echo "created at: " . $user_data->created_at;
echo number_format($user_data->favourites_count) . " favs";
echo number_format($user_data->statuses_count) . " tweets";
echo "banner-image: " . $user_data->profile_banner_url;
echo "profile-image" . $user_data->profile_image_url;
if($user_data->following) {echo "have followed";} else {echo "haven't followed";}
if($user_data->follow_request_sent) {echo "haven't sent";} else {echo "have sent";}
?>

今回のコードでは2行目にTwitterに接続して、3行目にユーザー情報を取得しています。この時、ユーザーの情報がstdClassで返ってくるので、それを分解して表示させます。

今回このユーザー情報を取得するためにはusers/showからgetしていますが、この時引数として指定できるのは

  • user_id (必須): Twitterから与えられている一意のID
  • screen_name(必須): 見慣れた@に続くID
  • include_entities(任意): エンティティ(返ってくるデータにエンティティノードが存在する。詳しくは後述。)を含めるか

を指定できます。また、この場合user_idとscreen_nameの両方が必須となっていますが、実際にはどちらか一方を指定するのみで大丈夫です。

返ってくるデータ

実際にgetしてみた時のデータをvar_dump()で見てみるとこんな感じです。

object(stdClass)#3 (46) {
	["id"]=> int(2414640626)
	["id_str"]=> string(10) "2414640626"
	["name"]=> string(5) "yoooo"
	["screen_name"]=> string(9) "yoshi_pc_"
	["location"]=> string(12) "鹿屋基地"
	["profile_location"]=> NULL
	["description"]=> string(53) "長門主義(ハルヒ)/SCP財団職員/提督業"
	["url"]=> string(23) "https://t.co/MP3ew8X4mK"
	["entities"]=> object(stdClass)#8 (2) {
		["url"]=> object(stdClass)#9 (1) {
			["urls"]=> array(1) {
				[0]=> object(stdClass)#10 (4) {
					["url"]=> string(23) "https://t.co/MP3ew8X4mK"
					["expanded_url"]=> string(18) "https://yoshipc.net"
					["display_url"]=> string(11) "yoshipc.net"
					["indices"]=> array(2) {
						[0]=> int(0)
						[1]=> int(23)
					}
				}
			}
		}
		["description"]=> object(stdClass)#11 (1) {
			["urls"]=> array(0) { }
		}
	}
	["protected"]=> bool(false)
	["followers_count"]=> int(663)
	["friends_count"]=> int(812)
	["listed_count"]=> int(14)
	["created_at"]=> string(30) "Thu Mar 27 16:51:41 +0000 2014"
	["favourites_count"]=> int(42076)
	["utc_offset"]=> int(32400)
	["time_zone"]=> string(5) "Tokyo"
	["geo_enabled"]=> bool(true)
	["verified"]=> bool(false)
	["statuses_count"]=> int(99429)
	["lang"]=> string(2) "ja"
	["status"]=> object(stdClass)#12 (22) {
		["created_at"]=> string(30) "Tue Oct 18 10:54:24 +0000 2016"
		["id"]=> int(788332394625441792)
		["id_str"]=> string(18) "788332394625441792"
		["text"]=> string(21) "千葉県魔うまい"
		["truncated"]=> bool(false)
		["entities"]=> object(stdClass)#13 (4) {
			["hashtags"]=> array(0) { }
			["symbols"]=> array(0) { }
			["user_mentions"]=> array(0) { }
			["urls"]=> array(0) { }
		}
		["source"]=> string(63) "TheWorld Rev"
		["in_reply_to_status_id"]=> NULL
		["in_reply_to_status_id_str"]=> NULL
		["in_reply_to_user_id"]=> NULL
		["in_reply_to_user_id_str"]=> NULL
		["in_reply_to_screen_name"]=> NULL
		["geo"]=> NULL
		["coordinates"]=> NULL
		["place"]=> NULL
		["contributors"]=> NULL
		["is_quote_status"]=> bool(false)
		["retweet_count"]=> int(0)
		["favorite_count"]=> int(1)
		["favorited"]=> bool(false)
		["retweeted"]=> bool(false)
		["lang"]=> string(2) "ja"
	}
	["contributors_enabled"]=> bool(false)
	["is_translator"]=> bool(false)
	["is_translation_enabled"]=> bool(false)
	["profile_background_color"]=> string(6) "C0DEED"
	["profile_background_image_url"]=> string(78) "http://pbs.twimg.com/profile_background_images/602136959914418176/TWaUNkvB.jpg"
	["profile_background_image_url_https"]=> string(79) "https://pbs.twimg.com/profile_background_images/602136959914418176/TWaUNkvB.jpg"
	["profile_background_tile"]=> bool(true)
	["profile_image_url"]=> string(74) "http://pbs.twimg.com/profile_images/762332527734378496/AzzARkY3_normal.jpg"
	["profile_image_url_https"]=> string(75) "https://pbs.twimg.com/profile_images/762332527734378496/AzzARkY3_normal.jpg"
	["profile_banner_url"]=> string(59) "https://pbs.twimg.com/profile_banners/2414640626/1468929549"
	["profile_link_color"]=> string(6) "3B94D9"
	["profile_sidebar_border_color"]=> string(6) "000000"
	["profile_sidebar_fill_color"]=> string(6) "DDEEF6"
	["profile_text_color"]=> string(6) "333333"
	["profile_use_background_image"]=> bool(true)
	["has_extended_profile"]=> bool(true)
	["default_profile"]=> bool(false)
	["default_profile_image"]=> bool(false)
	["following"]=> bool(false)
	["follow_request_sent"]=> bool(false)
	["notifications"]=> bool(false)
	["translator_type"]=> string(7) "regular"
	["suspended"]=> bool(false)
	["needs_phone_verification"]=> bool(false)
}

これを使うだけでも十分なユーザープロフィール画面が作れそうですね。前述したエンティティを含めるか、と言うのは上記のデータの中で「entities」以下のハイライトされている部分を含めるかどうかということです。主にURLについてのデータなので、不要だと感じたのであれば拒否ることで(若干ですが)早い挙動を得ることが出来るでしょう。
実際に作ってみたサンプルがこちらです。

最後になりますが、実践としてクライアントを同時並行で制作しているので、お試しいただければ幸いです。
https://yoshipc.net/twitter/

では、次回をお楽しみに。

余ったパーツからGlock17が作りたい

標準

今回から新しい内容です。世間はPSVRやBF1やらで賑わっていますが、相変わらずGlockです

前回でニコイチカスタムも完成しましたが、2個の銃から1つの銃を作ったので大量の余りパーツが発生しました。今回はその余りパーツを有効活用したいと思います。

ニコイチカスタムの余りパーツ

とりあえず余ったパーツを並べてみます。まずはスライド周辺のパーツから

スライドのパーツ

色分けしてみました

Glock18Cのパーツ

  • スライド
  • アウターバレル
  • インナーバレルとチャンバー
  • リコイルスプリング
  • リアサイト

Glock26のパーツ

  • ピストンとシリンダー
  • シリンダースプリング

スライドに必要なパーツは大体揃っている感じです。しかしGlock18CのスライドにGlock26のピストンは組み込めないので、新規でパーツを買う必要がありそうです。

次はフレームですね

フレームのパーツ

Glock18Cのパーツ

  • フレーム
  • シリアルナンバーを模したセーフティー
  • フロントシャーシ

Glock26のパーツ

  • リアシャーシセット
  • トリガーバーとトリガー

共通パーツ(マルイGlockシリーズの共通パーツ)

  • スライドストップ
  • スライドロック

こちらもほとんどのパーツが揃っていますね。トリガーが少し緩い気がしますが、まあ大丈夫でしょう。

あとはネジやピン、スプリングなどの小物ですね。

余りパーツ色々

一部違うものも乱入していますが、組み上げるのに必要なパーツは揃ってそうです。

とりあえず組み立ててみる

先にフレーム側から組み立ててみます

フレーム組み込み

トリガーバーのスプリングに加工が必要でしたが、一応組めました。

トリガーピンを紛失したので、部屋に転がっていた鉄心(4mm)を刺してあります

紛失したトリガーピン

中古で購入したGlock18Cが、トリガーピンを紛失したジャンク品だったので、こうなりました。トリガーピンは購入ですかね。

次はスライド側です。Glock18Cのスライドは使えないのでGlock17のスライドだけ買いました

Glock17のスライド

上の物がGlock17のスライドです。少々傷があるのと表面がテカテカなのが気になりますが、どうせ塗装するので放置します。

準備ができたので組み込みます。

Glock17のスライド

特に問題もなく組み込めました。

ただ、リアサイトが傷まみれなので削るしかなさそうです。

傷まみれのリアサイト

そしてスライドとフレームを組み合わせれば完成です。

一応完成?

余り物からGlock17が出来ました。最もポピュラーな拳銃ですね、THE普通って感じです。

一応銃について解説しておくと、Glock社の定番商品のGlock17 Gen3になります。口径は9mm、装弾数は17+1ですね。前に海外に行った時に現地の警察さんが腰に入れているのを見たことがあります、警察や軍、民間でも大人気な拳銃です。

問題点

やはり余り物から作ったので少し無理があったようです。マガジンを入れて実際に撃ってみると色々と問題点が発覚しました。

数発は普通に撃てたのですが、たまに2点バーストになったり、給弾不良を起こしていました。最終的にはスライドがロックしてしまい、画像の状態から動かなくなりました

スライドが動かない

ホールドオープンしているようにも見えますが、スライドストップはかかっていません。内部で何かが干渉してしまっているようです。

スライド上部から内部を覗いて、トリガーバーを強引に下に動かしてみるとスライドが前進しました。どうやらトリガーバーが犯人だったようです

原因究明トリガーバーの干渉

一度バラしてみて確認してみます。スライドがロックする位置で並べてみると、トリガーバーを下げるためのレールからトリガーバーが外れてしまっていることが分かります。(トリガーバーがレール赤丸の部分に入ってしまう)

どうやらこれはGlock17の持病でもあるらしいですね。流石にここまで高頻度で起こるのは異常ですが…

一応ほんの少しだけスライド後退量を減らせば回避できるみたいです。

ここまでならOKスライドロックポイント

左の状態までなら大丈夫です。右の状態まで後退させるとスライドロックしてしまいます。

というわけでスライド後退量を制限すれば解決できそうです。某ライ○クスからスライド後退量を制御できるリコイルスプリングが出ているのですが、4000円近くするので買う気が失せました。

今回はこの辺で終わりにしておきます、次回もGlock17についての記事になりそうです。

PHPでTwitterのタイムラインを取得する

標準

今回、色々な事情を鑑みてこのレンタルサーバーを利用してWebアプリという形態でTwitterクライアントを作成することにしました。Webクライアントの強みはどのプラットフォームでも動作可能など、強みがたくさんあるので、作る価値があるかもしれません。しかも、私の場合は例の「事情」もあるので尚更です。というわけでPHPを利用したTwitterのクライントを作っていくシリーズがこれより始まります。

利用するライブラリ

今回は abraham/twitteroauth というものを使っていきます。このライブラリはTwitterの一通りのAPIが実装されているので、私が目標とするクライアント作成にはもってこいです。

ダウンロードした後、autoload.phpを読み込ませることで利用できるようになります。(本来はcomposer.jsonを使って読み込ませるのが正規ルートです。)

$connection = new TwitterOAuth($api_key, $api_secret, $access_token, $access_token_secret);
$statuses = $connection->get("statuses/home_timeline", ["count" => 50]); //タイムラインを50ツイート取得
if(isset($statuses->errors)) {
  //エラー発生
  echo "some error occurred.";
  echo "error message: " . $statuses->errors[0]->message;
} else {
  //ツイートの取得に成功
  for ($i=0; $i < 49; $i++) {
    echo "profile image url: " . $statuses[$i]->user->profile_image_url;
    echo "user name: " . $statuses[$i]->user->name;
    echo "user's id: " . $statuses[$i]->user->screen_name;
    echo "tweet text: " . $statuses[$i]->text;
    echo "created at: " . $statuses[$i]->created_at;
    echo "via: " . $statuses[$i]->source;
    echo $statuses[$i]->retweet_count . " rt";
    echo $statuses[$i]->favorite_count . " fav";
    if($statuses[$i]->user->protected) {echo "非公開";}
    echo "-------------------------------"
    }
  }

1行目で取得済みの各キーでTwitterに接続するための前準備を行い、2行目でタイムラインを50ツイート分取得しています。この時、APIのレートリミットを超過したアクションを行うとerrors[]->messageにその内容が帰ってきます。(エラーコードなども取得できるので詳しくはvar_dumpなどを行ってください。)

8行目以降はツイート取得に成功した場合です。最小限で利用するような情報を引き抜いてみました。それぞれのツイートには、ツイートに関する情報が$statuses以下、投稿者に関する情報が$statuses->userにそれぞれ格納されています。

以下は、試しにたまたま流れてきたユーザーの$statuses(Array 配列だけではなく、stdClass オブジェクトでも構成されていることに注意。Arrayは$statuses[“hoge”]と指定するのに対して、オブジェクトは$statuses->hogeと指定。)をvar_dump()で出力してみた結果が以下です。

array(25) { 
	[0]=> object(stdClass)#3 (23) { 
		["created_at"]=> string(30) "Fri Oct 14 12:44:02 +0000 2016"
		["id"]=> int(786910433936420869)
		["id_str"]=> string(18) "786910433936420869"
		["text"]=> string(30) "コジィさん出るのかな"
		["truncated"]=> bool(false)
		["entities"]=> object(stdClass)#8 (4) {
			["hashtags"]=> array(0) { }
			["symbols"]=> array(0) { }
			["user_mentions"]=> array(0) { }
			["urls"]=> array(0) { }
		}
		["source"]=> string(81) "Twitter for iPad"
		["in_reply_to_status_id"]=> NULL
		["in_reply_to_status_id_str"]=> NULL
		["in_reply_to_user_id"]=> NULL
		["in_reply_to_user_id_str"]=> NULL
		["in_reply_to_screen_name"]=> NULL
		["user"]=> object(stdClass)#9 (41) {
			["id"]=> int(219588098)
			["id_str"]=> string(9) "219588098"
			["name"]=> string(9) "ふゆべ
			["screen_name"]=> string(11) "who_you_bee"
			["location"]=> string(0) ""
			["description"]=> string(64) "Tumblr:https://t.co/X4hF7e4Jvi Pixiv:https://t.co/8vCm4L63xm"
			["url"]=> string(23) "https://t.co/8vCm4L63xm"
			["entities"]=> object(stdClass)#10 (2) {
				["url"]=> object(stdClass)#11 (1) {
					["urls"]=> array(1) {
						[0]=> object(stdClass)#12 (4) {
							["url"]=> string(23) "https://t.co/8vCm4L63xm"
							["expanded_url"]=> string(27) "http://pixiv.me/savoiaxxs21"
							["display_url"]=> string(20) "pixiv.me/savoiaxxs21"
							["indices"]=> array(2) {
								[0]=> int(0)
								[1]=> int(23)
							}
						}
					}
				}
				["description"]=> object(stdClass)#13 (1) {
					["urls"]=> array(2) {
						[0]=> object(stdClass)#14 (4) {
							["url"]=> string(23) "https://t.co/X4hF7e4Jvi"
							["expanded_url"]=> string(26) "http://huyube21.tumblr.com"
							["display_url"]=> string(19) "huyube21.tumblr.com"
							["indices"]=> array(2) {
								[0]=> int(7)
								[1]=> int(30)
							}
						}
						[1]=> object(stdClass)#15 (4) {
							["url"]=> string(23) "https://t.co/8vCm4L63xm"
							["expanded_url"]=> string(27) "http://pixiv.me/savoiaxxs21"
							["display_url"]=> string(20) "pixiv.me/savoiaxxs21"
							["indices"]=> array(2) {
								[0]=> int(37)
								[1]=> int(60)
							}
						}
					}
				}
			}
			["protected"]=> bool(false)
			["followers_count"]=> int(8710)
			["friends_count"]=> int(668)
			["listed_count"]=> int(350)
			["created_at"]=> string(30) "Thu Nov 25 08:30:34 +0000 2010"
			["favourites_count"]=> int(15994)
			["utc_offset"]=> int(32400)
			["time_zone"]=> string(5) "Tokyo"
			["geo_enabled"]=> bool(false)
			["verified"]=> bool(false)
			["statuses_count"]=> int(96048)
			["lang"]=> string(2) "ja"
			["contributors_enabled"]=> bool(false)
			["is_translator"]=> bool(false)
			["is_translation_enabled"]=> bool(false)
			["profile_background_color"]=> string(6) "C0DEED"
			["profile_background_image_url"]=> string(79) "http://pbs.twimg.com/profile_background_images/488513744176037888/Jq1mlOeM.jpeg"
			["profile_background_image_url_https"]=> string(80) "https://pbs.twimg.com/profile_background_images/488513744176037888/Jq1mlOeM.jpeg"
			["profile_background_tile"]=> bool(true)
			["profile_image_url"]=> string(74) "http://pbs.twimg.com/profile_images/759076048420032512/nXPEc9QI_normal.jpg"
			["profile_image_url_https"]=> string(75) "https://pbs.twimg.com/profile_images/759076048420032512/nXPEc9QI_normal.jpg"
			["profile_banner_url"]=> string(58) "https://pbs.twimg.com/profile_banners/219588098/1471816404"
			["profile_link_color"]=> string(6) "ABB8C2"
			["profile_sidebar_border_color"]=> string(6) "FFFFFF"
			["profile_sidebar_fill_color"]=> string(6) "DDEEF6"
			["profile_text_color"]=> string(6) "333333"
			["profile_use_background_image"]=> bool(true)
			["has_extended_profile"]=> bool(false)
			["default_profile"]=> bool(false)
			["default_profile_image"]=> bool(false)
			["following"]=> bool(true)
			["follow_request_sent"]=> bool(false)
			["notifications"]=> bool(false)
		}
	["geo"]=> NULL
	["coordinates"]=> NULL
	["place"]=> NULL
	["contributors"]=> NULL
	["is_quote_status"]=> bool(false)
	["retweet_count"]=> int(0)
	["favorite_count"]=> int(0)
	["favorited"]=> bool(false)
	["retweeted"]=> bool(false)
	["lang"]=> string(2) "ja"
}

想像以上に情報が取得できていて、驚きです。これらの情報を使うことで、クライアントとしての道以外にも使い道が出来ると思うので、ぜひご活用ください。

また、実際にクライアントを作成している様子をこちらのサーバーで公開中なので、ぜひお試しいただければと。
https://yoshipc.net/twitter

Glock26 AdvanceとGlock18Cのニコイチ計画 その7(最終章)

標準

お久しぶりです。最近忙しくて時間が空いてしまいましたが、今回でGlock26とGlock18Cのニコイチカスタムも完成になります

では早速Glockの仕上げをしていきます

塗装前準備

前回の最後で述べた通り、今回は塗装をメインにしていきます。まずは塗装の下準備から行っていきます。今までの加工の工程で、スライドの表面に細かいキズが出来てしまったので、まずはキズ消しから行います。写真を撮ったのですが、ちょっとした事故でiPhoneのデータが全消滅したので消えました…

ちなみにキズ消しにはタミヤのラッカーパテを使いました。ひたすら傷を埋めてヤスリで研磨する作業を2日ほど行ったところ、殆どの傷は消すことが出来ました。

次はセレクターにクリックパーツが嵌まるための溝を掘ります。前にこの工程をやらかしたせいで酷い目に遭ったので慎重に進めて行きます。

溝掘り

↑赤丸の部分にクリックパーツが嵌まるように溝を掘ります。

前回はドリルを使って溝を作ったせいで失敗したので、今回はカッターとヤスリで溝を掘りました。あえて三角形に削ることで調整しやすくしてあります。

セレクターを組み込んでみると、しっかりとクリック感があるので大丈夫そうです。

 

次はセレクターの状態を示す穴?を掘りたいと思います

セレクターのアレ

↑赤い四角で囲んである溝の部分のことです(画像は電動G18CとGBB G18Cのスライド)

綺麗に溝を掘る方法が思いつかなかったので、家にある道具を色々使って開けてみました。

セミフル表示の穴

画鋲で位置決めして半田で溶かしてみたり、面取りビットで削ったりドリルを手動で回してみたり…と試行錯誤していたら案外綺麗に出来ました。

フルセミ表示

コンペンセイターの方のキズ消しも忘れずに

コンペンセイターの研磨

スライドとコンペンセイターは800番の耐水ペーパーで研磨しました。本当はもう少し細かいヤスリで研磨したかったのですが、1000番以降は塗料の食いつきが悪くなりそうな気がしたので800番にしました。

これで塗装前のスライド加工が終わったので塗装に入っていきたいと思います

スライド塗装

いよいよ塗装を行います。私は普段プラモデルなどは作らない人間なので、塗装に関する知識と経験はゼロに近いです。しかしエアブラシはたまたま持っていたのでGoogle先生を頼りに塗装を進めていきます。

塗装する前に塗装するものを脱脂したほうが良いとの話だったので、スライドとコンペンセイターを中性洗剤を入れたお湯に1時間ほどつけておきました。

脱脂

↑お湯から出した後、しっかり水洗いをしてドライヤーで乾かしました。

準備も出来たので塗装をします。今回使用した色は Mr.カラーC33つや消しブラックC40ジャーマングレーC182スーパークリアつや消し の三色になります。 溶剤はレベリング薄め液というものを使いました。

使用した塗料

真っ黒に塗装するのも面白くないので、金属感を出すためにあえてグレーで塗装します。ロクな経験も無いですがチャレンジです。

エアブラシの使い方や色の作り方とかは紹介しても意味がなさそうなので割愛します。むしろ教えて欲しい

色も出来たので早速吹いてみます。使用した色はC40ジャーマングレーです。

塗装第一段階

うーん…すごく安っぽい、というかダサい。半光沢が余計に安っぽさを加速させてますね…でも方向性は悪くない気がするので続行します。

安っぽさを消すためにC33つや消しブラックC40ジャーマングレーを1:1に混ぜたもので上書きします。

塗装第二段階

かなりいい感じになりました。金属っぽい反射もあっていいですね

 

話は変わりますが、ここでエアガン塗装に関する注意点を書いておきたいと思います。

多くのエアガンではABS樹脂というものが使われています。衝撃に強く、加工が容易、耐熱性や耐寒性に優れているなどの特徴があり、多くの家電や生活用品にも使われています。

しかし、ABS樹脂には有機溶剤に弱いという弱点もあります。今回使用したMr.カラーの塗料は溶剤系アクリル樹脂塗料というジャンルらしいので普通に溶剤入ってます。というか塗料の大体には溶剤が入っているのでABS樹脂への塗装はリスクが伴うらしいです。具体的に言えば割れます

また塗料を薄める時に使った薄め液なんて完全にアウトですよね、ラッカーですから。というわけでABS樹脂への塗装には色々と対策が必要らしいので説明しておきます。

長時間ラッカー(溶剤)にABS樹脂が触れてしまうと、樹脂に侵食して割れてしまうので短時間で塗装をする必要があります。もしくは塗装前に皮膜でABS樹脂を覆う事で樹脂を保護する方法などもあるようです。

今回はエアブラシを用いることで非常に薄く塗料を塗り、短時間で乾燥させることで樹脂への侵食を最小限にしています。何度も重ね塗りをしなくてはいけないので手間は掛かりますが、確実に、綺麗に塗装できます。

という訳でエアガンを塗装する際はエアブラシを使うことをオススメします。筆やスプレーだと長時間乾かない=長時間侵食されるので割れるリスクが高まってしまいます。もしくはサフェーサーを吹くのもいい対策ですね。塗装が剥がれた時に下地(サフェーサー)が見えて見栄えが悪くなるという短所もありますが…

 

話を戻してスライド塗装を進めていきます。黒を混ぜたらいい感じになったので次はエキストラクターの塗り分けをします。エキストラクターというのは空薬莢を排出するための爪ですね

マルイのスライドはエキストラクターの存在感が薄いのでデザインナイフで溝を深く掘り直してみました。画像はiPhoneのデータと主に消えました…

ではエキストラクターを塗装するためにマスキングをします。

エキストラクター塗装

マスキングをしたらエキストラクター塗るためだけに塗料を作り直します。色はC33つや消しブラックです。

エキストラクター塗装2

なかなかいい感じですね~見た目は社外品メタルスライドみたいです。

スライドを傷つけないうちにクリアを吹いて保護します。クリアといえばスプレー缶のものが一般的ですが、今回は塗料ビンの物を使いました。C182スーパークリアつや消しです。

またまた塗料を作り直し&エアブラシ清掃…

クリア塗装

これがクリア塗装をしたスライドです。クリア塗料は吹きすぎると白くなってしまうので、気をつけていたのですが少し白くなってしまいました。また塗る時にムラをつけてみました。反射率が一定だと樹脂感が出てしまうのでばらつきを出すことで金属感を出してみました。

ほぼ初塗装にしては綺麗に塗れたと思います。次は組み立てに入ります。

組み立て&完成

塗装も終わったので、いよいよ組み立てですね

組み立て過程の写真なんて無いので早速完成した画像です。

完成1 完成2 側面 ガンスタンド FPS風(ピンぼけ) ホールドオープン

いや~やっと完成しました。無駄に時間かかってしまいましたね。しかし理想のハンドガンが出来上がったので大満足です。特にスライドの質感が非常にいい感じに仕上がりました。

完成した翌日、早速サバゲに持っていって初速と精度の確認を行いました。初速70m/s 前後とマルイ製GBBハンドガンの平均値ぐらいですかね。マガジン温度が低めだったので、夏場ならもう少し出ると思います。

精度に関しては30m先の15cmプレートにバシバシ当たる感じですかね、文句なしの性能です。ただ気温が低かったのでフルオートに関しては不安が残る感じでした。1マガジン分は撃ち切れますが、ホールドオープンはしませんでした。その後、しっかり温めたマガジンで試したところ、スライドが吹き飛びそうな勢いでブローバックしていたので夏場なら大丈夫だと思います。

セミオートのキレも非常に良いので連射するのがとても楽しいです。サムレストが思っていたよりも有能で、セミ連射時の反動をしっかり押さえつけていました。

外見、性能ともに満足行く結果になったので良かったです。ニコイチカスタムも終わり、一段落したので次回からは新しい内容に入りたいと思います。では次回もお楽しみに~

 

CoD BO3を始めてみました

標準

先日、何かゲームを買おうと思いSteamを色々とあさっていたら「Call of Duty: Black Ops III – Multiplayer Starter Pack」というパッケージが1,440円で販売されていたので、この機会にと思い購入してしまいました。

このマルチプレイヤー・スターター・パックと言うのは、CoD BO3の中でもキャンペーンなどのオフライン要素を排除した、マルチプレイのみが遊べる制限パックです。CoDシリーズはキャンペーンが見どころだと言われていますが、完全版にアップグレードする時には、

「Call of Duty: Black Ops III」の完全版にいつでもアップグレードすることができ、スターターパックに支払った分が自動的に完全版またはデジタルデラックスエディションの価格から割り引かれます。

として、いずれ完全版を購入しようと考えているのであれば、お試し程度には最適だと思います。また、CoDシリーズに触れてみたいと考えている人にも、そんなに高額ではありませんから取っ掛かりやすいのも特徴です。

このパッケージで利用することが出来ない機能は以下の通りです。

  • ゾンビモード
  • キャンペーンモード
  • マルチプレイヤーのカスタムゲームをプレイする機能
  • プレステージ機能(スターターパックのレベル上限55)
  • MODツールまたはMODコンテンツへのアクセス(リリース後)
  • スタンダードマッチ用サーバーブラウザへのアクセス(リリース後)
  • プロフィールのやり直し機能
  • 「DEAD OPS ARCADE II 」およびナイトメアモード

ゾンビモードとキャンペーン以外はあまり大きくなさそうです。(初心者並みの感想)
では早速プレーしてみました。

近接攻撃のAIM力といったら、凄い以外に言葉が見つからないくらいに巧みで驚きます。私が今までプレーしてきたFPSゲームとは色々なものが異質で、例えば人が飛んだりスライディングなどの要素があったりして、なかなか慣れることが出来ません。普段真ん前しかプレーしてる時に見ませんから、上から降りてくる人なんて捕捉できませんし大変です。

初期武器では本当に酷い戦績ばっかり取っていたんですが、開放した別銃にするとなんとなくKDR1近くなってきて嬉しい感じです。ゲーム自体は驚くくらいに軽いので、気軽にこれからもプレーしていけたらなといった感じです。

SQL Serverの予約語に苦しめられる

標準

こんにちは。最近SQLサーバーをPHPでいじる機会が増えたんですが、その時いくら見直してもおかしいところが無い時、結局おかしかったのは(なぜか)予約語を使ってるのが原因だったり、色々と苦しめられました。
それを鑑みて一度予約語をまとめておきます。以下はOracle SQLとMicrosoft SQLのいずれかで予約語として指定されているワード一覧です。ここに記載されている予約語はいずれかで予約語として使われているので、どういった場面でも使用するのは望ましくないです。(スマホで閲覧する場合は、テーブルが横にもスクロールします。)

absolute dec long smallint
access decimal longbinary smallint
add declare longchar smallmoney
add default longtext some
admindb delete lower space
all delete match sql
all desc max sqlcode、sqlerror、sqlstate
alphanumeric disallow maxextents start
alter disconnect memo stdev
alter distinct min stdevp
alter distinctrow minus string
and domain minute substring
any double mlslabel successful
are drop mod sum
as else mode synonym
as eqv modify sysdate
asc exclusive money sysname
assertion exclusiveconnect month system_user
audit exec、execute national table
authorization exists nchar tableid
autoincrement extract nested_table_id temporary
avg false noaudit text
begin fetch nocompress then
between file nonclustered time
binary first not timestamp
bit float、float8 nowait timezone_hour
bit_length float4 ntext timezone_minute
boolean for null tinyint
both foreign number to
by from numeric top
byte general nvarchar trailing
cascade grant octet_length transaction
catalog group of transform
char guid offline translate
char、character having oleobject translation
char_length hour on trigger
character_length identified online trim
check identity open true
close ieeedouble option uid
cluster ieeesingle or union
clustered ignore or unique
coalesce image order uniqueidentifier
collate immediate pctfree unknown
collation imp prior update
column in privileges updateidentity
column_value increment public updateowner
comment index raw updatesecurity
commit indexcreatedb real upper
comp initial references usage
compress inner rename user
connect input resource using
connection insensitive restrict validate
constraint、constraints insert revoke value
container int、integer、integer4 right values
contains integer rollback var
convert integer1 row varbinary
count integer2 rowid varchar
counter intersect rownum varchar2
create interval rows varp
create into schema varying
currency is second view
current isolation select when
current_date join selectschema whenever
current_time key selectsecurity where
current_timestamp language session with
current_user last set work
cursor left share xor
database level short year
date like single yesno
datetime lock size zone
day logical、logical1 smalldatetime

以上238個の予約語でした。想像以上にあって困ったものです。これは適当にやってても引っかかりますわ・・・みなさんもお気をつけて。

WordPressをスパムから守る

標準

最近当サイトにもスパムが多く襲うようになりました。

スパム

上の画像は実際に当サイトに送られたスパムコメントの一例です。多い日にはこのようなメッセージが1日に4~5件届きます。

今回はこのようなただの迷惑なスパムコメントを徹底的に除去するために施した処置についてまとめていきます。

プラグイン導入

早速スパム対策に特化したプラグインを入れていきます。その名も「Akismet」です。評価は5点中4.8点と非常に高く、スパム対策系のプラグインでは老舗と言った感じです。

では早速インストールしてみます。設定画面を開くとこのような感じの画面になります。

akismet初回起動画面

このプラグインはakismetのアカウントを取得した上で、APIキーを取得する必要があります。

https://akismet.com/wordpress/

こちらのページからakismetのアカウントを作成します。wordpress.comのアカウントがあれば即刻ログインできます。アカウント作成、ログインなどが成功すると、プランの設定画面が出てきます。理由がなければ「Get Basic」を選択し、無料で始めるのがいいと思います。

無料のプランで始めても次の画面で再び違うプランに行くように誘導されるので注意します、具体的には支払画面が出てくるんですね。ここでは支払金額のレンジを0にすることで、無料で次に進めます。

支払画面でレンジを0に

最初は戸惑いますよね。0ドルにするとcontinueだけの画面になるので、そのままコンテニューします。

アクティベート画面

するとこのような画面が出てきます。内容に相違なければ、Activate this siteをクリックします。すると、自分のサイトにリダイレクトされて作業は終了です。もしリダイレクトされなければ、以下の画像のようにAPIキーを自分でコピーしてWordpess側で手動入力し、アクティベート終了です。

APIキー

目のアイコンをクリックすると、アスタリスクが解除されます。

以上でスパム対策の作業は完了になります。

効果は?

導入して1日経ったところでAkismetのダッシュボードを見ると以下のようになっていました。

akismetのダッシュボード

ちゃんとブロックされているのがわかります。ちなみにに設定での「厳密度」は「スパムを常にスパムフォルダーに振り分けレビューする。」に設定しています。これで十分すぎるくらいですね。

プラグインの導入でスパムに触れないwordpressライフを送りましょう。