このブログを検索

2018/02/12

onedrive始めました

私はoffice365を買っている。

毎月1274円はたいした金額ではないが1年1.5万、5年使ったら7万にもなってちょっと割高かなと思っていたが思わぬオマケがついていた。

onedriveの容量が1TBになるのである。

dropbox、google drive、icloudなどのサービスは使ったことはあっても無料で使えるのはどれも容量は数GBで、あれば便利だろうがカネを払ってまで使うものではないと思っていた。

ある日自宅のパソコンのHDDが突然見えなくなって、その後無事復旧したのだが、今までにも何度かHDD故障によりけっこう大事なデータを紛失したことがあったので、早めに対策しようと考えた。

まずは新しいHDDを買うことを考えた。今はCドライブは250GBのSSDで、それに加えて500GBのHDDを使っている。今回壊れかけたのは500GBのHDDの方だ。今はHDDもすっかり安くなった。そして大容量になって、新しく買う頻度も下がった。最後に買ってから3年は経っている。今見てみたら、4TBのHDDが1万円もしない。

しかし今時ローカルハードディスクなんて1TBもいらないしどうせすぐ壊れるからな・・・などと思いつつ買わずにいて、ちなみに自分の使っているオンラインストレージの容量はどれくらいだろうと調べてみた。

google drive 15GB
drop box 2.5GB
iCloud storage 5GB

そして
onedrive 1TB

1TB! と思わず声が出た。
これはofficeを買っていることによる容量追加であった。

drop boxも月1000円だせば1TBになる。

しかしoffice+1TBで1274円だからonedriveの方がいい。

オンラインストレージは使い勝手が悪いんじゃないかと思っていたが、
最初に移すときこそ時間がかかったが、いったん移してしまった後はローカルのドライブとほとんど変わらない感覚で操作できる。
ドラッグアンドドロップもできるし、もちろんonedriveにあるファイルをそのままダブルクリックして編集できる。

たとえばヤフオクで出品するとき、iPhoneで写真を撮りgmailに添付して自分宛に送り、PCで添付ファイルをローカルPCに保存していたが、onedriveを使えば、撮った写真をタップしてonedriveに保存できる。

さらにiPhoneアプリでもアクセスできるので、今まではiPhoneとPC間でメールに添付したりしてデータを共有していたのだが、onedriveに保存することで簡単に共有が実現できるようになった。

500GBのハードディスクに入っているデータのうち頻繁に更新するものはごく一部で、
ほとんどは別に今すぐ必要ではないけど念のため取っておきたいとかいうようなものばかりだ。

必要なものだけを残せばいいのかもしれないがそれもメンドクサイ。
1TBもあればとりあえずボンボン放り込んでおいて、いらないものは後で消せばよい。

2018/02/11

ネットワークエンジニア7つ道具2018年版

電源タップ
モバイルバッテリー
ライトニングケーブル
USBミニケーブル
iphone等
イヤホン
VISAクレジットカード
ニッパ
ハサミ
カッター
プラスドライバー
マイナスドライバー
ノートPC
ボールペン
細いマッキー(油性マジック)
養生テープ
ベルクロ
USBハブ
USBシリアル変換アダプタ(2個)
コンソールケーブル
USBミニBケーブル(コンソールケーブル)
ジョイント(LANケーブルを延長する)

<ソフト編>
teraterm
winmerge
exping
tftpd64
秀丸エディタ
7zip
cygwin


注目はUSBミニBケーブルだ。
最近のネットワーク機器はUSBのコンソールポートがついているものが増えた。
catalyst3850などについている。

USBミニBケーブルはfortigateにコンソールケーブルとして付属していて、
余ったものを使っている。

USBはシリアルとは桁違いに速いのだが下記にあるようにUSBでも通信速度は9600bpsである。

https://www.cisco.com/c/ja_jp/td/docs/sw/lanswt-compact/cat3560-cswt/ig/001/higbk/higquick.html

今はみんなもっているだろうが、あちこちへ出張する際にホテル、新幹線、飛行機などの利用はカードが便利。VISAのみというところが結構あるのでVISA。ホテルや交通機関ならデビットでも大丈夫だろう。


2018/01/28

twitteroauth

twitter apiを使ったphpのソースを公開したが重要な欠陥に気づいて非公開にした。
そして修正しているうちに認証できなくなってしまった。
調べているとoauthで使用しているtwitteroauthが更新されていたので、
アップデートがてら作り直すことにした。

最新リリースを持ってくる。
https://github.com/abraham/twitteroauth/releases

0.7.4が去年の7/1にリリースされていた。

