うなすけとあれこれ

2013年08月24日

プログラミングなんてできるわけがない

プログラミングを義務教育に

そんな意見を聞いたことがある。実際はどうかわからないし、調べる気も起きない。 たとえばenchant.jsはゲームプログラミングの敷居を下げようとしているし、文部科学省ではプログラミンなんていう子供にもプログラミングが体験できるようなwebページを公開している。ドットインストールには僕も助けられている。

プログラミングの入門書はいくつも出版され、勉強会や講習会も多く開催されている。プログラミング人口を増やそうという試みが、全国的に、というか世界的に広がっている。

プログラミングができない

それでも、例えばプログラミングを義務教育に導入したとして、プログラマが増えるとは僕には思えない。それはなにも「数学を学んだから大学で数学を専攻するようになる」とか、「国語を学んだから小説家になる」とか(飛躍し過ぎだとは思うが)いう、エキスパートになることができないということではなく、「数学を勉強したが二次方程式は解けない」とか「国語を学んだが助詞が未だに正しく使えない」とかいうレベルでできないものはできないのだ。当たり前といえば当たり前であるが。

プログラミングなんて言葉なんだ こんなものやれば誰だってできるようになる

なぜプログラミングができないのか。それはやはり世界が違うからだ。数学は数の世界に、言葉は言葉の世界に分かれている。言葉の世界は生まれた時から強制的に放り込まれているからこの世界には慣れたものだし、この世界でうまくやれないと何をするにも難しい。数の世界なんかもある程度うまくやっていけないと文明社会で生きるには辛いものがある。

ところがプログラミングの世界ときたら、そんな世界に順応する必要があるわけでもなく、そのうえにその世界の住人から、自分たちの慣れ親しんだ世界用の成果物が放っておいてもどんどん出てくる。頼んでもないのにだ。こんな状況でプログラミングの世界に無理して慣れる必要なんて無い。

プログラミングの世界のお作法

それに、プログラミングの世界には理解し難い、初見ではクリア不可能とも言える壁が存在する。 例えば数の世界の「ある数字の各桁の数の合計が3の倍数ならその数字は3の倍数である」というお作法(?)をプログラミングの世界の言葉で書くことを考える。

もう無理である。 数の世界でどうするか考え、それをプログラミングの世界の言葉にすることがまず難しい。各桁の数は一目瞭然だし、それぞれの数を足すのだって造作も無い。 しかしプログラミングの世界では、int型で数を覚えるのはわかっていても、

int num = 12345;

こっから「1」をどう取り出したらよいものか全くわからない。現実世界とのつながりが見えないのだ。だってプログラミングの世界だし。

#include<stdio.h>
int main(void){
  int num = 12345;
  int sum = 0;
  for( ; num != 0; num /= 10 )
    sum += num % 10;
  if( sum % 3 == 0 )
  printf("3で割り切れる");
  return 0;
}

と、書かれたら「ああそんなやり方があったのか」と納得し、これからはこの方法を使って3の倍数かどうか求められるだろう。

コンピュータは「あいまい」を許さない。理解できない。それはつまり、プログラミングの世界で生きるためには完璧を求められるということ。それもプログラミングの世界での生き辛さの原因である。「アレ」とか「そこの奥」とかで通じたものが、いきなり「~/Documents/myExcelDocuments/明細.xlsxのA3」だなんて、無理だ。

とかくにプログラミングの世は住みにくい。

今まで曖昧が許される世界にいただけあって、急にガチガチの間違えられない異世界に放り込まれると戸惑う。ただ、その世界が心地よい人もいる。人それぞれなのだ。プログラミングの世界に馴染むことのできない人は、数学の世界などのそれよりも多いだろう。プログラミングができないのは未経験だからではなく、その世界に住むことができないからだ。

何でお前急にそんなこと言い出したんキモイんだけど

僕もプログラミングの世界に住んではいる。いるが、その世界の中にもさらに世界がある。Cの世界だったり、Javaの世界だったり、その中でもandroidの世界がまたあったり……いま僕はiOSの世界に放り込まれて悪戦苦闘している。そんななかでふと思い浮かんだから書いてみただけである。プログラミングは難しい。今までのお作法が通じなかったりする。

