カテゴリー別アーカイブ: プログラミング

sl

Pocket C.H.I.P. が届いた

Pocket C.H.I.P.が届きました。2016年5月に申し込みをしているので、実に半年かかったことになります。(当時はまだ49$でした)

プチプチに包まれたPocket C.H.I.P.

こんな感じのプチプチに包まれて香港からやってきました。

C.H.I.P.とPocket C.H.I.P.

Pocket C.H.I.P.にあわせて、C.H.I.P.とHDMI DIPを購入。こちらもおいおい触って行きたいです。 続きを読む

タブ文字はもう使うべきではない (Python + vim編)

Ubuntu 12.04 LTSからUbuntu 14.04 LTSにアップグレードしたところ、vimの設定ファイルが変わったのか、自分の.vimrcの設定に関わらず、tabstopが8で表示されるようになってしまいました。

tab8

続きを読む

LMS法について

近年、年齢ごとの標準値などを考える際に、LMS法という統計手法が用いられることが多くなっています。

従来の正規分布の考えと、その考え方からなぜLMS法が生まれてきたかを解説します。

続きを読む

gitのお気に入りコマンドなど

お気に入りのgitの設定およびコマンドです。

git status -sb

[alias]
st = status -sb

と登録しておくのがお勧めです。git status –short –branchの省略形です。

通常の場合、

$ git status

を実行すると、

gitstatus

と、本来必要である情報以上にたくさんのメッセージが表示されます。もちろん、なれないうちは大変助かるメッセージではありますが、慣れてくると冗長すぎてむしろ見通しの悪さを感じてきます。

$ git status -sb

では、

gitstatussb

と、本来必要な情報を簡潔に表示してくれます。

git 1.8.4以上をお使いならばGitの更新ログにあるようにstatus.shortとstatus.branchというconfigがありますのでそちらを利用するのもお勧めです。

pager = less -r

(参考: どせいけいさんきより)

git diffなどの結果は、core.pagerで設定したコマンドに送られます。現在の設定が不明な場合は

$ git config --get core.pager

で調べることができます。おそらく、設定していない場合はlessが標準のページャとして使用されていると思います。

標準のlessは長い行を折り返してくれないので、

gitless

こんなかんじで、長い文は右側にはみ出してしまって見通しが悪いです。

.gitconfigに

[core]
pager = less -r

と設定することで、

gitlessr

長い行は自動的に折り返してくれるので見通しが良くなります。

git diff –word-diff

長い行も一度に表示できるようになって少し見通しが良くなったとはいえ、上記のdiffでは結局どこが変わったのか調べるのはかなり大変です。

$ git diff --word-diff

を使うと

gitworddiff

変更になった部分だけをハイライトして表示してくれます。知っていると便利なコマンドです。

git commit -v

コミットログの記載画面にコミット内容を表示することができます。

gitcommitv

こんな感じでコミットログ記載部分の下部に今回のコミットではどの部分が変更されたかが表示されます。

git log –graph

僕のおすすめは

$ git log --graph --date=short --pretty=format:'%Cgreen%h %cd %Cblue%cn %Creset%s'

です。

gitloggraph

こんなかんじで履歴をコンソール上でグラフィカルに表示してくれます。いろいろ設定オプションがありますが僕は上記を使っています。

もちろん、vim上でgregsexton/gitvを使うという手もあります。

Google Code Jam Round 1A – Problem A. Bullseye

Problem A. Bullseye

X個目(0 origin)の黒い円の半径 = (r+ 2X + 1)2 – (r+2X)2

a2-b2=(a+b)(a-b)なので上記 = (2r + 4X + 1)

n番目までの円を書くと、使うインクの総量はΣ(x=0 to n) 2r+4x+1

Σ(x=0 to n) x= n(n+1)/2、Σ(x=0 to n) 1=n+1。

ので、上記 = 2n2 + (2r+3)n+(2r+1)となる。

2n2 + (2r+3)n+(2r+1) > t →  2n2 + (2r+3)n+(2r+1) – t > 0

