追記: ネタ被ってた。
本の虫: コマンド間違えると「コマンドではない。」って返してくれる江添プラギン
▼ 2015 (77) ▼ May (19) コマンド間違えると「コマンドではない。」って返してくれる江添プラ...
http://cpplover.blogspot.jp/2015/05/blog-post_28.html
command_not_found_handle ()
{
echo "$1: コマンドではない。"
return 127;
}
追記: ネタ被ってた。
本の虫: コマンド間違えると「コマンドではない。」って返してくれる江添プラギン
▼ 2015 (77) ▼ May (19) コマンド間違えると「コマンドではない。」って返してくれる江添プラ...
http://cpplover.blogspot.jp/2015/05/blog-post_28.html
command_not_found_handle ()
{
echo "$1: コマンドではない。"
return 127;
}
まず2038年問題というのをご存じでしょうか
2038年問題 - Wikipedia
2038年問題(にせんさんじゅうはちねんもんだい)は、2038年1月19日3時14分7秒(UTC、以下同様)を過ぎると、コンピュータが誤動作する可能性があるとされる年問題。
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C
C言語で epoch を扱う time_t が32bit OS上でオーバーフローし日本時間2038/01/19 12:14:07
の次に1901/12/14 05:45:52
が来てしまうという問題です。まぁそもそも2038年にもなって32bit OSを使っている側が悪いと言えばアレですが。
実際にどんな事が起きるかは、32bit OS上で以下を実行すれば分かる。
#include <stdio.h>
#include <time.h>
void
test(time_t tmr) {
struct tm* t;
char buf[2038];
t = localtime(&tmr);
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", t);
puts(buf);
}
int
main(int argc, char* argv[]) {
int i;
time_t tmr = 2147483647;
test(tmr); /* 2038/01/19 12:14:07 */
tmr += 1;
test(tmr); /* 1901/12/14 05:45:52 */
return 0;
}
実行結果
$ ./a.out
2038/01/19 12:14:07
1901/12/14 05:45:52
でも待てよ...と思っていたら同じ事を考えてる人がいた。
Cのライブラリの2038年問題と、その対策方法(いや結局time_tは使わないってのもあり)
...という方法でラップすれば2106年迄使う事が出来ます。
http://www.tensyo.com/urame/date/Y2038.htm
これを使えば time_t がオーバーフローした後でも localtime が正しく動く!誰も困らない!2037年頃にオッサンが招集されて狭い部屋に閉じ込められるという事案も発生しない!という事で作ってみた。
mattn/localtime2038 - GitHub
https://github.com/mattn/localtime2038
#ifdef __i386__
#define _GNU_SOURCE
#include <time.h>
#include <dlfcn.h>
static struct tm* (*__localtime)(const time_t *timer);
__attribute__((constructor))
void
wrap_localtime() {
__localtime = dlsym(RTLD_NEXT, "localtime");
}
struct tm *
localtime(const time_t *timer) {
struct tm* t;
unsigned long tmr = *timer;
int yadd = 0;
/* 1970 - 2101 */
if (tmr >= (60uL*60uL*24uL)*47847uL) {
yadd += 40;
tmr -= (60uL*60uL*24uL)*14609uL;
}
/* 1970 - 2100 */
if (tmr >= (60uL*60uL*24uL)*47482uL) {
yadd += 6;
tmr -= (60uL*60uL*24uL)*2191uL;
}
while (tmr >= ((60uL*60uL*24uL)*24837uL)) {
yadd +=28;
tmr -= (60uL*60uL*24uL)*10227uL;
}
t = __localtime((time_t*)&tmr);
t->tm_year += yadd;
return t;
}
#endif
これを使って LD_PRELOAD
を付けて実行すれば
$ LD_PRELOAD=./liblocaltime2038.so ./a.out
2038/01/19 12:14:07
2038/01/19 12:14:08
おぉぉぉぉ...これで2038年にオッサンが過労死する事もなくなりますね。良かったですね。
ジョークです。ちゃんと64bitに移行しましょう。
メールで指摘を頂き、2100年の処理が抜けていたのを修正(2016/10/26)
scriptencoding utf-8
"forループ、whileループ、および再帰を使用して、リスト内の数字の合計を計算する
"3つの関数を記述せよ。
function! s:problem1_1()
let l = [3,5,1,2,9]
let s = 0
for i in l
let s += i
endfor
return s
endfunction
function! s:problem1_2()
let l = [3,5,1,2,9]
let s = 0
let i = 0
while i < len(l)
let s += l[i]
let i += 1
endwhile
return s
endfunction
function! s:_problem1_3(s, l)
if len(a:l)
return a:s + a:l[0] + s:_problem1_3(a:s, a:l[1:])
endif
return a:s
endfunction
function! s:problem1_3()
let l = [3,5,1,2,9]
return s:_problem1_3(0, l)
endfunction
if s:problem1_1() != 20
throw "プログラマ失格: s:problem1_1"
endif
if s:problem1_2() != 20
throw "プログラマ失格: s:problem1_2"
endif
if s:problem1_3() != 20
throw "プログラマ失格: s:problem1_3"
endif
scriptencoding utf-8
" 交互に要素を取ることで、2つのリストを結合する関数を記述せよ。例えば
" [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]
" を返す。
function! s:_problem2(lhs, rhs)
let r = []
for i in range(len(a:lhs))
call add(r, a:lhs[i])
call add(r, a:rhs[i])
endfor
return r
endfunction
function! s:problem2()
let lhs = ["a", "b", "c"]
let rhs = [1, 2, 3]
return s:_problem2(lhs, rhs)
endfunction
if s:problem2() !=# ["a", 1, "b", 2, "c", 3]
throw "プログラマ失格: s:problem2"
endif
scriptencoding utf-8
" 最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。定義では、フィ
" ボナッチ数列の最初の2つの数字は0と1で、次の数は前の2つの合計となる。例えば最
" 初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。
function! s:fib(n)
let r = [0, 1]
let i = 2
while i < a:n
call add(r, r[i-1] + r[i-2])
let i += 1
endwhile
return r
endfunction
function! s:problem3()
return s:fib(100)
endfunction
if s:problem3() !=# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026]
throw "プログラマ失格: s:problem3"
endif
scriptencoding utf-8
" 正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述
" せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる。
function! s:compare(lhs, rhs)
return a:rhs . a:lhs < a:lhs . a:rhs ? -1 : 1
endfunction
function! s:problem4()
let l = [50, 2, 1, 9]
return join(sort(l, function('s:compare')), '')
endfunction
if s:problem4() !=# 95021
throw "プログラマ失格: s:problem4"
endif
scriptencoding utf-8
" 1,2,…,9の数をこの順序で、"+"、"-"、またはななにもせず結果が100となるあらゆ
" る組合せを出力するプログラムを記述せよ。
" 例えば、1 + 2 + 34 - 5 + 67 - 8 + 9 = 100となる。
function! s:make100(r, b, n) abort
if a:n == 10
if eval(a:b) == 100
call add(a:r, a:b)
endif
else
for op in ['+', '-', '']
call s:make100(a:r, a:b . op . (a:n), a:n+1)
endfor
endif
return ''
endfunction
function! s:problem5()
set maxfuncdepth=200
let r = []
call s:make100(r, 1, 2)
return r
endfunction
for s:l in s:problem5()
if eval(s:l) != 100
throw "プログラマ失格: s:problem5"
endif
endfor
unlet s:l
で、問題3 なのですが Vim script では 32bit int しか扱えないので100個のフィボナッチ数列が数えられません。
よってわたくし、プログラマ失格となりました。みなさん今までお世話になりました。
このブログを応援する