さゆフィクション | aws wordpress などなどゆるーく書いてます http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Fri, 27 Dec 2024 23:09:39 +0000 ja hourly 1 https://wordpress.org/?v=6.7.1 http://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png さゆフィクション | aws wordpress などなどゆるーく書いてます http://it.kensan.net/it 32 32 Laravel 11をAWS Lambdaで動くようにして簡単なAPIを作ってみる https://it.kensan.net/laravel-11-aws-lambda.html Sat, 21 Dec 2024 01:56:12 +0000 http://43.207.185.157/it/?p=2180 Laravel 11をAWS Lambdaで動くようにして簡単なAPIを作ってみます。

ちなみに私は割とPHP初心者です。

初心者ですが、これからAPI作成するならPHPが良いと思っています。

PHPが良い理由は、実装できる人が多いと思っていて、いざとなれば他の人(他の会社)に協力を仰ぎやすそうだからです。インターネット上に情報もいっぱいあるというアドバンテージもあると思います。

フレームワークは、PHPの中で一番ポピュラーという理由からLaravel!と考えています。

まずは、作成する環境について記載していきます。

 

 

作成する環境の構成

以下の構成で動かしてみます。

  • プログラム
    • Laravel
  • AWSリソース
    • API Gateway
    • Lambda

実際に、Laravel 11をAWS Lambdaで動かしてみます!!

Laravel 11をAWS Lambdaで動かしてみる

まずはLaravelプロジェクトを作成します。

Laravelプロジェクトの作成

以下のコマンドでLaravelプロジェクトを作成します。

composer create-project laravel/laravel lambda_test

プロジェクト作成ができたら、Laravelバージョンを確認します

cd lambda_test/
php artisan -V
Laravel Framework 11.36.1

上記のようにLaravelバージョンが確認できればOKです。

AWSにデプロイする準備

以下のコマンドでAWSのアクセスキーとシークレットキーを設定します

aws configure

アクセスキーとシークレットキーを設定後は、以下のような簡単なコマンドを使用して(以下はバケットの一覧を表示する例)、設定に成功しているか確認できます。

aws s3 ls

次にserverless frameworkをインストールします。

npm install -g serverless

次にbrefをインストールします。

composer require bref/bref bref/laravel-bridge --update-with-dependencies

次に serverless.yamlを生成します。

php artisan vendor:publish --tag=serverless-config

serverless.yamlのregionを以下の通り変更しておきます。(これで、デプロイ先を東京リージョンに変更しています。)

region: ap-northeast-1

serverless.yamlのruntimeも以下の通り変更しておきます。

    web:
        runtime: php-84-fpm
    artisan:
        runtime: php-84-console

 

修正後のserverless.yamlの全体は以下です。


service: laravel

provider:
    name: aws
    # The AWS region in which to deploy (us-east-1 is the default)
    region: ap-northeast-1
    # Environment variables
    environment:
        APP_ENV: production # Or use ${sls:stage} if you want the environment to match the stage
        SESSION_DRIVER: cookie # Change to database if you have set up a database

package:
    # Files and directories to exclude from deployment
    patterns:
        - '!node_modules/**'
        - '!public/storage'
        - '!resources/assets/**'
        - '!storage/**'
        - '!tests/**'
        - '!database/*.sqlite'

functions:

    # This function runs the Laravel website/API
    web:
        handler: public/index.php
        runtime: php-84-fpm
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        events:
            - httpApi: '*'

    # This function lets us run artisan commands in Lambda
    artisan:
        handler: artisan
        runtime: php-84-console
        timeout: 720 # in seconds
        # Uncomment to also run the scheduler every minute
        #events:
        #    - schedule:
        #          rate: rate(1 minute)
        #          input: '"schedule:run"'

plugins:
    # We need to include the Bref plugin
    - ./vendor/bref/bref

デプロイしてみる

以下のコマンドでデプロイできます

serverless deploy

