PHPのバージョンを7.Xに上げたら、Notice: Array to string conversion in…’とエラーが出て、Arrayの配列結合演算子(+=)がきちんと動作しない

PHP5.6で問題なかったのにPHP7にバージョンアップしたら、Notice: Array to string conversion in…’とでて、Arrayが空っぽになった。

Arrayの($new_array +=$old_array)の部分でエラーが出ているから、配列結合演算子(+=)が悪いかと思ってたけど、実はそれは悪くなかった。

 

原因:

$old_arrayの作成で

$old_array=””;

$old_array[$num]=array(XXX => YYY);

$new_array +=$old_array

としてた。これが悪い!

 

解決:

$old_array=array(XXX => YYY);

$new_array[$num] +=$old_array

↑こうしましょう

$old_arrayに[$num]をつけるのはだめ

 

Ubuntuでpython3でpyqt5を実行したいのにエラーがでる

以下のエラーが出る。

qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “” even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

 

pip3 install pyqt5とか他色々ぐぐったら出てくるものを試したけどなんか見つからない。

これ、本当に単純で

pip3 install –user pyqt5
sudo apt-get install python3-pyqt5
sudo apt-get install pyqt5-dev-tools
sudo apt-get install qttools5-dev-tools

でいけました。

単純にapt-get install python3-pyqt5 が大事

Javaでメソッドを引数みたいな感じで別クラスに渡して別クラスでメソッドを実行させる方法

何を書いているか良くわからない。というか表現があっているかもよくわかってない。

Pythonでいう関数渡し的なのをJavaでやりたい

 

やりたいこと

private void AAA(){

class InnerClass{
InnerClass(){

//InnerClassの中身

}

}

new InnerClass();//InnerClass実行

BBB();//こいつに new InnerClass()を渡して実行させたい

}

 

class void BBB(){

//BBBの中身

//InnerClassを実行させたい場所

}

 

これ、実はThreadで解決できる。

じつは常識なのかな?私は知らなかった。

解決法:

private void AAA(){

class NewInnerThread extends Thread {
public void run() {
//InnerClassの中身

}
}

new NewInnerThread ().run();

BBB(new NewInnerThread ());//こいつに new NewInnerThread ()渡す

}

 

class void BBB(Thread thread1){

//BBBの中身

thread1.run();

}

 

これでとりあえず解決できた。

 

 

CentOSにSquid(Proxy)をインストールしてProxy経由で日本国内専用サービスにアクセスする方法

日本国内だけのHPやサービスにアクセスする時は普通はVPNを使ったほうがいいんだけど、それが使えないケースもある(私の場合はappetize.io)

 

できるだけ安全に運用するための手順です

イメージ

世界→Myサーバー(squid)→国内専用HP

Basic認証でなおかつホワイトリスト方式(許可したドメインだけのアクセス許可)にします

 

インストール:

yum -y install squid

firewall-cmd –zone=public –add-port=3128/tcp –permanent
systemctl start squid.service
systemctl enable squid.service

yum install httpd-tools

htpasswd -c /etc/squid/passwords user

password#これはBasic認証のために


vi /etc/squid/squid.conf

 

 

/etc/squid/squid.confの中身
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
auth_param basic children 10

acl authenticated proxy_auth REQUIRED
http_access deny !authenticated #このDeny!にしないと、DNSのホワイトリスト方式が取れない

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl mysite dstdomain www.yahoo.co.jp
acl mysite dstdomain www.google.co.jp
acl mysite dstdomain .google.com
acl mysite dstdomain fonts.googleapis.com
acl mysite dstdomain ajax.googleapis.com
acl mysite dstdomain cdn.jsdelivr.net
#acl mysite dstdomain .googleapis.com
#acl mysite dstdomain .jsdelivr.net
acl mysite dstdomain youtu.be
acl mysite dstdomain .youtube.com
acl mysite dstdomain appetize.io
acl mysite dstdomain .medicalfields.jp
acl mysite dstdomain 157.7.94.189
acl mysite dstdomain www.ugtop.com #To Check Ip
acl SSL_ports port 443
acl Safe_ports port 80 # http
#acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on “localhost” is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
http_access allow mysite
http_access deny !mysite

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

dns_v4_first on #こうしないとGoogleに入れなかった

dns_nameservers 8.8.8.8 208.67.222.222

 

 

