Gitを使ってみた

Gitを使ってみた

.zshrcや.emacs.elなどを屋外でも使いたくなったため、GitHubを利用するために、Gitの使い方を調べた。
結果的にはGitHubではなく、BitBucketに落ち着いた。

Gitの使い方

主に
GitHubを使ってみよう!導入と簡単な流れ、よく使うコマンドなど。 - YATのBLOG
に記述されている順に行った。

よく利用するコマンドだけまとめておく。

init : リポジトリの初期化
$ git init

clone : 既存のリポジトリをローカルに複製。dirnameが無い場合はgitの名前がそのままdirnameになる。
$ git clone https://hogehoge dirname

status : 変更が加えられたファイルを確認
$ git status

diff : ファイルの変更点をdiffで表示
$ git diff filename 
$ git diff HEAD

add : コミットするファイルを指定
$ git add filename

commit : コミットする
$ git commit
$ git commit -m "メッセージをつける場合は-mをつける"
$ git commit -a -m "自動で変更したファイルを追加したい場合は-aをつける"

log : コミットログを閲覧する
$ git log

push : 公開リポジトリへプッシュする
$ git push "公開リポジトリ(または名前、だいたいorigin)"  "送信するブランチ(masterとか):送信先ブランチ(省略した場合は送信するブランチとおなじになる)"

pull : 公開リポジトリの変更点をローカルリポジトリにマージ
$ git pull "公開リポジトリ"

remote : 公開リポジトリの設定
$ git remote "公開リポジトリ(git:~~とか)" "名前(だいたいorigin)"
リポジトリを変更したい場合は以下を実行
$ git remote set-url "名前(だいたいorigin)" "変更する公開リポジトリ"

checkout : ブランチを分けるときに使うらしいが自分はコミット前に元に戻す時に使っている
$ git checkout "元に戻すファイル名"

その他コミットを取り消したり、pushを取り消す場合は、下記のURL参照。
git add, commit, push の操作を、それぞれの段階で取り消す方法 | deadwood

また、Gitで無視したいファイルがある場合は下記を参照。
git でログファイルなどを、バージョン管理から外す方法(.gitignore) - yun_kichiの日記

VLCで5秒スキップするLua Extensions作る

前置き

前からVLCの再生時に30秒や60秒スキップできないかなぁと思っていた。
なので今回作った。
欲しかった機能は以下のとおり

  • スキップ秒数を指定できる
  • 前にも後にもスキップできる
  • 初期値は5秒にする (5秒の方が色々便利かなと思って)
  • Numpad 1で前へ、Numpad 2で次へスキップ可能

プログラム

  • skip_movie.lua
skip_second = 5 -- スキップする秒数。デフォルトは5秒
skip_previous_key = 49 -- Numpad 1
skip_next_key = 50 -- Numpad 2

function descriptor()
  return { title = "ムービースキップ",capabilities={} }
end

function activate()
  create_dialog()
  vlc.var.add_callback(vlc.object.libvlc() , "key-pressed", key_press)
end

function deactivate()
  vlc.var.del_callback(vlc.object.libvlc() , "key-pressed", key_press)
end

function close()
  vlc.deactivate()
end

function key_press(var , old , new , data)
  if new == skip_previous_key then skip_movie("Previous",skip_second) end
  if new == skip_next_key then skip_movie("Next",skip_second) end
end

function create_dialog()
  w = vlc.dialog("スキップする秒数を入力してください")
  w1 = w:add_text_input(skip_second,1,1,1,1)
  w:add_button("更新",click_Refresh,2,1,1,1)
  w:add_button("<",previous_skip,3,1,1,1)
  w:add_button(">",next_skip,4,1,1,1)
end

function next_skip()
  skip_movie("Next",skip_second)
end

function previous_skip()
  skip_movie("Previous",skip_second)
end

function click_Refresh()
  skip_second = tonumber(w1:get_text())
end

function skip_movie(action,sec)
  local input = vlc.object.input()
  local now = vlc.var.get(input,"time")
  if action == "Previous" then
    sec=-sec
  end
  vlc.var.set(input,"time",now + sec)
end

テキストボックスにフォーカスしている時にエンターキー押すとskip_secondが更新されるようにしたかったが、できないようだ。
仕方なく、更新ボタンを作成し、ボタン押下でskip_secondを更新するようにした。

一応、キーの値を取得するために作ったluaも載せておく。

function descriptor()
  return { title = "test" ,capabilities={} }
end

function activate()
  vlc.var.add_callback( vlc.object.libvlc(), "key-pressed" , key_press )
end

function deactivate()
  vlc.var.del_callback( vlc.object.libvlc() , "key-pressed" , key_press )
end

function close()
  vlc.deactivate()
end

function key_press(var , old , new , data)
  vlc.msg.info("Push key Number:"..new)
end

function create_dialog()
  w = vlc.dialog("Input Key!")
end

