忍者ブログ
  ちゃんとカテゴリ分けされておりませんので、 記事をお探しならブログ内検索が便利です。 ご活用くださいませー+.(≧∀≦)゚+.゚
Admin*Write*Comment
[1]  [2]  [3]  [4]  [5]  [6

お客様要望によりFirewallは実施しないでほしいと受けた案件がありました。
理由は自社のIPがわからないから…
規模や、何らかの壁により情シスとうまく連携が取れない企業様はそれなりにいらっしゃいます。
強く説得したいところではありますが、今回はそのままにしました。
ですが…
案の定、ものすごいポートアタックを受けます。
そんな無法者はさすがにブロックしたほうがよいと判断し、ブロックすることにしました。
当方では下記IPから雑にsniffingを受けたのでブロックします。
とりあえず、IP制限は実施したいけど、日本以外全部、は大変だなとお考えの方など参考になれば幸いです。

103.89.89.205
109.248.9.9
111.230.192.23
112.85.42.0/24
113.108.72.2
115.238.245.0/24
115.88.201.58
116.31.116.10
118.123.15.142/24
12.133.183.226
122.226.181.0/24
123.249.27.172
125.212.207.205
125.65.42.0/24
142.93.22.237
149.202.10.227
165.84.191.236
180.76.176.4
182.61.44.11
193.70.6.197
201.235.245.224
202.126.46.39
221.217.48.187
46.188.16.55
5.188.10.156
51.223.47.100
58.218.92.33
61.184.247.0/24
61.184.247.2
81.192.31.134
94.23.145.124
95.156.31.74


検索タグ
セキュリティ、IP制限、iptables、ファイアウォール、firewall

拍手

PR



とある案件でAPIを実装することになりました。
クライアント側とサーバ側でベンダー異なるのですが、サーバ側の実装を待たずしてクライアント側でテスト的にモックが欲しいとのこと。
Google先生に聞いてみたらRESTfulなAPIをサクッと作れるミドルウェアがあると聞いて!
nodeで実装されたJSON形式のファイルを取り扱えるみたい。
早速試してみました!!

# OSの確認
$ uname -a
Linux localhost 4.4.0-128-generic #154-Ubuntu SMP Fri May 25 14:15:18 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/debian_version
stretch/sid
# まず、環境を整えます
sudo apt install -y npm
sudo npm install -g json-server
ln -s /usr/bin/nodejs /usr/bin/node
npm install -g n
n stable
json-server -v
# ダミーデータを投入
cat << __ > db.json
{
    "prefecture": [
            {"id":1, "name": "北海道", "yomi": "ホッカイドウ"},
            {"id":2, "name": "青森県", "yomi": "アオモリケン"}
        ]
}
__
# そしてサーバを起動
json-server db.json --watch --port 80 --host 192.168.3.91&
# GETのテスト
curl http://192.168.3.91/prefecture
curl http://192.168.3.91/prefecture/1

# POSTのテスト
curl http://192.168.3.91/prefecture -d 'name=岩手県&yomi=イワテケン'
curl http://192.168.3.91/prefecture -d 'name=宮城県&yomi=ミヤギケン'

# DELETEのテスト
curl http://192.168.3.91/prefecture/3  -X DELETE
curl http://192.168.3.91/prefecture -d 'name=岩手県&yomi=イワテケン'
curl http://192.168.3.91/prefecture

# IDのインクリメントの法則を試してみる
curl http://192.168.3.91/prefecture/4  -X DELETE
curl http://192.168.3.91/prefecture/5  -X DELETE
curl http://192.168.3.91/prefecture

# 再びPOST
curl http://192.168.3.91/prefecture -d 'name=岩手県&yomi=イワテケン'
curl http://192.168.3.91/prefecture -d 'name=宮城県&yomi=ミヤギケン'
curl http://192.168.3.91/prefecture

なるほど、これなら簡単ね(*^^*)
ただ、POSTが必ずしも登録ではなく、リクエストの一環としてやってくることも多いのが少し悩ましいところね。

以上、JSON-Serverでした。

拍手




多くのデータを分散処理したいことが多々あります。
並列化は一筋縄でいかないことはシステムを組んでみようと考えたことがある人なら難易度は低くないことは容易に想像がつくと思います。
特に処理をプロセス間で重複させないためのシリアライズは手を焼く仕組みの一つです。
この話をメンバに相談すると必ずキューイングがやり玉にあがるのです。

そうキューイング信者が社内にいるのです…
何かとキューキュー騒ぐので、何もたいそれたシステムを導入しなくても実現できるんじゃない?
と思いまして、調べたところ、DBで簡単に実現できそうでした♪

参考:
https://lightgauge.net/database/sqlserver/962/

まず、キューとなるテーブルを作成します。
psql
DROP TABLE mq ;
CREATE TABLE mq (
    id serial, 
    message text, 
    primary key(id)
);
\q

次に、テスト用にキューを貯めていきましょう。
for i in $(seq 1000)
do
    value=''
    for i in $(seq 10)
    do
        value="$value ,('hoge')"
    done
    psql -c "INSERT INTO mq(message) VALUES('hoge') $value "
done


キューを払い出しつつ、キューを削除していきます。
DELETE FROM mq WHERE id = (SELECT id FROM mq WHERE pg_try_advisory_lock(tableoid::int, id) LIMIT 1) returning *;

ターミナルをいくつか立ち上げて、下記コマンドを投げまくってみます。
\rm /tmp/hoge
for i in $(seq 600)
do
    psql -c"DELETE FROM mq WHERE id = (SELECT id FROM mq WHERE pg_try_advisory_lock(tableoid::int, id) LIMIT 1) returning 'hoge', *;" >> /tmp/hoge
done

結果を確認します。
うまくシリアライズされていました。
grep DELETE hoge | sort | uniq -dc
   1189 DELETE 1


行ロックを取得しない版も投げてみます。
\rm /tmp/hoge
for i in $(seq 600)
do
    psql -c"DELETE FROM mq WHERE id = (SELECT id FROM mq LIMIT 1) RETURNING 'hoge', *;" >> /tmp/hoge
done

処理がシリアライズできていないので二重処理してしまい、後から処理したものは削除ができず、0件になっています。
grep DELETE hoge | sort | uniq -dc
     37 DELETE 0
   1138 DELETE 1

これでPythonのQueueクラスのようなキューイングシステムができました。

小~中規模程度にしか通用しなさそうですが、やれ、ミドルウェアが必要だの、
OSのバージョンアップが必要だの、大げさな話になるくらいならこれくらいライトに初めてもいいのではないでしょうか^^

拍手




Python2でもおおよそ動くと思うけどね。
もう2018年だし、そろそろね?2系は卒業しよう。
と、いうことで、loggingでーす。
すぐ忘れるのでMyめもです。
今までは雑にルートロガーを使うことが多かったですが、Windowsで作業していると出力がSJISになっちゃうので。。。
慣れる意味でもちゃんとLoggerを使いましょう、という教訓。

import sys
from logging import getLogger, FileHandler, Formatter, DEBUG

APP_PATH = os.path.dirname(sys.argv[0])
TMP_PATH = os.path.join(APP_PATH, "tmp")
LOG_FILE_PATH = os.path.join(TMP_PATH, "logs")
LOG_FILE_NAME = "{}.log".format(datetime.datetime.today().strftime("%y%m%d%H%M%S"))
LOG_FILE = os.path.join(LOG_FILE_PATH, LOG_FILE_NAME)
LOG_FORMAT = ("\t".join(['"%(asctime)s"',
                         '"%(levelname)s"',
                         '"%(thread)d"',
                         '"%(module)s"',
                         '"%(funcName)s"',
                         '"%(lineno)d"',
                         '"%(message)s"',
                         ]))

logger = getLogger(__name__)
handler = FileHandler(filename=LOG_FILE, encoding='utf-8')
handler.setLevel(DEBUG)
handler.setFormatter(Formatter(LOG_FORMAT))
logger.setLevel(DEBUG)
logger.addHandler(handler)



拍手




yum -y update
yum -y upgrade
yum -y install vim wget make gcc-c++ perl

# https://launchpad.net/ufw/
ufw_ver=0.35
ufw_url=https://launchpad.net/ufw/${ufw_ver}/${ufw_ver}/+download/ufw-${ufw_ver}.tar.gz


cd /usr/local/src
wget $ufw_url

tar xzf ufw-${ufw_ver}.tar.gz
cd ufw-$ufw_ver
sudo python ./setup.py install
cd ../
sudo rm -rf ufw-$ufw_ver
sudo chmod -R g-w /etc/ufw /lib/ufw /etc/default/ufw /usr/sbin/ufw

sudo service iptables stop
sudo service ip6tables stop
sudo chkconfig --del iptables
sudo chkconfig --del ip6tables

ufw disable
yes y | ufw reset
ufw default deny incoming
ufw default allow outgoing
ufw allow from 192.168.0.0/24 to any port 22
yes y | ufw enable
ufw status
# 検索タグ CentOS6 UFW iptables firewall

拍手




Ubuntu 16.04 (14.04 からの do-release-upgrade)

ちまたで流行りつつあるヘッドレスブラウザの新星として最近注目を浴びているChromeを使ってみようと思いました。

参考: https://qiita.com/meguroman/items/41ca17e7dc66d6c88c07

いうがままにインストールしてみたけど・・・ライブラリが足りないようで叱られてしまいます。
もしかしたら16.04のネイティブ版だと問題ないのかもしれませんが、アップデートによりバージョンを上げているのが影響しているのかも?
Ubuntuはいろいろ丁寧に教えてくれるので、エラー画面を読み解き、必要とされているパッケージを入れてみました。

# 2017/12/27時点
apt install gconf-service gconf-service-backend libgconf-2-4 gconf2-common libnspr4 libnss3 xdg-utils libnss3-nssdb libasound2 libasound2-data

# 2018/06/28最新
sudo apt install -y gconf-service gconf-service-backend libgconf-2-4 gconf2-common libnspr4 libnss3 xdg-utils libnss3-nssdb libasound2 libasound2-data unzip fonts-liberation libappindicator3-1 libxss1 libindicator3-7 indicator-application

# ヘッドレスChromeのインストール
curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
再度実行してみます。

# google-chrome-stable --headless --dump-dom http://blog.mor-maid.info > test.thml
[1227/100537.751273:ERROR:zygote_host_impl_linux.cc(88)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
なんかrootユーザだとご都合悪いみたいね。
正しいと思うけど(笑)

書いてある通り --no-sandbox をつければできるみたい。
同じように躓いている方がいたらご参考にどうぞ。

拍手




Linuxサーバのiptablesがきちんと設定できているか不安だったので、外部からポートチェックをしようと思いました。
そんなサービスいまどき溢れているかと思いきや、セキュリティの観点からか、あまりないんですね。
もちろん1ポートあたりのチェックはいっぱいあるのですが、65536ポート全部舐めるようなサービスはおいそれと見つかりませんでした。

ならば、自前で作成してしまえ、というわけです。
もちろん外部サーバがあればね(笑)

python

import csv
import traceback
from telnetlib import Telnet

host = 'check.your.host'

with open("result.tsv", "w") as f:
    w = csv.writer(f, delimiter="\t")
    for port in range(1, 65535):
        res = ""
        try:
            Telnet(host, port, timeout=2)
        except Exception as e:
            res = str(e)
        w.writerow([port, res])
        print(port, res)

拍手




ちょっと遅いネタだけど、目についちゃったので‥‥
http://blog.livedoor.jp/dqnplus/archives/1943704.html

まぁ、ホリエモンも大口叩いて注目集まれば勝ちなんでしょうけど。

コメントにもある通り、適正を度外視して誰にでもできる、となれば殆どの仕事が誰にでもできると思うけど。

だれでもなれる、ならわかるけどね。
誰でも「できる」は違うと思うわ。
そもそも「できる」の定義もしないまま話をしているので、正解といえば正解だと思うけど。
でもこれだけは言えると思うわよ?

本当に誰でもできる仕事は将来、AIやロボットに置き換わる。
そして保育士は置き換われない。

「人」でなければならない仕事は、本来価値が有るべき、と思います。

拍手




久しぶりに一人の時を過ごしています。
ワケあって、仕事も休んでいます。

少し暑いと感じる日差しと、少し肌寒く感じる風が今という現実を唯一繋いでいるかのよう。

ひとり

なんてことない日常なのに…
いざ訪れてみると何年も忘れていた非日常の世界。

なんとなく、若かりし頃の気持ちになっている。
どこか別の世界に飛び込みたい、そしてそのことになんの抵抗も感じないような気持ち。
大人になると、それだけでいろいろなしがらみに囚われ、縛られ、童心を忘れていくのだと感じた。

新しい知識・体験・干渉。
それはときに忙しさだったり、夢中になる時間だったり。
重ねるごとに年輪のように内側へと閉じ込められ、過去のエクスペリエンスは懐古の中に溶けていく。

しかし外側からどんなに深く隠されようと、刻まれた年輪はなくならない。
何かのトリガーでフラッシュバックすることもあるでしょう。

「懐古厨」と罵る人もいるでしょう。
でも私はそうは思わない。
そこにあった自分こそが、生粋の自分なんだと思う。
その気持と向き合ったとき、これからの自分に必要なものだと感じたから。

拍手




Python3.5 * Django1.9 with Postgresql9.5 構成のバッチプログラムが見たこともないエラーを出力しました。

psycopg2.DatabaseError: lost synchronization with server: got message type ",", length 539107884

何だろう・・・これ?
ググってもなかなか答えが出てこない…
このバッチ自体は2か月以上運用実績があるのに…

近そうだったのが、これ。
https://www.postgresql.org/message-id/2164.1435070683%40sss.pgh.pa.us
どうも、OOM(Out of memory)のようです。

PostgresqlはキャッシュデータをOSと共有するので、Shared Memory(shared_buffur)は少ない方がよい。
というのを見て、initdbのまま(128MB)で運用していたのが原因みたい。
SELECTの対象となったデータは数十MB程度だったのだけど、並列処理していたので、合計でこの値を上回ってしまったみたい。

ではなぜ、運用開始直後から出なかったかというと、じつは直近でDBサーバをSSDに変えたのがありました。
浅はかな知識で理解する限りPostgresqlはクラスタから引き出したデータは一度共有メモリに展開します。
その後クライアントに送られます。
クラスタから引き出されたデータは順次クライアントに送られます。
ですが、データが大きく引き出す速度が転送速度を極度に上回った場合、共有メモリを圧迫します。
その結果OOMが発生し、lost synchronizationが発生したと思われます。
シンクロナイゼーション、すなわち、共有バッファとクライアントの同期が失われた。
共有バッファ上のデータがクライアントに到達する前にロストしたってことみたい。

うーん、DBチューニングは奥が深いわねぇ…

検索タグ
Postgresql9.5.3
Python3.5.0
Django1.9

拍手



ブログ内検索
カレンダー
09 2018/10 11
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
カウンター
最新トラックバック
プロフィール
+ハンドル+
y_ayamori(purple)
+職業+
IT系エンジニア
+すまい+
さいたま
バーコード
ブログパーツ
アバター
Copyright © アナログを愛するデジタル生活館 All Rights Reserved.
photo by Kun material by Atelier Black/White Template by Kaie
忍者ブログ [PR]