[Work/TechInfo/other]

まっさらな状態からのMSYS2+GCCでWindows上にC言語とC++の環境を整える / 2017-05-12 (金)

概要

2017年初頭現在では,一番簡単にWindows上にC言語の開発(学習)環境を整える方法が,Unixツール群であるMSYS2をインストールし,MSYS2のパッケージマネージャでgccを入れることである.(clangはまだ多少問題ありとのことでgccを使う.)

MSYS2とパッケージマネージャpacmanを使ったgccのインストール

MSYS2 installerページから,msys2-x86_64-201*(64bit版)もしくはmsys2-i686-201*.exe(32bit版)のどちらかを環境に応じて落として実行.(本記事では64bit版を扱う)

HOME環境変数の事前設定

Windows上の「ユーザ」環境変数HOMEを,自分のWindowsのホームディレクトリを表す「%USERPROFILE%」にしておく(しておかないと,Windowsのホームディレクトリとは独立したホームが作られるので厄介).Windows 10におけるユーザ環境変数設定方法は,

  1. Windowsメニューを右クリック→コントロールパネル→「大きいアイコン」にして→ユーザアカウント→一番左のメニューの下に「環境設定の変数」がある.
  2. 「"ユーザ名"の環境変数」と出てくるので,「新規」ボタン.
  3. 変数名「HOME」,変数値「%USERPROFILE%」を入れておく.

インストール場所

おそらくCドライブ直下が理想的なのだろうが,どこにでもインストールできる.(ただしシンボリックリンクを含んでいるとダメ)

作成されるショートカットの中身

スタートメニューには,「MSYS2 MSYS」,「MSYS2 MinGW 64-bit」,「MSYS2 MinGW 32-bit」の三つが登録されており,それぞれ,MSYS2をインストールした場所の「msys2_shell.cmd」に与えるオプションが違っており,起動時に別の環境変数を与える.

  • 「MSYS2 MSYS」の実態は「msys2_shell.cmd -msys」
  • 「MSYS2 MinGW 64-bit」の実態は「msys2_shell.cmd -mingw64」
  • 「MSYS2 MinGW 32-bit」の実態は「msys2_shell.cmd -mingw32」

である.

MSYS2のパッケージマネージャシステム

pacmanというパッケージ管理コマンドが存在している.2017年年始時点では既に新しいバージョンなので,

$ pacman -Syu

pacman本体と全体の更新,

$ pacman -Sy

で,データベースの更新,

$ pacman -Su

で,インストール済みのパッケージを更新,

$ pacman -S <package_name>

で,指定したパッケージのインストールである.

64bit用MinGWのインストール

pacmanパッケージマネージャを使って,「base-devel」パッケージと,mingw-w64-x86_64-toolchain」パッケージを入れる.

$ pacman -S base-devel mingw-w64-x86_64-toolchain

で入るが,mingw-w64-x86_64-toolchainパッケージのインストールの途中でGCCが対応しているCやC++以外の言語についても入れるか訊いてくる.(base-develはデフォルト=allで全部入れてしまって大丈夫)

:: 16 のパッケージがグループ mingw-w64-x86_64-toolchain にあります:
:: リポジトリ mingw64
   1) mingw-w64-x86_64-binutils  2) mingw-w64-x86_64-crt-git  3) mingw-w64-x86_64-gcc
   4) mingw-w64-x86_64-gcc-ada  5) mingw-w64-x86_64-gcc-fortran  6) mingw-w64-x86_64-gcc-libgfortran
   7) mingw-w64-x86_64-gcc-libs  8) mingw-w64-x86_64-gcc-objc  9) mingw-w64-x86_64-gdb
   10) mingw-w64-x86_64-headers-git  11) mingw-w64-x86_64-libmangle-git
   12) mingw-w64-x86_64-libwinpthread-git  13) mingw-w64-x86_64-make  14) mingw-w64-x86_64-pkg-config
    15) mingw-w64-x86_64-tools-git  16) mingw-w64-x86_64-winpthreads-git

以下のようにCとC++関係のものだけ入れる.

選択して下さい (デフォルト=all): 1 2 3 7 9 10 11 12 13 14 15 16

GCCの実行

先ほどのショートカットから「MSYS2 MinGW 64-bit」(実態は「msys_shell.cmd -mingw64」) を起動して,