今のバージョンはなんだろうと見てみるとバージョンが書かれている場所がわからないが
ファイルのタイムスタンプが 2015 8/19なので0.5.4だ。クソ古い。

解凍の仕方も忘れている。

tar -zxvf 0.7.4.tar.gz

参考
https://qiita.com/sofpyon/items/982fe3a9ccebd8702867


自分のkeyを定義したphpファイルを作る。
common.php

これは前に作ったものをそのまま使える。

login.php

上記サイトのソースがコメントまで同じだ。
前回もこの人のを参考にしたのか?
requireのパスだけ今回のものに変える。

mypage.php
を作って動かす。

http error 500になる。

下記2行をソースの最初に書いてエラーメッセージを表示させる。

ini_set("display_errors", On);
error_reporting(E_ALL);


Notice: Undefined index: access_token in /var/www/html/ssl/bl/mypage.php on line 14 Parse error: syntax error, unexpected '[' in /var/www/html/ssl/bl/twitteroauth-0.7.4/src/TwitterOAuth.php on line 128

これはphpのバージョンが古いために出るらしい。
今のphpのバージョンは5.3.3

自動アップデート(名前は忘れた)しているがphpは上がっていない。
レポジトリを変えないとダメなようだ。

こちらを参考にphpをアップデート

https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e

バージョンを確認...... 変わってない!

apacheを再起動しないとダメだそうだ。

service httpd restart

変わった。

今度は以下のエラー。

Notice: Undefined index: access_token in /xxxx/mypage.php on line 14
object(stdClass)#3 (1) { ["errors"]=> array(1) { [0]=> object(stdClass)#7 (2) { ["message"]=> string(53) "Your credentials do not allow access to this resource" ["code"]=> int(220) } } }

twitteroauth, phpのバージョンをあげる前と同じだ。

許可されていないAPIを呼び出した時などに出るエラーのようだが、
アクセストークンを取り出しているだけだ。

APIの利用制限に引っかかったのか?












2018/01/27

twitterでブロックしているユーザの表示、ブロック解除

修正した。

ブラックリストに加えて、NG wordリストを作成し、
NG wordを含むアカウントがブロックされている場合はブロック解除しないようにした。

それから、ブラックリストへの登録は今までは手作業であったが、
ブロックしているユーザを選択して登録できるようにした。

※ドメイン名は example.comに置き換えてある。

<?php
session_start();
require_once 'common.php';
require_once 'vendor/abraham/twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;
$access_token = $_SESSION['access_token'];
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
$user = $connection->get("account/verify_credentials");
$blocking_users = array();
echo '<img src="' . $user->profile_image_url . '">' . ' ' . $user->name . ' is blocking following users.<br><br>';

$showdetail = 0;
$black_list = @file('blacklist.txt');
$black_list = array_map('trim', $black_list);
$ngwords = @file('ngwords.txt');
$ngwords = array_map('trim', $ngwords);
echo '<a href="https://example.com/bl/mypage.php?mode=unblock">unblock all</a><br><hr>';
echo '<a href="https://example.com/bl/mypage.php">refresh</a><hr>';
echo '<a href="https://example.com/bl/addbl.php">add blacklist</a><br><br><hr>';
echo '<a href="https://example.com/bl/mypage.php?mode=reblock">reblock users in bl</a><br><hr>';
echo '<a href="https://example.com/bl/edbl.php">edit blacklist</a><hr>';
echo '<a href="https://example.com/bl/mypage.php?mode=logout">logout</a><br>';
$blu_file = 'blocking.txt';
$req2 = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/list.json','GET',array('count'=>'100'));
$blocks = json_decode($req2,true);
if (isset($blocks) && empty($blocks->errors)) {
        echo '<hr>';
        foreach ($blocks as $val) {
                for($i = 0; $i<count($val)-1;$i++)
                {
                        $blocking_user = $val[$i]['screen_name'];
                        $is_ng = False;
                        foreach($ngwords as $ng) {
                                if(stripos($blocking_user, $ng) !== false) {
                                        $is_ng = True;
                                }
                        }
                        if ($is_ng) {
                                echo '<font size="1">* NG * </font>';
                                $showdetail = 0;
                        } elseif (in_array($blocking_user,$black_list)) {
                                echo '<font size="1">* BL * </font>';
                                $showdetail = 0;
                        } else {
                                $showdetail = 1;
                        }
                        echo
                                '<font size="1">' . $blocking_user . '  ' .$val[$i]['name'] . '   '
                                . '<font color=blue>' . $blocking_user . '</font><br>' ;
                                if ($showdetail > 0) {
                                        echo '<blockquote>' . '<img src="' . $val[$i]['profile_image_url'] . '"><br>'
                                        . $val[$i]['description'] . '<br></blockquote>';
                                        $blu_current .= $blocking_user . "\n";
                                }
                        $blocking_users_list[] = $blocking_user;
                }
        }
} else {
        echo 'you are blocking nobody.';
}
file_put_contents($blu_file, $blu_current);
if(isset($_GET['mode']))        {
        if ($_GET['mode'] == 'unblock') {
                foreach($blocking_users_list as $a)     {
                        $is_ng = False;
                        foreach($ngwords as $ng) {
                                if(stripos($a, $ng) !== false) {
                                        $is_ng = True;
                                }
                        }
                        if (in_array($a,$black_list)) {
                                echo $a . " is in blacklist.<br>";
                        } elseif($is_ng) {
                                echo $a . " contains ngwords.<br>";
                        }  else {
                                $result = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/destroy.json','POST'
                                        ,array('screen_name'=>$a));
                                $j = json_decode($result,true);
                                if (isset($j)) {
                                        echo $j['screen_name']." is unblocked.<br>";
                                }
                        }
                }
        } elseif ($_GET['mode'] == 'reblock') {
                        foreach($black_list as $a)     {
                                $result = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/create.json','POST'
                                        ,array('screen_name'=>$a));
                                $j = json_decode($result,true);
                                if (isset($j)) {
                                        echo $j['screen_name']." is blocked.<br>";
                                }
                        }
                }
        header("location:https://example.com/bl/mypage.php");
        exit();
}
if(isset($_GET['mode']))        {
        if ($_GET['mode'] == 'logout')  {
                session_destroy();
                header("location:https://example.com/bl/login.php");
        }
}
?>


