See the Elephant

1992生まれのプログラマが書くエンジニアブログ

ネットワーク入門 - IPアドレスの導入 -


IPアドレスの導入

最近, 立場上ルータをいじりネットワーク管理をすることが多い.
そこで1からネットワークの勉強をし直すことにした.

その過程で得たことについて備忘録としてまとめる.

IPアドレスについて

一言にIPアドレスといっても実は2種類の働きがある.

実はこの2つのIPアドレスが存在する.

グローバルIPアドレス

インターネットと接続するためのIPアドレスである.
これは世界に1つしかないユニークなIPアドレスであり, 重複は存在しない.
グローバルIPアドレスはIANAという組織によって管理されており, 独自性を保っている.

例えば, 大学や我が家には1つのグローバルIPアドレスが与えられている.

大学のような教育機関には勝手に変化しない静的なグローバルIPアドレスが割り振られるのが一般的だ.
大学内にはサーバがあるため, IPアドレスがコロコロ変わってしまうと外部からアクセスできなくなるなど不都合が多い.
こういった問題を軽減するために静的なグローバルIPアドレスが割り当てられる.

我が家のように個人の家では基本的にプロバイダ(ISP)がグローバルIPアドレスを割り振る.
仕組みとしては, プロバイダが保有しているグローバルIPアドレスの中から1つを契約期間中リースするような形をとる.
静的IPアドレスにしてメリットが有る家庭は少ないため, IPアドレスは動的に割り振られる.

しかし, 1つ大きな疑問が残る.
インターネットに接続するためのグローバルIPアドレスが1つならば,
インターネットに接続することができる端末も1つに限定されるはずだ.
だが, 大学や我が家には端末が複数個あり, どれも問題なくインターネットに接続できる.

プライベートIPアドレス

グローバルIPアドレスが1つしかないなら, みんなでそれを共有して使い合えばいい.
そこで, プライベートIPアドレスが考えだされた.
プライベートIPアドレスは狭いエリアのネットワーク(LAN)内で使われるIPアドレスである.
つまり, LANの中だけで有効である. インターネットに接続する能力は持っていない.

インターネットに接続する場合は, プライベートIPアドレスからグローバルIPアドレスにアドレス変換し接続することが必要である.
これは次の記事に書くが, NAT(network adress translate)やIPマスカレードと呼ばれる.

192.168.0.\や172.16.0.\, 10.0.0.\などよく見るIPアドレスは全てプライベートIPアドレスである.
ちなみに, LAN内にある端末同士の通信を行う場合は, このプライベートIPアドレスで通信が可能である.

次回予告

では, このプライベートIPアドレスはどのように割り当てられるのか, これに関しては次の記事に書こうと思う.
その前にONUやルータ, APについて簡単に触れようと思う.
それではまた.

reveal.jsでシンタックスハイライトできない問題を解決(markdownに埋め込み)

この記事の目的

reveal.jsでsyntax highlightができなかったため, 有効にする.

以下の記事を参考にさせてもらった.
reveal.jsを新しくしたらハマった(後編)

上記記事では, markdownファイル内でのコード埋め込み方法について記述されていなかったため, ここを補足したい.

要点 htmlファイルに以下の1行を追加すれば動く.

<body>
<!-- この1行を追加 -->
<pre style="display:none"><code></code></pre> 
...
</body>

以下, 備忘録.

reveal.jsについて

markdown記法でプレゼンを作ることができるツール.
ブラウザ上で動作し, pptよりちょっとかっこよく見せれる.

html,cssで見た目を拡張可能である.

導入からindex.htmlの書き方などは下記のサイトを参考にした.
reveal.js, markdown,githubでスライドを作成する
※ページ中ほど, data-verticalではなくdata-separator-verticalであることに注意.

syntax highlightについて

reveal.jsではmdファイルと同じくコードを埋め込むことができ, syntax highlightも可能である...
```ruby
ここにコードを書く
```

はずなのだが上手く動かないorz

少し調べるとこのような記事を発見.
reveal.jsを新しくしたらハマった(後編)

一部抜粋

<section>
<pre><code class="ruby">
ここにコード
</code></pre>
</section>

がhtml fileの中に1つでも含まれていれば動作するよう.

そこで, これをそのままhtmlファイルに入力した.
しかし, コード表示領域が表示されてしまう問題が起きた.

じゃ, 非表示にしちゃえばいいじゃん, ということで<pre>タグにオプションを追加.