$ gcc -v
$ g++ -v

で動くかどうかを確かめる.

MSYS2の設計思想

上記のショートカットというかオプションで分かる通り,MSYS2は起動時のオプションで,

  • 「MSYS2 MSYS」 : UNIX作業環境
  • 「MSYS2 MinGW 64bit」 : 64bit向けバイナリを生成するコンパイラを利用する環境
  • 「MSYS2 MinGW 32bit」 : 32bit向けバイナリを生成するコンパイラを利用する環境

と3つの状態を切り分けて使う,Windows用としては理想的な設計になっている.

.minttyrc

msys_shell.cmdはminttyを呼んでいて,実際にユーザが触る端末エミュレータはminttyなので,ホームディレクトリ直下に.minttyrcという設定ファイルを作っておくとよい.

Transparency=high
Locale=ja_JP
Charset=UTF-8
BackspaceSendsBS=yes

上の内容を.minttyrcに書いておくと,日本語がデフォルトになり,かつスケスケ!になる.

[ ツッコミの受付は終了しています ]
この記事のリンク元 | 10 |

[Work/TechInfo/other]

海外からのSSH接続を禁止したり時間制限をかけるiptablesと自動起動,sshguardの導入 / 2017-03-29 (水)

概要

ipsetを使うと複数のまとまりのIPアドレスをそのまま扱うことができる.

また,http://nami.jp/ipv4bycc/cidr.txt.gzにて,国内のIPアドレス範囲の一覧が公開されている.

これを利用して「ホワイトリスト」を作ることで,国内からのSSHのみ受けることができる.

またiptablesはリブートすると内容が消えてしまうので,最初にスクリプトを走らせてテーブルのruleファイルを生成,さらにsystemdのサービスに登録するための設定ファイルを書いて,systemdに登録しておくと,再起動時も自動的に適用される.

さらにsshguardを導入すると長めの設定時間内に認証開始の接続回数を超えると,かなり長めにブロックし,最終的には永久にブロックすることが可能になる.Ubuntuだとiptablesが入ってればsshguardもインストールするだけで自動的に設定されるので,とりあえず入れておけばかなり安全度が上がる.

以下はUbuntu 16.04LTS用.

iptablesの設定

#!/bin/bash
 
# 国別コードリストをダウンロード
cd /tmp
if [ -s cidr.txt ]; then
    mv cidr.txt cidr.txt.old
fi
 
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz
 
# ホワイトリストを作成
ipset create -exist WHITELIST hash:net
 
# ホワイトリストに日本のIPアドレスを登録
sed -n 's/^JP\t//p' cidr.txt | while read ADDRESS; do
    ipset add WHITELIST $ADDRESS
done

# IPテーブルのセッティング
# ——————
# default setting
# ——————
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -F
iptables -X

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ——————

# ブラックリストは今回使わないので,コメントアウト
# iptables -A INPUT -m set –match-set BLACKLIST src -j DROP
# HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# SSH, SFTPなどを国内からの接続に制限する
iptables -A INPUT -p tcp -m tcp --dport 22 -m set --match-set WHITELIST src -j ACCEPT
# SSH, SFTPの接続開始(認証)を300秒に5回までに制限する
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --set
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --update --seconds 300 --hitcount 5 -j DROP
# そのサーバの機能に必要な必要な範囲を開けて,国内からの接続に制限する
iptables -A INPUT -p tcp -m tcp --dport 60100:60200 -m set --match-set WHITELIST src -j ACCEPT

# 再起動時にiptableのルールを読み込めるように,ファイルに書き出しておく
iptables-save > /etc/iptables.rules

このシェルスクリプトを最初にsudoで実行しておく.すると,/etc/iptables.rulesに設定が吐き出される.

起動時に実行するスクリプトは以下.

#/bin/sh
cd /tmp
wget http://nami.jp/ipv4bycc/cidr.txt.gz -P /tmp
gunzip /tmp/cidr.txt.gz

ipset create -exist WHITELIST hash:net

sed -n 's/^JP\t//p' /tmp/cidr.txt | while read ADDRESS; do
    ipset add WHITELIST $ADDRESS
done

/sbin/iptables-restore < /etc/iptables.rules

