2025年8月1日金曜日

プログラムのドキュメント

spdb.htmlで使われている

JavaScript


text-hover-py.js

 pycat.js

divInput.js

eventTest.js

pmenu.js

init.js

cm.js

tornadoTest.js

gui2.js


        <script src="text-hover-py.js?A=3" ></script>

        <script src="pycat.js?A=3"></script>

        <script src="divInput.js?p=(new Date()).getTime()"></script>

        <script src="eventTest.js?p=(new Date()).getTime()"></script>

        <script src="pmenu.js?p=(new Date()).getTime()"></script>

        <script src="init.js?p=(new Date()).getTime()"></script>


        <script src="cm.js?A=3"></script>

        <script src="tornadoTest.js?A=3"></script>

        <script src="gui2.js?A=3"></script>


2025年6月29日日曜日

Django MySQLに移行

 DjangoをMySQLに対応させるには、以下の手順を行います。簡潔に、かつ確実に動くように整理しました。


✅ 手順一覧

① MySQLをインストール

すでにMySQLがインストール済みならスキップOKです。


Ubuntuの場合(例):

sudo apt install mysql-server


② Django用MySQLドライバをインストール(必須)


pip install mysqlclient

補足: mysqlclientは公式推奨。Cで書かれており高速。<br>

エラーが出る場合は以下のようなパッケージを先に入れる必要あり(Ubuntuの場合):

sudo apt install python3-dev default-libmysqlclient-dev build-essential

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config

(https://pypi.org/project/mysqlclient/)




③ MySQLにデータベースを作成

MySQLに入って、Django用のDBとユーザーを作る:


CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

FLUSH PRIVILEGES;


④ Django設定ファイルを修正(settings.py)

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'mydb',

        'USER': 'myuser',

        'PASSWORD': 'mypassword',

        'HOST': 'localhost',

        'PORT': '3306',

        'OPTIONS': {

            'charset': 'utf8mb4',

            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",

        },

    }

}


⑤ マイグレーションの実行(Django側)

python manage.py makemigrations

python manage.py migrate

🚨 注意点

mysqlclientがうまく入らない場合 → 代替で PyMySQL も使用可能(ただし非公式)


Windowsの場合、MySQL Connector/Cのインストールが必要になることがあります


utf8mb4 を使うことで絵文字なども保存可能(推奨)


tarで固めるてbackup

 tar -cf jan1.tar  jan1



解凍は
extractの「e」
「f」はファイル指定らしい

 tar -xf jan1.tar


バックアップには、グーグルのドライブが簡単です

VPSとlocal(ファイル同期)

rsyncを使うと簡単にlocalがVPSに反映される!


rsync -avz -e "ssh -p 2222" bbs/ ubuntu@ptag.page:/home/ubuntu/bbs/



koba@koba-FMVD38001:~$ cd jan1

koba@koba-FMVD38001:~/jan1$ rsync -avz -e "ssh -p 2222" bbs/ ubuntu@ptag.page:/home/ubuntu/bbs/

sending incremental file list

./

db.sqlite3

media/images/

media/images/Screenshot_from_2025-03-15_04-08-04_m8kcJfQ.png


sent 429,405 bytes  received 1,730 bytes  287,423.33 bytes/sec

total size is 4,960,570  speedup is 11.51



2025年3月12日水曜日

メモ

tar コマンド

圧縮、解凍するもの 




tar -cvzf archive.tar.gz /path/to/folder

tar -xvzf pyexec.tar.gz    


2024年12月17日火曜日

メール認証付きユーザー登録の流れ

 Djangoでユーザー登録をメール承認(認証)付きにするのは多少の設定が必要ですが、Djangoが提供する機能を活用すれば、それほど大変ではありません。以下に、ステップごとに分解して説明します。


1. メール認証付きユーザー登録の流れ

  1. ユーザーがフォームで登録
    • 仮登録の状態でユーザーをデータベースに保存。
  2. メールを送信
    • ユーザーの入力したメールアドレス宛に認証用のリンクを送信。
  3. ユーザーがリンクをクリック
    • 認証リンクにアクセスした際、アカウントを有効化。
  4. 有効化されたアカウントでログイン可能に

