気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【備忘録】Windowsが突然フリーズするようになった場合の対応方法(主にCrucialのSSD環境)

タイトルのとおり、突然Windowsでフリーズが発生するようになり、困っていました。 特にメモリが故障しているわけではなく、SATAケーブル系も問題ないという状況で 色々と調査し対応を行ったので、備忘録として記載いたします。

2014年12月頃、ハードディスクからSSD(Crucial製)への換装を行いました。 rinnegrid.hatenablog.com

それ以降、Windows10へのアップデート等を経て問題なく使えていたのですが… 2週間ほど前から、突然頻繁にフリーズが発生するようになりました。

具体的な症状

  • 起動して一定時間経過すると、突然フリーズする
    • スタートメニューやデスクトップ、各アプリがクリックできない
    • Ctrl + Alt + Deleteを押しても、タスクマネージャが開かない(強制終了するしかない)
  • 強制終了&起動後、イベントビューアを確認しても、特にエラー・警告は発生していない。

問題の原因

SSDファームウェアが最新状態でない場合、このような現象が発生するようです。

下記のURLを参照すると、同じような症状の方が解決されたとのことで書き込みをされていました。

answers.microsoft.com

もしcrucial製のSSDである場合には 稼動開始から5184時間経過するとSSDファームウェアが 悪さを引き起こす「5184時間問題」である可能性が高いです。

SSDの使用時間をCrystalDiskInfoで調べてみると、すでに大幅に超過していました。

(※画像はファームウェア更新後に取得したものなので、すでにMU02になっています) f:id:rinne_grid2_1:20170708132927p:plain

対応内容

[1] Crucialのサポートページから、 自分の持っているSSDのリンクを見つけ、クリックしCrucial Storage Executiveをダウンロード

f:id:rinne_grid2_1:20170708133409p:plain

(私はWindows10 Proの64bitを利用しているので、「download-64bit」を選択しました)

[2] Crucial Storage Executiveのインストー

[3] Crucial Storage Executiveの起動(アプリケーションが開くまで少し時間がかかります)

[4] 左側のメニューより、ファームウェアの更新を選択

[5] ファームウェアのライブ更新の実行にチェックをつけ、「ファームウェア更新をクリック」

※チェックをつけない場合は、再起動後にファームウェアの更新処理が始まることになります。 しかし、私の環境だと、「Booting the kernel」というメッセージが表示されて以降、全く処理が進まないような状態になりました。 5のように、ライブ更新を実施すると、正常に更新ができました。

[6] ファームウェアの更新完了を待つ(1分もかかりませんでした)

私はこの後、念のため再起動しました

対応後

まだ対応して2時間程度しか経っていませんが、今のところはフリーズは起きていません。 これで集中して作業ができそうです。

何か問題が発生したら追記しようと思います。

その他

ファームウェアの更新には下記2つの方法がある。

  • アプリケーション(Crucial Storage Executive)を利用し更新
  • 更新用のisoイメージをCD/DVDに書き込んでからブートし更新
    • isoイメージにはLinuxが入っている模様(ISOLINUX)

まず、2点目の方法での更新を試みたものの「Booting the kernel」の表示以降 全く進まない状況になってしまった。

書き込み済みのCDをVirtualBox光学ドライブで指定し、 読み込んで実行したところ、一瞬で次の画面に移動することができた。(Micron Storage Executive等が表示されている画面)

なぜMU02のファームウェアのisolinuxが、自分の環境(物理)だとがうまくカーネルを見つけられなかったのか。 また、仮想環境だと(おそらく)適切に動いたのかは不明。

…と書いている途中で、BIOSの問題っぽい気がしてきた。 「APIC interrupt routing」をEnableにしなければいけないといった記事を見つけた。

http://otn.oracle.co.jp/forum/thread.jspa?messageID=35023906

【備忘録】Ubuntu16.04にCrowi(wiki)をインストールして楽しむ

以前Qiitaの記事でお見かけした素敵なWikiアプリ「crowi」。

デザインがシンプルですごく好きなので、自分でも試しにインストール・利用してみようと 思ったのが少し前のこと(2017/05/25)。

最近Surface Pro3でUbuntu16.04 Desktopをデュアルブートして遊んだり、 VirtualBoxに入れていじっていたので、 とりあえずUbuntuにCrowiをインストールしました。

本記事では、対応内容を備忘録として記述します。

前提

  • Ubuntu16.04を利用
  • Linuxユーザに関する部分は「main」と記載

nvmのインストー

