Yuki Nakata's Blog

One color just reflects another

linuxにプログラマー用のフォントM+をインストールしよう

M+はシンプルで見やすい。これでいいです。

もう面倒くさいのでそのままそっくりコピペしておきます。


$sudo mkdir -p /usr/share/fonts/truetype/mplusipa

$wget http://jaist.dl.sourceforge.jp/mix-mplus-ipa/25997/mixfont-mplus-ipa-TrueType-20060520p1.tar.bz2

$tar jvxf mixfont-mplus-ipa-TrueType-20060520p1.tar.bz2

$cd mixfont-mplus-ipa-TrueType-20060520p1/opfc-ModuleHP-1.1.1_withIPAFonts_and_Mplus/fonts

$sudo cp *.ttf /usr/share/fonts/truetype/mplusipa

$sudo fc-cache -v  *.ttf

$sudo mkfontdir

$xset xp rehash

$fc-list


これでフォントのインストールの仕方も理解できました。

/usr/share/fonts/ 以下にttfをぶっこんで、登録すればいいんですね。


参考サイト
Ubuntu Linux 8.04 

いやー健康って大切です。年を取るにつれて実感するようになりました。

もう何があってもおかしくない年齢ですからね。

最近マインドフルネスというワードが注目を集めています。遅すぎかもしれませんが。

GoogleのようなIT企業が取り入れているわけですね。

人間のパフォーマンスを高めることができるようになります。

誰でも実践できます、しかも無料で。

石川善樹さんの動画が素晴らしいので張り付けておきます。


絶対見るべき。12分。以外な結末でした。

以下石川善樹さんのマインドフルネス動画4本

 
 

 

 

マインドフルネスは姿勢や呼吸を正す、睡眠時間をちゃんと取る、とか誰でもできる、ところが良いですね。

今後も要注目です。 

たまにはプログラミングでもしてみまっか。

linuxユーザーでしたらwgetを使ったことがあると思います。

mywgetを作ってみましょう。30分コースです。

ネットワークプログラミングなわけですが、socketを使います。

普通linuxでファイルを扱うときにはopenしてread, writeします。socketはそのネットワーク版です。

socketを使うとネットワーク越しにread, writeできるわけです。linuxでは何でもファイル扱いです。

ハガキを送ることを考えてみましょう。相手の住所と名前が必要です。

socketの場合にはIPアドレスとポート番号が必要です。

yahoo.co.jpなどのドメインはgethostbyname関数一発でIPアドレスに変換できます。

ポート番号は80で固定です。


あとは普通アドレスはhttp://なんちゃらという形をしています。

これはhttpプロトコルを使うよ、ということです。

httpプロトコルではGETコマンドを送るとデータを返してくれるようになっています。

ネットワークプログラミングといってもこんなもんです。

さっそくソースコードを見てみましょう。
/* mywget

./mywget http://xxx/aaa.html
html, htm, zip, jpg, gifなどのようにファイル名を指定してください。

./mywget http://xxx/aaa/
スラッシュで終わる場合にはファイル名の関係からエラーになるようにしています。

*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netdb.h>
#include<unistd.h>
#include<fcntl.h>


#define BUF_LEN 1024

int main(int argc, char *argv[])
{
int fd;
int s;
int i = 0;
long int diff = 0;
char *p;
char host[BUF_LEN];
char path[BUF_LEN];
char filename[BUF_LEN];

char host_path[BUF_LEN];
char send_buf[BUF_LEN];

struct hostent *servhost;
struct sockaddr_in server;
unsigned short port = 80;

if (argc != 2) {
printf("URLを指定してください。\n");

return -1;
}

if (strstr(argv[1], "http://") && sscanf(argv[1], "http://%s", host_path)) {
p = strchr(host_path, '/');

if( p != NULL) {
strcpy(path, p);
*p = '\0';
}

strcpy(host, host_path);

p = strrchr(path, '/');
if(p != NULL) {
strcpy(filename, ++p);
} else {
strcpy(filename, path);
}
} else {
printf("URLはhttp://host/pathの形式で指定してください。\n");
return -1;
}

printf("\nhost = %s\n", host);
printf("path = %s\n", path);
printf("filename = %s\n", filename);

servhost = gethostbyname(host);
if(servhost == NULL) {
printf("[%s]からIPアドレスの変換に失敗しました。\n", host);
return -1; 
}

printf("IP Address %d.%d.%d.%d\n", (u_char)servhost->h_addr[0], (u_char)servhost->h_addr[1], (u_char)servhost->h_addr[2], (u_char)servhost->h_addr[3]);
bzero(&server, sizeof(server));

server.sin_family = AF_INET;

bcopy(servhost->h_addr, &server.sin_addr, servhost->h_length);

server.sin_port = htons(port);
 
/* ソケット生成 */
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("ソケットの生成に失敗しました。\n");
return -1;
}

