public: typedef Takel::Diary Observable; このページをアンテナに追加 RSSフィード

[[はじめ]] [[韓国編]] [[爆裂帰国編]] [[暗黒出張編]] [[郷愁編]] [[blog]]

2017-03-18

[]最近の Raspbian を USB 接続ドライブで起動する 最近の Raspbian を USB 接続のドライブで起動するを含むブックマーク 最近の Raspbian を USB 接続のドライブで起動するのブックマークコメント

新しめの Raspbian を DL してきたら Berryboot から起動するようになってて、一筋縄では USB 接続ドライブから起動するようにできそうもなかったのでメモ

(そもそも RPi3 だと SD カードレスで起動できるらしいんだけど上手く行かなかったのと、いま USBドライブから起動したいのは RPi2 なのであくまSD カード自体は使う方式で)。


とりあえず USB 接続ストレージがあるとして適当Linux 機でフォーマットする手順(適当)。sdx ってなってるところは適切にフォーマット対象デバイスを選ぶこと(まるごと消すから)

まずまっさらGPT 形式にしてパーティション切っていく

$ sudo sgdisk -Z /dev/sdx

$ sudo gdisk /dev/sdx

(o で GPT パーティションテーブルを作って n でパーティション切って w で書き込んで終わり)

$ sudo mkfs -t ext4 /dev/sdx1

あとで Raspbian の中身をコピーしてくるのでマウントしておく

$ mkdir -p ~/mnt/dst

$ sudo mount /dev/sdx1 ~/mnt/dst


公式イメージファイルが 2017-03-02-raspbian-jessie.img だとして、中身をさぐる

$ parted ~/2017-03-02-raspbian-jessie.img unit B print

二つにわかれてる両方に用事があるので両方マウントしておく


$ mkdir -p ~/mnt/boot

$ mkdir -p ~/mnt/berryboot

$ sudo mount -o offset=1048576,sizelimit=133169152 ~/2017-03-02-raspbian-jessie.img ~/mnt/boot

$ sudo mount -o offset=134217728,sizelimit=7610564608 ~/2017-03-02-raspbian-jessie.img ~/mnt/berryboot

ext4 の berryboot の中に Raspbian のイメージが入ってる。つまり bag in bag!!

こいつをマウントする


$ mkdir -p ~/mnt/raspbian

$ sudo mount ~/mnt/berryboot/images/Debian_Jessie_Raspbian_2016.11.img192 ~/mnt/raspbian