ApacheのPHP7にバージョンアップしたら実行時に500 Internal Server Errorが出て、php-fpmのエラーログに何も情報が表示されていない場合

.htaccessが悪い可能性が高いです。

私の場合は

.htaccessに

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_flag display_errors On

が記載されていたことが原因でした。

php_valueとphp_flagを削除すると、ちゃんと動きました

どうもphp_valueやphp_flagはPHPのモジュール版でのみ有効で、php7ではセキュリティの観点からデフォルトで無効になっているようです。

素直にphp.iniで設定しましょう

 

ConohaのロードバランサーでHTTPのヘルスモニターがうまく動作しない

当社はNginxでConohaのロードバランサーを使用している。

今まではPINGでヘルスチェックを行っていたのだが、Nginxに障害が出た際に、Pingだと予備サーバーのNginxデーモンが落ちた際に、うまいことバランシング出来なくて、障害が発生したので、HTTPのヘルスチェックに切り替えることにした。

でもうまいこと行かない

原因はHTTPSでした。

今までNginxは

server {
listen 80;
server_name xxx.medicalfields.jp;

if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}

てな感じで設定したんだけど、どうもConohaだとHTTPでアクセスするとステータスコードが301(URL転送)になってヘルスチェック失敗になるっぽい

そのため親ディレクトリだけはHTTPでアクセスした際にリダイレクトしないように設定した

解決↓

server {
listen 80;
server_name xxx.medicalfields.jp;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ^~ /php/ {
if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}
}

ロードバランサーでHTTPのヘルスチェックに失敗する場合は、参考にしてください

 

WordPressのサーバー移動時に記事のURL(ドメイン)を変えることなく、新サーバーで事前テストする方法

タイトルが長くなったけど、つまりはWordpressの設定で

WordPress アドレス (URL):medicalfields.jp

みたいな感じで普通は設定するけど、これだとテストで自分の環境だけで動かしたい場合、テスト環境じゃなくて本番環境のURLに飛ばされる(当たり前だけど)

でも、サーバー移行時のテストなどで、どうしても自分の環境だけで本番URLのままで試したい場合がある。

解決法:

hostsファイルを書き換えましょう

具体的にはテスト環境のIPアドレスに書き換える

例えば当ブログだとmedicalfields.jpがドメインなので、これをテスト環境のIPアドレス(ローカル環境だと127.0.0.1とか)に書き換える。

そうすると、なんとローカル環境でもURLがきちんと逆引きされWordpressが問題なく動作する。

ちなみにWindowsの場合でしか試していないですけど、マックでも問題なくできるとは思う

やり方:

・Windows 10のhostsファイルの場所

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 medicalfields.jp

と追加する

ちなみに管理者権限じゃないと書き換えれないです。また、上書きしたら直ぐに反映されます。

これを知っているだけでwordpressのサーバー移動がかなり楽になるので、ぜひ試してください!

CentOS7からCentOS8に移行した時にトラブったこと

現在当社ではConohaのVPSとオブジェクトストレージとロードバランサーを利用している。

その中でさらにVPSではDB(mariaDB)サーバー、HTTPS(Nginx)サーバーで分けている(DBはインターネットからは接続できないようにしている)。

セキュリティアップデートと動作が早くなるとのことで今回VPSをすべてCentOS8に変更してみた。

素直に動作するかなーと思ったら動作しなかったので、トラブった所をメモ

トラブった所

症状:カスタムのネットワークスクリプト(/etc/sysconfig/network-scripts/)で設定した、プライベートIPアドレスの設定がうまいこと行かない

nmtuiで確認したのに、なんかプライベートIPアドレスが設定されていなかったり設定されていたりする。

これ凄く悩んだ。なぜなら中途半端にスクリプトが動いたから

例えばcd /etc/sysconfig/network-scripts/

でロードバランサーを使用する場合はlo: <LOOPBACK>の設定をするんだけど、Loは有効になってなくて、eth1とかはスクリプトが動いたから(nmtuiでの設定は信用できない?)

ifcfg-eth1は動きます

解決法:network-scriptsが未インストール(deprecated)なのでインストールする

コマンド:yum install networkscripts

 

 

症状:systemctl restart network が動作しない

解決法:systemctl restart NetworkManager.service にかわった

とりあえず、ネットワーク関係がちょっと変わっている。

それ以外は一応問題なく動いた。

まぁCentOS8からyumじゃなくてdnfに変わったけど、しばらくはyumが使えるっぽい

