Tech

WEBソース表示等での文字化け対策を.htaccessに書く

はじめに

WEB環境のファイルの文字コードは、基本的に全てUTF-8で統一している。

テキストファイル、Perl、cgi、Ruby、js、htmlなどシステムファイルのエンコードは基本UTF-8とし、HTMLファイルのメタタグでもUTF-8と宣言している。

結果、システム的には機嫌よく動いているだけれど、プラウザでソース表示やテキストファイルを直接表示させると文字化けしている。

どうやらサーバー環境が関係していると睨んでググってみて、.htaccessとも関係あるらしいことを知った。

文字化け対策としての.htaccess

下記のように対象ファイルの拡張子を羅列しておけばいいみたい。

わたしの場合、perl cgi rubyなどのソースをプラウザで表示させることはありえないので、.js .txt .html を設定しておいた。

.htaccess
AddType "text/html; charset=UTF-8" .html .js .txt

無事解決(^o^)v

ここのサイトが参考になった。

http://www.shtml.jp/htaccess/mojibake.html

macOS SierraでSIPを無効にする方法

Sierraには、SIP(System Integrity Protecton)というセキュリティを強化機能が追加されていて、sudoを使ってもシステム用とされる/usr等のディレクトリに変更を加えられないようになっていて、開発環境の構築になにかと不都合です。

そこでSIPを無効にすることにしました。

1.リカバリーモードで起動する

command + r を押したままMacを起動させます。

2.ターミナルを起動

再起動後いつもとは違う画面となっていますが、ビックリしないでください。

画面上の選択のユーティリティーからターミナルを起動します。

Alt Text

3.SIPコマンドを打ち込む

立ち上げたターミナルに以下を打ち込み、enterを押す。

csrutil disable

Alt Text

上図のように、

Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.

と返ってくれば成功です。Appleメニューから「再起動」を選んで再起動すると,SIPが無効化された状態で起動します。

4.SIPを有効に戻す

SIPが無効の状態で行う必要な作業が終わったら、元に戻しておきましょう。

同じ手順でターミナルを立ち上げて、csrutil enable と打ち込むだけです。

ちなみに私は無効のままにしています。

SierraでIllustrator(CS3~6)のエラーを回避する方法

macOSをSierraにバージョンアップすると、せっかく構築した開発環境にいろいろ障害が出そうなので、ずっとMarvericsで頑張っていましたが、iTunesなどのバージョンアップについていけなくなったので、やむなくSierraに移行しました。

Javaランタイムエラーを回避する方法

Sierraにアップグレードした状態で、Illustrator(CS3~6)を起動させると、次のようなエラーメッセージが出ます。

Alt Text

原因は、Appleが、El Capitan以降でJava 6のサポートを終了する。

とのことで、Sierra(10.12)では、CSシリーズを起動することができなくなったというわけです。

Javaチェックの実態

エラーがでるのは、起動時に以下のJava6の2つのディレクトリの有無をチェックしているからだとのことです。

  • /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
  • /System/Library/Java/Support/Deploy.bundle

ところが実際には、Java6は使っていないそうです。 ということは、Java6の2つのディレクトリさえ存在していれば、実際にJava6がインストールされてなくても、Adobe CSシリーズは動作するということになります。

SierraにJava6のデレクトリを作成する方法

実は、Sieeraの問題点はここからです。

EI Capitan以後に採用された、System Integrity Protection(SIP)による制約のために、管理者権限をもってしても、/System/Library 下に任意のデレクトリを新規作成することができません。

そこで、一時的にSIPを無効にし、当該ディレクトリを作成した後に、再びSIPを有効にする必要があります。

macOS SierraでSIPを無効にする方法

上記によりSIPを無効化して再起動し、改めてターミナルを起動します。ターミナルに以下のように入力して実行します。

sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/Support/Deploy.bundle

非常に長いコマンドなので、右端の、Deploy.bundleまで確実にコピーしてください。

管理者パスワードを要求されるので入力します。

これで、Illustrator/Photoshop が起動できると思います。

Illustrator CS4のプラグイン読み込みエラーを回避する方法

私の場合、Illustrator CS4を起動したところ「プラグインの読み込みエラーです。PhotoshopImport.aip」とでます。

