pingを知ろう
こんにちは。
シンプルなものって素敵ですよね。自分が好きなものは包丁とまな板です。大工道具もなかなか素敵です。
本当のところはよくわかってないですが、今日はシンプルそうで、使いこなせるとカッコ良さそうな、ping
コマンドについてメモしました。(BSD)
ping(píŋ)とは?
まずはターミナルからman ping
を実行してマニュアルを確認します。
NAME ping -- send ICMP ECHO_REQUEST packets to network hosts
ICMPとはInternet Control Message Protocol
の略で、IP通信の制御や通信状態の調査などを行なうためのものです。
ECHO_REQUESTとは「エコー要求」と訳されていて、通信可能なら応答するよう要求するICMPのメッセージの一種です。
ping
はICMPでネットワークホストにエコー要求パケットを送るコマンド、
つまりネットワークを通して「大丈夫ですか?」と聞くコマンドということみたいです。
オプション
単純にping XXX.XXX.XXX.XXX
を実行すると、XXX.XXX.XXX.XXX
へパケットが送られ続けます。制御するオプションの一部をメモします。
オプション | 内容 |
---|---|
-c count |
count 回のパケット送信を行った後停止する |
-i wait |
パケット送信毎にwait 秒の間隔(interval?)待機する |
-t timeout |
timeout 秒過ぎたら停止する |
-W waittime |
応答がwaittime 秒過ぎたら画面表示しない(最終的には遅れた応答も統計情報として反映はする) |
パケットが見たい
-p pattern
というオプションでは送信するパケットの内容を変更できるようです。
しかしターミナルからはパケットの内容は見えないため(やり方があるのかもしれませんが)、確認できません......
それだとちょっと寂しいので、脱線してOS Xでパケットを見る方法をメモしておきます。
wireshark
ネットワークプロトコル解析ツールのwireshark
を使えばいいようです。オプションなしでhomebrewでインストールするとguiが無いようなので--with-qt
をつけてコマンドを打ちます。
brew install wireshark --with-qt
インストールの仕方が悪かったのか、うまく動きませんでしたが、sudo /usr/local/Cellar/wireshark/バージョン/bin/Wireshark
で直接起動したらいけました。
wi-fiを選択して、icmpでフィルタします。あとは試しにping -p ff 外部のIP
として見ると、icmpのrequestとreplyが交互に表示されました。
パケットの中身を見るとff
がたくさん並んでいて、-p
オプションも効いています!
感想
とりあえずパケットの中身が見れて満足です。これでping
のオプションも少しずつ理解を深めていけそうです。ネットワーク経路なども選択できるようで、その辺りを使いこなしていきたいです。
haskellのパッケージ管理ツールstack
haskellでservantを使いたくて色々調べていたら、サンプルとして上がっているものがことごとくstackというパッケージ管理ツールを想定したものでした。cabal-install
の代わりになるものっぽいです。
stackはhaskellプロジェクトの管理を簡単にしてくれるもので、依存関係の解決とか、テスト実行とか、ベンチマーク測定とか色々機能があるようです。あとGHCi起動時のモジュールのロードを勝手にしてくれるみたいです。
というわけでhaskellのパッケージ管理ツールstackを入れてみます。
参考
正直現在の環境をどうやって入れたか覚えてないのですが、確かhomebrewでcabal-install
とghc
をインストールした気がします。それらを全てアンインストールし、
brew install haskell-stack
を実行しました。
GHCiを使うために、
stack setup
を実行。
stack ghci
でGHCiが起動するようになりました。
runghc hoge.hg
、runhaskell hoge.hs
は
stack runghc hoge.hs
で実行できます。
感想
使えるからいいやではなく、何をしているかちゃんと理解しないといけないですね......
vimの移動コマンド
こんにちは。
よく使っているエディタ、vimについてメモします。
vimには便利な移動コマンドが沢山あって魅力的です、でもなかなか使いこなせていない感じがします。上下左右移動を覚えた後、さらに自由にファイルを編集するための移動コマンドを調べてみました。
基本的な移動
コマンド | 意味 |
---|---|
h |
左へ移動 |
j |
下へ移動 |
k |
上へ移動 |
l |
右へ移動 |
0 |
行左端へ移動 |
$ |
行右端へ移動 |
^ |
文頭へ移動 |
g_ |
文末へ移動 |
折り返された行での移動
基本的なコマンドに対してg
を頭につけると、折り返し時の移動が楽になります。
コマンド | 意味 |
---|---|
gj |
下へ移動 |
gk |
上へ移動 |
g0 |
画面左端へ移動 |
g$ |
画面右端へ移動 |
gm |
画面中央へ移動 |
例えばgj
、gk
は画面で見たままの上下移動になります。
また、g0
、gm
、g$
コマンドは画面上水平方向の位置へ移動します。
g
をつければ画面上で見たままの、上下左右移動、行頭、行末移動になると覚えておくといいと思います。
検索
コマンド | 意味 |
---|---|
f[char] |
カーソル位置から行末方向にある[char]の位置にカーソルを移動 |
t[char] |
カーソル位置から行末方向にある[char]の直前の位置にカーソルを移動 |
F[char] |
カーソル位置から行頭方向にある[char]の位置にカーソルを移動 |
T[char] |
カーソル位置から行頭方向にある[char]の直前の位置にカーソルを移動 |
; |
直近のf、t、F、Tをリピートします |
, |
直近のf、t、F、Tを逆方向にリピートします(つまりfaのあとの,はFa) |
次の行、次の文、次の段落
コマンド | 意味 |
---|---|
+ |
次の行の最初の文字に移動 |
- |
前の行の最初の文字に移動 |
) |
次の文へ移動(文はドットとスペース. で区切ります) |
( |
前の文へ移動 |
} |
次の段落へ移動 |
{ |
前の段落へ移動 |
感想
gif
作成時にタイプミスしないようにするのが大変でした。(作成にはttygif
を使いました。)
...ちょっと再生速度が速いみたいです。
検索で;
、,
を使いこなせば速度が上がるかと思います、,
は忘れがちなので気をつけます。
いずれ画面操作系のコマンド(配置、リサイズ等)についてもメモしておきたいです。
コメントアウト一覧
こんにちは。
コメントアウトの構文を覚えられないです。やっているうちにいずれ覚えるだろうと思っていたのですが、全然覚えられていないです。
プログラミングを初めてすぐの頃、cssのコメントアウトを//
と書いて、レビューで指摘された思い出があります。その頃はrailsでプログラミングしていたので、ruby、erb、html、css、javascriptなどのコメントアウトがごっちゃになっていたみたいです。
そろそろコメントアウトをちゃんと覚えようと思いました。多分随時更新してきますが、とりあえず以下についてメモしておきます。
目次
コメントアウトの構文
Java
class Main { public static void main(String[] args) { // comment System.out.println("hello"); /* comments comments */ } }
Ruby
# comment p 'hello' =begin comments comments (rubocopに`Do not use block comments`と言われました。非推奨なのかな?) =end
html
<!-- comment --> <p>hello</p> <!-- comments comments (コメントアウトの種類は一つですね) -->
css
/* comment */ body:after { content: 'hello' } /* comments comments (これもコメントアウトの種類は一つ) */
javascript
// comment alert('hello'); /* comments comments (Javaと同じと覚えればいいかも) */
haskell
-- comment main = putStrLn "hello" {- comments comments (この複数コメントの記法のルーツはなんだろう?) -}
mysql
-- comment # comment(この構文はpostgresqlにはないみたいです) select "hello"; /* comments comments */
bash
# comment echo "hello" << EOS comments comments EOS
Markdown
<!-- comment --> **hello** <!-- comments comments (htmlと一緒です) -->
感想
内容と全然関係ありませんが、Markdown
でのページ内リンクの貼り方を覚えました。
<a name="target"></a>ここに飛ぶ [ここを押すと](#target)
という具合です。
とりあえず多分コメントアウト覚えました。
データ型と型クラスの違い
「すごいHaskellたのしく学ぼう!」を勉強した時に、データ型と型クラスで混乱してしまったので、メモ書いておきます。
ザックリまとめると、こんな感じです。
- データ型:データ構造を定義するもの
- 型クラス:振る舞いを定義するもの
ちゃんとした内容は「すごいHaskellたのしく学ぼう!」の7章に書いてあります。
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (73件) を見る
以下簡単な例と概要を書いていきます。
データ型(data)
データ型の例としては、Int
、Word
、Integer
、Float
、Double
、Char
、Bool
、Ordering
や[]
、()
、Maybe
などがあります。
データ型の扱いは他のプログラミング言語におけるデータ型と大体同じかと思います。ただし、定義には2種類のコンストラクタと呼ばれるものが出てくるので注意しなければいけません。
値コンストラクタ(Data Constructor)
値コンストラクタはデータ型の値を作成するために使用する関数です。データ型の定義において等号の右側に記述されます。例を見てみます。
data Foo = Bar Int | Baz Float | Qux Int Float
データ型Foo
の値コンストラクタはBar
、Baz
、Qux
です。例えばBar
値コンストラクタにInt
データ型の値を渡すことでFooデータ型の値を作ることができます。
ghci>let bar = Bar 1 ghci>:t bar bar :: Foo
つまりBar
は
Bar :: Int -> Foo
という関数になっています。
違う例でいくと、基本的なデータ型Bool
ではFalse
、True
という値コンストラクタを持ちます。
data Bool = False | True
False
、True
を定数と考えるか、引数0の値コンストラクタ関数と考えるかは自由ですが、僕は引数0の値コンストラクタと考える方がデータ型の定義が一般化できるので好きです。
型コンストラクタ(Type Constructor)
型コンストラクタはデータ型を変数にとり新たなデータ型を定義します。テータ型の定義では等号の左側に現れます。例をもとに見ていきましょう。
data Maybe a = Nothing | Just a
Maybe
データ型の等号の右側には、二つの値コンストラクタ(引数0、引数1)が並んでいます。ところがJust
コンストラクタは引数のデータ型がa
となっていて、こんなデータ型ないよ、と思うわけです。
一方等号の左側にはMaybe a
という表記が見えます。このMaybe
の部分が型コンストラクタです。この型コンストラクタは色々なデータ型a
に対し、いろいろなデータ型Maybe a
を作ることができると言っています。
実際に使ってみます。
ghci>let maybe_char = Just 'c' ghci>:t maybe_char maybe_char :: Maybe Char
ここではJust
値コンストラクタにChar
データ型の'c'
を渡すことで、Maybe Char
データ型の値maybe_char
を作っています。
Javaで配列の定義でint[]
、String[]
と書いたことや、総称型のワイルドカードの概念にやや似ていますね。
Maybe
自体に直接データ型を指定してデータ型を得ることは関数定義の時などですが、型推論に頼ってばかりの僕にはあまり関係ないみたいです。
ちなみにGHCi
では:t
に続けて型名を入力すれば型の情報を教えてくれます。定義、インスタンスなどを確認したい場合は:i
が便利で結構万能です。
型クラス(type class)
型クラスは、データ型に実装されたり、違う型クラスに継承されたりします。型クラスの例としては、Num
、Enum
、Show
、Read
、Functor
、Applicative
、Monad
...などたくさんあります。
型クラスはある性質を一般化したものだと考えられます。例えばNum
は整数、浮動小数などの「数」という概念が持つべき振る舞いを定義していますし、Enum
は列挙するという振る舞いを定義しています。
データ型には複数の型クラスを実装させることができます。継承も複数可能です。自由です。今回は大変なので継承は扱わず実装のみ見ていくことにします。
型クラスの定義はclass
によって宣言します。
class Hoge a where fuga :: a -> Int
この型クラスを実装したいデータ型Piyo
は、関数fuga
を実装しなければいけません。実装はinstance
で宣言します。
instance Hoge Piyo where fuga Piyo = 0
(例がとても酷くて申し訳ないです...)
例が例なのに具体的ではなかったので、具体的に初期状態でインポートされているNum
型クラスを見てみましょう。
ghci>:i Num class Num a where (+) :: a -> a -> a (-) :: a -> a -> a (*) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a fromInteger :: Integer -> a
僕がよくデータ型だと間違えてしまうのがこのNum
です。これはInt
、Word
、Float
、Double
などの数値系のデータ型がもつ、足す、引く、かけるといった、数としての振る舞いを定義しています。(ちなみにnegate
は符号の反転、signum
は符号を返しそうです、実際Int
ではそのような実装が与えられます)
これに対しInt
は以下のような実装を与えています。参考
instance Num Int where I# x + I# y = I# (x +# y) I# x - I# y = I# (x -# y) negate (I# x) = I# (negateInt# x) I# x * I# y = I# (x *# y) abs n = if n `geInt` 0 then n else negate n signum n | n `ltInt` 0 = negate 1 | n `eqInt` 0 = 0 | otherwise = 1 {-# INLINE fromInteger #-} -- Just to be sure! fromInteger i = I# (integerToInt i)
...ちょっとよくわかりません。#
はmagic hashと呼ばれるものらしく、後置修飾子として変数に#
を付与できるようにするものみたいです(参考)。I#
はGHC.Types.I#
のことで、おそらくこの中で定義した和や差の処理を実装として与えているのだと思います。
感想
良い例が全然出せず残念でした。申し訳ないです。
収穫としてはghc
がglasgow haskell compiler
の略だと知ったことです。
あとこれだけ書いたらもう、データ型と型クラスをごっちゃにすることはなさそうです。