最初に実行したスクリプトから,リストをダウンロードしipset WHITELISTを指定する処理を抜き出した部分と,事前に書き出したルールファイルからiptablesを読み込む処理の部分からなる,このシェルスクリプトを/opt/iptables_ssh_jpn_only.shとして作っておき755を与えておく.

[Unit]
Description = SSH allowd only JPN IP

[Service]
ExecStart = /opt/iptables_ssh_jpn_only.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

これがsystemdの設定ファイルなので/etc/systemd/system/iptables_ssh_jpn_only.serviceとして作っておく.

$ sudo systemctl list-unit-files --type=service

の出力の中に含まれていれば,systemdに認識されている.あとは自動起動の設定をして起動する.

$ sudo systemctl enable iptables_ssh_jpn_only
$ sudo systemctl start iptables_ssh_jpn_only

とすれば,再起動されても自動的にiptablesが読み込まれるようになる.

sshguardのインストール

$ sudo apt install sshguard
$ sudo systemctl enable sshguard
$ sudo systemctl restart sshguard

Ubuntuはiptablesがインストールされていれば,これだけで,

SSHGuardのデフォルトの挙動では、20分間に4回攻撃を検出すると、そのIPアドレスからの接続をブロックします。接続ブロックは一定時間経過すると解除します。但し、接続ブロックから20分以内に再度攻撃を検出すると、ブロック時間を長くしていきます。ブロック回数とブロック時間は以下のようになります。

1回目:420~630秒間の範囲内でブロック
2回目:840~1260秒間の範囲内でブロック
3回目:永久にブロック

SSH総当たり攻撃(辞書攻撃/ブルートフォースアタック)の対策とその効果 - パソコン鳥のブログ

の設定がされる.


[Work/TechInfo/other]

研究室で非公開でgitサーバを使うためにGitBucket / 2017-02-02 (木)

はじめに

うちの学校・学部というかうちのコースでは,ポリシー上「許可を得ずに作品をネット上に公開する」ことができない.ソースコードが「作品」に含まれるかはビミョーだが,当然そのポリシーがない学校や研究室によっても,プロジェクトによっては公開できないこともある.

そこでTomcat上で動作するWebインタフェースを持つGitサーバGitBucketを用いる.

もちろん普通にgitサーバを立ち上げてもいいのだが,GitBucketはもともとgithubクローンとして開発されていた(現在はgithubからのクレームによりユーザインタフェースが変更されているが,基本的には同じ)ためWebインタフェースを持ち,githubと同じ感覚で使うことができる.

おまけに(うちではNISで提供されている)Unixユーザとgitユーザの切り分けもできる.

Ubuntu 16.04LTSでのインストールと設定

Oracle Java8のインストール

GitBucketはTomcatをJava8で動かすことを要求する.

普通にaptのレポジトリにppa:webupd8team/javaを追加して,apt updateinstall

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt update
$ sudo apt install oracle-java8-installer

途中で「いいえ」「はい」の選択があるが,内容を読めばわかる通り「はい」を選択.システムで使用するJDKの選択も自動的にしてくれる.

Tomcat 8のインストール

$ sudo apt install tomcat8

で普通に入る.

GitBucketのインストール

GitBucketはTomcatのプロジェクト実行アーカイブ形式gitbucket.warという形で配布されている.単にこの.warファイル(2017年2月頭現在のGitBucketのバージョンは4.9)を/var/lib/tomcat8/webapps/以下に配置することで,デプロイ状態となる.

$ cd /var/lib/tomcat8/webapps/
$ sudo curl -L -O https://github.com/gitbucket/gitbucket/releases/download/4.9/gitbucket.war

GitBucketが設定やレポジトリの保管に使うディレクトリを作成し,そのディレクトリのオーナー,グループをtomcat8に変更しておく.

$ sudo mkdir /usr/share/tomcat8/.gitbucket
$ sudo chown tomcat8:tomcat8 /usr/share/tomcat8/.gitbucket

Tomcat8を起動.

$ systemctl restart tomcat8

sudoをつけないでsystemctlを実行すると「誰で実行するか」訊かれるので,管理アカウントがある場合(例えば安藤の場合はwheelというかsudoersに入っている「daichi」アカウントで通常作業をするのだが,その他にシステム全体の管理者として「linuxadmin」のようなアカウントを作って,システムはそのユーザの所有にしてある.),管理アカウントを選択してsystemctlを使うのが良さそう.