以下が出てきた場合はLogin/Registerを選択するとWEBブラウザが開くと思うので、ログイン(アカウントを持っていない場合作成)します。


Please login/register or enter your license key: … 
❯ Login/Register
  Get A License
  Enter A License Key
  Explain Licensing Basics

デプロイができると以下のようにエンドポイントが表示されます。

endpoint: ANY - ****************

動作確認

エンドポイントにアクセスし、以下のように画面表示されればOKです。

簡単なAPIを作ってみる

以下のコマンドでコントローラを作成

php artisan make:controller ApiProductController

コントローラを以下のとおり実装


namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiProductController extends Controller
{
    public function index()
    {
        $products = [];
        $products['id'] = 1;
        $products['name'] = '商品名';
        return response()->json($products, 200);
    }
}

ルーティング(routes/web.php)ファイルに以下を追加

Route::get('/api', 'App\Http\Controllers\ApiProductController@index');

以下のコマンドでデプロイできます

serverless deploy

「エンドポイント/api」にアクセスして、以下のレスポンスが返って来れば成功です。


{
  "id": 1,
  "name": "商品名"
}

Laravelで作ったAPIをLambdaで動かす際に使うと良さそうAWSサービスは何か

API Gatewayは不要?

まず、Lambda関数URLがあるので、API GatewayはなくてもAPIの公開は可能で、この方がAPI Gateway分のコスト削減が可能とは思います。

しかし、API Gatewayを使用した方が、リクエストの認証(IAM、Cognito、APIキーなど)などが使える点で有利かと思います。

DBは?

RDSなら、RDS Proxy × Aurora Serverless v2という選択肢があると思います。

RDS Proxyを使うことで、データベースへの接続をプロキシすることで、データベースへの負荷を軽減できますが、8ACU分の料金がかかります。

費用を抑えたい場合、かつ同時接続数が少ない場合は、RDS ProxyなしでもOKかな。Aurora Serverless v2はゼロキャパシティのスケーリングをサポートしています。

Amazon Aurora Serverless v2 がゼロキャパシティへのスケーリングをサポート - AWS
AWS の新機能についてさらに詳しく知るには、 Amazon Aurora Serverless v2 がゼロキャパシティへのスケーリングをサポート

ユースケースによっては、Aurora Serverless v2とElastiCacheという組み合わせで、ElastiCacheでRDSの情報をキャッシュしてRDSの負荷を抑えるというのもありかと。

もしくは、DynamoDBという選択肢もあると思いますが、設計の難易度が高い…ですね。

まとめ

DBの選択肢など迷うことも多くありますが、プログラムとしてはLaravel(PHP)がいいと思っています!!

]]>
【Vue.js】Element Plusのtableのクラス操作(row-class-name)やクリックイベント(row-click)や列固定表示をしてみる https://it.kensan.net/element-plus-table.html Fri, 20 Dec 2024 00:24:55 +0000 http://52.195.187.13/it/?p=2178 Vue.js+Element Plusでのtableについて、以下の3点記載します!

  • クラス操作(row-class-name)
    • 特定の行にクラスをつけたい場合に使用
  • クリックイベント(row-click)について
    • 行クリックした場合に特定の関数を呼び出す
  • 列固定表示
    • 横スクロール時に一番左の列を固定表示にしてみる

Element Plusについて

まずは、Element Plusについて簡単に記載します。

Element Plusは、Vue3対応のUIライブラリです。

A Vue 3 UI Framework | Element Plus
A Vue 3 based component library for designers and developers

Element Plusのtableのクラス操作について

row-class-nameを使用して、特定の行にクラスをつけてみます。

以下サンプルコードです。

<template>
<el-table
ref="tableRef"
:data="users"
style="width: 100%"
border
:row-class-name="addClass"
>
<el-table-column
prop="Id"
label="ID"
/>
<el-table-column
prop="Name"
label="名前"
/>
<el-table-column
prop="bikou"
label="備考"
/>
</el-table>
</template>


