スキップしてメイン コンテンツに移動

投稿

2021の投稿を表示しています

Spring Boot 2.5でplain.jarが生成されてApp Engine上でのアプリケーションの実行に失敗した話

Google App EngineのJava 11環境でSpring BootアプリケーションをGradleを使ってデプロイしたところ、ローカル上では正しくページ表示されるのに、App Engine上にデプロイすると、なぜか、500エラーになるというトラブルに遭遇しました。 Google Cloudのログを調べてみると下記のエラーログを発見しました。Spring Boot系のクラスがjarが含まれていない! java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext さらに調べると、アップロードされたjarファイル名が xxxx-0.0.1-SNAPSHOT-plain.jar のようになっていて、 plain.jarがアップロードされていることが根本原因 でした(Google App EngineのGradle Pluginのデフォルトの設定だとfat jarではなく、plain.jarが選択されるようです)。 plain.jarは、Spring Bootの2.5から作成されるようになったので、それ以前のSpring Bootのバージョンでは問題は発生しません。 [解決法1] build.gradleのjarプラグインの設定を変更 build.gradleのjarプラグインの設定でplain.jarが生成されないうように修正して、fat jarがデプロイされるようになりました。 jar { enabled = false } こちらの記事に感謝。 https://zenn.dev/donchan922/articles/ea76614f72b15e [解決法2] appengine.stage.artifactを指定 こちらは、試していませんが、appengine.stage.artifactにデプロイするターゲットのファイルを指定する方法もありかも知れません。 # build . gradleのappenineの設定でデプロイする対象ファイルを指定。 appengine { stage { artifact = "build/libs/xxxx-0.0.1-SNAPSHOT.jar" ...

Gradleで使用するJDKのバージョン指定

GradleでSpring Bootを使ったjavaのプロジェクトをビルドしようとしたところ、下記のエラーが発生しました。 $ ./gradlew build > Task :compileJava FAILED > FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileJava' . > invalid source release: 11 どうやら、Javaコンパイラが11に対応していない模様。複数のJDKをインストール(8と16)していて、JDK 8の方をデフォルトにしていたため、Java 11のソースがコンパイルできないことが発覚。 gradle.properies に下記のように org.gradle.java.home で使用するJDKを指定して解決。 # org.gradle.java.home=使用するJDKのパス # 例えば筆者の環境ではこんな感じ。 org.gradle.java.home=C:/Program Files/AdoptOpenJDK/jdk-16.0.1.9-hotspot

firestoreでAuto Incrementフィールドを作成

