SSL設定

SSLのチェック

https://www.ssllabs.com/ssltest/index.html

B判定で警告がでてきました。

This server uses SSL 3, which is obsolete and insecure. Grade capped to B.

# SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
#SSLProtocol all -SSLv2
SSLProtocol all -SSLv2 -SSLv3

This server accepts RC4 cipher, but only with older protocols. Grade capped to B.

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5:!RC4

Raspberry pi 3 初期設定

OSの準備

・日本のミラーサイトからダウンロード
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

・今回は下記zipを使用
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2017-09-08/2017-09-07-raspbian-stretch.zip

win32diskimagerでSDに書き込み[Windowsの場合]
ソフトは下記サイトから取得
https://forest.watch.impress.co.jp/docs/review/1067836.html

後はラズパイに指して起動するだけ。

環境の構築

アップデート処理
sudo apt-get update
APTライブラリのインデックスを更新します。
この更新をするとapt時の取得先が日本のJAISTさんになるようです。
これをしておかないとvimのインストールでこけます。

既存のvimの削除
sudo apt-get --purge remove vim-common vim-tiny

vimのインストール
sudo apt-get install vim

sambaのインストール
sudo apt-get -y install samba
バージョンの確認
smbd -V
Version 4.5.12-Debian

sudo vi /etc/samba/smb.conf
//末尾に追記
[pi]
comment = Raspberry Pi
path = /home/pi
guest ok = yes
read only = no
public = yes
browsable = yes
force user = pi

sudo /etc/init.d/samba restart

globalsign ssl pfx 変換

[秘密鍵]
openssl pkcs12 -in example.pfx -nocerts -nodes -out globalsign.key
[証明書]
openssl pkcs12 -in example.pfx -clcerts -nokeys -out globalsign.cer
[中間CA証明書]
ダウンロードする

iOSアプリの審査でIPv6環境でwebviewが真っ白だということでリジェクトされる

過去の作ったアプリのバージョンアップ申請をしました。

今回は過去に制作したアプリの最新OSへの対応ということでバージョンアップ申請をしてみました。
開発環境では正常に動いており、コード部分も問題がなさそうなのでitunesconnectにアップロードしました。

1.IPv6環境にてwebviewが正常に表示されないということでリジェクトされる。

アップルは2016年から審査にIPv6環境での動作チェックも含みますと宣言していたのでIPv6環境で正常に動作するかチェックが行われるようです。

今回、そのIPv6環境での動作に問題があるということでリジェクトされたみたいです。

1.アップルさんの回答

Performance - 2.1

We discovered one or more bugs in your app when reviewed on iPad running iOS 10.2.1 on Wi-Fi connected to an IPv6 network.

Your app displays blank page upon launch.

The steps to reproduce are:

1. Launch the app
2. Blank page is displayed

Please see attached screenshots for details.

Next Steps

Please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, then revise and resubmit your app for review.

If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.

Resources

For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking.

2.IPv6時に動作しないコードやIPv4のIPアドレスなどがないかチェック

IPv6時に動作しないコードやIPv4のIPアドレスなどがないかチェックしました。
コードは問題ないようです。

4.そもそもIPv6とか関係なくないか?

やれることがなくなってしまったので、じっくりと考えてみました。
そもそもIPv6環境だろうがIPv4環境だろうが現在正常に動いているのであれば問題ないのではないか?

IPv6環境からの名前解決は下記の順番

1、IPv6で名前解決
2、あれば終了。なければ3へ
3、IPv4で名前解決
4、Ipv6のローカル用にIpv6に変換してiPadに返す

やはり考えてみるとIPv4環境で名前解決ができていればIpv6環境でも名前解決するはず。

5.それでは何をチェックするべきなのか

1、IPv6環境でも動くソースコードになっているかチェック
2、IPv4環境でアクセスできていて正常動作しているかチェック
3、Appleさんが公開しているIpv6環境で正常に動くかチェック

この3つをチェックして大丈夫であれば、原因はAppleの審査環境でのネットワークの問題ではないだろうか。

Googleで色々調べていると再度審査をお願いすると通ったりするらしい。

つまりDNS64/NAT64 Transitionalが正常に動作していないのだろう。

6.実際にはどのようにして審査を通したか

ソースコードも環境もこちらでは問題ありませんでした。
どうしたらいいのかわかりませんでしたが、そのままの文面でAppleにコメントを返しました。
「推奨されている方法でIPv6環境を構築しチェックをかけたが正常に動作しています。ほかに考えられる問題はありますか?」

