ushumpei’s blog

生活で気になったことを随時調べて書いていきます。

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-installghcをインストールした気がします。それらを全てアンインストールし、

brew install haskell-stack

を実行しました。

GHCiを使うために、

stack setup

を実行。

stack ghci

でGHCiが起動するようになりました。

runghc hoge.hgrunhaskell hoge.hs

stack runghc hoge.hs

で実行できます。

感想

使えるからいいやではなく、何をしているかちゃんと理解しないといけないですね......

vimの移動コマンド

こんにちは。

よく使っているエディタ、vimについてメモします。

vimには便利な移動コマンドが沢山あって魅力的です、でもなかなか使いこなせていない感じがします。上下左右移動を覚えた後、さらに自由にファイルを編集するための移動コマンドを調べてみました。

基本的な移動

コマンド 意味
h 左へ移動
j 下へ移動
k 上へ移動
l 右へ移動
0 行左端へ移動
$ 行右端へ移動
^ 文頭へ移動
g_ 文末へ移動

折り返された行での移動

基本的なコマンドに対してgを頭につけると、折り返し時の移動が楽になります。

コマンド 意味
gj 下へ移動
gk 上へ移動
g0 画面左端へ移動
g$ 画面右端へ移動
gm 画面中央へ移動

例えばgjgkは画面で見たままの上下移動になります。

f:id:ushumpei:20160603014152g:plain

また、g0gmg$コマンドは画面上水平方向の位置へ移動します。

gをつければ画面上で見たままの、上下左右移動、行頭、行末移動になると覚えておくといいと思います。

検索

コマンド 意味
f[char] カーソル位置から行末方向にある[char]の位置にカーソルを移動
t[char] カーソル位置から行末方向にある[char]の直前の位置にカーソルを移動
F[char] カーソル位置から行頭方向にある[char]の位置にカーソルを移動
T[char] カーソル位置から行頭方向にある[char]の直前の位置にカーソルを移動
; 直近のf、t、F、Tをリピートします
, 直近のf、t、F、Tを逆方向にリピートします(つまりfaのあとの,はFa)

f:id:ushumpei:20160603020336g:plain

次の行、次の文、次の段落

コマンド 意味
+ 次の行の最初の文字に移動
- 前の行の最初の文字に移動
) 次の文へ移動(文はドットとスペース.で区切ります)
( 前の文へ移動
} 次の段落へ移動
{ 前の段落へ移動

f:id:ushumpei:20160603015527g:plain

感想

gif作成時にタイプミスしないようにするのが大変でした。(作成にはttygifを使いました。) ...ちょっと再生速度が速いみたいです。

検索で;,を使いこなせば速度が上がるかと思います、,は忘れがちなので気をつけます。

いずれ画面操作系のコマンド(配置、リサイズ等)についてもメモしておきたいです。

コメントアウト一覧

こんにちは。

コメントアウトの構文を覚えられないです。やっているうちにいずれ覚えるだろうと思っていたのですが、全然覚えられていないです。

プログラミングを初めてすぐの頃、cssコメントアウト//と書いて、レビューで指摘された思い出があります。その頃はrailsでプログラミングしていたので、ruby、erb、html、cssjavascriptなどのコメントアウトがごっちゃになっていたみたいです。

そろそろコメントアウトをちゃんと覚えようと思いました。多分随時更新してきますが、とりあえず以下についてメモしておきます。

目次

コメントアウトの構文

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章に書いてあります。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

以下簡単な例と概要を書いていきます。

データ型(data)

データ型の例としては、IntWordIntegerFloatDoubleCharBoolOrdering[]()Maybeなどがあります。

データ型の扱いは他のプログラミング言語におけるデータ型と大体同じかと思います。ただし、定義には2種類のコンストラクタと呼ばれるものが出てくるので注意しなければいけません。

値コンストラクタ(Data Constructor)

値コンストラクタはデータ型の値を作成するために使用する関数です。データ型の定義において等号の右側に記述されます。例を見てみます。

data Foo = Bar Int | Baz Float | Qux Int Float

データ型Fooの値コンストラクタはBarBazQuxです。例えばBar値コンストラクタにIntデータ型の値を渡すことでFooデータ型の値を作ることができます。

ghci>let bar = Bar 1
ghci>:t bar
bar :: Foo

つまりBar

Bar :: Int -> Foo

という関数になっています。

違う例でいくと、基本的なデータ型BoolではFalseTrueという値コンストラクタを持ちます。

data Bool = False | True

FalseTrueを定数と考えるか、引数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)

型クラスは、データ型に実装されたり、違う型クラスに継承されたりします。型クラスの例としては、NumEnumShowReadFunctorApplicativeMonad...などたくさんあります。

型クラスはある性質を一般化したものだと考えられます。例えば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です。これはIntWordFloatDoubleなどの数値系のデータ型がもつ、足す、引く、かけるといった、数としての振る舞いを定義しています。(ちなみに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#のことで、おそらくこの中で定義した和や差の処理を実装として与えているのだと思います。

感想

良い例が全然出せず残念でした。申し訳ないです。

収穫としてはghcglasgow haskell compilerの略だと知ったことです。

あとこれだけ書いたらもう、データ型と型クラスをごっちゃにすることはなさそうです。

はじめて

はじめまして。

僕は会社員でWebプログラマーをやっています。

何かアウトプットしないとまずいかなと思い、まずはブログをはじめてみました。

このブログには生活で気になったことを随時調べて書いていくので、結構雑多な内容になるかと思います。内容もざっくりした理解を書いていく予定です。

第一歩としては、自身の備忘録として、役に立つものになればいいでしょう!