【ジャンク修理】一体型PCの修理に挑戦した話

この度、生まれてはじめて、(完全ではないけども)電気部品の修理ができました。

今回は調査の過程を含めて、この体験をアウトプットしたいと思います。

修理対象

修理の対象は、2019年に発表された、富士通の「ESPRIMO FH70/D1」です。

kakaku.com

製品の特長

ディスプレイ一体型PCで、CPUには第8世代のCore i7を搭載しており、6 Core 12 Threadの高性能機となっています。ゲーミングPCにこそなりませんが、業務使用等では十分な性能といえます。なお、テレビ視聴のような機能はありません。価格も、RAM16GB、NVMe 1TBのSSDを搭載すれば、中古相場(ヤフオク)でも 6万円は下らない値が付きます。

ジャンク理由

  • 起動せず。BIOS起動NG。(安定化電源からの入力では反応があるので、通電はしているようなのですが、BIOS起動せず、ファンすら回らない状態でした)

  • 液晶不良。別に用意していた起動品に接続したところ、画面全体に縦線が入り、表示が乱れていました。

  • ネジ不足。前オーナーによるものかもしれませんが、背面のネジが、正規ネジと異なっていました。長さが異なるので、ひょっとしてこれを無理にとりつけたせいで、圧迫されて液晶が壊れたのかもね…。

入手の経緯

  • これと同じ機種をいつものジャンクショップで手に入れました。
  • ショップ購入品が液晶不良だったのですが、何とか安く修理できないかと、メルカリを散策。
  • 「ジャンク、起動せず、液晶は無事」という、この商品を発見(送料込み 12,000円)。ここから液晶をもらって、いつものニコイチで直す作戦に。
  • 到着後に確認した結果、液晶も壊れていることが判明。出品者に問い合わせたところ、発送前は(おそらく大丈夫)だったとのこと。
  • 出品者の話を添えて、メルカリ事務局に「輸送中の事故では?」と通知した結果、輸送保証が適用。
  • この商品自体は無料で手に入れることができた。ただ、液晶不良のため、修理には使えず。
  • 最初の期待の修理には、やむなく正規ルートで液晶パネルを購入(送料込み 16,000円)して対応。パネル交換後、無事販売できた。

・・・ で、この機体があまりましたw

調査開始ぃぃんw

症状は前述したとおり、電源投入してもBIOS起動せず、ファンすら動かない、という状況。電源のLEDすらつかないので、電源口に問題があるのかも、と疑いつつ調査開始。

こういった場合、最低構成だけで電源がつくのかを調べるのが調査の基本。一旦電源を切って、背面を開け、ファンだけを接続して電源を投入しました。

しかし、写真右の状態で電源を入れても、ファンがうんともすんとも言わない…。

ここで、入力に使用していた安定化電源を見て、おかしな点に気づきました。なおこの電源は、出力値 19V、6.350A に設定してあります。

電圧の値が、設定値の19Vから、2.15Vまでさがっていました。正常な動作であれば、電圧は設定値の19V のまま、電流(A)が0.0A~数A の間でリアルタイムに変化するはずです。入力電圧が正しく上がらないので、PCが起動しないということはありそうです。

考えられるのは、PC内部でどこかの結線にショートが発生しており、電圧が上がらない。経験則からだと、具体的な事例は次のようなものがありました。

  • 内部接続している機器(グラボやメモリ、光学ドライブ等)が故障しており、電源を短絡(ショート)させている。

  • 端子(USB等)の内部が物理不良で接触してしまっていて、内部接点ができ、同じくショートしている。


過去に、USB端子の問題で起動しないノートパソコンを見たことがあります。

   ↓

  

端子同士が接触しており、そこが短絡してショートさせていたという問題でした。この時はピンセットで端子間を開けてあげることで起動するようになりました。


しかし基盤の端子類を見回した結果、特に問題なく、、、一旦マザーボードを筐体から外してじっくり見まわすことにしました。



うっかり火傷

マザーの全面は下のとおり。左が表、右が裏のようです。

さて。こんな時のために買っておいた、秘蔵のマイクロ顕微鏡。

拡大した画面をPCに映して、基盤全面を調べていきます。

何があるかな…。 

…。

…。

…なにか匂うな…焦げ臭いような。

…。

アチっっっ!

と思ってみてみると、マザーの一部が強く発熱していました。うっかり電源を入れたまま調べていたみたいです。

発熱箇所は裏面にある写真の回路。某Youtuberさんの修理動画では、発熱があった周辺のチップコンデンサが怪しいと聞いてたなぁ…。

ということで顕微鏡を近づけてみていくと…。

なんだかこの3つのチップコンデンサ…。一番下、おかしくないだろうか…。角度を変えてチェックすると…。

割れてる!?明らかにおかしい感じが…。

マルチテスタ―を導通モードにして、コンデンサの両端をつまんでみると、予想どおり抵抗が0近くになっていて、ショートしていました。ついでにまわりのコンデンサを調べると、いたるところのチップコンデンサがショート状態に…。

おそらく、ここが短絡しているせいで、となりの回路に大電流が流れて発熱していた!?さらに、このコンデンサが電圧を堰き止めないので、電源電圧が下がってしまっていたのでは!?と推測。影響範囲は見えないけど、周辺のコンデンサは、ここのあおりで両端が接触したように検出されてしまっているのかもしれず。。。

まずは絵的にも明らかに「割れ」ている、コイツをターゲットに修理を進めることにしました。



修理開始ぃぃ~ん

(撮影環境が整っていれば動画にしたかったんだけど…。俯瞰カメラがなく、静止記事になってしまったのが悔やまれます…)

修理といっても、このコンデンサの換えを持っているわけではないので、ひとまずマザーからとりはずして電流の導通を遮断するところまで進めることにします。

といっても、このサイズのハンダはうまくいった試しがないので、はんだの基本を再度Youtubeで調べて、故障覚悟でトライ。