いろいろググって試しましたが解決せず、最終的に下記サイトにある、Yosemite.AICS4.Fix.mpkg.zipをDownloadし、インストールすることで解決しました。

https://github.com/ralvarezt/aics4_yosemite_fix/releases

Yosemite対応のようですが、Sierra でも大丈夫でした。

Perl:文字列前後のスペース&タブを削除

運営している俳句サイトで自動句会システムを作動させている。

ユーザーが自分が詠んだ俳句をテキストフォームを使って投稿するという仕組みなのですが、キーボードからの入力ではなくて、コピー貼付け操作をされる方も多く、意図しないスペースが入ったまま投稿されるケースが多いです。そのままですとシステムが正常に処理できないことがあるので、投稿受付時に不要なスペースやタブを自動的に削除するように対策を施すことにしました。

文字列前後の半角スペース&タブを削除

正規表現を使って文字列$valの末尾の半角スペース&タブを削除するスクリプトは以下の通り。

$val =~ s/\s*(.*?)\s*$/$1/;

テストスクリプトで確認してみましょう。

## 文字列前後のスペース&タブ削除
$val = "This is a pen.     ";
$val =~ s/\s*(.*?)\s*$/$1/;
print $val;

文字列前後の全角スペースを削除

全角スペースの削除は、少しやっかいです。使用する文字コードによって異なるからです。

$val =~ s/\x81\x40//g;  SJIS
$val =~ s/\xa1\xa1//g;  EUC
$val =~ s/\xE3\x80\x80//g;  utf-8

UpFtpをMacとLinuxとで共用する方法

UpFtpと言うのは、結城浩さんの作られたMakeWebと併せて使うためのFTP自動化ツールのことです。

  • Makeweb:テキストをXHTMLに変換するPerlスクリプト
  • UpFtp:ホームページ更新用Perlスクリプト

これらのツールを使えば、MakeWeb記法(Markdown記法のような書式)で書いた、index.txtをMakeWebでコンパイルしてindex.htmlを生成させ、UpFtpでサーバーに送って更新する…という手順を下記のように makefileに書き、make -k するだけで自動処理されます。

makefile

target = index.html
a.out:all
all: $(target)

.SUFFIXES: .txt .html
.txt.html:
	perl ~/Dropbox/Web/GH/mw/makeweb.pl $< $@ # index.txt to index.html
	perl ~/Dropbox/Web/GH/upftp/upftp.pl 

異なる環境でデータを共有するのはDropboxが便利

Dropboxは、Windows/Linux/macOSとマルチ環境で使えるので、WEB構築の元データを複数端末で共有するのには一番適している。同期速度などの点でも他のクラウドと比較して一番早い。

ぼくの場合は、どの環境もユーザーフォルダの直下にDropboxをインストールしているので、以下のようPATH構成になる。

  • Windows C:\Users/minoru/Dropbox
  • Lnux /home/minoru/Dropbox
  • Mac /Users/minoru/Dropbox

Makefileの場合は、~/Dropboxと書くことで認識してくれるので容易に共用設定が書けるが、UpFtpの設定ファイルの場合は、以下のようにフルパスを書く必要があるので工夫が必要となる。

# Local root directory (in fullpath)
my $localrootdir = "";
# File list (in fullpath)
my $filelist = "";

ユーザフォルダーを変数で取得

フルパスを直書きするとマルチ環境で共用できないので、変数を取得してそれを共通で使えるようにします。

Mac/Linuxの場合

MacもLinuxも同じUNIXなので以下の方法でユーザーフォルダのPATHを取得できる。

$home = $ENV{"HOME"}
$home = %USERPROFILE%

Mac/Linux共用の設定

私の場合は、以下のように書くことでうまく動いている。

# Get HOME directory from environment variables
my $home = $ENV{"HOME"};
# Local root directory (in fullpath)
my $localrootdir = "$home/Dropbox/Web/GH";
# File list (in fullpath)
my $filelist = "$home/Dropbox/Web/GH/upftp/filelist.txt";

Windows/Mac(Linux)共用の設定

ここからは確認できていないので無責任になるけれども、OSを判別する特殊変数を使って分岐させる必要がある。