Good UX Life

人生のUXを高めるための知見

MacをAirPlay受信機にしてiPhoneから音楽をストリーミング再生する

github.com

こちらのOSSを使うとMacOS, Linux, FreeBSD, OpenBSDのデバイスをAirPlay受信機にすることができます。 現在は音楽のみでビデオと写真はサポートされていません。

インストール

Mac OSではhomebrewを使って簡単にインストールすることができます。

brew install shairport-sync

その他のOSについてはReadmeを読んでください。

使い方

通常起動

shairport-sync

バックグラウンドで起動

shairport-sync -d

終了

shairport-sync -k

その他のにも細かい設定などができますが、自分はとりあえずこれで十分なので深堀はしないのでReadmeを読んでみてください。こういうツールがあるよーっていう紹介でした。快適な音楽ライフをどうぞ

LISP in Two Days with Rust【和訳】

RustでLISPを書くチュートリアルがあったので和訳しました。

willspeak.me

LISP in Two Days with Rust

自作プログラミング言語の開発の副業として、私はLISPの開発に少し時間を費やしました。RustでASTを変換する実験のテスト場としてこの言語を使用する計画です。LISPシンタックスはシンプルでパースしやすいように開発されました。実験的なコンパイラーの出発点としては良いと思いました。

この言語はlispy Scheme derivativeにとてもインスパイアされています。振る舞いのいくつかの要素は、私が手渡さなければならなかったLISP実装であったため、Emacs LISPから直接作成されています。このチュートリアルの最後には次のような式を評価できる言語ができているはずです。

(begin
    (define foo 1007)
    (define bar 330)
    (print (+ foo bar))) ; ~> prints 1337

Step 1 - 読み込み

プログラミング言語への道の最初のステップは、構文解析です。はじめに(+ 1 foo)のようなソースコードを認識する作業を分割と獲得の2つに分けます。最初のステップは文字列をトークンリストに分割します。プログラミング言語の世界でこの工程は字句解析と呼ばれていてそれぞれのトークンは語彙素と呼ばれています。トークンは私たちにとって十分ではあり、入力しやすいです。これをトークナイザーと呼びます。

私たちのトークナイザーは、ソーステキストに対して一連の正規表現を実行し、一致した表現に基づいてトークンの種類を選択することにより、論理的に機能します。私たちの場合、完全な正規表現エンジンはいらず、いくつかのmatchステートメントから構築されたステートマシンで十分です。より深い議論に関しては私の前のブログをチェックしてください。

LISPの分析するのに必要なトークンは非常にシンプルです。 * S式のグループ化 * 数字: [0-9]+ * 空白: \n, \t, ``等 * それ以外は全て識別子

まず、トークナイザーの状態を定義します。RustではEnumを使うのがベストです。

enum TokeniseState {
    Start,
    Lparen,
    Rparen,
    Number,
    Symbol,
    Whitespace,
}

tokenise関数のシグネチャは非常にシンプルです。borrowed stringを受け取り、トークンのベクタを返します。

fn tokenise(source: &str) -> Vec<ast::Token>

おそらく、トークンとはなにかを定義する時が来ました。最初は、トークンを列挙型としてモデル化するのも魅力的かもしれません。しかし、いつか面倒臭くなる時が来ます。多くの場合、すべてのトークン間で共有される状態があります。これを解決するためにトークンを二つのパートに分割します。まずはkindで、これはトークンの種類やNumberトークンの値のようなトークン固有のデータを持つ列挙型です。残りの共通フィールドは、種類とともに構造体に収集されます。

#[derive(Debug, PartialEq)]
pub enum TokenKind {
    LeftBracket,
    RightBracket,
    Number(i64),
    Symbol(String),
}

#[derive(Debug, PartialEq)]
pub struct Token {
    pub kind: TokenKind,
    span: Span<ByteIndex>,
}

トークンをあとでエルゴノミックマッチングするためにkindはpublicになっていることに注意してください。ソースの位置情報とspan情報のためにcodespanクレートを使います。

すべての準備が整ったら、tokeniseメソッドの本体に取り組みます。ループでトークンを取得し二段階に分けて処理します。まず現在の状態、そして次の文字を処理します。