あと、メインHPのWordpressの移行もやったからそれについても後日記事各予定です。

Windows hostsファイルを書き換えて、ローカルで確認ってやり方が凄く良かったから、それについて詳しく書きます!

 

AWS IoT ButtonでSwitch Botをオンにする

現在、当家ではセコムホームセキュリティに入っている。

これをSwitch Botを使ってアマゾンダッシュボタンではなくアマゾンダッシュボタンの代わりとなるAWS IoT Button(AWS IoT エンタープライズボタンとか)でオン、オフを制御しようと思う。

イメージとしては

AWS IoT Button

自宅ルーター

AWS IoT 1-Click

AWS Lambda

IFTTTのWebhook

自宅ルーター

Switch Bot Hub

Switch Bot

セコムホームセキュリティがオン

という流れ。

ボタンが押されたらセコムが自動的にオンになって、すごく安全になるはず。

この設定で難しいところがAWS関係だと思うので、そこを中心にやり方を説明します!

やり方

1.スマホにSwitch Botインストールし、ID作って、セットアップ

2.スマホにIFTTTをインストールして、IFTTTのSwitch Botのアクセスを許可して、WebhooksでSwitch Botの連動設定

こんな感じになる

3.スマホにAWS IoT 1-Click(Apple Store Google Play)をインストールして、AWS IoT buttonをセットアップ

4.PCよりAWSにログインしてサービス→コンピューティング→Lambdaを開いて関数作成

関数名:secom

ランタイム:python 3.6

でプロジェクト作成

5.Lambdaの関数コードにIFTTTと連動させる

 

IFTTTのAPIキーはWebhooksのAccount Infoで見れる

シングルクリック、ダブルクリック、長押しの変更は以下のコードを参考にしてください

↓これを入力(APIキーはかえてね)↓

import json
import urllib.request
    
def lambda_handler(event, context):
    clicktype = event['deviceEvent']['buttonClicked']['clickType']
    print(clicktype)
     
    if (clicktype == "SINGLE"):
        url = 'https://maker.ifttt.com/trigger/secom_on/with/key/あなたのAPIkey'
        message = "ボタンが1回押されました"
    elif (clicktype == "DOUBLE"):
        url = 'https://maker.ifttt.com/trigger/secom_off/with/key/あなたのAPIkey'
        message = "ボタンが2回押されました"
    elif (clicktype == "LONG"):
        url = 'https://maker.ifttt.com/trigger/secom_off/with/key/あなたのAPIkey'
        message = "ボタンが長押しされました"
    else:
        message = "clickTypeを正常に取得できませんでした"
        

    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as res:
        body = res.read()
    return {
        'statusCode': 200,
        'body': json.dumps('')
    }

作成できたらこんな感じになる

6.AWSのメイン画面に戻って、サービス→IoT→IoT 1-Click→プロジェクトを作成を選択

7.プロジェクト名に適当な名前をつけて以下のように設定し、プロジェクトを作成

8.作成したプロジェクトにプレイスメントを以下のように設定。

9.IoT 1 Clickのメイン画面に戻って、管理→デバイス→デバイスの有効化

以上で設定完了です。

これでIoT buttonを押したらSwitch Botが反応するようになります。

ただ、注意点として、毎月AWSのサーバー利用代金に25円ほどかかります。

また押してからのタイムラグは7秒ほどあります!

 

 

Buffaloの外付けSSD(SSD-PM120U3A-S)を分解したらSSDが入ってなかった

ノートパソコンのHDDが壊れたから修理のためにSSDを調達しようとした。

すると最近SSDの値段が高騰していて、2.5インチの内蔵SSDがなかなか昔と比べて値段が上がっている。

安く買えないかなーと思っていたら128GBのBuffaloの外付けSSD(SSD-PMU3AシリーズのSSD-PM120U3A-S)が相対的にお安く買えたので購入した。

これを分解してHDDが壊れたノートパソコンに換装する予定だったのだが、誤算だった。

↓分解から結果↓

2.5インチのHDDとの比較、明らかに小さい(この時点でちょっと焦る)

裏の比較

USB3.1(Gen1)の差込口

普通に小さなマイナスドライバーでこじ開ける

 

こじ開けた結果

 

SATAが挿せるSSDが入ってない・・・・・・・・

使いみちがなくなってしまった。

非常に残念