すると。。。。

7.Appleさんからの回答

Hello,

Thank you for your response. We will continue the review, and will notify you if there are any further issues.

Best regards,

App Store Review

また問題があれば連絡するよ。とりあえず審査してみるわ風な回答がきました。

8.まとめ

Appleさんから新しくコメントをもらってすぐにPending Developer Releaseになり無事審査を追加しました。

この場合DNSの問題などもあるので色々とやっかいですが、トラブルシューティング自体はそんなに難しくないと思います。

100%審査を通すならIPv6の割り当てられているサーバーでIPv6の名前解決が正常にできる環境がいいでしょう。
Appleの環境に左右されないので。

ただ、サーバー側を管理や選定が自分の会社ではない場合は多いはずです。

その場合は必要なチェックをかけAppleにチェック結果を報告し、いい担当者(いい審査環境?)にあたるのを待つしかないのかもしれません。

ProLiant ML310e Gen8 v2にCentOS7のインストール

社内サーバーを数年交換しておらず数年前に買って動かしていなかったサーバー[ProLiant ML310e Gen8 v2]があったのでサーバーをリプレイスすることにしました。
正直当時どういう内容で発注したか全然記憶になかったので箱から出して手探りでの構築です。

ホットスワップ対応のHardRaidを別で購入してあったらしいのですが、うまくつかないのでもともとついていたB120iのRaidで制作しようと思います。

B120i RAID Controllerを使用したいのですが、問題が発生しました。

CentOSが論理ドライブを認識せず物理ドライブを認識してしまう。。。。

Google先生に聞いてみるとドライバをあてれば認識するらしいので挑戦してみました。

CentOSはこれを使用
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1611.iso
普段はネットインストールをするのですが、ドライバーをあてる際に問題になってしまっても困るのでイメージでインストールしようとおもいます。
rufusでISOをUSBに書き込み

CentOSのバージョンによって
http://downloads.linux.hpe.com/SDR/repo/spp/RedHat/7/x86_64/current/hpvsa-1.2.16-102.rhel7u3.x86_64.dd.gz
これを解凍して下記ファイルを出します。
hpvsa-1.2.16-102.rhel7u3.x86_64.dd
この拡張子を
hpvsa-1.2.16-102.rhel7u3.x86_64.isoに変更してFAT32でフォーマットしたUSBにコピーします。

CentOSのインストール画面が出たらESCを押してコマンドモードに
boot:linux modprobe.blacklist=ahci inst.dd
と入力してドライバーの入っているUSBを選択します。

参考にしたサイト
URL:http://josafatisai.blogspot.jp/2016/01/installing-centos-7-on-hp-proliant.html

post送信した内容がかける[max_input_varsの設定]

post送信した内容をPHPで取得すると項目数が少ない!

この問題は過去の案件でも何度かあったんですが、想定していたpost数よりも多くpostしていることがあり、過去の案件のお客様からのご連絡で判明することがありました。
postの項目数をなるべく少なくしてプログラムを組まなきゃいけないんですが、どうしてもこの制限を超えてしまうことがあります。
内容の確認・設定の仕方をまとめておきたいと思います。

現在の設定の確認

max_input_varsはPHP5.3.9から導入されたらしいんですが、5.3.3でもこの制限にひっかかることがあります。
デフォルトでは1000に設定されていました。

まず現在の設定を確認しましょう。
通常php.iniにデフォルト値が書いてありますが、5.3.3ではphp.iniに書いてありませんでした。
てっとり早い方法はinfo.phpを作成してサーバーにアップロードしてアクセスしてください。
現在の設定が表示されたらmax_input_varsという項目を探します。
info.php

  phpinfo();

※レンタルサーバー上にある場合はレンタルサーバーのコンパネでphp.iniの設定を見れるところが多いのでそこで探すのも方法の一つです。

max_input_varsの変更

ここでは2種類の設定方法をご紹介いたします。

.htaccessで設定

php_value max_input_vars 2000

php.iniで設定

max_input_vars = 2000

値が変更されたか確認

上記内容で値を変更した場合は再度info.phpにアクセスして値が更新されていることを確認してください。

まとめ

postの項目数が少ないにこしたことはありません。
なるべく項目数が少なくシステムが稼働するように組むことは原則です。
ですが、案件や内容によってはどうしても1000件を超えてしまう場合はあると思います。
その場合は納品前にmax_input_varsの件数をもともと増やしておくことをおすすめします。