loop {
    let mut state = Start;
    let mut end = start;

    for c in source[start..].chars() {
        let next = match state {
            Start => match c {
                '(' => Some(Lparen),
                ')' => Some(Rparen),
                '0'...'9' => Some(Number),
                'a'...'z' => Some(Symbol),
                c if c.is_whitespace() => Some(Whitespace),
                _ => None,
            },
            Lparen | Rparen => None,
            Number => match c {
                '0'...'9' => Some(Number),
                _ => None,
            },
            Symbol => match c {
                'A'...'Z' | '0'...'9' => Some(Symbol),
                _ => None,
            },
            Whitespace => {
                if c.is_whitespace() {
                    Some(Whitespace)
                } else {
                    None
                }
            }
        };

        // If we transitioned then accept the character
        // by moving on our `end` index.
        if let Some(next_state) = next {
            state = next_state;
            end += c.len_utf8();
        } else {
            break;
        }
    }

    let token_str = &source[start..end];
    let span = Span::new(start, end);

    start = end;

    let kind = match state {
        Start => break,
        Lparen => ast::TokenKind::LeftBracket,
        Rparen => ast::TokenKind::RightBracket,
        Number => ast::TokenKind::Number(token_str.parse().unwrap()),
        Symbol => ast::TokenKind::Symbol(token_str.into()),
        // Skip whitespace for now
        Whitespace => continue,
    };

    result.push(ast::Token::with_span(
        kind,
        span.map(|s| ByteIndex(s as u32 + 1)),
    ));
}

ここでは、読みやすくするために記号を構成できる文字の一部を省略しました。

(+ 1 foo)のように入力された文字は次のようなトークンのリストにできるべきで。

vec![
    Token { kind: TokenKind::LeftBracket, ... },
    Token { kind: TokenKind::Symbol("+"), ... },
    Token { kind: TokenKind::Number(1), ... },
    Token { kind: TokenKind::Symbol("foo"), ... },
    Token { kind: TokenKind::RightBracket, ... },
]

次のステップは、トークンのリストを取得し、構文ツリーを構築することです。ツリーの各ノードは、ご想像のとおり列挙型で表されます。LISPでは構文ツリーにはatomsformsの2種類のノードがあります。私たちのLISPのatomsはNumberSymbolです。Formsは、Formsまたはatomsのリストを含むパラメーター化されたS式です。この二つのメンバーだけで構文ツリーノードを作成することができます。ただし、私たちの言語は二つの特別なフォームを持ちます。条件付き実行の場合と、変数バインディングを導入するための定義です。これらもツリーでモデル化します。

#[derive(Debug, PartialEq)]
pub enum Expr {
    /// A direct reference to a variable symbol
    Symbol(Token, String),
    /// A numeric literal
    Number(Token, i64),
    /// A conditional expression
    If(Token, Token, Box<Expr>, Box<Expr>, Box<Expr>, Token),
    /// A variable declaration
    Define(Token, Token, Token, Box<Expr>, Token),
    /// A funciton call expression
    Call(Token, Token, Vec<Expr>, Token),
}

重要な値を持つトークンだけでなく全てのトークンをツリー含めていることに注意してください。これは、あとでリンターや構文フォーマットを実行する時により多くの位置情報を利用できるようにするためです。このテクニックは、full-fidelity treesと呼ばれていてC#のRoslynコンパイラやSwiftのコンパイラなど多くのコンパイラで使われています。IDEを作成する場合、この追加のメタデータは非常に貴重であることがわかります。

先読みのシングルトークンのLISPを認識できるようになりました。RustのPeekableイテレータを使います。私たちのパーサーはトークンのpeekableリストから始めることを必要としています。

struct ParseState<I: Iterator<Item = ast::Token>>(std::iter::Peekable<I>);

トップレベル関数は次のトークンを調べます。それがatomの場合は直接パースし、そうでなければformのボディを読むためにparse_formに渡します。

fn parse_expr(&mut self) -> ast::Expr {
    if let Some(token) = self.0.next() {
        use ast::TokenKind::*;
        match token.kind {
            LeftBracket => self.parse_form(token),
            RightBracket => panic!("unexpected token!"),
            Number(n) => ast::Expr::Number(token, n),
            Symbol(ref s) => {
                let sym = s.clone();
                ast::Expr::Symbol(token, sym)
            }
        }
    } else {
        panic!("invalid expression.")
    }
}

これは少しパニックする可能性があります!製品レベルのパーサーなら上品にこれらのエラーをResultを返したり、診断をバッファリングし、欠落しているトークンをスタブアウトしてリカバーします。後者のアプローチにより、パーサーは任意のソーステキストから構文情報を抽出できます。IDEの継続的な台頭により、一般的なアプローチになりつつあります。