/* サーバーに接続 */
if ( connect(s, (struct sockaddr *)&server, sizeof(server)) == -1) {
printf("connectに失敗しました\n");
return -1;
}

/* httpプロコトル コマンド送信 */
sprintf(send_buf, "GET %s HTTP/1.0\r\n", path);
write(s, send_buf, strlen(send_buf));

sprintf(send_buf, "Host: %s:%d\r\n",  host, port);
write(s, send_buf, strlen(send_buf));

sprintf(send_buf, "\r\n");
write(s, send_buf, strlen(send_buf));

fd = open(filename, O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
if (fd < 0) {
printf("open error\n");
return -1;
}

p = NULL;
while(1) {
char buf[BUF_LEN];
int read_size;

read_size = read(s, buf, BUF_LEN);

if (read_size > 0) {
if( i == 0) {
if(strstr(buf, "200") && strstr(buf, "OK")) {
p = strstr(buf, "\r\n\r\n");
if ( p != NULL) {
diff = p - buf;
p += 4;
write(fd, p, read_size - diff - 4);
}
} else {
break;
printf("http error\n");
}
} else {
write(fd, buf, read_size);
}
} else {
break;
}
i++;
}
close(fd);
close(s);
return 0;


return 0;
}

面倒くさいのがGETコマンドを送るとレスポンスヘッダ(ゴミ)とデータ(これが欲しい)を返してきます。

レスポンスヘッダとは問題ないよ、とか時刻とかファイルサイズとかファイルタイプ(jpgだよー)とかから構成されています。

レスポンスヘッダとデータを一緒に送ってきます。なのでレスポンスヘッダとデータを分離する必要があります。

それがwhile文の中のi = 0のときの処理です。

"\r\n\r\n"がレスポンスヘッダの終わりのしるしなので、それ以前を除去しています。

愛着のあるmywgetを使いましょう、ということです。

ネットワークプログラミング 続きます。



 

前回は家のネット環境をADSLからeo光にしました。を書きました。続きです。

無線電波が弱かったので、NECのAterm WG1800HP2を使って中継してみました。

ネットで中継方法を調べましたが、説明が下手くそ。しかもたらい回しにされますよ。

簡単一発。一番簡単な方法を書いています。

 これがNECのWG1800HP2ルーター。他の無線ルーターでも中継できると思います。

1. まず全部のコードを抜きます。電源も切ります。

2. 背面のスイッチをCNVに合わせます。

3. LANポートにLANケーブルを接続し、もう片方をPCのLANポートに接続します。
 つまりルーターとPCを有線接続します。
   WANポートには何も繋ぎません。


今、この状態。

4. らくらくスタートボタンを押しながら、電源を入れます。

5. らくらくスタートボタンを押し続けると、CONVERTERランプが緑色に点滅します。点滅したら、らくらくスタートボタンを離します。

6. PCのブラウザからhttp://192.168.1.245 にアクセスします。ルーターにログインできるはず。
 もしできなければ、ここまでが間違っています。やり直し。

7. 初回時であれば管理者パスワードを決定します。自分で忘れないパスワードを設定しましょう。

