ドル→円のまとめ
海外在住者が日本に旅行に行きます。1万ドル程度の米ドル現金を.. - 人力検索はてな にてドルを円に両替する方法を調査したところ、いろいろと情報が得られた。自分でも追加で調べたところ多くの人に取ってはソニーバンクが最高過ぎるということが分かった。
とりあえず計算をしやすくするためにレートは以下でシミュレーションした。
1 USD = 100 JPY の場合
いろいろ細かく書こうかと思ったけど面倒くさくなったのでまとめだけ。
方法 | 手数料など | 手間 | 備考 | 例 $10000 を円にする場合 | |||||
Citibank Goldアカウント | ドル送金 約$45 受け取り無料 ドル→円 1.00円/$ | ◎ | Goldアカウントとは 10万ドル以上持っている人のみ | ($10000-$45) x 99円 = 985545円 | |||||
HSBC | - | - | 金持ちのみ。未調査 | - | |||||
大黒屋 | 2.00円/$ | ◎ | - | $10000 x 98円 = 980000円 | |||||
国内大手銀行 | 2.70円/$ | ◎ | $10000 x 97.3円 = 973000円 | ||||||
マネーパートナーズ | ドルの送金 約4000円 ドル→円 20銭/$ | × | 口座開設キャンペーンなどで5000円のキャッシュバックあり | ($10000x99.8円)-4000円=994000円 | |||||
ひまわり証券 | ドルの送金 約4000円 ドル→円 20銭/$ | × | 口座開設キャンペーンなどで5000円のキャッシュバックあり | ($10000x99.8円)-4000円=994000円 | |||||
ソニー銀行 | 海外からのドルの送金 約$45 海外からのドルの受け取り $25 ドル→円 20銭/$ | ○ | 安全 | ($10000-$45-$25) x 99.8円 = 991014円 | |||||
Amexのドルのトラベラーズチェック | 手数料1.5% ドルのトラベラーズチェックを東京三菱にて円にするのに、約1.00円/$ | ○ | ($10000x98.5%) x 99円 = 9751500円 | ||||||
Amexの円のトラベラーズチェック(WellsFargoで調査) | 約3.00円/$ | ○ | $10000 x 97円 = 970000円 |
Pthread の排他処理のサンプル
自分用。
- ソース (pthread_mutex.c)
#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #define MAX_THREADS 3 void start_threads(void); void thread_main(void *args); void synchronized_printf(const char* s); static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; static pthread_mutexattr_t mattr; void start_threads(){ pthread_t pt[MAX_THREADS]; int i; // スレッドの作成 for(i=0; i<MAX_THREADS; i++){ pthread_create( &(pt[i]), NULL, &thread_main, &i ); } // joinしておかないとメインスレッドが先に終了してしまう。 for(i=0; i<MAX_THREADS; i++){ pthread_join(pt[i], NULL); } return; } void thread_main(void *args){ int i = *((int *)args); int j=0; while(j++<5){ char s[100]; sprintf(s, "[Thread:%d]", i); synchronized_printf(s); sleep( 1 ); } } void synchronized_printf(const char* s){ #ifdef USE_MUTEX pthread_mutex_lock(&mut); //排他処理のためにロックを取得 #endif printf(">>"); printf("%s", s); sleep( rand()%10 ); printf("<<\n"); #ifdef USE_MUTEX pthread_mutex_unlock(&mut); //排他処理のためにロックを解放 #endif } int main(){ pthread_mutex_init(&mut, &mattr); // mutexの初期化 start_threads(); exit(0); }
排他処理なし $ gcc -Wall -g -lpthread pthread_mutex.c -o pthread_mutex 排他処理あり $ gcc -Wall -g -DUSE_MUTEX -lpthread pthread_mutex.c -o pthread_mutex
- 実行結果(排他処理なし)
各スレッドの出力が入り交じっている。
$ ./pthread_mutex >>[Thread:0]>>[Thread:1]>>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< << >>[Thread:0]>>[Thread:1]<< << >>[Thread:2]>>[Thread:1]<< << >>[Thread:1]>>[Thread:0]<< << >>[Thread:2]<< << >>[Thread:2]>>[Thread:0]<< <<
- 実行結果(排他処理あり)
各スレッドの出力が綺麗にわかれている。
$ ./pthread_mutex >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<<
C言語で、Gratuitous ARPパケットを送信するサンプル
自分用メモ。
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <netdb.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/param.h> #include <sys/sysctl.h> #include <arpa/inet.h> #include <net/if.h> #include <net/if_arp.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <netinet/ether.h> void get_ifinfo(char *devname, struct ifreq *ifreq, int flavor) { int iofd; if ((iofd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("ioctl socket creation"); exit(1); } memset(ifreq, '\0', sizeof(*ifreq)); strcpy(ifreq->ifr_name, devname); if (ioctl(iofd, flavor, ifreq) < 0) { perror("ioctl"); exit(1); } return; } void send_gratuitous_arp(const int ifIndex, const char *devname, const char *ipaddress, const char *src_mac_address, const char *dst_mac_address){ int rawfd; struct ether_arp arpbody; struct sockaddr_ll ll_from, ll_to; struct ether_addr src_mac_addr; struct ether_addr dst_mac_addr; ether_aton_r(src_mac_address, &src_mac_addr); ether_aton_r(dst_mac_address, &dst_mac_addr); arpbody.arp_hrd = htons(ARPHRD_ETHER); arpbody.arp_pro = htons(ETH_P_IP); arpbody.arp_hln = 6; arpbody.arp_pln = 4; arpbody.arp_op = htons(ARPOP_REQUEST); memcpy(&(arpbody.arp_sha[0]), src_mac_addr.ether_addr_octet, ETH_ALEN); //arpbody.arp_sha memcpy(&(arpbody.arp_tha[0]), dst_mac_addr.ether_addr_octet, ETH_ALEN); //arpbody.arp_tha *((int *)&(arpbody.arp_spa[0])) = inet_addr(ipaddress); //arpbody.arp_spa *((int *)&(arpbody.arp_tpa[0])) = inet_addr(ipaddress); //arpbody.arp_tpa ll_from.sll_family = AF_PACKET; ll_from.sll_protocol = htons(ETH_P_ARP); ll_from.sll_ifindex = ifIndex; ll_from.sll_hatype = 0; //ARPHRD_ETHER; ll_from.sll_pkttype = 0; //PACKET_BROADCAST; ll_from.sll_halen = ETH_ALEN; //ll_from.sll_addr = NULL; memcpy(ll_from.sll_addr, src_mac_addr.ether_addr_octet, sizeof(src_mac_addr.ether_addr_octet)); ll_to.sll_family = AF_PACKET; ll_to.sll_protocol = htons(ETH_P_ARP); ll_to.sll_ifindex = ifIndex; ll_to.sll_hatype = 0; //ARPHRD_ETHER; ll_to.sll_pkttype = 0; //PACKET_BROADCAST; ll_to.sll_halen = ETH_ALEN; //ll_to.sll_addr = NULL; memcpy(ll_to.sll_addr, dst_mac_addr.ether_addr_octet, sizeof(dst_mac_addr.ether_addr_octet)); if ((rawfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ARP))) < 0) { perror("raw socket creatin"); exit(1); } if (bind(rawfd, (struct sockaddr *)&ll_from, sizeof(ll_from)) < 0) { perror("bind"); exit(1); } int size=0; if ( (size = sendto(rawfd, (void *)&arpbody, sizeof(struct ether_arp), 0, (struct sockaddr *)&ll_to, sizeof(ll_to))) <= 0) { perror("write"); exit(1); } } int main(int argc, char **argv){ int ifindex = 0; char *devname = "eth0"; char *ipaddr = "10.0.7.1"; char *src_macaddr = "00:12:34:56:78:9a"; char *dst_macaddr = "00:00:00:00:00:00"; struct ifreq ifreq; memset(&ifreq, '\0', sizeof(ifreq)); //ifindex get_ifinfo( devname, &ifreq, SIOCGIFINDEX); ifindex = ifreq.ifr_ifindex; send_gratuitous_arp(ifindex, devname, ipaddr, src_macaddr, dst_macaddr); return 0; }
C言語でNICの情報を取得するサンプル
eth0 の IPアドレス、MACアドレス、ifIndexを取得するサンプル。自分用メモ。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> void get_ifinfo(char *devname, struct ifreq *ifreq, int flavor) { int iofd; if ((iofd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("ioctl socket creation"); exit(1); } memset(ifreq, '\0', sizeof(*ifreq)); strcpy(ifreq->ifr_name, devname); if (ioctl(iofd, flavor, ifreq) < 0) { perror("ioctl"); exit(1); } return; } int main(int argc, char **argv) { struct ifreq ifreq; char *devname = "eth0"; struct sockaddr_in saddr; //IP address get_ifinfo( devname, &ifreq, SIOCGIFADDR); memcpy(&saddr, &(ifreq.ifr_addr), sizeof(saddr)); printf("%s\n", inet_ntoa(saddr.sin_addr)); //MAC address get_ifinfo( devname, &ifreq, SIOCGIFHWADDR); printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)ifreq.ifr_hwaddr.sa_data[0], (unsigned char)ifreq.ifr_hwaddr.sa_data[1], (unsigned char)ifreq.ifr_hwaddr.sa_data[2], (unsigned char)ifreq.ifr_hwaddr.sa_data[3], (unsigned char)ifreq.ifr_hwaddr.sa_data[4], (unsigned char)ifreq.ifr_hwaddr.sa_data[5]); //ifIndex get_ifinfo( devname, &ifreq, SIOCGIFINDEX); printf("%d\n", ifreq.ifr_ifindex); return 0; }
3つのプログラミング言語での syslog の使い方メモ
- C
#include <stdlib.h> #include <syslog.h> int main(int argc, char** argv){ openlog(argv[0], LOG_PID|LOG_PERROR, LOG_LOCAL0); syslog(LOG_INFO, "foo: %d", 123); closelog(); exit(EXIT_SUCCESS); }
#!/usr/bin/perl use strict; use warnings; use Sys::Syslog; sub EXIT_SUCCESS{0} openlog(__FILE__, 'pid,perror', 'local0'); syslog('info', "foo: 123" ); closelog; exit(EXIT_SUCCESS);
#!/usr/bin/python import sys import syslog def main(): syslog.openlog(sys.argv[0], syslog.LOG_PID|syslog.LOG_PERROR, syslog.LOG_LOCAL0) syslog.syslog(syslog.LOG_INFO, 'foo:%s' %(123,)) syslog.closelog() sys.exit(0) if __name__ == "__main__": main()
3つのプログラミング言語での getopt の使い方メモ
C、Perl、Python でのgetoptのサンプル。
とりあえず、help, version, user, password の4つのオプションを指定できるようにした。
- 使い方
% my_getopt --help % my_getopt -h % my_getopt --version % my_getopt -v % my_getopt --user=foo --password=abc % my_getopt -ufoo -pabc % my_getopt --user=foo -pabc
のような感じ。短縮形での指定も可能。
helpを指定した場合には、usage を表示して終了。 version を指定した場合は、バージョン情報を表示して終了。 user とpassword を指定した場合は、その値を表示して終了。
- C
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <getopt.h> static char *user=NULL; static char *password=NULL; void usage(){ printf("Usage: my_getopt --user=<USERNAME> --password=<PASSWORD>\n"); } void version(){ printf("Version 0.0.1\n"); } int main(int argc, char** argv){ int c; while(1){ static struct option long_options[] = { {"user", required_argument, 0, 'u'}, {"password", required_argument, 0, 'p'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, {0,0,0,0} }; int option_index = 0; c = getopt_long( argc, argv, "u:p:hv", long_options, &option_index); if( c==-1 ) break; switch(c){ case 'u': user = (char *)malloc( sizeof(char) * (strlen(optarg)+1) ); strncpy( user, optarg, strlen(optarg)+1 ); break; case 'p': password = (char *)malloc( sizeof(char) * (strlen(optarg)+1) ); strncpy( password, optarg, strlen(optarg)+1 ); break; case 'v': version(); exit(EXIT_SUCCESS); case 'h': default: usage(); exit(EXIT_SUCCESS); } } if( !(user && password) ){ usage(); exit(EXIT_FAILURE); } printf ("user: %s\n", user); printf ("password: %s\n", password); exit(EXIT_SUCCESS); }
#!/usr/bin/perl use strict; use warnings; use Getopt::Long; my $user; my $password; my $help; my $version; GetOptions('user=s' => \$user, 'password=s' => \$password, 'help' => \$help, 'version' => \$version, ); if($help){ usage(); exit(0); } if($version){ version(); exit(0); } unless($user && $password){ usage(); exit(-1); } print <<"END_OF_BODY" \$user: $user \$password: $password END_OF_BODY ; sub usage{ print 'perl my_getopt.pl --user=<USERNAME> --password=<PASSWORD>', "\n"; } sub version{ print 'Version: 0.0.1', "\n"; }
#!/usr/bin/python import getopt import sys def usage(): print 'python my_getopt.py --user=<USERNAME> --password=<PASSWORD>' def version(): print 'Version: 0.0.1' def main(): user=None password=None try: opts, args = getopt.getopt(sys.argv[1:], "u:p:hv", ["user=","password=","help", "version"]) except getopt.GetoptError: usage() sys.exit(2) for o, a in opts: if o in ("-h", "--help"): usage() sys.exit() if o in ("-v", "--version"): version() sys.exit() if o in ("-u", "--user"): user = a if o in ("-p", "--password"): password = a if(user==None or password==None): usage() sys.exit(2) print "user:%s" % (user,) print "password:%s" % (password,) sys.exit(0) if __name__ == "__main__": main()
Pythonでprefork型のデーモンを書く
Pythonのお勉強を兼ねて、先日 Cで書いた C言語でprefork型のデーモンを書く(3): デーモン化 - Sleepless geek in Seattle をPythonに移植してみた。
条件分岐、ループ、関数定義、ファイル操作、fork、wait、シグナルハンドラ、連想配列、などなど短いプログラムだけど、いろいろな要素が入っているのでなかなか良いサンプルになった。
#!/usr/bin/env python import os import sys import signal import time MAX_CHILDREN=16 PID_FILE='/var/run/my_prefork_daemon.pid' hash_children={} def main(): #デーモン化 daemonize() #プロセスIDを書いておく write_pid() #シグナルハンドラの登録 signal.signal(signal.SIGTERM, kill_all_children ) # 親プロセスのループ # 子プロセスを監視して、子が死んだらすぐに新しい子プロセスを作成する while True: while len( hash_children )>=MAX_CHILDREN: child_pid = os.wait() del( hash_children[child_pid] ) pid = os.fork() if pid == 0: signal.signal( signal.SIGTERM, lambda sig,status:sys.exit(0) ) break else: #ハッシュテーブルに子プロセスのプロセスIDを保存しておく hash_children[pid]=1 time.sleep(0.1) # 子プロセスのループ while True: #ここがメインルーチンになる。 time.sleep(1) def kill_all_children(sig, status): for pid in hash_children.keys(): os.kill( pid, signal.SIGTERM ) os.exit(0) def write_pid(): f = open(PID_FILE, mode='w'); f.write("%d" % os.getpid()) f.close() def daemonize(): os.chdir("/") try: pid = os.fork() if pid > 0: sys.exit(0) except OSError, e: raise Exception, "%s [%d]" % (e.strerror, e.errno) os.setsid() os.umask(0) sys.stdin = open('/dev/null', 'r') sys.stdout = open('/dev/null', 'w') sys.stderr = open('/dev/null', 'w') if __name__ == "__main__": main()
参考
C言語でprefork型のデーモンを書く(1): 非デーモン prefork サンプル - Sleepless geek in Seattle
C言語でprefork型のデーモンを書く(2): 非デーモン prefork シグナルハンドラ付き - Sleepless geek in Seattle
C言語でprefork型のデーモンを書く(3): デーモン化 - Sleepless geek in Seattle
C言語でprefork型のデーモンを書く(4): init スクリプト - Sleepless geek in Seattle