<!-- pre>タグ内を非表示 -->
<pre style="display:none"><code class="ruby"></code></pre> 

あと, いじっていたらclass="ruby"って部分も不要なことに気付いた.

<!-- class=""を削除 -->
<pre style="display:none"><code></code></pre> 

これが完成形.

vim-altercmdの設定にハマった

そもそもvim-altercmdとは

vim-altercmdとは, vimのExコマンドを独自のコマンドに置き換えることができるようになるプラグイン
長ったらしいコマンドを短縮したものに置換することができる(๑╹ڡ╹๑)べんりぃ〜
今回は, よく打つ上に長い:NeoBundleInstallを例にしていく.

:NeoBundleInstall -> :ni " pluginのコマンドを短縮することができる

vim-altercmdは2つある

kana/vim-altercmdとtyru/vim-altercmdの2つがあり,

  • kana : オリジナル
  • tyru : kana/をforkし改良したもの

だそう.

僕が使ってるのはtyruさんの方です. 詳しくはこちら. オリジナルのkana版とtyru版の違い / tyruさんのblog

やりたかったこと

tyru/vim-altercmdを使って.vimrc内からコマンドを短縮する.
:NeoBundleInstallを:niに置換したい.

altercmdでガッツリはまった

様々なサイトを巡回して設定方法を調べると下のような例が出てきた.

.vimrc

NeoBundle 'tyru/vim-altercmd' 
call altercmd#load()              # vim-altercmdを有効にする
AlterCommand NeoBundleInstall ni  # コマンドの設定  

vimを再起動する.

line   63:
E117: Unknown function: altercmd#load
line   64:
E492: Not an editor command: AlterCommand NeoBundleInstall ni

call altercmd#load()なんて関数知らないと言われてしまう.
しかも, AlterCommandvimコマンドじゃねぇ って言われてる...orz

altercmd#load()そもそも使えないんじゃないかと思って調べた結果, このサイトの方法で設定すると上手く行くことが判明.
最近導入したvimプラグインをまとめる

以下, 抜粋

.vimrc

" call altercmd#load()
autocmd User Rails AlterCommand r R
autocmd User Rails AlterCommand rc Rcontroller
autocmd User Rails AlterCommand rm Rmodel
autocmd User Rails AlterCommand rv Rview

autocmd User Railsrailsプロジェクトでのみ動作するよってこと.


altercmd#load()をコメントアウトすると,この設定はエラーもなく上手くいった.
どうやらautocmdがミソらしい.
autocmdについてはここを参考にした.
autocmdは何らかのeventが起きた時にpat(正規表現)で指定されたファイル形式であれば自動でcmdを行うコマンドだそう.

:au[tocmd] [group] {event} {pat} [nested] {cmd}
  {pat} 正規表現に一致するファイル.
  {event}のときに自動的に実行するコマンドのリストに、{cmd} を加える.
  {cmd} は常に既存の自動コマンドの後に追加されるので、自動コマンドは指定された順に実行される.
  ## [group]と[nested]は使わないので省略. ##

今回は, 新しいfile / 既存fileが読み込まれた時{event:BufRead},どのようなファイル{pat:*.*}であってもコマンド{cmd}を有効にしたい.

そこで, 上記サイトを参考にしながら以下の設定を行った.

.vimrc

" call altercmd#load()    エラーを吐くのでコメントアウト
autocmd BufRead *.* AlterCommand ni NeoBundleInstall 

保存後, vimを再起動. これで, :NeoBundleInstall:niだけで実行できる.

もちろん, 他のコマンドでも適応できる. 半日くらいこれで飛んでしまった...


autocmdの勉強にもなったので時間の無駄ではなかったかな.
vimrcを拡張していくのは時間を忘れてしまうʕ̡̢̡ʘ̅͟͜͡ʘ̲̅ʔ̢̡̢

NDS40メモ

firefox OS 入門

簡単なfirefox osの構造説明

Gaia : HTML Gecko: レンダリングエンジン Gonk : Linuxカーネル, ハードウェア仮想化(Androidから流用)

アプリを開発してみよう

手順

  • firefoxを起動 -> ツール -> 開発者ツール -> WebIDE
  • 右上のランタイムからfirefox OS 2.0を起動
  • アプリを開く-> 新しいアプリ -> Project -> Hello worldアプリを適当に保存
  • 再生ボタンを押すとアプリ起動