これはこの間のOneDriveデーモンをsystemdで管理する時にわかったのだけれど,systemdはユーザモードというかそういう感じのものを持っていて,sudoersに所属するユーザがsudoを使ってsystemctlを使っても「ユーザがsystemctlを叩いた」意味になるっぽい.

Tomcat8の自動起動の設定.

$ systemctl enable tomcat8.service

とすると,

tomcat8.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install enable tomcat8

当たり前だけどnativeサービスではないので,勝手にsystemd-sysv-install enable tomcat8が呼ばれるらしい.

自動起動されることを確認するために,再起動して,host名:8080/gitbucket/にアクセスすると,

このような初期画面が出てくる.root/rootでログインできるので,ログインしてパスワード変更,ユーザ追加(GitBucketの場合ユーザはLinuxユーザからは独立している)等の設定を行う.

[ ツッコミの受付は終了しています ]
この記事のリンク元 | 21 |

[Work/TechInfo/other]

シェル芸事例 / 2017-01-11 (水)

grepしてsedで置き換え

$ grep -l '置換対象の文字列' ./hoge* | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'

xargsは「`」と同じ役割を果たす.


[Work/TechInfo/other]

ソースからインストールしたNode.jsのPREFIXにシンボリックリングがある場合のmake uninstall / 2017-01-04 (水)

自分の環境ではホーム以下にシンボリックリンクが多い

自分の環境は,どのOSでも「~/Utils」以下にbin, etc, lib, include, share, src, site-lisp, libexec, info等のシンボリックリンクがあり,これが「~/Dropbox/Utils/OSX/bin」「~/Dropbox/Utils/Windows/bin」などOSごとに作ってあるディレクトリの実体へ張られている.

つまり,Dropbox以下に自分が必要なツールは基本全て入っていて,そこからそのマシンに必要なUnixファイルツリーをシンボリックリンクで貼ってくる,という形をとっている. (dotfilesも~/Dropbox/Utils/Dotfiles/(例えば).bashrcに実体があり,~/.bashrcはシンボリックリンク..bashrc内部で各OSやマシンごとに条件分岐させている.)

そのため,ソースからmake installする場合(OSXでもbrewなどは使わないため,わりと多い),

$ cd ~/Utils/src/node-v0.12.1
$ ./configure --prefix="/Users/daichi/Utils"

という感じで~/Utils以下をprefixとして,makeしてmake installする.

Node.jsはmake installでpythonスクリプトを呼んでいる

ところがNode.jsの場合,make installやmake uninstallの内部ではpythonスクリプトを呼び出している.make install時には何も問題が起きないが,make uninstallしようとしたら,

myMac:~/Utils/src/node-v0.12.1 daichi$ make uninstall
/usr/bin/python tools/install.py uninstall '' '/Users/daichi/Utils'
removing /Users/daichi/Utils/bin/node
Traceback (most recent call last):
  File "tools/install.py", line 202, in 
    run(sys.argv[:])
  File "tools/install.py", line 198, in run
    if cmd == 'uninstall': return files(uninstall)
  File "tools/install.py", line 130, in files
    action(['out/Release/node'], 'bin/node')
  File "tools/install.py", line 80, in uninstall
    def uninstall(paths, dst): map(lambda path: try_remove(path, dst), paths)
  File "tools/install.py", line 80, in 
    def uninstall(paths, dst): map(lambda path: try_remove(path, dst), paths)
  File "tools/install.py", line 77, in try_remove
    try_rmdir_r(os.path.dirname(target_path))
  File "tools/install.py", line 52, in try_rmdir_r
    os.rmdir(path)
OSError: [Errno 20] Not a directory: '/Users/daichi/Utils/bin'
make: *** [uninstall] Error 1

make uninstallから呼ばれているPythonスクリプトに怒られた.  

どうやらOSXにおいては,シンボリックリンクはPythonにとってディレクトリじゃないらしい.

解決法 シンボリックリンクを含まないフルパスでconfigureし直す

いかんせん内部でpythonスクリプトが呼ばれているため,シンボリックリンクを含まないフルパスでconfigureし直してmake uninstallできるか確証は無かったが,

$ ./configure —prefix =“/Users/daichi/Dropbox/Utils/OSX”
$ make uninstall

で無事にmake uninstallが通った.