www.youtube.com

動画に従ってはんだごてを「D形」(マイナスドライバのようなコテ)に付け替えて、いざ作業開始。

基盤部品を取り外す場合は、いきなり過熱しても既成のハンダは取れないので、最初はあえて追加ハンダを盛って、その後に加熱すれば簡単に取り外せるとのこと。

・・・せっせせっせ・・・。

(その後、ハンダもりもり載せて、下のとおり、なんとか取り外せました)

ぶれぶれになっててすみません。左がコンデンサを切り離したマザーボード、右がコンデンサです。この後、エタノールキムワイプで表面をふき取り、ハンダのヤニを洗浄しました。

換えの部品がないので、ひとまずこれにて処置終了。画像を取り忘れましたが、この後、ショートしていた周辺のチップコンデンサにテスターを充てて再度チェックすると、ショートが解消されていました!これは希望ありか!?



動作チェック

仮組の状態でCPUファンをつなぎ、安定化電源に接続。

ドキドキしながら安定化電源のスイッチをON!すると…。

動いた!!動いたぞー!!!!!

ファンが全力で回転しはじめました。安定化電源を見ると、こちらも正常に電圧出力ができていることを確認。

背面パネルの接続等を行って組みなおした結果がこれです。

↓(液晶がまだ故障中なのはご愛敬で。後で通販で買って入れ替える予定です)

ついにやりました!!!(涙)

人生で初めて、ハンダで電子部品の修理に成功しました!いや、まだコンデンサ入れ替えできてないから、途中だけども(笑)。

今後の目指すところ

いつかはストリートジャンカー協会に入会できるよう、今後とも精進していきたいと思います!

【ノートPC修理】LIFEBOOK AH53/M AH42/T 分解・液晶ディスプレイ交換

今年の5月から、中古PCの修理・せどり販売を始めました。

具体的には、ジャンクショップからPCを購入し、購入したPCのオーバーホール(内部清掃、グリス再塗布、電池交換)、SSD換装・メモリ増設、Windowsセットアップなどを行って、メルカリやヤフオクで販売する流れです。たまに、ノートPCの液晶ディスプレイ・キーボードの差し替えといった交換作業も行ってます。

ジャンク系Youtuber(お〇おじ様、熊〇郎様)のような、通電しないPCの修理などもやってみたいのですが、まだまだ実力不足でそこまで手が出せてないのが現状です。

今回は、液晶破損しているノートPCを購入し、販売するまでの実作業をアウトプットしていきたいと思います。

故障ノートPCの修理(ニコイチ作戦)

今回購入したPCはこちらです。

富士通 LIFEBOOK AH53/M。写真にあるとおり、液晶割れが生じています。2014年のモデルではありますが、基本スペックは割と高く、4コア、8スレッドのCore i7 4702MQを搭載しているため、捨て置くには惜しいとおもい、購入しました。

液晶ディスプレイを直接修理するのは不可能なため、このような場合は「液晶の交換」が必要となります。作業自体は慣れればそれほど難しくありませんが、正規で交換品を購入しようとすると、この世代のものでも8,000円~10,000円ほどかかります。

そこで同じモデルのディスプレイを搭載した、安価なジャンクPCを購入してそこから剥ぎ取り、こちらに移しかえるといった方法を取りました。

2つの商品のパーツを集めて1つの商品に仕上げることを「ニコイチ」(2個を1個に)と呼んだりします。

ニコイチPCを購入

下に、今回の修理に使用するPCを並べました。

左が修理対象のPC(Core i7、液晶破損、¥5,940)、右が部品取り用PC(Celeron、液晶OK、¥1.980)です。 二つ合わせて購入したところ、価格は¥7,920となりました。

修理開始ぃぃ~ん

まず最初に、部品取り用PC(以下、「ドナー」とします)から、正常な液晶ディスプレイを取り外します。

ドナーPC分解

まずは背面から、バッテリを取り外します。バッテリをつけていると、マザーボードに通電したままの状態となるため、作業中に思わぬところでショートを起こしてしまう危険性があります。