社外向けFTPユーザーの追加

CENTOS
VSFTPD

社外向けFTPユーザーの追加

ディレクトリ指定
suログイン無
useradd -d /var/www/html -s /sbin/nologin username

パスワードの設定
passwd username
Changing password for user xpadmin.
New UNIX password:
Retype new UNIX password:

Cakephp 2.X 日付型の文字列変更 form date controller

CakePHPでformで入力されたdate型のデータがcontrollerでは下記のように配列できてました。
これを処理する際に配列から文字列への変更をする方法が何個かあるんですが、
元々用意されている関数を使うと下記のような処理の仕方になると思います。

単一フィールド
$this->request->data["Post"]["post_date"] = $this->Order->deconstruct("post_date",$this->request->data["Post"]["post_date"]);
一括
$this->request->data = $this->Post->create($this->request->data["Post"]);
このやり方が一番スマートな方法なのかどうかはなんともいえませんが。。。

Cakephp 2.X 文字列の変換ユーティリティ 複数形 単数形 大文字

今日はCakePHPのInflectorユーティリティのメモです。

これを使うと色々効率よく関数を書けるのでたまに使用しております。

[php]
$name = Inflector::pluralize($singular);
入力: Apple, Orange, Person, Man
出力: Apples, Oranges, People, Men
[/php]

[php]
$name = Inflector::singularize($plural)
入力: Apples, Oranges, People, Men
出力: Apple, Orange, Person, Man
[/php]

[php]
$name = Inflector::camelize($underscored)
入力: Apple_pie, some_thing, people_person
出力: ApplePie, SomeThing, PeoplePerson
[/php]

[php]
$name = Inflector::underscore($camelCase)
underscoreはキャメルケースの文字列をアンダースコア(_)に変換します。
入力: applePie, someThing
出力: apple_pie, some_thing
[/php]

[php]
$name = Inflector::humanize($underscored)
入力: apple_pie, some_thing, people_person
出力: Apple Pie, Some Thing, People Person
[/php]

[php]
$name = Inflector::tableize($camelCase)
入力: Apple, UserProfileSetting, Person
出力: apples, user_profile_settings, people
[/php]

[php]
$name = Inflector::classify($underscored)
入力: apples, user_profile_settings, people
出力: Apple, UserProfileSetting, Person
[/php]

[php]
$name = Inflector::variable($underscored)
入力: apples, user_result, people_people
出力: apples, userResult, peoplePeople
[/php]

[php]
$name = Inflector::slug($word, $replacement = ‘_’)
slugは特殊文字をラテン文字に変換したり、スペースをアンダースコアに変換します。slugはUTF-8を前提とします。
入力: apple purée
出力: apple_puree
[/php]

Cakephp 2.X Modelの論理削除の実装

自社のサイトを更新していたらブログを全然書いていないことに気付いたのでたまにはメモ書きしようと思います。

今回は、CakePHP2.X系で論理削除を実装する流れです。

何件かbehaviorがあるようですが今回はCakeDCという所のBehaviorを紹介します。

1、まずbehaviorをダウンロードして/Model/Behaviorディレクトリにいれます。(MITライセンス)
https://github.com/CakeDC/utils/blob/master/Model/Behavior/SoftDeleteBehavior.php

2、論理削除する対象のモデルに下記項目を追加する
[php]
`deleted` tinyint(1) NOT NULL DEFAULT 0,
`deleted_date` DATETIME DEFAULT NULL,
[/php]

3、/Model/AppModel.phpに下記関数を記述します。
[php]
public function exists($id = null) {
if ($this->Behaviors->attached(‘SoftDelete’)) {
return $this->existsAndNotDeleted($id);
} else {
return parent::exists($id);
}
}

public function delete($id = null, $cascade = true) {
$result = parent::delete($id, $cascade);
if ($result === false && $this->Behaviors->enabled(‘SoftDelete’)) {
return (bool)$this->field(‘deleted’, array(‘deleted’ => 1));
}
return $result;
}
[/php]

4、対象となるモデルでSoftDeleteBehaviorの呼び出し
[php]
class Post extends AppModel {
public $actsAs = array( ‘SoftDelete’ );
[/php]

5、後は自動で論理削除されます。

6、削除されたレコードも表示した場合はdetachします。
[php]
$this->Behaviors->detach(‘SoftDelete’);
$posts= $this->Post->find("all", $params);
[/php]