firefox OS 開発者勉強会

  • 3/28 新潟市 KDDI新潟
  • 参加費無料
  • Mojilla Japan の人も来るかも?

仕事が捗るoffice & エディタ操作

GUIに頼らずにキーボードショートカットを利用しよう
Fn+ <- / -> でhome/endになる

正規表現を使おう

ワイルドカード

  • ? : 任意の1文字
    • : 任意の文字列

正規表現検索

  • [(from)~(to)]
  • . : 任意の1文字

繰り返し

  • * : 0回以上の繰り返し
  • + : 1回以上の繰り返し

シェルの基礎とSSH

boume shell系のお話

github : シェルの基礎とSSH Tips

コマンドに対する各種展開
チルダ展開 echo ~
パラメータ展開 ${USER:--unknown}
コマンド展開 $(echo "echo foo")
算術式展開 echo $((1+1))
クォート除去 echo "foo bar baz"

変数

name = "hello world"  
echo $name //$で参照  

{}を使うことで名前の範囲を明確に指定できる(パラメータ展開)

パイプとリダイレクション パイプ(|)はコマンドの標準出力とコマンドの標準入力を接続

ls | grep vim

リダイレクトは標準出力ではなくファイルに対し出力を行う
コマンド実行前に行われるため注意

ls -a >> out.txt 2>&1 //file, 標準エラー出力に表示

ヒアドキュメント

cat <<EOF > out.txt
foo
bar
baz
EOF

制御演算子 コマンド同士を ; で区切ることでコマンドを順番に実行

date ; pwd; ls

コマンド同士を&&で区切ると前のコマンドの終了ステータスが0(成功)だった場合に後のコマンドが実行される

ls && pwd

コマンド同士を||で区切ると前のコマンドの終了ステータスが0以外(失敗)だった場合に後のコマンドが実行される

ls || pwd

条件によって処理を分岐させる if

if[$(id =u) -eq 0]
if> then
if> echo "rootuser"
if> else
if> echo "guest"

for

for f in $(ls) //for eachで動く
for> do
for> cp $f $f.org //フォルダ内を全て.orgに変換
for> done

case, whileもある

コマンドのグループ化

コマンドを括弧でくくるとグループ化できる.出力をまとめることができる.
(echo hoge; echo fuga) | xargs (echo hoge; echo fuga) > out.txt

この括弧でくくられたコマンドはサブシェルで実行され、シェルの環境に影響をあたえるような操作はコマンド終了時に影響を与えない. 下記コードはプロセスが変わるため変更が適応されない.

hoge = HOGE; (hoge =FUGA;) echo $hoge
=> HOGE //サブシェルでの変更は親シェルに適応されない

シェルスクリプト 1行目にシバンを記述し2行目以降にコマンドを記述します.

####!/bin/sh //シバン 環境によってbashとかに変更するべき

set -eu
if...
...
fi

ssh Tips

踏み台 踏み台サーバーを経由してリモートホストに接続する場合あProxyCommandオプションを利用すると便利 コマンドラインオプション

ssh -o ProxyCommand "ssh -W %h $p USER@BASTION"

~/.ssh/config コンフィグに書けば流用可能

リモートホストのコマンド実行結果を手元で利用

例 リモートホストのログを手元にコピーしつつ検索

ssh REMOTE_HOST 'cat /var/log/httpd/access_log' | tee REMOTE_HOST .access_log | grep 404

手元のコマンド実行結果をリモートホストで利用

cat batch.sh | ssh REMOTE_HOST 'cat |/bin/sh'

操作ログを残す

scriptコマンドを利用して操作ログをファイルに残す 操作ログを残すのは運用上必要

script -q -c "ssh REMOTE_HOST" /path/to/log/file

困ったら

-hでヘルプを読みましょう
man COMMANDでマニュアルを読もう
「はじめてUNIXで仕事をする人が読む本」はshellやネットワークについてわかりやすく書かれているためおすすめ
プロセスはshellを使う上で避けて通れない. process-book で無料で勉強できる.


Java入門

特徴

クラス

  • 全クラスはobject型を継承
  • 親クラスは1つしか継承できない(単一継承)
  • 定義のみのメソッドを持つクラスを作成可能