以前、誤って端子間に作業用のネジを落としてしまい、PCを1台おシャカにしたことがありました(T-T

改めて、ディスプレイを取り外しにかかります。このモデルでは、画面の四隅にプラスチックの四角いカバーがあるのですが、その裏面に隠しネジがあり、ディスプレイが固定されています。

ピンセットでカバーを外して、ドライバーでネジを取り外します。

四隅すべてのネジを外したら、液晶とカバの隙間に薄いヘラを差し込み、カバーを外していきます。プラスチックのツメでかみ合っている状態なので、ここは慎重に行わないとツメが折れて修復できなくなります。

すべてのツメをはがすことができたら、外枠を取り外します。

下のようなフレームが見えたら、液晶を固定している四隅のネジも外します。

ネジを外したら、取り外せるように液晶だけを手前に倒します。この時、赤枠のケーブルは接続されたままになっているので、強引に外れてしまわないよう、注意します。

上記の赤枠のケーブルを外します。最初に、保護されているシールをピンセットなどでゆっくりはがします。その後、水平方向にゆっくりと引き抜けば、簡単にケーブルが外れます。ケーブルを抑えている金属が折れたりしないよう、注意して作業します。

無事、ドナーPCから正常な液晶を取り外すことに成功しました。

背面の型番を確認すると、LG社の「LP156WGB(TL)(A1)」という型番ということが分かります。試しにこの型番をネットで確認してみると、Yahooショップで「6,244円」で売られていました。送料を含めると「7,744円」となります。

今回のドナーPCは 1,980円 で購入したので、正規に購入するよりも安上がりであることが分かります。

修理PCへの液晶入れ替え

こちらも分解の流れは同じです。

ドナーPCのように、四隅のカバーを外し、ネジを取り除いて液晶を外します。

ここで気付いたのですが、液晶の型が違っていました(逆さまですみません)。ドナーPCが「LP156WGB(TL)(A1)」であるのに対して、こちらは「LTN156AT30-H」と書かれています。

後述しますが、異なる型の液晶がつながるかどうかは保証がありませんので、博打です。ピン数も同じなので、今回はこのままつないでみることにします。

ここで一度四隅のネジだけを仮止めして、PCの電源を入れてみます。

やりました! 無事、修理PC側でドナーの液晶が表示されました。修理成功のようです。

あとは液晶のフレームの取り付け、ネジの締め直し、ネジ隠しをして修理完了です。

ついでに背面を開けてHDDをSSDに換装し、Windowsをセットアップしました。

また、液晶には手垢がついていましたので、精製水を使ってきれいに清掃。液晶表面は、エタノールなどを使用しないこと。

ドナーPCの再利用

さて、液晶を取り外したドナーPCが残りましたが、ここからも取れるものは取っていきます。1,980円で購入したドナーですが、液晶と同じように、パーツ別に分けると単体で値を出せるほど、良いものが埋まっている場合があります。

バッテリ

残量があれば、同じ種類のPCに使いまわすことができます。今回、修理用のノートのバッテリが空の状態であったのに対して、ドナーのバッテリに残量があったため、こちらも使わせてもらうことにしました(採用)

光学ドライブ

光学ドライブは、Bluray対応か否かで製品価値が大きく違います。Bluray搭載であればネットで2,000円強で売却できます(ドナー自体が 2,000円 弱なので、これだけで元が取れることもあります)。今回のドナーは残念ながらDVDドライブでした(不採用)

無線カード

無線カードが搭載されている場合はその機能を確認します。カードにはWifiのみに対応できるものと、Bluetoothを併用できるものがあります。またWifiの通信規格として、802.11acに対応したものであれば、高速な5GHz通信ができるため、これも価値があります(遅いPCのカードと入れ替えてもよいです)。今回はまさに、802.11ac対応、かつ Bluetooth対応のカードでした。修理用PCにも同じものがあるため、取りかえる必要はありませんが、外して保管しておくことにします。

ちなみに、メルカリでは 1,000円で売られていました。

メモリ

搭載メモリも抜き取ります。こちらは容量次第で、他のPCに増設することも可能です。今回は、DDR3 低電圧対応の4GBが1枚あるだけでした。2枚で 8GBのノートPCを構成することはできますが、昨今Windowsで8GBのノートPCはあまり人気が出ないので、再利用は難しいかな、と思われます。メルカリ等でも価格は500円程度なので、あまり価値はなさそうですね。

キーボード

意外と大事なのがこのキーボードです。ノートPCはデスクトップと違って簡単に交換が利かないため、正常に入力できるキーボードは 交換用部品として4,000円弱で取引されています。



上記の他に、世代によってはCPUが取り外せるものがあり、CPUも人気です。また、特殊な例ですが、今回のようにマザーボード自体が生きているのであれば、通電不可となったPCを生き返らせることもできますので、需要があります。外枠のパームレストや天板なども、ジャンカーによっては購入したがる方もいますね。

以上のように、ドナーとして、1,980円で購入したPCでも、各種部品別に分けていくと 数千円の価値があります。すぐに売れるものではありませんが、ヤフオク等で気長にまてば、ジャンカーの皆さんが購入してくれることがあります。

液晶交換の注意点

本来は型番が分かった時点で、その型番を仕入れて入れ替えるのが修理の王道と思いますが、今回は安く仕上げるためにドナーPCからの入れ替えを行いました。

このようにニコイチで異なるPC間の液晶ディスプレイを交換する場合、当然、液晶は互換性があるものでなくてはいけません。今回はほぼ同時期に発表された、同じメーカーのノートPCであったため、「同じ液晶が使われているだろう」という推測で着手しました(実際、液晶の型番は違いましたね)偶然規格が一致していたのかうまく入れ替えができましたが、液晶同士の互換性に関しては、ネット上にもほとんど情報がないため、同じものがハマるかどうかはほとんど博打です。

各ノートPCと使用されている液晶の型番の対応について、データベースなどがあれば非常に助かるのですが…。

IoTでカイワレ大根プランターの育成を監視してみよう

久しぶりのIoTネタ。土壌湿度計を使用したプランターの育成状況を可視化してました。 今回は自動給水は行わず、あくまでデータの可視化と、水分不足時のLINE通知までとしています。

詳細な構築手順や、実行ソースは、以下のGithubを参照ください。

github.com

システム概要

  • プランターの水分量と、周囲の気温、湿度をセンサーで10分おきに収集し、Webページからグラフデータとして可視化する。
  • プランターの水分量が規定値の割合を下回った場合は、あらかじめ登録したLINEのチャンネルに、給水を求める通知を行う。

プランタとセンサ

ESP32に土壌湿度計と、温度・湿度計を接続し、ESP32からWifiネットワーク経由で、AWSにデータを送るように実装しました。

上記をエッジデバイスとした、システム全体の構成イメージは次のとおりです。

Webページでの可視化

AWS S3に静的Web(HTML/JS)を配置し、そこからAPI Gateway/Lambda経由で、格納したデータを取得し、Chart.jsでブラウザにグラフを表示させます。

LINE通知

データ登録をトリガとしてLambdaを起動させ、水分量が閾値を下回った場合は、LINEに通知を飛ばすよう、設定しておきます。これにより、水分不足をLINE通知で受けることができるようになります。

まとめ

現時点で約半月ほど動かしてましたが、動作は安定しているようです。ただ、すでに秋に入って気温が低下したことや、植っているカイワレがすでに寿命であることから、あまり水分が減らず、通知が来ることがほぼないですが・・・。

冬の間に、自動給水や、電池駆動の方法を検討し、来年はプチトマトなどを育ててみたいと考えています。

Oracle PL/SQLからMySQLへの移行苦労話

Oracleをバックエンドとする老朽化システムのマイグレーションにおいて、ライセンス料の課題から、無償のMySQLRDBをダウンサイジングする、というのはよくある話です。しかし、テーブルデータだけではなく、サーバサイドに実装されているOracle PL/SQLがあった場合、これらもMySQLに移植し、クライアントの移行コストを抑える、という選択肢が出てきます。

ところが、OraclePL/SQLMySQLのサーバ処理(Procedure、Function)は、仕様的にいくつかの差があるため、実際に移行しようとすると、なかなか骨が折れます。今回は、実際に移行してみた経験から、大変だった苦労話をいくつかピックアップしてご紹介します。

パラメータ付カーソルが使えない

PL/SQLで複数行のデータ処理を行う場合、よくカーソルを使用します。MySQLにもカーソルは存在するのですが、こちらでは引数を指定する(Oracleのパラメータ付カーソル)ことができません。

このため、MySQLでカーソルの抽出条件を動的に変更するためには、予めカーソルが参照数ための広域変数を定義し、カーソルをOPENする前に、毎回変数に値をセットする必要があります。

<Oracleの場合>

  -- カーソル定義
  CURSOR cur(pi_num1 INT, pi_num2 INT) IS -- パラメタ付きでカーソルを定義する
    SELECT fieldA, filedB
      FROM table1
     WHERE field1 = pi_num1
       AND field2 = pi_num2;

BEGIN
  -- 処理部
  OPEN cur(11, 22); CLOSE cur;   -- 引数として条件を指定できる
  OPEN cur(33, 44); CLOSE cur;   
  OPEN cur(55, 66); CLOSE cur;   

<MySQLの場合>

BEGIN
  -- 変数定義
  DECLARE pi_num1    INT;      -- 条件に使用する変数を定義する
  DECLARE pi_num2    INT;

  -- カーソル定義
  DECLARE cur CURSOR FOR 
    SELECT fieldA, filedB
      FROM table1
     WHERE field1 = pi_num1    -- 定義した変数をSQLに渡す
       AND field2 = pi_num2;

  -- 処理部
  SET pi_num1 = 11;            -- カーソルOPEN前に、毎回変数をセットする
  SET pi_num2 = 22;
  OPEN cur; CLOSE cur;

  SET pi_num1 = 33;
  SET pi_num2 = 44;
  OPEN cur; CLOSE cur;

  SET pi_num1 = 55;
  SET pi_num2 = 66;
  OPEN cur; CLOSE cur;

パラメタによって、同一の問合せをカーソルで再利用できるメリットが半減してしまい、コードも冗長となります。

%ROWTYPEが使用できない

Oracleでは変数の一種として、テーブルの行を模した「%ROWTYPE」が使用できます。これは、Procedureの引数の返り値のI/Oや、先のカーソルのFETCH結果の受け取りで使用されます。

しかし、MySQLにはこの「%ROWTYPE」がありません。テーブルの行そのものを変数に格納することができないため、必要となるフィールド毎に個別に変数を定義して、それぞれ代入・取り出し操作を行う必要があります。

<Oracleの場合>

  -- カーソル定義
  CURSOR cur IS
    SELECT *
      FROM table1;

  rec    table1%ROWTYPE;   -- %ROWTYPEで変数recを宣言

BEGIN
  -- 処理部
  OPEN cur;
  FETCH cur INTO rec;                               -- recに、table1の1行文が取り出される
  result := rec.fieldA || rec.fieldB || rec.fieldC; -- rec.[列名]で、任意の値が取得できる
  RETURN result;

<MySQLの場合>

BEGIN

  -- 変数定義
  DECLARE rec_fieldA    VARCHAR(10);   -- フィールド毎の格納変数を宣言
  DECLARE rec_fieldB    VARCHAR(10);
  DECLARE rec_fieldC    VARCHAR(10);

  DECLARE cur CURSOR FOR 
    SELECT fieldA, filedB, fieldC      -- FETCHで受け取るフィールドを個別に指定 ※
      FROM table1;

  OPEN cur; CLOSE cur;
  FETCH cur INTO rec_fieldA, rec_fieldB, rec_fieldC;  -- SELECT句と同じ並びで変数を指定
  SET result = CONCAT(rec.fieldA, rec.fieldB, rec.fieldC);

SQL部分を、Oracleのように SELECT * FROM ~とすることも可能ですが、その場合は、FETCH INTO に対象テーブルのすべてのフィールドを列挙しないといけません。フィールド数不一致でエラーとなります。

変数宣言、SQLのSELECT句、FETCHのINTO先、いずれにも、カーソルから取得するフィールドを列挙する必要があるため、コードが非常に大きくなります。

このROWTYPEと、前述のパラメタ付カーソルが使用できない件によって、PL/SQLのカーソルをMySQLに移植すると、次のように非常に長いコードになります。

<MySQLのカーソル使用例>

BEGIN
  -- 変数宣言
  DECLARE ci_fieldA  AS INT;
  DECLARE ci_fieldB  AS INT;
  DECLARE ci_fieldC  AS INT;
  DECLARE ci_fieldD  AS INT;
  DECLARE ci_fieldE  AS INT;
  -- カーソルにINPUTしたい変数をすべて定義

  DECLARE co_field1  AS INT;
  DECLARE co_field2  AS INT;
  DECLARE co_field3  AS INT;
  DECLARE co_field4  AS INT;
  DECLARE co_field5  AS INT;
  -- カーソルからOUTPUTしたいフィールド分すべて定義

   -- カーソル宣言
  DECLARE cur CURSOR FOR
  SELECT fiedl1, field2, field3, field4, field5 ...  -- 取得したいフィールドはすべて列挙
    FROM table1
   WHERE fieldA = ci_fieldA  
     AND fieldB = ci_fieldB  
     AND fieldC = ci_fieldC;  
     AND fieldD = ci_fieldD;  
     AND fieldE = ci_fieldE;  

   -- 処理部
  SET ci_fieldA = 11;
  SET ci_fieldB = 22;
  SET ci_fieldC = 33;
  SET ci_fieldD = 44;
  SET ci_fieldE = 55;
  -- カーソルにINPUTしたい変数すべてに値を設定

  OPEN cur;
  FETCH cur INTO co_field1, co_field2, 
        co_field3, co_field4, co_field5 .... -- カーソルから受け取る変数をすべて列挙
  CLOSE cur;

カーソル属性 %NOTFOUND等が使用できない。

次もカーソルに関する問題です。カーソルをループ内でFETCHするとき、すべての行を読み取ったかを判断するために、Oracleでは「カーソル名%NOTFOUND」属性によって判断します。MySQLでは、この「読み切った」ということをハンドラで判定します。

<Oracleの場合>

BEGIN
  -- カーソル定義
  CURSOR cur IS
    ... 
IS
  OPEN cur;
  LOOP
    FECH cur INTO rec;
    EXIT WHEN cur%NOTFOUND;  -- %NOTFOUNDを参照してループを抜ける

    ... (ループごとの処理)

  END LOOP;
  CLOSE cur;

<MySQLの場合>

BEGIN

  -- 変数定義
  DECLARE done INT DEFAULT FALSE;  -- ループ終了判定変数(初期値はFALSE)

  -- カーソル定義
  DECLARE cur CURSOR FOR
    ... 

  -- NOTFOUNDハンドラ 定義
  DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET done = TRUE;  -- NOTFOUND時にdoneにTRUEを設定

  OPEN cur;
  loop1 : LOOP
    FECH cur INTO rec;

    IF done THEN    -- doneがTRUEになったら処理終了
        LEAVE loop1;
    END IF;

    ... (ループごとの処理)

  END LOOP loop1;
  CLOSE cur;

こちらは先ほどのような機能不足ではなく、OracleMySQLの「仕様(お作法)の違い」ではありますが、地味に書き換えが面倒です。カーソルはPL/SQLの主要機能のため数が多く、ひとつのProcedureに複数のカーソルがあった場合には、それぞれを判定するための終了判定変数を作る必要がある(あるいはそれぞれをBEGINで括り、干渉を避ける)など、移行に手間がかかります。

その他

上記以外にも、二つのDBMSには組込み関数の名称の違いや、内部仕様の差異など、多くの違いがあります。

以下に一部をご紹介します。

概要 Oracle MySQL 移行時の注意点
NULL値判定の違い '(空)'もNULLもNULL扱い('' IS NULL = TRUE) '(空)'はNULLではない
('' IS NULL = FALSE)
入力値に応じて複数の条件式に分ける。
  IF (A='') OR (A IS NULL) THEN
これ以外にも、NVLやISNULLといったNULL判定に注意が必要である
DECODEが使えない DECODE(A, 1, 'yes', 'no'); CASE A WHEN 1 THEN 'yes', 'no' END 左記のとおり書き換える
配列データの取り回し VARRAY、連想配列、ネスト表などが使用できる 配列がないため、JSON型のリストを使用する
例 '[ 1, 2, 3 ...]'
データの加工・取出しには、MySQL組込み関数である「JSON関数」を使用する
NULL置き換え方法の違い NVL(abc, 0); IFNULL(abc, 0); 左記のとおり書き換える
文字列連結方法の違い data := a || b || c; SET data = CONCAT(a, b, IFNULL(c, '')); CONCATは一つでもNULLがあると結合結果がNULLとなるため、NULLが入りえる変数にはIFNULLと併用する。
再帰ルーチンの実装 できる できない 別途実装方法を検討

まとめ

今回、実際に移行を行ってみて、OraclePL/SQLの優秀さを改めて知るとともに、MySQLの非力さにうんざりしました。特に、カーソル制御まわりのI/Oがチープすぎで、古のCOBOLのようだと、最初は目を疑いました。引き渡し用の変数が相当数必要になるため、書き換えでミスが生まれそうで怖かったです。

こういったリプレース作業は、いつか、巷の生成AIがさくっとこなしてくれるようになるんでしょうね(遠い目)

NVIDIAがなんぼのもんじゃい!Stable Diffusion Web UIを非CUDAのオンプレミス環境でやってみよう!

話題が出て大分時間が経ちましたが、今回は画像生成AIのお話です。ネタ自体はネットに色々転がってはいますが、実際にやってみると思った以上に簡単に環境が作れることがわかったので、構築までの手順と、自分の経験談も踏まえて、語っていきたいと思います。

成果

最初に、今回作成できた成果を3点掲載します。この手順通り実施することで、自分の環境で好きなように画像を生成することができるようになりました。

こんなの個人でサクサクかけちゃうんだから、絵師さんたちもたまったもんじゃないですよね・・・。

  • Model「Chillout Mix」DPM++ SDE Kerras

  • Model「Anything v5」DPM++ 2M Kerras

  • Model「realizm engine」Euler a

環境構築手順

今回は、以下2種類で実施するための手順をアウトプットしようと思います。

  1. WindowsNVIDIA
  2. MacBook Air 2020(M1)

以前はCUDA搭載のNVIDIAグラボか、Google Colaboratoryの2択だったんですが、Direct Machine Learning (DirectML) という技術によって非CUDAでも、高速環境が作れるとのことで、やってみることにしました。Macはオマケ。

まずはWindowsから。Macはスキップして下に進んでください。

Windows + 非CUDA GPU

Windowsでオンプレミスの自動生成AI環境構築を記載います。

  1. 前提条件

    • 今回、私が実行した環境は以下のとおりです。

    • 以下のソフトウェアはインストールされていることとします。

  2. Stable Diffusion Web UI 環境の取得

    最初に、以下のコマンドを実行してリソース一式をCloneします。

       > git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml
    
  3. バッチを実行

    git実行した環境に、stable-diffusion-webui-directmlディレクトリが出来上がるので、その中にある webui-user.bat ファイルを実行します。

       > cd  stable-diffusion-webui-directml
       > ./webui-user.bat
    

    初回は起動まで少し時間がかかります。私の環境では、約5分程度でした。

    問題なければ、しばらくして、画面に次の行が表示されます。

       :(略)
       Running on local URL:  http://127.0.0.1:7860
       :(略)
    

    ブラウザを起動し、指示されたアドレス http://127.0.0.1:7860 にアクセスしてください。

    以下の画面が表示されれば準備OKです。この画面が「Stable Diffusion Web UI」画面となります。

    なお、実行時にエラー「runtimeerror: could not allocate tensor~」が出る場合は、実行環境でGPUのメモリが不足している可能性があります。

    この場合の対処として、ディレクトリ直下にあるwebui-user.batファイルの内容を編集し、以下の行を追加して保存した後、再実施してみてください。低メモリでも動くようにするおまじないです。

    <webui-user.bat>

     @echo off
    
      set PYTHON=
      set GIT=
      set VENV_DIR=
    
      # ↓ここを追加
      set COMMANDLINE_ARGS=--lowvram --always-batch-cond-uncond --opt-split-attention
    
      call webui.bat
    

Mac Book(M1)

MacBookでオンプレミスの自動生成AI環境構築を記載います。

  1. 前提条件

    • 今回、私が実行した環境は以下のとおりです。

    • 以下のソフトウェアはインストールされていることとします。

  2. 必要なソフトウェアをインストール

    ターミナルで以下を実行して必要なソフトウェアをインストールします。

     $ brew install cmake protobuf rust python@3.10 git wget
    
  3. Stable Diffusion を GitHubから取得する。

    ターミナルを開き、任意のディレクトリに移動してから、Githubからダウンロードします。以下のコマンドを実行してください。

     $ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
    
  4. 起動Shellを実行

    git実行した環境に、stable-diffusion-webui ディレクトリが出来上がるので、その中にある webui.sh ファイルを実行します。

       $ cd  stable-diffusion-webui
       $ ./webui.sh
    

    初回は起動まで少し時間がかかります。私の環境では、約5分程度でした。

    問題なければ、しばらくして、画面に次の行が表示されます。

       :(略)
       Running on local URL:  http://127.0.0.1:7860
       :(略)
    

    ブラウザを起動し、指示されたアドレス http://127.0.0.1:7860 にアクセスしてください。

    以下の画面が表示されれば準備OKです。この画面が「Stable Diffusion Web UI」画面となります。

Modelデータを入手

環境が無事起動したのであれば、次に画像生成するためのモデルを入手します。

画像自動生成の成否・得意分野は、使用するモデルデータに依存しているため、生成したい画像に合わせてモデルデータを選定して取得する必要があります。

Stable Diffusionが使用できるモデルデータは、次の2つのサイトからダウンロードできます。

  • Hugging face に掲載されているので、こちらから取得します。

  • CIVIT AIという中国のサイトから入手します。

Modelデータはいずれも、一つにつき数G〜十数Gバイトに及びます。色々試したい場合は、30〜50Gバイト程度必要になるので、容量を確保しておいて下さい(NVIDIAのグラボを買うことを思えば、ここでSSDの増設でもした方が、ずっと安上がりですね^^)

①Hugging Face

  1. モデルデータを入手してきます。

    • Hugging face のサイトにアクセスします。
      Modelごとにパネルが表示されていますので、気に入った絵をクリックします。

    • 画面左側の、Multimodel - Text-to-Imageをクリックします。

    • 右に一覧された内容から、任意のモデルを選びます。今回は、主流であるstable-diffusion-v1.5を選びます。

②CIVIT AI

  1. モデルデータを入手してきます。

    • CIVIT AI のサイトにアクセスします。

    • ページ上部にある、Modelsをクリックします。

    • 画面右上の、「↓ Download」ボタンをクリックします。

Modelデータの使用方法

  1. ダウンロードしたファイルを、構築した環境の、/models/Stabel-diffusion ディレクトリに移動します。

  2. Stable diffusionを再起動させます。

    キーボードで Ctrl + C を押してバッチ処理を中止し、再度 webui-user.batMacの場合は、webui.sh) ファイルを実行します。

  3. サービスが開始されたら、ブラウザでWebページにアクセスします。