<script type="text/javascript"> <!-- script() --> </script>でなぜコメントアウトするのか

久々に見てハマったのでメモ。

<script type="text/javascript">
<!--
function(){ ... }
-->
</script>

なんのことはない。
なぜコメントアウト内に書くのかというと、ブラウザのHTML読み込みに対して無視させるためである。

epgrecの録画済一覧ページをちょいといじった

前置き

自分の録画サーバのディレクトリ構成は以下のようになっている。

un_encode_ts/ : エンコード前のtsファイルを入れる
encoded_ts/ : エンコード完了後のtsファイルを入れる
mp4/ : エンコードしたmp4ファイルを入れる

現状は、インストールしたepgrecのままなので作成したasfのストリーミング先が un_encode_ts/ のままである。
これでは不便というかtsファイルが見れないので改良。
その他、便利かな?と思った機能を追加した。
以下、追加した機能

  • asfのストリーミング先をencoded_ts/以下に変更
  • ストリーミング先にmp4を追加
  • テーブルを録画日時による昇順/降順で表示
  • 1ページに表示する件数を選択

触ったファイル

触ったファイルは以下のとおり。

./templates/recordedTable.html
./recordedTable.php
./viewer.php

以下、差分。

  • recordedTable.html

録画済ページ表示用ファイル。
optionとしてソート、表示件数を追加。
テーブルカラムとして、モードが不要だったので削除。
mp4のリンク先を追加。

@@ -153,0 +154,9 @@
+ソート<select name="sort">
+  <option value="DESC">降順</option>
+  <option value="ASC">昇順</option>
+</select>
+表示件数<select name="table_items">
+  <option value=50>50</option>
+  <option value=100>100</option>
+  <option value=500>500</option>
+</select>

@@ -174 +183 @@
-  <th>モード</th>
+<!--  <th>モード</th> -->

@@ -176,0 +186 @@
+  <th>mp4リンク</th>

@@ -186 +196 @@
-  <td>{$rec.mode}</td>
+<!--  <td>{$rec.mode}</td> -->

@@ -188,0 +199 @@
+  <td><a href="{$rec.asf_mp4}" id="tid_{$rec.id}">mp4</a></td>
  • recordedTable.php

データベースから録画済ページのデータを取得する。
$sort : ページ表示のソート用の変数
$table_items : 1ページの表示件数
を追加。POSTで受信する。
mp4のリンクページ 追加。
asfはviewer.phpで作成されるため、mp4かtsかの判定用としてGETメソッドのパラメータにfile_typeを追加。

@@ -13,0 +14,2 @@
+$sort = "DESC";
+$table_items = 50;

@@ -43,0 +46,10 @@
+	if( isset($_POST['sort'])) {
+		if( $_POST['sort'] != "" ) {
+			$sort = $_POST['sort'];
+		}
+	}
+	if( isset($_POST['table_items'])) {
+		if( $_POST['table_items'] != "" ) {
+			$table_items = $_POST['table_items'];
+		}
+	}

@@ -47 +59 @@
-$options .= " ORDER BY starttime DESC";
+$options .= " ORDER BY starttime " . $sort . " LIMIT ". $table_items;

@@ -60 +72,2 @@
-		$arr['asf'] = "".$settings->install_url."/viewer.php?reserve_id=".$r->id;
+		$arr['asf'] = "".$settings->install_url."/viewer.php?reserve_id=".$r->id."&file_type=ts";
+		$arr['asf_mp4'] = "".$settings->install_url."/viewer.php?reserve_id=".$r->id."&file_type=mp4";

asfファイル作成ファイル。
GETでfile_typeを取得。
file_typeから作成するリンク先を encoded_ts 以下にするか mp4 以下にするか決めている。

@@ -17,0 +18 @@
+$file_type = $_GET['file_type'];

@@ -41 +42,9 @@
-	echo "<REF HREF=\"".$settings->install_url."/video/encoded_ts"."/".$rrec->path ."\" />";
+	if( $file_type == "ts" ) echo "<REF HREF=\"".$settings->install_url."/video/encoded_ts"."/".$rrec->path ."\" />";
+	if( $file_type == "mp4") {
+		$path_split = explode( "." , $rrec->path );
+		$file_name = $path_split[0] . ".mp4";
+		$file_dir = "/video/mp4";
+		if( file_exists( "." . $file_dir . "/watched/" . $file_name ) ) $file_dir = $file_dir . "/watched";
+		if( file_exists( "." . $file_dir . "/watched/2013/" . $file_name ) ) $file_dir = $file_dir . "/watched/2013";
+		echo "<REF HREF=\"".$settings->install_url.$file_dir."/".$file_name ."\" />";
+	}

客観的に見てミスを減らす方法

客観的にみる方法が少しわかった気がしたのでメモ。
1. 他人の誰かを思い浮かべる(自分は後輩を選んだ)
2. その人が、このファイルを確認してくださいとお願いしてきたと想像する
3. そこで、その人がミスを残したまま提出させないという心構えでチェックする。