<script>
import axios from "axios";
export default {
data() {
return {
users: []
}
},
mounted: function() {
axios.get('/list.json')
.then(response => (this.users = response.data))
.catch(error => console.log(error))
},
methods: {
addClass({ row }) {
// 条件に応じてクラスを追加
if (row.Id === "1") {
return 'add-class';
}
return ''; // デフォルトでクラスを付けない
},
},
}
</script>

:row-class-name="addClass"」でaddClassを呼び出し、addClass で追加するクラスを指定しています。

Element Plusのtableのクリックイベントについて

@row-clickを使用して、特定の行をクリック時に自前のメソッドを呼び出してみます。

以下サンプルコードです。

<template>
<el-table
ref="tableRef"
:data="users"
style="width: 100%"
border
@row-click="clickRow"
>
<el-table-column
prop="Id"
label="ID"
/>
<el-table-column
prop="Name"
label="名前"
/>
<el-table-column
prop="bikou"
label="備考"
/>
</el-table>
</template>


<script>
import axios from "axios";
export default {
data() {
return {
users: []
}
},
mounted: function() {
axios.get('/list.json')
.then(response => (this.users = response.data))
.catch(error => console.log(error))
},
methods: {
clickRow( row ) {
alert(row.Id);
},
},
}
</script>

@row-click="clickRow"」でclickRowを呼び出しています。clickRow に処理をしたい内容(詳細の表示とか)を記載できます。

Element Plusのtableの列固定表示について

カラムの設定で「fixed=“left”」を指定すると列固定表示できます。

以下サンプルコードです。

<template>
<el-table
ref="tableRef"
:data="users"
style="width: 100%"
border
@row-click="clickRow"
>
<el-table-column
prop="Id"
label="ID"
fixed="left"
width="300"
/>
<el-table-column
prop="Name"
label="名前"
width="300"
/>
<el-table-column
prop="bikou"
label="備考"
width="300"
/>
</el-table>
</template>

まとめ

Element Plusのテーブルについて以下の3点記載しました。どれも簡単に設定できましたーElement Plus便利!!!

  • クラス操作(row-class-name)
    • 特定の行にクラスをつけたい場合に使用
  • クリックイベント(row-click)について
    • 行クリックした場合に特定の関数を呼び出す
  • 列固定表示
    • 横スクロール時に一番左の列を固定表示にしてみる
]]>
Select2の日本語化(No results foundとかPlease enter 1 or more charactersとかを日本語にしてみる) https://it.kensan.net/select2-language.html Thu, 19 Dec 2024 23:40:59 +0000 http://52.195.187.13/it/?p=2168 Select2の日本語化してみます!

本記事でのselect2とは、selectのプルダウンを色々便利にしてくれるJavaScriptのライブラリの「Select2」を指しています。

↓本家↓

Getting Started | Select2 - The jQuery replacement for select boxes
Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and pagination (infinite scrolling) of results.

Select2を操作中に表示される以下のような英文を日本語化していきます。

  • No results found
    • Select2の選択候補がない時に表示されるメッセージ
  • Please enter 1 or more characters
    • 1文字以上入力してから選択候補を表示する設定で、入力されていない場合に表示されるメッセージ

簡単な英文なので、そのままでも良いという考えもあると思いますが、いろんな人が使うサービスの場合、日本語は必須かなと思います!

Select2を日本語化する方法

以下のようなコードで日本語化できます。
language オプションを使う感じです!


          $('select2セレクタ').select2({
            language: {
              inputTooShort: function () {
                return "1文字以上入力してください";
              },
              errorLoading: function () {
                return "結果を読み込めません";
              },
              loadingMore: function () {
                return "さらに結果を読み込んでいます";
              },
              noResults: function () {
                return "結果が見つかりません";
              },
              searching: function () {
                return "検索しています";
              }
            },
            placeholder: '選択してください',
            minimumInputLength: 1, // 最低入力文字数
            allowClear: true,
          });
        }