画像生成を実行する

細かいことはさておき、一旦、さくっと実行してみましょう。

  1. 画面左上にある、「Stable Diffusion checkpoint」のドロップダウンリストを開きます。さきほど格納したモデルが表示されますので、それを選択します。

  2. 画面左上にある2つのテキスト欄が「プロンプト(呪文)」と呼ばれる、画像生成のためのキーワード欄になっています。こちらにテキストを入れて、Generate ボタンをクリックします。

    • 上が「プロンプト」で、生成したい画像の特徴を入れます。
    • 下が「ネガティブ・プロンプト」といい、生成させたくない特徴を入れます。

  3. 今回は、私の方で用意した、以下のプロンプトを設定して、生成してみましょう。

    • プロンプト(下を簡潔に訳すと「日本のアイドル女優を、高精細で書いて」)

      best quality, RAW photo, smiley, realistic, girl, long hair, wavy hair, Cherry blossom, Japanese idle (Japanese actress), cute clothes, looking at viewer, Upper body,

    • ネガティブ・プロンプト(「粗悪で低画質なものはヤメて」)

      EasyNegative, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality

  4. 私の方では次のような結果となりましたが、いかがでしたでしょうか?

実際には、この結果に対して、Web UIのパラメタを細かく調整していくことで、自分の希望する画像を作っていきます。パラメタについては、別途解説されているページがネット上にありますので、そちらを参考にしてください。

