Lancard.com http://www.lancard.com/ Lancard.com 新着情報とスタッフブログのRSS(RSS 2.0) <![CDATA[雑用係、新品のTimeMachineさん過熱状態(?)で奮闘する]]> https://www.lancard.com/blog/2018/01/22/%E9%9B%91%E7%94%A8%E4%BF%82%E3%80%81%E6%96%B0%E5%93%81%E3%81%AEtimemachine%E3%81%95%E3%82%93%E9%81%8E%E7%86%B1%E7%8A%B6%E6%85%8B%EF%BC%88%EF%BC%9F%EF%BC%89%E3%81%A7%E5%A5%AE%E9%97%98%E3%81%99%E3%82%8B/ Mon, 22 Jan 2018 13:43:53 +0900 https://www.lancard.com/blog/?p=5316 こんにちは。
一昨年夏に発売された某PS4ゲームに、いまだどっぷり7週目を楽しんでいる雑用係です。

年明けにAppleのAirMacTimeMachineを購入しました。
先代のTimeMachineが1〜2年ほど前に壊れ、繋ぎで使っていた先代TimeMachineより古いExtremeの調子が秋〜年末に掛けてついに悪くなり、満を持して購入。

 

開封してから設定〜利用開始までサクッとすませました。
実によろしい。
iPhone、iPad、MacもAppleTVもIEEE802.11acに対応してるのに、部屋の無線LANが11nしかなかったという悲しい状態から、ようやく脱したので快適です。

快適だったんです。

コトは、購入から10日ほど経った頃でした。

夜ゲームをしていると、ふいに”ブーーーーン”と聞こえてきました。
振り返ると、TimeMachineさんがファンを回しておられる。まあ、ファンが回るのは別に構わないんですが。

ランプが「問題アルヨ」のオレンジランプになってました。
正常なら緑ランプ。
これが10〜15分間隔くらいで、交互に起こるという状態に。
正常に動作してたかと思うと、ファンがブーーーンとなり異常表示、しばらくすると止まって正常表示に戻る。

気にはなったんですが・・・回線は問題なく繋がるし、使えるので。
その夜は様子見をしてみました(手元には状態確認に使えるMacがなかったので)

翌日の夜。

ファンは回り続け、ずーっとオレンジのランプがチカチカと点滅し続けてました。
なので、ほぼ引退させていたMacbookAirさん召喚(現役のProさんは手元になく)し、AirMacユーティリティを起動。

そこにオレンジランプの理由が!
「過熱状態の可能性があります」

(´Д`;)ガーン
私、何かしたぁぁぁ???

TimeMachineさんの置き場は、木製ローテーブルの上。周り何もなし。
ファンの通気口も塞いでない。
試しにTimeMachineさんをグワッと掴んでみるも、むしろヒンヤリする程度で熱持ってる感じ全くなし。
部屋の温度、18〜19度。

ネットで情報漁ると「とりあえずリセットしてみ?」程度しかなく。
電源横の小さなポッチをシャープペン先でプチポチ(ソフト)リセットを試してみました。

・・・・・・変化なし(´Д`;)
再起動した瞬間から、ファン”ブーーーーン”+オレンジランプ点滅

思い切って、電源入れ直し。(コンセント抜くしかないってのが、チョッと怖いけど)

・・・・・・変化なし(´Д`;)
やっぱり同上。

ここで、仕方なく、お助けマンを召喚するべくAppleサポートへHelp me!要請。

「すぐ電話で話したい」って要請するとAppleサポートはスゴイ。
イキナリ、電話掛かってきました。
AppleIDで登録してる電話番号に。
私、家電登録してて慌てました。走って取りに行ったです(笑)

ココロで「Appleサポートすげー、ソッコー電話掛けてきた!感動!!! 」
と思って電話で意気揚々と話しかけたら。

聞こえてきたのは、音声案内さんでした・・・
電話掛けてきて、音声案内さんが「サポートが空くまで、ちょっと待っててね!好きな音楽聞いててイイヨ!」って言ってくれます(ヲイ)

感動を半分返せ(´Д`;)!!!

半分でいいのは、問い合わせのための電話代はAppleさん持ちなので、いくらでも待てるから(←GENKIN!)デス

たぶん待ち時間10分ほどで、サポートの方へ繋がったと思う。
そして。
異常の発生からコレまで自分で行った対処を口頭で伝えました。
サポートさんも状況を確認したい(MacでAirMacユーティリティ開いてたし)とのことで、一旦Macへのリモート接続を許可して、サポートさんによるユーティリティ確認作業。
※ PC内に見られたくないもの等あれば、伝えればサポートさんから見えないようにすることできるようです。引退寸前のAirさんには何もなかったので、やり方聞かなかったケド。接続されてる間、赤い矢印がデーンと出てるんでワカリマスw