Select2の日本語化が簡単にできましたー

]]>
vue.jsのバージョン3にテスト(unit test)を追加する https://it.kensan.net/vue-js3-unit-test.html Sun, 15 Dec 2024 19:43:29 +0000 http://18.183.53.234/it/?p=2166 vue.jsのバージョン3にテスト(unit test)を追加する方法を書きます!

プロジェクト作成後に途中からテスト(unit test)を追加する方法について書いていきます。

vue.jsのバージョン3にテスト(unit test)を追加する

以下のコマンドで追加できます!これでvue3でテスト実行できるようになります。

vue add unit-jest

テストコードを書いてテスト実行してみる

テストコード

tests/unitフォルダ配下に「HelloWorld.spec.js」というファイル名でファイルを作成し、ファイルの中身は以下のコードにします

import { shallowMount } from '@vue/test-utils'


// テスト対象コード
const MessageComponent = {
template: '<p>{{ msg }}</p>',
props: ['msg']
}


// テストコード
test('displays message', () => {
const wrapper = shallowMount(MessageComponent, {
props: {
msg: 'Hello world'
}
})


// Assert the rendered text of the component
expect(wrapper.text()).toContain('Hello world')
})

テスト実行

以下のコマンドで実行できます

npm run test:unit

まとめ

以下のコマンド実行で簡単にvue3でテスト実行できるようになりました!

vue add unit-jest
]]>
select2をモーダル内で使う場合はdropdownParentを指定すると良い〜select2の入力ボックスにフォーカスが当足らない場合の解決方法 https://it.kensan.net/select2-dropdownparent-modal.html Sun, 15 Dec 2024 19:28:19 +0000 http://18.183.53.234/it/?p=2164 select2をモーダル内で使う場合はdropdownParentを指定すると良いということを書いていきます。

本記事でのselect2とは、selectのプルダウンを色々便利にしてくれるJavaScriptのライブラリの「Select2」を指しています。

↓本家↓

Getting Started | Select2 - The jQuery replacement for select boxes
Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and pagination (infinite scrolling) of results.

なぜselect2をモーダル内で使う場合にdropdownParentを指定すると良いのか

指定しないとselect2の入力ボックスにフォーカスが当たらず、入力して選択肢を絞るということができないケースが発生するためです。

どのようにdropdownParentを指定するか

以下のように指定します!

$('select2セレクタ').select2({ 
placeholder: '選択してください', 
allowClear: true, 
dropdownParent: $('モーダルセレクタ') 
});

これで、select2の入力ボックスにフォーカスが当たり、入力して選択肢を絞るということができるようになります。

]]>
Select2でCannot read properties of undefined (reading ‘id’) TypeError: Cannot read properties of undefined (reading ‘id’)エラーが発生する https://it.kensan.net/select2%e3%81%a7cannot-read-properties-of-undefined-reading-id-typeerror-cannot-read-properties-of-undefined-reading-id%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e7%99%ba%e7%94%9f%e3%81%99.html Sun, 15 Dec 2024 19:18:40 +0000 http://18.183.53.234/it/?p=2161 Select2でCannot read properties of undefined (reading ‘id’) TypeError: Cannot read properties of undefined (reading ‘id’)エラーが発生する場合の解決方法についてです!!

エラーの現象

以下のようにクリアを可能とする設定で、select2を表示させます。

$('#select').select2({
allowClear: true,
});

select2で選択後に、×マークをクリックすると以下のエラーが発生します。

Cannot read properties of undefined (reading 'id')

TypeError: Cannot read properties of undefined (reading 'id')

対処方法

placeholderを設定することでエラーを解消できます。

以下のような感じです。

$('#select').select2({
placeholder: '選択してください',
allowClear: true,
});

