screen 縦分割導入

自分の場合はautoconfが入っていなかったのでそちらも導入。
autoconfがm4に依存するらしいけどm4は導入済み。
Autoconf - GNU Project - Free Software Foundation (FSF)

autoconf

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
$ tar zxvf autoconf-latest.tar.gz
$ cd autoconf-2.69/
$ ./configure --prefix=/usr/local/
$ make
$ sudo make install

確認

$ which autoconf
/usr/local/bin/autoconf

screen

$ git clone git://git.savannah.gnu.org/screen.git
$ cd screen/src
$ autoconf
$ autoheader
$ ./configure
$ make
$ sudo make install

確認

$ screen -v
Screen version 4.01.00devel (GNUdb59704) 2-May-06

これで勝つる!

|で縦分割。「|」はバーティカルバー

git memo4

コミットの取り消し法

「git commit --amend」と「git reset」がある

git commit --amend

直前のコミットを無効にし、新たなコミットを作る(コミットをやり直す)
git add してからamendを行う

git reset

コミット自体を取り消す
「git reset --soft」 → ワークディレクトリの内容はそのままでコミットだけを取り消す
「git reset --hard」 → コミット取り消した上でワークディレクトリの内容も書き換える

push したコミットを取り消す

ローカルのコミット取消後、「git push -f origin HEAD^:branch-name」
追記
取り消しはこわいので↓の方がよい
Git - リモートにプッシュしたコミットを取り消す - Qiita

rebaseとmergeの違い

git rebase

ブランチの派生元を変更する

git merge

現在の作業ブランチに別のブランチで行われた変更点を取り込むコマンド

git pull --rebaseとgit rebaseの違いは?

git pull --rebaseはgit fetch で他のレポジトリから変更を取得したあとgit rebaseしてる。
git rebaseだけだと、現在のローカルブランチ(fetchしてないので最新版でない)にrebaseするだけになる

コンフリクト対応

git rebase --continue

rebase でもマージと同じように、コンフリクトが発生する可能性がある
コンフリクトが発生した場合、コンフリクトを解消してからgit commitの代わりにgit rebase --continue
を実行することで、rebase を続けることができる

git rebase --skip

競合を解決した結果、一つ前のコミットとの違いがなくなった場合、そのコミットをスキップする

git rebase --abort

git rebase 実行前の状態に戻る

マージを取り消す

git ref log
git reset --hard ORIG_HEAD

他のブランチからあるディレクトリ内のファイルだけもってきたいとき

git co {branch] {パス}

{branch]の部分はコミット名でもいける

追加してないファイルも含めて作業ツリーをきれいにする

git memo3

git log

git log -p

差分表示

git log -1

ログを1つのコミットに限定

git log 7b1558c

指定したリビジョンから始まるログ確認

git log --since="5 hours"
git log --before="5 hours"
^

マイナス1の意味。18f822e^は18f822eの1つ前のリビジョンという意味

~N

チルダと数字Nはそのコミット名からNだけ前に戻る。前の例だと18f822e~1は18f822eの前のリビジョン

git log HEAD~10..HEAD

範囲指定

git blame ファイル名

変更された箇所のコミット名、コミットした人、タイムスタンプ表示

git commit -C HEAD -a --amend
  • C:新しいログメッセージを使う代わりに指定したコミットのログメッセージを使うようGitに伝える
    • amend:修正してから変更をもう一度コミットするときに使う
git revert -n HEAD

コミットを取り消す

  • n:すぐコミットしない(通常revertすると即座にコミットされる)
git reset HEAD^^

直近のコミット2つをリセット

git memo2

ブランチとは

その名の通り枝のこと。枝分かれ。別々の履歴。ゲームブックをイメージ。
例:機能の改善を行い続けるmasterブランチ、リリースされた1.0verのRB_1.0ブランチ

いつブランチをつくるか?

  • 実験的な変更のため(アルゴリズムを書き換えて速くなるかなど)
  • 新しい機能のため
  • バグフィックスのため

branchコマンド

git branch branch-name

新しいブランチをつくる

git branch

ブランチ一覧

git checkout branch-name

ブランチ切り替え

git checkout -b alternate master

-b:ブランチの作成と切り替えが一発でできる
3つめのパラメータmasterに基づくブランチalternateを作成している

git checkout ファイル名

指定したファイルを今のレポジトリの最新状態にする。つまり作業ツリーでの変更が取り消される

マージ

マージの方法

  • 直接マージ(あるブランチと別なブランチの履歴をマージして一緒にしようとすること)
  • 圧縮コミット(あるブランチの変更の全履歴を1つのまとまった変更としてそれを別なブランチの先頭にコミットすること)
  • チェリーピック(別なブランチからコミットを1つ取ってきてそれを現在のブランチに適用すること)