インタフェース

  • 1つのクラスに複数のインタフェースを実装できる
  • メソッドが1つも存在しないインタフェースも作成可能
  • java8にて以下の変更がなされた
    • Static メソッドが定義できるようになった
    • デフォルトメソッドが定義できるようになった
    • メソッドが1つだけのインタフェースはラムダ式で実装可能になった(関数型インタフェース)

Android再入門

ITの周期は3年. androidは7年目. 3年前の情報は古い.

昔のAndroid

Eclipse + ADT #公式Emulator UI以外のテストをJUnit3で動かす

今のAndroid

開発環境 Android stadio
ビルドツール Gradle
テスト
JUnit4
Espresso 2.0
Robolectric
ジェネレータ
Genymotion

Eclipse + ADT はもう古いから使うな
by google

ビルドツールはGradle一択
Gradleの懸念点1

  • AS1.1が出たばかり.
  • 1.0未満の情報は危ない
  • 2014年12月以降の情報を参考にしよう

Gradleの懸念点2
* ライブラリの自動ダウンロードが起こる
* キャッシュはあるものの今回は細かいダウンロードが多めに発生する

Emulato

  • 公式ARMv7 起動がすごく遅い cpu:ARMv7
  • 公式Intel 実機くらい早い cpu:x86
  • Genymotion 実機より早い cpu:x86

実機を用意したほうが早い

テストツール
* 公式テストツール : androidTest
uiを使わないテストはこちら
* 非公式テストツール : Robolectric

Android Javaについて留意しておいたほうがいいこと
Android Java != Oracle Java


Javascript再入門

万能言語Javascript

Javascript

  • クライアントサイド
  • サーバサイドでも使える(node.js)

サンプルコードの位置

コードはgistにある
sambaiz gistで検索

開発環境

jsbinでブラウザ上で実行

スコープの話

関数スコープはあれど, ブロックスコープはない
var -> letにするとブロックスコープがうまれる(使えないことがおおい)
ホスティング : 関数全体で変数を参照できる->宣言前でも参照できるため代入されるとおかしくなる

"=="と"==="の違い

"==" は型変換して比較
"==="は型も一致する場合にtrue

slide
slideshare : あなたとJavascript
code
gist : javascript再入門


プロジェクト・マネジメント

プロジェクト・マネジメントとは?

  • プロジェクトを成功させるための活動
  • 品質費用納期に加え, メンバの管理も行う
  • PJのみでなく, メンバで協力する

EVM

earned value management
進捗やスケジューリングをお金で換算する管理手法 * pv planned value * ev earned value * ac actual cost cpi = ev/ac
spi = ev/pv

cpi > 1 は効率が良い
spi > 1 はスケジュールより進んでいる
ことを表す

EVMの効果

  • 数値的に進捗が見える
  • 効率よく作業ができているか見える
  • スケジュールを守れているかが見える
  • ACの測定によってどれだけ時間をかけられているかを数値で見える

まとめ

プロジェクト・マネジメントはエンジニアなどメンバ全員が学び意識することが大事.


NDSミートアップ

2015/3/14に開催 ヘッドホンアンプを作ってみよう チップによる変化をみる 予算1000円

zshでrvm useがこけた時の対処

zshを使用してrvm useを実行するとコケた.

どうやらRVMはbashをlogin shellと想定しているらしく, zshは一手間かける必要があった. 対処に時間がかかったのでメモ.
インストールしているrubyのバージョンは2.0.0-p598

$ rvm use 2.0.0

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.

まずはstack over flowを参考に.zshrc内でRVMのスクリプトファイルのパスを通した.

#RVMのスクリプトのパスを通す
##.zshrcの最後に記述すること##

# export PATH="$PATH:$HOME/.rvm/bin" 

15/2/23 追記
export PATH="$PATH:$HOME/.rvm/bin:$PATH" # Add RVM to PATH for scripting


#rvmをshell内で有効にする
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" 

terminalで.zshrcを再読み込み.

$source ~/.zshrc  
/Users/userhome/.rvm/scripts/cli:255: parse error near `-GF'

何故かsource .zshrcの時点でエラーが通らなくなってしまう.
色々調べた結果, 公式サイトに対処が乗っていた.

RVMの公式サイトによると RVM is not a function, selecting rubies with 'rvm use ...' will not work.が出たら次のコマンドを試してみろ. とのこと.

$ rvm alias create default 2.0.0
Creating alias default for ruby-2.0.0-p598....

$ rvm use 2.0.0
Using /Users/userhome/.rvm/gems/ruby-2.0.0-p598

できたっぽい.