これでエラー解消!!

]]>
PHPバージョンアップの際はPHPComptibilityで静的解析をしてエラーと警告を見つけよう https://it.kensan.net/php%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%a2%e3%83%83%e3%83%97%e3%81%ae%e9%9a%9b%e3%81%afphpcomptibility%e3%81%a7%e9%9d%99%e7%9a%84%e8%a7%a3%e6%9e%90%e3%82%92%e3%81%97%e3%81%a6%e3%82%a8.html Sat, 12 Oct 2024 03:33:03 +0000 http://18.183.115.78/it/?p=2156 PHPバージョンアップの際はPHPComptibilityで静的解析をしてエラーと警告を見つけられるそうです。全部見つけられるわけではないと思いますが、PHPComptibilityで静的解析した方が安心かと思います。

ということでPHPComptibilityを試しにやってみます。

ローカルのPHP実行環境で、PHPComptibilityを動かす感じになりますが、ローカル環境がない場合は、以下のURLをご参照ください。

 

PHPプログラムのコンテナローカル開発環境を最短で立ち上げる簡単な方法(apache×php×mysql)
PHPプログラムのコンテナローカル開発環境を簡単に最短で立ち上げます! 以下を使います! apache htaccess有効な状態 ドキュメントルートの設定は.htaccessで行います! php バージョン8.3 mysql バージョン8...

PHPComptibilityで静的解析してみる

PHPComptibilityのインストール

以下のコマンドでインストールできます。

composer require --dev phpcompatibility/php-compatibility dev-develop

実際に静的解析してみる!!

以下の警告・エラーが出ない想定のプログラムに対して、静的解析してみます!


<?php
print"aaaa";
静的解析実行コマンドは以下です。「/index.php」で解析対象のファイルを指定します。
上記の解析対象のプログラムをindex.phpで作成したので、今回は「/index.php」を指定しています。
現在のディレクトリ配下全てを解析したい場合は「.」を指定することで、ディレクトリ配下全ての解析ができます。
./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は「8.3_report.txt」に吐き出すようにしています。

上記実行結果、エラー・警告はないため、「8.3_report.txt」はカラでした。

次に警告が出るPHPファイルを上記と同様、index.phpというファイルに作成して解析してみます。

<?php
print"aaaa";

# 8.3非推奨
class foo {
    function name()
    {
        echo "My name is " , get_class() , "\n";
    }
}

以下のコマンドで再度、静的解析してみます。

./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は以下です。

想定通り、1つ警告が出ました。


FILE: /var/www/html/index.php
--------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
--------------------------------------------------------------------------------
 8 | WARNING | Calling get_class() without the $object argument is deprecated
   |         | since PHP 8.3.
--------------------------------------------------------------------------------


 

今度はさらにエラーが出るPHPソースをindex.phpに追加して、解析してみます。

解析対象のソースは以下です。

<?php
print"aaaa";

# 8.3非推奨
class foo {
    function name()
    {
        echo "My name is " , get_class() , "\n";
    }
}

# 8.0削除
implode([1,2,3], ',');

以下のコマンドで解析します。

./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は以下の通りになりました。


FILE: /var/www/html/index.php
--------------------------------------------------------------------------------
FOUND 1 ERROR AND 1 WARNING AFFECTING 2 LINES
--------------------------------------------------------------------------------
  8 | WARNING | Calling get_class() without the $object argument is deprecated
    |         | since PHP 8.3.
 13 | ERROR   | Passing the $glue and $pieces parameters in reverse order to
    |         | implode has been deprecated since PHP 7.4 and is removed since
    |         | PHP 8.0; $glue should be the first parameter and $pieces the
    |         | second
--------------------------------------------------------------------------------

想定通り、1つエラーがつかされましたが出ました。

まとめ

簡単にPHPComptibilityで静的解析ができました。

PHPバージョンアップの際はPHPComptibilityで静的解析した方が安心かと思います!!

]]>
vue.jsでAdmin LTEコンポーネントを使って爆速で画面開発する https://it.kensan.net/vue-js-admin-lte.html Sat, 12 Oct 2024 02:42:19 +0000 http://18.183.115.78/it/?p=2153 vue.jsでAdmin LTEコンポーネントを使ってみます。

Admin LTEコンポーネントを使わせてもらった方が効率的だよね?という考えです。