fn parse_form(&mut self, open: ast::Token) -> ast::Expr {
    use ast::TokenKind::*;
    match self.0.peek() {
        Some(&ast::Token {
            kind: Symbol(ref sym),
            ..
        }) => match &sym[..] {
            "if" => {
                let if_tok = self.0.next().unwrap();
                let cond = self.parse_expr();
                let if_true = self.parse_expr();
                let if_false = self.parse_expr();
                let close = self.0.next().unwrap();
                ast::Expr::If(
                    open,
                    if_tok,
                    Box::new(cond),
                    Box::new(if_true),
                    Box::new(if_false),
                    close,
                )
            }
            "define" => {
                let define_tok = self.0.next().unwrap();
                let sym_tok = self.0.next().unwrap();
                let value = self.parse_expr();
                let close = self.0.next().unwrap();
                ast::Expr::Define(open, define_tok, sym_tok, Box::new(value), close)
            }
            _ => {
                let sym_tok = self.0.next().unwrap();
                let mut args = Vec::new();
                while let Some(token) = self.0.peek() {
                    if token.kind == RightBracket {
                        break;
                    }
                    args.push(self.parse_expr());
                }
                let close = self.0.next().unwrap();
                ast::Expr::Call(open, sym_tok, args, close)
            }
        },
        _ => panic!("invalid expression"),
    }
}

parse_formメソッドも同様のアプローチをとります。汎用なCall式の識別にフォールバックする既知の特別な形式の一つに一致しようとします。これら全ての準備が整ったら、REPLがソーステキストをast::Exprに読み込むために使用する高レベルの解析メソッドを作成できます。

pub fn parse(source: &str) -> ast::Expr {
    let tokens = tokenise(source);
    ParseState(tokens.into_iter().peekable()).parse_expr()
}

Step 2 Eval

これで構文解析された構文ツリーができたので、次は評価に移ります。私たちのevalメソッドはExprを取り、Valueを生成します。evalはエラーが発生する可能性があるために Reslut型を返します。

#[derive(Debug, PartialEq, Copy, Clone)]
pub enum Value {
    Number(i64),
    Callable(Callable),
    Nil,
}

type Callable = fn(Vec<Value>) -> EvalResult;

pub struct EvalError(String);

pub type EvalResult = Result<Value, EvalError>;

pub fn eval(expr: ast::Expr) -> EvalResult {
    eval_with_env(expr, &mut make_global_env())
}

Valueは数字やCall可能な関数を持ちます。これらを評価の結果として返すだけでなく、環境に保存します。

evalにはあまりコードはありませんが、2つの興味深いことが進行中です。一つ目はグローバル関数を作るためにmake_global_envを呼びます。主な評価はeval_with_envで行われます。

私たちのLISPのeval環境は単なるValueSymbolHashMapです。make_global_env関数は新しいmapを作り、グローバルな関数を挿入するだけです。

pub fn make_global_env() -> HashMap<String, Value> {
    let mut env = HashMap::new();

    env.insert(
        "begin".into(),
        Value::Callable(|values| Ok(last_or_nil(values))),
    );
    env.insert(
        "+".into(),
        Value::Callable(|values| {
            let mut sum = 0;
            for value in values.iter() {
                sum += value.into_num();
            }
            Ok(Value::Number(sum))
        }),
    );
    env.insert(
        "-".into(),
        Value::Callable(|values| {
            Ok(if let Some((first, rest)) = values.split_first() {
                let mut sum = first.into_num();
                if rest.len() == 0 {
                    Value::Number(-sum)
                } else {
                    for value in rest {
                        sum -= value.into_num();
                    }
                    Value::Number(sum)
                }
            } else {
                // (-) ~> 0 ; apparently
                Value::Number(0)
            })
        }),
    );
    env.insert(
        "/".into(),
        Value::Callable(|values| {
            if let Some((first, rest)) = values.split_first() {
                let mut res = first.into_num();
                Ok(if rest.len() == 0 {
                    Value::Number(1 / res)
                } else {
                    for value in rest {
                        res /= value.into_num();
                    }
                    Value::Number(res)
                })
            } else {
                Err(EvalError("Wrong number of arguments: /, 0".into()))
            }
        }),
    );
    env.insert(
        "*".into(),
        Value::Callable(|values| {
            let res = values.iter().fold(1, |acc, v| acc * v.into_num());
            Ok(Value::Number(res))
        }),
    );

    env
}

