Homebrew関連
Homebrew+Caskについて
homebrew - What is the difference between `brew` and `brew cask`? - Ask Different
要約: Homebrew-CaskはHomebrewの拡張.
"brew cask": GUIアプリ, "brew": CUIアプリを主に扱う.
"brew cask install foo" は "brew install caskroom/cask/foo" のエイリアスになってるらしい.
公式サイト(https://caskroom.github.io/)
に書いてある導入方法も
$ brew tap caskroom/cask
ってするだけだから,リポジトリ追加してるだけ.
できること
Macで使うGUI, CUIアプリケーションを一元管理できる. ファイルがバラバラに配置されないので,削除とかもしやすい.
フォントの導入
フォントのインストールも可能. qiita.com どうやら,
/Users/[username]/Library/Fonts
の中に突っ込んでくれるらしい. 再ログインすればFont Book などでも見れるようになる. (再ログインすることが全く頭になくてここでハマった) 因みに,macOSのフォントファイルの配置については
Mac OS X: Font locations and their purposes - Apple Support
が参考になる.
wgetで複数階層に渡るファイルをダウンロードする
wgetってなに?
wgetはlinuxのコマンドで、非対話型のダウンローダーです。
最低限の使い方
例えばダウンロードしたいzipファイルが http://hostname/hoge.zip にある場合、
$ wget http://hostname/hoge.zip
とすることで、ローカルにhoge.zipが保存されます。
必要十分(?)な使い方
サイト上にファイル一覧のダウンロードリンクがおいてある場合、
例えば、 http://hostname/directory1/ 内にダウンロードリンクがおいてある場合、
$ wget http://hostname/directory1/
としてしまうと、index.htmlがDLされるだけで終わってしまいます。
$ wget http://hostname/directory1/file0.zip
などとすればDLできますが、ダウンロードリンクが大量にある場合はこんなことやっていられません。
ここで、wgetのオプションを使って以下のようにDLします
$ wget -rH -l 1 -A txt,zip --random-wait http://hostname/directory1/
各オプションについて:
- -r: 再帰的にDLします。このとき,wgetは兄弟ディレクトリの中身まですべてDLしてしまうことがあるようです。(これを防ぐためにlオプションをつけています。)
- -l: 再帰的にDLする最大深さを指定します.
- -H: 異なるドメインのファイルはダウンロードしません。(lオプションを1にしていれば関係ないかと思われますが)
-A: ダウンロードするファイルを限定します。カンマ区切りで拡張子を指定できるほか、ダブルクオートで囲めば、正規表現でファイルを絞ることもできます。
--random-wait: これは必須ではありませんが、ファイルをDLするためにあまりに大量のリクエストを投げてしまうと相手サーバーに負荷がかかり、攻撃してるみたいになるので、ランダムにwaitを入れます(マナーですね)
ターミナルで日本語が文字化けするとき
まずlocaleについて勉強しておく↓ eng-entrance.com
あとは, どこで読んだか忘れたけど,とりあえず ~/.bashrcに(fishなら~/.config/fish)
export LANG=ja_JP.UTF-8 export LC_CTYPE=ja_JP.UTF-8
って書いておけば,
$ locale LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_ALL=
となって,日本語が化けなくなる.
JavaとおさらばしてJuniper SSLVPNをLinuxから快適に利用
うちの大学はネットワークが学内で閉じており、学外からの接続手段としてJuniper Networksのsslvpnを採用しているので、これを使わねばならない。
Chromeでsslvpnサービスを提供してるサイトへ飛んで、「ネットワークコネクト」を実行するとJRE がインストールされていないか、Java が無効です。
って表示される。色々インストールしてもうまくいかないので、調べていると、
Chrome
(https://java.com/ja/download/help/enable_browser.xml)
モダンなブラウザではJavaが標準で無効どころか、そもそも有効化する手段がないという感じ。
FlashがHTML5に取って代わったみたいな、パラダイムシフトかな。
とにかく、このままでは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言語)で書かれることがほとんどであり、伝統的にはPerl、PHPが多く、最近ではRuby、Pythonもよく使われます。
開眼シェルスクリプト第19回 by 上田隆一 (Software Design 2013 July P.122)
実行環境?
Ubuntu 16.04
Apache/2.4.18
↑これを参考にした。ホームディレクトリ直下で
$ 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とかいうグループを追加しているが、必要ない。(下記参考)
$ 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配下のファイルにアクセスできるようになる。
Dynamic Programmingについて
動的計画法(DP, Dynamic Programming)について
最近やたらと動的計画法という単語を聞くので、基本をまとめておく。
動的計画法とは?
動的計画法(どうてきけいかくほう、英: Dynamic Programming, DP)は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。
引用:Wikipedia
え?それって分割統治法じゃない?
同じものなのかな?
分割統治法と動的計画法の違いについて
アルゴリズムを設計する際には、まず全体をいくつかの小問題に分解して、その一つ一つを解いていくことにより全体の解を得る方法があります。このような手法を、分割統治法(divid and rule)と言います。
この方法は、ある程度複雑な問題を解く際には妥当な方法であるような感じがします。しかし、現実問題として、この方法には大きな欠点があります。なぜなら、実際に運用してみると、同じ問題を何回も解かなくてはならないようなケースに遭遇するからです。
そこで、「実際に必要とされるかどうかはわからないが、必要になりそうな小問題をあらかじめ解いておいて保存しておき、必要なときに取り出して使う、というアプローチも存在します。これが動的計画法(dynamic programming)の考え方です。
引用:
納得。したつもり。
また分からなくなるかもだけどそのときはまた調べよう。