開発環境は構築済みのものとして進めますので、まだの場合は以下URLを参考にしてくださいー

 

 

vue.jsをDockerコンテナ上でローカル開発できるようにする
vue.jsをDockerコンテナ上でローカル開発できるようにしてみます! 以下の流れで進めていきます docker-compose.yml作成 Dockerfile作成 コンテナ起動 コンテナ内でvueプロジェクト作成 サーバ起動 では早...

 

vue.jsでAdmin LTEコンポーネントを使う

Admin LTEのインストールをする

vue.jsのプロジェクトにAdmin LTEをインストールします。

以下のコマンドを実行すればOKです。

npm install admin-lte@^3.2 bootstrap jquery popper.js -save

ソースコードを修正する

ソースコードを修正して、Admin LTEを使ってみます。

main.jsの修正

以下のように修正します。こちらは共通設定のため、初回の1回のみ必要な修正です。

<ファイル名>

main.js

<ファイルの中身>


import { createApp } from 'vue'
import App from './App.vue'

import 'admin-lte/dist/css/adminlte.min.css';
import 'admin-lte/dist/js/adminlte.min.js';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';

createApp(App).mount('#app');

画面表示用のコード(vueファイル)を修正してAdminLTEを使ってみます

試しに以下のヘッダーを実装してみます。

Main Header Component
AdminLTE v3.2 Documentation

<ファイル名>

App.vue

<ファイルの中身>

<template>
<!-- Navbar -->
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="index3.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="#" class="nav-link">Contact</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown2" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Help
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown2">
<a class="dropdown-item" href="#">FAQ</a>
<a class="dropdown-item" href="#">Support</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Contact</a>
</div>
</li>
</ul>

<!-- SEARCH FORM -->
<form class="form-inline ml-3">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>

<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<!-- Messages Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-comments"></i>
<span class="badge badge-danger navbar-badge">3</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user1-128x128.jpg" alt="User Avatar" class="img-size-50 mr-3 img-circle">
<div class="media-body">
<h3 class="dropdown-item-title">
Brad Diesel
<span class="float-right text-sm text-danger"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">Call me whenever you can...</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user8-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
John Pierce
<span class="float-right text-sm text-muted"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">I got your message bro</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="dist/img/user3-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
Nora Silvester
<span class="float-right text-sm text-warning"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">The subject goes here</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
</div>
</li>
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-bell"></i>
<span class="badge badge-warning navbar-badge">15</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<span class="dropdown-header">15 Notifications</span>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-envelope mr-2"></i> 4 new messages
<span class="float-right text-muted text-sm">3 mins</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-users mr-2"></i> 8 friend requests
<span class="float-right text-muted text-sm">12 hours</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-file mr-2"></i> 3 new reports
<span class="float-right text-muted text-sm">2 days</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Notifications</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button"><i
class="fas fa-th-large"></i></a>
</li>
</ul>
</nav>
<!-- /.navbar -->

</template>

<script>

export default {
name: 'App'
}
</script>

動作確認する

以下のようなヘッダーが表示されれば成功です。

 

まとめ

vue.jsでAdmin LTEコンポーネントが使えました!!

これから頑張って開発していきますーー

]]>
vue.jsをDockerコンテナ上でローカル開発できるようにする https://it.kensan.net/vue-local-container.html Sat, 12 Oct 2024 01:47:45 +0000 http://18.183.115.78/it/?p=2147 vue.jsをDockerコンテナ上でローカル開発できるようにしてみます!

以下の流れで進めていきます

  1. docker-compose.yml作成
  2. Dockerfile作成
  3. コンテナ起動
  4. コンテナ内でvueプロジェクト作成
  5. サーバ起動

では早速やってみます!

 

 

vue.jsのローカル開発環境構築

docker-compose.ymlファイル作成

 

<ファイル名>

docker-compose.yml

<ファイルの中身>


