夏☆しちゃってるZE! BOY

夏しちゃってないBOYが気が向いた時に書く日記

10進数に生きてるなぁ〜と思ったこと

今回の内容すごいわかりづらい。。。

しかも単なる日記

=========以下本文======================

 

今日友達Iがtwitterでふとつぶやいていたこと

 

I「n進数の世界で数nが出現するのって10進数だけだね」

 

いやいやおかしいやろ、そんな不思議なことがあってたまるもんですかい

 

私「11進数でも11でてくるし、16進数でも16でてくるのでは?」

 

反応

 

I「意味は変わってしまうが表現としては確かに出てくるな」

 

これをみて、8進数で8がでてこないとかそういう意味かぁ〜と納得した。

(↑この文がわかりづらい)。

ってか、たしかになんで8進数で8出てこないんだろと思ったら、

そもそも8進数には8が存在しないことに気づく。

8進数は7のつぎはイチゼロ(10)である。

8って言ってる時点で10進数が基準の言い方になってる。

「n進数の世界で数nが出現するのって10進数だけだね」をもじると

「8進数の世界で数8が出現する(途中略)」になる。

これは8って書いてる時点で10進数を基準に話してる(正式には9進数以上を基準)。

ということに気づく。

8進数で考えないといけないとおもい、8を全部イチゼロ(10)に置換する。

 

「イチゼロ(10)進数の世界で数イチゼロ(10)が出現するのってイチゼロ(10)だけだね」になるから、イチゼロでてくる。

 

うん、正しい。イチゼロ進数(今回は8進数)の中でイチゼロ出てくるのはイチゼロ進数だけである。

つまり何進数でも、n進数の世界で数nは存在するはず。

 

これを思いつくのにイチゼロ(10)分もかかったため、普段いかに10(じゅう)進数で生活してるかを思い知った。

 

==========================================================

P.S.

普段16進数で生活してたら、そもそも最初の問題提起が

「n進数の世界で数nが出現するのって10進数だけだね」

ってのがおかしくなる。16進数で生活してる場合の10進数の表現はA進数だから

「A進数の世界で数Aは出現しない」。

10進数でくらしてるからこそ、

「10進数では数10が出現する」になるんやね。

mikutterをmac(mountain lion)に入れても起動しないヨォ〜ってときあるよね

このページは

mikutterをmountain LIONに入れても起動しないヨォ〜〜〜〜動くバージョンを教えてって時に読んだらいいかもな記事です。

===========================================

mikutterをmountain LIONに導入する方法は以前書いた

http://k0u.hatenablog.com/entry/2012/10/28/143117

を参考にしてください。

※ただしruby1.9.3を全部ruby2.0.0に読み替えたほうがいいかも

===========================================

 

ここで導入したmikutter on mountain LIONは結構な頻度で起動できなくなります。

具体的に言うと、brew update && brew upgradeして動かなくなることがよくあります。

最近はcairoがアップデートされて動かなくなってました。

(2013/05/23には治ってた)

なので動くバージョンをメモしときました。

気が向いたらページ更新するかも

 

当方の環境で動くだけで他人が動くは知らないです。

あまり古いmikutterはtwitterの最新のAPIに対応してないから注意

 

mikutter本体関係

mikutter.rb 0.2.1.1143

 

rvm関係

ruby-2.0.0-p0 [ x86_64 ]

 

brew関係

2.24.18  git checkout 4ef0b94  gtk+.rb

2.8.0    git checkout 7477883  atk.rb

1.12.14  git checkout 6ff6eea  cairo.rb

2.10.93  git checkout 8848b60  fontconfig.rb

2.4.11   git checkout 0e450f2  freetype.rb

2.28.1   git checkout 77f31cc  gdk-pixbuf.rb

0.18.2   git checkout d1ffdb8  gettext.rb

2.36.2   git checkout 083bd4e  glib.rb

0.9.17   git checkout 0d4321e  harfbuzz.rb

51.1     git checkout 303ce8f  icu4c.rb

8d       git checkout c649d73  jpeg.rb

3.0.13   git checkout d2e023f  libffi.rb

1.5.14   git checkout 3655123  libpng.rb

