Create a new repository

全力で行くらしい

AWSにrbenvで2.0.0-p0をインストール

今回は、 AWSにrbenvにruby 2.0.0-p0をインストールしました。

http://www.slideshare.net/kentamagawa/3amazon-ec2 を使用しました。

AWSにログイン

$ ssh -i ~/.ssh/server.pem ec2-user@your.ip
$ sudo su -

yum

$ yum update
$ yum groupinstall "Development Tools"

rbenv

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ exec $SHELL -l
$ rbenv install 2.0.0-p0

お疲れ様でした!

AOJ 10020,10021,10022

AOJを解いた。
ツッコミやこっちのほうが早いなど、教えていただけるとありがたいです。
どうやったら競技プログラミングがうまくなるのだろう。。

10020

#include <iostream>
 
int main(void){
    int n[26]={};
    char c;
     
    while(std::cin >> c){
        if(isalpha(c)){
            c = tolower(c);
            n[c-'a']++;
        }
    }
     
    //std::cout << std::endl;
     
    for(int i=0;i<26;i++){
        std::cout << (char)('a'+i) << " : " <<  n[i] << std::endl;
    }
    return 0;
}

10021

#include <iostream>
 
int main(void){
    std::string str="";
    int n;
     
    std::cin >> n;
    for(int i=0;i<n;i++){
        std::string input;
        std::cin >> input;
        if(str == "" || str > input){
            str = input;
        }
    }
     
    std::cout << str << std::endl;
    return 0;
}

10022

#include <iostream>
 
int main(void){
    std::string word;
    std::string str;
    int cnt=0;
     
    std::cin >> word;
     
    while(std::cin >> str && str != "END_OF_TEXT"){
        for(int i=0;i<str.size();i++){
            str[i] = tolower(str[i]);
        }
        if(word == str){
            cnt++;
        }
    }
     
    std::cout << cnt << std::endl;
    return 0;
}

バカものが挑むC++ まとめ1

C++で忘れがちなことをまとめました。

文字列

null文字が文字列の最後につく

文字列の最後につくnull文字のことをnull terminatorという。

データ型

charは-127 ~ 128の値を持つ整数型である。

キャスト

後日記述

sizeof

  • 変数 - 変数のバイト数
  • 配列
    • 配列名 - 配列全体のバイト数
    • 要素 - 変数のバイト数
  • ポインタ - ポインタのバイト数(環境依存)

ポインタ

ポインタはデータ型のサイズに関係なく、一定のサイズを持ちます。

サイズはコンパイラに依存する。

ポインタは配列と同様に[]を使って扱うことができる

参照

型名に&をつけることで、変数を参照することができる

参照先を途中で変更はできない。

必ず初期化する必要がある。

オーバーロード

引数の異なる同じ名前の関数を作成することができる

デフォルト引数と併用する場合、呼び分けができることを確認しなければならない。

NULL

後日記述

アドレス

アドレスに*をつけると、そのアドレスにあるメモリが扱える

アドレスの取得

  • 変数 - 変数名の前に&をつける
  • 配列 - 配列名で取得
    • 要素 - 配列名の前に&をつける
  • ポインタ
    • ポインタ自身のアドレス
    • ポインタの参照先のアドレス - ポインタ名の前に &* をつける
  • 関数 - 関数名で取得

アドレスの演算

定数

  • 変数 - const 型 変数名 = 初期値;
  • ポインタ - 型 const 変数 = 初期値;

ヌルポインタ

関数でポインタを返り値として返す時、エラー・例外・予想しない動作を検出する目的で NULLを返すことを言う。

どんな変数や、関数のアドレスとも一致しない。

ヌルポインタはソース上では、0として表現する。

静的変数と自動変数

プログラムがロードされた時点でメモリが確保される変数を静的変数という。

グローバル変数で宣言された変数は静的変数である。

staticをつけるとローカル変数も静的変数になる。

静的変数の初期化は、ローカル変数でも一度しか行われない。

初期化しない場合は、0で初期化される。

また、静的変数は関数を抜けても値が保存される。

スコープ

中括弧で囲われた範囲をブロックといいます。

変数には寿命が存在し、ブロック外に出ると、ローカル変数は破棄される。

グローバル変数は、::で指すことができる。

バカものが挑むC++ - ポインタ編 -

アドレスの取得

変数、ポインタのアドレスは&をつけることで、取得できる。
配列、関数のアドレスは、その名前を書くことで取得できる。

#include <iostream>

void Func(){
}

int main(void){
    char i = 0;
    char c[2] = "a";
    char *p = "b";
    
    // 変数
    std::cout << (size_t)&i << std::endl;
    
    // 配列
    std::cout << (size_t)c << std::endl;
    // 配列の要素
    std::cout << (size_t)&c[0] << std::endl;
    
    // 関数
    std::cout << (size_t)Func << std::endl;
    
    // ポインタ
    std::cout << (size_t)&p << std::endl;
    
    return 0;
}

ポインタ

アドレスに*をつけるとそのアドレスにある値を扱うことができる
(ポインタの参照先の変数は、「*」 + 「変数名」でアクセスできる)
ポインタが参照している変数のアドレスにアクセスするには、そのポインタの名前を書けば良い。