解の公式より上記nを求める

結局perlでやってみた。

use bignum;
my $case = <>;

for(my $i=0; $i<$case; $i++){
  my @line = split(/ /, <>);
  my $r = $line[0];
  my $t = $line[1];
  my $circles = 0;

  my $n = (sqrt((2*$r+3)**2 - 8 * (2*$r+1-$t))-2*$r-3)/4;
  $circles = int($n) + 1;   # 0 origin

  print("Case #" . ($i+1) . ": " . $circles . "\n");
}

vim QuickRunとsyntasticで clang++のC++11を使う方法

これでMac OS 10.8.3 Mountain Lion + Xcode 4.6.1でもC++11使い放題。

動かない場合はきちんとclang++がインストールされているか、まずはwhich clang++で確認を。

if executable("clang++")
  let g:syntastic_cpp_compiler = 'clang++'
  let g:syntastic_cpp_compiler_options = '--std=c++11 --stdlib=libc++'
  let g:quickrun_config = {}
  let g:quickrun_config['cpp/clang++11'] = {
      \ 'cmdopt': '--std=c++11 --stdlib=libc++',
      \ 'type': 'cpp/clang++'
    \ }
  let g:quickrun_config['cpp'] = {'type': 'cpp/clang++11'}
endif

 

Git:圧縮とリポジトリのサイズ

Git便利ですね。Gitではオブジェクト(ファイルなど)をzlibで圧縮して保持します。それだけではなく、差分を計算したり、複数のオブジェクトを packすることで、単純にすべての履歴を記録するよりも効率的にリポジトリを保持することができます。

% git --version
git version 1.7.9.2
% alias | grep dirsizeinbyte
dirsizeinbyte='find . -type f -print -exec wc -c {} \; | awk '\''{ sum += $1; }; END { print sum }'\'

duだとファイルサイズではなくてブロックサイズになるので上記コマンドを使います。Landscape – エンジニアのメモを参考にしました。

まずはgit initしただけの状態で。

% git init
Initialized empty Git repository in /Users/kcrt/repostest/.git/
% cd .git
% dirsizeinbyte
13917

13.6KiBです。ここからどうなっていくかを見て行きましょう。まずはテキストファイルから。

% cd ..
% perl -e 'for(1..1000000){print "This is a large text file\n";}' > textfile
% wc -c textfile
26000000 textfile
% git add textfile
% git commit -m "textfile"
[master (root-commit) f274f23] textfile
1 file changed, 1000000 insertions(+)
create mode 100644 textfile
% cd .git
% dirsizeinbyte
165888

Gitはファイルをテキストファイルとして認識してくれました。巨大なテキストファイル(24.8MiB)を追加したにもかかわらず、リポジトリのサイズは162KiBに収まっています。これは繰り返し文字列でありzlibによる圧縮が良好に効いていることによります。

ファイルの一部(10000行目のみ)改変してみましょう。

% cd .. 
% vi textfile
(10000行目のみ改変)
% cat textfile | grep test 
10000:This is a large test file
% git add textfile 
% git commit -m "text->test" 
[master a87fd52] text->test
 1 file changed, 1 insertion(+), 1 deletion(-)
% cd .git 
% dirsizeinbyte 
317734

Gitは一行のみの変化であることをきちんと認識してくれました。しかし、リポジトリのサイズは310KiBとなっています。先ほどのリポジトリのサイズが162KiBなのでほとんど倍です。圧縮されて効率的なのは確かですが、ちょっと期待していた動作と違います。1行だけの変更なので、もう少し小さなサイズになることを期待していました。

Gitは、コンテンツの変更の際も単純にリポジトリに新しいオブジェクトとして追加します。これは高速に動作しますが、ディスク容量の観点からは非効率です。差分を探して、不必要なオブジェクトを削除するにはgit gcコマンドを使います。

% git gc 
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
% cd .git 
% dirsizeinbyte 
79679

リポジトリのサイズは78KiBと十分に小さくなりました。一つ目のファイルを追加した際のサイズより小さくなっています。