2. 実装手順

2.1 仮登録用のモデルフィールドを追加

デフォルトのユーザーモデルには「有効/無効」を管理するフィールドがないため、is_active フィールドを利用します。

  • 新規登録時にデフォルトで is_active=False に設定し、メール認証後に True に変更します。

forms.py (変更なし)

上記で作成した CustomUserCreationForm をそのまま使用します。


2.2 認証トークン生成と検証

Djangoの signing モジュールを利用して、メール認証用のトークンを生成します。

認証トークン生成ヘルパー

utils.py を新規作成します。

python
from django.contrib.auth.tokens import default_token_generator from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.utils.encoding import force_bytes, force_str from django.contrib.auth.models import User # トークン生成 def generate_email_verification_token(user): return default_token_generator.make_token(user) # トークンの検証 def verify_email_token(uidb64, token): try: uid = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=uid) except (TypeError, ValueError, OverflowError, User.DoesNotExist): return None if default_token_generator.check_token(user, token): return user return None

2.3 メール送信ビューの作成

Djangoの send_mail を使ってメールを送信します。

views.py

python
from django.shortcuts import render, redirect from django.contrib.auth import login from django.core.mail import send_mail from django.template.loader import render_to_string from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes from django.contrib.sites.shortcuts import get_current_site from .forms import CustomUserCreationForm from .utils import generate_email_verification_token def register(request): if request.method == "POST": form = CustomUserCreationForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.is_active = False # 仮登録 user.save() # メール送信 current_site = get_current_site(request) subject = "Activate Your Account" message = render_to_string("email_verification.html", { "user": user, "domain": current_site.domain, "uid": urlsafe_base64_encode(force_bytes(user.pk)), "token": generate_email_verification_token(user), }) send_mail(subject, message, "no-reply@example.com", [user.email]) return render(request, "email_sent.html") else: form = CustomUserCreationForm() return render(request, "register.html", {"form": form})

2.4 認証リンクのビューを作成

ユーザーがメールのリンクをクリックすると、アカウントが有効化されます。

views.py

python
from django.http import HttpResponse from django.contrib.auth.models import User from .utils import verify_email_token def activate_account(request, uidb64, token): user = verify_email_token(uidb64, token) if user is not None: user.is_active = True user.save() return HttpResponse("Your account has been activated! You can now log in.") else: return HttpResponse("Activation link is invalid!")

2.5 URLの設定

urls.py に登録用と有効化用のURLを追加します。

python
from django.urls import path from .views import register, activate_account urlpatterns = [ path('register/', register, name='register'), path('activate/<str:uidb64>/<str:token>/', activate_account, name='activate'), ]

2.6 認証メールテンプレート

email_verification.html

html
Hi {{ user.username }}, Please click the link below to verify your email address and activate your account: http://{{ domain }}{% url 'activate' uid=uid token=token %} Thank you!

2.7 メール送信設定

settings.py にメール送信設定を追加します。

python
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.example.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your_email@example.com' EMAIL_HOST_PASSWORD = 'your_password' DEFAULT_FROM_EMAIL = 'no-reply@example.com'

3. テストとデバッグ

  1. ローカル環境でテストする場合は、console.EmailBackend を使用すると、メールがコンソールに出力されます。
    python
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
  2. トークン生成やデコードでエラーが出た場合は、例外を確認してください。

4. メリットと応用

  • 安全性向上: メール確認を必須にすることで、無効なユーザー登録を防ぎます。
  • 通知機能と統合: この仕組みを活用して、パスワードリセットや重要な通知機能にも応用できます。

これで、Djangoでメール認証付きユーザー登録を実現できます!不明点や追加のカスタマイズがあれば、教えてください。

2024年12月9日月曜日

Python基礎:エラー処理 (Try Except)

 今回はエラー処理について解説します

エラーは以下の2種類に分けられます。

・構文エラー
・例外エラー


構文エラー