プロンプトの分析

上で使用した呪文を翻しました。

  • プロンプト「最高品質、RAW写真、スマイリー、リアル、女の子、長い髪、ウェーブのかかった髪、桜、日本のアイドル(日本の女優)、かわいい服、視聴者を見て、上半身」

  • ネガティブ・プロンプト「単純で粗悪、絵画、スケッチ、(最低品質:2)、(低品質:2)、(標準品質:2)、低解像度、標準品質」

こう見てみると、そんなに難しいことは書いてないようですよね。ネガティブの方も、画質について否定的なイメージを並べているだけで、具体性のあるポイントは特に書いてません。

Modelsによる違い

上記と同じプロンプトを使って、5つのModelsを試してみました。

左から、以下のモデルを使用しています。

Model名 特徴 入手元
stable-diffusion-v1.5 stable-diffusion 標準モデルの最新版。
黒目勝ちでチョイこわ。アジア人向けでない?
Hugging face
dreamlike-photoreal-2.0 Stable Diffusion v1.5のファインチューン。
今回描かれたものの中では一番バランスがいい気がしますね。
Hugging face
ChillOutMIX アジア人美女をリアルに書かせることに定評あり。
キレイに違いないんだけど…なんていうか…〇〇方面に需要がありそう
CIVIT AI
Anything v5 簡単なプロンプトでアニメ絵が描けると評判。
これは確かにキレイ。アニメーターいらずになりそう…。
CIVIT AI
Realizm Engine 風景画や静物画などを書かせると抜群らしい。
人間は苦手なのかな?表情が引きつってて、ちょっと怖い。
CIVIT AI