とりあえず今作っているのが完成したら自分でまとめ直す。ので時間くれ。

2013年08月24日
2013年08月01日

GitHubにSSH鍵を追加してそれからどうするつもり?

SSH鍵とは

共通鍵暗号と公開鍵暗号の解説とSSHでの認証手順 SSHの公開鍵と秘密鍵の関係 こういうところを読めば何となく分かるように、つまりは通信を暗号化するための鍵である、と。

登録方法

必要な物は

まあ言わずもがな。

公開鍵の生成

端末で

$ ssh-keygen

と入力すると、保存場所とパスフレーズを聞かれるので、それぞれこのように(パスフレーズは好きに)

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): github_id_rsa
Created directory '/Users/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/github_id_rsa.
Your public key has been saved in /Users/username/.ssh/github_id_rsa.pub.
The key fingerprint is:
00:11:22:33:44:55:66:77:88:99:aa<img alt="🇧🇧" class="emoji" src="/images/emoji/unicode/1f1e7-1f1e7.png">cc:dd<img alt="🇪🇪" class="emoji" src="/images/emoji/unicode/1f1ea-1f1ea.png">ff username@username-mac.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+-----------------+

これでSSH鍵ができましたーやったー!

SSH鍵の設定

SSH鍵の名前をデフォルトから変更したので、".ssh/config"に以下のように記述する。

Host github.com
 User git
 Hostname github.com
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/github_id_rsa</pre>

あと、権限を変更しておく。

$ chmod 600 .ssh/github*

SSH鍵の登録

.ssh/github_id_rsa.pubの中身をまるごとコピーする。 GitHub Setting SSH KeysからAdd SSH Keyをクリックして ssh keyの追加その1 ペーストする ssh keyの追加その2

接続テスト

端末で、

$ ssh git@github.com

を実行した結果が以下のようになれば成功!

$ ssh git@github.com
The authenticity of host 'github.com (204.232.175.90)' can't be established.
RSA key fingerprint is 00:11:22:33:44:55:66:77:88:99:aa<img alt="🇧🇧" class="emoji" src="/images/emoji/unicode/1f1e7-1f1e7.png">cc:dd<img alt="🇪🇪" class="emoji" src="/images/emoji/unicode/1f1ea-1f1ea.png">ff.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,204.232.175.90' (RSA) to the list of known hosts.
Identity added: /Users/username/.ssh/github_id_rsa (/Users/username/.ssh/github_id_rsa)
PTY allocation request failed on channel 0
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

参考サイト

GithubにSSH公開鍵を設定 初心者Git日記その五~GitHubにSSH公開鍵登録~ Github に SSH 公開鍵を登録する GitHub Help Categories/SSH

追記

2013-12-26 リンク切れの削除と追加

2013年08月01日
2013年07月31日

XcodeとOpenCVで特徴点検出

ソースコード

#include <iostream>

#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#endif

/*****************************************************
 参考URL
 http://opencv.jp/opencv2-x-samples/surf_extraction
 *****************************************************/

