カテゴリー: 技術系

  • ASP.NETでChrome対応したらJSでテキストボックスに値が入らなくなったときの対応

    IE用に作られたASP.NETのアプリを、Chrome対応(Chromium Edge対応)しているときに、JavaScriptでASP.NETのパーツのテキストボックス(type=text)に値をいれたところ、値が入らないということがおきた。「getElementById(“ID”).value」に、JavaScriptから値をいれたが、IE11では問題ないのに、Chromeだと値が入らなかった。

    document.getElementById("ID").value = "値";
    // ↑これだと、IE11は値が入るが、Chromeだと入らない。

    PostBackは発生させていない処理なのだが。いろいろと調べていき、Chromeの場合は「.defaultValue」を使って初期状態の値を書き換えれば、画面の表示が変わることを確認できた。

    document.getElementById("ID").defaultValue = "値";
    // ↑Chromeの場合は、defaultValueを書き換える。

    IE11も残しておく必要があったので、ブラウザの種類をみて、IF文でIEとそれ以外で分岐させるようにした。

    サンプル。

        // ブラウザを取得する
        var userAgent = window.navigator.userAgent.toLowerCase();
        if (userAgent.indexOf('msie') != -1) {
            // IEのときの処理を書く
            document.getElementById("ID").value = "aaaa";
        } else {
            // IE以外の処理。ChromeやChromium Edgeの想定
            // document.getElementById.value だと、画面上の表示が変わらないことがわかった。
            // そのため、document.getElementById.defaultValue に変更したところ、うまくいった。
            document.getElementById("ID").defaultValue = "aaaa";
        }
  • FreeBSDでpkgをアップデートしたらMariaDBが起動しなくなった

    FreeBSDで、”pkg upgrade”して、パッケージを最新の状態にしたところ、MariaDBが起動しなくなった。エラーログをみていると、DBのテーブルを修復したあとにDBがシャットダウンされている。DBのファイル破損が原因かと思い、いろいろと調べて対応したが、実はファイルの問題ではなかった。

    原因は、MariaDBのバージョンが「MariaDB 10.5」に上がったことによる「my.cnf」ファイルの変更だった。

    /usr/local/etc/mysql/conf.d/my.cnf

    このconf.dのディレクトリに、my.cnfがあることで、これを読みにいって、その設定で失敗して、サービスが落ちていた。同じところに、client.cnfもserver.cnfもあるが、これを読まずにmy.cnfを先に読みにいって、落ちていた。my.cnfは、1つ上の階層の「/usr/local/etc/mysql/」にもあり、conf.dの下を読み込むように書かれている。

    いろいろと行ったのだが、対応の正解は、conf.dの下のmy.cnfを消す(リネームでOK)。server.cnfとclient.cnfの設定を確認して、MariaDB(mysqld_safe)を起動させる。

    ちなみに、errファイルに記録されていたログは下記。あとは、ログ自体が出力されていない。ログがそもそも出力されていなければ、my.cnfを疑うべきだった。

    2022-02-05 15:36:39 0 [Note] /usr/local/libexec/mariadbd (initiated by: unknown): Normal shutdown
    2022-02-05 15:36:39 0 [Note] Event Scheduler: Purging the queue. 0 events
    2022-02-05 15:36:39 0 [Note] InnoDB: FTS optimize thread exiting.
    2022-02-05 15:36:40 0 [Note] InnoDB: Starting shutdown...
    2022-02-05 15:36:40 0 [Note] InnoDB: Dumping buffer pool(s) to /var/db/mysql/ib_buffer_pool
    2022-02-05 15:36:40 0 [Note] InnoDB: Restricted to 2016 pages due to innodb_buf_pool_dump_pct=25
    2022-02-05 15:36:40 0 [Note] InnoDB: Buffer pool(s) dump completed at 220205 15:36:40
    2022-02-05 15:36:40 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
    2022-02-05 15:36:40 0 [Note] InnoDB: Shutdown completed; log sequence number 1363646560; transaction id 111190553
    2022-02-05 15:36:40 0 [Note] /usr/local/libexec/mariadbd: Shutdown complete
  • VMware vCenter Converter Standalone 6.2 でWindows Server 2003 の変換がエラーになる。

    VMware vCenter Converter Standalone 6.2 でWindows Server 2003 を仮想マシンに変換しようとしたところ、Agentのデプロイで「Error code: 1,603」でエラーになった。

    サポート範囲を調べてみると、Windows Server 2003は、Windows Server 2003 R2 SP2がサポート対象で、R2が付かないバージョンはサポート対象外だった。

    サポート外だが、無理やりP2Vできなかと、Converter Agentだけのインストールをためしてみたが、サービスをオンにするところで、失敗してロールバックした。

    調べてみると、VMware vCenter Converter Standalone 5.0 であれば、無印のWindows Server 2003にインストール可能。試してみたところ、5.0であればインストールはできた(過去にインストーラーを取得しておいてよかった)。しかし、VMware vCenter Converter Standalone 6.2からの接続は、接続経路の暗号化方式の不一致により、エラーになった。

    今度は、vCenter Converter Standalone 5.0 から、ESXi6.7に対して、P2V先を指定してみたが、これも通信時の暗号方式の問題で接続できずエラーになった。

    Veeam Backupのエージェントを、Windows Server 2003(無印)にいれて、イメージバックアップして、そのイメージを仮想マシンとして復元する方法も試した。Veeam BackupもVersion 9.5でも.net frameworkのバージョンが古すぎて、Windows Server 2003(無印)にエージェントのインストールができず。イメージバックアップを取得して、仮想マシンとしてリストアする方法についても失敗した。

    そのため、vCenter Converter Standalone 5.0を使って、Windows Server 2003(無印)を一度、VMware Workstation形式の仮想ファイルに変換した。次に、このVMware Workstation形式のファイルを、vCenter Converter Standalone 6.2で指定し、V2V(Virtual to Virtual)で、ESXi6.7に対して保存した。これで、なんとかP2Vは成功した。ネットワークの設定などは、変わっているため、仮想マシンの設定を編集して、新しくネットワークインターフェースの割り当てを行った。これで無事にWindows Server 2003(無印)のP2Vは完了した。

    仮想化すれば延命はできるが、物理サーバとして存在していると、そもそもP2Vでの仮想化の対象外になってしまう。延命するのであれば、早めに仮想化しておく必要がある。というのが、今回の教訓になった。

  • Windows10 ver.21H2でOfficeツールへのログインでTPMのエラーがでる。

    クリーンインストールした直後のWindows10 Ver.21H2で、Officeツール(Microsoft 365のWordやExcelなど)にログインすると、TPMのエラーが出てログインできない。エラーの内容は下記。

    問題が発生しました
    
    ご使用のコンピュータのトラステッドプラットフォームモジュールが正しく機能していません。このエラーが解決しない場合は、システム管理者に連絡して、エラーコード 80090034 をお知らせください。
    
    サーバメッセージ: 暗号化に失敗しました

    試したことは・・・

    • これの対処として、PCを工場出荷状態に戻して再セットアップしたり、TPMのクリアなども行ったが、解決できなかった。
    • M365のアカウントも作り直してみたが、関係なし。
    • エラーになったユーザで、別のPCでログインすると問題なし。
    • PCのローカルアカウントでログインすると、M365アカウントでログインできるが、Active Directoryのユーザだと、このエラーが発生する。
    • BitLockerでドライブを暗号してみたが、M365のアカウントのログインではエラーになる。BitLockerの暗号化は正常に終了しているのに。

    最初は1台だけだったのだが、同じセットアップで、かつ別メーカーのPCでも、同じ現象が発生することがわかった。2台で同時に発生しているので、TPMの故障という可能性は薄くなった。

    さらに切り分けていった結果、2022年1月のWindows Update(つまり今月のWindows Update)で配信されていた「KB5009543」をアンインストールして、WordやExcelからM365アカウントでログインすると正常にログインできた。PCを再起動させてみたが、再起動後もログインされた状態はキープされており、問題がなかった。

    Windows10の21H2で、AD環境で、2022年1月のWindows Updateで、KB5009543が適用されており、新規にM365のアカウントで、Officeにログインをするときに発生する問題と思われる。Windows Updateは厄介だ。

    このM365でアカウントでログインするときのTPMのエラーの調査だけで、先週から何時間というか何日使ったことことだろうか。Windows Updateは厄介だ。最新版にして、これなので、辛い。

    追記。

    Windows11でも同じことが発生して、そちらはWindows Updateのアンインストールでは解消しなかった。かわりに、レジストリキーの変更で回避できる。レジストリキーでの対処は、Windows10でも有効だった。方法は下記。

  • Oauth2-proxyとGoogle CloudのOauthを連携させるときの注意点

    Oauth2-Proxyで、Google CloudのOauth2.0を連携させたときの注意点として、Oauthでの認証時にGoogle Cloudで設定したOauth2.0クライアント名が表示されてしまう。

    これは、Google Cloud側の設定には、「OAuth 2.0 クライアントの名前。この名前はコンソールでクライアントを識別するためにのみ使用され、エンドユーザーには表示されません。」とあったところだ。

    そのため、気軽に「何とか-test」で名前をつけて、設定したり、テストしていたのだが、Oauth2-Proxyからアクセスしたときの画面に、この「クライアントの名前」が表示されていた。

    これを修正するには、

    1. Google Cloudでプロジェクトを開く。
    2. APIとサービスを開く。
    3. 認証情報を開き、修正するOAuth2.0クライアントIDを探す。
    4. その行の右側にあるペンマークをクリックして、編集する。
    5. 「名前」の部分を変更して、保存する。
  • GASからMySQLに接続して、Select文を実行する

    select文の実行は、DBへのコネクションを行った後、ステートメントのオブジェクトを作成し、「.executeQuery(‘select文’)」を実行する。実行結果は、「.getInt(‘カラム名’)」や「.getString(‘カラム名’)」などで型を指定して、取得する。

    サンプルコードは下記。

    function myFunction() {
      dbConnection();
    }
    
    // --------------------------------
    // SSL 接続なしで接続する
    // --------------------------------
    function dbConnection(){
      Logger.log('start dbConnection function.');
    
      // 接続先設定
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名も可)
      var userName = 'user'; // 接続で使うユーザ名
      var passwd = 'password'; // 接続で使うパスワード
      var databaseName = 'database'; // データベース名
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName;
    
      Logger.log('start mysql con');
      Logger.log(addr);
    
      var connectionInfo = {
        user: userName,
        password: passwd
      }
    
      // DBにコネクションをはる
      var connection = Jdbc.getConnection(addr, connectionInfo);
      Logger.log(connection.getCatalog());
    
      // Select文を実行するための処理 ここから
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る
      var statement = connection.createStatement();
    
      // sqlを実行して結果をオブジェクトに入れる
      var result = statement.executeQuery('select * from List');
    
      // 結果を取り出す
      while (result.next()) {
        // 数値の場合は、getInt('カラム名')を使う。
        var id = result.getInt('id');
        // 文字列の場合は、getString('カラム名')を使う。
        var name = result.getString('listname');
        // 取得した内容をログに出力する
        Logger.log(id + ':' + name);
      }
    
      // Select文を実行する処理はここまで
      // コネクションを閉じる
      connection.close();
    }
  • GASからMySQLに接続して、Insert文を実行する(UpdateやDeleteも)

    Google Apps Script(GAS)で、Insert、Update、Deleteなどの更新系の処理を行うには、DBへのコネクションを行った後、ステートメントのオブジェクトを作成し、「.executeUpdte(‘Insert文など’)」 を実行する。実行結果は、0なら失敗、1以上なら成功(更新した行数が返るので1以上)となる。

    サンプルコードは下記。

    function myFunction() { 
      dbConnection(); 
    }
    
    // -------------------------------- 
    // SSL 接続なしで接続する 
    // -------------------------------- 
    function dbConnection(){ 
      Logger.log('start dbConnection function.'); 
    
      // 接続先設定 
      var connectionIp = 'xxx.xxx.xxx.xxx'; // 接続のMysqlのIPアドレス(ホスト名も可) 
      var userName = 'user'; // 接続で使うユーザ名 
      var passwd = 'password'; // 接続で使うパスワード 
      var databaseName = 'database'; // データベース名
    
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName; 
      Logger.log('start mysql con'); 
      Logger.log(addr);
    
      var connectionInfo = { 
        user: userName, 
        password: passwd 
      }
    
      // DBにコネクションをはる 
      var connection = Jdbc.getConnection(addr, connectionInfo); 
      Logger.log(connection.getCatalog());
    
      // テーブルにInsertを行う処理 
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る 
      var statement = connection.createStatement();
    
      // Insert文を発行 
      var resultInsert = statement.executeUpdate('Insert Into List (id,listname) values ("5","kanagawa")');
    
      // 実行結果が0なら失敗、1以上なら成功 
      Logger.log(resultInsert);
    
      // ステートメントを閉じる 
      statement.close();
      // テーブルにInsertを行う処理はここまで
    
      // コネクションを閉じる 
      connection.close(); 
    }
  • GASの文字列結合

    Google Apps Script(GAS)での文字列結合は、+を使う。

    // 文字列結合して、あいうえお にする 
    var str = 'あいう' + 'えお';
  • MySQLでユーザを作り、DBの権限を割り当てる

    最初に、「create user」文で、ユーザを作る。その時にパスワードも設定する。

    次に、grant文で、DBの権限を割り当てる。grant文でユーザ作成も同時に行うこともできるけれど、個人的には、2文に分けた方が設定がわかりやすくて安心できる。

    例)DBとユーザを作り、DBにユーザの権限を付ける。

    create database dbname;
    create user 'user_name'@'localhost' IDENTIFIED BY 'password';
    grant all on 'dbname'.* TO 'user_name'@'localhost';
    • dbname は、データベース名を入れる
    • user_name は、ユーザ名を入れる
    • user_name は、ユーザ名を入れる