Pythonの文法違反によるエラーで、プログラムの実行ができません。

例: 行末のコロン忘れやインデントの不正。発生すると即停止します。


例外エラー

実行時に発生するエラーで、tryとexceptを使って制御可能です。

適切に処理することでエラーの影響を回避できます。


try exceptの書き方

try: 
    処理1
    処理2
    ~
    
except エラー名:
    エラー発生時の処理
try:
    num = input("数字を入力して下さい")
    
    intData = int( num )    # 整数に変換
    data = 100 / intData    #  割り算します 
    print("結果",data)
 
except ZeroDivisionError:
    print("0で割ることはできません")
    
except ValueError:
    print("値のチェックが必要です(数字でない)")
 
except Exception as e:
    print("その他のエラー", e)


スクリプトの説明


スクリプトを詳しく見てみましょう! 「数字を入力して下さい」を表示して入力要求します、
     整数に変換、
     100で割る、
     最後に結果を表示します。

スクリプトは、入力された数字の割り算を行うというものですが、エラーをつかまえてエラー処理をおこないます。

エラーは、0割りのエラー、数字以外のエラー、その他エラーをprint文で表示しています。

つかまえるにはエラーは、

    except ZeroDivisionError
    eexcept ValueError
    eexcept Exception as e

を使います、最後のException as eの「e」変数にはエラー情報が入っています、文字列型ではないので注意して下さい。(文字列型にするには、str(e)のように文字列型にキャストします)

このコードはPythonでエラー処理を行う方法を示す例です。
コードの概要
tryブロック
    実行したい処理を記述します。ここでは、ユーザー入力を受け取り、
    それを整数に変換して100を割る計算を試みています。
exceptブロック
    特定のエラーが発生した場合に実行される処理を記述します。

処理の流れ
・ユーザーが数字を入力しない場合(例えば文字列を入力)、ValueError が発生し、
    対応するメッセージが表示されます。
・ユーザーが 0 を入力した場合、ZeroDivisionError が発生し、割り算のエラーとしてメッセージを表示します。
・それ以外の予期しないエラーが発生した場合は、Exception によってキャッチされ、
    エラー内容が表示されます。
出力例
    1. 数字を正しく入力した場合
            数字を入力して下さい: 10
            結果 10.0
    2. 0 を入力した場合
            数字を入力して下さい: 0
            0で割ることはできません
    3. 数字以外の文字列を入力した場合
           数字を入力して下さい: abc
            値のチェックが必要です(数字でない)
4. 他のエラーが発生した場合(ほとんどの場合発生しない)
            その他のエラー <エラー内容>
ポイント
    ・エラーを明確に分類して処理することで、ユーザーに適切なフィードバックを提供できます。
    ・Exception as e は、予測できないエラーの詳細を取得するのに役立ちます。



関数(消費税を求める) 関数の書き方と呼び出し方まとめ

関数(消費税を求める)


次のような関数を作成してみます。

「金額と税率を引数として渡し、支払い額と税額をタプルで返却する消費税計算関数を作成します。関数呼び出し後、結果を print 文で表示します。」

コードは次のようになります。

def get_tax( kingaku, rate=0.1 ):
 
  tax = kingaku * rate
  total = kingaku + tax
 
  return total,tax

消費税を計算する関数 get_tax を定義しています。

コード説明

引数
    kingaku: 元の金額(消費税の計算対象)
    rate: 税率(デフォルト値は 0.1 = 10%)

処理
    tax に税額を計算します: kingaku * rate
    total に支払い総額を計算します: kingaku + tax

返却値
    total(支払い総額)と tax(税額)をタプルとして返します










関数の書き方と呼び出し方まとめ

1. 関数の呼び出し方

    関数名を書き、渡したい値(引数)を括弧で囲んで渡します。

        関数名(引数1, 引数2)


2. 関数の作り方

    関数内で実行する機能を決める。

    関数を以下の形式で定義する
     (デフォルト値が設定されている引数は、省略可能)

        def 関数名(引数1, 引数2=デフォルト値, ...):
            # 処理内容
            return 戻り値