直接マージ

例:masterブランチ上にalternateブランチをマージ
$git checkout master
$git merge alternate

圧縮コミット

$git checkout master
$git merge --squash contact

チェリーピック

$git checkout master
$git cherry-pick 321d76f ←コミット名
複数やる場合
$git cherry-pick -n 321d76f
..
$git commit

ブランチを削除

$git branch -d branchname

ブランチの名前を変える

$git branch -m branchname1 branchname2

git memo

コードの保持される場所

  1. 作業ツリー
  2. ステージングエリア
  3. リポジトリ

git add

ステージングエリアに追加

-i

対話モード

-p

パッチモード

git commit

リポジトリの履歴に変更を追加し、名前をつける

-m
  1. $ git add some-file $$ git commit -m "message"
  2. git commit -m "message" -a
  3. git commit -m "message" some-file

git status

コミット待ちの状態だけでなく、現在の作業ツリーがリポジトリで追跡されてるものと比べてどう違うかも表示される

git diff

パラメータなし

ステージもコミットもしていない作業ツリーの変更が表示

--cached

ステージングエリアとリポジトリ間の差分表示

HEAD

作業ツリーにあるすべてをリポジトリ上にあるものと比較
HEAD…現在作業しているブランチに対する直近のコミットを表すキーワード

git mv file1 file2

git cpはない。gitはファイルを追跡しているのではなく、コンテンツ(変数や関数を形作る個々の文字や行)を追跡

GO FOR IT(4)旋律に隠された特徴

GO FOR IT 4問目。旋律に隠された特徴

問題

ある旋律演算器を考えてみましょう。この演算器は、単音から構成される旋律を入力すると、ある特徴量を算出し、出力することができます。
この演算器に、以下の3つの譜面を入力してみました。

すると、
・A)の特徴量と B)の特徴量は、異なっていました。
・A)の特徴量と C)の特徴量は、同じでした。


こちらのデータ形式を用いて、以下の課題の解を求めてください。
i)上記仕様を満たすこの演算器を設計し、コーディングしてください。
ヒント) 隣り合う音符同士の関係に注目してください。

ii)以下の三つの旋律 D)、E)、F)を設計した演算器に入力した際、B)と同じ特徴量が出力されるものを回答してください。

iii)以下の条件を満たす出力を行う旋律生産器(すなわち作曲器)を設計し、コーディングしてください。求められた旋律をi)で設計した演算器に入力できる文字列として回答してください。
・以下の旋律 G)と同じ特徴量を持ちます。
・譜面上の位置 -2 で与えられるGの音ではじまり、同じ音で終わります。
・旋律の長さは、全音符3つ分よりも長く、高々全音符4つ分までとします。

データ

演算器に旋律を入力するには、譜面を以下の規則に従って文字列に変換する必要があります。
1. 1つの音符は3つの属性
「楽譜上の位置(高さ)、音符の種類(長さ)、臨時記号(高さの補正情報)」 を持ちます。
2. 属性と属性は”:”で区切られます。
3. 音符と音符は”,”で区切られます。
旋律の最後には”,”を必要としません。文字列の終端を以て旋律の終端とします。
4. 楽譜上の位置は第三線を原点(0)とし、第三間を+1,第四線を+2……、第二間を-1、第二線を-2……、というように正負の値で表現されます。
高低の範囲は、一般的なピアノの鍵盤上に存在する音(7オクターブ+短三度)に限るものとします。
5. 音符の種類は{全/二分/四分/八分/十六分/三十二分}音符を{1/2/4/8/16/32}で表します。
符点がついた場合は”.”を添えるものとします{1./2./4./8./16./32.}。
6. 臨時記号は、“s” シャープ、“x” ダブルシャープ、“b” フラット、d” ダブルフラットで表します。
この属性を持たない場合、その音符はナチュラルがついているものとします。
7. 休符については、高さが無いものとし、長さは音符と同様に表します。
8. 以上の規約で言及されない(下記変換例の楽譜に登場しない)楽譜上の記号、表現については、ここでは入力の対象外とします。すなわち、この問いにおいて考慮する必要はありません。

例)