eval実行環境の中ではかなり簡単な方です。数値atomは自分自身に評価されます。シンボルは環境で検索されます。

use ast::Expr::*;
match expr {
    Symbol(_, s) => env
        .get(&s)
        .cloned()
        .ok_or_else(|| EvalError(format!("eval: Undefined symbol {}", s))),
    Number(_, n) => Ok(Value::Number(n)),

If式を評価し、結果に基づいて評価するブランチを選択する場合:

    If(_, _, cond, then, elz, _) => Ok(if eval_with_env(*cond, env)?.is_truthy() {
        eval_with_env(*then, env)?
    } else {
        eval_with_env(*elz, env)?
    }),

Defineはその式を評価し、結果を環境ハッシュマップに挿入します。

    Define(_, _, sym, value, _) => {
        let value = eval_with_env(*value, env)?;
        let sym = to_sym(sym)?;
        env.insert(sym, value.clone());
        Ok(value)
    }

関数呼び出しは、環境内でCallableを検索し、すべての引数を評価して呼び出します。

    Call(_, sym, args, _) => {
        let sym = to_sym(sym)?;
        match env.get(&sym) {
            Some(Value::Callable(c)) => c(args
                                          .into_iter()
                                          .map(|a| eval_with_env(a, env))
                                          .collect::<Result<Vec<_>, _>>()?),
            _ => Err(EvalError(format!("eval: Invalid function {}", sym))),
        }
    }
}

Expr型はシンプルなので全てのケースを分類します。これはLISPの利点です。構文は小さいです。本当の力はそれを組み合わせることができるということです。

Step 3 出力

パースと評価が適切に行われているため、読み取り、実行、出力のループがほぼ機能しています。非常にシンプル評価の結果を出力できます。

fn print(result: eval::EvalResult) {
    match result {
        Ok(value) => println!(" ~> {}", value),
        Err(error) => println!(" !! {}", error),
    }
}

ソース行を読むには、最初にプロンプ​​トが必要です。

fn read() -> ast::Expr {
    let mut buff = String::new();
    print!(" > ");
    std::io::stdout().flush().unwrap();
    std::io::stdin().read_line(&mut buff).unwrap();
    parse::parse(&buff)
}

最終的なREPLは非常に簡単に構築できます。

let mut env = eval::make_global_env();
loop {
    print(eval::eval_with_env(read(), &mut env));
}

グローバル環境はloop前に初期化されそれぞれのREPLの状態は次のエントリで利用できることに注意してください。

 > (define foo 100)
 ~> 100
 > (define bar 99)
 ~> 99
 > (+ foo (- foo bar))
 ~> 101

Step 4 実験

基本を設定したら実験してみましょう。グローバルスコープに新しいCallable関数を含めることで、簡単に”基本ライブラリ”に追加することができます。この投稿で概説されている言語は、ユーザ定義関数やループの形式をサポートしていません。欠落しているもう一つの大きなLISP機能は、フォームを引用および評価して、ソースコードからデータに変換したり戻したりする機能です。

この投稿で作られたプログラミング言語ソースコードは、GitHubで入手できます。

oh-my-zshからzpluginへ移行する

数年前にbashからzshに乗り換えて適当に.zshrcを書いて放置してきました。 今回は.zshrc, .zprofileの整理とoh-my-zshからzpluginへの移行作業を行いたいと思います。

.zshrcをアンインストール

公式に乗っ取り

uninstall_oh_my_zsh

を実行。実行できない場合は.oh-my-zshフォルダを削除

.zpluginをインストール

github.com

まずoh-my-zshに該当する箇所を.zshrcから削除し、公式に書かれているインストール方法でzpluginをインストールします。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zplugin/master/doc/install.sh)"

すると.zshrcに以下のコードが追加されます。

### Added by Zplugin's installer
source '/Users/hoge/.zplugin/bin/zplugin.zsh'
autoload -Uz _zplugin
(( ${+_comps} )) && _comps[zplugin]=_zplugin
### End of Zplugin's installer chunk

最低限のカスタマイズ

qiita.com

こちらに乗っていたコードを丸写しでとりあえず最低限の環境はできます。

#zplugin
source '/Users/yama/.zplugin/bin/zplugin.zsh'
autoload -Uz _zplugin
(( ${+_comps} )) && _comps[zplugin]=_zplugin
 