後、間違ってたらなんで間違ってるのかを後輩(自分)に聞く。
そうすると答えは自ずとと出てくる。

後輩には悪いがこれが一番簡単だった

iPhone脱獄メモ

ここに記載されているものはセキュリティに関して考慮されてないので、自己責任で参考にしてください。

iPhonesshでつなぐ

Cydiaで
1. Openssh
をインストール

iPhoneLinuxコマンドをいれる

Cydiaで
1. APT(バージョンいろいろあるけど全部)
をインストール。
その後、Cydiaまたはapt-getで

  • vim
  • adv-cmds(finger, fingerd, last, lsvfs, md, ps)
  • inetutils(ftp, inetd, ping, rlogin, telnet, tftp)
  • diffutils(diff, diff2)
  • findutils(find, locate, updatedb)
  • grep
  • network-cmds(arp, ifconfig, netstat, route, traceroute)
  • sudo
  • shell-cmds(killall, mktemp, renice, time, which)
  • top
  • less
  • zsh
  • wget

を入れる
念のため、respringする。

iPhoneVNCサーバーを入れる

Cydiaで
1. veency
を入れる

設定→Veency→Enabled オン→パスワードを記述。
パスワードを記述しないとMacからは入れなかった。

iPhonegccでコンパイルする

wgetで、http://code.google.com/p/iphone-gcc-full/downloads/list から iphone-gcc.deb をダウンロード
dpkg -i iphone-gcc.deb
でインストール。
これだけでおkなはず。
試しにslコマンドをgccしてみればわかる。

iPhoneをモバイルNASにする

iPhoneをモバイルNASにする意味があるかどうかはわからんが、モバイルNASにした。

PCnetworkをインストールする

iPhoneのsmbdは飾りなのか全く動作しなかった。
そこでPCnetworkを使う
1. CydiaでPCnetworkをインストール
2. /var/mobile/Library/Preferences/com.pmbaty.pcnetworking-conf にアクセスし、sambaの設定をする。
3. 書き込み完了後、
chmod -w com.pmbaty.pcnetworking-conf
で書き込み不可にする。
これをしないとPCnetworkの設定を開くと設定が上書きされてしまう

デフォルトシェルをzshに変更する

1. 以下を実施する

$ cd
$ cp /etc/profile .profile
$ echo ‘zsh; exit’ » .profile

rootの場合も設定方法は同じだが、rootにログインする時に、
su -
としないとzshは起動しない。
これはsh起動時にzshを起動しているため。

とりあえずいまはここまで。

iPadからLinuxMintにVPNでつないでみた

iPadからSplashtopで繋げたい。そのためにiPadからLinuxMintにVPNでつなぐようにした。
結論からいうと、結局VPN&VNCではLinuxMintに繋ぐ事はできなかったが、VPNで接続できるようにはなった。

VPNPPTP、L2TP、IPsecなどがあるが、今回は1番簡単かつ資料が多そうなPPTPを使うことにした。(ちなみにPPTPは昨年に脆弱性が発見されたので使わない方がいい)

1. PPTPのインストール

sudo apt-get install pptpd

2. confファイルの編集

/etc/pptpd.conf
localip 192.168.200.1
remoteip 192.168.200.128-238

ここで不思議に思ったのは、勝手にローカルIPやリモートIPを割り当てていいのだろうかというところ。
なぜ行けるのかもわからないが、うまくできている。
ローカルIPの仕組みを知る必要がある。

/etc/ppp/pptpd-options
ms-dns さくらのDNS
ms-dns さくらのDNS2
/etc/ppp/chap-secrets
# client, server, secret, IP addresses
username pptpd "password" *

serverは/etc/ppp/pptpd-optionsのnameと同じにする事。
デフォルトはpptpdになっている。
*にはリモートに割り当てるIPアドレスを書く。
*なら192.168.200.128-238の全てから一つ適当に選ばれるはず。

3. NATの設定

ufwを使っているのでufwの設定を書く。iptablesの人は参考文献参照。

/etc/defaults/ufw

パケットの転送を許可する。

#DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_FORWARD_POLICY="ACCEPT"
/etc/ufw/sysctl.conf

IPフォワードを有効にする。

net/ipv4/ip_forward=1
/etc/sysctl.conf の場合

ufwのみでなくsysctl.confも設定する。

net.ipv4.ip_forward=1
sudo sysctl -p #設定のリロード
/etc/ufw/before.rules

IPマスカレードを設定する。
最初のコメントアウトのすぐ下に下記を書く。

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic from eth0 through eth1.
-A POSTROUTING -s 192.168.200.0/24 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT
ファイアウォール

ファイアウォールでPPTPのポート番号を許可にする

sudo ufw allow 1723 #PPTPのポート番号を許可

以上。
後はiPadからVPN後世設定すればVPNで接続できる。