$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
$ export NVM_DIR="$HOME/.nvm"
$ [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

nvmでNode.jsをインストー

# ltsオプションでLTSのみ表示
$ nvm ls-remote --lts
# 2017/06/09時点では、v6.11.0がLTSの最新バージョン
# --> v6.11.0   (Latest LTS: Boron)
$ nvm install v6.11.0
$ nvm use v6.11.0
$ which node
# 下記のバイナリが利用される
# --> /home/main/.nvm/versions/node/v6.11.0/bin/node

MongoDBのインストール(Ubuntu16.04)

公開鍵のインポート

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

MongoDB用のリストファイルを作成

$ echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

パッケージDBをリロード

$ sudo apt-get update

MongoDBのインストー

$ sudo apt-get install -y mongodb-org

MongoDBサービスの起動

$ sudo service mongod start

デフォルトのポート番号は 27017

ポートの確認

  • mongod.confから確認
$ cat /etc/mongod.conf | grep port
# --> port: 27017と表示される
  • lsofコマンドで確認
$ sudo lsof -i | grep mongod
# -->右端にlocalhost:27017 と表示される

mongoコマンドの実行

$ mongo
# --> インタラクティブシェルが起動すればOK

mongodbの自動起動設定

$ sudo systemctl enable mongod

crowiのダウンロード

  • masterブランチは安定版ではないのコントリビュータ以外は利用しないようにとのこと。
  • 開発ブログ「Crowi Book」の情報を元に、現時点(2017/06/09)での最新版である1.6.2を利用する。
$ git clone -b v1.6.2 https://github.com/crowi/crowi/

crowiのインストー

$ cd ./crowi
$ npm install

crowiの実行

  • PASSWORD_SEEDはパスワードジェネレータから利用されるらしい
  • 最初のユーザを作成してからPASSWORD_SEEDを変えると、ログイン不可となるらしい
$ PASSWORD_SEED=9a3e2d798522fe51cc4145eba6b44e86 MONGO_URI=mongodb://localhost:27017 npm start

crowiアプリのページにアクセス

localhost:3000

  • セットアップページ

やったー!

f:id:rinne_grid2_1:20170609014006p:plain

  • ページ作成用の画面

f:id:rinne_grid2_1:20170609014015p:plain

サーバー起動時にcrowiアプリが使えるようにする

foreverをインストー

$ npm install -g forever

foreverを利用したCrowiの起動コマンドを作成し実行

  • mainというユーザを利用した場合
  • forever start
$ sudo -u main /home/main/.nvm/versions/node/v6.11.0/bin/node \
/home/main/.nvm/versions/node/v6.11.0/bin/forever start -p /var/run/forever \
--pidfile /var/run/node-app-crowi.pid -l /home/main/crowi-app.log -a \
-d /home/main/crowi/crowi/app.js

crowiアプリのページにアクセス

localhost:3000

foreverでCrowiアプリを停止

  • forever stop
$ sudo -u main /home/main/.nvm/versions/node/v6.11.0/bin/node \
/home/main/.nvm/versions/node/v6.11.0/bin/forever stop -p /var/run/forever \
--pidfile /var/run/node-app-crowi.pid -l /home/main/crowi-app.log -a \
-d /home/main/crowi/crowi/app.js

/etc/rc.localにCrowiアプリを起動するコマンドを記入する

  • exit 0の少し上に追加する
$ sudo vim /etc/rc.local
/home/main/.nvm/versions/node/v6.11.0/bin/node \
/home/main/.nvm/versions/node/v6.11.0/bin/forever start -p /var/run/forever \
--pidfile /var/run/node-app-crowi.pid -l /home/main/crowi-app.log -a \
-d /home/main/crowi/crowi/app.js

参考記事

これから、Crowiで色々と遊んでみようと思います。

【ツクールMV】ゲームの機能作成時によく利用するソースコード(備忘録)

久しぶりの記事となります。

タイトルのとおり、RPGツクールMVのゲーム制作で JavaScriptを用いて画面やミニゲーム等、 色んな機能を作る時に利用しているソースコードを備忘録として記述します。

前提

  • ゲーム起動中に、F8で表示されるDeveloper Toolの「Console」を利用

操作対象

f:id:rinne_grid2_1:20170604231135p:plain

  • イベントの座標
    • X:10
    • Y:9
  • イベントのID
    • 10

マップ上のイベントを取得する

$gameMap.eventsXy(x, y)

グローバル変数「$gameMap」には現在主人公が存在するマップ情報が 設定されています。

各イベント情報を取得し、 キャラクターグラフィックの変更や向きの変更、その他諸々が確認できます。

利用例

  • キャラクターを時計回りに90度回転させる。
$gameMap.eventsXy(10,9)[0].turnRight90()
  • 実行前

f:id:rinne_grid2_1:20170604231151p:plain

  • 実行後

f:id:rinne_grid2_1:20170604231210p:plain

マップ上のキャラクターを取得し、拡大率を変更する

SceneManager._scene._spriteset._characterSprites[id-1].scale.x = 3.0;
SceneManager._scene._spriteset._characterSprites[id-1].scale.y = 3.0;

(アンダースコア_がついたプロパティは暗黙的にプライベートなものを示すはずなので 外部から変更するものじゃありませんが…Consoleからの実行で、デバッグ的な意味合いが強いのでここでは良しとします。)

SceneManager._sceneには、現在のシーン情報が格納されています。 マップ上にいれば、Scene_Map、 メニューを開いていれば、Scene_Menu、 さらにアイテムメニューを開けばScene_Itemとなっています。

そのシーンで利用されているスプライト(タイルやキャラクターの表示情報)は、 SceneManager._scene._spritesetにまとめられています。

さらにオブジェクトをたどると… SceneManager._scene._spriteset._characterSpritesには、 該当シーンに存在するキャラクターに関係するスプライト情報が 配列として管理されています。 この配列に対し、イベントID - 1した値を添え字として参照すれば 操作したいキャラクターを取得することができるのです。 (あくまでもデバッグ目的で)

利用例

SceneManager._scene._spriteset._characterSprites[10-1].scale.x = 3.0
SceneManager._scene._spriteset._characterSprites[10-1].scale.y = 3.0
  • 実行前

f:id:rinne_grid2_1:20170604231244p:plain

  • 実行後

f:id:rinne_grid2_1:20170604231453p:plain

無駄にでかい

主人公の情報を取得する

$gamePlayer

利用例

  • 主人公のキャラクターグラフィックを変更する
$gamePlayer._characterName = "Actor1"
  • 実行前

f:id:rinne_grid2_1:20170604231916p:plain

  • 実行後

f:id:rinne_grid2_1:20170604232020p:plain

キャラクターにアニメーションを表示する

$gamePlayer._animationId = animationId

利用例

// 20: 爪/雷
$gamePlayer._animationId = 20
$gameMap.eventsXy(10,9)[0]._animationId = 20
  • 実行イメージ

f:id:rinne_grid2_1:20170604234304p:plain

キャラクターにフキダシを表示する

吹き出しを出すキャラクターを動的に変える場合に重宝します。

var itpr = new Game_Interpreter();
itpr._params = [eventId, balloonId, waitTrue];
itpr._mapId = $gameMap.mapId();
itpr.command213();

利用例

var itpr = new Game_Interpreter();
itpr._params = [10, 4, true]; // イベントID(10), 吹き出しの種類(ハート:4), 終了まで待つか(true:待つ)
itpr._mapId = $gameMap.mapId();
itpr.command213();
  • 実行イメージ

f:id:rinne_grid2_1:20170604233640p:plain

キャラクターの位置(スクリーン上の座標)を取得する

$gamePlayer.screenX()
$gamePlayer.screenY()

キャラクターの移動タイプを変更する

$gameMap.eventsXy(x,y)[ID-1]._moveType = moveTypeCd

利用例

$gameMap.eventsXy(10,9)[0]._moveType = 2 // 主人公に近寄る
  • 実行イメージ

f:id:rinne_grid2_1:20170605000637p:plain

色々なものがついてきてしまっていますね。 これもフキダシと同様、動的にキャラクターの移動タイプを変更したい時に重宝します。

他にも思い出した時に記述しようと思います。

【ツクールMV】自作ゲーム「Birth World」アップロード報告及びヒント(「ぼっち」からリア充になれるか?)

久々のブログ更新となります。 3日前、ツクールMV初作品となる「Birth World」を完成させ、 RPGアツマールというWebサービスにアップロードしました。

http://game.nicovideo.jp/atsumaru/games/gm957

興味がありましたら、ぜひプレイしてみてください。

感想・バグ報告等ありましたら、コメントいただけると幸いです。

※ヒントは、下の方に載せます。

ストーリー

「ぼっち」の社会人ショウゴは落ち込んでいた。 誕生日当日というのに、誰からもお祝いの言葉をもらえない。 ましてや、SNSミニブログで誕生日設定をしているのに、全く「お祝いメッセージ」がもらえなかった。

突き付けられた現実に絶望していたそんなとき、 (自称)神様から、不思議な世界へと導かれてしまう。 「望むならば、その状況を変えることができる」らしい。

その世界では、みんなが自分のことを祝福してくれるというのだ。 様々な人・魔物から祝福の言葉をもらいながら、 自分の欲しいモノを作るという「試練」を受ければ良いということだが・・・。

特徴

基本的に、世界中の人々が主人公をお祝いしてくれる

f:id:rinne_grid2_1:20161225000708p:plain

「痩せたんじゃない?」とか言ってくる。

お祝いしてもらうと、変なアイテム(祝福)をくれる

f:id:rinne_grid2_1:20161225000830p:plain

変なアイテム(もうれつな祝福)

f:id:rinne_grid2_1:20161225000959p:plain

ほとんどの人々に、HPゲージがある(緑枠のオレンジ色のゲージ)

f:id:rinne_grid2_1:20161225002853p:plain

話しかけすぎると、命が尽きてしまう

f:id:rinne_grid2_1:20161225003153p:plain

最初に自分が欲しいものを「4つ」手入力して、アイテムを合成する

f:id:rinne_grid2_1:20161225001325p:plain

この時のテストプレイでは以下のように入力した様子

1番目に欲しいもの:年金
2番目に欲しいもの:日常生活
3番目に欲しいもの:オライリー本
4番目に欲しいもの:そこそこほしいモノ

_人人人人_  
> 年金 <
 ̄Y^Y^Y ̄  

もちろん魔物もお祝いしてくれる

f:id:rinne_grid2_1:20161225002031p:plain

f:id:rinne_grid2_1:20161225003830p:plain

女性しか入れない町に入るため、変な薬で異性に変身

f:id:rinne_grid2_1:20161225002238p:plain

いわゆるTSF要素?誰かが得する?

男バージョンEND、女バージョンENDがあったりする。

イケメンしか入れない町に入るため、変な薬でイケメンにも?

f:id:rinne_grid2_1:20161225002558p:plain

イケメンの基準がいまいちわからない

ヒント

(もしヒントをみたくない場合は、このページを閉じることをお勧めいたします。)

本ゲームのエンディングは、合計10コあります。

エンディング1:

ある一定数、人を倒す

エンディング2

「誰かを倒す」もしくは、「どこかに捕まっている人々を解放する」依頼を受けた時に、依頼主を倒す

エンディング3

「誰かを倒す」イベントを「男」状態で終える

エンディング4

「誰かを倒す」イベントを「女」状態で終える

エンディング5

「どこかに捕まっている人々を解放する」イベントを「男」状態で終える

エンディング6

「どこかに捕まっている人々を解放する」イベントを「女」状態で終える

エンディング7

「女性しか入れない村」のイベントを終える

エンディング8

自分が欲しいものを2種類作った状態で、試練を終了する

エンディング9

自分が欲しいものを3種類作った状態で、試練を終える

エンディング10

自分が欲しいもの4種類と、「怪しい薬」を作った状態で、試練を終える

「試練を終える」で閲覧できるエンディングについて

エンディング8 → エンディング9 → エンディング10の順番に見ると 流れがわかりやすいかと思います。

落ち着くまでブログの更新をやめる

最近、朝の時間が忙しく、ブログを書いている暇がない。

また、毎日の更新となると、内容が一定化し、書く内容も薄くなってしまっている。

ひとまず落ち着くまでの間は、ブログの更新を停止することを決めた。

ただ、読書メモや技術系記事のメモは、アウトプットとして記載する可能性はある。

【雑記】朝起きれない?

睡眠不足なのかよくわからないが、体がだるく、朝起きれない。

どのようにして改善していくべきだろうか。

ひとまず今晩は早めに寝てみることにする。

【雑記】読書に関する回答に救われた気がする

読書内容を覚えておくことができず、「自分はなんてダメなんだ」と考えることがよくある。

読書から何を得るべきなのかがわからなくなっていた。

そんなとき、以下のページを見つけた。

oshiete.goo.ne.jp

質問内容としては、

「読書をしてもすぐに忘れてしまう、みんなはどうか?」というもの。

ベストアンサーにすごく励まされた。

引用(Y-N-Sさん)

特に読んだ本の内容は憶えようと意識はしていません。
それに本に書いてあることすべてが重要なことじゃありませんし。
自分がいいと思ったフレーズや文章をたまにメモったりする程度です。
読書はなにかを得るためのものじゃなくて娯楽や生活の一部ですから
無駄という感覚があまりありません。
無駄になったら無駄でいいし、もう一回よむ楽しみができます。
それに完璧に無駄にはならないと思います。
思い出せなくても無意識下で脳に残って力になるかもしれません。

  • 記述内容がすべて重要なわけではない
  • 読書は「娯楽や生活の一部」
    • なので、無駄という感覚はない
  • 良いと思った文章や気になるフレーズはメモをとる。

教科書的なものを読む場合は、内容を理解しながら読み進めていく必要があるが、 それ以外(小説や新書等)は自分を基準にして、良いと思った部分をメモに残す。

これだけでいい。

今までの読書で、確かに気になる部分をメモしてはいたが、 それは「ブログに書くため」であり、あれもこれもと欲張り、情報過多になりがちであった。 (本の内容を理解するという目的を実は持てていなかった?)

本当に心に残った・・・というか、気になるものを抽出する。

この作業について、なんとなく、PC等を使わず、 手帳やノートに手書きでメモに残すという作業を行ってみようと考えている。