かゆいとこログ

あと少しなのに届かないかゆいところに効きます

JavaとおさらばしてJuniper SSLVPNをLinuxから快適に利用

うちの大学はネットワークが学内で閉じており、学外からの接続手段としてJuniper Networksのsslvpnを採用しているので、これを使わねばならない。

Chromeでsslvpnサービスを提供してるサイトへ飛んで、「ネットワークコネクト」を実行するとJRE がインストールされていないか、Java が無効です。

って表示される。色々インストールしてもうまくいかないので、調べていると、

Chrome

バージョン42以降のChromeブラウザ。Chromeバージョン42 (2015年4月リリース)以降、Chromeはブラウザがプラグインをサポートする標準的な方法を無効化しました。詳細

 

(https://java.com/ja/download/help/enable_browser.xml)

モダンなブラウザではJavaが標準で無効どころか、そもそも有効化する手段がないという感じ。

FlashHTML5に取って代わったみたいな、パラダイムシフトかな。

 

とにかく、このままではSSLVPNに接続できないので困ってしまう。
いろいろ調べていたら、どうやらLinuxのコマンド一発でJuniper NetworkのSSLVPNに接続できる方法があるらしい。Javaも必要ない。(筆者はLinuxのノートPCを使っている)

https://www.scc.kit.edu/scc/net/juniper-vpn/linux/

このサイトに、パーフェクトな説明があった。

configurationファイルは、説明にあるとおり

~/.juniper_networks/network_connect/config

に作成し、このディレクトリ内に

somename.conf (デフォルトの構成なら "default.conf")

という形で記述する。

confファイルの中身は

host=foo.bar.com
user=username
password=secret
realm=very long realm with spaces
cafile=/etc/ssl/bar-chain.pem
certfile=

こんな感じにする必要がある。
cafileは、".pem"の拡張子を持つファイルが/etc/ssl/certsに転がってるので、対応するものを探して記入する。
もしくは、サーバー証明書を落としてきて、certfileにパス追加する。

正直、あまりにも簡単にできたので拍子抜け。

 

これができたら好きなときに

$ jnc --nox

で接続開始

$ jnc stop

で接続終了!

また1つ幸せになりましたね〜

UbuntuにApache導入してWebサーバ立てるまでのかゆいところ

Apache導入、CGIスクリプトの作成とファイルアクセス

そもそも、なぜApacheが必要なのか

WebブラウザにHTML等要求されて、応答を返すなどという仕組みは(当たり前だが)本来備わっていないので、これを可能にするApacheというWebサーバーを導入することが必要。

こんなの書くまでもないけど、以下を見れば違いが分かる(Apacheの場合)。

webサーバが動いていないマシン:
$ curl http://localhost
curl: (7) Failed to connect to localhost port 80: 接続を拒否されました

webサーバが動いているマシン:
$ curl http://localhost

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
(中略)
</html>

*Apacheの場合、localhostにアクセスするとdefault page的なものが表示される。


CGIってなにそれ?

CGI(Common Gateway Interface)は、ウェブサーバ上で好きなプログラムを動作させる仕組み.

名前のとおり、単なるInterfaceなので、様々な様々な言語で実装されている. Pythonもその1つ.

-- 2017年6月10日 追記 --
私の説明がゴミなので、古いSoftware Designに書いてあった一節も引用させて頂く。

CGIというのは Common Gateway Interfaceの略で、単純に言うとブラウザからWebサーバに置いてあるプログラムを起動するための仕様です。CGIという言葉はInterfaceを指すので、CGIで動く(動かされる)プログラムのことは、CGIプログラムやCGIスクリプトという方が丁寧です。スクリプト言語で書いた場合はCGIスクリプトというのが良いでしょう。
 CGIプログラムはどんな言語で作っても構いません。C言語で書いても良いわけですが、この領域ではLightweight Language(LL言語)で書かれることがほとんどであり、伝統的にはPerlPHPが多く、最近ではRubyPythonもよく使われます。

開眼シェルスクリプト第19回 by 上田隆一 (Software Design 2013 July P.122)

実行環境?

Ubuntu 16.04

Apache/2.4.18

 

aotake-rail.raindrop.jp

↑これを参考にした。ホームディレクトリ直下で

$ mkdir public_html

及び

$ chmod 770 public_html

として、(groupのpermissionは7にしないとだめなはず。)

続けて、

$ a2enmod userdir

ユーザーディレクトリの指定かな?

$ a2enmod cgid

CGIを使用可能にする。

を入力。

このあと、URLの先にもあるように、

mime.conf を編集して、.cgi の拡張子を持つファイルを cgi-script として処理するよう設定する。userdir.conf を編集して、public_html ディレクトリに ExecCGI Option を付加する。

(これをやらないと、cgiファイル読むときに、web-serverが、これXMLだわwwとか言って読みだしてエラー吐いて死ぬ) 

を行ってから再起動して終了。

 

Permissionについて

普通にCGIからサーバーのファイル触ろうとするとPermission denied食らう。
$ chmod 777 [FILE] ってしちゃえば行けるが、危険すぎる。
Apache2の場合はwww-dataなるuserがapacheを動かしているということを知る。

以下のサイトとか参考にする。Stack overflowのやつはわざわざvarwwwusersとかいうグループを追加しているが、必要ない。(下記参考)

stackoverflow.com

qiita.com

$ less /etc/apache2/envvars

とすることで、apache環境変数覗ける。
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
と記されており、userもgroupも"www-data"になっていることが分かる。

よって使用しているディレクトリ(今回cgiを書いているのは~/public_html/以下である)に対して、

$ sudo chgrp -R www-data ~/public_html

と入力してやる。(~/public_html以下のファイルを、グループ"www-data"の所有物にする. -R はRecursive(再帰))
次に、

$ sudo chmod -R 770 ~/public_html

としてやることで、適切なPermissionとなり、apacheがpublic_html配下のファイルにアクセスできるようになる。

デフォルトシェルをbashにしたい

screen実行時にbashになっていない場合もこれで解決。

現在のシェルを確認。

$ echo $SHELL

もしくは

$ cat /etc/passwd | grep [ユーザー名]

これで何も表示されない場合は、default shellが設定されてない。

 

設定するには

1. /etc/passwdを直接編集(やったことないしおすすめしない)

2. chshを使う

$ chsh [ユーザー名]

これで対話式にシェルを変更可能。-sオプション使っても良いけど。

※一度ログアウトし直さないと反映されないので注意!

Dynamic Programmingについて

動的計画法(DP, Dynamic Programming)について

最近やたらと動的計画法という単語を聞くので、基本をまとめておく。

動的計画法とは?

動的計画法(どうてきけいかくほう、英: Dynamic Programming, DP)は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。
引用:Wikipedia

え?それって分割統治法じゃない?
同じものなのかな?

分割統治法と動的計画法の違いについて

アルゴリズムを設計する際には、まず全体をいくつかの小問題に分解して、その一つ一つを解いていくことにより全体の解を得る方法があります。このような手法を、分割統治法(divid and rule)と言います。

この方法は、ある程度複雑な問題を解く際には妥当な方法であるような感じがします。しかし、現実問題として、この方法には大きな欠点があります。なぜなら、実際に運用してみると、同じ問題を何回も解かなくてはならないようなケースに遭遇するからです。

そこで、「実際に必要とされるかどうかはわからないが、必要になりそうな小問題をあらかじめ解いておいて保存しておき、必要なときに取り出して使う、というアプローチも存在します。これが動的計画法(dynamic programming)の考え方です。

 

引用:

sevendays-study.com

納得。したつもり。
また分からなくなるかもだけどそのときはまた調べよう。

SSH認証における公開鍵の設定

qiita.com

↑これ見てやれば楽勝(だと思う。)

注意点は、公開鍵と、sshディレクトリのpermissionだろうか。

基本的な流れは

1.ローカルで公開鍵と秘密鍵のペアを作成。

2.公開鍵を対象サーバーの ~/.ssh/authorized_keys に追記。(permissionに気をつけて)

$ cat id_rsa.pub >> authorized_keys

とすればおk

3.後は

$ ssh user@host

でアクセスすれば自動的にパスワード無しでログインできる。

 

続き!

一人で複数サーバーにアクセスするような人は、

方法1 : 先ほど作った公開鍵を使い回す。(この公開鍵を異なるサーバーにも追記)

方法2 : 複数の秘密鍵/公開鍵ペアを作成。使用する秘密鍵は、

$ ssh -i ~/.ssh/秘密鍵1 user@host1

$ ssh -i ~/.ssh/秘密鍵2 user@host2

ってすることで使い分け可能。(だけどめんどい)

 

そこで、これ↓

www.ellinikonblue.com

~/.ssh/config に適当なホスト名と秘密鍵の対応を記載しておくことで解決できる!

 

ちなみに自分はshellスクリプト使ってsshをラップしたシンプルなコマンド作ってる。

コマンド作ると、

1. よく使うホスト一覧を表示できる。(物忘れ激しい人には良いよね。)

2. よく使うホストに簡単にアクセス(当然、IPアドレス打ち込んだりする必要全く無い。)

等のメリットがある。数行でかけるからオススメ。

 

【感動する最新技術】〜その1〜

さーーーーて、寒い季節になってきましたねぇ。

筆者は最近部屋から出ない生活が続いています。

まぁ冬にはありがちですよね。今冬眠に入るタイミングを伺っているところです。

 

さぁ!今回は(完全主観的)感動する最新技術を紹介していきまーす。

 

1.Google Project Soli とそれを応用した物体認識

www.youtube.com

工学系大好きマンならしってるかもしれません。

GoogleのProject Soli.

動画自体は2015年のものですが、まだ巷で見かけるものではありませんね。

はじめてこれを見た時、めっちゃ色んなことに応用できそうや!!

と思ったものですが、つい最近、その驚くべき応用法が紹介されました。

 

www.youtube.com

これには度肝を抜かれましたね。。。

これもかなりビジネスチャンスのあるシステムではないでしょうか。

こんなの使って一発当ててみたいもんですね笑

 

2.キャノンによる自由視点技術

www.youtube.com

いやウィイレやん。

っていうのが最初の感想ですね笑

ここまでくると工学の偉大さをしみじみと感じます。うん。エンジニア万歳。

何台のカメラを使って撮影しているのか等の詳細情報が分かりませんが、

ここまで綺麗にできているとなると、やっぱり不思議です。

 

初めにサッカーコートの白線、ゴールの位置と大きさを知っておいて、

3次元のVirtualなサッカーコートを作り、各選手に対応する人間のモデルを画像から判断した適切な位置に適切な体勢で配置して、テクスチャを貼り付ける的なことを行っているんですかね。

言葉で言うのは簡単ですが、実際に作るのはかなり難しように思います。いや〜、すごいな。

3.Boston Dynamics の Spot mini とか

www.youtube.com

Boston Dynamicsの動画にはいつもワクワクさせられますね。

まさに次世代のロボットって感じかな。

これも目からウロコでしたね。ただ、軍事ロボットに応用されるとか考えてしまうと怖すぎて夜も眠れなくなります。

一昔前の、ロボットの動作を全てプログラミングするという考え方から、機械学習とか進化計算の手法を取り入れて、最適な動作に必要なパラメータを学習させているのではないかなと思います。

諸説あるようですが、もし完全に制御理論で攻めてここまでヌルヌルした動きができているっていうならトリハダものです。(そうじゃなくても十分すぎるくらい凄いですが。)

一時はGoogle傘下にいましたが、売却を表明しているそう。TOYOTAが買うとかいう噂もあるので、今後の動向から目が離せません。

 

以上、最新技術紹介でしたー!!

ではまた!

Emacsに便利な補完機能jediをインストールする

さて、ドキドキしながらもメインPCをUbuntuWindowsデュアルブート化した筆者です。

研究室に配属されてUbuntuをメインで使うようになってきました。基本Emacsでコーディングするのですが、自動補完機能が標準ではついていないので、今回は補完機能jediを導入します。

下には簡潔にやり方のみを書きますが、軽く半日はハマっていました。。。

こういう、インストールでつまずくような問題が起きないような時代になってほしいもんですね。

 

まずは、MELPAを導入。"MELPA"とはEmacsの便利なパッケージ管理機能です。

Emacsの設定ファイル(自分の場合~/.emacs)に

(require 'package) ;; You might already have this line
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize) ;; You might already have this line

を追記します。(参考:http://melpa.milkbox.net/#/getting-started)

これで、MELPAのパッケージを簡単にインストールできるようになります。

 

次にjediをインストールします。

emacsを再起動して、

M-x package-list-packages

と入力。(これが現れない場合は上の設定が上手く行っていない。)

しばらくするとパッケージのリストが現れるので、

C-s jedi

でjediを検索、選択してインストールします。(これだけではまだjediを使い始められないので注意)

 

次に、jediをインストールしたフォルダにload-pathを通します。

emacsの設定ファイルを開いて、

(setq load-path (cons "~/.emacs.d/elpa" load-path))

を追記。("~/.emacs.d/elpa"となっている部分は、jedi等のフォルダが格納されているディレクトリとします。melpaで行えばこうなっているはず。)

さらに、jediモードのトリガーを設定。

pythonで使用する場合は以下をemacsの設定ファイルに追記。

(add-hook'python-mode-hook'jedi:setup)

(参考:http://tkf.github.io/emacs-jedi/latest/)

Emacs再起動後、

M-x jedi:install-server

と入力して、めでたく終了です。

ちなみに、virtualenvがないと上のコマンドが上手く機能しないので、入れておきましょう。

 

※上の手順で上手く行かない場合・・・

環境によっては上の手順で上手く行かない場合があるようです。

その場合に試すべき手順を紹介します。

まず、~/.emacs.d/elpa/jedi-0.2.7/等の、jediのディレクトリまで移動し、

必要な場合は、

$ virtualenv env
$ source env/bin/activate

でvirtualenv環境をつくってから、

このディレクトリ(~/.emacs.d/elpa/jedi-0.2.7/等の、jediのディレクトリ)で

$ pip install jedi epc

を実行します。環境によって、pip2またはpip3も試してみましょう。

これで上手く行く場合があります。