AltCSSについて雑多に書く。scss(sass), less, stylus
Sass
Summary
2014/3 version: 3.2.15 current release: 3.5.4
Sass can be used from the command line or as part of a web framework. The first step is to install the gem:
$ gem insatll sass
After you convert some CSS to Sass, you can run
$ sass style.scss
to compile it back to CSS. For more information on these commands, check out
自動コンパイル
$ sass --watch app/sass:public/stylesheets
option
$red:#FF3399; .red { color: $red; }
- nested - sassファイルのネストの深さが引き継がれます
$ sass style.scss:style.css --style nested
.red { color: #FF3399; } .red-.warning { font-weight: bold; }
- expanded - 典型的なCSSの記述スタイルにする
$ sass style.scss:style.css --style expanded
.red { color: #FF3399; } .red-.warning { font-weight: bold; }
- compact - セレクタと属性を1行で記述してくれます
$ sass style.scss:style.css --style compact
.red { color: #FF3399; } .red-.warning { font-weight: bold; }
- compressed - すごく圧縮してくれる方法。可読性は悪いが軽くなる
$ sass style.scss:style.css --style compressed
.red{color:#f39}.red-.warning{font-weight:bold}
Syntax
Variables
$font-stack: Helvetica, sans-serif $primary-color: #333 body font: 100% $font-stack color: $primary-color
Nesting
nav ul margin: 0 padding: 0 list-style: none li display: inline-block a display: block padding: 6px 12px text-decoration: none
Partials
You can create partial Sass files that contain little snippets of CSS that you can include in other Sass files.
You might name it something like _partial.scss.
Sass partials are used with the @import
directive.
// _reset.sass html, body, ul, ol margin: 0 padding: 0
// base.sass @import reset body font: 100% Helvetica, sans-serif background-color: #efefef
Mixins
=border-radius($radius) -webkit-border-radius: $radius -moz-border-radius: $radius -ms-border-radius: $radius border-radius: $radius .box +border-radius(10px)
When your CSS is generated it'll look like this:
.box { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; }
Extend/Inheritance
.message border: 1px solid #ccc padding: 10px color: #333 .success @extend .message border-color: green .error @extend .message border-color: red .warning @extend .message border-color: yellow
This is what it looks like:
.message, .success, .error, .warning { border: 1px solid #cccccc; padding: 10px; color: #333; } .success { border-color: green; } .error { border-color: red; } .warning { border-color: yellow; }
Operators
.container width: 100% article[role="main"] float: left width: 600px / 960px * 100% aside[role="complementary"] float: right width: 300px / 960px * 100%
The generated CSS will look like:
.container { width: 100%; } article[role="main"] { float: left; width: 62.5%; } aside[role="complementary"] { float: right; width: 31.25%; }
scss(Sassy CSS)
Sass3.0からCSSちっくに書くことが出来るようになったsassの記法の一つ。
http://sass-lang.com/documentation/file.SCSS_FOR_SASS_USERS.html
Syntax
Variables
$font-stack: Helvetica, sans-serif; $primary-color: #333; body { font: 100% $font-stack; color: $primary-color; }
Nesting
nav { ul { margin: 0; padding: 0; list-style: none; } li { display: inline-block; } a { display: block; padding: 6px 12px; text-decoration: none; } }
Partials
You can create partial Sass files that contain little snippets of CSS that you can include in other Sass files.
You might name it something like _partial.scss.
Sass partials are used with the @import
directive.
// _reset.sass html, body, ul, ol margin: 0 padding: 0
// base.sass @import 'reset'; body { font: 100% Helvetica, sans-serif; background-color: #efefef; }
Mixins
@mixin border-radius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; -ms-border-radius: $radius; border-radius: $radius; } .box { @include border-radius(10px); }
When your CSS is generated it'll look like this:
.box { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; }
Extend/Inheritance
.message { border: 1px solid #ccc; padding: 10px; color: #333; } .success { @extend .message; border-color: green; } .error { @extend .message; border-color: red; } .warning { @extend .message; border-color: yellow; }
This is what it looks like:
.message, .success, .error, .warning { border: 1px solid #cccccc; padding: 10px; color: #333; } .success { border-color: green; } .error { border-color: red; } .warning { border-color: yellow; }
Operators
.container { width: 100%; } article[role="main"] { float: left; width: 600px / 960px * 100%; } aside[role="complementary"] { float: right; width: 300px / 960px * 100%; }
The generated CSS will look like:
.container { width: 100%; } article[role="main"] { float: left; width: 62.5%; } aside[role="complementary"] { float: right; width: 31.25%; }
Less
2010/4/23 version: 1.0 current release: 2.7.3
Less. The dynamic stylesheet language.
$ npm install less -g or $ npm i less --save-dev
or
<script src="less.js"></script> <link rel="stylesheet/less" type="text/css" href="styles.less" />
https://github.com/less/less.js
compile
$ lessc bootstrap.less bootstrap.css
Syntax
Variables
// Variables @link-color: #428bca; // sea blue @link-color-hover: darken(@link-color, 10%); // Usage a, .link { color: @link-color; } a:hover { color: @link-color-hover; } .widget { color: #fff; background: @link-color; }
Variable Interpolation
// Variables @my-selector: banner; // Usage .@{my-selector} { font-weight: bold; line-height: 40px; margin: 0 auto; }
compiles to
.banner { font-weight: bold; line-height: 40px; margin: 0 auto; }
Nesting
#header { color: black; } #header .navigation { font-size: 12px; } #header .logo { width: 300px; }
In Less, we can also write it this way:
#header { color: black; .navigation { font-size: 12px; } .logo { width: 300px; } }
Partials
.foo { background: #900; } @import "this-is-valid.less";
@import statements may be treated differently by Less depending on the file extension:
@import "foo"; // foo.less is imported @import "foo.less"; // foo.less is imported @import "foo.php"; // foo.php imported as a Less file @import "foo.css"; // statement left in place, as-is
Mixins
.a, #b { color: red; } .mixin-class { .a(); } .mixin-id { #b(); }
outputs
.a, #b { color: red; } .mixin-class { color: red; } .mixin-id { color: red; }
Extend
nav ul { &:extend(.inline); background: blue; } .inline { color: red; }
outputs
nav ul { background: blue; } .inline, nav ul { color: red; }
Operators
// numbers are converted into the same units @conversion-1: 5cm + 10mm; // result is 6cm @conversion-2: 2 - 3cm - 5mm; // result is -1.5cm // conversion is impossible @incompatible-units: 2 + 5px - 3cm; // result is 4px // example with variables @base: 5%; @filler: @base * 2; // result is 10% @other: @base + @filler; // result is 15%
Stylus
2011/01/31 version: 0.0.1 current release: 0.54.5
https://github.com/stylus/stylus
Expressive, robust, feature-rich CSS language built for nodejs
$ npm install stylus -g
$ stylus -w style.styl -o style.css
Syntax
記法は、sassをさらに簡略化した感じ。でも、sass, scsss, less, css の書き方もできる。
#stylus background #eee padding 10px margin 0 0 10px h2 font-size 30px color blue .bikou font-size 0.8em &:before content "※"
Variables
font-size = 14px body font font-size Arial, sans-serif
Partials
@import "reset.css"
Along with @import, Stylus also has @require. It works almost in the same way, with the exception of importing any given file only once.
Mixins
border-radius(n) -webkit-border-radius n -moz-border-radius n border-radius n form input[type=button] border-radius(5px)
Compiles to:
form input[type=button] { -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
Extend
scss の@extendとほぼ一緒
.message { padding: 10px; border: 1px solid #eee; } .warning { @extend .message; color: #E2E21E; }
Operators
. [] ! ~ + - is defined ** * / % + - ... .. <= >= < > in == is != is not isnt is a && and || or ?: = := ?= += -= *= /= %= not if unless
結論
- それぞれ結構違うと思ったら、ほとんど変わらず、どの言語で作られているかの違いでしかなかった。だから書き方とはだいたい一緒なので、使うときも苦労しないと思う。
- ruby のprojectだったら、sass(scss)
- それ以外ならless, stylus みたいな区分でいいかな、まあパフォーマンスとか周辺ライブラリも考慮しつつ。
- lessは、コマンドのoption・仕様全体から言って、sassに比べて多機能な感じがする。でも書き方はscssに似てる。
- stylusは、書き方をかなり簡略化したい場合とかに、使えそう。
--- | sass(scss) | less | stylus | golang/go |
---|---|---|---|---|
github star count | 10843 | 15289 | 8708 | 35647 |
github watch count | 677 | 752 | 376 | 2604 |
github fork count | 1923 | 3458 | 1007 | 4874 |
made of | ruby | NodeJS | NodeJS | golang |
ベンダープレフィックスなどの記述をラクにするもの。
sass → compass less → nib
Reference from
TCP/IP
コンピュータネットワーク発展の7つの段階
年 | --- |
---|---|
1950 | バッチ処理(処理するプログラムやデータなどをまとめて一括で処理する方式) |
1960 | タイムシェアリングシステム(TSS):一台のコンピュータに複数の端末を接続し、複数のユーザーが同時にコンピュータを利用できるようにしたシステム |
1970 | コンピュータ間通信 |
1980 | コンピュータネットワーク |
1990 | インターネット普及 |
2000 | インターネット技術中心 |
2010 | TCPIP |
プロトコル
例、IP TCP HTTP
- コンピュータとコンピュータがネットワークを利用して通信するために作られた約束事
日本語英語 プロトコル 言語によるコミュニケーション 通信 話の内容 データ
通訳 ゲートウェイ
- パケット交換とは 大きなデータをパケットと呼ばれる単位に分割して送信する方法
小包の荷札=パケットのヘッダ
OSI
ISOが国際標準としてOSIと呼ばれる通信体系を標準化 OSI:開放型システム間相互接続
上位層と下位層の間でサービスのやりとりをするときの約束事=インターフェイス 同じ階層=プロトコル
各層で何をするかという役割を定義 各層の役割を定義しているのがプロトコル
OSIの用語 ノード=通信を行うコンピュータ TCP/IPの用語 ホスト=ネットワークに接続されたコンピュータ
上位層から渡されたデータに自分の階層のプロトコル処理に必要な情報をヘッダという形で受け付ける。
コネクション型 tcp データの送信を開始する前に送信ホストと受信ホストの間で回線の接続をする 必ずしもパケットにはならない 電話みたいな感じ
コネクションレス型 ip パケットが多い 郵便 通信相手がいるかどうかの確認はない
回線交換 交換機がデータの中継処理、交換機を通して回線を設定、回線接続=コネクションの確立、一度コネクションを確立するとその回線は占有利用(デメリット) 通信の速度が一定
パケット交換(蓄積交換) パケット交換機(ルーター) ルーター、バッファと呼ばれる記憶領域、キュー(行列)を作りながら、バッファに格納 回線は一つ、共有利用、遅くなったりする
ユニキャスト:電話
ブロードキャスト:TV
マルチキャスト:テレビ電話
エニーキャスト:DNSのルートネームサーバー
ネットワーク構成要素
コンピュータ機器の外部インターフェイス=ポート
パケットin データリンク層=フレーム
リピーター(物理層) 減衰して変形した信号の波形を増幅、整形して流す装置、速度を変換することはできない
ブリッジ(レイヤ2、物理層) ネットワークとネットワークを結ぶ橋、どのネットワークにどのフレームを流すか
レイヤ4−7スイッチ 4−7層の内容を分析して、特定の処理を行う。 ロードバランサー:複数のサーバーに負荷を分散する 帯域制御:電話を優先して、メールとかを後回しにする
ゲートウェイ トランスポート層からアプリケーション層までの階層でデータを変換して中継する装置のこと プロトコルの翻訳 中継
実際のネットワーク
バックボーン,コア:大量のデータを高速に送受信することを目的にして、構築。 例、道路網の高速道路
エッジ 高速なレイヤ3スイッチ 例、インターチェンジ
アクセス・アグリゲーション レイヤ2スイッチ、レイヤ3スイッチで、エッジを越えてやりとりする情報とネットワーク内に留まる情報を制御している 例市街地
データセンター 巨大なサーバーとストレージ、ネットワーク
DNS(ネットワーク層)
ホスト名→hostsファイルを参照(ホスト名とIPアドレス)→IPアドレスに変換 hostsファイルはネットワークインフォメーションセンターで一括管理
DNS:ホストを管理している組織がホスト名とIPアドレスの関係を表すデータベースを管理できる 通信をしたいユーザーがホスト名(ドメイン名)を入力すると自動的にホスト名やIPアドレスが登録されているデータベースサーバーが検索され、そこからIPアドレスの情報を得るようになっている。
$ nslookup コマンド名
ipアドレスがわかるドメイン名:ホストの名前や組織の名前を識別するための階層的な名前、サブドメインはホスト名とドメイン名の間に入る kusa.ac.jp pepper.kusa.ac.jp piyo.kusa.ac.jp
kusa: くさ大学固有のドメイン名 ac: 高等教育機関 jp: 日本 pepper, piyo: ホスト名
階層構造を取っているため、各組織単位で自由にホスト名を ネームサーバーとは、ドメイン名を管理しているホストやソフトウェアのこと、そのネームサーバが設置された階層のドメインに関する情報を管理する。 管理する階層のことをzoneと呼ぶ リゾルバ:DNSに問い合わせを行うホストやソフトウェア(自分のパソコン)
DHCP(ネットワーク層)
面倒なIPアドレスの設定の自動化や、一括管理を行うことができる プラグアンドプレイ
DHCP○○パケットを送信するときは、IPアドレスは決まっていないので、送信元が0.0.0.0で送信先が255.255.255.255になっている。
複数のDHCPサーバーの設定を行ってくれるもの=DHCPリレーエージェント
ポート番号(トランスポート層)
- データリンク→macアドレスは同一のデータリンクに接続されたコンピュータを識別するためのもの
- IP→IPアドレスはTCP/IPネットワーク上に接続されているホストやルーターを識別するためのもの
- トランスポート→ポート番号は同一のコンピュータ内で通信を行なっているプログラムを識別するためのもの 送信元IPアドレス・宛先IPアドレス・プロトコル番号・送信元ポート番号・宛先ポート番号 で通信が識別される
ポート番号の決め方 - 標準→ウェルノウンポート番号(サーバー側)1024~49151 - ダイナミック→クライアントのOSが決める(クライアント側)複数のプラウザを開いたときとか
遠隔ログイン(5,6,7)
遠隔ログインはTSSのような環境を実現するアプリケーション。メインフレームと端末の関係をコンピュータネットワークに応用 - telnet:tcpのコネクションを一つ利用、この通信路を通して、相手のコンピュータでコマンドが実行される。ルーターや高機能スイッチなどのネットワーク機器にログインしてその機器の設定を行うときによく使われる。自分のログイン名とパスワードがその機器に登録されている必要がある。
- ssh:通信内容が暗号化された遠隔ログインシステム
ftp - コンピュータ間でファイルを転送するときに使われるプロトコル。相手先コンピュータにログインする必要がある。 (インターネット上にある誰でもログインできるanonymous ftpサーバー) 二つのTCPコネクションを利用 - 制御用(ログイン、転送するファイル名、転送の方法)ポート番号21 - データの転送用 ポート番号20 要求コマンドにASCII文字列が使われる
www(5,6,7)
- wwwは、インターネット上のハイパーテキスト形式で参照できる情報提供システム
wwwの情報を画面に表示するクライアントソフトウェアを webブラウザと呼ぶ
情報へのアクセス手段と位置の定義 URI
- 情報の表現フォーマットの定義 HTML
- 情報の転送などの操作の定義 HTTP
- ホスト名 ドメイン名やIPアドレス
ポート番号 トランスポート番号
$ telnet サーバー名・もしくはアドレス 80
CGIはwebサーバーが外部プログラムを呼び出すサーバーサイドアプリケーションの仕組み
- RSSはwebサイトの更新内容に関する要約情報をやり取りするためのデータフォーマット(ページの要約を表示、検索の精度が高くなる)
暗号化技術の基礎
「内部統制のためのアイデンティティ管理 導入や運用における落とし穴とは」を読んで
予防的統制とは、各ユーザーの職務内容に応じて、適切なシステムに対する適切なアクセス権限の付与や剥奪を実施すること
発見的統制とは、各種システムに実際に格納されているアクセス権限設定を確認し、誤りがあればこれを修正する作業のこと
「ユーザー・プロビジョニングによって統制できないアクセス権限」(担当者が勝手にアクセス権限をいじったりしないということを証明することはできない)をも把握し、正しいアクセス管理が維持されていることを、はっきりと示していくことのできる体制が求められる。
多くの企業ではアクセス管理についての監査への対応を、手作業で行おうとしている→膨大なコストがかかる→アイデンティティ監査の自動化
例、サン・マイクロシステムズの「Sun Java System Identity Manager」では、企業としての内部統制のためのアクセス権限関連のルールに基づいて、統合管理されているすべてのユーザーのすべてのシステムに対するアクセス権を自動的に一括してスキャンし、ルール違反の設定が存在していないかどうかをレポートとして出力する。
多くの企業に見られる内部統制上の欠陥の例 → - システムの開発者が、業務処理を行える権限を持ったままの状態になっている - 財務システムについては適切なアクセス管理がなされていても、その下で動いているOSやデータベースへのアクセス権が十分に管理されていない - 退職した社員や、契約切れの外部コンサルタントのアクセス権が放置されている
「職務分掌」とは、組織においてそれぞれの職務が果たすべき責任(職責)や職責を果たす上で必要な権限(職権)を明確にするために、職務ごとの役割を整理・配分すること
職務分掌のチェック
企業としてはまず、職務分掌ルールを明確かつ詳細に定義する必要がある。その上で、これを現実のITシステムに適用していく作業をできるだけ自動化していかなければならない。
Sun Java System Identity Managerでは、まずスプレッドシート形式で書かれた職務分掌ルールを具体的なITの言葉に変換する機能を備えている。そしてこれに基づいて、定期あるいは随時の監査スキャンを自動的に行うことができる。このため手作業として残るのは、出発点となる企業としての職務分掌ルールを決めることだけだ。
「アイデンティティ管理製品」とは銘打っていても、このようなルール変換機能や自動監査スキャン機能を通じた発見的統制が自動化できないのであれば、内部統制やコンプライアンスの検証作業は効率化できず、コストも減らすことができない。 - 拡張性の高いシステムであることの必要性 企業として利用する重要なシステムがくまなくカバーできてこそ、統合アクセス管理ソリューションとしてのアイデンティティ管理製品は活きてくる。 アイデンティティ管理システムに多様な操作権限を設定できるという点も重要
ワークフロー機能の充実 社内ルールに基づいて、本人が適切な他者を指名して承認の代行を明示的に申請し、承認者の上長の承認を得るようにするなどの対策が必要。 このようなシステムへのアクセス権限委譲に関するワークフローの機能。
アイデンティティ管理に関し、ログや証跡の保存とチェックが行えるようになっていること アイデンティティ管理が内部統制において重要な役割を担うということはすなわち、アイデンティティ管理作業自体の正当性も問われることを意味する。上記のアクセス権委譲に関する承認を含め、すべてのアイデンティティ管理作業は、第三者によるレビューのために記録されなければならない。
まとめ
アイデンティティ管理は、どんなものでもいいから製品を導入しさえすればよいというものではない。内部統制の観点からは、まず社内の職務分掌ルールの確立が求められる。さらに予防的統制、発見的統制を統合的に運用できる仕組みを採用することで自動化をはかり、PDCAサイクルを回していくことが肝要だといえる。
Reference from
Linux 実践入門
LINUXシステム実践入門
シェルはユーザーから入力された指示に従い、コマンドを実行し、結果を出力するプログラム。
$ コマンド 引数
コマンドはシステムに処理させる命令で、プログラムやシェルスクリプト、シェルのビルトイン(組み込み)コマンドの名前を利用
manファイルの検索
$ man ls | whatis chmod
chmod(1) - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file
$ man ls | apropos chmod
chmod(1) - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file
lchmod(3) - change mode of file
manファイルにはNAME/名前のセクションにコマンド名と短い要約文が入っている whatis: 検索文字列として指定したコマンド名にマッチするmanファイルの要約文を表示 apropos:検索文字列をコマンド名と要約文から検索して表示する
$ info ls
パーミッション
xが付いてないと、そのディレクトリにアクセスできない→. のつくファイル . →今いるディレクトリを明示 ..→一つ上のディレクトリを明示
total 48
drwxr-xr-x 4 vagrant vagrant 4096 Sep 14 2012 .
drwxr-xr-x 3 root root 4096 Sep 14 2012 ..
-rw------- 1 vagrant vagrant 22 Sep 14 2012 .bash_history
-rw-r--r-- 1 vagrant vagrant 220 Sep 14 2012 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3486 Sep 14 2012 .bashrc
drwx------ 2 vagrant vagrant 4096 Sep 14 2012 .cache
-rwxr-xr-x 1 vagrant vagrant 6487 Sep 14 2012 postinstall.sh
-rw-r--r-- 1 vagrant vagrant 675 Sep 14 2012 .profile
drwx------ 2 vagrant vagrant 4096 Mar 13 09:13 .ssh
-rw-r--r-- 1 vagrant vagrant 0 Sep 14 2012 .sudo_as_admin_successful
-rw------- 1 vagrant vagrant 6 Sep 14 2012 .vbox_version
-rw------- 1 vagrant vagrant 12 Sep 14 2012 .veewee_version
一桁目はファイルタイプを表している。dはディレクトリ。
suid(set user id): ファイルの所有者権限でコマンドを実行できることを意味する sgid(set group id): ファイル→所有者権限 ディレクトリ→その親ディレクトリと同じ権限 で実行できる スティッキービット: 複数ユーザーでディレクトリを共有する際にsgidとは逆に作成したユーザーのみがファイルを削除できるようにするビット
デフォだとコマンドは実行されたユーザーの権限で実行される
実行ビット:x
suid はコマンドに設定されている所有ユーザー権限で実行される、マルチユーザーシステムであるUNIXでは運用側には便利な仕組み suidをむやみにコマンドに設定すると一般ユーザーが他人の権限でコマンドを実行できてしまうため、システムを某弱にしてしまう。
ファイル
データの最小単位はbit, 0と1 8つの bitを一つにまとめたものをbyteと呼ぶ byte=2の八乗=256 ASCIIの文字コードの一部を表現できる
$ man ascii
ディレクトリ(unix, linux)⇆ フォルダ(windows) 複数のファイルやディレクトリを一くくりにする入れ物のこと 一つ上のディレクトリ 親ディレクトリ 一つ下のディレクトリ 子ディレクトリ、サブディレクトリ
linux のディレクトリ構成
FHS(filesystem hierarchy standard):linuxのディレクトリ階層標準化システム http://www.pathname.com/fhs/
マウント:HDDなどのブロックデバイス上にあるファイルシステムをシステムのディレクトリツリーの一部に配置す
パーティション あるHDDを複数の領域に分割してできた一つの領域のことを言う。
メリット ・システム領域とデータ領域を分けられる ・システム領域とデータ領域の他にlog領域を分けておくことで、万が一両方の残量が0になってもログ領域が残っていればなんとかシステムは起動できる
LVM
複数のパーティションをまとめて一つの論理ボリューム、パーティションとして見せることができる。残り領域が少なくなった際に拡張できる。
ホームディレクトリ
- ファイル名はアルファベット
- .から始まる設定ファイル以外はホーム直下に置かない
- ダウンロードしたソースアーカイブを配置する srcディレクトリがある
- リポジトリは個別にディレクトリを作る(git, svn, cvs)
- 一時ファイルディレクトリ(tmp)を用意する
- ダウンロード、ビデオ、ピクチャー、ミュージックなどは、download, video, picture, musicからの新ボックリンク
- 作業用ディレクトリ worksがありその下に案件ごとのサブディレクトリが存在する。
ディレクトリ構成
/ ルート
各ディレクトリを格納するトップディレクトリ。vmlinuzというlinuxカーネル本体、linuxカーネルソースパッケージを配置することが推奨。
total 85
drwxr-xr-x 2 root root 4096 Sep 14 2012 bin/
drwxr-xr-x 4 root root 1024 Sep 14 2012 boot/
drwxr-xr-x 14 root root 4160 Mar 13 09:13 dev/
drwxr-xr-x 79 root root 4096 Mar 13 09:13 etc/
drwxr-xr-x 3 root root 4096 Sep 14 2012 home/
lrwxrwxrwx 1 root root 33 Sep 14 2012 initrd.img -> /boot/initrd.img-3.2.0-23-generic
drwxr-xr-x 19 root root 4096 Sep 14 2012 lib/
drwxr-xr-x 2 root root 4096 Sep 14 2012 lib64/
drwx------ 2 root root 16384 Sep 14 2012 lost+found/
drwxr-xr-x 4 root root 4096 Sep 14 2012 media/
drwxr-xr-x 2 root root 4096 Apr 19 2012 mnt/
drwxr-xr-x 4 root root 4096 Sep 14 2012 opt/
dr-xr-xr-x 90 root root 0 Mar 13 09:13 proc/
drwx------ 2 root root 4096 Mar 13 23:33 root/
drwxr-xr-x 16 root root 680 Mar 18 07:11 run/
drwxr-xr-x 2 root root 4096 Sep 14 2012 sbin/
drwxr-xr-x 2 root root 4096 Mar 5 2012 selinux/
drwxr-xr-x 2 root root 4096 Sep 14 2012 srv/
drwxr-xr-x 13 root root 0 Mar 13 09:13 sys/
drwxrwxrwt 2 root root 4096 Mar 18 08:17 tmp/
drwxr-xr-x 10 root root 4096 Sep 14 2012 usr/
drwxr-xr-x 1 vagrant vagrant 136 Mar 13 09:13 vagrant/
drwxr-xr-x 11 root root 4096 Sep 14 2012 var/
lrwxrwxrwx 1 root root 29 Sep 14 2012 vmlinuz -> boot/vmlinuz-3.2.0-23-generic
/boot
linuxカーネル・init ram fsファイル・ブートローダGRUBの設定ファイルを含むディレクトリ。
total 23431
-rw-r--r-- 1 root root 791023 Apr 11 2012 abi-3.2.0-23-generic
-rw-r--r-- 1 root root 140279 Apr 11 2012 config-3.2.0-23-generic
drwxr-xr-x 3 root root 5120 Sep 14 2012 grub/
-rw-r--r-- 1 root root 14731890 Sep 14 2012 initrd.img-3.2.0-23-generic
drwxr-xr-x 2 root root 12288 Sep 14 2012 lost+found/
-rw-r--r-- 1 root root 176764 Nov 27 2011 memtest86+.bin
-rw-r--r-- 1 root root 178944 Nov 27 2011 memtest86+_multiboot.bin
-rw------- 1 root root 2884358 Apr 11 2012 System.map-3.2.0-23-generic
-rw------- 1 root root 4965840 Apr 11 2012 vmlinuz-3.2.0-23-generic
/etc
設定ファイル(OSの設定に必要となるファイルやプログラムの設定ファイル)を格納するディレクトリ
/bin
システム管理者とユーザーによって利用されるコマンドが配置される(lsとか)。他のパーティションをマウントしなくても実行できるコマンドを集めている。
/sbin
システム管理者が利用するコマンド(システムのブートの一部、データバックアップ・リカバリ、パーティション調整・ネットワーク設定などのシステムメンテナンス、ユーザーの追加・削除、プロセスの監視などに必要なツール)が配置。
/usr
システムを利用するユーザで共有するデータを保持するディレクトリ。 /usr/local そのpc用のソフトウェアを配置するためのトップディレクトリ。
/home
ユーザーのhomeディレクトリとして扱い、システム利用者が利用するシェルの設定ファイルやメール、データファイルなどを配置。
/var
変わりやすいデータ(スプール(一時的に配置するファイルやディレクトリ)やログ)を配置するディレクトリ /tmp 別の一時ファイル置き場 /{log,spool} システムのいくつかのログが書き込まれるディレクトリ 各アプリケーションが一時ファイルを溜め込むスプールディレクトリ /mail MTA(SMTPサーバー、Mail Transfer Agent)で利用するディレクトリ /run デーモンなどのプログラムを実行する際に割り振られるプロセスID(PID)をテキストファイルとして保存、ソケットファイルなど一時データを保存する際に利用される。 /lock デーモンなどのプログラムの多重起動を防ぐための一時ファイルの保存 /{opt,cache,lib/{misc,locate},local} デーモンやログ以外で一時ファイル以外に利用するディレクトリが割り当てられる。
/proc(procfs)
linuxのプロセスを操作したりシステム情報を処理するための手段を提供する擬似ファイルシステム。 プロセスとカーネル情報を提供する仮想ファイルシステム。
/sys(sysfs)
メモリ内ファイルシステムを通してユーザープロセスにカーネル情報を提供するための機能。 デバイス情報を提供する仮想ファイルシステム
/dev
/tmp
システムで作業ファイルなどの配置に利用するディレクトリ。
シェル
linuxカーネル⇄Linuxディストリビューション(OSを構成する他のソフトウェアや、アプリケーションソフト、インストーラー等を含んでいる)
カーネル(kernel)とは、オペレーティングシステム(OS)の基本機能の役割を担うソフトウエアのこと カーネルは、OSの中でも特に中核的なプログラム このカーネルが、ハードディスクやメモリーなど、コンピューターの資源管理を行なっている
- アプリケーションの起動
- プログラム実行順序の変更
- 変数の保持
- 実行コマンド履歴の出力
シェルスクリプト:あらかじめコマンドを記述したテキストファイル
linuxのシェル四種類 - bash - csh/tch - dash - zsh
確認コマンド
$ ls -l /bin/sh
一般ユーザー $
⇅ $ sudo su # su 一般ユーザー名
管理者ユーザー #
ジョブ制御機能
複数のプログラムの実行・停止を管理するジョブ制御機能
ユーザーが見える画面 フォアグラウンドジョブ 背後で実行する バックグランドジョブ 停止中 サスペンドジョブ
$ jobs ジョブの一覧を表示。+はカレントジョブ ーその次のjob
^ + z → サスペンドジョブに bg → 指定したjob番号のプロセスをバックグラウンドで実行 fg → そのプロセスをフォアグラウンドに持ってきて稼働状態にする
リダイレクト プログラムの出力をファイルに書き込むこと 0<, 1>, >> をフィルディスクリプタを指定して、プログラムの入出力先を変更する。プログラムの処理結果をファイルに記録、ファイルに記述されている内容をプログラムに渡すのに利用。0は標準入力、1は標準出力、2は標準エラー出力。
パイプ プログラムの出力を別のプログラムの入力に利用。
ビルドインコマンド
シェル自身が機能として持っているコマンド =シェルのビルドインコマンド(内部コマンド) 別に用意されたプログラムを外部コマンド
: 何もせずに終了コード0を返す
source もしくは .
現行シェル環境で他のシェルスクリプトを読み込んで実行する。
cd
指定したディレクトリに移動する 環境変数CDPATHを設定すると、cdのあとに移動するディレクトリ名を指定するだけで、そのCDPATHに含まれるディレクトリから移動先を検索する
$ export CDPATH=/var/lib
$ env | grep CDPATH
CDPATH=/var/lib
$ cd dpkg
/var/lib/dpkg
eval
パラメータの間接干渉をする(入れ子になった変数から値を取り出す)
exec
forkシステムコールを使わずに指定されたコマンドを自身で実行する。 通常シェルで外部コマンドを実行するとforkシステムコールを利用してシェルとは別にプロセスが生成され、コマンドを実行する。exec内部コマンドを利用するとforkシステムコールを使わないために別プロセスが生成されずシェル自身が指定されたコマンドに置き換わり実行される。execを使用しない場合、コマンドの実行後はシェルに実行が戻るが、execを使うと戻らない。
read
シェル宣言
$ コマンド
デフォだと下記の順で以下の環境変数PATHの中から探していく。
でも自分で作ったシェルスクリプトの場合パスを指定しないといけない。 例)./hello.sh
シェル変数
ユーザーが一時的に値を格納、参照し、起動しているシェル、シェルスクリプト内で利用できる変数 使用中のシェルで有効なシェル変数はsetコマンドで一覧表示できる。unsetを使うと削除できる。
環境変数
定義したシェルから起動したコマンドにも引き継がれる変数。 複数のコマンドで共有できる変数。 定義されている環境変数はenvコマンドで参照。
位置パラメータ
関数などで利用する引数参照に利用する変数 シェルスクリプトを実行する際に引数として値を渡したい場合がある。その値を取得するために使う。 $ cat -n count.sh 1 #!/bin/bash 2 echo $1 3 echo $2 4 echo $3 $ bash ./count.sh a b c d a b c
特殊パラメータ
引数すべてや引数の個数などを表す変数。特殊パラメータはスクリプト名や引数、プロセスIDなどを参照するための変数として利用できる。
if/while/for/case がある。
シェル関数
shift 位置パラメータを一つずつ移動 $ ./script.sh --version --help
"" $1 を特殊記号として扱う '' テキストをシェルに展開されないようにして特殊記号をそのまま表示、利用できる シングルの方が外(例、'a"bb"')
` もしくは $() : 囲まれるとコマンドとして実行される
ログインシェル
0番目の引数の先頭文字が- --loginが指定されている場合に起動するシェル。 GUIで起動しなかったら、ログイン後に起動するシェルがログインシェル。
/etc/profile ~/.bash_profile ~/.bash_login ~/.bash_profile
対話シェル
ログインシェルでない状態のシェル ホームディレクトリの.bashrcが読まれる
bashの設定を有効化していく
ユーザとグループ
システムユーザ デーモンを実行するために利用するユーザ
- ユーザ作成コマンドの設定ファイル/etc/adduser.confなどでシステムユーザIDの範囲が決まっている
- /etc/shadowを確認すると、システムユーザのパスワードは設定されていない。
一般ユーザ
管理者rootとシステムユーザが利用していないIDを適用されたシステムを利用するだけのユーザ パッケージのインストールなどを実施せず、システムにログインし、インストールされたコマンドを利用するユーザ
各ユーザはグループという所属を設定でき、最低一つはグループに入ることになっている。
unixアカウントを作成、変更する以外は、標準では同じ名前のグループが作成され、そこに所属する。
グループを利用するメリットは、システムリソースの利用制限を実施したり、権限の利用制限を設定できること。
/etc/password(unixアカウント情報が記録されている。)
unixユーザ名 パスワード ユーザID グループID コメント ホームディレクトリ シェル
/etc/shadow(暗号化したパスワードを格納する)
/etc/shadowは暗号化されたパスワードファイルを管理者権限でのみアクセスできるようにする仕組み。
パスワード欄
$id$salt$encrypted id: 利用するハッシュアルゴリズム salt: ユーザのパスワードと合わせて暗号化するためのフレーズ encrypted: IDで指定したハッシュアルゴリズムでハッシュ化したパスワード文字列 ! パスワードが設定されていない * アカウントロック !! パスワードの有効期限切れ
adduser/useradd ユーザの追加 deluser/userdel ユーザの削除 groupadd/groupdel グループの追加、削除 usermod ユーザアカウントの修正 groupmod グループアカウントの修正 passwd パスワード変更 change パスワード有効期限を変更 chsh シェルの変更 chfn 氏名情報変更
/etc/group
システムでのグループ定義を行うファイル
$ cat /etc/group
root:x:0:
グループ名:パスワード:グループID:ユーザ名…
/etc/gshadow グループ名:暗号化パスワード:管理者:メンバー
SSH
SSHポートフォワード
sshプロコトルはリモートシェルやファイル転送だけでなく、そのセッションに別のアプリケーションをカプセル化できる。これによって平文で通信する平文で通信するアプリケーションでも暗号化通信にできる。
sshサーバーを起動するには、sshdというデーモンプロセスを稼働させる。 sshdを起動するとデフォルトで、22/tcpを利用して、sshクライアントからの接続を待ち、クライアントから接続が来ると利用するSSHプロトコルのバージョンの交換から通信を始める。 Diffie-Hellman鍵交換によってセッション鍵を得る、そしてサーバーのホスト鍵とクライアントのユーザ鍵をお互いに交換する
クライアントにsshサーバーのホスト鍵が登録されている場合 問題なし
クライアントにsshサーバーのホスト鍵が登録されていない場合 sshサーバホスト鍵のフィンガープリントを表示して登録することの確認を表示
- クライアントに登録されているsshサーバーのホスト鍵と異なる場合 man-in-the-middle攻撃の可能性があることを警告表示する
セッション鍵を得て暗号化通信を開始した後はサーバとクライアントの認証に入る、パスワード認証・公開鍵認証を利用してアカウントを利用するか判断。
$ ssh [user@]hostname
認証が通ると、シェルの起動、コマンドの実行、xクライアントの転送などを実行してセッションを開始する
http://qiita.com/tag1216/items/5d06bad7468f731f590e
$ ls -l /etc/ssh/
total 160
-rw-r--r-- 1 root root 125749 Apr 2 2012 moduli
-rw-r--r-- 1 root root 1669 Apr 2 2012 ssh_config
-rw-r--r-- 1 root root 2499 Sep 14 2012 sshd_config
-rw------- 1 root root 672 Sep 14 2012 ssh_host_dsa_key
-rw-r--r-- 1 root root 604 Sep 14 2012 ssh_host_dsa_key.pub
-rw------- 1 root root 227 Sep 14 2012 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 176 Sep 14 2012 ssh_host_ecdsa_key.pub
-rw------- 1 root root 1675 Sep 14 2012 ssh_host_rsa_key
-rw-r--r-- 1 root root 396 Sep 14 2012 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 302 Jan 10 2011 ssh_import_id
moduli DH鍵交換に利用するデータ sshd_config sshデーモンが参照する設定ファイル ssh_host_key{,.pub} sshサーバーで保持するSSHホスト鍵 ssh_config SSHクライアントが参照するデフォルト設定ファイル
authorized_keysファイルは一行に1つの公開鍵を記述する
X11Forwarding
sshは必ずしもリモートホストにログインし、コマンドで操作するものではない。 sshログイン先のXクライアントアプリケーションをログイン元のXサーバに転送することができる。
http://qiita.com/kou_bacchus/items/47c40beb147a3040fe5e
SSHクライアント
管理者だけではなく開発者も開発サーバやデプロイ先サーバへのログインなどで多用するツールの一つ
以下の順序で読み込まれる ssh のコマンドラインオプション ユーザごとのオプション(~/.ssh/config)←ここに長いコマンドをまとめることができる システムのオプション(/etc/ssh/ssh_config) sshコマンドのデフォルトパラメータ
公開鍵暗号は秘密鍵と公開鍵を作成し、公開鍵を配布して秘密鍵はユーザが厳重に保持して運用する暗号。 公開鍵と秘密鍵は同時に作られ、秘密鍵から公開鍵の生成、公開鍵から秘密鍵の生成はできない。鍵はアルゴリズムを利用して生成。
公開鍵
一般に公開 持ち主以外の送信者が暗号化に利用 持ち主以外の受信者が署名検証に利用 sshでログインする先のホストに登録して利用
秘密鍵
持ち主が保持 公開鍵で暗号化されたメッセージを秘密鍵で復号化するのに利用 作成したメッセージへの署名に利用 sshコマンド実行時に秘密鍵を指定することで公開鍵を登録したホストへのログインに利用
保持しているサーバの公開鍵と、サーバから送られてきた公開鍵が異なる場合 →SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。(SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。) →SSHサーバとSSHクライアントの間に第三者が入っている。(man in the middle攻撃)
SSHサーバは自身のホスト用公開鍵と秘密鍵を保持している。SSHクライアントはサーバの公開鍵を登録しておくことで、そのサーバが本当に接続対象のサーバかを判断できる。
SSHサーバ管理者に現在利用されている正しい公開鍵情報を提供してもらう SSHでログインするユーザが接続した際に表示される公開鍵のフィンガープリントを確認する
公開鍵認証
ユーザーはログインしたいホストに自身の公開鍵を保存する $ ssh-copy-id -i ~/.ssh/id_rsa sample@192.168.1.24
ssh-copy-idはリモートホストにログインできる状態でないと登録できない。 →リモートホストがパスワード認証を許可しているか既に公開鍵を一つ以上登録しており、SSHログインできることが条件。
リモートホストの管理者に公開鍵を渡して登録してもらう必要がある
sshサーバにおける公開鍵の設定
sshログインを受け付ける側の設定はSSHデーモンの設定変更で公開鍵認証を有効にして(/sshd_config)sshdを再起動する。
sshクライアントでのデバッグ→詳細を見ることでログインできない場合にデバッグできる $ ssh -vvv -l sample 111.111.1.11
cronは決められた時間にコマンドを実行するデーモン。
$ service cron status
$ ps ax | grep cron
- /etc/crontab cronデーモンへの指示書
- /etc/cron.d
- /var/spool/cron/crontab ユーザー用cronファイル
$ cat /etc/crontab (Ubuntu) # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do.
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #
分 時 日 月 曜日 実行ユーザ名 コマンドとそのオプション
$ crontab -l ユーザのcron設定ファイルのリストを表示 $ crontab -e ユーザのcron設定ファイルを作成
ここで生成されたファイルは/var/spool/cron/crontabs以下に配置される。
crontabには負荷が高くなる処理の実行を記述した場合のために、ユーザ単位でのアクセス制御が設定できる。
デフォルトでは存在しない/etc/cron.allow /etc/cron.denyというファイルを作成し、一行ごとに1アカウントだけ記述すればリストされたユーザのcrontabの実行を制御できる。
これらの設定によってcrontabの実行を拒否された場合は/var/log/cronにログとして記録される。
cron設定後の動作確認 実行するコマンドにechoやloggerを与え、そのコマンドが指定時刻に実行されるかをデバッグできる。
$ sudo cat /etc/cron.d/du 0 1 * * * root logger "du -hs $HOME"
以下のログを確認することで、変数が正常に展開されているか、指定した時刻に実行されているかなどが確認できる。 echoを使うと実行後にメールが飛んでくる
出力例 $ tail /var/log/messages Sep 25 01:00:01 ogasaka logger: du -hs /root
cronはすべての出力をMAILTO環境変数に指定した宛先、MAILTOがなければrootを宛先として実行後にメールを送信する。 適切に送信先を指定するのも重要だが、不必要な出力をしないことでメール送信しない様にし、エラー出力だけメールするという調整が重要
標準出力も標準エラー出力もメールしない
「du -hs \$HOME > /dev/null 2>&1」
標準出力をdev/nullにリダイレクトするので標準エラー出力だけメールを送信する
「du -hs \$HOME 1> /dev/null」
ログローテーション
カーネルや各デーモンからのメッセージを記録し続けると、ログファイルのサイズは拡大し、ファイルシステムのファイルサイズ制限に達してしまう。それを予防する仕組みがlogrotate。 logrotateはcron経由で起動し、指定されたログファイルを移動、圧縮して新しいログファイルを作成。必要があればデーモンの再起動。
cronが/etc/cron.daily/logrotateを読み込む logrotateが/etc/logrotate.confを設定ファイルとして起動し、logrotate.confに指定されたログファイルを処理する /etc/logrotate.d/以下のファイルを読み込み指定されたログファイルを処理する
Apache HTTP Server
RHEL/CentOS httpd Debian/Ubuntu apache2
http://www.vogella.com/tutorials/ApacheHTTP/article.html
$ sudo apt-get install apache2
$ /etc/init.d/apache2 -l * Usage: /etc/init.d/apache2 {start|stop|graceful-stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean|status}
←apache2の後に続けて書くことで、実行できるコマンドの一覧
ディレクティブとは、ディレクティブと値をそれぞれ設定して、記述していくもので、範囲を指定できるものもある。
$ cat /etc/apache2.conf
コメントは省略
55 LockFile ${APACHE_LOCK_DIR}/accept.lock
62 PidFile ${APACHE_PID_FILE}
プロセスIDを記録するファイル
67 Timeout 300
getリクエストの受け取りを待ち、post/putメソッド利用で次のtcpパケットが届くのを待ち、サーバがクライアントにレスポンスを返すのに、TCPでクライアントからのackが返ってくるまでの待ち時間に関する制限を秒数で指定する。
73 KeepAlive On ←環境によってチューニング
HTTPの持続的な接続を有効にする。例えばブラウザからあるページを要求された場合、そのページにリンクされていた画像についてもWebサーバにリクエストを送信する。HTML以外にも複数画像ファイルに対してGETメソッドを送信するのに、TCPコネクションを貼り直すが、 tcpコネクションを接続したままでHTTPメソッドを送信できれば、送受信パケットを抑えることができる。このコネクションをKeepAliveTimeoutディレクティブで指定された秒数だけ待つ。帯域の狭い環境ではKeepAliveをonにするのは効率的だが、広帯域の場合はKeepAliveをoffにしないとすでに使っていないプロセスが無駄に残ってシステム負荷になる可能性がある。
80 MaxKeepAliveRequests 100 86 KeepAliveTimeout 5
MPMとはクライアントからのリクエストの処理方法をモジュールに分けたもの。event mpm_netware prefork worker
利用するMPMの選択、チューニングはその上で利用するサーバサイド言語やwebフレームワーク、アクセス数、稼働するサーバのメモリ容量によって調整。
98
preforkはクライアントからの1リクエストに1プロセスで対応するためにforkシステムコールを使って子プロセスを生成。forkでの子プロセス生成はメモリを独立して利用。アクセス数に応じて子プロセスを増やしていく。
116
133
eventMPMはworkerMPMをベースにしているが、処理している接続だけをマルチスレッドで行うことで効率的に処理するマルチプロセッシングモジュール。
144 User ${APACHE_RUN_USER} 145 Group ${APACHE_RUN_GROUP}
httpdを実行するユーザを指定する。
153 AccessFileName .htaccess
159
デフォルトでは.htaccessが分散設定ファイル名に設定されている。
181 DefaultType None
192 HostnameLookups Off
ipアドレスでログに書き込むという指定
200 ErrorLog ${APACHE_LOG_DIR}/error.log
エラーログを記録するファイル名
207 LogLevel warn
記録するログの粒度を占める記述。デフォはworn
「 210 Include mods-enabled/.load 211 Include mods-enabled/.conf 214 Include httpd.conf 217 Include ports.conf 」他のファイルのの読み込み
224 LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined 225 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 226 LogFormat "%h %l %u %t \"%r\" %>s %O" common 227 LogFormat "%{Referer}i -> %U" referer 228 LogFormat "%{User-agent}i" agent
ログへの記録フォーマットを定義
234 Include conf.d/ 237 Include sites-enabled/
Gemfileのバージョン指定の書き方
1.0.0
バージョンを固定。>= 1.0.0
1.0.0以上のバージョンが必要>= 1.0.0, < 2.0.0
1.0.0以上、2.0.0未満のバージョンが必要、ex) 1.x.x~> 1.0.0
1.0.0以上で利用可能で、1.0.9などは問題なく、1.1にバージョンが上がると利用不可 ex) 1.0.x
reference from
クリティカルパス
- クリティカルパスとは、プロジェクトの中で「開始から終了までに最も長い時間を要するタスクの連なり」
- フロート日数とは、クリティカルでないタスクの作業上の余裕日数
所感
- クリティカルパスを理解することで、そのプロジェクトにおいて絶対に遅れてはいけないタスクがわかるということを学んだが、そもそもそのタスクの切り分け単位が適切でなかったり、タスクごとの見積もりが間違っていると全てにおいてズレが生じるので、そっちの見積もりも正確にやる必要があると感じた。
Reference from
第8回 クリティカル・パスをみつける:タイム・マネジメントの心得 ~あなたを多忙から開放する10の方法~ | エンジニアマインド … 技術評論社