#include <iostream>

int main(void){
    char c;
    char *p = &c;
    
    // 変数のアドレス
    std::cout << (size_t)&c << std::endl;
    // ポインタが参照している変数のアドレス
    std::cout << (size_t)p << std::endl;
    
    // ポインタの参照先の変数
    *p = 'a';
    
    std::cout << *p << std::endl;
    std::cout << c << std::endl;
    
    return 0;
}

変数の参照とポインタ

ポインタと変数の参照は同じである。

#include <iostream>

int main(void){
    char c;
    char& p = c;
    
    c = 'a';
    std::cout << c << std::endl
        << p << std::endl;
    
    p = 'b';
    std::cout << c << std::endl
        << p << std::endl;
    return 0;
}

配列のアドレス

配列のアドレスと、配列の先頭のアドレスは同じである
(配列名は配列の先頭要素を指し示す)

#include <iostream>

int main(void){
    char str[4] = "abc";
    
    std::cout << (size_t)str << std::endl
        << (size_t)&str[0] << std::endl;
    return 0;
}

ポインタを[]を使ってアクセス

ポインタも配列と同じく[ ]でアクセスできる

#include <iostream>

int main(void){
    char *p = "abcd";
    
    std::cout << p[0] << std::endl;
    std::cout << p[1] << std::endl;
    std::cout << p[2] << std::endl;
    std::cout << p[3] << std::endl;
    return 0;
}

配列とポインタの違い

配列は、配列名に&をつけると先頭のアドレスを指し示すが、
ポインタは、ポインタ名に&をつけると参照している変数ではなくポインタ自身のアドレスを返す。
sizeofで取得できる値にも注意が必要です。

#include <iostream>

int main(void){
    char str[10];
    char *p = str;
    
    std::cout << (size_t)&str << std::endl;
    std::cout << (size_t)&p << std::endl;
    
    // 配列のサイズ(1byte x10 = 10byte)から1要素のサイズ(char=1byte)を割る
    std::cout << sizeof str / sizeof str[0] << std::endl;
    // ポインタのサイズ(8byte[環境依存])から1要素のサイズ(char=1byte)を割る
    std::cout << sizeof p / sizeof p[0] << std::endl;
    return 0;
}

アドレスの演算

配列のある要素のアドレス &n[i] にjを足すと、&n[i+j]になる
配列のアドレス同士を引き算する(&n[i] - &n[j])と、i-jが得られる。

#include <iostream>

int main(void){
    char ary[5];
    
    std::cout << (size_t)&ary[2] << std::endl;
    std::cout << (size_t)&ary[2]+1 << std::endl;
    std::cout << (size_t)&ary[3] << std::endl;
    
    //=> 2
    std::cout << (size_t)(&ary[4] - &ary[2]) << std::endl;

    return 0;
}

* と [ ]は同じ

#include <iostream>

int main(void){
    char ary[5];
    
    //=> 2つは同じアドレスを示す
    std::cout << (size_t)&ary[2] << std::endl;
    std::cout << (size_t)&*(ary + 2) << std::endl;
    return 0;
}

const

ポインタをconstする場合

#include <iostream>

int main(void){
    char const *ary;
    
    return 0;
}

ヌルポインタ

エラーや例外、予測しない事態が発生する場合が発生した場合に使用します。 ヌルポインタはソース上では0と等価である。
ヌルポインタは、どの変数、関数のアドレスと比較しても等しくならない
いい例が思いつきませんでした。

いつか調べる

  • 配列でインデックスを指定するよりも、ポインタを使ったほうが早い?
  • size_t とは?

IIJを退職しました・入院しました・これから

IIJを退職しました

アルバイトを始めたきっかけ

2012/8月 IIJの方々と会話をする機会を頂き、アルバイトをするの話を進め、
中高生国際Rubyプログラミングコンテスト2012の審査後、親を含め話をし決定した。

8月の時、IIJのエンジニアの方に、自分の技術を良く評価していただいた。 嬉しかった。

IIJで学んだ事

''プログラミングができれば良いわけではない''
これが一番大きいと思います。

非常に多くのことを教わりました。
技術的なことも、人間として未熟なことも。

IIJを退職した理由

規則正しい生活が送れず、仕事に穴を空ける事が多くなった為。
入院した理由も関わっている。

入院しました

きっかけ

病状が悪化したため

感想

入院つらたん

これから

高校

定時制夜間部に入ったことが一番大きい。
行かない。
学校行くくらいならプログラムを書く。

高認とって、大学は行く。

プログラミング

とにかく頑張る。

中高生国際Rubyプログラミングコンテスト 2012

何度目かわからないけど、ブログ始めました。

「中高生国際Rubyプログラミングコンテスト 2012」がありました。

 

U-15もU-18もどちらも、

作品の質は去年より高くなっています。

 

大会前は、縄田君・坂東君・山内君のU-15のメンバーと仲良くしていました。

自分は優秀賞でしたが、よりよい作品作りが出来るように精進したいと思います。