そして、サポートさんから提案されたのはデフォルトリセット。

ちなみに、AirMacシリーズのリセットは3種あります。
ソフトリセット、ハードリセット、デフォルトリセット。
AirMacベースステーションをリセットする方法

なんで、私がソフトリセットしか試さなかったのか、というと。
ハードリセットとデフォルトリセットを掛けると、その無線LANに繋いでる機器全部をもう一度繋ぎ直し作業などしなければならないからデスよ(´Д`;) メンドイ・・・

が、しかし、やらねばなるまい、デフォルトリセット。

ということで、サポートさんの指示通りやってみました。
1.電源を抜く
2.本体後ろ(電源横)のリセットボタンを押したまま、電源を入れる
3.オレンジランプが点滅を始めたらリセットボタンを離す

これがですね、2がムズい。
数回チャレンジして、点滅始めたなーと思ってリセットボタンを外すと点滅が止まる。ユーティリティを確認してもリセットされた感じがなく・・・

その旨をサポートさんへ伝えると「うーん、では、少し確認のお時間ください」と一旦保留で待つことに。

が。保留にして2〜3分すると、ユーティリティの画面に変化が!!
なんと、再起動が掛かってる。
そして「設定しろよー」って画面になって、サポートさんが戻る気配なかったので、ちゃっちゃと10日ほど前に行った設定作業を再度行う。

設定が終わると。
ランプ緑!
ファン回ってない!!
解決?! 解決したよね!!!
サポートさぁ〜ん!戻ってきてぇ〜!゚+。:.゚ヽ(*´∀`)ノ゚.:。+゚

それから数分後、サポートさんが戻ってきてから正常に戻った経緯と現状を伝え、お礼を述べ、電話を切りました。
(ちなみに電話が掛かって来てから、切るまで約45分間ほど)
そして、その夜静寂を取り戻し、快適なネットライフでゲームを遊び、寝る。

次の朝。
オレンジランプ点滅とともに、ファンが回ってました(´Д`;)

呆然とTimeMachineさんを見つめ、電源を切り、一旦会社へ出社。帰宅して、電源を入れ直すと、またファンがブーーーーン、オレンジランプ点滅・・・
試しに、もう一度、デフォルトリセットを自分で行うと・・・

ランプ緑!
なのにファン! めっちゃ回ってる!!! 何故だ!!!

正直、もうコレ、個体に不具合があるとしか思えない(´;ω;`)