4.0.3    git checkout 6933d38  libtiff.rb

1.34.1   git checkout 18723f4  pango.rb

0.30.0   git checkout a715add  pixman.rb

0.28     git checkout 615f696  pkg-config.rb

1.3.0    git checkout 776dbe4  libksba.rb

5.0.4    git checkout caae81d  xz.rb

 

gem関係

atk (1.2.6)

bigdecimal (1.2.0)

bundler (1.3.5)

cairo (1.12.4)

gdk_pixbuf2 (1.2.6)

glib2 (1.2.6)

gtk2 (1.2.6)

io-console (0.4.2)

json (1.7.7)

minitest (4.3.2)

pango (1.2.6)

pkg-config (1.1.4)

psych (2.0.0)

rake (10.0.4, 0.9.6)

rdoc (4.0.0)

ruby-hmac (0.4.0)

rubygems-bundler (1.1.1)

rvm (1.11.3.7)

test-unit (2.0.0.0)

 

 

brew関係はそこまで気にしなくてもgtk+.rb、atk.rb、cairo.rb、pango.rbあたりが良いバージョンなら動くんじゃないかな?

SSHしてる時の中断方法一覧

サーバにSSHでつないで作業してる時に,

あ,Write failed: Broken pipe(´・ω・`)

SSH切れた                        (´・ω:;.:...

データなくなった                     (´,';,';,',

さよなら                                    ';,,('

ってならないようにするための幾つかの方法を紹介します

 

最初に今回紹介する3種類の方法を簡単に書きます

①:tmuxやscreenを使ってデタッチ

 (emacsとか人の入力が必要な作業にgood)

②:nohupを使う

 (コンパイルとかプログラムの実行時間計測とかシェルスクリプトとか

  ファイルダウンロートとか人の入力のない作業専用)

③ :disownを使う

  (②をするの忘れてプログラムを動かした時や,
            思ったよりプログラムの実行に時間かかった時,
   急遽席を外さないといけなくなった時など,
   後から②を使う必要が出てきた時用)

 

では順番に見ていきます

①:tmuxやscreenを使ってデタッチ

tmuxはscreenの後に出てきたソフトです.やれることは非常によく似ていて

tmuxのほうが便利なのでtmuxで解説します.

 

: tmuxの導入

パッケージ管理ソフトやらビルドしてコンパイルするなりして入れてください.

 

tmuxの使い方は基本的に

sshでサーバに接続し,tmuxを起動→2.サーバでしたい作業をする→3.tmuxを切ってサーバとの接続を切る(勝手にサーバとの接続が切れても問題ない)」

となります.以下にもう少し詳しく書きます.

 

1 : sshでサーバに接続後にtmuxの起動

$ tmux

と打つことでtmuxを起動します.起動するとターミナルの下部に緑のラインが表示されますが,そこ以外は普通のログインシェルが表示されます.

 

2 : 本来自分がサーバでしたい作業を行う

$ 自分の使いたいコマンド

をtmuxが起動されている状態(ターミナルの下部に緑のラインが表示されている状態)で行います.基本的にはこのまま作業していただいて問題無いです.

 

3 : サーバーとの接続を切れた/切るとき(切れたときは3.1,切るときは3.2)

3.1 : ネットワーク障害でサーバとの接続がいきなり切れた場合→4章へ

3.2 : 手動で接続を切るときは,Ctrlとbを同時押し後,
(プロセスが動いてても,文章を編集中でもいつでも好きなときに押せば良い

dを押すとtmuxの緑バーが画面から消えます.

(このときtmuxおよびプロセスはバックグラウンドで動き続けています)

(キーは初期設定です)

あとは普通に

$ exit

等でサーバとの接続を切りましょう→4章へ

 

4 : サーバとの接続を復帰させる時/サーバで続きから作業するとき

サーバにsshでログイン後

$ tmux a

と書くことで緑バーが表示され3章の前の状態に戻ります やったね!!

 

5 : 以降は基本2,3,4章の繰り返しです.tmuxを切りたい時は,tmux起動中(緑のバー【略】)にexitと打つことでtmuxを終了できます.

 

おまけ:tmuxは画面(ペイン)の分割やタブ(ウィンドウ)のようなものなど,すげー多機能です.自分も主にそっちをメインに使っているので興味があったら他のサイトを参考にしてください.操作はemacsに似ています.tmux複数起動した時の対処法などもそちら参照

 

 

②nohupを使う

nohupを使うとsshの接続(hupの応答なし)が切れてもプログラム実行し続けてね

という命令を出せます.ただし,これだけだと,接続が切れた時に画面の出力がわからなくなる(とおもう)ので,画面の出力をlogファイルに出力させるようにします

 

1 : nohupを使う

$ nohup コマンド名 &

と入力します.nohupで接続切れても実行し続けてという意味があります.

&はバッググラウンドで実行してね.という意味です.

この2つにより,画面に出力されず,本来画面に出力されるはずの文字列は,プログラム実行時のカレントディレクトリにnohup.outとして出力されます.

 

2 : SSHの接続を切る(切れたときは2.1,切るときは2.2)

2.1 : ネットワーク障害でサーバとの接続がいきなり切れた場合→3章へ

2.2 : 1章では,バックグラウンドでコマンドを実行したため,1章で動かしたターミナルにまだコマンドを入力できます.exitで接続を切ってください→3章へ

 

3 : プログラムが終わったかを調べる

プログラムはsshが切れてもバックグラウンドで動き続けています.

プログラムが終了するまで待ちましょう.プログラムが終わったかどうかはsshで接続した後

$ jobs

で前のプロセスが残っているかでわかるはずです(未確認)

 

4 : 結果を見る

結果はnohup.outに書かれているので,これをemacs等でみてください.

 

おまけ : nohupは出力先を変えられます

$ nohup コマンド >出力先 &

でOK

エラーの出力も変える時は

$ nohup コマンド >出力先 >エラー出力先 &

でOK

 

 

③disownをつかう

②の方法は,プログラムの起動時にnohupと&を付ける必要がありました.このとき,nohup &をつけるのを忘れた時に③の方法を使います.これはzshとかbashでないと動かないかも

 

1 : プログラムを実行

$ プログラム

 

1 : プログラムを中断する

Ctrl とzを同時押し

 

2 : 対象jobの確認

$ jobs

で対象プログラムの番号を確認

一人で使っていて,複数ウィンドウたちあげてなければ

大体は1かな?

 

3 : バックグラウンドへ

$ disown %さっきのプログラム番号

例 & disown %1

 

 

このような方法でSSHが切れても(切っても)大丈夫です.

よきSSHライフを!!

';,,('               

(,';,';,    

(`,';,';,',          

(`・ω,';,';,', 

(`・ω・,';,';,',

(`・ω・´) 

 

なんか他にもいい方法あったら教えて下さい

iPhoneの母艦の変更(MAC)

iPhoneの母艦を変更したい時ってあるとおもいます.

 

しかし,通常母艦と異なるMAC(PC)に接続して同期すると,

iPhone中のアプリのデータ全て削除されます.

(ゲームのセーブデータや写真管理アプリだと写真データ全て消えます)

 

アプリデータや写真を消さずに母艦を変更する方法を以下で書きます.

(アプリデータだけでなく,音楽等全て持って行く方法はこちらを参照してください)

なぜ,アプリデータや写真だけ持っていくのかですが,音楽は,新しい母艦のHDDに置いておけば,再度iPhoneに転送できるため,必要ないためです.

(ボイスメモ,メモ帳などのデータも今回説明する方法で移行されます)

 

1. まず古いmacにiPhoneを同期する.

 

2. 新しいMACのiTunesを古いMACのiTunesと同じアカウントで認証させる

 

3. 古いMACの~/library/Application Support/MobileSync/BackUpを新しいMACの同様の位置にコピーする

 

4. 新しいMACにiPhoneアプリIPAを入れる(入れ方は2つ下に列挙する)

      入れ方1:古いmacの~/music/iTunes/iTunesMedia/Mobile Applicationを新しいmacに送り,新しいmacではitunesを開く.その後,Mobile Applicationの中のipaを全てをitunesにドラッグ・アンド・ドロップする.

 入れ方2:新しいmacにiPhoneをつなぐ,iTunesから購入した項目を”iPhone名”から転送を押す(このときにiPhoneと同期が始まっても問題無いはずです)

 

5. 新しいmacにiPhoneをつないで同期する

このとき,普通に同期は出来ますが,アプリは同期されません.

 

6. iTunesの同期設定からAppを同期を押す.このとき,「異なるmacが母艦です.一度に同期できるマシンは1台です.このmacと接続したら,セーブデータが消えます」みたいなことを言われるけど気にしない.

 

7. もう一回同期する

 

8. 全然アプリのセーブデータ消えてない!!!

 

9. ミッションコンプリート

 

という方法で自分は新しいMACにアプリデータ,メモ帳,写真データ,ボイスメモ等を移行できました.ただし,確かこうやったなぁという暗記に基づいて記事にしており,

責任は持たないので自己責任でお願いします.

Twitterクライアントの紹介(macでのmikutterの導入方法)

Twitterクライアントの一つにmikutterというのがあります.

 

Twitterクライアントなのに.コンソールからプログラミングできるという謎の

クライアントです.(windowsならsolarってクライアントでもできますね)

他の利点はねぎふらいさんのページあたりを参考にしてください

 

そしてこのクライアントなのですが,linuxには簡単に入れれるし,当環境では,windowsXPなら最新版,windows7にも0.0.3.4までのversion(cairo版でないやつ)は簡単に入れられました.

 

しかし,macでは,Snow LeopardMBA,MBP),Lion(MBA,MBP),Mountain Lion(MBA)のどの環境でもうまくインストールできず,当方,1年半ほど,血の涙を流しておりました.これはmacのcairoがバグっている,GTK依存?などいろいろな原因が言われておりました

 ※MBA:MacBookAir MBP:MacBookPro

 

ところが,先週(2012年10月中旬),クリーンインストールしたMBPにMountain Lionに最新のmikutter0.2がインストールできたのでその方法を説明します.(ただし設定ボタン押したら落ちる・・・)

brewのATKやらcairoやら更新されたからそのおかげかな?

つまりmikutter入れるなら今がチャンス!!(かも知れない)

 

rvmとbrewを入れている前提で話を進めます.

基本的にKatsyoshiさんの方法と全く同じです.(Katsyoshiさん問題ありましたら連絡ください)

 

 

====================mikutterの導入方法======================

基本的には「数字. $行うコマンド」で説明していきます

 

1.   $rvm install 1.9.3

Ruby1.9.3をるび〜ばぅぁ〜じょんまねーじゅぁ〜から入れます.

このとき色々warningされるかもしれません.

自分はbrew使ってるなら,「$brew install libksba」を先にしろって怒られたので,そのコマンドを打ちました.

 

2.  $rvm use 1.9.3 --default

RubyVersionManagerから標準で使うRubyを変更します.

 

3. $brew install gtk+

最近brewのatkやら,cairo,gtkのformulaが更新された,そのおかげでmikutter動くようになったのかな?とりあえずちゃんとformulaを最新にしてからgtk+をインストールしてください.

 

4. $gem install gtk2

当たりが出たのでもう一回gtkのインストール

 

5. $gem install ruby-hmac

うっひょおぉおおお

 

6. $svn checkout svn://toshia.dip.jp/mikutter/trunk mikutter

ついにmikutterのダウンロード

 

7. $cd mikutter 

ちぇ〜〜んじ でぃれくとりぃ

 

8. $ruby mikutter.rb

実行

 

これでとりあえずmountain Lionで動きました.他の人が動くかはわかりません.

クリーンインストールした直後のmacなら動くのでは?

 

===========古いmikutterを使う方へ=======================

昔macでmikutter使うと文字化けしたことがあったのですが,これは~/.gtkrx-2.0に

「gtk-font-name = "好きなフォント名 フォントサイズ"」

と記入することで直ります.

(mikutter0.2以降は~/.gtkrx-2.0は入らないと思う)

 =========================================================

 

日本語環境設定とかも気分が向けば書くかも

 

 

Let's ておくれtwitter Life!!

 

 

 

P.S.  最近,2つの大学でmikutterシール貼ってる人見たんだけど...すげえ・・・

っていうかなんでmikutterシール貼ってる人macばっかなの・・?

FizzBuzzっぽい何かから入る高速アルゴリズム?

このページは私が作ったいくつかのFizzBuzzっぽいプログラムの実行時間を比較するページです。

結果としてはやっぱif文(goto)や割り算が少ないほうがいいです。

 

1章 What is FizzBuzz

http://ja.wikipedia.org/wiki/Fizz_Buzz

俺的には牛タンゲームの亜種(牛タンゲームが亜種?)

世界のなべあつも亜種らしい。

 

2章 What is important for FizzBuzz?

この前、FizzBuzzプログラムで大切なものとは何でしょう?と友達話してました。

もちろん答えは実行時間の短さ、なぜなら速度もまた特別な存在だからです。。

 

3章 comparison

プログラム方法によって実行時間がどう変わるのか比較してみました。(C言語)

一つ目のプログラムはすごい単純なやつ

二つ目は一つ目の改良

三つ目はバカ実装

 

1つ目のプログラム

ループごとにif文(goto文)3回、割り算4回ある。

#include <stdio.h>

 

int main(){

  int i;

  for(i = 1; i<1500000000; i++){

    if(i%3==0){

      printf("fizz");

    }

    if(i%5==0){

      printf("buzz");

    }

    if(i%3 != 0 && i%5 != 0){

      printf("%d",i);

    }

    printf("\n");

  }

  return0;

}

 

2つ目のプログラム

1つ目と比較したメリット:

ループごとのif文は3回のままだが、割り算が2回に減る(比較処理も1回減っている)。

 

 

#include <stdio.h>

 

int main(){

  int i;

  int Print_num=0;

  for(i = 1; i<1500000000; i++){

    if(i%3==0){

      printf("fizz");

      Print_num=1;

    }

    if(i%5==0){

      printf("buzz");

      Print_num=1;

    }

    if(Print_num==0){

      printf("%d",i);

    }

    printf("\n");

    Print_num=0;

  }

  return0;

}

 

 

3つ目のプログラム

2つ目と比較したメリット:

if文がなくなった(gotoが減った?)

割り算もしない

ループ回数も減る(メリット?)

2つ目と比較したデメリット:

空間的局所性とか減る(かわらんかな?)

15の倍数になるまでプログラムは動き続けるwww(馬鹿な実装)

 

このプログラムはもはやFizzBuzzなんだろうか?

#include <stdio.h>

 

int main(){

  int i;

  for(i = 1; i<1500000000; ){

    printf("%d",i);//1

    printf("\n");

    i++;

    printf("%d",i);//2

    printf("\n");

    i++;

    printf("fizz");//3

    printf("\n");

    i++;

    printf("%d",i);//4

    printf("\n");

    i++;

    printf("buzz");//5

    printf("\n");

    i++;

    printf("fizz");//6

    printf("\n");

    i++;

    printf("%d",i);//7

    printf("\n");

    i++;

    printf("%d",i);//8

    printf("\n");

    i++;

    printf("fizz");//9

    printf("\n");

    i++;

    printf("buzz");//10

    printf("\n");

    i++;

    printf("%d",i);//11

    printf("\n");

    i++;

    printf("fizz");//12

    printf("\n");

    i++;

    printf("%d",i);//13

    printf("\n");

    i++;

    printf("%d",i);//14

    printf("\n");

    i++;

    printf("fizzbuzz");//15

    printf("\n");

    i++;

  }

  return0;

}

 まとめてiをi=i+15で増やしたり、printf2つをまとめてprintf("fizzbuzz\n")

にしないのは、極力他のプログラムと同条件にして、if文とわり算だけを減らすためです。 

 

4章 比較条件

OS:Unix,CPU:Sandy-eのi7 Memory:多い(ようは調べんのめんどいw)

実行結果は10試行の平均をとっています。

printfでボトルネックになるのが嫌なため、上記からprintfをコメントアウトし、実行時間を測る関数追加したもの。

つまり1つ目のプログラムはこうなる。

 

 

#include <stdio.h>

#include <sys/time.h>//unixで時間測る

 

inlinedouble get_dtime(void){//unix専用の命令

  struct timeval tv;

  gettimeofday(&tv, NULL);

  return *1;

}

 

int main(){

  double time1=get_dtime();

  int i;

  for(i = 1; i<1500000000; i++){

    if(i%3==0){

      //printf("fizz");

    }

    if(i%5==0){

      //printf("buzz");

    }

    if(i%3 != 0 && i%5 != 0){

      //printf("%d",i);

    }

    //printf("\n");

  }

  double time2=get_dtime();

  printf("%f usecond", time2 - time1);

  printf("\n");

  return0;

}

 

 

 

 

 

 

 

ついでに3つ目はもはやfizzbuzzでもなんでもない。。たんなるi++するだけになる・・

こんなのってひどすぎる・・・

#include <stdio.h>

#include <sys/time.h>//unixで時間測る

 

inlinedouble get_dtime(void){//unix専用の命令

//上と同じなため省略

}

 

int main(){

  double time1=get_dtime();

  int i;

  for(i = 1; i<1500000000; ){

    //printf("%d",i);//1

    //printf("\n");

    i++;

    //printf("%d",i);//2

    //printf("\n");

    i++;

    //printf("fizz");//3

    //printf("\n");

    i++;

    //printf("%d",i);//4

    //printf("\n");

    i++;

//以降省略wwwww

 

 

5章 consequence

単位はμ秒(だったかな?)

1つ目のプログラム:8052521.60

2つ目のプログラム:5429244.10

3つ目のプログラム:2444246.80

やっぱ割り算やif文ない方がダントツ早いです。
GPUでやるほうがこの結果は顕著なはずなので、次回GPUでやるかも__global__つけるだけだしね!
 
P.S.
いま気づいたけど3つ目のプログラムだけ1回多く処理してますね(1,2つめのプログラムはi==150000000のとき動いてないけど、3つ目だけ動いてる)1つ目と2つ目にプログラムを

for 文をfor(i = 1; i<=1500000000; i++)にすべきでした

 

あと、最適化オプションつけないでコンパイルしてるけど、最適化されてたりしないんだろうか。。

 

(追記)

そういえば,コンパイラオプションで,アセンブリ言語でコンパイル止めれましたよね.それでどの程度最適化されてるかわかるか・・ 

 

 

*1:double)(tv.tv_sec)*1000*1000 + (double)(tv.tv_usec

GentooをVMwareに入れてみた。

公式日本語サイト(http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml)のとおりにやってうまく動かなかったのでいろいろ挑戦した。

その試行錯誤した結果について書く。

困った点

・現在(2012/4/21)現在の時点で、gentoo/linuxのカーネルは3.2.12だったのに、使用中のVMwareで選択できる最新のカーネルはその他のLinux2.6だった。

VMwareはSATA等ではなく、古いSCSIを仮想で用いている(そのせいか公式の手順で行うとkernel panicになって起動できない)

x64がほしいのに、公式はi686(少しだけ変更するだけ)

処理手順(すごく大雑把)

1. VMwareの新しい仮想マシンを作るときは、処理手順 Linux2.6を選択する。

2. 大まかは公式日本語サイトどおりに導入 ただしi686と書いてあるのはすべてx64に読み変える

3. 5.2節のmatch=i686はmatch=core2に変更(使っているパソコンはcore i7 2600kでcore 2系列ではない気がするがhttp://blog.chira-ura.info/2011/01/17/543がそれで動いているためまねさせて頂きました)

4.http://hitskey.biz/archives/1538より7.c節の手順ではだめなので7.d節を使用

6. 8.c 節 では

# nano -w /etc/conf.d/hwclock

 CLOCK="local"

7. 7.d節

emerge genkernel

genkernel all(たぶんここいらない)

emerge open-vm-tools

genkarnel --menuconfig all

なんか青くカーネル設定画面出たところでhttp://blog.chira-ura.info/2011/01/17/556のようにVMXNET3 PVSCSI二チェック

8. 公式のrebootまで続ける

9. http://blog.chira-ura.info/2011/01/17/556のようにxmlを編集

10. 完了

 

ぶっちゃけこれでどっか不都合があるのかとうはしらない。メモ程度に書いてるから、需要あればもう少し詳しく書くかも