3. 関数から値を返す方法
    return を使って複数の値を返すことが可能。
    引数としてリスト型や辞書型を指定する。
    必要に応じてグローバル変数を使用する。

サンプルコード

def 計算関数(数値1, 数値2=10):
    合計 = 数値1 + 数値2
    差 = 数値1 - 数値2
    return 合計, 差

# 呼び出し例
結果 = 計算関数(20)
print(結果)  # 出力: (30, 10)






2024年10月31日木曜日

本作成の為の準備とか、教えて(GPT使用)

本作成の為の準備とか、教えて

学んだこと
マーケティングになるのかもしれませんが、

どのような内容が求められているか確認します。特に評価の高い書籍や評価コメントを見ると、良いアイデアや改善点が見つかるかもしれません。

本の構成(アウトライン)

1.章立て
2.章の構成(節・セクション)のアウトライン
3.リズムを作る(コーヒーブレイク)
4.コードを考える
5.画像を取得






ChatGPT

本作成のための準備として、効果的なステップや方法をいくつかご紹介します。準備段階でのしっかりした計画が、執筆をスムーズに進め、質の高い本を作成する手助けになりますよ。

1. ターゲットの明確化

  • 対象読者を明確にしましょう。技術書であれば、初心者向けか中・上級者向けかで内容や深度が大きく変わります。対象が誰なのかに応じて、用語の選び方や説明の詳細度が決まります。
  • 読者が「何を知りたいのか」を把握するために、アンケートや他の書籍レビューを参考にするのもおすすめです。

2. リサーチと競合分析

  • 類似の書籍や人気の参考書を調べ、どのような内容が求められているか確認します。特に評価の高い書籍や評価コメントを見ると、良いアイデアや改善点が見つかるかもしれません。
  • 自分の本が既存の本とどのように違うかを把握し、ユニークな視点やアプローチを見つけましょう。

3. 構成案の作成

  • アウトラインを作成します。大まかな章立てから始め、各章でどのような内容を含めるかをリスト化しましょう。読者がスムーズに理解できるよう、章の順番や内容の流れも工夫します。
  • 「余談」や「コーヒーブレイク」などの補足情報を入れる場合は、それらをどこに配置するかも検討し、リズムをつけると読みやすくなります。

4. 執筆とリライト

  • 執筆スタイルを自分なりに整えましょう。例えば、技術書であれば簡潔な表現と、読者が理解しやすい例やサンプルコードの挿入が重要です。
  • 文章を書くのが得意でない場合、先にサンプルコードの説明を具体的にまとめ、それをもとに説明文を肉付けしていく方法も効果的です。自然な流れで執筆が進みやすくなります。

5. レビューとフィードバックの取得

  • 自分で見直しを行うだけでなく、他の人に読んでもらうことで、内容が理解しやすいかどうかや誤字・脱字のチェックができます。
  • 可能であれば、技術的な内容についても専門家のフィードバックをもらい、誤りがないか確認します。

6. デザインと出版準備

  • 表紙やレイアウトも本の印象を大きく左右します。技術書の場合、表紙はシンプルでも専門的な雰囲気が伝わるデザインが好まれることが多いです。
  • 出版の形式を決めます。紙媒体にするか、電子書籍にするか、それともオンラインでの配信を検討するかなど、予算とターゲットに合った方法を選びましょう。

7. マーケティングとプロモーション計画

  • SNSやブログでの発信、コミュニティでの共有などで、事前に興味を引き出す活動を行うと、発売後の読者数増加に貢献します。
  • 販売開始後もフィードバックを受け取り、次の本作りや改訂に役立てると良いです。

これらの準備を進めながら執筆することで、スムーズに本作成が進み、完成度の高い内容を提供できます。

2024年6月16日日曜日

Django urls.py 動的URL


 日本では「パラメトリックURL」を「動的URL」や「ダイナミックURL」と呼ぶことが多く、その他にも「変数URL」や「パラメータ付きURL」といった表現が使われます。これらの用語は、URLの一部に動的なパラメータを含めることを指しており、Djangoを使ったウェブアプリケーション開発でも広く使用されます。