ということで、再度、サポートさんに救助要請。
前回同様、電話が掛かってきた(今回は子機手元に置いてたから、慌てなかったぜイェーイ(`・ω・´)b)上に、待ち時間0、この上なく優秀!

前日の方とサポートさんは違う人だったけれど、問い合わせ内容の情報は共有されていたので(お問い合わせ番号を経由して問い合わせしたので)、今朝から先ほどまでの状況のみ説明。

やっぱり、デフォルトリセットでダメとなると修理(というか交換)になるようです。

その場で決断し、サポートさんに手配をして貰って、結局私が買ったTimeCapsuleさんは我が家で2週間ほどの滞在をして去っていくことになりました。
(ちなみに、今回は15分ほどで電話完了)

Apple製品の修理交換は以前もしたことがあるので、ちょっと余裕。
あとは交換品が届くのを待つだけ。(昨晩届きました)

こうして、「TimeMachineさんが過熱状態(?)でオレンジランプを点滅」した私のドタバタ劇は何とか終わりました。

・・・・・・たぶん。

m(_ _)m

Facebooktwittergoogle_pluslinkedintumblrmail]]>
<![CDATA[pg_bigmで何かの全文検索を高速化してみたい]]> https://www.lancard.com/blog/2018/01/16/pg_bigm%E3%81%A7%E4%BD%95%E3%81%8B%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E3%82%92%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%84/ Tue, 16 Jan 2018 17:57:06 +0900 https://www.lancard.com/blog/?p=5305 こちら で使ったpg_bigmですが、どこかで利用出来るものはないかと思っていたのですが、そういえばSphinxを使った検索で日本語対応しようとしてunigramとか色々と入れてみたけど結局失敗してしまったTiny Tiny RSSが有ったなぁと思い、試してみました。

試したPostgreSQLのバージョンは9.4です。
前回同様pg_bigmを入れて、postgresユーザでデータベースにEXTENSIONを追加し、titleとcontentにインデックスを作成します(データ数が多いと時間が掛かります)。

create extension pg_bigm;
create index ttrss_entries_title on ttrss_entries using gin(upper(title) gin_bigm_ops);
create index ttrss_entries_content on ttrss_entries using gin(upper(content) gin_bigm_ops);

upperを入れているのは、Tiny Tiny RSSの全文検索のクエリ(include/functions2.php)がUPPERを使って大文字小文字を区別しないようにしているため。
(ILIKEだとpg_bigmが対応出来ないので、書き換えが必要になっていたので、ここは助かりました)

これで対象を全てのフィードにして検索した結果、
一回目のクエリは数秒以上掛かってしまいせいぜい今までの半分程度でそこまで速くならなかったのですが、
同じクエリ二回目以降(画面下にスクロールして次のリストを表示)は、ほぼ1秒以下になる事が多く、実行待ちを感じない程速くなっていました。
(英語と日本語で検索してみましたが、どちらも大体同じような結果でした)
※環境によって動作はかなり変わるかと思います。

LIKE文を使っているプログラムなら変更せずに試せて、インデックスを消せば元通りで手間が少ないので、PostgreSQL(9.1以降)を使っているLIKE検索が遅いのがあったなぁ・・・という方はpg_bigmを試してみるのはどうでしょうか。
(INDEX作成にはそれなりに時間が掛かるので、そこは注意が必要ですが)

Facebooktwittergoogle_pluslinkedintumblrmail]]>
<![CDATA[年末年始営業のご案内]]> https://www.lancard.com/news/archives/62 Tue, 26 Dec 2017 17:15:00 +0900 https://www.lancard.com/news/archives/62 誠に勝手ながら、弊社の年末年始の営業は、下記のとおりとさせていただきます。
皆様にはご不便をおかけしますが、何卒ご容赦いただきますようお願い致します。
 
今年一年ご愛顧を賜りまして大変感謝申し上げますとともに、皆様のご多幸をお祈りいたします 。
 
年内営業   2017年12月28日 18:00まで
年始営業   2018年1月4日   9:00より
 
緊急のトラブルの際は対応いたしますのでご連絡ください。

]]>
誠に勝手ながら、弊社の年末年始の営業は、下記のとおりとさせていただきます。
皆様にはご不便をおかけしますが、何卒ご容赦いただきますようお願い致します。
 
今年一年ご愛顧を賜りまして大変感謝申し上げますとともに、皆様のご多幸をお祈りいたします 。
 
年内営業   2017年12月28日 18:00まで
年始営業   2018年1月4日   9:00より
 
緊急のトラブルの際は対応いたしますのでご連絡ください。

]]>
<![CDATA[Laravelのテスト用便利トレイトの動作を変えてみる]]> https://www.lancard.com/blog/2017/12/14/laravel%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E4%BE%BF%E5%88%A9%E3%83%88%E3%83%AC%E3%82%A4%E3%83%88%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%A4%89%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B/ Thu, 14 Dec 2017 15:03:30 +0900 https://www.lancard.com/blog/?p=5289 Laravel 5.5 です。

Laravelにはunit test等の際にuseするとよろしくやってくれるトレイトがあります。
昨日の記事に出てきたRefreshDatabaseやDatabaseMigrations、他にはDatabaseTransactions、WithoutMiddleware、WithoutEventsがあります。

本当に便利なのですが、すこし動作を調整したいこともあります。

例えばDatabaseMigrationsでマスターの流し込みまでやりたいとか。

フレームワーク内を調べるとsetUpTraits()でトレイトがuseされたかを判定し、特定のメソッドを呼ぶようになっていることがわかります。

    protected function setUpTraits()
    {
        $uses = array_flip(class_uses_recursive(static::class));

        if (isset($uses[RefreshDatabase::class])) {
            $this->refreshDatabase();
        }

        if (isset($uses[DatabaseMigrations::class])) {
            $this->runDatabaseMigrations();
        }

        if (isset($uses[DatabaseTransactions::class])) {
            $this->beginDatabaseTransaction();
        }

        if (isset($uses[WithoutMiddleware::class])) {
            $this->disableMiddlewareForAllTests();
        }

        if (isset($uses[WithoutEvents::class])) {
            $this->disableEventsForAllTests();
        }

        return $uses;
    }

このメソッドをapp/tests/TestCase.phpやDuskTestCase.phpでオーバーライドして自分が作ったトレイトを実行するようにもできます。

例えば私の場合、データベースダンプをリストアするSnapshotLoadというトレイトを作成して追加しています。

    protected function setUpTraits()
    {
        $uses = array_flip(class_uses_recursive(static::class));
        if (isset($uses[SnapshotLoad::class])) {
            // DatabaseTransactionsの前に実行する必要がある。
            $this->runSnapshotLoad();
        }
        return parent::setUpTraits();
    }

閑話休題、前回記事の最後のテストサンプルでのDatabaseMigrationsの動作を変更してみましょう。呼び出されるrunDatabaseMigrationsメソッドを別名に変更し、新たに定義します。

<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\User;

class LoginTest extends DuskTestCase
{
    use DatabaseMigrations 
    {
        runDatabaseMigrations as runDatabaseMigrationsOrg; //名前変える
    }
    //DatabaseMigrationsの動作カスタマイズ
    public function runDatabaseMigrations()
    {
        $this->runDatabaseMigrationsOrg();  //元々の処理を実行
        \Artisan::call('db:seed', ['--class' => 'MasterSeeder']);
    }

    public function testLogin()
    {
        $user = factory(User::class)->create();

        $this->browse(function (Browser $browser) use ($user) {
            $browser->visit('/login')
                    ->type('email', $user->email)
                    ->type('password', 'secret')
                    ->press('ログイン')
                    ->assertPathIs('/home');
        });
    }
}

元々のDatabaseMigrationsの処理後にマスター設定用のMasterSeederが実行されます。

Facebooktwittergoogle_pluslinkedintumblrmail]]>
<![CDATA[Laravel Dusk メモ]]> https://www.lancard.com/blog/2017/12/13/laravel-dusk-%E3%83%A1%E3%83%A2/ Wed, 13 Dec 2017 14:38:15 +0900 https://www.lancard.com/blog/?p=5283 Laravel 5.5 & Laradock(https://github.com/laradock/laradock)環境です。
Laradockについては少し古いかもしれません(活発に更新されているのですぐに古くなる)。

Laravel Dusk はブラウザテストをお手軽に!というパッケージです。

https://readouble.com/laravel/5.5/ja/dusk.html

Laradockでのセットアップと使い始めてすぐのログインテストで何回かつまづいたのでメモを残しておきます。

Laradock問題

まず、Laradockのドキュメント通りにセットアップしても正常動作しませんでした(2017/12/13現在)

LaradockでLaravel Duskを動かすメモ(https://qiita.com/uenoryo/items/bdded2dc6f8e5f2075cc)

こちらを参考に動かすことができました。ただし、seleniumコンテナへフォントを入れなければ失敗時などのscreenshotで日本語が表示されないため laradock/selenium/Dockerfile を以下のように編集しました。

FROM selenium/standalone-chrome

MAINTAINER Edmund Luong <edmundvmluong@gmail.com>

RUN sudo apt-get update && sudo apt-get install fonts-ipafont -y

EXPOSE 4444

そしてビルド

$ docker-compose up -d --build selenium

これで豆腐たち(□□□□的な文字化け)とはおさらばです。

Session問題

午前中、Laravelへのブラウザでのログインテストが動かないと悩んでた原因はセッションドライバにarrayを設定してたというオチだったアカウントがこちら。単体テスト用の設定流用してたのが原因(調整漏れ)。

— murave (@murave) 2017年12月13日

.env.dusk.local でDusk用の設定が行えるのですが単体テスト用のものをコピーして修正していたためセッションにarrayドライバを設定してたのでした。

https://readouble.com/laravel/5.5/ja/session.html

array – セッションはPHPの配列として保存されるだけで、リクエスト間で継続しません。

ですよね〜。

他環境への影響を抑えるためにCookieドライバを使用することにしました。

SESSION_DRIVER=cookie

Transaction問題

テスト開始時にデータベースクリアしてマイグレーションしてマスター用のSeederでマスター準備してFakerでユーザー作って、みたいにやるじゃないですか。

Laravel 5.5 にはRefreshDatabaseという便利トレイトがあります。

https://readouble.com/laravel/5.5/ja/database-testing.html

前のテストがその後のテストデータに影響しないように、各テストの後にデータベースをリセットできると便利です。インメモリデータベースを使っていても、トラディショナルなデータベースを使用していても、RefreshDatabaseトレイトにより、マイグレーションに最適なアプローチが取れます。テストクラスてこのトレイトを使うだけで、全てが処理されます。

そう、全てが処理されるのです。影響が残らないようにTransaction中に処理してRollbackまでしてくれる。便利。

だが思い出そう。ブラウザテストだということを。

ページ遷移したらデータ消えるわけで、うっかりRefreshDatabaseトレイトを使うと想定通りに動作しません。

そんなわけで、リセットしてマイグレーションまでだけしてくれるDatabaseMigrationsトレイトのほうを使いましょう。

<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\User;

class LoginTest extends DuskTestCase
{
    use DatabaseMigrations;    //実行時DB内容は消える

    public function testLogin()
    {
        \Artisan::call('db:seed', ['--class' => 'MasterSeeder']);
        $user = factory(User::class)->create();

        $this->browse(function (Browser $browser) use ($user) {
            $browser->visit('/login')
                    ->type('email', $user->email)
                    ->type('password', 'secret')
                    ->press('ログイン')
                    ->assertPathIs('/home');
        });
    }
}

この例ではDatabaseMigrationsで再構築されたまっさらな状態のデータベースにマスター系投入用のMasterSeederを実行した後にテスト用のユーザーを作成してログイン処理のテストを行っています。

Facebooktwittergoogle_pluslinkedintumblrmail]]>