zplugin light zsh-users/zsh-autosuggestions
zplugin light zdharma/fast-syntax-highlighting
zplugin ice pick"async.zsh" src"pure.zsh"; zplugin light sindresorhus/pure

compinit

とりあえずこれで一旦やってみて物足りなくなったらプラグインを追加していきます。

ハッキングを学べるサイト TOP27【和訳】

前回の記事に続いてQuoraの同じ質問についていた回答を和訳しました。

www.quora.com

ハッキングを学べるサイト TOP27:

こんにちは。私はインターネットにある情報やQuoraの回答や下記のサイトを全てチェックしてホワイトハッキングを学びました。

1 Masters In Ethnical Hacking

www.youtube.com

Masters In Ethnical HackingはYoutube上のホワイトハッキングについてのチャンネルの中でもっとも良いチャンネルです。

  • 登録者: 28万+
  • 投稿数: 600+

2 EthicalHacker365

ethicalhacker365.blogspot.com こちらはホワイトハッキングを学べる一番良いブログです。
このブログの優良記事:

ethicalhacker365.blogspot.com

3 HellboundHackers

www.hellboundhackers.org

HellboundHackersは完全に合法なWebベースのセキュリティを鍛える場であり、コンピュータの悪用がどのような仕組みなのかを教えてくれます。

4 Damn Vulnerable iOS Application (DVIA)

damnvulnerableiosapp.com DVIAはモバイルセキュリティ愛好家/専門家または学生に、合法的な環境でiOSの侵入テストスキルをテストするためのプラットフォームを提供します。

5 RootMe

www.root-me.org

RootMeは様々なケースのハッキング練習をさせてくれるサイトです。

6 CTFtime

ctftime.org CTFtimeは、世界中で起こっているCTFイベントを最新の状態に保つための素晴らしいリソースです。

7 WebGoat

webgoat.github.io WebGoatはWindows, OS X, Linux場で動作するJavaと.NET製の脆弱性を含んだアプリです。いわゆるやられアプリ

8 JuiceShop

github.com

JuiceShopは、JavaScriptのコーディングやテストに精通していても発生する可能性があるセキュリティ上の問題を理解していない人のための、脆弱性を含んだWebアプリケーションです。

9 Hackademic

github.com

HackademicはOWASP open-source projectの一つで、脆弱性に満ちた10個の現実的なシナリオを提供してくれます。

10 Hackxor

hackxor.net

HackxorはXSS, XSRF, SQL injectionにフォーカスしたハッキングゲームのWebアプリです。

11 BodgeIt

github.com

BodgeIt Storeは侵入テストに不慣れな人向けと脆弱性を含んだWeb Appです。

12 EnigmaGroup

www.enigmagroup.org

EnigmaGroupはセキュリティに関する知識を向上させ、さまざまな脆弱性をホストしたいと考えている人のためのものです。

13 GoogleGruyere

google-gruyere.appspot.com

GoogleGruyereは脆弱性を探す方法を学ぶための初心者向けに設計されたサイトです。どのようにWeb appに侵入するか、どのように侵入を防ぐがを学べます。

14 Hack.me

hack.me

Hack.meは数多くの脆弱なアプリをホストしており、コミュニティが教育や研究目的で脆弱なアプリケーションコードを構築、ホスト、共有できるようにしています。

15 HackTheBox

www.hackthebox.eu

HackTheBoxは侵入テストのスキルをテストしたり、同じ関心を持った仲間たちとメソッドを交換するためのプラットフォームです。

16 HackThisSite

www.hackthissite.org

HackThisSiteは、他のハッカー・ウォーゲーム・サイトとは違います。活発で活気のある開発中のプロジェクトが多数あるコミュニティです。

17 TRY2HACK

::[ www.try2hack.nl ]::

TRY2HACKはあなたの娯楽のためにいくつかのセキュリティ指向の課題を提供します。

18 HackThis

www.hackthis.co.uk

HackThisはユーザーがハッキングスキルを様々な課題でテストしたり、ハッキングについて学ぶための合法で安全なネットワークセキュリティリソースです。

19 CTF365

https://ctf365.com/

CTF365はあなたのサーバーを守り、他のものに対して攻撃を仕掛けることを可能にし、現実で実際に使われている技術を使用しています。

20 OverTheWire

overthewire.org

OverTheWireはゲーム形式でセキュリティの概念を学び、実践するのに役立ちます。

21 HackingLab