ブラックリスト登録

--------------------------
<form name='form1' action = 'addbl_result.php' method='get' >
<?php
$array = file("blocking.txt");
for($i = 0 ; $i < count($array); $i++){
        echo '<input name="blocking[]" type="checkbox" value=' . $array[$i] .'>' . $array[$i] . '<br>' ;
}
?>
<input type="submit" vlaue="submit">
</form>

------------------------------

<?php
$bl_file = 'blacklist.txt';
$current = file_get_contents($bl_file);

if(empty($_GET["blocking"])){
     echo "何も選んでません";
}else{
     $blocking = $_GET["blocking"];
     foreach($blocking as $value){
#       echo $value . '<br>';
        $current .= $value. "\n";
     }
}
file_put_contents($bl_file, $current);
header("location:http://example.com/bl/mypage.php");
exit();
?>

2017/12/23

証明書が信頼されない2

http://monqy.blogspot.com/2017/12/blog-post_23.html
の続き

証明書内の cnを信頼せず、別のところを見ているらしい。
簡単に偽装できるからだろう。

以下をやってサーバ証明書への署名をすれば対応できると聞いて
やってみたが............

/etc/pki/tls/openssl.confを修正
[ req ]
req_extensions = v3_req

[ usr_cert ]
authorityKeyIdentifier=keyid,issuer:always

[ v3_req ]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com


今度は

NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM

sha1になってる。


いろいろやったが、結局以下で。
vi ./openssl.cnf
#以下のセクションのパラメータを設定
[ CA_default ]
default_md = sha256

[ req ]
default_bits = 2048
default_md = sha256

[ usr_cert ]
basicConstraints=CA:TRUE
nsCertType = server

[ v3_ca ]
nsCertType = sslCA, emailCA

これをやって、CAを作り直す。

CAを作りなおす場合、
/etc/pki/CA/private/cakey.pem
があると
-newca
をやっても動かないので消す。

あと、いったんできたファイルは全部消しておく。

そんで、サーバの秘密鍵作成、CSR作成、署名をやりなおす。
apacheを再起動、CA証明書は、cacert.pemの最後の

-----BEGIN CERTIFICATE-----
から
-----END CERTIFICATE-----

までをテキストにコピーして拡張子 .crtにすればインポートできる。

chromeもいったん終了して再起動。


晴れてchromeに「保護された通信」と認めてもらえた。







証明書が信頼されない

(追記 証明書の有効期限は長すぎると信頼されなくなるようになっており10年とかにすると信頼されない)

自分のSSLサイトに証明書をつける。 金を出して買うのではない。 自己署名証明書でもない。 CAのお墨付きの証明書だ。 ただし、そのCAは自分で建てる。 結果的には自己署名証明書のようなものだが。 サーバはさくらのVPS、centos 6.9
# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 19 2017 16:43:38
# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
下記三つのファイルに有効期限の設定があるが、
/etc/pki/tls/openssl.cnf
#365を3650に