2024年2月22日木曜日

ブラウザの拡張機能でPythonコードを実行させる

グーグルクロームが対象ですが…

2024/12 追記








WebにはたくさんのPythonコードがあり、学習や確認に便利です。

しかし実行は面倒です、この機能を使うとすぐに実行(GUI対応)ができます。


インストール方法

・chrome ウェブストアのWebページから「Python Executor」で検索してインストール

・直接リンクしてインストール

https://chromewebstore.google.com/detail/python-executor/ndaaiopboibkjegeeiokjjnjembbidec?utm_source=ext_app_menu


使い方

・先ずはPythonExecutor拡張機能をインストールして、アイコンを表示させる

・実行させたいPythonコードをコピー&ペースのコピーだけする

(コード選択して、右クリックメニューでコピー)

or(コード選択して、コントール+Cを押下)

・アイコンをクリックするとウインドウが表示されて実行

2023年11月19日日曜日

githubめも

GITHUB

要点
・レポジトリの作成
・レポジトリ作成はサーバー側とPC側で必要

・github.comでレポジトリ作成
・サーバー側のリポジトリの作成方法
 (ダッシュボードページの中心にある「Start a new repository for …」を使う)


・giti initでローカルのリポジトリを作成

git init
git add .
git commit -m "初回のコミット"
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git push -u origin main


# 新しいローカルリポジトリを作成
# ファイルを追加
# 変更をコミット(メッセージ必ず指定する)
# リモートリポジトリを追加(自分のID/リポジトリ名)
# 'main' ブランチをリモートリポジトリにプッシュ


git add ファイル名
(git add .)を使てフォルダ全体を対象にする

git commit -m "コメント"
git remote add origin [自分のgitのリポジトリ]

注意点
・git commit -m "コメント"では、コメントを書かないとeditorが立ち上がる
・「git branch -M main」は不要、最近のgitはブランチは「main」になっている
    (ブランチ名を 'master' から 'main' に変更は不要)
・ローカルのデフォルトのブランチ名を確認には「git branch」で確認する。


その他
エラー発生した場合は、削除する
git remote rm origin



2023年10月6日金曜日

Django の基本

 日本語化


作成したプロジェクト内の「settings.py」の次の2箇所を変更する

LANGUAGE_CODE = 'ja' 

TIME_ZONE = 'Asia/Tokyo' 


settings.py


# Internationalizatio
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'



アプリ作成後には、アプリ名(自分の場合は、classApp)を登録


# Application definition

INSTALLED_APPS = [
    'classApp',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]


urls.pyを編集

作成したプロジェクトとアプリ ディレクトリの urls.pyを編集する

アプリ ディレクトリは新規作成します。


path('アプリ名/', include)



from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]


モデルを作成後には(models.pyの編集後)以下を実行!

python manage.py makemigrations アプリ名
python manage.py migrate

アプリ名を間違えたか、「settings.py」のINSTALLED_APPSにアプリ名が追加されていない。

アプリ名を間違えると

python manage.py makemigrations clasApp

No installed app with label 'clasApp'.


正常の場合

python manage.py makemigrations classApp

Migrations for 'classApp':

  classApp\migrations\0001_initial.py

    - Create model MemoModel


再度、実行するとファイル変更されていないので…

python manage.py makemigrations classApp

No changes detected in app 'classApp'


以上で準備が完了!



2023年8月20日日曜日

FlaskでSocket.IOでなくWebSocketを使うには

 ソースだけです


サーバー側

from flask import Flask

from flask_sockets import Sockets

from flask import render_template


from gevent import pywsgi

from geventwebsocket.handler import WebSocketHandler

from werkzeug.routing import Rule



app = Flask(__name__)

sockets = Sockets(app)



# @sockets.route('/c2', websocket= True )

def echo_socket(ws):


    #breakpoint()

    print("kimasita")

    while not ws.closed:

        message = ws.receive()

        if message != None:

            ws.send(message)



sockets.url_map.add(Rule('/c2', endpoint=echo_socket, websocket=True))




