ぷちWiki - Lightly and Leniently
https://koumei2.com/wiki/index.html
2024-11-21T17:57:34+09:00
ja
雑多なメモです
-
改行コードの確認
https://koumei2.com/wiki/1755.html
2019-04-26T15:37:00+09:00
ぷちWiki
改行コードは特に混在している時に面倒くさいことになるので、下記で確認するのが今のところ確実ではないかと。
% od -c filename
ファイルの内容が、\r \n のような printable な形で表示されます。
-
Docker Compose での Web/DB 環境構築例
https://koumei2.com/wiki/1760.html
2019-04-25T11:32:54+09:00
ぷちWiki
!!!概要
[[Docker Compose]] を使って、Web+DB の環境を作成する例です。
Web サーバは CentOS7、DB は MySQL を使うことにします。
確認用の Web アプリとして WordPress を使ってみます。
当然、[[Docker Compose]] 環境がつかえる状態になっていることが前提です。
ちなみに、WordPress であれば、WordPress 用の Docker イメージがありますし、PHP が動く Web サーバであれば PHP 用の Docker イメージにでいろいろあります。
Web サーバは今回はあえていろいろ出来そうな CentOS7 のイメージをチョイスしましたが、アプリケーションの構成によってはイメージを細分化した方が良いかもしれないし、それに適したイメージがあると思います。
Docker Hub を探してみるといろいろなイメージがあるので、一度探してみるとおもしろいです。
!!!設定
まず、今回の Docker Compose で構築する環境用のディレクトリを用意します。
以降は、そのディレクトリ以下で作業を行います。
Docker Compose の設定ファイルは docker-compose.yml ですので、まずはこのファイルを作成します。
{{{
version: '3.7'
services:
mysql:
container_name: memo_mysql
build: ./mysql
image: memo_mysql
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
MYSQL_ROOT_PASSWORD: rootpass
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
apache:
container_name: memo_apache
build: ./apache
image: memo_apache
restart: always
ports:
- "8080:80"
volumes:
- ./html:/var/www/html
- /sys/fs/cgroup:/sys/fs/cgroup:ro
depends_on:
- mysql
# privileged: true
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
}}}
以下、簡単に説明していきます。
ファイル形式にはバージョンがあります。
https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix
これに従って、バージョンを設定します。
version: '3.7'
次に、services: 以降にコンテナとなるサービス設定を記載していきます。
今回は、DB 用に "mysql", Web 用に "apache" の2つのサービスを記載しています。
DB の設定は、[[Docker Compose で MySQLを構築]] とほぼ同等なのでこちらを参照。
!!Web の設定
以下、"apache" に属する設定です。
mysql とかぶる部分は省略します。
build: ./apache
Web 用のイメージは apache/Dockerfile でビルドします。
長くなるので後述します。
ports:
- "8080:80"
Web サーバは外部から参照させたいのでポートフォワードします。
この場合、ホストの 8080 番をコンテナの 80 番にポートフォワードします。
volumes:
- ./html:/var/www/html
- /sys/fs/cgroup:/sys/fs/cgroup:ro
ボリュームを設定します。
html/ はコンテナの DocumentRoot に mount します。
これにより、DocumentRoot はホスト上で更新可能となり、コンテナが削除されてもファイルは残るようになります。
depends_on:
- mysql
依存関係を設定します。
Webサーバから mysql を参照するので記載します。
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
Apache, Postfix を起動するための設定。
詳細は、[[DockerコンテナのCentOS7上でsystemctlを使う]] どうぞ。
!!CentOS7のDockerファイル
前項で省いた apache/Dockerfile についてです。
{{{
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
RUN unlink /etc/localtime
RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime
RUN yum update -y \
&& yum -y install postfix httpd epel-release \
&& rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
&& yum -y install php73-php php73-php-mysqlnd lv
RUN systemctl enable httpd.service
RUN systemctl enable postfix.service
COPY httpd/httpd.conf /etc/httpd/conf/httpd.conf
COPY postfix/main.cf /etc/postfix/main.cf
#COPY conf/php.ini-production "$PHP_INI_DIR/php.ini"
EXPOSE 80
CMD ["/usr/sbin/init"]
}}}
以下、説明です。
まず、CentOS7 のイメージは下記のものを使用しました。
https://hub.docker.com/_/centos
上記ページの "Dockerfile for systemd base image" に下記の記載があるので、そのまま流用。
{{{
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
}}}
次にタイムゾーンと LANG の設定。
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
RUN unlink /etc/localtime
RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime
とりあえず yum update しつつ、必要なパッケージをインストール。
用途的に httpd, php は必須。sendmail コマンドでメール送信したいので Postfix も入れました。
また、個人的に lv を使いたいのでついでにインストール。
PHP はせっかくなので 7.3 をチョイス。
EPEL と REMI リポジトリが必要なので、これらも追加します。
RUN yum update -y \
&& yum -y install postfix httpd epel-release \
&& rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
&& yum -y install php73-php php73-php-mysqlnd lv
自動起動設定します。
RUN systemctl enable httpd.service
RUN systemctl enable postfix.service
Apache と Postfix の設定ファイルをホストからコピーします。
この辺はボリュームで永続化しても良いですが、ほぼ変更することは無さそうであればイメージに含めてしまってよいと思います。
必要であれば PHP の設定も同様に。
COPY httpd/httpd.conf /etc/httpd/conf/httpd.conf
COPY postfix/main.cf /etc/postfix/main.cf
必要かどうか検証していませんが、https://hub.docker.com/_/centos にも記載があったのでなんとなく追加。
EXPOSE 80
!!!WordPress インストール
通常のサーバと同じです。
html/ を DocumentRoot としましたので、html/ に [[WordPress]] をインストールします。
!!!コンテナ起動
すべて設定が終わったらコンテナを起動します。
% docker-compose up -d
もし、とりあえずビルド(イメージ作成)だけしたい場合には、下記です。
% docker-compose build
すべて正しく設定できていれば、ホストの 8080 番を参照すると、WordPress のインストール画面が表示されるはずです。
-
Docker Compose での Web/DB 環境構築例(PHPイメージ使用パターン)
https://koumei2.com/wiki/1764.html
2019-04-25T11:29:18+09:00
ぷちWiki
!!!概要
[[Docker Compose]] を使って、Web+DB の環境を作成する例です。
Web サーバは、DockerHub の PHP イメージ (https://hub.docker.com/_/php/)、 DB は MySQL を使います。
結局ボツにしたのですが、せっかくなので構築したところまでをメモにしておきます。
最後まで構築したパターンは PHPイメージではなく CentOS7イメージを使用しましたのでご参考まで。
[[Docker Compose での Web/DB 環境構築例]]
!!!設定
下記は、docker-compose.yml の Web サーバ部分です。
内容については、[[Docker Compose での Web/DB 環境構築例]] とかぶるので省略。
apache-php:
container_name: memo_apache_php
build: ./apache-php
image: memo_apache_php
restart: always
ports:
- "8080:80"
volumes:
- ./html:/var/www/html
depends_on:
- mysql
DB は、[[Docker Compose で MySQLを構築]] とほぼ同じ。
下記は、apache-php/Dockerfile の内容です。
{{{
FROM php:7.3-apache
RUN apt-get update \
&& apt-get upgrade -y sendmail \
&& a2enmod rewrite \
&& docker-php-ext-install pdo_mysql mysqli mbstring
COPY conf/php.ini-production "$PHP_INI_DIR/php.ini"
COPY mail_config.sh /tmp
RUN chmod +x /tmp/mail_config.sh
CMD /tmp/mail_config.sh && apache2-foreground
}}}
以下、解説です。
FROM php:7.3-apache
PHP7.3 が使いたかったのでこうしました。
Apache をチョイスしましたが、Apache 以外の Web サーバもあるので、好みの構成をチョイスできます。
RUN apt-get update \
&& apt-get upgrade -y sendmail \
&& a2enmod rewrite \
&& docker-php-ext-install pdo_mysql mysqli mbstring
まず、パッケージのアップデートを行います。
メール送信したいので、sendmail をインストールします。
mod_rewrite を使いたいため、a2enmod rewrite を実行します。Debian 系ではこうやるらしい。。。
docker-php-ext-install を使って、必要な PHP モジュールをインストールしています。
COPY conf/php.ini-production "$PHP_INI_DIR/php.ini"
PHP の設定ファイルをイメージに配置します。
conf/php.ini-production をあらかじめ作成しておく必要があります。
ひな形は、https://hub.docker.com/_/php/ に development と production のパターンが置いてあるので使うことができます。
COPY mail_config.sh /tmp
RUN chmod +x /tmp/mail_config.sh
CMD /tmp/mail_config.sh && apache2-foreground
sendmail の設定です。
下記のような mail_config.sh を作成し、イメージ作成時に実行します。
mail_config.sh は https://qiita.com/toshi-click/items/196781f4cd163ec83a94 を参考にしました。
{{{
#!/bin/sh
host=$(hostname)
line=$(cat /etc/hosts |grep [1]27.0.0.1)
echo "$line localhost localhost.localdomain $host" >> /etc/hosts
echo "$host" >> /etc/mail/relay-domains
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sendmail -bd
}}}
最後は、apache2-foreground を実行して終わるようにします。
!!!ボツにした理由
ボツにした理由は、、、、DockerHub の PHP イメージは Debian をベースにして作られており、カスタマイズする際に Debian の知識が必要だったためです。
自分は Debian はあまり使ってこなかったので(/_\*)
WordPress を単に動かすだけならこれで十分だったのですが、その他いろいろとカスタマイズしようとすると、Debian の知識が必要になってきてしまって面倒なので、CentOS7 で作り直しました(/_\*)
ちなみに、DockerHub の PHP イメージの中では CentOS 系のものは無さそうだったのと、公式イメージ以外で良さげな PHP イメージを探してみたのですがなかなか見つからず、探すのに時間がかかるくらいならいっそのこと CentOS7 のイメージでいいじゃないか、、、、ということで構築したのが下記になります(^_^;)
[[Docker Compose での Web/DB 環境構築例]]
-
Dockerでよく使うコマンド
https://koumei2.com/wiki/1763.html
2019-04-24T17:53:16+09:00
ぷちWiki
イメージ一覧
% docker images
コンテナ一覧
% docker ps -a
コンテナ削除
% docker rm xxx
イメージ削除
% docker rmi xxx
起動してないコンテナをすべて削除
% docker container prune
使われていないボリュームをすべて削除
% docker volume prune
使われていないイメージをすべて削除する
% docker image prune
ホスト/コンテナ間でコピー
% docker cp xxx yyy:/tmp
コンテナ稼働状況
% docker stats
-
DockerコンテナのCentOS7上でsystemctlを使う
https://koumei2.com/wiki/1762.html
2019-04-24T17:37:27+09:00
ぷちWiki
!!!概要
Docker で CentOS7 のコンテナを作成します。
そのコンテナ上で、systemctl を使うと以下のようなエラーが出ます。
Failed to get D-Bus connection: Operation not permitted
この問題の回避策を紹介します。
!!!privilegedオプション
docker run 時に --privileged を指定すると、上記の Operation not permitted が解消されます。
[[Docker Compose]] 的には、下記のように指定します。
privileged: true
しかし、privileged は名前からすると特権モード的なものだと思うので、少々セキュリティ的に気持ち悪いですね。。。
!!!privilegedオプションを使わない
上記のように privileged は使用を推奨されてない風に見えます。
privileged を使わない場合には、--cap-add sys_admin と --security-opt seccomp:unconfined を指定することで問題が解消できるようです。
[[Docker Compose]] 的には、下記のように指定します。
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
ちなみに、 https://qiita.com/shusugmt/items/92ece6874ba5aeff2b41 に古い情報ながら詳しい情報があります。
これによると、必ずしも双方を指定する必要は無いようなのですが、自分はきちんと検証できていないので cap_add と security_opt の双方をおまじないのように指定しています(/_\*)
-
Docker Compose で MySQLを構築
https://koumei2.com/wiki/1761.html
2019-04-23T22:32:48+09:00
ぷちWiki
!!!概要
[[Docker Compose]] で MySQL 環境を構築します。
MySQL 単体なのに Docker Compose を使用するのは、MySQL は最終的に他のコンテナと組み合わせることが多いためです。
組み合わせる例は、[[Docker Compose での Web/DB 環境構築例]]をどうぞ。
!!!docker-compose.yml
まずは MySQL を構築する際の docker-compose.yml の例です。
{{{
version: '3.7'
services:
mysql:
container_name: test_mysql
build: ./mysql
image: test_mysql
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
MYSQL_ROOT_PASSWORD: rootpass
# ports:
# - "3306:3306"
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
# - ./mysql/log:/var/log/mysql
}}}
以下、1つずつ内容を記載します。
コンテナ名を付けます。
container_name: test_mysql
mysql/Dockerfile でビルド方法を記載します。
build: ./mysql
今回は特に記載することが無かったので、mysql/Dockerfile は下記の内容のみです。
FROM mysql:5.7
イメージ名を付けます。
image: test_mysql
常にコンテナを自動的に再起動します。
restart: always
MySQL 用の変数を設定します。
下記は WordPress の例です。
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
MYSQL_ROOT_PASSWORD: rootpass
ports 設定は、ホストのポートをコンテナのポートへフォワードする設定です。
しかし、自分は MySQLではあえてフォワードする意味が無いと考えますので設定しません。
後述しますが、一通りの操作はポートフォワードを設定しなくても可能です。
ポートフォワードはセキュリティに影響するので、可能な限り設定しない方が無難です。
# ports:
# - "3306:3306"
volumes は、ボリュームの設定です。
記載したホスト上の path をコンテナ上に mount するようなイメージになります。
コンテナはそのままではデータを保持できないので、データを保持したい(永続化)用途でよく使われます。
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
# - ./mysql/log:/var/log/mysql
上記の1つ目は mysql/conf.d のボリュームを作成することにより、ホスト側で MySQL の設定を変更することを可能とし、コンテナを再作成してもその設定を保持することを可能としています。
ちなみに、以下のような my.cnf を置いています。
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
適宜 slow query log などの設定を追加します。
その下の mysql/data は MySQL データの永続化のためのボリューム設定です。
さらにその下の mysql/log は、ログをホスト側に出力するための設定です。
ログを保存したい場合など、必要であれば設定するのも良いでしょう。
!!!コンテナ起動
下記でビルド&実行できます。
% docker-compose up -d
正常に実行できれば MySQL として使用できます。
今回は単体なので何の役にも立ちませんが(^_^;)
!!!MySQL へのアクセス
実行後、下記のように [[mysql_config_editor]] で接続情報を設定しておくと便利かもしれません。
ちなみに、本当はイメージのビルド時かコンテナ作成時に吸収させたかったのですが、うまくいきませんでした(/_\*)
ご存知の方情報ください(/_\*)
% docker exec -it test_mysql mysql_config_editor set -u root -p
Enter password:
% docker exec -it test_mysql mysql_config_editor set --login-path=mysqldump -u root -p
Enter password:
コマンドラインで MySQL にアクセスしたい場合には、下記のように bash でコンテナにアクセスします。
% docker exec -it memo_mysql bash
コンテナにアクセス後は、普通に mysql コマンドで接続できます。
!!mysqldump
以下のような感じで MySQL コンテナのデータをダンプすることができます。
% docker exec -it test_mysql mysqldump --all-databases > xxxx.dmp
なお、バッチ処理でよくやる -p でパスワードも併せて指定した場合は、[[mysql_config_editor]] で mysqldump 時の接続情報を設定しておかないと、下記の Warning も一緒に出力されるので注意が必要です。
Warning: Using a password on the command line interface can be insecure.
!!インポート
以下でインポート可能です。
% docker exec -i test_mysql mysql < xxxx.dmp
-
MacOS High Sierra でスペルチェックを無効にする
https://koumei2.com/wiki/1759.html
2019-04-23T19:39:56+09:00
ぷちWiki
現在検証中
-
MacOS High Sierra の日本語入力をATOK風キーバインドにする
https://koumei2.com/wiki/1758.html
2019-04-23T13:54:12+09:00
ぷちWiki
!!!概要
High Sierra の日本語入力のキーバインドを ATOK 風にします。
ATOK に慣れていた人にはとても便利に使えると思います。
!!!設定方法
http://poly-tan.com/672/ をどうぞw
[[システム整合性保護(System Integrity Protection: SIP)]] をいったん解除する必要がありますのでご注意ください。
以下の内容は完全に個人的な備忘録に過ぎないので、上記サイトを参照することをおすすめします。
まず、 「システム環境設定」→「キーボード」→「入力ソース」の 「Windows風のキー操作」のチェックを外します。
次に、SIP を無効化します。[[システム整合性保護(System Integrity Protection: SIP)]] 参照。
SIP 無効化後に通常起動し、KeySetting_Windows.plist を差し替えます。
差し替え用の KeySetting_Windows.plist は上記サイトにあるのでダウンロードしておきます。
KeySetting_Windows.plist の場所は、/System/Library/Input\ Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/Resources です。
上書きしてしまうと元に戻せないので、元のファイルは適当な名前にリネームして保存しておいた方が良いです。
ここまでで SIP が影響する操作は完了しているので、SIP を再び有効化します。[[システム整合性保護(System Integrity Protection: SIP)]] 参照。
通常起動後,「システム環境設定」→「キーボード」→「入力ソース」を開いて、「Windows風のキー操作」にチェックを入れます。
-
システム整合性保護(System Integrity Protection: SIP)
https://koumei2.com/wiki/1757.html
2019-04-23T13:44:50+09:00
ぷちWiki
!!!概要
MacOS では El Capitan あたりから? 通称 SIP と呼ばれる機能が追加になりました。
この機能の詳細は把握していないのですが、この機能により一部のディレクトリは root 権限をもってしても更新することができなくなっており、これによりセキュリティは強化されたのですが必要なカスタマイズも出来なくなってしまうという問題が起きています。
この問題の対応策としては、一時的に SIP を無効とし、設定変更後に再び SIP を有効とするというフローが正しいようです。
!!!設定方法
SIP の有効/無効はリカバリモードで設定することができます。
リカバリーモードは、起動時に「コマンドキー」「Rキー」を同時に押すことにより入ることができます。
SIP の設定はリカバリーモードでターミナルを実行し、下記のように設定します。
SIP 無効
# csrutil disable
SIP 有効
# csrutil enable
設定後はメニューから再起動すればそれぞれ設定が反映されます。
-
lv
https://koumei2.com/wiki/99.html
2019-04-22T21:15:26+09:00
ぷちWiki
!!!lvとは
lvはUTF対応のページャーです。
UTF-8を採用するOSが多い昨今では大変重宝します。
しかしながら、CentOS-5.x では lv はデフォルトでインストールされていたのですが、6 以降は却下されたのか??含まれていません。
lv に慣れてしまった身としては、非常に耐え難いものがあります。
!!!インストール
CentOS7 であれば、[[EPELリポジトリ]]を有効にして yum install lv でインストール可能です。
以下、古い情報。
!!ビルドする場合
lv-4.51の例です。
まず、[LV Homepage|http://www.ff.iij4u.or.jp/~nrt/lv/]からアーカイブを取得して展開し、buildディレクトリに移動します。
% gzip -dc lv451.tar.gz | tar xvf -
% cd lv451/build
後は以下の通り。
% ../src/configure
% make
% su
# make install
!!CentOS-6.x へのインストール
上記のようにビルドしてインストールしても良いのですが、CentOS-6 では [[RPMforge]] にて、lv のパッケージが公開されているので、これを使うのが簡単です。
依存関係に問題がなければ、[[RPMforge]] を使用できるように設定して、 yum install lv でOKです。
!!!設定
特に設定しなくても使えますが、デフォルト設定を設定したい場合には $HOME/.lv ファイルに設定を記述することにより、設定可能です。
例えば、デフォルトの表示する coding-system を UTF8 にしたい場合には、以下のように .lv に記述します。
-Ou8
なお、.lv ファイルではなく、環境変数 LV に設定することにより、同じように設定可能です。
setenv LV -Ou8
ちなみに設定は以下の順に評価され、上書きされます。
※つまり、下に行くほど設定の優先度は高い。
*$HOME/.lv
*環境変数 LV
*コマンドラインオプション
-
mysql_config_editor
https://koumei2.com/wiki/1749.html
2019-04-19T20:25:13+09:00
ぷちWiki
!!!概要
mysql_config_editor を使うと、mysql への接続情報を暗号化して保存することができます。
保存先のファイルは ~/.mylogin.cnf です。
なお、mysql_config_editor は MySQL-5.6.6 で対応したため、それ以前のバージョンでは存在しないようです。
mysql_config_editor で保存した接続情報は、mysql コマンドから参照することができます。
つまり、mysql コマンドで毎回接続情報を入力する必要が無くなります。
これだけであれば、例えば alias を設定したり、シェルスクリプト的なものを作ったりで対応した入力の簡略化と大差ないのですが、接続情報が暗号化されていることが大きなメリットとなります。
!!!使い方
まず、認証情報を登録します。
% mysql_config_editor set -G test -h testhost -u testuser -p
Enter password:
-G の後の "test" は、mysql コマンドで指定するための login path 名です。
-h, -u, -p は mysql コマンドと同様です。
登録された認証情報を確認する際には以下のようにします。
% mysql_config_editor print --all
すると、例えば以下のように表示されます。
[test]
user = testuser
password = *****
host = testhost
削除は以下。
% mysql_config_editor remove --login-path=test
実際に mysql コマンドで使用する際には以下のように指定します。
% mysql --login-path=test
!!mysqldump に対応させる
mysqldump には --login-path オプションが無いようなので、下記のように設定して対応させます。
% mysql_config_editor set --login-path=mysqldump -u root -p
-
Docker Compose
https://koumei2.com/wiki/1756.html
2019-04-17T19:37:07+09:00
ぷちWiki
Docker は水平展開することを考えるため、通常は単一のアプリケーションをコンテナ化します。
従って、複数のアプリケーションを使用するサービスの場合には、複数のコンテナを用意します。
コンテナが複数になると、それぞれの関係性をコンテナの起動時にいちいち指定し、その依存関係の順序に従って起動する必要があるので、非常に面倒で複雑になります。
こういった問題は、Docker Compose を使うことにより緩和されます。
Docker Compose を使うと複数のコンテナの設定をまとめて記述し、実行することが可能となります。
!!!インストール
以下、Linux上へのインストール例です。
基本的には下記のとおりです。
https://docs.docker.com/compose/install/
2019年4月現在では、下記のように記載されているので、そのままコピペして実行します。
下記の "1.24.0" の部分がバージョンにより変わりますので、インストールする際には上記の URL を参照した方が良いです。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
実行権限を付けます。
$ sudo chmod +x /usr/local/bin/docker-compose
念のため確認。
% docker-compose --version
docker-compose version 1.24.0, build 0aa59064
-
JavaScript の Console 技
https://koumei2.com/wiki/1754.html
2019-04-17T15:27:07+09:00
ぷちWiki
こちらのページを読んで面白かったので、主要な部分だけメモ。
https://qiita.com/koinori/items/83f119cb2d82c0ca2c1e
大元はここかな?
https://developer.mozilla.org/en-US/docs/Web/API/Console
以降、Chrome のコンソールによる検証結果です。
他のブラウザは未検証。
フォーマット付き表示
console.log("t_obj = %o", t_obj);
console.log("t_str = %s", t_str);
console.log("t_int = %d", t_int);
console.log("t_float = %f", t_float);
グループ表示(ネストも可能)
console.group();
console.groupEnd();
時間表示。これは便利ですね!
console.time();
console.timeLog();
console.timeEnd();
カウンタ。引数に識別子を指定できるなので何種類ものカウンタを表示可能
console.count();
console.countReset();
それ以外にもいろいろとあるようですが、自分的に使わなそうなので省略(/_\*)
興味のある方は元ネタをどうぞ。
!!!まとめ
{{{
&lt;script>
t_obj = { val1: 'test1',
val2: 'test2',
val3: 'test3'
};
t_int = 1000;
t_str = 'test_string';
t_float = 3.14159265;
console.group();
console.log("t_obj = %o", t_obj);
console.log("t_str = %s", t_str);
console.group();
console.log("t_int = %d", t_int);
console.log("t_float = %f", t_float);
console.groupEnd();
console.groupEnd();
console.group();
console.time();
console.timeLog();
console.timeLog();
console.timeLog();
console.timeLog();
console.timeLog();
console.timeEnd();
console.groupEnd();
console.group();
console.count();
console.count();
console.countReset();
console.count();
console.count('test1');
console.count('test1');
console.count('test1');
console.count();
console.groupEnd();
&lt;/script>
}}}
結果
{{img /image/js_console01.png}}
-
Windows 上でのDockerのインストール
https://koumei2.com/wiki/1752.html
2019-04-15T17:53:19+09:00
ぷちWiki
!!!概要
Windows 上で Docker を使いたい場合、メジャーな方法としては下記の3パターンがあるようです。
!!Docker for Windows
名前的に一番良さそう(笑)ですが、Hyper-V を使うため、現状だと Windows10 Pro 以上でないと使えないようです。
また、メジャーな仮想化ソフト VirtualBox との同時使用が出来ない(割と最近できるようになったというウワサもあるが未確認)という欠点もあるようです。
!!Docker Toolbox
Windows10 Home など、Docker for Windows がつかえないユーザー向けのラインナップのようです。
仕掛け的には、Docker Toolbox には VirtualBox が含まれており、そこで Docker 用の Linux 仮想マシンを動かして Docker 機能を実現しています。
!!VirtualBox で Docker 用仮想マシンを動かす
基本的には、Docker Toolbox と同じことですが、それを手動で行う方法です。
VirtualBox 上に何らかの Linux 仮想サーバを構築し、その上で Docker を使います。
前述2つのパッケージに含まれている GUI 等の機能が不要であれば、これが一番確実ではないかと。
ということで、私は一番最後のパターンを採用してみました。
[[Vagrant]] を使えば仮想マシンの作成は簡単ですし。
つまり、実質、Linux 上での Docker のインストールとなります(^_^;)
!!!Dockerのインストール
上記の通り、Linux の仮想マシンをまず用意します。
あとは、Linux への Docker のインストール方法と同様です。
Linux への Docker のインストールは https://docs.docker.com/install/linux/docker-ce/ に情報があります。
CentOS であれば、https://docs.docker.com/install/linux/docker-ce/centos/ ですね。
ちなみに、http://docs.docker.jp/linux/step_one.html にインストールについて最初に読むべき日本語のページがありますので、興味のある方はどうぞ。
基本的には、yum 等のパッケージ管理経由でインストールすることが推奨されていますが、簡単さを重視したい人向けに https://get.docker.com/ でインストールする方法も上記に記載があります。
私は CentOS7 にしてみたので、これ以降は、CentOS7 の仮想マシン上での例になります。
まず、Dockerがすでにインストールされているようであれば削除します。
# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
次に、必要なパッケージをインストールします。
# yum install -y yum-utils device-mapper-persistent-data lvm2
※ちなみに、私が使った CentOS7 では既にインストール済みでした
次に、Dockerインストールで使用するリポジトリを追加します。
# yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
Dockerパッケージをインストールします。
以前は docker-ce だけだったようですが、現在は3つに分割されたようです。
# yum install docker-ce docker-ce-cli containerd.io
正常に完了したら起動してみましょう。
# systemctl start docker
動作確認も用意されています。
# docker run hello-world
必要であれば、自動起動設定をしておきましょう。
# systemctl enable docker
この状態だと、docker 操作は root 権限が必要になってしまいます。
docker を使いたいユーザーを docker グループに所属させておけばそのユーザーで docker が操作できるので所属させておきましょう。
この場合は、vagrant ユーザーをグループに追加しておけば便利ですね。
# usermod -aG docker vagrant
-
特定の条件のファイルを一括で移動(コピー)する
https://koumei2.com/wiki/1753.html
2019-04-15T16:13:05+09:00
ぷちWiki
微妙に細かい点が出てこなくて手間取ったりするので、念のためメモ。
例えば、数字からなる HTML ファイルでそこそこ更新時刻が古い(下記の +100 の部分ねw)ファイルを一括で指定したディレクトリへ移動する例。
# find . -name '[0-9]*.html' -mtime +100 | xargs -I {} mv -i {} /path_to_anyware
xargs -I がミソ。
この -I をいつも忘れて調べるハメに(/_\*)
-
Simplenote
https://koumei2.com/wiki/1744.html
2019-04-15T12:57:11+09:00
ぷちWiki
Simplenote は、マルチデバイス対応のテキストエディタです。
公式サイトはこちら。[Simplenote|https://simplenote.com/]
ダウンロード/インストールも上記からできます。
クラウドを使ったメモなので、使用するためには上記サイトでアカウントを登録する必要があります。
!!!特徴
自分の考える Simplenote の特徴は以下です。
*実体はクラウド上に保存されるので、各デバイスで情報を共有可能
*各デバイスへの情報の同期が非常に高速
*エディタとしての機能は非常にシンプル。テキストしか対応していない
*デバイスは Windows, Mac, Linux, iOS, Android に対応。Web ベースでも使用可能
*メモを共有することができる
*無料
*コードが公開されている
つまり、簡単なメモを複数のデバイスで共有したいという用途では非常に重宝します。
「簡単なメモ」と書きましたが、以下のようなことは可能です。
*メモにタグをつけることができ、タグごとのメモ一覧を表示可能
*フリーワード検索
*簡単な履歴機能
*Markdown表示
!!!他のサービスとの比較
同類の有名どころのソフトウェアとしては Evernote や OneNote がありますが、これらは Simplenote と比べると、重くて低速だが高機能なソフトウェアとなります。
一長一短がありますのでどれを選択するのかは用途によりますが、下記のような用途であれば Simplenote をおすすめします。
*Office系のファイル、画像、PDF などはメモの対象外でも構わない
*3つ以上のデバイスで情報を共有したい(3つ以上のデバイスだと Evernoteは有料)
*同期速度を重視する
*検索は簡易検索で良いが正確性は重要(OneNoteは自分が使った限りでは検索性能は最悪)
・軽い
*可能であれば改造なりカスタマイズしたい
!!!注意点
Simplenote はデータ消失することが稀にあるようで、Web で情報を集めてみるとチラホラ見当たります。
従って、クラウドの方でバックアップは取られているといったような甘い考えは捨てて、確実に自分でバックアップを取ることをオススメします。
[[Simplenoteのデータのバックアップ]]参照。
!!!API
非公式だと思われますが、PythonによるAPIが公開されています。
[[SimplenoteのAPI]] を参照。
なお、Web 上で探すと WebService::Simplenote のような Perl API 等々も見つかります。
https://metacpan.org/source/IOANR/WebService-Simplenote-0.2.1/eg/simplenote.pl
しかし、https://simplenote.com/developers/ によると、2018 年 10 月にこの API は廃止されてしまい、現状では API と呼ばれているものは公式には用意されていないようです。
その代わりと言っては何ですが、ソースが公開されているので、ソースを解析して API のようなものを作成することはできそうですね。
-
Vagrantによる開発環境の作成メモ
https://koumei2.com/wiki/1751.html
2019-04-12T18:39:02+09:00
ぷちWiki
完全に自分用のメモですが、せっかくなので公開しておきます。
!!!仮想マシン構築
仮想マシンに ssh ログインできるところまで、[[Vagrant]] の内容を実施。
!!!Ansibleインストール
Ansible をインストールするが、OS により異なる。
amazonlinux2
# amazon-linux-extras install ansible2
amazonlinux
# yum --enablerepo=epel install ansible
CentOS7
# yum install ansible
CentOS6
[[EPELリポジトリ]] を使えるようにした後、下記を実行。
# yum install ansible
!!!Ansible 実行
Git が入っていなければ Git をインストール。
# yum install git
Git に使う秘密鍵を設置。~/.ssh/id_rsa など。
プレイブックを取得。
% git clone ssh://xxxx@yyyy/project/git/ansible.git
プレイブックを実行。
% cd ansible
% ansible-playbook -i XXX site.yml
!!!開発物のバージョン管理
開発対象のファイルを取得して設置。
その対象を Git で管理する。
% cd /path_to_anyware
% git init
% git add .
% git commit -m "first"
% git remote add origin ssh://xxx@yyyy/zzzz.git
% git push origin master
-
Vagrant
https://koumei2.com/wiki/1750.html
2019-04-12T15:26:11+09:00
ぷちWiki
!!!概要
Vagrant は VirtualBox 等の仮想化ソフトの使用を簡略化してくれるアプリケーションです。
通常、仮想化ソフトで仮想環境を構築する際には、仮想イメージを探してダウンロードし、それを使用して仮想環境を構築します。
その後、ネットワーク設定等各種設定を行うわけですが、これがなかなか面倒だったりします。
Vagrant を使用するとこの辺の煩雑な操作をとても簡略化でき、仮想環境が超簡単に作れると言っても過言ではありません。
注意点としては、Vagrant 自体には仮想化機能は備わっていませんので、あくまでも仮想化ソフトの支援ツールという位置づけになります。
なお、仮想化ソフトは一般的に、Inte VT や AMD-V といった CPU が持つ仮想化機能を使用しますので、これらを予め有効化しておく必要があります。
有効であるかどうかは、Windows であれば、タスクマネージャーのパフォーマンス - CPU で確認可能です。
有効である場合には、上記画面の下の方に出てくる「仮想化:」の項目に「有効」と表示されます。
有効でなかった場合には、PC の BIOS の設定で有効化する必要があります。
Intel 系であれば、
Intel(R) VirtualizationTechnology
AMD 系であれば、
SVM
に相当する項目を enable にします。
以降、Windows 上で仮想化ソフトは VirtualBox を使用する想定の内容になります。
!!!インストール
Vagrant と VirtualBox をダウンロードします。
Vagrant
https://www.vagrantup.com/downloads.html
VirtualBox
https://www.virtualbox.org/wiki/Downloads
普通にインストールできるので手順は省略。
インストールして再起動後、念のためコマンドプロンプトで vagrant に path が通っているか確認します。
> vagrant -v
Vagrant 2.1.4
!!!仮想環境構築
Vagrant+VirtualBox を使用して仮想環境を構築するには、まずは構築したい仮想環境のイメージファイルを探します。
このイメージファイルを通常 "Box" と呼びます。
Box は下記で探すことができます。
https://app.vagrantup.com/boxes/search
仮想化ソフトは VirtualBox を使用するので、"Provider" で VirtualBox を選択します。
使用する Box が決まったら、PC 上に仮想環境用のフォルダを作成します。
例えば、C:\Work\Vagrant\Test01 とします。
PowerShell 等で作成したフォルダに移動し、vagrant init を実行します。
仮に、使用する Box は centos/7 とします。
> cd C:\Work\Vagrant\Test01
> vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
上記のように表示されるので、C:\Work\Vagrant\Test01 上に作成された Vagrant ファイルをテキストエディタで編集します。
Vagrant ファイルでは様々な設定ができますが、最重要は以下の設定です。
config.vm.network "private_network", ip: "192.168.33.10"
もともとコメントになっているはずなので、コメントを外します。
Vagrant ファイルを保存したら以下のコマンドで vagrant を実行します。
> vagrant up
初回の実行では Box ファイルをダウンロードするので少し時間がかかります。終わるまで待ちましょう。
構築が完了したら、以下のように仮想環境にログインしてみます。
> vagrant ssh
root 権限は、sudo で実行できるようになっています。
仮想マシンを停止したい場合には、仮想環境用のフォルダに移動後、下記を実行します。
> vagrant halt
その他 vagrant コマンドはいろいろと機能がありますので、vagrant -h を実行して一通り見ておくことをおすすめします。
!!!Boxについて
前述の通り、Vagrant では init 時に Box 名を指定します。
すると、Vagrant は指定した Box 名をひな形として、仮想イメージを作成します。
Box は最初に Vagrant によりダウンロードされますが、ダウンロード後は再度同じ Box が指定された際には既にダウンロードされた Box を使用します。
つまり、Box は仮想イメージとは別に管理されています。
以下のように、vagrant box list を実行すると、現在 Vagrant で管理されている Box の一覧が見れます。
> vagrant box list
centos/6 (virtualbox, 1902.01)
centos/7 (virtualbox, 1804.02)
mvbcoding/awslinux (virtualbox, 2017.03.0.20170401)
stakahashi/amazonlinux2 (virtualbox, 2017.12.0.20180222)
!!!ホスト/ゲストの同期
PC(ホスト)上のファイルと仮想マシン(ゲスト)上のファイルの同期を取りたいということはよくあります。
この部分は厳密には Vagrant ではなく仮想化ソフトの機能の領域になります。
VirtualBox の場合には、"Guest Additions" というものがあり、この機能で同期ができるようになっています。
ただし、ここで1つ問題があります。
Guest Additions は Box 作成時にインストールされるもののようなのですが、例えばその後 VirtualBox をアップデートしたりして、Guest Additions と VirtualBox のバージョンに差異が出た場合には動作しなくなることがあります。
この場合には、改めて各 Box ごとに Guest Additions を最新バージョンにアップデートする必要があります。
下記のように、vagrant-vbguest という Vagrant のプラグインをインストールすることにより、この面倒な作業を自動化してくれます。
> vagrant plugin install vagrant-vbguest
Vagrant のプラグインは、vagrant-vbguest だけでなくいろいろとありますので、興味があれば探してみるのも良いと思います。
!!!Vagrantの起動/停止
前述の通り、Vagrant の起動/停止は vagrant up/vagrant halt ですが、いちいち対象のフォルダに移動してコマンドを打たないといけないので少々面倒です。
従って、大して便利になるわけでもないですが、私は下記のような bat ファイルを作成しておき、それをデスクトップ等に置いて実行しています。
起動
cd /work/vagrant/test01
vagrant up
停止
cd /work/vagrant/test01
vagrant halt
!!!仮想マシンへのログイン
前述の通り、対象のフォルダに行って vagrant ssh すれば仮想マシンにはログイン可能です。
しかし、この方法は Windows コマンドが実行できるターミナル上でしか使えません。
例えば、Teraterm のようなターミナルソフトを使う場合には、それに即した指定が必要です。
ご参考までに、下記は Teraterm のマクロを使う際の設定になります。
同様の設定で他のターミナルソフトからも接続可能です。
msg = '127.0.0.1'
strconcat msg ':2222 /ssh /keyfile=C:\work\vagrant\test01\.vagrant\machines\default\virtualbox\private_key /auth=publickey /user='
strconcat msg 'vagrant'
connect msg
ssh のポート番号がデフォルトと異なる場合(設定を変えている、もしくは多重起動などで別ポートを使っている場合)は、"2222" の部分を該当ポートにします。
毎回起動するたびに違うポートになってしまうと不便なので、ポートは固定することをおすすめします。
ssh のポートの設定は、Vagrant ファイルで以下のように設定します。
例:2215 ポートにする設定
config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2215
-
Pythonの日本語処理
https://koumei2.com/wiki/1748.html
2019-04-10T19:40:12+09:00
ぷちWiki
Python の日本語処理は少々独特ですね。。。
未だによくわかっていませんが、下記のページで非常に詳しく解説されています。
http://web.wakayama-u.ac.jp/~kazama/lab/python/i18n.html
結論ですが、、、、おまじない的に下記で良いかと考えています。
今のところこれで問題なく対応できているので。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
-
CentOS6でpipを使う
https://koumei2.com/wiki/1747.html
2019-04-10T19:37:18+09:00
ぷちWiki
!!!インストール
CentOS6 ではデフォルトでは pip が使えません。
pip をインストールするには [[EPELリポジトリ]] を有効にしておく必要があります。
EPEL が使えるのであれば以下でインストールできます。
# yum install python-pip
!!!アップグレードについて
pip を使うと以下のようなメッセージが出力されることがあります。
You are using pip version 7.1.0, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
上記に記載されている、、、
# pip install --upgrade pip
このコマンドですが、yum などでインストールした場合には実行しないことをおすすめします。
自分の環境では、実行後 pip がまったく使えなくなってしまったので、結局アンインストールして入れ直しました(/_\*)
-
Simplenoteのデータのバックアップ
https://koumei2.com/wiki/1745.html
2019-04-10T19:21:24+09:00
ぷちWiki
Simplenote の詳細は、[[Simplenote]]をどうぞ。
上記でも書いた通り、Web 上の情報によると Simplenote のデータ保全性は信頼性が高いとまでは言えないようです。
個人的にはまったく問題が起きたことはありませんが、わりと万が一でも消失しまうとまずいデータの保持として使用しているため、可能性は非常に低いとはいえ、データが消失してしまうような事態は極力避けたいと考えます。
そのための方法を2つ紹介します。
!!!その1:ストレージサービスと組み合わせる
まず1つ目は、Simplenoteのデータをエクスポートし、ストレージサービス上に展開するという泥臭い方法です。
ストレージサービスは Dropbox とか OneDrive とかその手のものです。
Simplenote のエクスポート機能は zip ファイルとしてエクスポートされますが、これを展開したファイルをストレージサービス上にコピーします。
zip ファイルそのものをストレージサービス上で保存しても良いのですが、万が一ファイルが壊れていたりして展開不能なファイルだったりすると、バックアップにも何もならないので、念のため展開したものを置いた方が良いかと思います。
展開して出てくるファイルは単なるテキストファイルなので、開けないということもほぼ無いかと思います。
万が一 Simplenote のデータがおかしくなった場合には、ストレージサービス上にバックアップしたテキストファイルから復元可能です。
また、ストレージサービスの機能によっては履歴付きでバックアップを持っていたりするので、その辺りを活用できるとさらに安全です。
!!!その2:APIを使ってバックアッププログラムを作成する
Simplenote は Python API が公開されているので、これを使用してバックアップ用のプログラムを作成し、これを定時実行することにより、定期的にバックアップすることができます。
自分は Linux 上で実行していますが、Python が動作する環境ならどこでも可能だと思います。
API については [[SimplenoteのAPI]] で紹介しています。
単にすべての Simplenote のデータをファイルとして展開するだけなら簡単なので、例を紹介しておきます。
{{{
#!/usr/bin/python
import simplenote
import sys
SAVEDIR = '/PATH_TO_ANY/'
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
sn = simplenote.Simplenote('LOGINNAME', 'PASSWORD')
note, status = sn.get_note_list()
for n in note:
t = n['content'].split('\n', 1)
with open(SAVEDIR + t[0] + '.txt', 'w') as f:
f.write(t[1])
}}}
上記の例は単にファイルに展開するだけですが、例えば更新があったものだけファイルを作成するとか、そういったこともわりと簡単に出来ます。
自分の場合は、上記のファイル展開したものを [[rdiff-backup]]でさらに履歴付きでバックアップするような仕掛けにしています。
-
SimplenoteのAPI
https://koumei2.com/wiki/1746.html
2019-04-10T19:19:12+09:00
ぷちWiki
Simplenote の詳細は、[[Simplenote]] をどうぞ。
とても便利な Simplenote ですが、API と呼ばれているものは公式には用意されていないようにみえます。
その代わりと言っては何ですが、ソースが公開されているので、ソースを解析して API のようなものを作成することはいくらでもできるわけですが。。
しかしながら、非公式なものと思われるものであれば、PythonによるAPIが公開されています。
https://github.com/mrtazz/simplenote.py
上記からでも辿れますが、API の詳細な情報も公開されています。
https://simplenotepy.readthedocs.io/en/latest/
Python の pip 環境が整備されていればインストールは簡単です。
# pip install simplenote
使い方もかなり分かりやすいです。
簡単なサンプルを[[Simplenoteのデータのバックアップ]]に載せています。
!!!旧情報
Web 上で探すと WebService::Simplenote のような Perl API 等々も見つかります。
https://metacpan.org/source/IOANR/WebService-Simplenote-0.2.1/eg/simplenote.pl
しかし、https://simplenote.com/developers/ によると、2018 年 10 月にこの API は廃止されてしまい、実際動作しない状態になってしまっています。
-
Postfix:開発環境用のメール送信設定
https://koumei2.com/wiki/1743.html
2019-04-02T12:48:36+09:00
ぷちWiki
自分がよく設定している開発環境用のメール送信設定のメモ。
以下、Postfix 想定のメモですが、sendmail でも mailiertable を使えば同じようなことが可能です。
!!!目的
開発環境上でテストする際に、実在するメールアドレスへメールを送信してしまってはまずいケースが多々あります。
例えば、DB 上に登録されている会員データ的なもののメールアドレスへ何らかの通知メールを送信する、など。
通常はこういったケースでは、そもそもそのような危険なデータを使わないというのが鉄則ですが、そうもいかないことも多々ありますので、MTA 側でいわゆる誤爆的なメール送信を防ぐことが目的となります。
!!!設定
/etc/postfix/main.cf で以下のように設定します。
transport_maps = hash:/etc/postfix/transport
luser_relay = xxxxxxxx
xxxxxxxx は想定外のメールを受け取るメールアドレスです。
通常は適当なローカルユーザーにします。
さらに、/etc/postfix/transport で以下のように設定します。
aaa.bbb.ccc smtp:aaa.bbb.ccc
* local:
普通に送信して良いドメインは aaa.bbb.ccc のように明記します。
!!!解説
transport_maps を使ってメール送信するドメインを制限しています。
これは社内のアドレスなどテストで使用するドメイン、また、ある意味誤送信してもOKなドメインです。
それ以外は local 配信します。
ちなみに、
aaa.bbb.ccc smtp:[xxx,xxx,xxx]
のように [] を使用して記載すると、ドメインの部分は MX を引きません。
また、IP アドレスも直接記載することができます。
特定のドメイン以外の local 配信となったものは、luser_relay の設定により、xxxxxxxx 宛に送信されるようになります。
-
mini Display Port - HDMI 変換ケーブル
https://koumei2.com/wiki/1488.html
2019-01-07T17:25:26+09:00
ぷちWiki
{{h <a href="http://www.amazon.co.jp/gp/product/B0052GQ498/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=B0052GQ498&linkCode=as2&tag=lightlyandlen-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0052GQ498&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=lightlyandlen-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=lightlyandlen-22&l=as2&o=9&a=B0052GQ498" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />}}
去年、Mac Book Air を購入し、その扱いやすさに感動したわけですが、やはり家やオフィスで使用する際には大きなディスプレイを使用したいわけです(^_^;
これまでは我慢して、Mac Book Air をそのまま使っていたのですが、ちょうど液晶ディスプレイが壊れて買い換えたので、変換ケーブルも一緒に購入して、Mac Book Air でも液晶ディスプレイを使うようになりました。
その際に使用した変換ケーブルが、、、
{{h <a href="http://www.amazon.co.jp/gp/product/B0052GQ498/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0052GQ498&linkCode=as2&tag=lightlyandlen-22">PLANEX Mini Displayport -]HDMI変換アダプタ (MacBook MacBook Pro MacBook Air) PL-MDPHD02</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=lightlyandlen-22&l=as2&o=9&a=B0052GQ498" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />}}
これです。
いわゆる Apple の純正変換ケーブルでももちろんOKなのですが、なんせ高い(^_^;
なんで変換ケーブルごときがそんなに高価なんだ??という感じだったので、廉価品?らしいこの商品を使ってみたのですが、まったくもって動作に問題なし。
非常に快適です( ̄ー ̄)
安いし、持ち運びが微妙に面倒なのでもう1個買ってしまおうかと思うくらいです(笑)
ということで、Mac Book Air を使っている方は、変換ケーブルを調達してでも、液晶ディスプレイを使ってみることをおすすめします(^_^;
ちなみに、ご参考までですが、私がオフィスと家で使っている液晶ディスプレイは以下となります。
いずれも、Windows PC、Mac Book Air の双方で使っていますが、非常に快適に使えていますのでおすすめです。
[[液晶ディスプレイ]]
[[液晶ディスプレイその2]]
-
Emacs のインストール
https://koumei2.com/wiki/259.html
2018-11-28T16:44:10+09:00
ぷちWiki
!!!Emacs のインストール
emacs-22.3の例ですが、25.1 でも同様にインストールできました。
[ftp://ftp.gnu.org/pub/gnu/emacs/|ftp://ftp.gnu.org/pub/gnu/emacs/] 等から emacs-22.3.tar.gzを取得して展開します。
21系までのleimは22系からは標準でバンドルされるようになったようです。
% gzip -dc emacs-22.3.tar.gz | tar xvf -
% cd emacs-22.3
後は以下の通り。
% ./configure --without-x
% make
% su
# make install
※--without-x は X 関連が不要の際に指定します。
※ちなみに、CentOS7, Emacs-26.1 では 以下を指定してビルドしたものを使っています
./configure --without-x --with-mailutils=no --with-pop=no
gnutls のライブラリが無いと言われて configure に失敗するので、gnutls-devel を yum でインストールしておく必要があります。
gnutls は cask などで melpa 等を参照する際に使用します。
不要な人は --with-gnutls=no でも良いでしょう
!!21系のインストール
emacs-21.4a の例です。
[ftp://ftp.gnu.org/pub/gnu/emacs/|ftp://ftp.gnu.org/pub/gnu/emacs/] 等から emacs-21.4a.tar.gz および leim-21.4.tar.gz を取得ます。
leim は Emacs 用の多言語入力ライブラリです。
この2つを同じディレクトリで展開します。
% gzip -dc emacs-21.4a.tar.gz | tar xvf -
% gzip -dc leim-21.4.tar.gz | tar xvf -
% cd emacs-21.4
後は同様。
% ./configure --without-x
% make
% su
# make install
-
福島県産こしひかり
https://koumei2.com/wiki/1143.html
2018-06-30T14:45:21+09:00
ぷちWiki
[[おこめの鬼平]]、[@alpha(アット・アルファ)|http://pt.afl.rakuten.co.jp/c/0265536f.546b01a4/?url=http%3a%2f%2fwww.rakuten.co.jp%2falpha%2f&scid=af_ich_link_urltxt_pc]で希望のお米が買えなかったことがあり、その時に試しに買ってみたのがこちら。
[会津CROPS|http://hb.afl.rakuten.co.jp/hsc/0f6c18ae.69edde45.0f6c18ad.878312a2/]
福島県産ということで放射能が気になりますが、きちんと測定した結果をメールで送ってくれるので、むしろ他の県よりも安全だと思います。
こちらで注文したのは、福島県産のコシヒカリ。
10kgで\3,500程度とかなりの安さです。
味の方も甘みといい歯ごたえといい素晴らしく、冷めても美味しいです。
はっきり言って、風評被害に晒されている今だからこそお買い得なのかもと思ってみたり。
これはリピート確定です。
-
ゴルフボール
https://koumei2.com/wiki/1742.html
2018-06-01T11:07:31+09:00
ぷちWiki
ゴルフボールは普通に新品を買ってしまうと高いですよね。
こういうものこそ、Amazonです(笑)
{{h <a target="_blank" href="https://www.amazon.co.jp/gp/product/B00VB9PHIO/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00VB9PHIO&linkCode=as2&tag=lightlyandlen-22&linkId=a259e951e081872b8b41315f048311a3"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B00VB9PHIO&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=lightlyandlen-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lightlyandlen-22&l=am2&o=9&a=B00VB9PHIO" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />}}
1000円ちょっとで12個。
この安さで公認球だし飛距離も出ます。
他にノーマルの白やオレンジもありますが、この蛍光イエローはボールが見つけやすくてホントにおすすめです。
はっきり言って欠点が見つからないので、なぜこのボールがバカ売れしないのか不思議なレベルです。
是非、お試しください。
{{h <iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&t=lightlyandlen-22&m=amazon&o=9&p=8&l=as1&IS2=1&detail=1&asins=B00VB9PHIO&linkId=f381c8713f9cc24db2fbe002f93c9696&bc1=ffffff<1=_blank&fc1=333333&lc1=0066c0&bg1=ffffff&f=ifr"> </iframe>}}
-
取扱説明書ファイル
https://koumei2.com/wiki/829.html
2018-05-26T16:47:49+09:00
ぷちWiki
今までは家電製品や PC 関連商品等の取扱説明書の類の書類は普通のクリアファイルで整理して保管していたのですが、クリアファイルだとどうしても厚さが足りないため、中が膨れあがってしまいます。
保証書のような薄いものならともかく、説明書はそこそこの厚さがあるものが多いので、どうしてもキレイに整理できません。
そこで使ってみたのが、取扱説明書ファイルと呼ばれるモノ。
このファイルは、取扱説明書を入れることを想定して1つ1つのポケットはマチ付きなので、ある程度厚い説明書でもキレイに保管できます。
また、メインのポケット以外に、前面には保証書用ポケット、裏面にはCD用ポケットが付いているので、PC 関連商品に多い説明書+保証書+CDのようなパターンの場合にもまとめて整理できます。
ポケットは大量の収容物の重さに耐えられるように厚手な素材で出来てますし、付属のインデックスラベルを貼って見出しを付けることが出来るなど、細かいところまで良くできています。
ということで、取扱説明書/保証書の類を整理したいという方には超おすすめの一品です。
{{iframe src="https://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=lightlyandlen-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=B000W43FVA" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"}}
上記のファイルでも十分なのですが、さらにキッチリと整理したい方は以下のファイルがおすすめです!
{{iframe src="https://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=lightlyandlen-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=B001MSQWRE" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"}}
値段は少々高いですが、スライド式に厚さを変えることが出来、替紙も追加することによって枚数を変えることができます。
さらに、替紙には取扱説明書タイプと通常の封筒タイプとがあるので、用途に従って替紙の構成を用意することもできます。
外側のカバーはかなりしっかりとした素材。
ということで、個人的なおすすめとしては、メインに高級?なスライド式のものを使い、サブにもう一方のものを使うのが良いかと思います。
実際、私は現在そのように2種類を使い分けてます。
整理が出来て超スッキリ(^_^;
-
Composer
https://koumei2.com/wiki/1730.html
2018-05-23T11:59:20+09:00
ぷちWiki
Composer は、PHP のパッケージ管理システムです。
従来の PEAR だと root 権限が必要だったり、特定の場所にインストールされてしまったりで使い勝手が悪かったのですが、Composer であれば、一般ユーザーで好きな場所にインストールすることが出来ます。
!!! インストール
公式サイトは以下です。
https://getcomposer.org/
インストールする時には、https://getcomposer.org/download/ を参照して、Command-line installation の箇所に記載されているコマンドをコピペして実行します。
例えば、以下のようなコマンドになります。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
上記を実行すると、カレントディレクトリに composer.phar というファイルが作成されます。
これを使用してパッケージ管理が出来ます。
!!!使用方法
composer.phar は PHP に path が通っていれば、コマンドとして使用可能です。
例えば、以下のように使えます。
% composer.phar require xxxxx/yyyyy
もしくは、同じディレクトリにインストールするパッケージ情報を記述した composer.json を作成して、
% composer.phar install
です。
一度インストールを行った後は、以下でパッケージのバージョンを更新することが出来ます。
% composer.phar update
とりあえずこの程度でも十分使えるので、あとはおいおいで(^_^;
-
モンスターストライク
https://koumei2.com/wiki/1741.html
2018-04-13T16:31:12+09:00
ぷちWiki
モンスターストライク(通称モンスト)の個人的なメモです。
[玉楼201803|https://docs.google.com/spreadsheets/d/e/2PACX-1vRQE5oqgOt_jwIamc98Z1ykVc9xRL6Cv9R5GtJUeNawCX8nup9YIrWGhLQ3WHmYRSMz9QYGv98mOgKd/pubhtml?gid=0&single=true]
[玉楼201804|https://docs.google.com/spreadsheets/d/e/2PACX-1vQt_zNzVSYd3C6_k0Pzh68f-okJtiWlQ8sIMrXJt98AI8Soj9B9aUcUPp9Z24bzhvCu017LmjrDgTIv/pubhtml]
-
Tabulator
https://koumei2.com/wiki/1729.html
2018-03-14T18:15:41+09:00
ぷちWiki
Tabulator は、HTML で機能的なテーブルを簡単に作成できる jQuery UI のプラグインです。
[[Flexigrid]] などこの手のプラグインはいろいろあると思いますが、導入がしやすいわりには高機能なのでとても便利です。
ちなみに、[[Flexigrid]] を愛用していたのですが、どうも更新が止まってしまったように思えるので、私は Tabulator に乗り換えました( ̄ー ̄)
!!!使用方法
まず、以下の Tabulator の GitHub リポジトリから Tabulator のファイルを取得します。
https://github.com/olifolkerd/tabulator
使用するのは、tabulator.css と tabulator.js ですので、適当な場所に配置します。
次に、Tabulator は jQuery UI のプラグインですので、当然 jQuery UI が必要です。
例えば、CDN を使うのであれば以下のように jQuery UI を読み込みます。
jQuery UI については、[[jQuery UI]] を参照。
あわせて、設置したファイルも読み込みます。
<link rel="stylesheet" type="text/css" href="tabulator.css">
<link type="text/css" rel="stylesheet" href="https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.min.css" />
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
<script type="text/javascript" src="tabulator.js"></script>
次に、テーブルの本体です。
以下のように、div タグを書くだけです。
<div id="example-table"></div>
最後に、JS 部分です。
例えば、以下のように tablulator を実行します。
$("#example-table").tabulator( {
//height: '666px',
height: 'auto',
fitColumns:true,
ajaxURL:'/ajax/wiki/list',
//data: tabledata,
pagination: 'local',
paginationSize: 20,
columns:[
{title:"ID", field:"id", align:'right', sorter:'number', width: '70px'},
{title:"タイトル", field:"title", sorter:'string', headerFilter:true},
{title:"カテゴリ", field:'category', sortable: false},
{title:"最終更新日時", field:"updated_on", align:"center", sorter:'string', width: '200px'},
{title:"操作", field:'action', sortable:false, width: '230px'},
],
sortBy: 'updaetd_on',
sortDir: 'desc',
langs:{
"ja": {
"pagination":{
"first":"最初へ",
"first_title":"最初へ",
"last":"最後へ",
"last_title":"最後へ",
"prev":"前へ",
"prev_title":"前へ",
"next":"次へ",
"next_title":"次へ",
},
}
},
locale: 'ja',
});
いろいろと指定していますが、基本的にはとても簡単な指定だけで使用することが出来ます。
詳細は以降を参考にしてください。
また、逆に Tabulator はとても機能が豊富ですので、ここですべてはとても紹介しきれません。
詳細は、http://olifolkerd.github.io/tabulator/docs/ をどうぞ。
!!!データの指定方法
まず、表示するデータの項目の定義をします。
上記の例の columns 指定がそれに相当します。
次にデータ本体ですが、JSON 変数で指定する方法と ajax で読み込ませる方法があります。
JSON 変数は、Tabulator のサンプルで記載されている以下が参考になります。
var tabledata = [
{id:1, name:"Oli Bob \n steve", age:"12", gender:"male", height:1, col:"red", dob:"", cheese:1, lucky_no:5},
{id:2, name:"Mary May", age:"1", gender:"female", height:2, col:"blue", dob:"14/05/1982", cheese:true, lucky_no:10},
{id:3, name:"Christine Lobowski", age:"42", height:0, col:"green", dob:"22/05/1982", cheese:"true", lucky_no:12},
{id:4, name:"Brendon Philips", age:"125", gender:"male", height:1, col:"orange", dob:"01/08/1980", lucky_no:18},
{id:5, name:"Margret Marmajuke", age:"16", gender:"female", height:5, col:"yellow", dob:"31/01/1999", lucky_no:33},
{id:6, name:"Frank Harbours", age:"38", gender:"male", height:4, col:"red", dob:"", cheese:1, lucky_no:2},
{id:7, name:"Jamie Newhart", age:"23", gender:"male", height:3, col:"green", dob:"14/05/1985", cheese:true, lucky_no:63},
{id:8, name:"Gemma Jane", age:"60", height:0, col:"red", dob:"22/05/1982", cheese:"true", lucky_no:72},
{id:9, name:"Emily Sykes", age:"42", gender:"female", height:1, col:"maroon", dob:"11/11/1970", lucky_no:44},
{id:10, name:"James Newman", age:"73", gender:"male", height:5, col:"red", dob:"22/03/1998", lucky_no:9},
];
columns で定義した field 名と値のセットですね。
このように JSON 変数を定義し、前述の例ではコメントとしている
data: tabledata
のように指定すればOKです。
ajax の方は、前述の例の通り、ajaxURL に読み込ませる URl を指定します。
ちなみに、ajax で呼ばれて JSON を返す側の処理ですが、以下が PHP の例です。
$data = array(
array(id=>1, name=>"Billy Bob", age=>"12", gender=>"male", height=>1, col=>"red", dob=>"", cheese=>1),
array(id=>2, name=>"Mary May", age=>"1", gender=>"female", height=>2, col=>"blue", dob=>"14/05/1982", cheese=>true),
array(id=>3, name=>"Christine Lobowski", age=>"42", height=>0, col=>"green", dob=>"22/05/1982", cheese=>"true"),
array(id=>4, name=>"Brendon Philips", age=>"125", gender=>"male", height=>1, col=>"orange", dob=>"01/08/1980"),
array(id=>5, name=>"Margret Marmajuke", age=>"16", gender=>"female", height=>5, col=>"yellow", dob=>"31/01/1999"),
);
echo(json_encode($data));
!!!その他
だいたい指定例を見れば分かると思いますが、ページャーやソート、ロケールなどにも対応しています。
少し面倒なのは、ページャーの "Prev", "Next" ボタン等はロケール設定して読み込ませないと変更できないところですね。
もちろん、直接マスターの JS ファイルを変更するとか、オーバーライドさせるとかすれば変更できますが(^_^;
わりとよく使いそうな指定は前述の例に含ませていますので、いろいろ試してみてください(^_^;
-
パズドラ:2015年10月の画像
https://koumei2.com/wiki/1740.html
2017-08-17T12:07:00+09:00
ぷちWiki
{{tb /image/pazudora/201510/03.jpg}}
{{tb /image/pazudora/201510/10.jpg}}{{tb /image/pazudora/201510/11.jpg}}{{tb /image/pazudora/201510/12.jpg}}{{tb /image/pazudora/201510/13.jpg}}
-
パズドラ:2015年9月の画像
https://koumei2.com/wiki/1739.html
2017-08-15T17:04:30+09:00
ぷちWiki
{{tb /image/pazudora/201509/18.jpg}}{{tb /image/pazudora/201509/19.jpg}}{{tb /image/pazudora/201509/20.jpg}}{{tb /image/pazudora/201509/21.jpg}}
{{tb /image/pazudora/201509/28.jpg}}
{{tb /image/pazudora/201509/31.jpg}}
-
パズドラ:2015年8月の画像
https://koumei2.com/wiki/1738.html
2017-08-15T17:03:26+09:00
ぷちWiki
{{tb /image/pazudora/201508/34.jpg}}{{tb /image/pazudora/201508/35.jpg}}
{{tb /image/pazudora/201508/43.jpg}}{{tb /image/pazudora/201508/44.jpg}}
{{tb /image/pazudora/201508/01.jpg}}{{tb /image/pazudora/201508/02.jpg}}{{tb /image/pazudora/201508/03.jpg}}{{tb /image/pazudora/201508/04.jpg}}
{{tb /image/pazudora/201508/05.jpg}}
-
ConoHa VPS
https://koumei2.com/wiki/1663.html
2017-08-07T17:50:41+09:00
ぷちWiki
{{h <a href="http://px.a8.net/svt/ejp?a8mat=2HJRTH+92UZW2+50+4ATZKY" target="_blank">ConoHaのVPS</a><img border="0" width="1" height="1" src="http://www11.a8.net/0.gif?a8mat=2HJRTH+92UZW2+50+4ATZKY" alt="">}} は、GMO が提供している VPS サービスです。
GMO は[[お名前.com VPS]] という VPS サービスを提供しており、もちろんそちらの方が圧倒的に有名なので、なぜあえて ConoHa というサービスを立ち上げたのか不明です(^_^;
ConoHa ちゃんというマスコット?がいて、見るからに怪しいサービスなのですが、VPS サービスとしてのクオリティは[[お名前.com VPS]] と同等レベルのようなので、十分に検討に値するサービスです。
[[お名前.com VPS]]よりも優れているのは、VPS 同士で LAN 接続出来ることですね。
Web - DB のようなよくある構成を組みたい場合には、こちらをチョイスすることになるでしょう。
ただ、[[お名前.com VPS]] よりも若干高いようなので、シングル構成の場合には今のところメリットが見あたりません(^_^;
最近では、ConoHa ちゃんが前面にあまり出てこなくなったので、VPS サービスとして非常にまともに見えるようになりました(笑)
私が見落としている可能性もあるので、下記より詳細を確認してみてください。
十分に検討する価値があると思います。
{{h <a href="http://px.a8.net/svt/ejp?a8mat=2HJRTH+92UZW2+50+4AV25T" target="_blank"><img border="0" width="100" height="60" alt="" src="http://www28.a8.net/svt/bgt?aid=150408341549&wid=001&eno=01&mid=s00000000018026011000&mc=1"></a><img border="0" width="1" height="1" src="http://www16.a8.net/0.gif?a8mat=2HJRTH+92UZW2+50+4AV25T" alt="">}}
-
パズドラ:2015年7月の画像
https://koumei2.com/wiki/1737.html
2017-07-31T18:00:37+09:00
ぷちWiki
{{tb /image/pazudora/201507/01.jpg}}{{tb /image/pazudora/201507/02.jpg}}{{tb /image/pazudora/201507/03.jpg}}{{tb /image/pazudora/201507/04.jpg}}{{tb /image/pazudora/201507/05.jpg}}{{tb /image/pazudora/201507/06.jpg}}{{tb /image/pazudora/201507/07.jpg}}{{tb /image/pazudora/201507/08.jpg}}
{{tb /image/pazudora/201507/14.jpg}}{{tb /image/pazudora/201507/15.jpg}}
{{tb /image/pazudora/201507/17.jpg}}
{{tb /image/pazudora/201507/21.jpg}}
-
パズドラ:2015年6月の画像
https://koumei2.com/wiki/1686.html
2017-07-27T18:05:41+09:00
ぷちWiki
{{tb /image/pazudora/201506/01.jpg}}{{tb /image/pazudora/201506/02.jpg}}{{tb /image/pazudora/201506/03.jpg}}{{tb /image/pazudora/201506/04.jpg}}
{{tb /image/pazudora/201506/05.jpg}}
{{tb /image/pazudora/201506/06.jpg}}{{tb /image/pazudora/201506/07.jpg}}{{tb /image/pazudora/201506/08.jpg}}
{{tb /image/pazudora/201506/09.jpg}}{{tb /image/pazudora/201506/10.jpg}}
{{tb /image/pazudora/201506/11.jpg}}
{{tb /image/pazudora/201506/12.jpg}}
{{tb /image/pazudora/201506/13.jpg}}{{tb /image/pazudora/201506/14.jpg}}{{tb /image/pazudora/201506/15.jpg}}{{tb /image/pazudora/201506/16.jpg}}
{{tb /image/pazudora/201506/17.jpg}}
{{tb /image/pazudora/201506/18.jpg}}
-
パズドラ
https://koumei2.com/wiki/1246.html
2017-07-25T15:38:00+09:00
ぷちWiki
パズドラのプレイ日記等をとりとめもなく書いていこうかと思います(^_^;
[[パズドラダンジョンクリア状況]]
!!!ガチャ状況
{{tb /image/pazudora/gacha.jpg}}
!!!リンク
http://serizawa.web5.jp/puzzdra_godlist/index.html
!!!プレイ日記
,{NOTH}
,[[パズドラ開始!!]]
,[[ノーマルダンジョン:魔王の城まで]]
,[[ヴァンパイアゲット!!]]
,[[魔王・ヴァンパイアロードに進化!!]]
,[[魔王・ヴァンパイアロード スキルマ]]
,[[大海の歌姫・セイレーン スキルマ]]
,[[究極進化:カオスドラゴンナイト・ヴォイス]]
,[[究極進化:エンシェントドラゴンナイト・セロ]]
,[[オオクニヌシゲット!!]]
,[[ヘラ降臨!攻略]]
,[[伝説龍ラッシュ!超級攻略]]
,[[勇者降臨!攻略]]
,[[究極進化:スカイゴッドナイト・ヴァーチェ]]
,[[ログイン100日目]]
,[[究極進化:怒りと炎の精霊・シャイターン]]
,[[究極進化:爆炎龍・グランティラノス]]
,[[皇たる機械龍攻略]]
,[[究極進化:月光龍・ルナデスピナス]]
,[[究極進化:闇黒魔王・ヴァンパイアデューク]]
,[[女の子ガチャ2013/11/16]]
,[[大泥棒参上!地獄級攻略]]
,[[アングリーバードコラボ黄金級攻略]]
,[[究極進化:剛腕無双・ギガンテスグレイト]]
,[[蒼の海賊龍超級攻略]]
,[[レアガチャ2013/12/01]]
,[[ゼウス降臨!攻略]]
,[[滅びの機械龍攻略]]
,[[究極進化:破龍皇帝・グランドジークフリート]]
,[[女神降臨!攻略]]
,[[レアガチャ2013/12/13]]
,[[大泥棒参上!地獄級攻略その2]]
,[[究極進化:冥界神・アークハーデス]]
,[[イザナミ降臨!地獄級攻略]]
,[[カピバラさんコラボ極攻略]]
,[[剛腕無双・ギガンテスグレイト スキルマ]]
,[[碧の海賊龍地獄級攻略]]
,[[究極進化:光臨舞神・アマテラスオオカミ]]
,[[聖夜の贈り物]]
,[[伝説龍ラッシュ!地獄級攻略]]
,[[HUNTER×HUNTERコラボプロ攻略]]
,[[炎の歴龍攻略]]
,[[ヘラ・ウルズ降臨!地獄級攻略]]
,[[究極進化:蒼天夜龍・ニライカナイ]]
,[[究極進化:天上界の使徒・エンジェル]]
,[[レアガチャ2014/01/02]]
,[[ヘラ・イース降臨!地獄級攻略]]
,[[超絶ドラゴンラッシュ!攻略]]
,[[太鼓の達人コラボ ドン!おに 攻略]]
,[[究極進化:紅闇星・ティアマット]]
,[[ジュエルの塔2014/01/12]]
,[[究極進化:宝輝の大精霊・ジーニャ]]
,[[レアガチャ2014/01/13]]
,[[新・無限回廊挑戦その1]]
,[[新・神羅万象チョココラボ攻略]]
,[[ガンホーコラボ地獄級攻略]]
,[[金の海賊龍地獄級攻略]]
,[[超ゴルドラ2014/01/22]]
,[[水の歴龍地獄級攻略]]
,[[土日ダンジョン:スタミナ半減]]
,[[バロン系スキルマ]]
,[[究極進化:紅蓮華の女傑・エキドナ]]
,[[木の歴龍地獄級攻略]]
,[[ハローキティコラボ王国攻略]]
,[[究極進化:薔薇戦姫・グレイスヴァルキリー]]
,[[レアガチャ2014/02/01]]
,[[ドラゴンゾンビ降臨!地獄級攻略]]
,[[火曜ダンジョン2014/02/04]]
,[[究極進化:白火の舞女神・パールヴァティー]]
,[[究極進化:世界樹の精霊・アルラウネ]]
,[[光の歴龍地獄級攻略]]
,[[究極進化:響奏の愛猫神・バステト]]
,[[アンケートダンジョン7上級攻略]]
,[[レアガチャ2014/02/16]]
,[[レアガチャ2014/02/18]]
,[[究極進化:聖獣龍・エンジェリオン]]
,[[アイルーでバザールコラボ攻略]]
,[[究極進化:バーンフェニックスナイト・ホムラ]]
,[[究極進化:フラッドフェンリルナイト・カムイ]]
,[[レアガチャ:2014/02/28]]
,[[ぐんまコラボ極楽攻略]]
,[[エヴァコラボ攻略]]
,[[究極進化:太陽龍・ソルプテラドス]]
,[[紅の華龍攻略]]
,[[サタン降臨!攻略]]
,[[ケリ姫コラボ攻略]]
,[[究極進化:時津風の神童・猿飛佐助]]
,[[超絶ドラゴンラッシュ2!攻略]]
,[[ヘラ・イース降臨!超地獄級攻略]]
,[[ドラゴンズドグマコラボ攻略]]
,[[集結!進化ラッシュ!!]]
,[[タケミナカタ降臨!地獄級攻略]]
,[[レアガチャ2014/03/14]]
,[[レアガチャ2014/03/15]]
,[[蒼の華龍攻略]]
,[[カオスドラゴンナイト・ヴォイス スキルマ]]
,[[バットマンコラボ攻略]]
,[[究極進化:王狼英雄・ノーブルクーフーリン]]
,[[アテナ降臨!攻略]]
,[[翠の華龍攻略]]
,[[究極進化:角砦龍・フォートトイトプス]]
,[[天海神2014/03/29]]
,[[水のダンジョン2014/03/30]]
,[[全世界3000万DL記念ゴッドフェス]]
,[[エンシェントドラゴンナイト・セロ スキルマ]]
,[[タロス奈落穴2014/03/31]]
,[[女神降臨!超地獄級攻略]]
,[[紅蓮華の女傑・エキドナ スキルマ]]
,[[究極進化:綿津見の歌姫・セイレーン ]]
,[[ムラコフォロワー90万人突破記念]]
,[[薔薇戦姫・グレイスヴァルキリー スキルマ]]
,[[ヘラクレス降臨!地獄級攻略]]
,[[CoCコラボ攻略]]
,[[橙の華龍攻略]]
,[[究極進化:断罪の冥府神・ペルセポネ]]
,[[国内2500万DL達成記念ゴッドフェス]]
,[[究極進化:漆黒夜の魔姫・リリス]]
,[[アンケートダンジョン8攻略]]
,[[究極進化:蒼闇星・ティアマット]]
,[[ジュエルの塔攻略]]
,[[聖獣龍・エンジェリオン スキルマ]]
,[[紫の華龍攻略]]
,[[天空龍ラッシュ!攻略]]
,[[ヘラ・ソエル降臨!地獄級攻略]]
,[[水曜ダンジョン地獄級攻略]]
,[[ファミ通アワード受賞&パズバト記念ゴッドフェス]]
,[[パズバトコラボ攻略]]
,[[究極進化:天弓の光明神・アポロン]]
,[[究極進化:皇狼英雄・イグニスクーフーリン]]
,[[究極進化:反逆の熾天使・ルシファー]]
,[[断罪の冥府神・ペルセポネ スキルマ]]
,[[究極進化:碧炎星・イフリート]]
,[[焔の機械龍攻略]]
,[[氷の機械龍攻略]]
,[[タケミナカタ降臨!超地獄級攻略]]
,[[2600万DL達成記念ゴッドフェス]]
,[[ROコラボ攻略]]
,[[297:霊護の白虎・ハク]]
,[[究極進化:氷塊龍・デプスプレシオス]]
,[[ECOコラボ攻略]]
,[[風の機械龍攻略]]
,[[究極進化:退滅の大天使・ミカエル]]
,[[皇たる機械龍攻略その2]]
,[[グルーヴコースターコラボ攻略]]
,[[金曜ダンジョン超地獄級攻略]]
,[[究極進化:退魔爪の白虎・ハク]]
,[[国内2700万DL達成記念ゴッドフェス]]
,[[ワダツミ降臨!攻略]]
,[[ドラゴンボールコラボ攻略]]
,[[究極進化:ブラストオーロラドラゴン]]
,[[究極進化:大花龍・ガイアブラキオス]]
,[[焔の龍騎姫攻略]]
,[[究極進化:超覚醒ゼウス]]
,[[2800万DL達成記念ゴッドフェス]]
,[[炎の神秘龍攻略]]
,[[闇の戦国龍攻略]]
,[[究極進化:妙霊護の青龍・カリン]]
,[[火曜ダンジョン超地獄級攻略]]
,[[水の神秘龍攻略]]
,[[光の戦国龍攻略]]
,[[究極神化:煌命聖海神・イシス]]
,[[地の神秘龍攻略]]
,[[聖闘士星矢コラボ攻略]]
,[[究極進化:道明守の玄武・メイメイ]]
,[[火の戦国龍攻略]]
,[[ムラコフォロワー100万人突破記念イベント(前半)ゴッドフェス]]
,[[アンケートダンジョン3攻略]]
,[[水の戦国龍攻略]]
,[[ゼウス降臨!攻略その2]]
,[[新・無限回廊挑戦その2]]
,[[アンケートダンジョン4攻略]]
,[[光の神秘龍攻略]]
,[[究極進化:傲慢の魔神卿・バアル]]
,[[究極進化:神王妃・ヘラ]]
,[[闇の神秘龍攻略]]
,[[伝説の航路攻略その1]]
,[[海の龍騎姫攻略]]
,[[ムラコフォロワー100万人突破記念イベント(後半)ゴッドフェス]]
,[[風の戦国龍攻略]]
,[[勇者降臨!攻略その2]]
,[[究極進化:久遠の不死鳥・フェニックス]]
,[[トト&ソティス降臨!攻略]]
,[[アンケートダンジョン5攻略]]
,[[究極進化:紅の機神将・エルダーヨトゥン]]
,[[バーンフェニックスナイト・ホムラ スキルマ]]
,[[アンケートダンジョン6攻略]]
,[[道化龍・ドラウンジョーカー スキルマ]]
,[[闇の歴龍攻略]]
,[[パズドラ:モンスターBOX500]]
,[[究極進化:灼炎王アポロ]]
,[[蒼の海賊龍地獄級攻略]]
,[[ノア降臨!地獄級攻略]]
,[[アンケートダンジョン9攻略]]
,[[サーティワンコラボ攻略]]
,[[国内2900万DL&パズドラZ150万本突破ゴッドフェス]]
,[[チャレンジモード:神々の王攻略]]
,[[風の龍騎姫攻略]]
,[[究極進化:暗黒覚醒ゼウス]]
,[[ベルゼブブ降臨!攻略]]
,[[究極進化:魔焉皇帝・ヴァンパイアデューク]]
,[[ポリンの塔攻略]]
,[[究極進化:天真の魔神卿・アスタロト]]
,[[究極進化:神創樹の精霊・アルラウネ]]
,[[究極進化:絶海の才女・ルカ]]
,[[1700万DL達成記念&夏休みスペシャル!ゴッドフェス]]
,[[ノア降臨!超地獄級攻略]]
,[[金の海賊龍地獄級攻略その2]]
,[[究極進化:冥界の闇番犬・ケルベロス]]
,[[黒の海賊龍攻略]]
,[[ビックリマンコラボ攻略]]
,[[カネツグ降臨!地獄級攻略]]
,[[カネツグ降臨!超地獄級攻略]]
,[[スマホアプリ7タイトル5000万DL突破記念ゴッドフェス]]
,[[究極進化:ECO・スーパータイニー・アルマ]]
,[[聖の龍騎姫攻略]]
,[[木の歴龍地獄級攻略その2]]
,[[究極進化:聖天地の守神・エンジェル]]
,"[[フォロワー1,100,000人突破記念!ムラコレ]]"
,[[究極進化:太鼓神どんちゃん・極]]
,[[影の龍騎姫攻略]]
,[[Android版リリース1周年記念ゴッドフェス]]
,[[木曜ダンジョン超地獄級攻略]]
,[[時津風の神童・猿飛佐助 スキルマ]]
,[[究極進化:魔神マステリオン]]
,[[土日ダンジョン地獄級攻略]]
,[[アンケートダンジョン10攻略]]
,[[ドラゴンボールコラボ2攻略]]
,[[羅刹の飛将神・呂布 スキルマ]]
,[[3000万DL記念前半ゴッドフェス]]
,[[炎の蟲龍攻略]]
,[[星空の遺跡2014/10/04]]
,[[ヘラ・イース降臨!超地獄級攻略その2]]
,[[モンスターハンター4Gコラボ攻略]]
,[[チャレンジダンジョン(第1回):Lv7攻略]]
,[[3000万DL記念後半ゴッドフェス]]
,[[コシュまる降臨!攻略]]
,[[ハイパー:エキドナ]]
,[[タロス奈落穴:2014/10/13]]
攻略情報的メモ。
,{NOTH}
,[[闇パーティー]]
-
PubSubHubbub
https://koumei2.com/wiki/1736.html
2017-06-29T19:15:06+09:00
ぷちWiki
PubSubHubbub は、平たく言えばインターネット上のサーバにデータが更新されたことを通知するためのプロトコルです。
現状では、目的の URL を Google 等にリアルタイムに通知することにより、いち早くインデックスしてもらうために使われることが多いようです。
自分も実際に使ってみましたが、PubSubHubbub を使って通知すると、速攻でロボットがやってきます(笑)
PubSubHubbub は実際には Google に直接通知するわけではありません。
中継 (Hub) サーバに通知することになります。
以下の2つがメジャーな Hub のようです。
https://pubsubhubbub.superfeedr.com
https://pubsubhubbub.appspot.com
ちなみに、後者が Google の Hub になります。
PubSubHubbub は単なるプロトコルなので、実際の実装は様々です。
[PubSubHubbub の github|https://github.com/pubsubhubbub] にいろいろありますので、お好みのものをチョイスするのが良いと思います。
以下、PHP と Perl について紹介します。
!!!PHP での使用方法
pubsubhubbub-php というものを使ってみました。
以下から取得可能です。
https://github.com/joshfraser/pubsubhubbub-php
確認してみれば分かりますが、単なる publisher.php という1ファイルからなるモジュールです。
使い方も簡単。
サンプルも付いていますが、以下のような感じです。
include("publisher.php");
$hub_url = "http://pubsubhubbub.appspot.com/publish"; // Google の Hub を指定
$p = new Publisher($hub_url);
if ($p->publish_update('http://xxx.xxx.xxx.xxx/index.html')) { // 目的の URL を指定
// 成功
} else {
// 失敗
print_r($p->last_response());
}
!!!Perl での使用方法
perl-publisher というものを使ってみました。
以下から取得可能です。
https://github.com/pubsubhubbub/perl-publisher
perl-publisher は、https な Hub に通知する場合には、LWP::Protocol::https モジュールが必要になりますのでご注意。
こちらも使用方法はとても簡単。以下のような感じです。
2つの Hub に通知を送る例です。
use Net::PubSubHubbub::Publisher;
my @hub = ('http://pubsubhubbub.appspot.com/publish',
'https://pubsubhubbub.superfeedr.com');
die if !$ARGV[0];
my $url = $ARGV[0];
for my $i (@hub) {
my $pub = Net::PubSubHubbub::Publisher->new(hub => $i);
if ($pub->publish_update($url)) {
printf("%s to %s is OK\n", $url, $i);
}
else {
printf("%s to %s is failed.\n%s\n", $url, $i, $pub->last_response->status_line);
}
}
ほとんどスキームは PHP と同じですね。
-
Smarty:修飾子
https://koumei2.com/wiki/1713.html
2017-06-28T19:03:19+09:00
ぷちWiki
Smarty には修飾子という概念があり、大変便利です。
変数/関数/文字列などを修飾して出力する時に使用します。
以下のように、"|"(パイプ)指定することにより修飾子を指定することが出来ます。
{$smarty.now|date_format:"%Y/%m/%d"}
上記の例は、$smarty.now により取得できる現在時刻を yyyy/mm/dd の形式で表示するよう date_format という修飾子を指定したものとなります。
上記の例のように、修飾子に ":"(コロン)を指定することにより、修飾子にパラメータを指定することが出来ます。
上記の例では、"%Y/%m/%d" というパラメータを指定することにより yyyy/mm/dd という形式を指定したことになります。
!!!修飾子に PHP の関数を使う
Smarty では、PHP の関数を修飾子に指定することが出来ます。
以下のように、"@"(アットマーク)を PHP 関数の前に指定します。
{$lines|@count}
上記の例では、修飾子として PHP の count() 関数を指定したことになります。
!!!独自の修飾子
Smarty では、独自の修飾子を使用することも可能です。
例えば、Smarty には truncate という修飾子がありますが、マルチバイト対応していないので日本語では全く使い物になりません。
以下、mytruncate というマルチバイト対応した独自の truncate を作る例を紹介します。
Smarty の独自修飾子を作成するには、smarty のディレクトリにある libs/plugins/ 配下に modifier.xxxxx.php という名前でプラグインファイルを作成します。
xxxxx は修飾子名なので、mytruncate という修飾子であれば、modifier.mytruncate.php となります。
内容は以下のように作成しました。
※HTML ベースかつ UTF-8 でしか使わない想定です
function smarty_modifier_mytruncate($string, $length = 80, $etc = '...') {
if ($length == 0) return '';
$string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
$string = trim($string);
if (mb_strlen($string) > $length) {
$string = mb_substr($string, 0, $length) . $etc;
}
return htmlentities($string, ENT_QUOTES);
}
重要な点は以下となります。
・smarty_modifier_xxxxx という関数を作成する(xxxxx は修飾子名)
・パラメータが必要であれば、関数にパラメータの設定も記載する
・修飾した結果を return で返す
上記で作成した mytruncate は以下のように使用することが出来ます。
{$body|mytruncate}
{$body|mytruncate:'100'}
{$body|mytruncate:'100':'---'}
-
mod_ssl
https://koumei2.com/wiki/239.html
2017-06-12T16:58:18+09:00
ぷちWiki
!!!mod_ssl とは
mod_ssl は Apache の通信を SSL ライブラリを使って暗号化する(ようは https 通信を実現する)ためのモジュールです。
他に https を実現する方法としては Apache-SSL を使う方法もありますが、最近では mod_ssl を使う方が一般的なようです。
!!!インストール
apache_1.3.26 + mod_ssl-2.8.10-1.3.26 の例です。
まず、暗号化に必要な SSL ライブラリとして [[OpenSSL]] をインストールします。
次に mod_ssl を [mod_ssl 公式サイト|http://www.modssl.org/]から入手し、展開します。
% gzip -dc mod_ssl-2.8.10-1.3.26.tar.gz |tar xvf -
% cd mod_ssl-2.8.10-1.3.26
さらに mod_ssl の configure を走らせるのですが、これには Apache のソースが必要となります。
% ./configure --with-apache=../apache_1.3.26
最後に mod_ssl で指定した Apache をコンパイル・インストールします。
% cd ../apache_1.3.26
% ./configure --enable-module=most --enable-module=so --enable-module=ssl
% make
% su
# make install
!!!設定
まず設定の前に、crt ファイル(サーバ証明書)と key ファイル(秘密鍵)を適当な場所に配置します。
この時各ファイルのパーミッションは 400 にしておく必要があります。
サーバ証明書は Verisign 等の認証局で申請すると取得できます(もちろん有料)が、独自認証局を作成して自分で証明書を発行することも可能です。
Verisign 等の認証局に申請する際には、CSR ファイル(認証書要求)を作成し、認証局に送ります。
秘密鍵や CSR の作成方法、独自に証明書を発行する方法等は [[OpenSSL]] を参照。
上記ファイルが設置できたら httpd.conf を適宜修正します。
基本的に make install すると httpd.conf は SSL 対応の設定がされているものが作られますので、これをひな形にして証明書のファイル等必要な設定を行います。
ポート番号はデフォルトでは 8443 になってますので、普通に https を使用したい時には 443 に変更する必要があります。
!!!実行方法
mod_ssl 対応でインストールした Apache には sslstart 等 SSL に対応したオプションが拡張されていますので、これを使用して起動します。
# /usr/local/apache/bin/apachectl sslstart
!!!確認方法
ブラウザでアクセスし、証明書の内容を確認するのが一般的かと思いますが、以下のようにコマンドラインでも確認可能です。
% openssl s_client -connect xxx:443
xxx は確認したいドメインです。
例えば、google.co.jp で試すとこんな感じに結果が返ってきます。
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = google.com
verify return:1
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIgNzCCHx+gAwIBAgIIMI7RBl0QaIkwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTYwODA2MTgwODA5WhcNMTYxMDI3MTc1ODAw
...
hlm3RKr5SnlEmN0+S7sMIS4xtxjx4k8UbjjuSzTIpom4NIkOkDt870QQG0uzxT9/
Y7vbP8PkbA8kuZvPnFjAhpctgKCtU41u0Qaz33f/zBtyfcHQ1U5GI7dCzrNGOfB4
eU5Rj/9z0dSNensHwSGYf+T5Gw8SC4r1qZqPRbk5gUdKsT/1wdOZHi9pzA==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 10822 bytes and written 373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: A1D10C9871BDEA9DE1FD2E699398AC72F9564FB0ADDB9B81A95A30A895E98A08
Session-ID-ctx:
Master-Key: E9EABCF6B8D5BC237C46380AFF9DB8E408C62F750F09533ED3007158D868150C4A00802BAD101E6AC1AECE8D8E151070
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 100800 (seconds)
TLS session ticket:
0000 - 3d d0 5a bb 5a 38 15 f7-df 94 19 09 f6 9e a2 3b =.Z.Z8.........;
0010 - c4 e4 ec 65 bd 25 9a f4-5e ff e8 19 35 e0 9a fb ...e.%..^...5...
0020 - 56 1f 5e 6e 51 68 12 79-6b fc 9a b3 72 6e 0d a6 V.^nQh.yk...rn..
0030 - 6c e8 fe c2 5f 4d 06 c1-df e2 94 c3 3c 59 f0 17 l..._M......<Y..
0040 - dc 8a b4 9c 62 45 d2 b3-32 c3 4d 6e b8 50 95 7d ....bE..2.Mn.P.}
0050 - 0d c9 68 ff 06 22 44 97-6e e2 91 44 7d c5 6e 96 ..h.."D.n..D}.n.
0060 - 48 75 b0 97 7c 91 c7 de-73 b3 46 19 7f f5 17 f9 Hu..|...s.F.....
0070 - 0b 88 94 d8 83 a8 1c bd-3b 09 9f fe 88 75 a2 52 ........;....u.R
0080 - b6 53 bd 57 85 c3 e2 84-0c 1e da 47 aa 02 5a e8 .S.W.......G..Z.
0090 - 04 b1 b1 c1 00 d5 5d 43-30 84 86 73 cb e3 e3 f0 ......]C0..s....
00a0 - f5 8e 66 67 ..fg
Start Time: 1471338011
Timeout : 300 (sec)
Verify return code: 0 (ok)
!!!ssl_error_rx_record_too_long
Firefoxでアクセスした際に、ssl_error_rx_record_too_longというメッセージが出て、接続できないことがあります。
このケースでは、VirtualHostの設定が間違っている可能性大です。
ちなみに私の場合は、<VirtualHost: xxx.xxx.xxx.xxx:443> -> <VirtualHost: *:443>の変更で直りました。
なお、Apache側のログとしては、以下のようなエラーログが出力されます。
[Tue Mar 10 10:36:21 2009] [error] [client xxx.xxx.xxx.xxx] Invalid method in request \x16\x03\x01
[Tue Mar 10 10:36:24 2009] [error] [client xxx.xxx.xxx.xxx] Invalid method in request \x16\x03\x01
-
FuelPHPのセッション
https://koumei2.com/wiki/1735.html
2017-05-02T16:48:53+09:00
ぷちWiki
フレームワークが備えている定番、かつ、個人的には最も便利な機能と言っても良いと思うセッション機能。
当然、FuelPHP でも備わっています。
FuelPHP でセッションを使うときのメモです。
!!!セッションの設定
条件が合致していればいきなり使うことも出来るのですが、まずは設定回りを確認してからにしましょう。
思わぬところではまることもあるので。。。
まず、fuel/core/config/session.php にある設定ファイルを fuel/app/config にコピーしましょう。
もちろん、デフォルトのままでOKという場合には不要です。
以下、設定の概要です。
適宜必要なものは変更してください。
,項目,概要
,auto_initialize,自動的に初期化してロードするか否か。デフォルトで自動なので通常はこのまま。
,driver,ドライバーの設定。cookie/file/db/memcached/redis を指定可能。(後述)
,match_ip,クライアント IP が変わった時にセッションを破棄するか否か。デフォルト false なので通常はこのまま。
,match_ua,クライアント UA が変わった時にセッションを破棄するか否か。デフォルト true なので通常このまま。
,cookie_domain{{br}}cookie_path{{br}}cookie_http_only,セッションに使う Cookie 設定。通常は特に変更不要。
,encrypt_cookie,セッションに使用する Cookie を暗号化するか否か。デフォルト true なので通常このまま。
,expire_on_close,ブラウザを閉じたらセッションを破棄するか否か。デフォルト false。用途により要設定。
,expiration_time,上記で破棄されない場合の有効期限。
,rotation_time,セッションハイジャックを防ぐためのセッション ID の自動変更間隔。false を設定すると自動変更されなくなります。
,flash_id,フラッシュセッションの識別子。通常は変更不要。
,flash_auto_expire,次リクエスト時にフラッシュセッションを自動的に削除するか否か。デフォルト true なので通常このまま。
その他まだまだありますが、ほとんどのものは変更不要です。
!!セッションドライバ
上記のドライバ設定で、デフォルトは cookie となっています。
が、cookie はサイズの問題で想定と異なる動作をすることがありますので、ある程度のサイズのセッションを使いそうであれば、cookie 以外のドライバにしておいた方が無難です。
最初に決められないようであれば、とりあえず file にしておくのも良いと思います。
ドライバを変更した際には、config/session.php の下方にあるドライバごとの設定も確認し、必要であれば変更しましょう。
!!!暗号化の設定
FuelPHP のセッション機能は内部的に暗号化クラスである Crypt クラスを使用します。
従って、Crypt の設定も行っておく必要があります。
Crypt の初回使用時に、app/config/crypt.php が自動的に生成されますので、このファイルが作成できるよう権限を与えておく必要があります。
もしくは、上記ファイルを手動で作成します。
内容は、下記のようなファイルになります。
<?php
return array(
'crypto_key' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'crypto_iv' => 'yyyyyyyyyyyyyyyyyyyyyyyy',
'crypto_hmac' => 'zzzzzzzzzzzzzzzzzzzzzzzz',
);
?>
マニュアルによると、
---
もしキーを手入力で指定する場合、キーはbase64エンコードした文字列で、デコードするために長さは4の倍数でなければなりません。
必ず正しい長さになるよう指定してください!
---
とのことです。
ちなみに、Crypt の設定がうまくいってないと、以下のようなエラーが出ることがあります。
The requested view could not be found: errors/crypt_keys.tpl
ただ、errors/crypt_keys.tpl というファイルは実際見つからないので、このエラーは謎です。。。。消えちゃった??
!!!使い方
使い方は至って簡単です。
セッションに保存。
Session::set('xxxx', array('item1' => $item1, 'item2' => $item2));
セッションから取得。
$item = Session::get('xxxx');
上記の通常のセッションとは別に、フラッシュセッションと呼ばれるものがあります。
これは、セッションに保存後一度だけ参照することが出来るというものです。
例えば何かの処理後にメッセージを表示するためだけにセッションを使用する時などは、いちいちセッションを削除しなくて良いのでなかなか便利です。
フラッシュセッションも下記のように通常のセッションと同じように使えます。
保存。
Session::set_flash('xxxx', array('item1' => $item1, 'item2' => $item2));
取得。
$item = Session::get_flash('xxxx');
-
Software RAID
https://koumei2.com/wiki/57.html
2017-04-28T16:00:14+09:00
ぷちWiki
LinuxでSoftware RAIDを組んだ時のメモです。
!!!Software RAID について
Linux では簡単に Software RAID を組むことが可能です。
最近は IDE ドライブもかなり安くなってきたので、個人で RAID を組むのもわりと現実的になってきました。
Linux での Software RAID では RAID-0 も RAID-5 も構築できますが、やはり RAID-1(ミラーリング)が一番使われることが多そうだと思うので、以下は RAID-1 を構築してみた時のメモです。
システムのバックアップをしっかりしておけばクラッシュ時の復旧も問題ないですが、RAID-1 でミラーしておけば、HDD が1台壊れても問題なくシステムは稼働するので、システムのダウンタイムを最小限に留めることができます。
結局のところ、クラッシュ時の保険と HDD を2倍用意することとの兼ね合いなんですが、ミラーする余裕がある人は RAID-1 にしてみるのもいいんじゃないでしょうか。
メールサーバや DNS サーバみたいにダウンしていると他に迷惑がかかるようなサーバは出来るだけ RAID-1 にしておいた方がいいと思います。
また、Software RAID と言われるくらいなので、当然 Hardware RAID というものもあります。
これは RAID Controller と呼ばれるチップによってハード的に RAID 構成にしてしまうというものです。
ハードウェア的なので、カーネルがその RAID Controller に対応している必要があります。
対応していない場合には、当然認識しないので使用できません。
また、Hardware RAID の場合は、デバイスの見え方(/dev/mdx とか)や監視方法等がモノによって違うので扱いにくいという側面もあります。
加えて、RAID Controller 自身の故障というファクターも増えます。
私自身は、上記の点から Software RAID の方が良いと現状では思っています。
正直言って Software RAID はけっこう面倒だと思いますが、監視が楽なのと、トラブった時の対応が Hardware RAID の場合は RAID Controller のデバイスドライバが必要だったりするのがかなりイヤなので。
!!!RAID-1 構築手順
以下、RAID-1 を構築する手順を順に並べました。
想定している環境は、現在既に稼働しているシステムが /dev/hda に入っており、それに /dev/hdb を追加し、最終的に /dev/hda, /dev/hdb を RAID-1 にするというものです。
また、本来はカーネル再構築をして RAID 関連のモジュールを全てカーネルに含めるのがベストですが、今回はあえてカーネル再構築しない方法で RAID を構築しています。
大ざっぱな流れは以下のとおりです。
1. 新ディスクに現在のシステムを全てコピー
2. 新ディスクをとりあえず RAID-1 の片側ディスクとして RAID-1 上のシステムを構成
3. 旧ディスクを RAID-1 に追加
OS は turbolinux8 で行いました。
ちなみに、私自身は何度も構築に失敗してます(/o\)
{{r 必ずシステムのバックアップを取ってから行いましょう。}}
!!新ディスクのパーティションを作成
fdisk で新ディスクのパーティションを作成します。
# fdisk /dev/hdb
{{r ここで作成したパーティションは RAID-1 にした時のパーティションになる}}ので慎重に作成しましょう。
注意は以下の2点です。
*RAID で後から追加するディスク上のパーティションは、既に存在するパーティション以上の容量を持っている必要があります。
従って、新ディスクが旧ディスクよりも容量が大きい場合には、旧ディスクで対応できる容量の範囲でパーティションを切る必要があります。
*パーティションタイプ を{{r 0xfd}}に設定します。
!!/etc/raidtab 作成
RAID の設定ファイル /etc/raidtab を作成します。
# md0 is the root array
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 32
persistent-superblock 1
device /dev/hdb1
raid-disk 0
device /dev/hda1
failed-disk 1
# md1 is the swap array
raiddev /dev/md1
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 32
persistent-superblock 1
device /dev/hdb2
raid-disk 0
device /dev/hda2
failed-disk 1
設定項目は以下の通り。
,設定項目,設定内容
,raiddev,設定する RAID のデバイス名
,raid-level,RAID のレベルを指定。RAID-1 なら 1
,nr-raid-disks,RAID を構成するディスク数
,nr-spare-disks,スペアディスクの数
,chunk-size,デバイスに書き込むことができる最小のデータ量。RAID-1 の場合は関係ないらしい。が、設定しておかないとエラーになる
,persistent-superblock,RAID デバイスを自動検出してほしい場合に指定。{{r RAID デバイスからブートする場合には自動検出が必須なので必ず指定。}}これを指定し損ねると RAID デバイス作成からやり直しになるので注意
,device,RAID デバイスを構成するディスクデバイス名
,raid-disk,上記 device の番号
,failed-disk,上記 device が無効である時に指定。この指定がある場合には device は RAID に参加しない。{{r 各 RAID デバイスの最後が failed-disk 指定になっているところに注意。}}これが raid-disk 指定だと旧ディスクも RAID 作成時に RAID に参加してしまい、旧ディスクの内容が破壊される
!!RAID 作成
以下のコマンドを実行します。
# mkraid /dev/md0
# mkraid /dev/md1
新ディスク上のパーティションに既に Linux のパーティションがあったりすると、上記コマンドはエラーとなります。
この時は -f 付きで mkraid を実行します。
実はこれでもエラーとなるのですが、ここで表示されている通りにすることで mkraid が成功します。
ちなみに、具体的な方法はコメントによると、書いてはいけないらしいので書けません。悪しからず(^_^;
mkraid が成功すると、/proc/mdstat に RAID の情報が出力されるので、ここでちゃんと RAID が作られたかチェックします。
旧ディスクの方は failed-disk 指定なので、当然 2 デバイスのうちの片方しか RAID に参加していません。
!!ファイルコピー
まず、RAID にした時にルートデバイスとなるパーティション(他にも Linux パーティションを作成するのであれば、その全て)にファイルシステムを作成します。
# mke3fs /dev/md0
その後、作成した RAID ファイルシステム上に全てのファイルをコピーします。
# mount /dev/md0 /mnt
# cd /
# cp -a (/mnt, /tmp, /proc, /lost+found 等以外) /mnt
# cd /mnt
# mkdir tmp proc mnt
また、swap も RAID にするのであれば、swap も作成しておきます。
# mkswap /dev/md1
!!起動ディスク作成
いきなり HDD の MBR を変更して RAID デバイスからのブートにするのは危険すぎるので、まず一度起動ディスクを作成し、そこから RAID デバイスでブートしてみます。(新ディスクの方の MBR だけ変更して、新旧のディスクを入れ替えて /dev/hda からブートしてみるというのはありかも)
ブート時に RAID デバイスを自動検出するために RAID 対応の initrd を作成します。(※カーネル内に RAID 機能を含んでいる場合には必要なし。が、たいていのカーネルはモジュールとして RAID 機能を読み込んでいるので、通常はカーネル再構築しない限り含まれていない)
# mkinitrd --with=raid1 /mnt/boot/initrd_raid 2.4.18-1
もし、SCSI HDD 等ブート時に読み込む必要のあるモジュールがある場合には、合わせて initrd に含めておきます。
次に、RAID 用の lilo の設定をします。
# vi /mnt/etc/lilo.conf
# fdformat /dev/fd0H1440
# lilo -r /mnt
上記の fdformat は必須ではないですが念のため。
/mnt/etc/lilo.conf の内容は以下のような感じになります。
disk=/dev/md0
boot=/dev/fd0
map=/boot/map-fd # map ファイルは分けておいた方が安全
install=/boot/boot.b
image=/boot/vmlinuz
root=/dev/md0
read-only
label=LinuxRaid
initrd=/boot/initrd_raid
!!fstab 修正
RAID 上の fstab を RAID 上のファイルシステムを使用するように修正します。
/dev/md0 / ext3 defaults 1 1
/dev/md1 swap swap defaults 0 0
ついでに RAID 上の rc.sysinit の Add raid devices の部分をコメントにしておくといいかも。
別にしなくても問題はないですが、RAID デバイスはブート時に自動検出されるので、rc.sysinit で RAID を有効にする必要はないです。
ここまで作業が終わったら、作成した起動ディスクで起動してみます。
df やら cat /proc/mdstat やら cat /proc/swap やらで RAID が有効になっているかどうかチェックします。
また、その他のシステムも今まで通りの状態であるかを厳密にチェックします。
{{r これ以降のステップに進んでしまうと後戻りは出来ません。}}
この状態であれば、普通に起動すれば前の状態で起動されるので、慎重にチェックを行ってください。
!!旧ディスクを RAID に追加
ここまでで新ディスクのみの RAID は構築できているので、いよいよ旧ディスクを RAID に追加します。
旧ディスクを新ディスクと同様に(またはそれぞれのパーティションを多めに)パーティションを作成します。
パーティションタイプを{{r 0xfd}}にするのも同様です。
パーティションを作成したらそれぞれのパーティションを RAID デバイスに追加します。
RAID デバイスに追加するには、/etc/raidtab 内の{{r failed-disk を raid-disk に修正}}し、raidhotadd コマンドを実行します。
# fdisk /dev/hda
# vi /etc/raidtab
# raidhotadd /dev/md0 /dev/hda1
# raidhotadd /dev/md1 /dev/hda2
コマンド実行後は自動的に RAID 間の同期が始まります。
同期の進行具合は cat /proc/mdstat で確認できます。
!!ブート情報を設定
lilo.conf.hda, lilo.conf.hdb を作成し、それぞれの HDD に対してブート情報を書き込みます。
# vi /etc/lilo.conf.hda
# vi /etc/lilo.conf.hdb
# lilo -C /etc/lilo.conf.hda
# lilo -C /etc/lilo.conf.hdb
hda用のlilo.confは以下のようになります。
hdb 用であれば、boot=/dev/hdbとなります。
disk=/dev/md0
bios=0x80
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
linear
image=/boot/vmlinuz
root=/dev/md0
read-only
label=LinuxRaid
initrd=/boot/initrd_raid
あとは、双方からブートできるかをチェックするだけです。
ちなみに、両方とも bios=0x80 指定なので1番目の HDD として起動されることを想定しています。
!!リンク
さらに詳しい話は以下のJFドキュメントが参考になります。
*[The Software-RAID HOWTO|http://www.linux.or.jp/JF/JFdocs/The-Software-RAID-HOWTO.html]
*[Boot + Root + Raid + Lilo : Software Raid HOWTO|http://www.linux.or.jp/JF/JFdocs/Boot+Root+Raid+LILO.html]
*[LILO "the Linux Loader" の動作について|http://www.linux.or.jp/JF/JFdocs/inside-lilo.html]
!!!障害について
RAID上のHDDでハードウェア障害が発生した、もしくはRAID上で何らかの障害が発生してRAIDを構成しているHDDのうち1つがofflineとなったといったようなケースは/proc/mdstatを監視することで発見することができます。
従って、RAIDを構築した後は/proc/mdstatを監視することにより障害検知するような仕掛けをしておくことをおすすめします。
さて、実際にそのような障害が発生した時、つまりRAIDを構成しているHDDのうちの1つがofflineとなった場合について、私が実際経験した2つのパターンを紹介します。
!!HDD障害
HDDがハードウェア障害となった場合には当然HDDを交換するしかありません。
そのハードウェアにもよりますが、通常は電源をオンにしたままHDDを交換してOSに認識させることはできないので、一度電源を切ってから障害が発生したHDDを新しいものに交換します。
交換後OSを起動してパーティションを以前のディスクと同様に切ります。
その後、raidhotaddを使用してRAIDに追加します。
raidhotadd実行後は自動的にRAIDの再構築が開始されます。
再構築時は非常に負荷が高くなるので、その辺りを考慮してサービスを適宜停止したりした方がよいですが、基本的には通常通りサービスを稼働させながらでもOKです。
!!RAID不整合
予期せぬ電源断等により、RAIDを構成しているHDD同士でデータが不整合となることがあります。
この場合、起動時に以下のようなRAIDを構築できないというメッセージが表示されます。
md: considering hdc3 ...
md: adding hdc3 ...
md: adding hda3 ...
md: created md2
md: bind<hda3,1>
md: bind<hdc3,2>
md: running: <hdc3><hda3>
md: hdc3's event counter: 00000010
md: hda3's event counter: 00000009
md: superblock update time inconsistency -- using the most recent one
md: freshest: hdc3
md2: kicking faulty hda3!
md: unbind<hda3,1>
md: export_rdev(hda3)
md: md2: raid array is not clean -- starting background reconstruction
md: RAID level 1 does not need chunksize! Continuing anyway.
md2: max total readahead window set to 124k
md2: 1 data-disks, max readahead per data-disk: 124k
raid1: device hdc3 operational as mirror 1
raid1: md2, not all disks are operational -- trying to recover array
raid1: raid set md2 active with 1 out of 2 mirrors
md: updating md2 RAID superblock on device
md: hdc3 [events: 00000010]<6>(write) hdc3's sb offset: xxxxxxxxxxx
md: recovery thread got woken up ...
md2: no spare disk to reconstruct array! -- continuing in degraded mode
md: recovery thread finished ...
/proc/mdstatを確認すると、片側のHDDがofflineとなっているはずです。
既にメッセージで書かれている通り自動的には復旧できない状態となっており、これもRAIDを再構築するしかないようなので、raidhotaddでofflineとなったディスクを明示的にRAIDへ追加します。
raidhotadd実行後は自動的にRAIDの再構築が開始されます。
-
他のサイトのコンテンツを ASP で取得する
https://koumei2.com/wiki/50.html
2017-04-28T15:31:51+09:00
ぷちWiki
ASP を使って他のサイトのコンテンツを取得する方法についてです。
※ ASP なので、非常に古い情報です(^_^;
以下の5つの方法が考えられます。
・BASP21 を使用
・IE オブジェクトを使用
・WinInet を使用
・WinSock, SSPI を使用
・MSXML2 を使用
!!!BASP21 を使用
BASP21 はライセンスフリーなライブラリです。公式サイトは[こちら|http://www.hi-ho.ne.jp/babaq/basp21.html]。
しかも、単に HTTP 通信だけできるのではなく、FTP, メールの送受信等をはじめ数多くの機能を持っています。
とても便利なライブラリなので、これを使用して解決できるのであれば、迷わず BASP21 を使った方がいいですね。
ただし、業務での開発といった場合には、BASP21 はソースが公開されているわけではないので、少々使うには支障があります。
BASP21 にバグがあった場合には修正することも出来ず、かといってライセンスフリーなライブラリですのでサポートに期待することもできません。
というわけで、私の場合には BASP21 を使わず、自力で解決することになったのでした。
また、BASP21 では HTTPS 通信には対応していません。
これも業務での開発には問題になりがちですね。
ということで、実際には BASP21 を使ったことがないので紹介だけ(/o\)
!!!IE オブジェクトを使用
自力で作るのであれば、一番簡単なのは IE オブジェクトを使う方法です。
以下のようなとても簡単なコードでコンテンツを取得できます。
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate ("http://www.yahoo.co.jp")
For i = 0 To 10000
If ie.ReadyState = 4 Then
Exit For
End If
Next
Set obj = ie.Document
'src に HTML のソースを入れる
src = obj.body.outerHTML
ただ、この方法だと IE のオブジェクトを作成するのでとても重いです。
For 文中で Sleep を入れたりすれば多少はマシになるかもしれませんが、高々 HTTP 通信するだけでこんなに重いのは割に合わないというものです。
従って、この方法は、ちょっと試しに他のサイトのソースを取ってくる部分を実装してみるくらいの用途しか使えないと思います。
!!!WinInet を使用
wininet.dll の API を使って通信をするという方法です。
wininet.dll はそのままでは ASP からは使えないので、Active X 化する必要があります。
以下のような VB のコードを Active X コンポーネントにし、そのコンポーネントを ASP から呼び出せば、他のサイトのコンテンツを ASP 内で取得できます。
※さらに詳細なコードは[ダウンローダーを作る|http://hp.vector.co.jp/authors/VA014315/vbdown.htm]を参照。
※Internet 関連の関数については[General Internet Functions|http://www.geocities.jp/wininet_dll_jp/comment.html]をどうぞ。
Public Function Post(url As String) As String
ih = InternetOpen("User Agent", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hFile = InternetOpenUrl(ih, _
url, _
vbNullString, _
0, _
INTERNET_FLAG_RELOAD, _
0)
Dim buf As String * 2048
flag = True
While flag
buf = vbNullString
flag = InternetReadFile(hFile, buf, Len(buf), rsize)
sBuffer = sBuffer &Left$(buf, rsize)
If Not CBool(rsize) Then flag = False
Wend
'InternetCloseHandle ihorh
'InternetCloseHandle ich
InternetCloseHandle hFile
InternetCloseHandle ih
Post = sBuffer
End Function
ただし、これも1つ重大な問題点があります。
wininet.dll 自体が、サービス上での動作をサポートしていません。
詳しくは、[[INFO] サービスでは WinInet の使用はサポートされない|http://support.microsoft.com/default.aspx?scid=%2Fisapi%2Fgomscom%2Easp%3Ftarget%3D%2Fjapan%2Fsupport%2Fkb%2Farticles%2Fjp238%2F4%2F25%2Easp&LN=JA]を参照してください。
簡単に言えば、自作ブラウザのようにクライアントとなるようなアプリケーションでは使用できるが、IIS 上で動く ASP のようにサービス上で動くプログラムの場合には動作が保証されない、ということです。
試してみた感じでは正常に動きますが、長時間連続稼働を考えると怖くて使えません。
ただ、手っ取り早く作りたい場合にはこれはかなり使えると思います。
!!!WinSock, SSPI を使用
おそらく、これが一番正当なやり方です。
が、めちゃめちゃ面倒ですし、難しいです。
SSL を使用しないのであれば WinSock のみなので、これだけならまだ楽かな?
あまりに面倒だったので、ここでは紹介しません(/o\)
MS のサイトからサンプルコードが得られますので、これを元に作ります。
!!!MSXML2 を使用
結局私が使った方法がこれ。
使い方は簡単なのですが、これだと厳密には XML を取得することになるので、応用が利かないかも。
Dim oXmlHttp
Set oXmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
Call oXmlHttp.open("POST", url, False)
Call oXmlHttp.send(data)
この後、
html = oXmlHttp.responseText
とすると、コンテンツの内容が取得できます。
ちなみに、url には https が頭に付くような URL を指定すれば勝手に SSL 通信をしてくれますので何も考えなくてもよいです。
また、
oXmlHttp.status
で、HTTP のレスポンスコードを取得できます。
-
FuelPHP+PostgreSQLでORMを使うとINSERT時にIDが取得できない
https://koumei2.com/wiki/1734.html
2017-04-28T14:55:40+09:00
ぷちWiki
FuelPHP の ORM を継承した Model クラスを作成します。
通常、このクラスを使って new して save() しますが、PostgreSQL を使っていると、この時に Insert して登録された ID がオブジェクトに登録されません。
例えば、new して save() して、その後そのオブジェクトをさらに変更を加えたりした場合、
Undefined index: id in /data/project/lightly/fuel/packages/orm/classes/model.php on line 1441
こんなエラーが出たりします。
また、ID が登録されないという現象なので、has_many 等でリレーション設定している場合には、以下のようなエラーが出たりもします。
Invalid Model instance added to relations in this model. in /data/project/lightly/fuel/packages/orm/classes/hasmany.php on line 141
要するに、ほとんど PostgreSQL 環境下では FuelPHP の ORM は使いものになりません。
というか、根本は DB::query にあるようなので、 Crud でも同様の現象が起きると思いますし、DB::query で INSERT 時に ID を取得しようとしても取得できないと思います。
!!!問題の原因
INSERT 時の挙動を調べてみると、INSERT 直後に PDO の lastInsertId() を使用して該当 ID を取得し、それをオブジェクトに登録するような仕掛けとなっていました。
ところが、lastInsertId() は PostgreSQL では正常に機能しません。
PostgreSQL で使用するには、lastInsertId() のパラメータとしてシーケンス名を指定する必要があるようです。
FuelPHP では、この対応が行われていないため、PostgreSQL を使うと冒頭の問題が発生します。
!!!対策
Web 上で調べてみるといろいろと対策が記載されているのですが、意外と ORM でのスマートな対応が見つからなかったので、私が行った対策を紹介しておきます。
概要としては以下となります。
・ID の取得は PDO の lastInsertId() をやめて、PostgreSQL の LASTVAL() で取得するようにする
・上記の対応のため、fuel/core/classes/database/pdo/connection.php を修正する必要があるので、拡張クラスを作成する
以下、詳細です。
まずは拡張クラスを作成します。
path は適当で良いですが、例えば fuel/app/classes/core/connection.php とします。
内容ですが、この拡張クラスは以下のように \Fuel\Core\Database_PDO_Connection を継承するようなクラスとします。
class Database_PDO_Connection extends \Fuel\Core\Database_PDO_Connection {
public function query($type, $sql, $as_object) {
...
次に、修正箇所は query() メソッドとなるので、query() メソッドの内容を fuel/app/classes/core/connection.php からごっそりコピペします。
その上で、以下のように LASTVAL() を使うように修正します。
elseif ($type === \DB::INSERT) {
// Return a list of insert id and rows created
$r = $this->_connection->query('SELECT LASTVAL()')->fetch(PDO::FETCH_NUM);
return array(
//$this->_connection->lastInsertId(),
$r[0],
$result->rowCount(),
);
}
最後に、この拡張クラスを bootstrap.php でオートローダーに設定します。
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' => APPPATH.'classes/view.php',
'Database_PDO_Connection' => APPPATH.'classes/core/connection.php',
));
これで正常に ID が取得できるようになります。
-
Goutte
https://koumei2.com/wiki/1732.html
2017-04-12T16:32:50+09:00
ぷちWiki
Goutte(ゲットと発音するらしい)は、PHP でいわゆるスクレイピングするためのパッケージです。
!!!インストール
[[Composer]] を使ってインストール可能なので、とても楽ちんです( ̄ー ̄)
% composer require fabpot/goutte
だけでOKです( ̄ー ̄)
!!!使用方法
以下のような感じです。
autoloader.php を読み込みつつ、Goutte\Client を use し、あとはインスタンスを作ったら request() で HTTP リクエストを投げるような手順ですね。
require_once '../vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$cw = $client->request('GET', 'http:/xxxx.com/xxx.html');
$a = $cw->html();
とても簡単ですね。
GET だけでなく、以下のように POST ももちろん可能です。
$cw = $client->request('POST', 'http:/xxxx.com/xxx', array('param1' => 'test'));
また、上記では単に HTML 形式で取得した内容を $a に格納していますが、この部分はフィルターをかけたりいろいろと出来るようです。
ある程度のパース処理は Goutte の方で装備されているので、特定のタグの内容を取得するレベルであれば簡単に書けます。
なかなかよく出来ていますね~
!!!日本語対応
詳しいところまでは追っていないのですが、UTF-8 についてはきちんと対応できているように思えます。
ただ、そのままだと HTML エンコードされた状態でコンテンツが取得されるようなので、PHP コード内で処理するには以下のようにデコードする必要があるようです。
$b = html_entity_decode($a, ENT_QUOTES, 'UTF-8');
ただ、、、、UTF-8 は今のところ上記で問題ないのですが、Shift-JIS のページだと問題が起きます。
具体的には、、、一部のみ文字化けが発生します。
ということで、、、自分的には Goutte を使うのはまだ時期尚早かな~という印象です。
使いやすいので限定的には使えると思いますが、小回りを利かせる必要があるのであれば、Perl の [[WWW::Mechanize]] を使う方がいいかな、と思いました。
-
WWW::Mechanize
https://koumei2.com/wiki/1733.html
2017-04-12T16:31:47+09:00
ぷちWiki
WWW::Mechanize は、Perl でスクレイピングする際に便利なパッケージです。
例によって、cpan でインストール可能です。
!!!使い方
WWW::Mechanize は、LWP::UserAgent のサブクラスという位置づけですので、LWP::UserAgent の機能が基本的に使用できます。
簡単な使い方は以下のような感じです。
requests_redirectable の指定は LWP::UserAgent のパラメータですね。
use WWW::Mechanize;
my $mech = WWW::Mechanize->new( requests_redirectable => [ 'GET', 'POST' ] );
$mech->get('http://xxx.com/xxx.html);
my $form = $mech->form_id('form1') or die;
$form->action('http://xxx.com/xxx_form.html');
$form->param( name => 'test1' );
$mech->submit;
インスタンスを生成して URL を読み込んだ後の処理は様々なことが出来るようなので、詳細は perldoc を参照ということで(^_^;
-
EPELリポジトリ
https://koumei2.com/wiki/1731.html
2017-04-12T15:35:12+09:00
ぷちWiki
EPEL は、CentOS 等 RHEL 系向けの yum のリポジトリです。
デフォルトリポジトリには無い rpm を yum で管理することが出来ます。
詳細は公式サイトをどうぞ。
https://fedoraproject.org/wiki/EPEL/ja
!!!使用方法
まずは、epel-release パッケージを登録する必要があります。
環境に合致する epel-release が公式サイトで選択可能ですので、ダウンロードもしくは直接指定して登録します。
# rpm -i https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
追加したリポジトリの設定を行います。
以下のファイルが設定するファイルになります。
/etc/yum.repos.d/epel.repo
[epel] ディレクティブを確認します。
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
こんな感じになっているかと思いますが、上記の enabled を 0 に設定すると、通常は使わないリポジトリとなります。
その場合には、EPEL リポジトリを使用したい場合には明示的に指定する必要があります。
# yum --enablerepo=epel ...
ちなみに、私が EPEL を使用しているのは smbldap と [[rdiff-backup]] を使っているためです。
特に rdiff-backup は EPEL でインストールしないとけっこう面倒。。。
!!!SSL接続でエラーが出る場合
いまいち原因不明なのですが、EPEL に接続する際に以下のような SSL の問題が起きることがあります。
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64 error was 14: problem making ssl connection
対象方法は、nss パッケージをアップデートすることな模様。
情報元は以下のサイトです。
http://qiita.com/nagais/items/6a6431ca5137f18bf054
実際、自分の環境では以下で解消しました。
# yum update nss
-
WebService::Livedoor::Weather
https://koumei2.com/wiki/810.html
2017-04-11T16:32:47+09:00
ぷちWiki
!!!概要
[[Livedoor Weather Web Service]]のPerlモジュール。
一応公式サイト?は[ここ|http://blog.nomadscafe.jp/archives/000603.html]?
{{r ※重要}}
{{r 2013/04/04 より XML による配信が終了したため、下記の情報は基本的には古い情報となっています。}}
{{r 詳細は JSON 対応の項を参照。}}
!!!インストール
CPANから取得可能。
特別なことは何もないです。
!!!使用方法
とても簡単です。
以下のような感じ。
use WebService::Livedoor::Weather;
my $lwws = WebService::Livedoor::Weather->new;
my $ret = $lwws->get($city_code, $day);
$retに[[Livedoor Weather Web Service]]で取得可能なXML要素が格納されて返ってきます。
XML要素の詳細は[[Livedoor Weather Web Service]]を参照。
上記の $city_code には都市を指定するコードが入ります。
都市とコードの対応は、http://weather.livedoor.com/forecast/rss/forecastmap.xmlを参照。
$day で、取得したい天気予報の日を指定します。
現状で指定可能なのは、today(今日)/tomorrow(明日)/dayaftertomorrow(明後日)です。
なお、WebService::Livedoor::Weatherではutf-8フラグが立ってしまうようなので、utf-8フラグを明示的に落としてやる必要があります。
$ret以下の全ての値に対して一々フラグを落とす処理をするのは面倒なので、何も考えずに以下の処理を入れておくのがおすすめです。
Unicode::RecursiveDowngrade->new->downgrade($ret);
詳細は、[[utf-8フラグ]]、[[Unicode::RecursiveDowngrade]]を参照。
!!!JSON対応
2013/04/05 現在、XML による配信が終了し、JSON のみの配信となったようです。
WebService::Livedoor::Weather は、XML による配信が前提として作られていましたので、作動しなくなってしまいました(◞‸◟)
しかし、以下の github で早速 JSON 対応のモジュールがブランチされているので、これを使えば JSON 形式の配信に対応することが可能です。
https://github.com/kazeburo/WebService-Livedoor-Weather
が、JSON 形式にすると構造やフィールド名が微妙に変わってしまっているのと、city_idが全面的には変更となったため、WebService::Livedoor::Weather を入れ替えただけでは動きません。
関連する箇所を全て修正する必要があります。
!!!参考
WebService::Livedoor::Weatherを使って遊びで作ったページ。
[天気予報|/weather/index.html]
-
Livedoor Weather Web Service
https://koumei2.com/wiki/800.html
2017-04-11T16:32:18+09:00
ぷちWiki
!!!概要
Livedoor Weather Web Serviceは、ライブドアが提供する天気予報のWebサービスです。
パラメータで地域と予報日を指定して、指定された URL にリクエストを投げると XML でデータが返ってくるという仕掛けになっています。
詳細は以下を参照。
http://weather.livedoor.com/weather_hacks/webservice.html
ちなみにこれを使って遊びで作った[天気予報サイト|/weather/index.html](/_\;)
{{r ※2013/04/05追記}}
{{r XML での配信はサポートされなくなったようで、現時点では JSON のみの配信となったようです。}}
{{r フィールド名、構造、city_id 等々にも変更が入ったので、旧仕様とは基本的には互換性がありません。ご注意ください。}}
!!!レスポンスデータ
XMLで返ってくるデータは以下の仕様になっています。
,タグ名,内容
,link,livedoor 天気情報のURL
,forecastdate,予報日
,location,予報を発表した地域を定義{{br}}area:地方名(例・九州地方){{br}}pref:都道府県名(例・福岡県){{br}}city:1次細分区名(例・八幡)
,pinpoint,ピンポイント天気予報。pinpointの子要素として複数のlocation要素があり、location要素は以下の要素を持つ。{{br}}title:市区町村名{{br}}link:対応するlivedoor 天気情報のURL{{br}}publictime:ピンポイント天気予報の発表時間
,version,livedoor Weather Web Serviceのバージョン
,copyright,コピーライト。子要素等繰り返し有り
,publictime,予報の発表日時
,author,制作者(livedoor Weather Team.)
,description,天気概況文。文字制限があるらしいのと、PRが入るのがlivedoorの概況文と異なる模様
,image,天気アイコン画像。以下の要素を持つ。{{br}}title:天気(晴れ、曇り、雨など){{br}}link:リクエストされたデータの地域に該当するlivedoor 天気情報のURL{{br}}url:天気アイコンのUR{{br}}width:天気アイコンの幅{{br}}height:天気アイコンの高さ
,telop,天気(晴れ、曇り、雨など)
,day,曜日
,title,タイトル・見出し
,forecastday,予報日。today/tomorrow/dayaftertomorrowの3種
,temperature,気温。最高気温(max)、最低気温(min)の要素を持ち、max/minはそれぞれ摂氏(celsius)/華氏(fahrenheit)の要素を持つ
!!!その他
Perlで使うなら[[WebService::Livedoor::Weather]]が便利です。