同じ呪文でも、全然作られ方が違うんですね。。。 「Anything v5」のアニメ調を除くと、2番目の「dreamlike-photoreal-2.0」が一番きれいといえるんじゃないでしょうか。

パフォーマンスについて

私の環境の場合、デフォルトのサイズ(512 x 512)とパラメタを指定した状態で、画像が作成されるまでの時間は、次のようになりました。

データ 環境1.
Windows + Radeon RX570
環境2
.MacBook Air 2020 M1
Data1 52秒 48秒
Data2 62秒 51秒
Data3 58秒 55秒

たまたまかもしれませんが、二つの環境にあまり時間差はなかったですね。Mac Book Airの自力を見た気がします。

Youtube等の記事を見ていると、NIVIDAのグラボ RTX4070 を使用した場合、これが5〜6秒でできるそうです。流石に早いですがやはりグラボは高価ですし、用途によっては、上の応答時間でも十分使えますよね。

プロンプトの調整

ここまでできたら、あとは実際にプロンプトや画面のパラメタを調整していって、AIに作成する画像の変更を指示します。Stable Diffusion Web UIのパラメタの詳細については、他のサイトを参考にしてみて下さい。

参考:Stable Diffusion WebUIの使い方を解説していくよ【超入門編】

感想

いかがでしょうか。思っていた以上に、簡単に動画生成AIの環境ができました。