FirestoreでAuto Increment Fieldを作成 Firestoreで連番となるフィールドの作成方法を紹介します。 肝はFirestoreのtransactionを使って原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)を保証することです。 汎用的に使えるgenerateSequenceNumber関数を作成してみました。 manage_collection: 連番を生成するターゲットcollectionを管理するcollection名 target_collection: 連番を生成するターゲットとなるcollection名 numberField: 連番を生成したいフィールド名 を渡して使います。 function generateSequenceNumber ( db , manage_collection , target_collection , numberField ) { const docRef = db . collection ( manage_collection ) . doc ( target_collection ) ; return db . runTransaction ( ( transaction ) => { return transaction . get ( docRef ) . then ( ( doc ) => { if ( ! doc . exists ) { transaction . set ( docRef , { [ numberField ] : 1 } ) ; return 1 ; } const newNumber = typeof doc . data ( ) [ numberField ] === 'undefined' ? 1 : doc . data ( ) [ numberField ] + 1 ; await transaction . update ( docRef , { [ numberField ...

Google Cloud Storageでクラウド上にあるファイルをローカルにあるファイルと同期させる方法

Linuxのrsyncコマンドのようにクラウド上にあるファイルをローカルにあるファイルと同期させるには、下記のコマンドを実行すればOKです。 gsutil -m rsync -r source gs://bucket/dest rsync: Linuxコマンドのrsyncのようにファイルを同期させるためのコマンド -m: multi-threaded/multi-processingの意味で並列で複数のファイルを同期させるためのオプション -r: recursiveの意味で再帰的にディレクトリ内のファイルを同期させるためのオプション

Spring Bootでwarファイルを作成する方法

Google App Engine JavaでSpring Boot + Gradleを使ってアプリケーションをデプロイする方法を調べた。 まずは、下記のオフィシャルを参考に、Gradle App Engine Pluginを導入 Using Gradle and the App Engine Plugin | App Engine standard environment for Java docs | Google Cloud MavenでSpring Bootアプリケーションを作成する方法 https://cloud.google.com/appengine/docs/standard/java11/building-app/writing-web-service Spring Bootアプリケーションを作成→Gradle App Engine Pluginを導入 下記の記事の方が参考になりました。 https://blog.uoneweb.net/2021/09/04/695/ https://zenn.dev/donchan922/articles/ea76614f72b15e

PHPのエラーレベル定数からエラー文字列を返すコード

PHPで定義されているエラー定数(int値)からエラー定数の文字列を返すコードです。 PHPのライブラリで定義されている情報だけで、キーが「エラー定数のint値 」値が「エラー文字列」となる連想配列を生成しています。 // 定義済みの定数を取得 $allConstants = get_defined_constants ( true ) ; // "Core"カテゴリに入っていて"E_"から始まる定数のみ取得 $errorConstants = array_filter ( $allConstants [ "Core" ] , fn ( $key ) = > strncmp ( $key , "E_" , 2 ) === 0 , ARRAY_FILTER_USE_KEY ) ; // エラー定数のint値 -> エラー文字列になるように連想配列を逆転 $errorCodeToString = array_flip ( $errorConstants ) ; // 使い方の例 echo $errorCodeToString [ E_COMPILE_ERROR ] ;

Node.jsでローカルにインストールしたpackageからプログラムを実行する方法

Node.jsでローカルにインストールしたパッケージのプログラムを実行する方法の紹介です。 方法1: 直接パス指定 モジュールがインストールされたディレクトリ ./node_modules/.bin/ から直接指定。下記はeslintのバージョンを取得したい場合の例。 ./node_modules/.bin/eslint -v 方法2: package.jsonのscriptsセクションに設定して実行 下記はeslintのバージョンを取得したい場合の設定例。 { "name" : "Sample" , "description" : "Sample Project" , "scripts" : { "eslint-version" : "eslint -v" , } , 実行時はプロンプトで npm run {設定したscript名} と入力すればコマンドを実行することができます。上記の例の場合は下記のように入力すればOKです。 $ npm run eslint-version ちなみにデフォルトで設定されているscriptsは下記に記載されています。 https://docs.npmjs.com/cli/v7/using-npm/scripts

Windowsで特定のポートを使っているプロセスを強制終了

Windows上である特定のポートを使って立ち上げたサーバープロセスを強制終了する方法の紹介です。 ■ 方法 1) Windows PowerShellやCommand Promptを立ち上げます。必須ではありませんが、プロセスのKILLを実行するので、管理者権限で立ち上げるのが無難で す。 2) ポートで使用しているポート番号(<PORT>)のプロセスIDを検索します。 netstat -ano | findstr :<PORT> 3) 得られたプロセスIDを指定(<PID>の部分)して、そのプロセスをKILLします。 taskkill /PID <PID> /F ■ 実際の例 例えば49668ポートで検索した場合、下記のような結果が出力されます。 PS C:\Windows\system32> netstat -ano | findstr :49668 TCP 0.0.0.0:49668 0.0.0.0:0 LISTENING 3932 TCP [::]:49668 [::]:0 LISTENING 3932 上記の例の場合のプロセスIDは「3932」になるので、下記のようにコマンドを実行すれば、当該のプロセスがKILLされます。 taskkill /PID 3932 /F ちなみに複数のプロセスIDを指定してKILLすることもできます。 taskkill /PID 14328 /PID 8156 /PID 6864 /F

エラーコード0x80070002でWindows Updateが進まない問題

0x80070002エラー Windows Updateを実行していたのですが、何度実行しても「エラーコード0x80070002」のエラーが発生してインストールに失敗するようになってしまいました。 下記のページに載っていた情報をもとに色々試したのですが、最終的に筆者の環境では、 ソフトウェア配布フォルダーの削除 を実施して解決しました。 https://freesoft.tvbok.com/tips/update_error_code/0x80070002.html https://www.cyclonis.com/ja/how-to-fix-error-code-0x80070002/ 「マイコンピュータ」に移動。 「C:\ Windows」フォルダーに移動。 SoftwareDistribution という名前のフォルダを検索して、念のため、フォルダの名前を SoftwareDistributionBackup などに変更してバックアップ。 SoftwareDistribution フォルダ削除。 PCを再起動し、Windows UpdateにアクセスしてPCを更新。 補足 ちなみにWindows Updateで0x80070002のエラーが発生している場合、Microsoft Storeで新しいアプリをインストールしようとしてGetボタンを押しても反応がなくなり、Microsoft Storeからアプリをインストールできなくなるようです。 筆者の場合は、下記のような流れで解決しました。 1) Microsoft Storeで新しいアプリをインストールできなきなくなる ↓ 2) Windows Updateの失敗していることが原因と判明 ↓ 3) Windows Updateが0x80070002エラーで失敗していることが判明 ↓ 4) Windows Updateが0x80070002エラーをこの記事に書いた方法で解決して、Windows Updateを完了させる ↓ 5) Microsoft Storeで新しいアプリをインストール成功となり、無事すべての問題解決!

NetBeansが「invalid jdkhome specified」エラーで起動しな場合の対処法

Windows 10のPCでJavaのバージョンを入れ替えた後、NetBeansを起動しようとしたのですが、「invalid jdkhome specified」「Cannot find java 1.8 or higher」というエラーが派生して、NetBeansが起動しなくなってしまいました。 環境変数のJAVA_HOMEが原因かとも思いましたが、筆者の環境で使用している C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\ が正しく設定されていました。 調査したところ、原因は C:\Program Files\NetBeans-12.0\netbeans\etc\netbeans.conf 内の netbeans_jdkhome の設定でした。 netbeans.conf にインストールしてあるJDKを指定して、無事起動するようになりました(下記は筆者の例ですので、各人の環境にインストールしてあるJDKを指定してください)。 netbeans_jdkhome="C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot" 編集時の注意点としては、Administrator権限でファイルを編集する必要があります。 Windowsの検索ボックスで「Command Prompt」を検索。 検索結果に出てきた「Command Prompt」プログラムを右クリックして、「Run as administrator」でプログラムを起動。 cd "C:\Program Files\NetBeans-12.0\netbeans\etc" のようにインストールしてあるNetBeansのetcディレクトリへ移動。 notepad netbeans.conf と入力してnotepadを起動。 notepadで netbeans_jdkhome のエントリを探して使いたいJDKのホームディレクトリを指定して、ファイルを保存。 筆者は、最初Administrator権限ではなく、普通のユーザで直接netbeans.confを編集してしまい、変更が反映されずにしばらく原因を探るのに時間がかかってしましました。

WSLを利用している各アプリケーションのWSLのバージョンを確認する方法

WSL (Windows Subsystem for Linux)は、WSL 2からIOパフォーマンスなどが向上していますので、基本的にはWSL 2を使う方がおすすめです。 WSL 2は、下記のMicrosoftの公式ドキュメントの通り設定すれば、簡単にセットアップできます。 Install WSL on Windows 10 | Microsoft Docs すでにWSLを使っている場合に、各アプリケーションが利用しているWSLのバージョンを確認したいこともあると思いますが、その場合はPowerShellなどで、 wsl -l -v と実行すればOKです。 PS C:\> wsl -l -v NAME STATE VERSION * docker-desktop Stopped 2 docker-desktop-data Stopped 2 Ubuntu-20.04 Stopped 2 上記の実行例では、docker-desktopやUbuntu-20.04がすべて、Version 2 (=WSL2)を利用していることがわかります。

PhpStormのTerminalでGit Bashを利用した際にSymfonyコマンドの出力のANSI color codeが正しく色付けされるようにする方法

WindowsのPhpStormのTerminalでGit Bashを設定して、利用していたのですが、Terminal内のSymfonyのコマンドの実行結果で色付けして表示されるべき部分がANSIのカラーコードのまま表示されてしまうという問題に遭遇したので、解決法のメモです。 元の設定 Settings > Tools > Terminal内のShell pathのところに単純にGit Bashのパス "C:\Program Files\Git\bin\sh.exe" と入力していました。 この設定でターミナルからSymfonyのコマンドを実行すると、出力結果は下記のようになり、色付けが正しくされていませんでした。 文字列をそのまま貼り付けると下記のような感じ。。。 $ symfony ? [ 30 ; 43mWARNING? [ 39 ; 49m A new version is available ( ? [ 32m4.25.4? [ 39m, currently running ? [ 32mv4.25.2? [ 39m ) . ? [ 32mConsider upgrading soon using:? [ 39m symfony self:update ? [ 32mSymfony CLI? [ 39m version ? [ 33mv4.25.2? [ 39m ( c ) 2017-2021 Symfony SAS Symfony CLI helps developers manage projects, from local code to remote infrastructure 解決法 色々格闘していたろころ、下記の記事を見つけてようやく解決しました。 https://stackoverflow.com/questions/39172301/ansi-color-codes-in-phpstorm-console ANSICONというプログラムをダウンロードして、適当な場所に配置。 https://github.com/adoxa/ansicon/releases Settings > Tools > Terminal内のShell pat...

マザーボードのボタン電池交換

自作パソコンのWindowsの時計が狂い始めたので、マザーボードのボタン電池を交換しました。 3Vの CR2032 のボタン電池を使えばOKでした。家に余っていた、少し薄いCR2025も使えそうでしたが、接触不良とか怖いので、普通にCR2032を使いました。 ちなみにCR20以降の数字はボタン電池の厚みを表すそうです(大きい方が厚い)。

Firebase Toolsコマンドが実行ポリシーの設定が原因で実行できない問題の解決法

Firebase ToolsをインストールしてWindows PowerShell上からfirebaseコマンドを実行したのですが、下記の実行ポリシー関連のエラーが発生して正常に実行できませんでした。 PS C:\\Users\\user > firebase firebase : File C:\\Users\\user\\AppData\\Roaming\\npm\\firebase.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID = 135170. At line:1 char:1 + firebase + ~~~~~~~~ + CategoryInfo : SecurityError: ( : ) [ ] , PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess このあたりを参考に https://tecadmin.net/powershell-running-scripts-is-disabled-system/ 、管理者(Administrator)権限でPowerShellを開き、下記のコマンドを実行して解決しました。 PS C:\\Users\\user > Set-ExecutionPolicy RemoteSigned

Webのフロント側でもとのfirebaseの初期設定をコピーして新しいfirebaseインスタンスを作成する方法

frontendのWeb側で、 firebase.app().options を利用して、もとのfirebaseインスタンスと同じ設定のインスタンスを作成する方法の紹介です。 firebase.app().options の中身をJSON形式で表示させると、下記のように、firebaseのインスタンスの初期化時のoptionsが取得できます。 { "projectId" : "project_id" , "appId" : "1:XXXXXXXXXXXX:web:XXXXXXXXXXXXXXXXXXX" , "storageBucket" : "project_id.appspot.com" , "locationId" : "asia-northeast1" , "apiKey" : "XXXXXXXXXXXXXXXXXXXXXX" , "authDomain" : "project_id.firebaseapp.com" , "messagingSenderId" : "11111111111111" , "measurementId" : "G-XXXXXXXX" } この firebase.app().options をそのままfirebase.initializeAppの引数に渡すことで、もとのfirebaseインスタンスと同じ設定のインスタンスを作成することができます。 const newFirebase = firebase . initializeApp ( firebase . app ( ) . options , 'newFirebaseApp' ) ;

WindowsとWSLから相互にファイルにアクセスする方法

WindowsからWSL上のLinuxシステム、WSL上のLinuxシステムからWindows上のファイルにアクセスする方法を紹介します。 * WindowsからWSL上のファイルにアクセスする方法 エクスプローラー上で \\wsl$ と入力すればOKです。WSL上のシステムが起動していれば、下記のようにエクスプローラー内にドライブが表示されます。 * WSL上にセットアップしたLinuxからWindowsのドライブにアクセスする方法 WindowsのCドライブは、Linux上の /mnt/c/ にマウントされています。LinuxのShellから、 /mnt/c にアクセスすればOKです。

FirebaseのEmulatorを利用する際にJavaをインストール

Firebaseのエミュレータ起動に失敗 Windows環境で firebase emulators:start コマンドを実行してFirebaseのエミュレータを起動しようとしたところ、下記のようなエラーが発生しました。 i firestore: Firestore Emulator logging to firestore-debug.logosting ! firestore: Fatal error occurred: s are not running, calls to these services from the Functions emulator will affect p Firestore Emulator has exited because java is not installed, you can install it from https://openjdk.java.net/install/, Your requested "node" version "10" doesn't match your global version "14" stopping all running emulatorsirestore-emulator-v1.11.15.jar... i functions: Stopping Functions Emulator i firestore: Stopping Firestore Emulator ! firestore: Error stopping Firestore Emulator 解決法 Javaがインストールされていないとのエラーメッセージなので、 AdoptOpenJDK をインストールします。この記事を書いている時点でのLTSのJava 11をインストールして無事起動するようになりました。

eslintのエラー「describe is not defined when installing jest」の解消法

Jestでテストを書く際にdescribe functionを使うと、describe functionが定義されていないので「‘describe’ is not defined.(no-undef)」というeslintのエラーが出ることがありますが、eslint.jsに下記の設定を追加すれば解消します。 "env" : { "jest" : true } 同様にmocha関連のfuncionを使用した際にも「‘xxxxxx’ is not defined.(no-undef)」などが出ることがありますが、これも "env" : { "mocha" : true } と追記すれば解消します。

Windowsでnvmを使う方法

複数のNode.jsのバージョンを管理するソフトウェアとしては、下記のようなものがあります。 nvm (Node Version Manager) nodebrew nodenv 本記事ではWindowsでnvmの使い方を解説します。 NVMの主なコマンド一覧 いずれもWindowsでは管理者権限でPowerShellやコマンドプロンプトを実行するのが無難です。 nvm list available インストール可能なNode.jsのバージョン一覧を出力。 nvm install {version} {version}で指定したNode.jsをインストール。 nvm ls 現在インストールされているNode.jsのバージョン一覧を出力。 nvm use {version} {version}で指定したNode.jsに切り替え。

JavascriptのObject Literalを使った条件分岐

条件分岐を簡潔に書きたい! 条件分岐をする場合、通常はif~else文やswitch~case文を使うことが一般的ですが、Object Literalを活用すると簡潔にコードを書くことできる場合があります。Object Literalを利用するのは、ちょうどPHPのarray、JavaのMap、C#のDictionaryなどの連想配列を利用するイメージが近いと思います。 switch~case文とObject Literalを使った場合のコード例をいくつか示していきます。 switch~case文とローカル変数を使った場合 function GetStockCode_LocalVariable ( makerName ) { let code = "" ; switch ( makerName ) { case "Asus" : code = "2557" ; break ; case "MSI" : code = "2377" ; break ; default : throw new Error ( "unsupported maker: " + makerName ) ; } console . log ( code ) ; } 一般的な書き方ですが、下記の短所があります。 mutableなローカル変数のcodeを定義しなければならない。 switch~caseのキーワードやbreakキーワードが何度も出現し、重要な部分がわかりにくい switch~case文と即時実行関数式(Immediately Invoked Function Expression)を使った場合 function GetStockCode_IIFE ( makerName ) { const code = ( ( ) => { switch ( m...

Unityのバイナリがフォルダに出力されない問題

Visual Studio上でNUnitのプロジェクトから、Unity本体のプロジェクトを参照させて、Unity本体のプロジェクトのコードの一部をテストさせようとしたところ、下記のエラーメッセージが出力され、Debugディレクトリにアセンブリが生成されず、NUnitを実行することができませんでした。 Metadata file 'ProjectFolder\Temp\bin\Debug\Assembly-CSharp.dll' could not be found. Google先生で検索したところStack Overflowでドンピシャの質問を見つけました。 https://stackoverflow.com/questions/58614995/visual-studio-doesnt-put-binaries-of-unity-project-to-output-folder 記事の通り Disable the full build of projects を False に設定すると、無事bin/Debugフォルダにアセンブリが出力されるようになりました。

Bloggerでアップロードされた画像の保存先

2021年5月現在、Bloggerで画像を投稿する場合は、下記の方法があります。 コンピュータからアップロード Google Photosでアップロードされている画像から選択 URLから参照 Bloggerですでにアップロードされている画像(またはアルバムから参照) 2.のGoogle Photoでアップロードされている画像から選択の場合は、Google Photoに自らアップロードした画像なので、元画像はGoogle Photosのアルバムから確認することができます。 問題は、 4.のBloggerですでにアップロードされている画像の保存先 です。少し調べたところ、下記のURLから確認できることがわかりました。 https://get.google.com/albumarchive/ 容量のカウントは、他のGoogleのサービス (Google Drive, Gmail, Google Photosなどと)と合算されるようです。

MSIのDragon Centerを使っているとXboxアプリがスタートアップ時にタスクバーにピン止めされる問題の解決法

MSIのゲーミングノートPCでXboxのアプリをタスクバーのピン止めを外しても、再起動するとまたタスクバーに再度ピン止めされるという問題が発生しました。 下記のMicrosoftのCommunityサイトでも同様の問題が数多く報告されており、解決法が記載されている投稿を見つけました。 https://answers.microsoft.com/en-us/windows/forum/windows_10-desktop/apps-keep-pinning-themselves-on-startup-to-the/44b0bb7b-575d-4534-aa1c-80258f710514?page=2 筆者の環境では、下記の手順でDragon Centerの設定を修正すると解決しました。 C:\Users{ユーザー名}\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml 内でtaskbar:TaskbarPinListのセクションを探す(下記は例)。 < taskbar: TaskbarPinList > < taskbar: UWA AppUserModelID = " 9426MICRO-STARINTERNATION.DragonCenter_xxxxxxxxxxxxx!App " /> < taskbar: UWA AppUserModelID = " 9426MICRO-STARINTERNATION.CreatorCenter_xxxxxxxxxxxxx!App " /> < taskbar: UWA AppUserModelID = " Microsoft.GamingApp_xxxxxxxxxxxxx!Microsoft.Xbox.App " /> </ taskbar: TaskbarPinList > このセクションを丸ごと削除 (またはxml形式のコメントアウト)を実施して、PCを再起動すればOKです。 念のため編集前のxmlファイルを保存しておいた方が...

ElasticsearchのIndexのメンテナンスツールであるCuratorの使い方メモ

詳細は オフィシャルのドキュメント を参照してもらうとして、使い方は下記になります。 # --configでどのElasticsearchを参照するかを指定 # 最後の引数のactions.ymlで何日前のインデックスを消すかなどを設定 curator --config /etc/curator/curator.yml /etc/curator/actions.yml 下記はcurator.ymlの例です。 client: hosts: - http://elasticsearch-host.com/ port: 9200 url_prefix: use_ssl: False certificate: client_cert: client_key: ssl_no_validate: False http_auth: user:password timeout: 30 master_only: False logging: loglevel: INFO logfile: logformat: default blacklist: ['elasticsearch'] 下記はactions.ymlの例です。 actions: 1: action: delete_indices description: >- logstash-で始まり、30日より古いインデックスを削除 options: ignore_empty_list: True disable_action: True filters: - filtertype: pattern kind: prefix value: logstash- - filtertype: age source: name direction: older timestring: '%Y.%m.%d' unit: days unit_count: 30

Visual Studio 2019で静的コード解析 (Static Code Analysis)

最近はVisual Studioも高機能になってきて簡単なコード解析機能はデフォルトで利用できるようになってきました。今回の記事で利用したVisual StudioはVersion 16.9.4です。 サーバー上に継続的にデータを蓄積しているわけではないので、指標の変化は追えませんが、プロジェクト内で改善の必要なファイルはある程度目星をつけられるのではないかと思います。 使い方は簡単で、最上部のメニューの「Analyze > Calculate Code Metrics > For Solution (またはFor {Project名})」を選択すると、コード解析が実行され、Code Metrics Rsultsウィンドウにproject > namespace > class > method の階層で解析結果が表示されます。 解析されるMetricsは下記になります。 Maintenability Index (メンテナンス指標) Cyclomatic Complexity (循環的複雑度) Depth of ingheritance (継承の深さ) Class Coupling (クラスの結合度) Lines of Souce code (コードの行数) Lines of Executable coce (実際に実行されるコードの行数。括弧、コメント、空行を除いた行数)

Dockerでコンテナ内のディレクトリを実ホストのディレクトリにマウントする設定

基本的にDockerのコンテナは使い捨てなので、永続化させたいデータはコンテナ外に置くことが多いと思います。Dockerでは、コンテナ内のディレクトリを実ホストのディレクトリにマウントする設定を入れることで、これを実現できます。 Dockerのコンテナを再起動しても、元のデータが残ります。特にDocker内でデータベースを使っている場合には、重要な設定になると思います。 またDockerのコンテナ内のアプリケーションの設定ファイルなどを、コンテナ外部のディレクトリに置く場合にも利用されます。 設定の書式は「コンテナの外のホストのディレクトリパス:コンテナ内のディレクトリパス」になります。 下記に設定例を示します。Redashで利用しているPostgressのデータベースのデータ本体をコンテナ外マウントした場合を想定しています。 volumes: # コンテナ外のディレクトリ:コンテナ内のディレクトリ - /usr/docker/redash/postgres/opt/postgres-data:/var/lib/postgresql/data

前日の日付が入ったファイルをLinuxコマンドで処理

ログファイルのバックアップなどで、日付の入ったファイルを扱うことも多いと思います。 dateコマンドを使って、前日の日付がファイル名に入ったファイルだけを処理する簡単なLinuxコマンドを紹介します。 下記のコマンドでは、dateコマンドにyesterdayと日付フォーマットを引数として渡し、当日が2021年2月25日の時に20210224.logのような書式のログファイルを、dir1からdir2へコピーすることができます。 #!/bin/bash cp -p /dir/*'date -d 'yesterday' +%Y%m%d'.log /dir2/

Linuxコマンドの組み合わせだけで、前日の日付がが入ったファイルのみgzip圧縮する方法

ログファイルなどでは日ごとにファイルを生成し、日付がファイル名に入っている場合があると思います。 前日までの日付のファイルをすべてgzipで圧縮するLinuxコマンドを紹介します。 注: コマンドの組み合わせは、もっと少なくできる方法もあるかもしれませんが、今回紹介したコマンドの組み合わせでも、たたき台にはなるかと思いますので、参考にしてみてください。 # /dir/ディレクトリはいかにある、拡張子がlogのファイルでかたファイル名に含まれる日付がコマンド実行時の前日のものをすべてgzip圧縮するコマンドの組み合わせ。 find /dir/ -type f -name "*.log" | sed 's/.*_\([0-9]*\)\.log/\1/` | awk -v date="$(date +%Y%m%d)" '{if ($0 < date) print $0}' | xargs -I {} find /dir/ -name "*{}.log" | xargs --no-run-if-empty gzip 簡単に解説です。 find /dir/ -type f -name "*.log" :dirディレクトリ配下で拡張子がlogのファイルをすべてリストアップ sed 's/.*_\([0-9]*\)\.log/\1/` :ファイル名から日付部分のみを抜き出し awk -v date="$(date +%Y%m%d)" '{if ($0 < date) print $0}' :コマンド実行時の前日の日付のみ抜き出し。ちなみにawkのvオプションで変数dateを定義しています。 xargs -I {} find /dir/ -name "*{}.log" :前日以前の日付が含まれる拡張子がlogのファイルをすべて取得。ちなみにxargsの -Iオプションの{}の部分で日付部分をfindコマンドに渡しています。 xargs --no-run-if-empty gzip :ファイルがなかったら実行しないというxargsのオプション...

Androidのホーム画面で左スワイプすると出現するGoogleのフィードを無効化する方法

Androidのホーム画面で左スワイプすると出現するGoogleのフィードが邪魔だったので、無効化してみました。Android 8.0 Oreo では下記の方法で変更できました。 Androidのホームスクリーンを長押し 使っているLauncherにもよりますが、Preferencesを選択 Home screenを選択 Scrolling modeで「Standard scrolling + Google」が選択されているので、「Standard scrolling」を選択 使っているスマートフォンのAndroidのバージョンやLauncherの種類にもよるので、「この手順で決まり」というのは中々いいづらいです。 肝は、ホームスクリーンを長押しして、ホーム画面の設定からそれらしい設定を見つけることでしょうか (例えば「Swipe to access Google app」とかの場合もあるようです)。

PHPのregister_shutdown_functionで登録した関数内でmemory_limitを増加させる

PHPで、特にメモリ不足のエラーが発生してプログラムが強制終了したときに、register_shutdown_functionに終了時に実行したい関数を登録することで、プログラム終了時にその登録した関数を実行することができます。 が、その登録した関数内の処理でメモリ不足になり、実行したかった処理が実行されないという問題に遭遇しました。 色々テストしたところ、register_shutdown_functionに登録した関数内でPHPのmemory_limitを増加させれば対応できることがわかりました。 といわけで現在のmemory_limitに任意のメモリ値を足すメソッドを作成してみました。 下記のsetAddedMemoryLimitByMegaByteメソッドは、引数にmemory_limitの増分を渡すことで、memory_limitの設定値を増加させることができます。 注意点として、作成したプログラム内のmemory_limitの許容フォーマットは こちら に書かれている情報に基づいて決めました。 今のプログラムは、256、128K、1024M、3Gなどは正しく処理可能です。 メモリサイズの設定値なので、そこまで変な値が設定される可能性は少ないですが、もし今のプログラムで処理できない場合は、convertMemoryLitAsByteValue内のmemory_limitをパースしている正規表現部分を修正することで対応できます。 class PHPUtils { public static function setAddedMemoryLimitByMegaByte($addition) { $current = ini_get('memory_limit'); if($current == -1) { return; } try { ini_set('memory_limit', self::calcAddedMemoryAsMegaByte($current, $addition))...

VIsual StudioでGitHubと連携

VIsual Studio上でGitHubと連携をさせるには、 GitHub Extension for Visual Studio が便利です。 最近は GitHub Desktop とかも提供されていて、バージョンコントロールでどのツールをメインで使うか悩みどころです。

PHPのNormalizerを使って文字列を正規化 (例: 全角英数字を半角英数字にする方法)

文字列検索を実施する際に、全角半角を区別せずに検索させたい場合があるかと思います。 例えば、全角文字の「ABC」で検索して半角文字の「ABC」にヒットさせたい場合です。そのような場合は、文字や文字列を正式に決められた表現に変換する処理「正規化」を行うことで解決します。(もちろん検索される側の文字列の表現が統一されていることが前提にはなります。) 「正規化」はテキストを保存する際の表記を統一するために用いられうこともあります。 PHPではNormalizerというライブラリを利用します。下記に使用例を示します。 <?php // 全角文字表記 $input = 'ABC'; $result = \Normalizer::normalize($input, \Normalizer::NFKC); // 半角文字のABCが出力される echo $result; このプログラムでNFKC正規化をすると下記のような結果が得られます。 入力 種類 出力 ㈱ 組み文字 (株) ㍇ 組み文字 マンション ア 半角カタカナ ア ちなみに正規化の種類には下記の4種類があります。( Wikipediaより引用) 。 名称 説明 NFD Normalization Form Canonical Decomposition 文字は正準等価性によって分解される。 NFC Normalization Form Canonical Composition 文字は正準等価性によって分解され、再度合成される。結果として文字の並びが変換前と変わることもありうる。 NFKD Normalization Form Compatibility Decomposition 文字は互換等価性によって分解される。 NFKC Normalization Form Compatibility Composit...

Unity関連のクラスをWindowsのスタンドアローンアプリケーションから利用する際の注意点

Unityのアセンブリを参照してWindows上からスタンドアローンのアプリケーションを実行しようとしたところ、Unity Engine内からしかインスタンス化できないクラスがあったのでメモです。( visual studio - C# Security Exception - Stack Overflow でも投稿されています。) 例えば、GameObjectクラスをUnity Engine外からインスタンス化しようとすると下記のようなエラーが発生します。 System.Security.SecurityException : ECall メソッドをシステム モジュールにパッケージ化しなければなりません。 英語だと下記のエラーメッセージになります。 ECall methods must be packaged into a system module Stack Trace: GameObject.ctor() ちなみにVector3の構造体(struct)はUnity Engine外から参照しても問題ありませんでした。 実際にクラスや構造体を利用してみて調べていくしかなさそうです。

JavaのServlet内で他のURLから取得したデータをそのまま出力するコード

JavaのServlet内で他のURLからデータを取得してそのまま、レスポンスを出力するためのコードサンプルです。 使っているのはJavaの標準ライブラリのみなので、移植性は高いと思います。googleの提供しているライブラリやApacheのcommonsのライブラリを使うともう少しコード量は減らせると思います(特に汎用的なcopyメソッドの部分)。 import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; public class ServletUtils { private static final int _20K_BYTES = 20480; public static void fetchUrlAndDirectlyRespond(HttpServletResponse resp, String contentType, String urlStr) throws MalformedURLException, IOException, URISyntaxException { URL url = new URI(urlStr).toURL(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.connect(); ServletOutput...

JavaでTimeZoneを指定して日付をフォーマットする方法

国際的に使われるソフトウェアを開発している場合、日付のタイムゾーンを意識しなければならないことがあると思います。 JavaではZoneIdクラスとZonedDateTimeクラスを利用することで簡単に指定することができます。 下記にAsia/Tokyoのタイムゾーンを指定して、7日前の日付をuuuuMMddHHmmフォーマット(分単位まで表示。例: 2021年2月13日21時34分ならば202102132134)で出力するサンプルコードを示します。 private static final ZoneId TIMEZONE_TOKYO = ZoneId.of("Asia/Tokyo"); private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("uuuuMMddHHmm"); String date_7_days_before = ZonedDateTime.now(TIMEZONE_TOKYO).plusMinutes(-7).format(DATETIME_FORMATTER); System.out.println(date_7_days_before);

Webのリクエストのパラメタを指定したパラメタ順でソートする方法(PHP)

Webリクエストのパラメタを指定したパラメタ名の順でソートするプログラムを書いてみました。 プログラム自体は汎用的なので、パラメタのソートに限らず、それ以外でも利用可能です。 <?php class ParameterSorter { private $sortOrder; // パラメタのソート順を指定 public function __construct($sortOrder) { $this->sortOrder = array_flip($sortOrder); $this->max = count($sortOrder); } // uksortを使って指定されたパラメタ順でソート // $sortOrderのキーをパラメタ名に変換して、uksortを使うのは性能を上げるためです。 // ソート順が指定されていないパラメタは、ソート順が指定されたパラメタの後になるように実装しています。 public function sort(&$parameters) { uksort($parameters, function($a, $b){ return ($this->sortOrder[$a] ?? $this->max) - ($this->sortOrder[$b] ?? $this->max); }); } // PHPのuksortは安定でない(同順位の場合もとの順序が保存されない)らしいので、元の順序を確実に保証するバージョンも作成しました。 public function stableSort(&$parameters) { $originalOrder = array_flip(array_keys($parameters)); uksort($parameters, function($a, $b) use($originalOrder){ $compared = ($this->sortOrder[$a]...

Visual Studioで「Source file '...' could not be found」のエラーを解消する方法

問題 Visual Studio上でC#のプロジェクトをビルドを実行したところ「Source file '...' could not be found」のエラーが発生してビルドできなくなってしまいました。 少し調べたところ、Visual Studioのプロジェクトファイル(csproj)のXMLのProject > ItemGroup > Compileのエントリに存在しないファイルが含まれていることが原因でした。 解決法 Visual Studio上からプロジェクトを一度Unloadして、csprojから当該のXMLエントリを削除して、再度プロジェクトをReloadしたところ解決しました。 (プロジェクトのUnload -> Relaodは念のために実施しました)。 下記のようなXMLエントリを探せばOKです(Include属性のファイル名部分はダミーです)。 <ItemGroup> <Compile Include="dir\something1.cs"> <Compile Include="dir\something2.cs"> <Compile Include="dir\missing.cs"> ... </ItemGroup> [補足] 通常のVisual Studioとかで作成したプロジェクトは、csproj内でCompileエントリが直接設定されていることは少ないようです。Unityから作成したプロジェクトなので、1ファイルずつCompileのエントリが設定されていたようです。

ノートパソコンでバッテリの寿命を延ばすためのアプリケーション

バッテリ自体の寿命を延ばすためには、バッテリの充電率を100%ではなく60%程度に抑えておく方がよいようです。 Windowsに備わっているデフォルトの機能だけでは、バッテリの満充電の充電率を制御できませんが、下記のアプリケーションを使うと可能になります。 MSI Dragon Center (MSI専用) ASUS Armoury Crate (ASUS専用) Battery Limiter (フリーソフト) MSIとASUSのアプリケーションはゲームPC向けで、それぞれのメーカー専用なので、普通のノートPCで使う場合は、Battery Limiter一択になるかと思います。 もちろんバッテリの充電量を60%程度に制限するので、バッテリでの駆動時間は短くなってしまいます。なので、バッテリ自体の寿命をそこまで伸ばす必要があるか、自身の使用形態に応じて導入するか検討した方がよいと思います。

テキストをNグラムに分割するJavaプログラム

与えられたテキストをNグラム(n-gram)で分割するJavaプログラムです。 Javaの標準ライブラリのjava.util.ArrayList、java.util.Listを使っています。 public static List<String> splitByNGram(String src, int n) { List<String> chunks = new ArrayList<>(); for(int start = 0, len = src.length(); start < len; start++) { int end = start + n; chunks.add(src.substring(start, end < len ? end : len)); } return chunks; }

File Differ: Visual StudioのGUI上からファイルを選択してファイル間の差分表示するためのExtension

Visual Studioでファイル間の差分を表示をする方法としてが、「ツール > コマンドライン > 開発者コマンドプロンプト」からプロンプトを立ち上げて「devenv /diff ファイル1 ファイル2」を実行する方法がありますが、ファイル名を入力するのが面倒だったので、GUIから差分表示できるものを探していました。 Extensionを探したところ File Differ というExtensionのたどり着きました。 上記のリンクからexeファイルをダウンロードして実行するだけでインストールは完了します。 インストール後はSolution Explorer内で比較したいファイルを選択して右クリックしてでてくる「Compare Files」メニューをクリックすればOKです。(Visual Studio 2019で動作確認済み) 「Compare Files」メニューをクリックすると下記のように選択したファイル間の差分が表示されるウィンドウが開きます。

Javaで平仮名をカタカナに変換するプログラム

Javaで平仮名をカタカナに変換するプログラムです。 public static String conbertHiragana2Katakana(String str) { int delta = 'ア' - 'あ'; StringBuilder buf = new StringBuilder(str.length()); for (int i = 0; i < str.length(); i++) { char code = str.charAt(i); Character.UnicodeBlock block = Character.UnicodeBlock.of(code); if (block != null && block.equals(Character.UnicodeBlock.HIRAGANA)) { buf.append((char)(code + delta)); } else { buf.append(code); } } return buf.toString(); }

Node.jsのコマンド早見表

Node.jsのコマンド早見表 よく使うNode.js関連のコマンドをまとめました。 npm install package.jsonに基づいてnode.jsのモジュールをインストール npm install {package}@{version} でバージョン指定してパッケージをインストール npm list -g --depth=0 -g オプションでフォルダ内で見つかったすべてのパッケージのツリーを表示 –depth=0オプションで依存関係のあるパッケージを除く node -v 現在のNode.jsのバージョンを取得 npm init package.jsonを設定・作成 npm audit 脆弱性のあるパッケージ一覧を表示 npm audit fixで脆弱性のあるパッケージを、脆弱性対策済みのパッケージへ更新 npm prune node_modulesフォルダにあって、パッケージの依存リストにないパッケージを削除 -D, --save-dev 開発環境で使うパッケージ。package.jsonのdevDependenciesに記述される

Windowsのローカルアカウントのパスワードのリセット

Windowsのローカルアカウントのパスワードを忘れてしまった際のパスワードのリセット方法です。 本記事で示す方法は、下記の条件を満たすときに使うことができます。 PINを使ってログイン可能 ログインできるアカウントが管理者権限を持っている 個人使用のパソコンでは上記の条件を満たす場合は多いのではないでしょうか。 パスワードのリセットの手順は下記のとおりです。 キーボードの Windows ロゴ キー + X を押してクイック アクセス メニューを開き、[Windows PowerShell (管理者)] をクリック 「net user account_name new_password」を入力 ( account_name と new_password 部分は、それぞれユーザー名と希望のパスワードに置き換えてください。) 成功すると「The command completed successfully」と表示されます。