int main(int argc, const char * argv[])
{
  /*****カメラからのビデオキャプチャを初期化する*****/
  //デフォルトカメラをオープン
  cv::VideoCapture cap(0);

  //カメラがオープンできない場合終了
  if( !cap.isOpened() )
    return -1;

  //キャプチャ画像を1280*720で取得
  cap.set( CV_CAP_PROP_FRAME_HEIGHT, 720 );
  cap.set( CV_CAP_PROP_FRAME_WIDTH, 1280 );


  /*****ウィンドウを作成する*****/
  char windowName[] = "SURF-TEST";
  cv::namedWindow( windowName, CV_WINDOW_AUTOSIZE );


  //何かキーが押下されるまで、ループをくり返す
  while( cvWaitKey( 1 ) == -1 )
  {
    cv::Mat gray , frame;
    cap >> frame;   //カメラからキャプチャ
    cv::cvtColor( frame , gray , CV_RGB2GRAY ); //キャプチャ画像を処理用にグレースケール変換

    /*****SURFクラスの初期化*****/
    cv::SURF calc_surf = cv::SURF(500,4,2,true);    //拡張ディスクリプタを用い128次元で取得

    /*****SURF特徴をグレースケール画像から抽出*****/
    std::vector<cv::KeyPoint> kp_vec;   //C++の可変長配列(cv::Keypoint型)のベクトル配列を宣言
    std::vector<float> desc_vec;    //C++の可変長配列(float型)のベクトル配列を宣言
    calc_surf( gray , cv::Mat(), kp_vec, desc_vec); //SURFディスクリプタ計算

    /*****抽出したSURF特徴の位置とスケールを描画*****/
    std::cout << "Image Keypoints: " << kp_vec.size() << std::endl; //標準出力に出力

#if 1
    //この辺りちょっとよくわからない
    //イテレータを使って???
    std::vector<cv::KeyPoint>::iterator it = kp_vec.begin(), it_end = kp_vec.end();
    for( ; it!=it_end; it++)
    {
      //円を描画
      cv::circle( frame ,                             /*描画先画像*/
                 cv::Point(it->pt.x, it->pt.y) ,      /*中心座標*/
                 cv::saturate_cast<int>(it->size*0.25) ,  /*半径*/
                 cvScalar(255,255,0)                      /*色*/
                 );
    }

#else
    for( int i = 0; i < kp_vec.size(); i++ )
    {
      KeyPoint* point = &(kp_vec[i]);
      Point center;  // Key Point's Center
      int radius;      // Radius of Key Point
      center.x = cvRound(point->pt.x);
      center.y = cvRound(point->pt.y);
      radius = cvRound(point->size*0.25);
      circle(colorImage, center, radius, Scalar(255,255,0), 1, 8, 0);
    }

#endif


    /*****適応的閾値処理による二値化*****/
    /*
     Mat adaptive_img;
    //adaptiveThreshold(gray_img, adaptive_img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 8);
    adaptiveThreshold(gray, adaptive_img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 6);
     */

    //変換画像をウィンドウに表示
    imshow( windowName, frame );

  }

  // ウィンドウを破棄する
  cvDestroyWindow( windowName );

  return 0;
}

実行結果

特徴点抽出結果

2013年07月31日
2013年07月03日

しゃべってコンシェルにげきおこ

アプリケーションのアップデートは、セキュリティ上の観念などから、バージョンが上がった時点で行うべきであるというのが僕の信条である。 さて、今朝docomoプリインストールアプリのアップデート通知がきたので、早速アップデートした。そして、ホーム画面に戻ると、何やら謎の何かが。 謎羊

さて、この「しゃべってコンシェル」は邪魔なので消そう……としたところでアプリを起動すると使用許諾契約に同意を求められる。 使用許諾契約

お か し く ね ?

使用許諾契約にはこのように書いてある。 しゃべってキャラ対応しゃべってコンシェルアプリ ソフトウェア使用許諾規約

第4条(契約の成立、効力及び終了) 1. お客様が、本ソフトウェアの画面上に表示される「同意」ボタンを押下した時点をもって、お客様は本規約に同意したものとみなされ、お客様と弊社との間に本規約に基づく契約(以下「本契約」といいます。)が成立し、効力を生じるものとします。

はて、「同意」ボタンを押した覚えなどないのに起動しているということは、インストールした時点で使用許諾契約に同意したことになるのだろうか?でも使用許諾契約読んでないぞ? そもそも利用をしたくないのに使用許諾契約に同意しなければ利用の停止ができないとはどういうことなのだ? 腹が立つ。docomoは何を考えているのだろう。理解ができない。

お客様視点でのサービス改善

お客様視点によるCS推進活動 さて、「お客様の満足度」を考えると、同意を得ていないサービスの提供というのははたして満足されるのだろうか?というか企業としてどうなのだ?

顧客にとっては、「繋がる」ことが当たり前であって(softbank除く)それによって満足度を得るのは難しい。しかし、繋がらないことや上記のことによって、満足度は簡単に低下する。満足度は上がりにくく下がりやすいから、努力が欠かせない。

なぜiPhoneが好まれるのか。キャリアによる不要なプリインストールアプリが無いからではないのか?その点で、本当に「お客様目線」で考えているとは考えがたい。

まあいちゃもんつけてるだけなんだけど、それでもこれには苛ついた。エンジニアは悪くない。体質が悪いのだ。