しかも、Modelデータは日々新しいものが出来上がっていくため、用途によって色々使い分けることで、自環境で自由に画像を作ることができました。

業務アプリの移植先として、ノーコードツール Bubble を検討してみる

昨今、話題に上がっているローコード・ノーコードによるWebページの開発を行うにあたり、この度、世界的にもっとも著名な「Bubble」を使ってみましたので、その感想など、以下に述べていきたいと思います。

業務用アプリケーションとノーコード

今回ノーコードの選定にあたり、いくつかのサービスを探索しました。

まず、一番に候補に挙がったのは「Kintone(サイボウズ株式会社)」です。日本国産のため、使い勝手がよいので間違はないはずですが、使用ユーザ数による課金制であり、月額780円/ユーザーと高価のため棄却しました。

ところがこれを除くと「PCで使用する業務アプリ」という観点でなかなかヒットするものが見つかりません。「STUDIO」や「ペライチ」、「Glide」といったサービスがありましたが、いずれもスマホ専用だったり、広告やランディングページ向けだったりと、目的に合致しないことがわかりました。

運用シーンで考えても、スマホ画面で扱うような情報量ではなく、オペレータも昔ながらの事務方です。移植前の画面を見ても、コテコテの「一覧」画面や、下部のファンクションキー(F9:プリント等)が設置されたデザインであり、極端なUI変更は忌避される可能性がありました。

私自身、あまりUX/UIデザインの知見がないため、リスク回避的に旧来のデザインに近づけたものを探していましたが、なかなか対応できそうなものが見つかりませんでした。

そのような中で、最も汎用的と名高いBubbleに触れることになりました。

Bubbleについて

bubble.io

Bubbleとは

Bubbleは、ドラッグアンドドロップのインターフェースを通じてアプリケーションをビジュアルに構築することができる、SaaSによるノーコードアプリケーションです。

プログラミングの知識がなくても、ユーザーは直感的な操作でアプリケーションを作成できるという謳い文句で、世界で約200万人のユーザがいるといわれています。

<編集画面>

<実行画面>

また、レスポンシブへの対応も容易であり、行列を正しく配置するだけで、以下のとおり簡単にスマホデザインに対応できるようになります。

<実行画面>

Bubbleの特徴

Bubbleが広く使われている特徴としては、その汎用性が挙げられます。使用できる機能は一般的なフロント画面用のテキストやリストに限らず、GoogleMapや、アカウント管理、e決済機能まで、幅広い機能を簡単に取り込むことができます。

また、デベロッパが自由に開発・公開できるPlugin機能によって、機能のさらなる拡張や、独自のマーケットプレイスによる配布が行えます。開発したプラグインは自由に有償化でき、開発者にインセンティブがあるため、随時機能拡張が行われている状態です。

<Plugin追加画面>

使用してみた所感(実際どうなの?)

最初に、実際に使用してみた所感を述べます。