services:
  web:
    build: .
    image: vueweb
    volumes:
      - .:/app
    container_name: 'web'
    ports:
      - '8080:8080'
    tty: true

Dockerfile作成

<ファイル名>

Dockerfile

<ファイルの中身>


FROM node:22
RUN npm install -g @vue/cli
EXPOSE 8080

コンテナ起動

以下のコマンドでコンテナを立ちあげます

docker-compose up --build

コンテナ内でプロジェクト作成します

まず以下のコマンドでコンテナの中に入ります。

docker-compose exec web bash

次に以下のコマンドでプロジェクトを作成します。

vue create sample

サーバ起動

以下のコマンドでサーバ起動します。

cd sample && npm run serve

動作確認

以下のURLにブラウザからアクセスして画面表示されればOKです!

http://localhost:8080/

以下のような画面が表示されるはずですー

 

docker-compose.ymlの微調整

vueがコンテナ上で正常に動くようになりましたが、このままですと、コンテナ起動のたびにコンテナ内で「cd sample && npm run serve」を実行する必要があります。

これは面倒なので以下のように、docker-compose.ymlに「cd sample && npm run serve」を追加して、コンテナ起動時にサーバ起動するようにします。

修正後のファイルは以下のようになります。

<ファイル名>

docker-compose.yml

<ファイルの中身>


services:
  web:
    build: .
    image: vueweb
    volumes:
      - .:/app
    command: sh -c "cd sample && npm run serve"
    container_name: 'web'
    ports:
      - '8080:8080'
    tty: true

 

まとめ

vue.jsのローカル開発環境構築をして、vue.jsをコンテナ上で動かしてみました。

ここから本格的にvue.jsの開発をしていきます!!

]]>
PHPプログラムのコンテナローカル開発環境を最短で立ち上げる簡単な方法(apache×php×mysql) https://it.kensan.net/php_container_apache_mysql.html Thu, 10 Oct 2024 05:40:50 +0000 http://13.231.168.135/it/?p=2139 PHPプログラムのコンテナローカル開発環境を簡単に最短で立ち上げます!

以下を使います!

  • apache
    • htaccess有効な状態
      • ドキュメントルートの設定は.htaccessで行います!
  • php
    • バージョン8.3
  • mysql
    • バージョン8

必要なファイル作成

以下のファイルをphpファイルが格納されているフォルダの直下に作成します。

  • docker-compose
  • Dockerfile
  • .htaccess

docker-composeファイル

<ファイル名>

docker-compose.yml

<ファイルの中身>

version: '3'

services:
    php:
        build:
            # Dockerfileを格納するフォルダのパス
            context: .
            # Dockerfileのファイル名
            dockerfile: Dockerfile
        volumes:
            - .:/var/www/html
        ports:
            - 8000:80
        container_name: php8.3
    mysql:
        image: mysql:8.0
        volumes:
            - /var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
        container_name: mysql8.0

mysqlはimageの指定箇所のバージョン変更することで別バージョンで立ち上げることも可能です。

Dockerfile

<ファイル名>

Dockerfile

<ファイルの中身>


FROM php:8.3-apache
# htaccess有効化
RUN  a2enmod rewrite
#composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

Fromの後のバージョンをいじることで、8.3以外のPHPを入れることも可能です。

composerは一応入れておきます。なくてもOK

.htaccess

<ファイル名>

.htaccess

<ファイルの中身>


RewriteEngine on
RewriteBase /
RewriteRule ^$ {ドキュメンルートへのパス} [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ {ドキュメンルートへのパス}$1 [L]

{ドキュメンルートへのパス}はご自身の環境に合わせてくださいー

動作確認

以下のコマンドでコンテナを立ち上げます。

docker compose up

以下のURLでPHPプログラムが想定通り動いていれば成功です!

http://localhost:8000/

ちなみに以下のコマンドでコンテナに入れます

docker compose exec php bash

まとめ

簡単に、PHPプログラムのコンテナローカル開発環境ができましたー

ちょっと動かしてみたい場合に使えると思います!

]]>