https://www.hacking-lab.com/index.html

HackingLabはEuropean Cyber Security Challengeのように国際大会にCTFとミッションスタイルの課題を提供しています。

22 Pwnable

pwnable.tw

Pwnableはシステムの利用に関するさまざまなpwnの課題を提供する非営利のwargameサイトです。

23 SmashTheStack

smashthestack.org

SmashTheStackは様々なWargameをホスティングしたサイトです。

24 IO

io.netgarage.org

IOは様々な無料のWargameを持つWargameコミュニティです。

25 Microcorruption

microcorruption.com

Microcorruptionは、架空のLockitall電子錠装置をリバースエンジニアリングする必要がある組み込みセキュリティCTFです。

26 W3Challs

w3challs.com

W3Challsは侵入テストプラットフォームです。ハッキング、クラッキング、ウォーゲーム、フォレンジック、暗号化、ステガノグラフィ、プログラミングなど、セキュリティに関するカテゴリでさまざまなコンピュータの課題を提供します。

27 PWN0

https://pwn0.com/

PWN0はほとんどなんでもありのVPNでpwnobotsや他のユーザからrootを獲ると点数を得ることができます。

雑な翻訳なので間違いがあればコメント等でおしらせください。

ハッカーになるためにはなにをすればよいか【和訳】

なにかHack的なことをしたくなって色々みていたらQuoraというサイトに良い文章があったので和訳しました。 www.quora.com

この頃、メディアの派手な宣伝によってたくさんの大学生や高校生達がハッカーになりたがっています。ハッカーはかっこ良いと同時に犯罪的だとも思われています。私のブログは基本的に私のハッキングへの道のりを書いたものなのでたくさんのメールが送られてきます。”どうやってハッカーになるの?” "ハッキングの初心者qqなんですけどどうやって始めれば良いですか?" "友達のFacebookをハックできるようになりたいです" 等、他にも頻繁に質問が送られてきます。この記事ではこれらの質問や他のことについても答えていこうと思います。どのようにハッキングを始めるか、どのようにしてハッキング領域の専門知識を底上げするかについて詳細な指示書きを与えましょう。
ハッキングはスキルです。ただ単に友達のFacebookアカウントやメールを面白がってハッキングしてもあなたのためにはならないことを覚えておく必要があります。 あなたはハッキングを学ぶべきです。なぜなら技術に対するあなたの興味や欲望はあなたをコンピュータシステムのエキスパートにしてくれるからです。

"ハッカーであることはとても楽しいでが、多くの努力を必要とする楽しみです。努力にはやる気がいります。"

ハッカーになるための重要な最初の一歩はEric Raymondのこの記事(日本語版はこちら)を読むことです。志高いハッカーになるためのデファクトスタンダードガイドラインです。

ハッカーマインドセット

ハッカーになるためには現実世界であらゆる技術に出会ったとき、ハッカーの視点でそれらをハックすることを考えて見ることを始めなければなりません。ハッキングはコンピュータに限ったことではありません。日常の中で問題に出会ったとき論理や創意工夫で問題解決することもそうです。何もないことはとてもハッキング対策です。自動人力車メーター、電子投票機、自動ドア、生体認証、車やヨットは全て過去にハックされています。なんらかのテクノロジーに出会った時はいつでも別のアクションをどのようにして起こせるかを考えてください。パズル解決することや挑戦をする好奇心を備えておくべきです。

あなたの技術を知る

ハッカーになることは簡単ではありません。数日、数週間ではなれません。数ヶ月、数年かけてハッカーと自分自身で呼べるところまで届くのです。主な理由はハッカーは様々な技術的ノウハウを必要とするからです。もしあなたがコンピュータをハックしたいなら、コンピュータがどのように動いているかを知ることが論理的だと思いませんか?コンピュータの内外に精通していて、ITドメイン内のすべてについて少し知っておくべきです。そのため、あなたは様々なことについて学ばなければなりません。この学習段階で大抵の意欲的なハッカーは諦めてしまいます。

一般的なITの知識:

上記のものは最低限の概念で、あなたはこれらを徹底的に勉強しなければなりません。例えば、データがOSIレイヤーをどのように行き来しているか、データ転送におけるそれぞれのレイヤーの役割を知る必要があります。COMPTIA A+ CERTIFICATIONのようなネットワークコースを受けることをお勧めします。

プログラミング言語