よかったところ

  • 評判通り機能が豊富・汎用的であり、たしかにでなんでも作れそう。
  • バックエンドデータとの連携がPluginとして用意されており(SQL Database Connector)、MySQL等、既存データベースとの連携が容易。
  • デザイン設定と、実際に作られるCSSとのフィット&ギャップが少ない(前回記事にしたFigma→Amplify Studioのような、コード変換が行われないため?)
  • Pluginを開発する場合は、JQueryを使用したコーディングが主体となるため高難度だが、その分自由度が高い。

厳しいところ

  • 操作のインターフェイスがすべて英語であり日本語非対応(データの表示自体は日本語にできる)。開発者フォーラムも英語のため、入門が難しく、とっつきづらい。チュートリアルYoutubeを駆使して、初期の学習コストに最低でも1週間程度はかかる。
  • 画面デザインのUIが使いづらい。複数オブジェクトをまとめて移動しようとしても、ひとつしかドラッグできなかったり。Figma等に慣れていると、イライラするかも。
  • Freeプランの制約がなかなかきつい。有償のStarterプランにアップグレードしないと、Webホスティングもできない。特にデモ用のテーブルデータを、独自の登録画面から1レコードずつ手作業で登録するのには骨が折れた(結局、Seleniumで自動操作させたけど)

一番使い慣れが大変そうなのが「画面デザイン」。普通にWebデザインが必要となります。KintoneやDesknet'sといった、国産の「やさしい」ノーコードソフトは、データの型や桁数に応じてフォントサイズや項目幅を「いいかんじ」に配置してくれるようですが、こちらはひとつひとつ、細かく指定が必要です。

Webデザイナーからすると当然の作業ですが、「ローコード」と聞いて安易に飛びつくと、げんなりします。

結論

まだまだ試行錯誤しているところですが、このサービスであれば、なんとか元の形式に揃えたデザインが作れそうです。操作に慣れてくると、たしかにサクサク画面が作れるし、Pluginなどを使いこなせば、いろいろな機能も簡単にできそうな気がしてきました。

ただ前述のとおり、本来であればUX/UIデザインの側面から、このような画面再現よりもより良いデザインを設計すべきとは思います。自分がやっていることが、時代錯誤な提案をしているという自責の念もあるのですが、新しいデザインを作るにしてもツールの使い方が分かっていた方がよかろう、ということで、まずはやり進んでみたいと思います。

AWS Amplify Studioを使って手軽にWebサイトを構築してみた!

最近、AWS Amplify Studioという便利なツールが注目を集めています。AWS Amplify Studioは、ローコード開発のアプローチを取り入れており、誰でも簡単にWebサイトを作成できるクラウドベースのプラットフォームです。私も最近、AWS Amplify Studioを使って自分のWebサイトを作ってみました。この記事では、その手順と経験を共有したいと思います。

aws.amazon.com

AWS Amplify Studioとは?

AWS Amplify Studioは、AWSが提供するローコード開発環境です。これを使えば、プログラミングの知識がなくても、直感的なインターフェースを通じて簡単にWebサイトを構築できます。バックエンドの処理やインフラストラクチャのセットアップも自動化されており、開発者はビジネスロジックに集中できます。

ウェブサイト構築の手順

以下は、AWS Amplify Studioを使用してWebサイトを構築する基本的な手順です。

  1. プロジェクトの作成: AWS Amplifyコンソールにアクセスし、新しいプロジェクトを作成します。プロジェクトには名前と説明を付けてスタートします。

  2. テーブルデータ定義: アプリが使用するデータモデルを定義します。テーブル名とフィールドの一覧を設定します。これをデプロイすることにより、DynamoDB、AWS AppSyncに対してテーブル定義と、Webサイトからのアクセス用インタフェース(GraphQL)が自動生成されます。

  3. Webページデザインの追加①: Figmaで作成したモックページを取り込んで、Webページとすることができます。この画面の項目とデータベースのフィールドをバインドすることにより、簡単にページが作れます。

    Figmaの画面

    Amplify Studioの画面

  4. Webページデザインの追加②: Figmaのページとは別に、作成したテーブルに対するデータ追加・更新のページが、Amplify Studio内に自動で作成されてきます。入力項目の要素を選択したり、項目位置を変えたりはできますが、ページレイアウトのカスタマイズ性はそれほど高くなく、色などは変更できません。ただ、マスタ業務など、単純に入力するだけなら、都合は良いと思います。

  5. Webサイトをローカルでビルド: ローカル環境にreact.jsやvue.js等の開発環境を用意して、AWSのAmplify CLI機能を使って、デザインしたページとデータモデルを、ソースコードとして取得します。react.jsを指定した場合は、デザインした部品が「コンポーネント」として生成されるため、これをラップ(overrides)して、ビジネスロジックや、細かな定義を加えてページを完成させます。

  6. サイトのデプロイ: ページが完成したら、AWS Amplify Studioのデプロイ機能を使用してWebサイトを公開します。これにより、誰でもアクセス可能なWebサイトが完成します。

実際にやってみると、この5番の開発になかなかクセがあり、ドキュメントも十分にないこともあって苦戦しました。2021年からのGAなので、ネット情報もすくなく。。。

やってみた所感

今回、初めて触るreactの勉強も兼ねていたので、時間がかかりましたが約2週間ほどで、次のような内容を作ってみました。

github.com

実際に触っていた感じ、使いどころが限られる気がしました。

  • × 業務で使用するアプリケーションには不向き。よく見る「表」デザインの画面などは、Figmaからのコンポーネント起こしで作りづらい。

  • 〇 会社のブランディングページのような、シンプルな構成のページか、Todoアプリのように、単純にデータ登録を繰り返すだけなら、PCとスマホの両環境でできるのでよい。

  • 〇 初期の立ち上げは慣れれば非常に簡単。従来、API Gateway、Lambda、DynamoDBのストリームなどで構築していたバックエンドの構成が一発で出来上がる。

具体的な手順の説明は、後述のサイトに丸投げます^^

参考にさせていただいたサイト