git gcコマンドは上記のように手動で実行することもできますが、必要と考えられるときやリモートリポジトリへのpushを行う時には自動で実行されます。

それではバイナリファイルの実験に入りましょう。リポジトリを初期化して開始します。

% yes | \rm -R .git 
% git init 
Initialized empty Git repository in /Users/kcrt/repostest/.git/
% perl -e 'for(1..1000000){print "\x00\x01\x02\x03\x04\x05\x06\xfd\xfe\xff";}' > binfile 
% wc -c binfile 
 10000000 binfile
% git add binfile 
% git commit -m "binfile" 
[master (root-commit) 8580c04] binfile
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 binfile
% cd .git 
% dirsizeinbyte 
67942

Gitはファイルをバイナリ(binfile)として認識してくれました。binfileは9.5MiBと大きなファイルですが、繰り返しが多いのでzlibによる圧縮が効率的に行えそうです。リポジトリのファイルは66KiBと期待通り小さなものになりました。

一部を改変するとどうなるでしょうか。

% ..
% vi -b binfile
(:%! xxd 編集 :%! xxd -r)
% git add binfile                                                                   
% git commit -m "small change"                                                      
[master c05696a] small change
 1 file changed, 0 insertions(+), 0 deletions(-)
% cd .git                                                                           
% dirsizeinbyte                                                                     
121847
% git gc                                                                            
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
% dirsizeinbyte                                                                     
36149

binfileに16バイトのわずかな変更を加えました。git gcを行うとリポジトリのサイズは35KiBとなりました。バイナリファイルでも差分による圧縮とzlib圧縮を行なって効率的にリポジトリにファイルが格納されることがわかりました。

IS01で右サイドバーの無いアプリを作成する方法

発売して結構時間がたってるけど誰も書かないので書いちゃう。

IS01はよくあるAndroid端末と違い、特殊な解像度を持っています。一般のソフトウェアに配慮してか、右側にサイドバーが表示されてその全体を使うことは通常できませんでした。

今回のサンプルではそれを回避する方法を書いています。

package com.example.is01.fullscreen;
/*
 * IS01 FullScreen Window Sample
 *      IS01の邪魔なサイドバーを回避するサンプル
 *      Programmed by kcrt <kcrt _atmark_ kcrt.net>
 *          Nanoseconds Hunter "http://www.kcrt.net/"
 * $id:$
 */
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.lang.Class;
import java.lang.reflect.Method;

public class StartupActivity extends Activity {
    /** Called when the activity is first created. */
    Method setFullScreenMode;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try{
            Class<?> sgManager = Class.forName("jp.co.sharp.android.softguide.SoftGuideManager");
            Class<?> paramstype[] = {boolean.class};
            setFullScreenMode = sgManager.getMethod("setFullScreenMode", paramstype);
        }catch(Exception o){
            Log.d("is01fullscreen", "failed" + o.getMessage() + ":" + o.getClass().toString());
        }
    }

    @Override
    public void onResume(){
        super.onResume();
        try{
            setFullScreenMode.invoke(null, true);
        }catch(Exception o){
            Log.d("is01fullscreen", "failed");
        }
    }
}

結論からいうと、jp.co.sharp.android.softguide.SoftGuideManager::setFullScreenMode(true)をonResumeで呼び出してあげる事になります。これタイマーで呼び出したりできないのかな。また試してみよう。

Javaでプログラムを書くのは初めてなのでおかしかったらごめんなさいな。

あ、あとバージョンアップで潰されたらごめんなさい。

zipで欲しい人: IS01FullScreenSample

くだらないUnix技まとめ

(便利で)くだらないUnix技は?のまとめです。