ハッカーになるために必須ではありませんがプログラミングの知識は必要です。世界的なハッカー達もプログラマーから始まっています。あなたがプログラミングを知っていれば、コードを分析して解析することができるし、自分用のスクリプトやハッキングツールを作ることができます。では、あなたはどのプログラミング言語を学ぶべきなのでしょうか?HTML、JavaScriptはインターネットの言語です。だからこそ最初にこれらを学ぶ方が良いでしょう。これらは信じられないほど簡単に理解し学ぶことができます。あなたがコンピュータサイエンス学部の学生なら、おそらくC言語C++Javaを勉強するでしょう。この三つのメジャーな言語は素晴らしいので学習を続けるべきです。しかし、ハッカーにとってはPythonがベストな言語です。"なぜ?"とあなたは聞くでしょう。なぜならPythonは極めて強力な言語であると同時に簡単に学習することができるからです。Pythonは少ないのコードで結果を得ることができ、コンパイルが必要ありません。これはスクリプトを書くだけで即座にコンパイルなしで実行できることを意味しています。この先ハッカーではなくプログラマーになることを決意した時、PythonGUIアプリケーションも作ることができます。実際、Youtubeの大部分はPythonで書かれています 。
他の言語ではPHPを学ぶべきです。PHPも同様にフリーのOSSです。PHPはサーバーサイド言語です。ログインページや他のWeb FormもPHPにハンドルされているということになります。ASP.NETの知識も役立ちます。MySQLのコマンドやシンタックスについても知るべきです。この知識はSQLインジェクションに対抗する際に極めて重要になってきます。XAMPPをダウンロードしてPHPMySQLの練習をしてください。
もう1つ重要なことは、ほとんどの大学があなたに高度なプログラミング概念を教えないということです。重要なでファイルハンドリング、ネットワークソケットプログラミングは言語に関係なくあなた自身で熟知すべきです。

オープンソース

ハッカーコミュニティはOSSの大きなサポータです。あなたはできる時にOSSに貢献するべきです。プログラミングスキル向上させるためにOSS活動をするのが良いでしょう。人気のOSSをダウンロードしてソースコードを読みましょう。SourceforgeGithubは素晴らしいスタートポイントです。あるいは自分でプロジェクトを始めオンラインにソースコードを投稿するのも良いでしょう。これはあなたの知名度をあげるのに役立つでしょう。

Linux

ほとんどのユーザーにとってWindowsOSは簡単で便利かもしれませんが、ハッカーに適したものではありません。いくつかのWindows専用ツールをのぞいて、大抵のハッキングツールはLinux環境下で最適な動作をします。私はここで10個の最高のハッキングツールを紹介しました。これらのうち9個はLinux環境下でベストな動作をします。UbuntuFedoraのようないかなるLinuxディストリビューションでも使うことができます。しかし、BackTrackとKaliのメジャーな二つのLinuxディストリビューションは特にハッカー向けに設計されています。これらのOSは人気のハッキングツールが全てインストールされており、自分でインストールする際のトラブルを回避することができます。もしまだWindowsから離れることを嫌だと思っているなら、Virtual Boxを使ってBackTrackをインストールするか、OSをデュアルブートすることもできます。情報技術はとても大きな分野です。 大学を見ると、教授はプログラミングの概念と理論について、システム管理者はネットワークとシステムについて、Webサイトの開発者はWebのプログラミングと設計について知っています。あなたは、ハッカーとして、これらすべてのことを知っている必要があります。

ハッキング領域の下でさえ、Webアプリケーション、ネットワークセキュリティ、デジタルフォレンジックリバースエンジニアリング etcなどの様々なサブカテゴリーがあります。全て理解している人などいません。一般的なハッキングの知識や経験を手にした後、どの分野のエキスパートになるかを選びましょう。

では、現実的なハッキングについて話しましょう。仮想環境を作ってハッキングの練習をしましょう。やり方はここにあります。先ほど紹介した10個のツールを使ってみよましょう。あなたがハッキングやその他の技術の理論的概念を理解しているのであればこれらのツールを簡単に使うことができます。ハッキングされることを目的としたWebサイトを使ってWebアプリケーションのハッキングの練習をしましょう。良い例はhttps://www.hackthissite.org/です。このようなサイトはたくさんあります。 Googleはあなたの親友です。 ハッキングを学ぶ方法の一つとして、PDFとビデオリソースをダウンロードして勉強することが良いでしょう。CBTナゲットや他の機関のビデオチュートリアルはtorrentで利用可能です。Youtbeはどのトピックでも豊富なチュートリアルがあります。http://www.securitytube.net/も良いでしょう。 私が始めた頃の勉強方法を教えましょう。日記(ブログ等)をつけることを初めて、あなたがハックしたいもののリストを作ります。例えばあなたが大学生なら、あなたの目的になるものはWebフィルターを巡回すること、出席記録にアクセすること等かもしれません。達成できるまで取り組みましょう。同様に、あなたの目的は誰かのシステムに入ることかもしれません。成功するまでギプアップしないでください。全てを日記に記録してください。これらはあなたがどれだけ成長したかを教えてくれるでしょう。