/etc/pki/tls/misc/CA
#365を3650に

/etc/pki/tls/misc/CA
#1095を3650に

1. CAを作る

/etc/pki/tls/misc/CA -newca
CA certificate filename (or enter to create)

#enterを入力

writing new private key to '/etc/pki/CA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

#cakeyのパスワードを2回入力
#以下は適当に
#Common NameはURLとして入力するホスト名にする。

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:example.com
Organizational Unit Name (eg, section) []:example
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:mail@example.com
以下は何も入力せずにenterでよい
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
CA証明書は下記にできる
/etc/pki/CA/cacert.pem
CA秘密鍵は
/etc/pki/CA/private/cakey.pam

2. サーバ証明書をつくる 

2-1. サーバ証明書の秘密鍵をつくる
# mkdir /etc/pki/ssl
# cd /etc/pki/ssl
# openssl genrsa -out server.key -aes256 2048
2-2. CSR(Certificate Signing Request)の作成
openssl req -new -key server.key -out server.csr

3. サーバ証明書に署名する

openssl ca -config /etc/pki/tls/openssl.cnf -in server.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out server.crt
パスワード、yを2回いれる。 下記のエラーになったときは、
failed to update database
TXT_DB error number 2
/etc/pki/CA/newcerts/に xxxxx.pem というファイルがあるはずなので、
openssl ca -revoke /etc/pki/CA/newcerts/xxxxx.pem
をやってから、署名をもう一度やる。
openssl rsa -in server.key -out server.key

4. apacheの設定

vi /etc/httpd/conf.d/ssl.conf
証明書と秘密鍵が /etc/pki/ssl にあるとして
SSLCertificateFile /etc/pki/ssl/server.crt
SSLCertificateKeyFile  /etc/pki/ssl/server.key
に変更して
service httpd restart
サイトにアクセスすると証明書が信頼できないというエラーが表示される。

証明書を表示すると「この証明書の発行者を検出できませんでした。」 となっている。

5. CA証明書をクライアントにインストール 

Windows10の場合 /etc/pki/CA/cacert.pem をクライアントにコピーし、拡張子を.crtに変える。
ダブルクリックすると証明書として表示されるので、「証明書のインストール」をクリックする。 ウィザードが走るのでインストールする。
私は「ローカルコンピューター」「信頼されたルート証明機関」にいれた。

さあこれでエラーが表示されなくなった.... と思ったら、ダメだ。
IEはエラーが表示されなくなったが、 chromeとfirefoxは依然として証明書を信頼してくれない。

chromeは
NET::ERR_CERT_COMMON_NAME_INVALID

Firefoxは
SEC_ERROR_UNKNOWN_ISSUER

....。

調べたら、対応策があるようなので、次回。

続き↓ https://monqy.blogspot.com/2017/12/blog-post_87.html

2017/12/16

資格は必要か

LPIC101を受けたのだが来年の5月で失効する。
もったいないので201を受けようと思う。
そして秋にはネットワークスペシャリストを受ける。
そして来年は久しぶりにTOEICを受けたい。


資格は重要でないという人は多いが、私は重視している。
私には学歴がなく有名企業の社員でもない。
仕事をするのに資格が条件となることはほとんどないが、
印象がよくなるのは間違いない。


数学ができなくても生きていける。
英語がわからなくても生きていける。

でも、生きる世界は数学や英語を理解している人より狭くなるのは当然だ。

資格も同様。
私が持っている資格はたいしたものではないが、
それでも合格するには時間とカネがかかるし、何よりも決意がいる。

3年や5年などあっという間に経ってしまう。

その間に仕事に忙殺され、プライベートでは低俗な楽しみで流されていくのは
悲しいことだ。

それは自分のことである。

有名企業に勤めるとか出世するとかカネを稼ぐとか、
それはそれでひとつのカタチであり、それを目指すのもいいかもしれないが、
私は彼らが楽に生きられるパスを奪い合っているようにしか見えない。
彼らが他より優秀だとも努力しているとも思わない。
単に必死で強欲なだけ。

満員電車に恥も外聞もなく乗りこめるようなずうずうしさ。
私は社会人になったばかりの頃はなかなか満員電車に乗れず、何本も電車を見送っていた。

やがて慣れてくると前の客を押し込むようにして乗れるようになっていったが、
それをたくましくなったとか生きるためには仕方がないなどとは思わない。

ただ、恥知らずに無神経になっていっただけだ。


私は、成功したいのではない。常に自分を成長させていきたい。
そこそこの仕事でいいから、役に立つ人間でありたい。

何にもしてないのにカネばかりもらいやがって、と言われるような人間にだけは、
なりたくない。