ネットワークスペシャリスト試験、合格した!
今までとった資格試験の中で一番うれしいかもしれない。
対策本は2冊買ったけど、どちらも流し読み。
過去問をIPAのサイトからダウンロードして、
さらっと見るとチンプンカンプンな問題があるが、
わかる問題はすごく簡単なので、
ハハーン、これはたいしたこと聞いてないな、と察して、
わからないものは考えるのをやめてすぐ検索して正解を選んだ。
検索したといっても、問題そのものと答えを検索したのではなく、
その問題が問うていることを検索した。
午前問はIT界の一般教養的なことなのでたいしたことはない。
問題は午後なのだが、これも過去問を解いてみると小難しくダラダラと書いてあるが
答えはほとんど問題文の中にあって、それを探して書き写すも同然のようなことばかり。
必要なのは、未知の技術や新しい技術であっても、基本的なことは過去の技術を踏襲しており、基本を理解していれば新技術や未知のワードにビビることはない、という自信、落ち着き、である。
あとは、必死さ。
とりあえず解答欄は全部埋めた。
鉛筆と消しゴムという普段使わない道具を駆使して、何度も何度も解答を書き直して、
とりあえず埋めた。
合格点は60点。
解答欄を全部埋めて60点などというのは、いままで受けた試験では考えられない。
だいたい戦意喪失してあきらめてしまうものだ。
今回はプライドをかなぐり捨て、制限時間いっぱいまで粘って何度も推敲して答案を仕上げた。
合格点ギリギリの点数だったのだが、私の熱意が数点加算されたのではないか。
本格的に試験対策に費やした時間は1か月にも満たない。
そのかわり、一週間くらいは酒を飲まず朝5時に起きて出社前に過去問を解いたりした。
とにかく過去問を解くことに尽きる。
過去問を解いて、それほど難しい試験ではない、というのを実感して、
自分の知識と経験に自信を持つこと。
このブログを検索
2018/12/21
2018/11/12
ntpがv6でしか同期できない
出張で中国へ行った際に、韓国と中国から自分のサーバにアクセスし、
掲示板に投稿しておいた。
後でそのログを見てみると、アクセスしたのと明らかに違う時刻が記録されていた。
あ、UTCなのか、と思いかけたがそんなはずはない。
試しに今投稿してみると、やっぱり時刻がずれている。
そして、そのズレはJSTになっていないとかではなく、単純に時刻があっていない。
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp1.sakura.ad. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp1.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp2.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp3.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
同期できていない。
きっとよくある設定ミスだろうと検索してみるが特に間違いはなさそう。
何度か設定を変えてサービスを再起動するが、上記の表示が変わらない。
いったんサービスを止めて、
ntpdate ntp.nict.jp
12 Nov 01:58:16 ntpdate[11677]: adjust time server 2001:df0:232:eea0::fff4 offset -0.000117 sec
で、同期された。
v6で同期している?
ntp.confの設定では -4 をつけているのだが...
ntpdate -d -4 ntp.nict.jp
でv4を強制すると、
ntpdate[11874]: no server suitable for synchronization found
...ええい、逆にv6を明示的に指定してやれ
(/etc/ntp.conf)
server -6 ntp1.sakura.ad.jp iburst
#ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*2001:e42:0:1:21 10.84.87.146 2 u 53 64 7 0.510 -0.206 0.046
ntp1.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp2.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp3.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
v6でしか同期できない、という状況である。
掲示板に投稿しておいた。
後でそのログを見てみると、アクセスしたのと明らかに違う時刻が記録されていた。
あ、UTCなのか、と思いかけたがそんなはずはない。
試しに今投稿してみると、やっぱり時刻がずれている。
そして、そのズレはJSTになっていないとかではなく、単純に時刻があっていない。
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp1.sakura.ad. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp1.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp2.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp3.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
同期できていない。
きっとよくある設定ミスだろうと検索してみるが特に間違いはなさそう。
何度か設定を変えてサービスを再起動するが、上記の表示が変わらない。
いったんサービスを止めて、
ntpdate ntp.nict.jp
12 Nov 01:58:16 ntpdate[11677]: adjust time server 2001:df0:232:eea0::fff4 offset -0.000117 sec
で、同期された。
v6で同期している?
ntp.confの設定では -4 をつけているのだが...
ntpdate -d -4 ntp.nict.jp
でv4を強制すると、
ntpdate[11874]: no server suitable for synchronization found
...ええい、逆にv6を明示的に指定してやれ
(/etc/ntp.conf)
server -6 ntp1.sakura.ad.jp iburst
#ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*2001:e42:0:1:21 10.84.87.146 2 u 53 64 7 0.510 -0.206 0.046
ntp1.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp2.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp3.jst.mfeed. .INIT. 16 u - 64 0 0.000 0.000 0.000
v6でしか同期できない、という状況である。
2018/10/23
フォワードプロキシとリバースプロキシの違い
ネットワークスペシャリスト試験でリバースプロキシとフォワードプロキシについての問題がまた出た。
過去5年の問題を確認したが、2、3回出ている。去年も出てたんじゃなかったかな?
リバースプロキシは仕事で構築したこともあるのだが、
「リバースプロキシと通常のプロキシの違い」という点については、
インターネットのどの情報を見てもピンとこない。
いろいろ言っても、結局クライアントとサーバの間にあってリクエストを転送することには変わりないじゃないか、と。
ようやく自分なりに納得できる違いを見つけた。
それは、フォワードプロキシつまり通常のプロキシは、不特定多数のサーバ宛のリクエストの代理となり、リバースプロキシは特定のサーバ宛のリクエストの代理となる、ということである。
クライアントがプロキシ宛にリクエストを送るのはフォワードもリバースも同じ。
「フォワードはクライアント側、リバースはサーバ側」というのもなるほどと思ったが、
フォワードプロキシがデータセンタにあればクライアントにとっては「サーバ側」と感じるだろう。
過去5年の問題を確認したが、2、3回出ている。去年も出てたんじゃなかったかな?
リバースプロキシは仕事で構築したこともあるのだが、
「リバースプロキシと通常のプロキシの違い」という点については、
インターネットのどの情報を見てもピンとこない。
いろいろ言っても、結局クライアントとサーバの間にあってリクエストを転送することには変わりないじゃないか、と。
ようやく自分なりに納得できる違いを見つけた。
それは、フォワードプロキシつまり通常のプロキシは、不特定多数のサーバ宛のリクエストの代理となり、リバースプロキシは特定のサーバ宛のリクエストの代理となる、ということである。
クライアントがプロキシ宛にリクエストを送るのはフォワードもリバースも同じ。
「フォワードはクライアント側、リバースはサーバ側」というのもなるほどと思ったが、
フォワードプロキシがデータセンタにあればクライアントにとっては「サーバ側」と感じるだろう。
2018/10/22
偏差値
ネットワークスペシャリスト試験を受けてきた。
全力は尽くした。
さて、午前1に以下のような問題が出た。
どうやって解くのかわからず、なんとなく答えを選んだ。
---
受験者1000人の4教科のテスト結果は表のとおりであり、いずれの教科の得点分布も正規分布に従っていたとする。90点以上の得点者が最も多かったと推定できる教科はどれか。
教科 平均点 標準偏差
-------------------------
A 45 18
B 60 15
C 70 8
D 75 5
---
昼休みにiPhoneでそれらしきキーワードで検索してみたが
過去には出題されていないようだった。
この問題は3問めだったが、ちょっと読んでわからないので飛ばし、
解ける問題を解いた後でじっくり考えてみた。
90点以上の得点者が最も多いということは平均点が高い教科になりそうに思えるが、
問題は標準偏差である。
もし、標準偏差が示されず、平均点だけを示されたら、Dを選ぶだろう。
そんな単純な問題でないことはわかる。
標準偏差の算出方法は覚えていないが、何を意味するかはわかる。
少し前に自分なりに整理したこともある。
標準偏差が大きいほど、得点のばらつきが大きい。
Dは5でもっとも小さく、Aは18で最も大きい。
Dの得点分布は縦に細長く、Aは横に広くなる。
それはわかるが、「90点以上の得点者が最も多い」ということをどうやって知るのか。
午前1に出るような問題なのでそんなに複雑な計算が必要ではないはずだ。
AとDは両極端なのでたぶん正解ではないだろう。
BかCか。15という標準偏差はかなり大きい、と、Bを選んだ。
昼休みに検索した結果、以下のような解き方でとりあえず正解を出せることがわかった。
偏差値は、「平均点との差に10をかけ標準偏差で割って50を足す」ことで算出できる。
(得点が平均点より高い場合)
90点をとった場合の偏差値を求めてみる。
A
(90-45)*10/18 + 50 = 75
B
(90-60)*10/15 + 50 = 70
C
(90-70)*10/8 + 50 = 75
D
(90-75)*10/5 + 50 = 80
同じ90点でも、教科Dの90点は偏差値が高い。
「偏差値80」はなかなか出るものではない。
そして教科Bの偏差値が最も低い。
この結果からなぜ「90点以上の得点者が最も多い」と言えるのかが
正確に説明できないのだが、
90点をとったときの偏差値が高いということは、
それだけその得点がまれである、
つまり、90点をとった人が少ないということを示す。
正規分布の正確な定義は知らないのだが、
確か中央が高くなって両端がだんだん低くなる分布である。
つまり、90点の偏差値の高低によって、それ以上の得点者の多寡が判断できる、
ということだと思う。
というわけで、問題で問われている90点以上の得点者が最も多いのは、
90点の場合の偏差値が最も低いBである。
その筋の情報によっても、正解はBだった。
というわけで、私がなんとなく選んだBは正解であった。
全力は尽くした。
さて、午前1に以下のような問題が出た。
どうやって解くのかわからず、なんとなく答えを選んだ。
---
受験者1000人の4教科のテスト結果は表のとおりであり、いずれの教科の得点分布も正規分布に従っていたとする。90点以上の得点者が最も多かったと推定できる教科はどれか。
教科 平均点 標準偏差
-------------------------
A 45 18
B 60 15
C 70 8
D 75 5
---
昼休みにiPhoneでそれらしきキーワードで検索してみたが
過去には出題されていないようだった。
この問題は3問めだったが、ちょっと読んでわからないので飛ばし、
解ける問題を解いた後でじっくり考えてみた。
90点以上の得点者が最も多いということは平均点が高い教科になりそうに思えるが、
問題は標準偏差である。
もし、標準偏差が示されず、平均点だけを示されたら、Dを選ぶだろう。
そんな単純な問題でないことはわかる。
標準偏差の算出方法は覚えていないが、何を意味するかはわかる。
少し前に自分なりに整理したこともある。
標準偏差が大きいほど、得点のばらつきが大きい。
Dは5でもっとも小さく、Aは18で最も大きい。
Dの得点分布は縦に細長く、Aは横に広くなる。
それはわかるが、「90点以上の得点者が最も多い」ということをどうやって知るのか。
午前1に出るような問題なのでそんなに複雑な計算が必要ではないはずだ。
AとDは両極端なのでたぶん正解ではないだろう。
BかCか。15という標準偏差はかなり大きい、と、Bを選んだ。
昼休みに検索した結果、以下のような解き方でとりあえず正解を出せることがわかった。
偏差値は、「平均点との差に10をかけ標準偏差で割って50を足す」ことで算出できる。
(得点が平均点より高い場合)
90点をとった場合の偏差値を求めてみる。
A
(90-45)*10/18 + 50 = 75
B
(90-60)*10/15 + 50 = 70
(90-70)*10/8 + 50 = 75
D
(90-75)*10/5 + 50 = 80
同じ90点でも、教科Dの90点は偏差値が高い。
「偏差値80」はなかなか出るものではない。
そして教科Bの偏差値が最も低い。
この結果からなぜ「90点以上の得点者が最も多い」と言えるのかが
正確に説明できないのだが、
90点をとったときの偏差値が高いということは、
それだけその得点がまれである、
つまり、90点をとった人が少ないということを示す。
正規分布の正確な定義は知らないのだが、
確か中央が高くなって両端がだんだん低くなる分布である。
つまり、90点の偏差値の高低によって、それ以上の得点者の多寡が判断できる、
ということだと思う。
というわけで、問題で問われている90点以上の得点者が最も多いのは、
90点の場合の偏差値が最も低いBである。
その筋の情報によっても、正解はBだった。
というわけで、私がなんとなく選んだBは正解であった。
2018/10/20
利用率と待ち時間
サービスの利用率がaだった場合、サービスを待つ人数は a/(1-a)となる。
具体的に数値を入れてみると、
a=0.1の場合
0.1/0.9 = 1/9 ≒ 0.11
a=0.3の場合
0.3/0.7 ≒ 0.43
a=0.5の場合
0.5/0.5 = 1
a=0.8の場合
0.8/0.2 = 4
a=0.95の場合
0.95/0.05 = 19
a=1 にするとゼロ除算になってしまう。
aを限りなく1に近づけていくと、(1-a)は限りなくゼロに近づき、
a(1-a)は無限大になる。
ρ(1-ρ)を 待ち人数とすると、
稼働率50%のとき一人となる。
それより低いときは1未満であるが、人数は整数である。
では、0.5人の待ち人数というのはどういうことか。
稼働率が33%くらいのときに待ち人数が0.5になる。
24時間営業のコンビニでサービス稼働率33%だとすると、
その日に10回店にいったら2回に1回は一人待っている、という感じか。
稼働率0.01から0.96までのグラフ
待ち人数が5を超えるあたりから急上昇する。
0.83%あたり
具体的に数値を入れてみると、
a=0.1の場合
0.1/0.9 = 1/9 ≒ 0.11
a=0.3の場合
0.3/0.7 ≒ 0.43
a=0.5の場合
0.5/0.5 = 1
a=0.8の場合
0.8/0.2 = 4
a=0.95の場合
0.95/0.05 = 19
a=1 にするとゼロ除算になってしまう。
aを限りなく1に近づけていくと、(1-a)は限りなくゼロに近づき、
a(1-a)は無限大になる。
ρ(1-ρ)を 待ち人数とすると、
稼働率50%のとき一人となる。
それより低いときは1未満であるが、人数は整数である。
では、0.5人の待ち人数というのはどういうことか。
稼働率が33%くらいのときに待ち人数が0.5になる。
24時間営業のコンビニでサービス稼働率33%だとすると、
その日に10回店にいったら2回に1回は一人待っている、という感じか。
稼働率0.01から0.96までのグラフ
待ち人数が5を超えるあたりから急上昇する。
0.83%あたり
計算問題
ネスペには「計算問題」というのがある。
最近は「計算」ということをほとんどしない。
エクセルを使うからだ。
するのはコンビニで買い物をするときくらい。
それすらも、最近はクイックペイなどを使うようになりすることが減ってきた。
午前の問題に計算問題があるのだが、過去問をやってみたらほぼ100%わからない。
「xxバイトの電文をxxxビット/秒で転送したときの送信時間」
など。
アーランとか、ポアソンとか、見ただけで拒否反応が出る。
しかし、回答方法を見てみると、ごく簡単な計算しかしていない。
足し算引き算掛け算割り算だけだ。
「1/100秒は何ミリ秒か」を1ミリ秒だと間違えたりする。
「2÷1.1」をひっ算でやってみるとアレ?となったりする。
「1000÷109」をひっ算でやる途中で
「1000-981」という計算が出てくるが、暗算すればすぐ19と出てくるが、
ひっ算で
1000
981
とやって1の位から引いて行って繰り下がる場合に10を借りてくるのか9を借りてくるのか戸惑ったりする。
バイトとビットを合わせなかったり、そんなミスばかりだ。
「100人が共通鍵で通信するときに必要な鍵数の合計」
これは、100人をフルメッシュにしたときのノード間の接続数を求めることであり、
ノード数をnとすると
接続数=n(n-1)/2
である。
1台の装置が常に利用中である場合、1アーランのトラヒックが発生している、という。
1日に1時間だけ利用されているなら 1/24 アーランである。
そのような装置が2台あれば、2 x 1/24 = 1/12 アーランである。
プリンタの利用率が25%である場合、待ち人数は
0.25 / (1-0.25) = 0.25 / 0.75 = 1/3 である。
この
ρ/(1-ρ)
については「なぜそうなのか」と疑問を持つことは大切だが
これくらいの簡単な式なら試験のためなので覚えてしまえる。
そして
待ち時間 = 待ち人数 x 一人当たりのサービス時間 である。
これは覚えるまでもない自明のことだ。
この程度である。
最近は「計算」ということをほとんどしない。
エクセルを使うからだ。
するのはコンビニで買い物をするときくらい。
それすらも、最近はクイックペイなどを使うようになりすることが減ってきた。
午前の問題に計算問題があるのだが、過去問をやってみたらほぼ100%わからない。
「xxバイトの電文をxxxビット/秒で転送したときの送信時間」
など。
アーランとか、ポアソンとか、見ただけで拒否反応が出る。
しかし、回答方法を見てみると、ごく簡単な計算しかしていない。
足し算引き算掛け算割り算だけだ。
「1/100秒は何ミリ秒か」を1ミリ秒だと間違えたりする。
「2÷1.1」をひっ算でやってみるとアレ?となったりする。
「1000÷109」をひっ算でやる途中で
「1000-981」という計算が出てくるが、暗算すればすぐ19と出てくるが、
ひっ算で
1000
981
とやって1の位から引いて行って繰り下がる場合に10を借りてくるのか9を借りてくるのか戸惑ったりする。
バイトとビットを合わせなかったり、そんなミスばかりだ。
「100人が共通鍵で通信するときに必要な鍵数の合計」
これは、100人をフルメッシュにしたときのノード間の接続数を求めることであり、
ノード数をnとすると
接続数=n(n-1)/2
である。
1台の装置が常に利用中である場合、1アーランのトラヒックが発生している、という。
1日に1時間だけ利用されているなら 1/24 アーランである。
そのような装置が2台あれば、2 x 1/24 = 1/12 アーランである。
プリンタの利用率が25%である場合、待ち人数は
0.25 / (1-0.25) = 0.25 / 0.75 = 1/3 である。
この
ρ/(1-ρ)
については「なぜそうなのか」と疑問を持つことは大切だが
これくらいの簡単な式なら試験のためなので覚えてしまえる。
そして
待ち時間 = 待ち人数 x 一人当たりのサービス時間 である。
これは覚えるまでもない自明のことだ。
この程度である。
2018/10/12
ネットワークスペシャリスト
あと10日程で受験日。
この試験を受けるのは初めてである。
以前は「オンライン」という名前だった。平成5年まで。
これは2回ほど受けたことがあるが、難関で有名だった。
今調べると合格率は5%に満たない。
ネスペは受験者比で14%程度のようだ。
難しい試験といえるだろう。
身の回りでもこの資格を持っている人は少なく、持っている人は皆ソコソコ、
いや、かなりデキる人ばかりである。
シスコなどのベンダー系試験は定番教科書や問題集をこなしていれば受かるのだが、
ネスペ等の高度情報処理技術者試験はそうはいかない....
と思っていたが、問題を見てみると思っていたほど難しくなかった。
特に午前の問題は知らないものはまったくわからないが、
問う知識の内容としてはあまり深いものはない。
そして過去問はググればすぐ出てくる。
過去問と回答はIPAでPDFが公開されていて、
解説サイトもすぐ出てくる。
午前の問題については、10年くらい前から出ているような問題もあり、
対策は可能だ。
午後はまだ去年のものしか見ていないが、記述式といっても論文を書くようなものではなく、単語や、せいぜい20字程度の短い文を書くだけである。
そして、合格点は午前1・2、午後1・2それぞれ60点というから、
けっこう低い。
この試験を受けるのは初めてである。
以前は「オンライン」という名前だった。平成5年まで。
これは2回ほど受けたことがあるが、難関で有名だった。
今調べると合格率は5%に満たない。
ネスペは受験者比で14%程度のようだ。
難しい試験といえるだろう。
身の回りでもこの資格を持っている人は少なく、持っている人は皆ソコソコ、
いや、かなりデキる人ばかりである。
シスコなどのベンダー系試験は定番教科書や問題集をこなしていれば受かるのだが、
ネスペ等の高度情報処理技術者試験はそうはいかない....
と思っていたが、問題を見てみると思っていたほど難しくなかった。
特に午前の問題は知らないものはまったくわからないが、
問う知識の内容としてはあまり深いものはない。
そして過去問はググればすぐ出てくる。
過去問と回答はIPAでPDFが公開されていて、
解説サイトもすぐ出てくる。
午前の問題については、10年くらい前から出ているような問題もあり、
対策は可能だ。
午後はまだ去年のものしか見ていないが、記述式といっても論文を書くようなものではなく、単語や、せいぜい20字程度の短い文を書くだけである。
そして、合格点は午前1・2、午後1・2それぞれ60点というから、
けっこう低い。
2018/05/19
iPhoneで送信できない
centos7の新しいVPSでメール設定をした。
dovecot + postfix tls有効
パソコンのthunderbirdだと送受信が問題なくできるが
iPhoneだと受信しかできない。
送信メールサーバの設定で、「このサーバはパスワード認証に対応していない」と
表示されてしまう。
パソコンもiPhoneも同じwifiにつないでいるので送信元IPアドレスは同じで
宛先も同じだからドメイン等の許可設定ではない。
とりあえず、iphoneの設定は送信サーバを旧サーバにした。
調べるとpostfixでsmtp認証をする場合はsaslを設定するという情報が出てくる。
旧サーバではsaslを使っている。
しかしthunderbirdではsaslを使わなくても認証ができている。
postfixのデバッグログでも確認した。
dovecot + postfix tls有効
パソコンのthunderbirdだと送受信が問題なくできるが
iPhoneだと受信しかできない。
送信メールサーバの設定で、「このサーバはパスワード認証に対応していない」と
表示されてしまう。
パソコンもiPhoneも同じwifiにつないでいるので送信元IPアドレスは同じで
宛先も同じだからドメイン等の許可設定ではない。
とりあえず、iphoneの設定は送信サーバを旧サーバにした。
調べるとpostfixでsmtp認証をする場合はsaslを設定するという情報が出てくる。
旧サーバではsaslを使っている。
しかしthunderbirdではsaslを使わなくても認証ができている。
postfixのデバッグログでも確認した。
2018/05/05
LPIC Level2合格
LPIC2をとった。
LPIC1をとったのは5年前。有意性の期限は5/5で、3月から準備を始めた。
教材はping-tと、以下2点。
ping-tの合格体験記を見るとほとんどの人がこの2点を使用していた。
ping-tのプレミアムコンテンツを1か月分申し込んだ。2400円。
Level1は簡単だった印象があるので1か月くらいでいけるだろうと思っていたが、
試験範囲が広く、結果的には合格できたがもう少し早めに準備すべきだった。
少なくとも、201と202それぞれで1か月くらいかけるべきだった。
201はともかく、202は以下のサービスの設定を理解していることを求められる。
bind
postfix
dovecot
apache
nginx
squid
vsftpd
sshd
samba
nfs
ldap
openvpn
本来であれば、すべてのサービスを実際に設定し動作させ、
パラメータを変えるとどうなるかなど確認すべきなのだろうが、
1か月ではその時間はなかった。
上記のサービスは一部を除いて設定したことはあって、
全く初めてというわけではなかった。
しかし問われる設定内容は知らないことばかりだった。
ping-tの問題はほぼ完ぺきになるまで繰り返し、
2つのテキストでそれを補うような勉強のしかたをした。
201/202ともに60問で800点満点で合格点は500点である。
単純に割合で計算すると6割強とればよいので、
余裕に思えるのだが、実際受けてみると聞いたことのないコマンドや設定項目が出てきて、どちらも時間をほぼめいっぱいつかって何度も見直して、
祈る思いで終了ボタンを押した。
だがこの資格のために勉強したことは自分のサーバについての 理解を深めたしおもしろかった。 一番の収穫はsambaがactive directoryのドメインコントローラになれるというのを知ったことだ。
2018/05/02
openvpn@centos7 iPhoneで接続
参考
https://www.marbacka.net/blog/openvpn_iphone/
アプリをインストール。
クライアントプロファイルを作成する。(上記参考サイトを参照)
プロファイルの中に証明書を貼ってしまう。
PCに接続し、iTunesでiPhoneをバックアップする画面を開く。
左側のメニューの「ファイル共有」をクリックし、
Appで「OpenVPN」を選択し、「OpenVPNの書類」の下にある
「ファイルを追加...」をクリックしてプロファイルを追加し、同期する。
(同期は必要だよね?)
iPhoneでOpenVPNのアプリを起動すると、追加したプロファイルが表示されている。
あとはわかると思うので略。
iPhoneでもつながった。
https://www.marbacka.net/blog/openvpn_iphone/
アプリをインストール。
クライアントプロファイルを作成する。(上記参考サイトを参照)
プロファイルの中に証明書を貼ってしまう。
PCに接続し、iTunesでiPhoneをバックアップする画面を開く。
左側のメニューの「ファイル共有」をクリックし、
Appで「OpenVPN」を選択し、「OpenVPNの書類」の下にある
「ファイルを追加...」をクリックしてプロファイルを追加し、同期する。
(同期は必要だよね?)
iPhoneでOpenVPNのアプリを起動すると、追加したプロファイルが表示されている。
あとはわかると思うので略。
iPhoneでもつながった。
openvpn@centos7 その2スプリットトンネリング
さくらのvpsの2台のサーバは同じゾーンなので、
スイッチに接続するとローカルネットワークで通信できるようになる。
コントロールパネルでスイッチを作成し、サーバを停止してから接続する。
firewalldとiptablesの設定でローカルの通信を許可する。
pingが通ることを確認。
openvpn接続後、サーバのローカルネットワーク宛の通信ができることを確認。
ローカル間で接続したもう一台のサーバへのpingは応答がない。
openvpnで割り当てるサブネットのルーティングを追加してアクセスできるようになった。
接続したクライアントでroutingテーブルを見てみると、
デフォルトルートがVPN向けになっている...と思ったが
よくみると 0.0.0.0 128.0.0.0 だ。
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.11 25
0.0.0.0 128.0.0.0 10.8.0.5 10.8.0.6 281
10.8.0.1 255.255.255.255 10.8.0.5 10.8.0.6 281
10.8.0.4 255.255.255.252 リンク上 10.8.0.6 281
10.8.0.6 255.255.255.255 リンク上 10.8.0.6 281
10.8.0.7 255.255.255.255 リンク上 10.8.0.6 281
===========================================================================
設定ファイルserver.confの以下をコメントにする。
push "redirect-gateway def1 bypass-dhcp"
そして、以下を追加する。サーバのローカルネットワークである。
push "route 172.16.0.0 255.255.0.0"
これによって、サーバのローカルネットワークのみがVPN経由になる。
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.11 25
10.8.0.1 255.255.255.255 10.8.0.5 10.8.0.6 281
10.8.0.4 255.255.255.252 リンク上 10.8.0.6 281
10.8.0.6 255.255.255.255 リンク上 10.8.0.6 281
10.8.0.7 255.255.255.255 リンク上 10.8.0.6 281
172.16.0.0 255.255.0.0 10.8.0.5 10.8.0.6 281
===========================================================================
こういうVPNの設定は「スプリットトンネリング」と言うと思うのだが、
openvpnではそのキーワードで検索してもヒットしない。
スイッチに接続するとローカルネットワークで通信できるようになる。
コントロールパネルでスイッチを作成し、サーバを停止してから接続する。
firewalldとiptablesの設定でローカルの通信を許可する。
pingが通ることを確認。
openvpn接続後、サーバのローカルネットワーク宛の通信ができることを確認。
ローカル間で接続したもう一台のサーバへのpingは応答がない。
openvpnで割り当てるサブネットのルーティングを追加してアクセスできるようになった。
接続したクライアントでroutingテーブルを見てみると、
デフォルトルートがVPN向けになっている...と思ったが
よくみると 0.0.0.0 128.0.0.0 だ。
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.11 25
0.0.0.0 128.0.0.0 10.8.0.5 10.8.0.6 281
10.8.0.1 255.255.255.255 10.8.0.5 10.8.0.6 281
10.8.0.4 255.255.255.252 リンク上 10.8.0.6 281
10.8.0.6 255.255.255.255 リンク上 10.8.0.6 281
10.8.0.7 255.255.255.255 リンク上 10.8.0.6 281
===========================================================================
設定ファイルserver.confの以下をコメントにする。
push "redirect-gateway def1 bypass-dhcp"
そして、以下を追加する。サーバのローカルネットワークである。
push "route 172.16.0.0 255.255.0.0"
これによって、サーバのローカルネットワークのみがVPN経由になる。
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.11 25
10.8.0.1 255.255.255.255 10.8.0.5 10.8.0.6 281
10.8.0.4 255.255.255.252 リンク上 10.8.0.6 281
10.8.0.6 255.255.255.255 リンク上 10.8.0.6 281
10.8.0.7 255.255.255.255 リンク上 10.8.0.6 281
172.16.0.0 255.255.0.0 10.8.0.5 10.8.0.6 281
===========================================================================
こういうVPNの設定は「スプリットトンネリング」と言うと思うのだが、
openvpnではそのキーワードで検索してもヒットしない。
2018/04/29
openvpn@centos7
参考
https://gtrt7.com/blog/linux/install-openvpn
流れとしては、
openvpnはrpmを作ってrpmからインストール
CA作成、サーバおよびクライアント証明書作成
※easyrsaを使うのが流行っているようだがopensslでもできるはず
openvpnの設定
firewalldの設定
クライアントにクライアント証明書一式をコピー
クライアント側設定
# cat /etc/openvpn/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Sun Apr 29 15:01:14 2018
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
myclient,xxx.xxx.xxx.xxx:58735,105510,491554,Sun Apr 29 14:59:27 2018
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,myclient,xxx.xxx.xxx.xxx:58735,Sun Apr 29 15:01:09 2018
GLOBAL STATS
Max bcast/mcast queue length,0
END
とりあえずつながって、サーバに10.8.0.xのアドレスでsshできることを確認。
本当はサーバのローカルネットワークにアクセスしたいのだが
うまくいってない。
後でやる。
https://gtrt7.com/blog/linux/install-openvpn
流れとしては、
openvpnはrpmを作ってrpmからインストール
CA作成、サーバおよびクライアント証明書作成
※easyrsaを使うのが流行っているようだがopensslでもできるはず
openvpnの設定
firewalldの設定
クライアントにクライアント証明書一式をコピー
クライアント側設定
# cat /etc/openvpn/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Sun Apr 29 15:01:14 2018
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
myclient,xxx.xxx.xxx.xxx:58735,105510,491554,Sun Apr 29 14:59:27 2018
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,myclient,xxx.xxx.xxx.xxx:58735,Sun Apr 29 15:01:09 2018
GLOBAL STATS
Max bcast/mcast queue length,0
END
とりあえずつながって、サーバに10.8.0.xのアドレスでsshできることを確認。
本当はサーバのローカルネットワークにアクセスしたいのだが
うまくいってない。
後でやる。
2018/04/28
新VPS
さくらのVPSで新しいサーバを借りた。
メモリ1GB
Centos7
userを作り、wheelに登録
sshのポート変更
firewalldでsshのポート許可、firewalld再起動
さくらのコントロールパネルでゾーンの登録
dns設定はすでにあり
yum update
selinuxはすでに無効
ntpdは動いていないが chronydというもので時刻は同期されている。
yum install httpd
systemctl start httpd
systemctl enable httpd
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
メモリ1GB
Centos7
userを作り、wheelに登録
sshのポート変更
firewalldでsshのポート許可、firewalld再起動
さくらのコントロールパネルでゾーンの登録
dns設定はすでにあり
yum update
selinuxはすでに無効
ntpdは動いていないが chronydというもので時刻は同期されている。
yum install httpd
systemctl start httpd
systemctl enable httpd
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
パソコンからアクセスしてテストページが表示されるのを確認。
/var/www/html
にindex.htmlを作る。
パソコンからアクセスして作ったindex.htmlが表示されるのを確認。
2018/02/23
bitzenyマイニング
bitcoinのマイニングには興味を持ったがコストや手間に見合わない感じでやっていなかった。
bitzenyというのは簡単にできそうなのでやってみたが簡単ではなかった。
さくらのVPSでやらせておこうと思った。
参考
https://qiita.com/you21979@github/items/1567d6d91588e53f15d6
が、
bitzenyのビルドができない
configureで
checking for Berkeley DB C++ headers... no
configure: error: libdb_cxx headers missing
というエラーになる。
berkeleyDBというのを入れる必要があるようなので入れてみる。
http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html?ssSourceSiteId=otnjp
インストール後再度 configure.... 同じ。
また今度!
windows用のwalletをダウンロードして起動。
...で?
とふと下の方を見ると同期中とかなんとか出てて、「3年と12週間遅延」とか言ってるんです。
もうね、アホかと。
bitzenyというのは簡単にできそうなのでやってみたが簡単ではなかった。
さくらのVPSでやらせておこうと思った。
参考
https://qiita.com/you21979@github/items/1567d6d91588e53f15d6
が、
bitzenyのビルドができない
configureで
checking for Berkeley DB C++ headers... no
configure: error: libdb_cxx headers missing
というエラーになる。
berkeleyDBというのを入れる必要があるようなので入れてみる。
http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html?ssSourceSiteId=otnjp
インストール後再度 configure.... 同じ。
また今度!
windows用のwalletをダウンロードして起動。
...で?
とふと下の方を見ると同期中とかなんとか出てて、「3年と12週間遅延」とか言ってるんです。
もうね、アホかと。
2018/02/12
onedrive始めました
毎月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に保存できる。
ほとんどは別に今すぐ必要ではないけど念のため取っておきたいとかいうようなものばかりだ。
必要なものだけを残せばいいのかもしれないがそれもメンドクサイ。
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。ホテルや交通機関ならデビットでも大丈夫だろう。
モバイルバッテリー
ライトニングケーブル
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の利用制限に引っかかったのか?
そして修正しているうちに認証できなくなってしまった。
調べていると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();
?>
ブラックリストに加えて、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();
?>