練習と勉強をすることを続けましょう。これがハッカーへの唯一の道です。あなたが大学生ならパーティーFacebookを見ることに時間を費やしてはいけません。時間はとても貴重です。起きている時間を全て有効活用しましょう。もしWebサイトや小さな会社をやっている友人がいるのならWebサイトやネットワークへの侵入テスト(ホワイトハック)をさせてもらえないか聞いてみましょう。しかし、許可を得ることを忘れないでください。誰かのWebサイトやシステムに許可なく書き込むことは犯罪であり刑務所に入ることになります。口だけの許可は法廷では通じません。彼らのウェブサイトをハックすることができるようになったら、レポートを書いて提出してください。

これがハッカーになる方法です!この通りハッカーになるための道のりは長いです。なので、あなたがただハックしたいだけならばこの業界はあなたにふさわしくありません。要するに、あなたは常にホワイトハッカーであるべきということを忘れないでください。不注意を起こしたり、間違って犯罪者になる可能性があります。ホワイトハッキングは危険な領域です。

100均のシリコン排水溝は絶対にお勧めしない

お風呂の排水溝カバーの交換がいつも嫌で何か解決方はないかと考えていた時、シリコンの排水溝カバーを見つけました。  

これさえ買えばもう新しく排水溝カバーを買う必要もなく、掃除も楽になるんだ!と思い実際に買ってみるとそんなことはありませんでした。

 

100均シリコン排水溝カバーのデメリット

すぐに詰まってしまう

使っていると一週間くらいで毛が詰まってしまいます。(私の抜け毛が多いのか!?)
ですので毎回お風呂上りなどに掃除すればいいかもしれませんね。私のような面倒臭がり屋にはできませんが。。

掃除がとても困難

髪の毛が思った以上に絡まります。結構な頻度で掃除をしなければならないのでとても大変です。

少し高い排水溝カバー

Amazonで調べたところ評価の高い排水溝カバーを見つけました。毎回、溜まった毛を捨てれば全然つまらないとレビューには書かれていました。買ってみようかな。。

めんどくさがり屋は使い捨てのカバーを使おう

時間や手間を考えると毎回掃除をする必要のない使い捨てのカバーの方が絶対にいいと思います。
シリコン排水溝に期待していたので少し残念です。。

自転車パンク修理で本当に必要なものをまとめてみた

先々週自転車がパンクして自分で修理をしようとしたところ、100均で道具がすべて揃うことを知りました。しかし、私は怒っています。結論から言うと100均に3回行くことになりました。なぜかというと100均の修理セットだけで直せると書いてあるサイトが多いのに、実際には他にも必要なものがあったからです!!許せない!!とはいっても私がしっかり調べなかったのが良くないのですが、、
ということでこの記事に実際にやってみてわかった自転車パンク修理に必要なものをすべてまとめます。

パンク修理の前に

パンク修理を始める前に確認すべき点が二つあります。

  • バルブは緩んでいないか

    バルブをもう一度しっかり締めて空気を入れなおしてください。もし空気がしっかり入れば解決です。

  • 虫ゴムが劣化していないか

    タイヤの空気を入れるところに水を入れたペットボトルのキャップを付けて空気がでてきたら虫ゴムが劣化している証拠です。100均に虫ゴムが売っていますので付け替えて解決です。

上記二つは下記記事の1Pに写真付きで説明が書かれているので、もしわからなければご覧ください!

allabout.co.jp

自転車パンク修理に必要なもの

  • 100均の自転車パンク修理セット
  • 10mmレンチ
  • マーカー
  • 水を入れるためのボウル
  • 空気入れ

*チューブに穴が空いていた場合に必要な道具です。

修理方法

下記の動画がとてもわかりやすかったのでお勧めします!

youtu.be