元スレそのままだと、見にくいのと、どういう結果が起こるのか分かりにくいのと、実行すると危ないコマンドがあるのでまとめてみました。全部羅列している訳じゃないので全部読みたい人は元スレをば。

  • eject – CD-ROMドライブなどを開いたり閉じたりする
  • type – コマンドの種類の説明を表示する
    • type ls すると ls is an alias for ls -F –color=tty
    • type echo すると echo is a shell builtin
    • type makeすると make is /usr/bin/make
  • look – 指定した文字列で始まる行を表示
    • look nano とすると nanograms, nanomelus, nanometer…といった単語が出てくる。
  • init 0 – システムを停止させる
  • echo ^O – バイナリファイルを表示したりしておかしくなった画面を直す
    • ^OはCtrl+V Ctrl+Oで入力できる
    • # ぼくはresetコマンドをよく使います。
  • echo ^G – ベルを鳴らす
    • ^Gの入力方法は、Ctrl+V Ctrl+Gと入力する
  • sudo beep -f 500 -l 100 ; sleep 0.9s ; sudo beep -f 500 -l 100 ; sleep 0.9s ; sudo beep -f 500 -l 100 ; sleep 0.9s ; sudo beep -f 1000 -l 2000
    • ごめんなさい、CentOSなので試せませんでした。
    • 試せた人、連絡ください。
  • echo ‘C16P16P4.C16P16P4.C16P16P4.>C2’ >/dev/speaker
    • これも試せませんでした。

    ping hogehoge | sed -e ‘s/bytes from/^Gbytes from/’

    • pingで繋がっていたら音を出す
    • # 同じことが引数で出来た気がするけど記憶違いかな?
  • bc – 電卓ソフト
  • dc – RPN形式の計算ソフト
    • 2 3 + 4 *とか・・・。pで印字。
  • tail -f ファイル名 – 追っかけ表示
  • echo $[2#1111+1]
  • cal – カレンダー表示
  • grep –数字数字行だけ前後も表示
  • diff –side-by-side – diffの2カラム表示
    • # 僕はvimdiffが好きです。
  • find – ファイル検索
    • たくさんあるんで割愛
  • ^Z, jobs, fg, bg – コマンドのサスペンド、一覧、フォアグラウンド実行、バックグラウンド実行
  • cd – 前回のディレクトリへ移動
  • !! – 直前のコマンドを実行
    • タブで展開できます
  • cat /dev/urandom > /dev/dsp
    • 実行してません。ホワイトノイズ再生だと。
    • 自己責任で。
  • man ascii – アスキーコード表
  • man console_codes – エスケープシーケンス一覧
  • sl – 入ってない方はWikipediaのslを参照。
  • banner – 文字を大きく表示
    • CentOSに入ってなかったので試してません。
  • aptitude moo
  • aptitude -v moo
  • aptitude -vv moo
  • 以下略
    • Debian/Ubuntuの方はどうぞご自身でお試しください。
  • yes 永遠に’y'(または指定した文字)を表示
    • yes | yum install みたいに使えます。
  • seq 数値 – 数列の印字

DreamSparkが日本でも始まった!学生ならVisual Studioとかが無償になってる!

Microsoft DreamSparkがいつのまにか日本でも開始してる!
開始の時点では日本ではサービスが開始していなくて、とても歯がゆい思いをしたのですが、ついに始まったんですね。
サービスの対象は

大学生、短大生、大学院生、専門学校 (本科生)、高等専門学校の 4、5 年生が該当

みたいです。

現在は

Microsoft Visuak Studio 2008 Prof.
SQL Server 2005 Dev.
Expression Studio
xna Game Studio (よく知らない)
Windows Server 2003 Std.
Microsoft Visuak Studio 2005 Prof.

が無償で提供されている(CDイメージのダウンロード)みたい!
すごいね、太っ腹だね。

Windows Liveのアカウントはもちろんですが、学生であることの証明のために国際学生証ってのが必要みたい。

国際学生証ってどこに申し込めばいいのかと思ったら、偶然にも僕の大学生協は受け付けていました。自分の大学の生協になくても(もしくは生協のない学校でも)、最寄りの国際学生証発行場所で申し込むか、東京か大阪のセンターに郵送で申し込むことができるみたい。
料金は1,430円で申請書と写真と学生証コピーが必要。
早速明日にでも行ってきます。発行までどれくらいかかるのかなぁ。