@app.route('/')

def hello():

    #return 'Hello World!'

    return render_template("index.html")



if __name__ == "__main__":

    server = pywsgi.WSGIServer(('', 8001), app, handler_class=WebSocketHandler)

    server.serve_forever()


ブラウザ側

<html>

<head>

  <title>gevent websocket test</title>

</head>

<body>

  <h1>test</h1>

  <div>

    <input name="send_input" id="send_input" />

    <input type="button" value="push" onclick="send_data()" />

  </div>

  <div>

    <textarea id="view"></textarea>

  </div>

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

  <script type="text/javascript">

var ws = new WebSocket("ws://ik1-446-55369.vs.sakura.ne.jp:8001/c2");

ws.onmessage = function(e) {

  $("#view").html($("#view").val() + e.data + "\n");

};

function send_data() {

  //ws.send( "abcdefg");

        ws.send($("#send_input").val());

};

</script>

</body>

</html>



2023年2月26日日曜日

HPでソースコードのファイルをクリックして表示

 ホームページディレクトリを作成

その中にソースファイルを複数おいて、クリックして閲覧できるようにする。


HPでは、フォルダにindex.htmlが無いとフォルダのファイル一覧を表示します。

今回は、一覧を見やすく事と、正しくエンコードされて見れることに挑戦しましたよ!


通常は次のように表示されます

Index of ~とか、最後のApache/2.4.7~はいらないし
ParentDirectoryに戻るは、危ないしと色々表示してほしくないものがあります。
ので、それを改善します。









それを次のような表示に改善します!!!










ファルダに「.htaccess」を作成してカスタマイズするとかなり便利なことが判明しました。

設定したファイル内容

removeHandler cgi-script .cgi .pl .py .rb

IndexIgnore .. __* *.html *.txt

HeaderName  ./autoindex_head.html

ReadmeName  ./autoindex_end.txt

IndexOptions SuppressHTMLPreamble

#IndexOptions FancyIndexing HTMLTable

IndexOptions FancyIndexing

IndexOptions NameWidth=*


autoindex_head.html

<html>

<head>

  <title>abcdefg</title>

</head>

<body>

<h1>ファイル一覧</h1>

<p>ファイル内容の表示は、

ファイルをクリックして下さい

</p>

<script></script>


autoindex__end.txt
2023/02 更新



フォルダの内容は次のような感じで、HPで「src」をクリックすると「src」フォルダにはindex.htmlがないのでファイル一覧をApacheは表示してくれますね





.htaccessに次の設定を書くだけでも問題はないけね

このフォルダの上位「/book以下」では、CGIが起動できる設定にしまったので

最初の一行「removeHandler 」は必要になってしまいました。

removeHandler cgi-script .cgi .pl .py .rb

AddCharset UTF-8           .py

IndexIgnore .. __* *.html *.txt




mydbg.pyをクリックすると文字化しなく表示されました






ubuntu CGI でエラーの対応(UnicodeEncodeError:ascii' codec can't encode character)


次のソースコード(UTF-8で保存済み)でエラー発生

#!/usr/bin/python3

print("Content-Type: text/html; charset=utf-8\n")

print("あ")

 

 Traceback (most recent call last):

File "/var/www/~ loginMain2.py", line 68, in <module>

     print("\\u3042")

UnicodeEncodeError: 'ascii' codec can't encode character '\\u3042' in position 0: ordinal not in range(128)



修正方法

# micro   /etc/apache2/apache2.conf


環境変数「LC_CTYPE 」をUTF-8にします。

<Directory /var/www/>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

        SetEnv LC_CTYPE C.UTF-8

</Directory>



解決策まとめ

/etc/apache2/apache2.confファイルに、
SetEnv LC_CTYPE C.UTF-8
を追加します

ubuntu起動方法 version( /etc/issue), service apache2 start

# cat /etc/issue

Ubuntu 14.04.6 LTS

 

# service apache2 stop

 * Stopping web server apache2                                                                                                                                                                                                      

# service apache2 start

 * Starting web server apache2