= 0:1:,1:2:s,2:4.:x,1:8:,:8:,-1:16.:b,-2:32:d
設問中の各譜面を表す文字列は、上記の規則に従い次のようになります。
A)-3:4:,-2:4:,-1:4:,0:4:b,-1:4:,-2:4:,-3:4:,:4:,-1:4:,0:4:b,1:4:,2:4:,1:4:,0:4:b,-1:4:,:4:
B)3:4:,2:4:,1:4:,0:4:b,1:4:,2:4:,3:4:,:4:,1:4:,0:4:b,-1:4:,-2:4:,-1:4:,0:4:b,1:4:,:4:
C)3:4:,2:4:,1:4:,0:4:,1:4:,2:4:,3:4:,:4:,1:8:,0:4.:,-1:4:,-2:4:,:8:,-1:4.:,0:8:,1:8:
D)-6:8:,-6:8:,-6:8:,-4:8:,-2:8:,-2:8:,-2:8:,:8:,-5:8:,-5:8:,-5:8:,-3:8:,-2:8:,-2:8:,-2:8:,:8:,:8:,-2:8:,-2:8:,-1:8:b,-1:8:,-1:8:,-1:8:,-1:8:b,-2:4:,0:4:,1:4:,:4:
E)-6:8.:,-7:16:,-6:8:,-5:8:,-4:8:,-4:8:,-4:4:,-3:8.:,-4:16:,-5:8:,-6:8:,-5:4:,:4:,-3:8:,-5:4:,-5:8:,-4:8:,-4:8:,-3:8:,-3:8:,-4:8:,-4:8:,-5:8:,-5:8:,-6:4:,:4:
F)-6:2:,-5:4:,-6:8:,-5:8:,-4:4:,-2:4:,-4:4:,:4:,-5:4:,-5:4:,-6:4:,-5:4:,-4:2.:,:4:
G)-2:8.:,-1:16:,-2:8.:,-1:16:,-2:4:,-4:4:,-4:8.:,-3:16:,-4:8.:,-3:16:,-4:4:,-6:4:,-4:8:,:8:,-6:8.:,-5:16:,-4:8:,:8:,-6:8.:,-5:16:,-4:8.:,-4:16:,-2:8.:,-2:16:,-5:8.:,-4:16:,-5:4:

考え方

特徴量の定義をどうするかがポイント。
i)だけみると、隣り合う音の高さの差の絶対値かなーと思ってコーディングしてたんですけど、それだとii)で詰まることに気づく。属性が3つあるので高さ以外の属性が関わってるのかと色々と考えてみるも、思いつかず。断念。。。

GO FOR IT(3)暗号検索の高速化

GO FOR IT 3問目。暗号検索の高速化

問題

文字列の中に現代の出来事が暗号化されているという、映画や書籍が話題になりました。この暗号は、文字列を特定のスキップ数ごとに改行を入れて折り返すと、関連のある文字列が近い距離に配置されるというものです。
たとえば、r=16、i=0を初期値として、下記を300000回繰り返して生成した、’a’から’z‘までの文字をランダムに含むアスキー文字列rand_str[]には、先頭208728文字目から4162文字スキップで"sony"の文字列が存在します。

r ← ( r * 1103515245 + 12345 ) & 0xFFFFFFFF
rand_str[i] ← 0x61 + ( 26 * ( r / 0x10000) ) / 0x10000
i ← i + 1

この文字列を4162文字ごとに改行を入れて折り返し、"sony"の文字列が中央付近に配置されるように、19桁10行の範囲を抜き出すと、下記のようなマトリクスが得られます。

このマトリクスには、"alpha"の文字列が等距離スキップで存在し"sony"の文字列と近い距離にあります。この暗号では最小スキップの文字列が重要な意味をもち、2文字以上のキーワードがランダム文字列中のどこにあるかを最小スキップ順に高速に求めたいと思っています。

なお、高速実行可能であれば使用プログラミング言語や入出力仕様は問いません。たとえば、キーワードをコマンドラインで指定し、ランダム文字列を標準入力から得て、スキップ数と位置をカンマで区切ったものを改行し、標準出力するようなプログラムを作成してください。

・ スキップ数が短い順に出力してください。
・ スキップ数が同じ場合は、ランダム文字列先頭に近いものから出力してください。
・ キーワード文字列が逆順にマッチした場合も出力してください。

※ たとえば前述のランダム文字列から、"sony"の逆順の"ynos"を探す場合には、「4162,208728」が出力されるようにしてください。


i)実行速度にこだわらず、読みやすいように書いてください。
ii)アルゴリズムの工夫により、さらに高速化したものを書いてください。

キーワードを入力するとスキップ数と位置を出力するプログラムを作成しろって問題?
これはかなり手ごわそうです。

とりあえず、ランダム文字列を作成するプログラムだけ書いて、続きは明日また取り組もうと思います。
今回はchr関数を使ったのですが、英語の大文字と小文字どちらも作成されますし、'や\などの記号も現れてしまうんですけどいいのでしょうか…。

ランダム文字列を作成するプログラム

<?php

$r = 16;
$rand_str = array();
for($i=0;$i<300000;$i++){
	$r = ( $r * 1103515245 + 12345 ) & 0xFFFFFFFF;
	$rand_str[$i] =chr(0x61 + ( 26 * ( $r / 0x10000) ) / 0x10000);
}
print_r($rand_str)