8.  WIFI設定します。基本設定からWIFI設定を選びます。
wifi_1800hp2_1
 Wi-Fi TVモード中継にチェックを入れてWifi設定。スマホやPCでWifi設定するのと同じです。

アクセスポイント検索をクリックすると親機のSSIDを拾うと思います。中継器から親機のSSIDに接続し、パスワードを入れます。

そうすることで中継器( WG1800HP2)が親機の電波を増幅し、飛ばしてくれるようになります。

 
簡単におさらいすると、ルーターを中継モードにして、親機にWifi設定する、です。 

一応、正式なリンクを張っておきます。

クイック設定Webの使いかた(中継機または子機としてご使用のとき)


子機WG1800HP2からWi-Fi接続する

ついに我が家も光ファイバになりました。

ずっとADSLだったんですが、今年の6月末でサービスが終わりになるのでeo光に切り替えました。

ADSLは月2000円程度で安かったです。戸建てなので光に変更すると倍以上の値段になります。


何度か速度測定してみましたが、こんなもの。11acの方です。下り70Mbpsです。


次は11n。40Mbps。案外健闘しているように思います。

ADSL時代は7Mbpsでした。速度10倍ぐらいにはなっています。


光の恩恵を受けるためには端末側の無線機能が11acに対応している必要があります。

これからスマホやPCを購入する場合には11ac対応しているのを買うべきでしょう。



設置されたeo光の無線内蔵モデムがこれ。

お世辞にも無線機能が強くない。

1Fにモデムが設置されているのですが、2Fの書斎になると無線が届かないレベル。

NECの無線ルーターを持っているので、中継してみました。

Aterm WG1800HP2を使って無線中継をしました。 続きます

コンピューター将棋選手権 2016はすごかったですね。

ponanza が優勝しましたが、技巧も凄かった。


予選。憎たらしいほど強いPonanza が一方的に敗れる。

決勝戦。

神々達はなんというか自由に楽しそうに将棋を指しています。笑

もしかしたら10年後には穴熊や矢倉は消滅しているかもしれませんよ。

もはや人間はお呼びでないですね。

私の応援している平岡さんは4位でした。

わんさかいるAperyチルドレンも活躍しました。

そのせいで、Awakeが予選落ちになる事態に。

たった一年でコンピューター将棋界の景色が変わりました。

なんと技巧はソースコードを公開するようです。

大チャンスです。

本気でやれば来年にはトップレベルを目指せるかもしれませんよ。






 

youtube
Youtube APIを使って検索してみよう。

LOVE802 でもYoutube APIを使っています。

YoutubeのAPIが公開されています。いろんな機能があるんですが、検索してみましょう。

プログラミング言語PHPを使っています。あとAPIを利用するのにYoutube のキーが必要になります。

世界一簡単な説明です。15分コース。

 Google API Console を開きプロジェクトを作成します。

createproject
プロジェクトを作成します。

youtube1
Youtube Data APIをクリック。最初は全てAPI機能がオフになっています。使うAPIを有効にしなければなりません。

youtube2
もちろん有効にするをクリック。

youtube3
認証情報に進むをクリック。
youtube4

ウェブブラウザにして、一般公開データにチェック。 
必要な認証情報をクリック。

 youtube5
名前はそのままでもいいです。APIキーを作成する。をクリック。

次の画面でAPIキーが表示されるはずです。そのキーが必要。

 であとは、PHPでプログラムを作ります。

たった5行です。

"かわいい 猫"でyoutube動画を検索しています。keyにあなたのキーを張り付けてください。

<?php
  mb_internal_encoding("UTF-8");
  $key = "Your Youtube Key";
  $query = urlencode("かわいい")."+".urlencode("猫");
  $xml = file_get_contents("https://www.googleapis.com/youtube/v3/search?part=snippet&q=".$query."&key=".$key);
  print($xml);
?> 

$xmlにAPIの結果が返ってきますので、ごにょごにょやって好きにデータを利用してください。 

Youtube API Search 

↑このページのトップヘ