中身をコピー(ここのコピー元の最後の / は重要で、忘れたら sudo mv ~/mnt/dst/raspbian/* ~/mnt/dst みたいにして移動する必要があるw)

$ sudo rsync -av ~/mnt/raspbian/ ~/mnt/dst


いったんこれで外付けする USB ストレージは完成。

$ sudo umount ~/mnt/dst

$ sudo umount ~/mnt/raspbian

$ sudo umount ~/mnt/berryboot


~/mnt/boot から RPi の起動につかう SD カードへ中身をコピー(この SD カードはあまり容量を大きくとると RPi の一番最初ブート処理部分が bootcode.bin を見つけられずに失敗するかもしれないので控えめなサイズにしておく。公式イメージそのままだと 127MB くらいになってる)

$ cp ~/mnt/boot/* /mnt/sdcard

$ sudo umount ~/mnt/boot


で、SD カード内のファイルをいじっていきます。まずは config.txt から


# Berryboot settings, do not change

initramfs berryboot.img


って書いてある部分を消すかコメントアウトます

チェンジするなって書いてあるけど全力ででチェンジで!!


# Berryboot settings, do not change

# initramfs berryboot.img


つぎに cmdline.txt を書き換えます

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait

これでいったん /dev/sda1 から起動するはずなので、SD カードUSB ストレージをつけて RPi を起動します(/dev/sda1 って決め打ってる状態なので他のストレージを繋がないように)


ここで RPi が起動すれば8割完了ですが、まだ /dev/sda1 って決め打ってるのが気持ち悪いので UUID 指定にします

カーネル単体だと UUID 指定理解してくれないようなので initramfs を作って指定ます


もし initramfs-tools がなければ入れておきます(標準のイメージなら入ってるはず)

$ sudo apt-get install initramfs-tools


さくっと作れるかと思ったらモジュールの入ったディレクトリがないとか怒られるので、適当に空ディレクトリ作ったら警告はでるけどできました。

$ sudo mkinitramfs -o /boot/initrd.img

$ sudo mkdir -p /lib/modules/4.4.47v7-aufs

$ sudo mkinitramfs -o /boot/initrd.img


また config.txt をいじります

initramfs initrd.img


$ sudo blkid して USB ストレージの uuid を調べておきます

それを cmdline.txt指定ます


dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=UUID=00000000-0000-0000-0000-000000000000 rootfstype=ext4 elevator=deadline rootwait


これで再起動してちゃんと起動したら完了です。

もう他の USB ストレージをつないでも大丈夫

つか自分備忘録なので分かりづらくてさーせん。

トラックバック - http://d.hatena.ne.jp/takel/20170318

2017-03-12

[] systemd 化されてしまった Raspbian でコンソールへの自動ログインをやめさせる  systemd 化されてしまった Raspbian でコンソールへの自動ログインをやめさせるを含むブックマーク  systemd 化されてしまった Raspbian でコンソールへの自動ログインをやめさせるのブックマークコメント

またしても systemd か。


やめさせる

ln -fs /lib/systemd/system/getty@.service     /etc/systemd/system/getty.target.wants/getty@tty1.service

自動ログインに戻す

ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service

[] Raspbian のコンソールフォントを変える  Raspbian のコンソールのフォントを変えるを含むブックマーク  Raspbian のコンソールのフォントを変えるのブックマークコメント

これは昔から変わらないと思うが、やり方忘れてググったのでメモ


やりかた1

$ sudo dpkg-reconfigure console-setup

"UTF-8" を選択.

"Guess optimal character set" を選択.

"Terminus", "TerminusBold" あたりを選択.

お好みのフォントサイズ選択.


やりかた2

$ sudo vi /etc/default/console-setup

FONTFACE="Terminus"

FONTSIZE="16x32"


$ sudo /etc/init.d/console-setup restart

候補はこんな感じ

Terminus

6x12

8x14

8x16

10x20

11x22

12x24

14x28

16x32

TerminusBold

8x14

8x16

10x20

11x22

12x24

14x28

16x32

TerminusBoldVGA

8x14

8x16

[] ユーザー名を pi から変えておく  ユーザー名を pi から変えておくを含むブックマーク  ユーザー名を pi から変えておくのブックマークコメント

まず sudo passwd で rootパスワードを設定しておく.

そして piプロセスひとつもない状態にする(入れたばかりならログアウトして rootログインしなおせば大丈夫なはず)


ユーザーpi から変えておく

# usermod -l new_user_name pi

グループ名を pi から変えておく

# groupmod -n new_group_name pi

ホームディレクトリの変更(ディレクトリ自体の移動もしてくれる)

# usermod -d /home/new_user_name -m pi

crontab とか他のもろもろはこの操作だけじゃ変わらないので、ユーザー pi でいろいろいじくる前にやってしまうのが良さそう。

/etc/sudoers.d/010_pi-nopasswd とかもいじることになる.

トラックバック - http://d.hatena.ne.jp/takel/20170312

2016-10-02

[]謎の企業⽢潤社とはっ 謎の企業⽢潤社とはっを含むブックマーク 謎の企業⽢潤社とはっのブックマークコメント

⽢潤社、聞いたこともないような名前企業である

しかしてその実態は膨大な量の暗号文を配布し、社員をはじめその理念賛同するもの達への指示を行っている悪の秘密結社である


というのは嘘で、ShiftJIS 優先のエディタHTML 書き始めてうっかりそのまま保存して Chrome でみたら



㱨瑭氾ഊ़桥慤㸍ਉ़瑩瑬放浵獩挼⽴楴汥㸍ਉ़獣物灴⁳牣㴢浵獩挮臏∾㰯獣物灴㸍ਉ㰯桥慤㸍ਉ㱢潤社ഊउ苙芰ഊ़⽢潤社ഊ㰯桴浬


こんな風に化けてました

ちょっと謎。

トラックバック - http://d.hatena.ne.jp/takel/20161002

2016-08-30

[] を含むブックマーク のブックマークコメント

template <typename NUMBER_TYPE>
NUMBER_TYPE calculateGcdWithEuclidean(NUMBER_TYPE fst, NUMBER_TYPE snd)
{
	if (fst <= 0) { fst *= -1; }
	if (snd <= 0) { snd *= -1; }
	
	while (fst != snd)
	{
		if (fst > snd)
		{
			fst -= snd;
		}
		else
		{
			snd -= fst;
		};
	};
	
	return fst;
};

#include <iostream>
#include <stdlib.h>
int main(int argc, const char** argv)
{
	long timesPerSecond = 1000000; // 1000
	long framesPerSecond = 60; // 60
	long baseTime = timesPerSecond / framesPerSecond; // 16
	long remaindered = timesPerSecond % framesPerSecond; // 40
	
	long gcd = calculateGcdWithEuclidean(framesPerSecond, remaindered); // 20
	long cycle = framesPerSecond / gcd; // 3
	long longSpanCount = remaindered / gcd; // 2
	std::cout << "baseTime:" << baseTime << std::endl;
	std::cout << "remaindered:" << remaindered << std::endl;
	std::cout << "gcd:" << gcd << std::endl;
	std::cout << "cycle:" << cycle << std::endl;
	std::cout << "longSpanCount:" << longSpanCount << std::endl;
	
	// assertEqual(timesPerSecond, (cycle * gcd * baseTime) + (longSpanCount * gcd));
	long* pTimeTable = (long*)malloc(sizeof(long) * cycle);
	for (int i = 0; i < cycle; i += 1)
	{
		pTimeTable[i] = baseTime + ((i < longSpanCount) ? 1 : 0);
		std::cout << i << ":" << pTimeTable[i] << std::endl;
	}
	free(pTimeTable);
	
	return 0;
}
トラックバック - http://d.hatena.ne.jp/takel/20160830

2016-07-22

[]まく使いの憂鬱(Karabiner)の設定ファイル まく使いの憂鬱(Karabiner)の設定ファイルを含むブックマーク まく使いの憂鬱(Karabiner)の設定ファイルのブックマークコメント

Karabiner の設定ファイル

もうこれがないと職場仕事できないレベルになってきたのでバックアップ代わりに晒しておく。

VirtualBox 内と VNC 経由で Windows で nfer/xfer で IME 制御したい Mac 利用者っていう変態的なケースなので需要は少ないかもしれん。

Karabiner がなかったら OS-X は個人的にはもう諦めてたと思う(OS 8 くらいの時期から Mac に触ってるはずだが今でも Finder挙動に耐えられん)

<?xml version="1.0"?>
<!-- Karabiner/private.xml -->
<root>
	<appdef>
		<appname>VirtualBox</appname>
		<equal>org.virtualbox.app.VirtualBoxVM</equal>
	</appdef>
	<appdef>
		<appname>VNC</appname>
		<equal>com.geekspiff.chickenofthevnc</equal>
		<equal>net.sourceforge.chicken</equal>
		<prefix>de.jinx.JollysFastVNC</prefix>
		<prefix>com.realvnc.vncviewer</prefix>
	</appdef>
	<appdef>
		<appname>iTerm</appname>
		<equal>com.googlecode.iterm2</equal>
	</appdef>
	<item>
		<name>Use Eisuu as Shift + F12 in VirtualBox</name>
		<identifier>private.virtualbox_eisuu</identifier>
		<only>VirtualBox</only>
		<autogen>__KeyToKey__ KeyCode::JIS_EISUU, KeyCode::F12, ModifierFlag::SHIFT_L</autogen>
	</item>
	<item>
		<name>Use Kana as Han/Zen in VirtualBox</name>
		<identifier>private.virtualbox_kana</identifier>
		<only>VirtualBox</only>
		<autogen>__KeyToKey__ KeyCode::JIS_KANA, KeyCode::JIS_PC_HAN_ZEN</autogen>
	</item>
	<item>
		<name>Use CapsLock as Ctrl in VNC Viewer</name>
		<identifier>private.vnc_ctrl</identifier>
		<only>VNC</only>
		<autogen>__KeyToKey__ KeyCode::COMMAND_L, KeyCode::CONTROL_L</autogen>
	</item>
	<item>
		<name>Use Yen mark as Backslash in VNC Viewer</name>
		<identifier>private.vnc_yen</identifier>
		<only>VNC</only>
		<autogen>__KeyToKey__ KeyCode::JIS_YEN, ModifierFlag::NONE, KeyCode::VK_JIS_BACKSLASH</autogen>
	</item>
	<item>
		<name>Use Eisuu as Ctrl + F13 in VNC Viewer</name>
		<identifier>private.vnc_eisuu</identifier>
		<only>VNC</only>
		<autogen>__KeyToKey__ KeyCode::JIS_EISUU, KeyCode::F13, ModifierFlag::CONTROL_L</autogen>
	</item>
	<item>
		<name>Use Kana as Ctrl + F14 in VNC Viewer</name>
		<identifier>private.vnc_kana</identifier>
		<only>VNC</only>
		<autogen>__KeyToKey__ KeyCode::JIS_KANA, KeyCode::F14, ModifierFlag::CONTROL_L</autogen>
	</item>
	<item>
		<name>Use Underscore as Backslash globally</name>
		<identifier>private.global_yen</identifier>
		<autogen>__KeyToKey__ KeyCode::JIS_UNDERSCORE, ModifierFlag::NONE, KeyCode::VK_JIS_BACKSLASH</autogen>
	</item>
	<item>
		<name>Use Home as Command + Left globally except VirtualBox, VNC and iTerm</name>
		<identifier>private.global_home</identifier>
		<not>VirtualBox, VNC, iTerm</not>
		<autogen>__KeyToKey__ KeyCode::HOME, KeyCode::CURSOR_LEFT, ModifierFlag::COMMAND_L</autogen>
	</item>
	<item>
		<name>Use End as Command + Right globally except VirtualBox, VNC and iTerm</name>
		<identifier>private.global_end</identifier>
		<not>VirtualBox, VNC, iTerm</not>
		<autogen>__KeyToKey__ KeyCode::END, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen>
	</item>
</root>

尚、Windows 側の IME の設定は手動でやってる。

こいつもレジストリエディタとかでなんとかならんのかなと思い続けて気がつけば十年くらい経ってる気がする。

7/25 追記 iTerm で Home/End を除外した。ちょっと弄ると他で影響が出てくるのがつらい。

トラックバック - http://d.hatena.ne.jp/takel/20160722

2016-06-22

[]哲学カテゴリー新設 哲学カテゴリー新設を含むブックマーク 哲学カテゴリー新設のブックマークコメント

基本的に全てその他カテゴリーにしているが突然カテゴリー新設してみる。

まあ分類すべき事を書くときでもカテゴリー存在を忘れててその他カテゴリーで書くんだろうがw

[]1+1=2 の理由をこたえられる人はいるか? 1+1=2 の理由をこたえられる人はいるか?を含むブックマーク 1+1=2 の理由をこたえられる人はいるか?のブックマークコメント

1+1=2 が真である理由説明できる人っているのだろうか?

みんなこれを当たり前のように真理として受け入れているだけであって、

本当にそうなのかそこに疑いがないのか真面目に考える人は少ないと思う。


数字や数値について何の前提知識もなく + は足す記号で、 = は等しい事を表す記号だというルールを与えられたら、

1+1=11

あたりと答えるのがある意味普通の反応なのではないか?

偶然性に頼る以外に、どうやっても虚無から 1+1=2 というルールを導出するに至らない気がする。


では 1+1=2 とは何なのだろうか?

誰もが経験的にそれが真であることが間違いないとは知っている。

だがそれが真である理屈説明する事は自分にはできそうもない。


しかし、こう考えることは可能であった。

人間は1と1を足した結果の状態を2という数値で捉えることにしているんだよ。』

[]つまり1進法か つまり1進法かを含むブックマーク つまり1進法かのブックマークコメント

1+1=11 も1進法という事にするなら正しいなと気づいた。

unary 1 = decimal 1

unary 11 = decimal 2

unary 111 = decimal 3

unary 1111 = decimal 4

字面に対して超直感的な記法www

もはや1の代わりに饅頭でもリンゴでもバナナでも使っていいwww


1進法があるなら0進法もあってもいいと思ったw

nullary 0 = decimal 0 = unary

nullary 00 = decimal 1 = unary 1

nallary 000 = dicimal 2 = unaary 11

nallary 0000 = decimal 3 = unary 111


ゼロ進法まできちゃうと頭に0をいくらつけても等価とするっていう他の記法との互換性はなくすか、

ゼロでない数字を使う必要が出てくるなwww


さらに追加で-1進法を考えたw

これはマイナスを表せるだけでなく

1進法で0を表すときに何も書けなくなる事の対応

0進法で頭に0を付けられない事の対応まで含むwww

(もはや arity がわからないので仮に negary とするw)

negary -111 = decimal -3

negary -11 = decimal -2

negary -1 = decimal -1

negary - = decimal 0

negary 1- = decimal 1

negary 11- = decimal 2

negary 111- = decimal 3


これは神の記法かもしれんwwwwww


あかん小数点対応もいくぜ...?

p-negary 1.1- = decimal 1.5

p-negary 0.1- = decimal 0.5

p-negary 0.01- = decimal 0.25

p-negary 0.11- = decimal 0.75(0.5 + 0.25)

p-negary 0.001- = decimal 0.125

p-negary 0.101- = decimal 0.625(0.5 + 0.125)

p-negary 0.111- = decimal 0.875(0.5 + 0.25 + 0.125)

p-negary 0.0001- = decimal 0.0625

p-negary -0.1 = decimal -1.0

p-negary -1.1 = decimal -1.5

p-negary -1.0 = decimal -0.5

p-negary -10.0 = decimal -0.25

p-negary -11.0 = decimal -0.75(-0.5 + -0.25)

やゔぁいwww 超シンメトリーwww

トラックバック - http://d.hatena.ne.jp/takel/20160622

2016-06-20

[]FreeBSDMAC アドレスから NIC 名を固定したかったのだが FreeBSD で MAC アドレスから NIC 名を固定したかったのだがを含むブックマーク FreeBSD で MAC アドレスから NIC 名を固定したかったのだがのブックマークコメント

USBLAN アダプタを複数挿すとどれが ue0 でどれが ue1 で ue2 なのかわかったもんじゃなくなる

Linux とかだと HWaddr で固定みたいなの結構あったと思うんだけど

FreeBSD だとそれっぽいのが見当たらない。

しかしたらそんな設定できるようになってないのかもしれない


なので、とりあえずちょっと精度が粗くてデータロジックが一緒くたになっているが

基本的アイディアとしては割と単純な事だと実証してみる

#!/bin/sh

fix_ifname_by_etheraddr()
{
	_ifn_list="`ifconfig -l`"
	[ -z "$_ifn_list" ] && return 0
	for _if in ${_ifn_list} ; do
		_ifethaddr="`ifconfig $_if | sed 's/^.*ether[ ]\{1,\}\([0-9a-f:]\{17\}\).*$/\1/' | egrep '^[0-9a-f:]{17}$'`"
		# echo "$_if = $_ifethaddr"
		[ -z "$_ifethaddr" ] && continue
		case $_ifethaddr in
		"00:00:00:00:00:00")
			ifconfig $_if name net0
			;;
		"01:00:00:00:00:00")
			ifconfig $_if name net1
			;;
		"02:00:00:00:00:00")
			ifconfig $_if name net2
			;;
		"03:00:00:00:00:00")
			ifconfig $_if name net3
			;;
		*)
			continue
			;;
		esac
	done
	return 0
}

fix_ifname_by_etheraddr

この時、置き換え後の名前に使えるのはとりあえず net しかからない。

mknod とかで特殊ノードを作れば好きな名前にできるのかもしれない(未検証)。


あとこのスクリプトを走らせるタイミングをどうするか。

USB nic が挿さったタイミングで実行したいようなしたくないような。

ipfw とかどうなるんだろうかとか気になる。

トラックバック - http://d.hatena.ne.jp/takel/20160620

2016-06-19

[]ケイパビリティの設定 ケイパビリティの設定を含むブックマーク ケイパビリティの設定のブックマークコメント

ちょっと wiresharkパケットでもキャプチャーしてみるけぇと思ったら

それを root で起動するなんてとんでもないと怒られたりするのでちゃんと設定する方法


簡単に要約するとパケットキャプチャを行う部分である /usr/bin/dumpcap に生のデータを扱うケイパビリティを設定してあげる事で怒られなくなる。


参考情報

http://linuxandxx.blog.fc2.com/blog-entry-39.html

http://www005.upp.so-net.ne.jp/develop-tom/deb/wireshark-deb.html

http://www.usupi.org/sysad/183.html


やってみた事

まず /usr/bin/dumpcap があるかどうか確認

$ ls -al /usr/bin/dumpcap
-rwxr-xr-x 1 root root 77080 Mar 11  2014 /usr/bin/dumpcap

ある。そして誰でも実行できるようになっている。

この後ケイパビリティを与えるが、それに先立って誰でも実行可能状態制限する。


$ sudo chmod o-x /usr/bin/dumpcap

これで所有者とグループにしか実行できなくなっている


$ ls -al /usr/bin/dumpcap
-rwxr-xr-- 1 root root 77080 Mar 11  2014 /usr/bin/dumpcap

専用のグループを作る(gid名前適当に)

$ sudo addgroup -gid 1500 packet_ops
Adding group `packet_ops' (GID 1500) ...
Done.

自分をグループに入れる。USER の所を適切に自分アカウントに変更

尚、これは一度ログアウトしてログインしないと反映しないはず

$ sudo gpasswd -a USER packet_ops
Adding user USER to group packet_ops

対象の所有グループを先ほど作ったグループに変更する

$ sudo chgrp packet_ops /usr/bin/dumpcap

現在ケイパビリティ確認

$ getcap /usr/bin/dumpcap

ここで何も返ってこないのは何のケイパビリティもないから



ケイパビリティを与える

$ sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap

そして確認してみる

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

今度は cap_net_admin と cap_net_raw に e と i と p が設定されてるのが確認できる。


この状態root じゃなくても怒られなくなっているはず。

尚、ファイルケイパビリティは owner や group を変更すると全部外れる模様。

トラックバック - http://d.hatena.ne.jp/takel/20160619

2016-06-17

[]7gogoあやかって久しぶりに C のプログラムを書いた 7gogo にあやかって久しぶりに C のプログラムを書いたを含むブックマーク 7gogo にあやかって久しぶりに C のプログラムを書いたのブックマークコメント

ファイルパーミッションの八進数が苦手である。

7が全部許可な事はわかる。

rwx の順番なのもわかる。

が、そこから 1 bit でもずれると『そもそも read は下の桁だっけ一番上の桁だっけ?』となる。


変換スクリプトを書こうと思った。

パーミッションといえば 755 とかよく出てくるから 7gogo.jpあやかって会いにいけるプログラムにしよう(謎)

そして何故か C で書いた。

これでも元ゲームプログラマーC++ をメインに使っていたのだが、最近お仕事Java やら Ruby やらが多くて

C を書く機会はほんとになくなっている。

まあ、たまにはリハビリだ。

make も何も要らない C のソース一個で完結だ。

// nanagogo.c - octal permission number to string expression converter
// 
// Copyright (c) 2016 Takel Hinomoto
// This file is provided under the MIT license.
// 
// To compile: $ cc nanagogo.c -o nngg
// To execute: $ ./nngg 755
//         or: $ mv nngg ~/bin; nngg 755
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

static const char* stringExpressionTable[] =
{
	"---",
	"--x",
	"-w-",
	"-wx",
	"r--",
	"r-x",
	"rw-",
	"rwx",
};

int main(int argc, const char** argv)
{
	if (argc < 2)
	{
		fprintf(stderr, "missing argument.\n");
		return -1;
	}
	
	const char* permissionNumber = argv[1];
	errno = 0;
	char* pEndCh = NULL;
	
	unsigned long value = strtoul(permissionNumber, &pEndCh, 8);
	if ((errno != 0) || (*pEndCh != '\0'))
	{
		fprintf(stderr, "permission value must be an octal number.\n");
		return -1;
	}
	
	if (value > 0777)
	{
		fprintf(stderr, "specified octal permission value too big.\n");
		return -1;
	}
	
	int others = (int)(value & 7);
	int group = (int)((value >> 3) & 7);
	int owner = (int)((value >> 6) & 7);
	
	fprintf(stdout, "%s%s%s\n", stringExpressionTable[owner], stringExpressionTable[group], stringExpressionTable[others]);
	
	return 0;
}

ていうかものすごい車輪の再発明可能性があるが調べてない。

トラックバック - http://d.hatena.ne.jp/takel/20160617

2016-06-16

[]7gogoあやかって久しぶりに C のプログラムを書いた 7gogo にあやかって久しぶりに C のプログラムを書いたを含むブックマーク 7gogo にあやかって久しぶりに C のプログラムを書いたのブックマークコメント

ファイルパーミッションの八進数が苦手である。

7が全部許可な事はわかる。

rwx の順番なのもわかる。

が、そこから 1 bit でもずれると『そもそも read は下の桁だっけ一番上の桁だっけ?』となる。


変換スクリプトを書こうと思った。

パーミッションといえば 755 とかよく出てくるから 7gogo.jpあやかって会いにいけるプログラムにしよう(謎)

そして何故か C で書いた。

これでも元ゲームプログラマーC++ をメインに使っていたのだが、最近お仕事Java やら Ruby やらが多くて

C を書く機会はほんとになくなっている。

まあ、たまにはリハビリだ。

make も何も要らない C のソース一個で完結だ。

// nanagogo.c - octal permission number to string expression converter
// 
// Copyright (c) 2016 Takel Hinomoto
// This file is provided under the MIT license.
// 
// To compile: $ cc nanagogo.c -o nngg
// To execute: $ ./nngg 755
//         or: $ mv nngg ~/bin; nngg 755
#include <stdio.h>
#include <errno.h>

static const char* stringExpressionTable[] =
{
	"---",
	"--x",
	"-w-",
	"-wx",
	"r--",
	"r-x",
	"rw-",
	"rwx",
};

int main(int argc, const char** argv)
{
	if (argc < 2)
	{
		fprintf(stderr, "missing argument.\n");
		return -1;
	}
	
	const char* permissionNumber = argv[1];
	errno = 0;
	char* pEndCh = NULL;
	unsigned long value = strtoul(permissionNumber, &pEndCh, 8);
	
	if ((errno != 0) || (*pEndCh != '\0'))
	{
		fprintf(stderr, "permission value must be octal number.\n");
		return -1;
	}
	
	if (value > 0777)
	{
		fprintf(stderr, "octal permission value too big.\n");
		return -1;
	}
	
	int others = (int)(value & 7);
	int group = (int)((value >> 3) & 7);
	int owner = (int)((value >> 6) & 7);
	
	fprintf(stdout, "%s%s%s\n", stringExpressionTable[owner], stringExpressionTable[group], stringExpressionTable[others]);
	
	return 0;
}

ていうかものすごい車輪の再発明可能性があるが調べてない。

トラックバック - http://d.hatena.ne.jp/takel/20160616
Connection: close