2013年07月03日
2013年06月23日

OpenCVで顔認識

もしやMacPortsからOpenCVを導入したのは間違いだったのではと感じた。

必要なもの

顔認識に必要なデータとは

OpenCVのインストールフォルダにdataフォルダがあって、その中のhaarcascadesフォルダに顔認識に必要なファイルがあるが、MacPortsからOpenCVをインストールするとそんなのはない。 Githubで落としてくるとかして手に入れなければならない。Itseez/opencv・GitHub

イケメンとは

顔認識するときカメラ起動するとキモい顔が映って死ぬ。

ソースコード

#include <iostream>
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif

int main(int argc, char *argv[])
{
  cv::Mat img , gray;
  // カメラからのビデオキャプチャを初期化する
  cv::VideoCapture cap(0);

  //キャプチャ画像をRGBで取得
  cap.set( CV_CAP_PROP_FRAME_HEIGHT, 720 );
  cap.set( CV_CAP_PROP_FRAME_WIDTH, 1280 );

  //カメラがオープンできない場合終了
  if( !cap.isOpened() )
  {
    return -1;
  }

  // ウィンドウを作成する
  char windowName[] = "camera";
  cv::namedWindow( windowName, CV_WINDOW_AUTOSIZE );

  // 分類器の読み込み(2種類あるから好きな方を)
  std::string cascadeName = "/Users/yusuke/Desktop/data/haarcascades/haarcascade_frontalface_alt.xml";
  //std::string cascadeName = "/Users/yusuke/Desktop/data/lbpcascades/lbpcascade_frontalface.xml";
  cv::CascadeClassifier cascade;
  if(!cascade.load(cascadeName))
  return -1;

  //画像を使う場合はこれ
  /*const char *imagename = "example.jpg";
  img = cv::imread(imagename, 1);
  if(img.empty()) return -1;
  */

  //scaleの値を用いて元画像を縮小、符号なし8ビット整数型,1チャンネル(モノクロ)の画像を格納する配列を作成
  double scale = 4.0;


  // 何かキーが押下されるまで、ループをくり返す
  while( cvWaitKey( 1 ) == -1 )
  {
    cap >> img;

    // グレースケール画像に変換
    cv::cvtColor(img, gray, CV_BGR2GRAY);
    cv::Mat smallImg(cv::saturate_cast<int>(img.rows/scale), cv::saturate_cast<int>(img.cols/scale), CV_8UC1);
    // 処理時間短縮のために画像を縮小
    cv::resize(gray, smallImg, smallImg.size(), 0, 0, cv::INTER_LINEAR);
    cv::equalizeHist( smallImg, smallImg);

    std::vector<cv::Rect> faces;
    /// マルチスケール(顔)探索xo
    // 画像,出力矩形,縮小スケール,最低矩形数,(フラグ),最小矩形
    cascade.detectMultiScale(smallImg, faces, 1.1, 2, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
    //cascade.detectMultiScale(smallImg, faces);

    // 結果の描画
    std::vector<cv::Rect>::const_iterator r = faces.begin();
    for(; r != faces.end(); ++r)
    {
      cv::Point center;
      int radius;
      center.x = cv::saturate_cast<int>((r->x + r->width*0.5)*scale);
      center.y = cv::saturate_cast<int>((r->y + r->height*0.5)*scale);
      radius = cv::saturate_cast<int>((r->width + r->height)*0.25*scale);
      cv::circle( img, center, radius, cv::Scalar(80,80,255), 3, 8, 0 );
    }

    //cv::namedWindow("result", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow( windowName, img );
    //cv::waitKey(0);
  }
}

リンクさせるライブラリは libopencv_core.2.4.5.dylib libopencv_highgui.2.4.5.dylib libopencv_imgproc.2.4.5.dylib libopencv_objdetect.2.4.5.dylib libstdc++.dylib

Build Setting→Apple LLVM compiler 4.2 - Language から、C++ Standard Library を ibstdc++(GNU C++ standard library) に設定する。 リンクさせるライブラリ

実行結果

顔認識結果

参考

顔を検出する

2013年06月23日
2013年06月13日

htc j butterflyの充電スタンドを作った

htc j butterflyという端末は防滴で充電端子があるのにスタンドが売り切れだから作るしかなかった

用意するもの

充電スタンド準備物

作り方

ケーブルを切ってピンヘッダを切って抜いてハンダ付けして終わり。 手順1 手順2 手順3

でもこれだけだと手で押さえるかテープで貼ったりしないと充電できないので…… こんなのをLEGOで作った LEGOで作った充電スタンド こんな感じに端子が接触して充電される 充電のようす

2013年06月13日
2013年05月27日

XcodeのOpenCVでカメラを使ってみる

コード

//
//  main.cpp
//  OpenCV-Cameratest
//
//  Created by unasuke on 2013/05/27.
//  Copyright (c) 2013年 unasuke. All rights reserved.
//

#include <iostream>

#ifdef __cplusplus
#include <opencv2/opencv.hpp>
//#include <opencv2/highgui/highgui.hpp>
#endif

int main(int argc, const char * argv[])
{
  // insert code here...
  // カメラからのビデオキャプチャを初期化する
  //macではカメラの順序が最初なのでcvCreateCameraCaptureに渡す引数は0
  CvCapture *videoCapture = cvCreateCameraCapture( 0 );
  if( videoCapture == NULL )
  {
    return -1;
  }

  // ウィンドウを作成する
  char windowName[] = "camera";
  cvNamedWindow( windowName, CV_WINDOW_AUTOSIZE );


  // 何かキーが押下されるまで、ループをくり返す
  while( cvWaitKey( 1 ) == -1 )
  {
    // カメラから1フレーム取得する
    IplImage *image = cvQueryFrame( videoCapture );

    // ウィンドウに画像を表示する
    cvShowImage( windowName, image );
  }


  // ビデオキャプチャを解放する
  cvReleaseCapture( &videoCapture );

  // ウィンドウを破棄する
  cvDestroyWindow( windowName );

  return 0;
}

諸注意

リンクさせる.dylibは libc++.dylib libopencv_core.2.4.5.dylib libopencv_highgui.dylib の3つ(画像加工をしないので) MacのiSight?内蔵カメラは最初に接続されてるのでcvCreateCameraCaptureに渡す引数は0。 C++の設定だけどC++要素全くない。 カメラに写った

2013年05月27日
2013年05月26日

XcodeでOpenCV始めると大変

OpenCVのインストール

前回記事でMacPortsを使ってGitをインストールした。その流れにのり、MacPortsでOpenCVをインストールする。

$ sudo port selfupdate
$ sudo port install opencv

長い時間掛かるかもしれないのでこれからの苦難を想像して身構えておくのが吉。

Xcodeの準備

まずはプロジェクトの作成から始める。 プロジェクトの作成 Create a new Xcode project"を選択し…… プロジェクトの選択 OS X"の"Application"の"Command Line Tool"を選択し…… プロジェクトの作成2 各項目を記入し…… こんな画面になるかと思うので、囲ったところをクリックして下準備。 プロジェクトを作成

下準備

まずはHeader Search PathとLiberty Search Pathを設定する。それぞれ MacPortsからインストールした場合は、Header Search Pathが /opt/local/include Liberty Search Pathが /opt/local/include /opt/local/lib と、それぞれnon-recursiveで設定する。recursiveにすると大量のエラーが出る。Liberty Search Pathは設定してない例もいくつか見つけたので不要かもしれない。 Search Pathの設定 Seach Path設定完了

次にLink Binary With Librariesを設定する。今回はウィンドウの表示、ガウシアンフィルタを利用するので、以下の4つのLibraryをリンクさせる。 libc++.dylib libopencv_core.2.4.5.dylib libopencv_highgui.dylib libopencv_imgproc.dylib

OpenCVの.dylibは(MacPortsからのインストールなら)/opt/local/libにあるので検索すると見つけやすい。追加は"Add Other"から行う。 libc++.dylibのリンク libopencv_hoge.dylibのリンク これで下準備は終わり。

テストプログラムを打ち込む

今回はある画像をガウシアンフィルタを適用しぼかす。

//
//  main.cpp
//  OpenCV-test
//
//  Created by unasuke on 2013/05/26.
//  Copyright (c) 2013年 unasuke. All rights reserved.
//

#include <iostream>

#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif

int main(int argc, const char * argv[])
{
  // insert code here...

  //画像を開く
  IplImage* before_img = cvLoadImage("/Users/yusuke/Desktop/lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
  if( before_img == NULL )
  {
    return 0;
  }

  //ウィンドウの作成
  cvNamedWindow("test-before", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("test-after" , CV_WINDOW_AUTOSIZE);

  //画像変換のためIplImage型で宣言
  IplImage* after_img = cvCreateImage(cvGetSize(before_img), before_img->depth, before_img->nChannels);

  //ガウシアンフィルタを使って画像をぼかす
  cvSmooth(before_img, after_img, CV_GAUSSIAN , 9);

  //画像をウィンドウに表示
  cvShowImage("test-before", before_img);
  cvShowImage("test-after", after_img);

  //キーの入力待ち
  cvWaitKey();

  //すべてのウィンドウを削除
  cvDestroyAllWindows();

  //画像データの開放
  cvReleaseImage(&before_img);
  cvReleaseImage(&after_img);

  return 0;
}

で、実行するとこうなる。 サンプルコードの実行結果 疲れた。

2013年05月26日
2013年05月23日

Macで始めるGUIを使わないやさしくないGit

GUIを使わないのはついマウスに手が伸びる癖を何とかしたいから。

MacPortsのインストール

Gitをインストールするために、まずはMacportsをインストールする。MacPortsのインストールにはXcodeが必要なのでそれはMacAppStoreからダウンロードとインストール。 The MacPorts Project

Gitのインストール

Gitのインストールの前に、まずはMacPortsを最新の状態にする。

$ sudo port selfupdate

何か言われたらそれもやっておく。

$ sudo port upgrade outdated</pre>

Gitをインストールするために以下のコマンドを実行。

$ sudo port install git-core</pre>

Gitを使ってみる

まずは適当なフォルダに適当なコードを保存する。今回は試しにということで授業で出された課題である電話帳のプログラムでGitを使ってみた。 finderで見るとこんな感じ ホームフォルダの下に WorkSpase/database/database.cと配置した。この場所はどこでもいいと思う。 そして。このフォルダに移動する。

$ cd WorkSpase/database

そしたらこのフォルダをGitで管理するために以下のコマンドを実行。

$ git init

でもこのままではまだ何も管理してくれないのでプログラムを登録する。

$ git add database.c

これファイル名のところを".“にするとそのフォルダに有るすべてのファイルを登録できるとか。便利。 じゃあ今どんな状態か見てみよう、と。

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#  modified:   database.c
#
no changes added to commit (use "git add" and/or "git commit -a")

人によるかもしれないけどだいたいこんな感じの表示が出てくる。じゃあ、変更を登録しよう。

$ git commit -m "first commit."

"first commit"のところは変更点(どんな関数を追加したとか)を英語で書くといいかも。書かなくてもいいかも。ただ書いたほうが絶対にいい、かも。 で、状態をみてみると……

$ git status
# On branch master
nothing to commit, working directory clean

はい、記録されたようですね。じゃあ今までの履歴を見てみよう。

$ git log
commit 5b54c1047d3cbf5f3b828f8361c2cc49f83649e2
Author: unasuke
Date:   Fri May 24 00:45:39 2013 +0900

    add comment.

commit 6f517649010f2fe6177655951e1bcd21aa6d8347
Author: unasuke
Date:   Thu May 23 01:40:49 2013 +0900

    first commit.

僕は2回程度commitしたのでこんな感じになってるけどだいたいそんなような表示になったはず。 やったぜ!Git入門だ!

……で?これだけで何が嬉しいの?状態なのではやめにGitHubとあれこれさせたいところ。専門用語はあえて使わなかった。理解してからまたまとめ直すかもしれない。

2013年05月23日
2013年05月21日

GitHubアカウントを取得した。

後々Twitter Bootstrapを使ってデザインを変更するつもりだったので、どうせならとGitHubアカウントをとってみた。

Gitの使い方は全くわかっていないので、今はBootstrapとTwitter4Cをwatchしている。

2013年05月21日
新しい投稿
古い投稿