:echo webapi#json#decode(webapi#http#get("http://tanzak.herokuapp.com/api", {"q": "カッコイイVimmerになれますように"}).content).c
┏┷┓
┃ ┃
┃カ┃
┃ッ┃
┃コ┃
┃イ┃
┃イ┃
┃V┃
┃i┃
┃m┃
┃m┃
┃e┃
┃r┃
┃に┃
┃な┃
┃れ┃
┃ま┃
┃す┃
┃よ┃
┃う┃
┃に┃
┃ ┃
┗━┛
:echo webapi#json#decode(webapi#http#get("http://tanzak.herokuapp.com/api", {"q": "カッコイイVimmerになれますように"}).content).c
┏┷┓
┃ ┃
┃カ┃
┃ッ┃
┃コ┃
┃イ┃
┃イ┃
┃V┃
┃i┃
┃m┃
┃m┃
┃e┃
┃r┃
┃に┃
┃な┃
┃れ┃
┃ま┃
┃す┃
┃よ┃
┃う┃
┃に┃
┃ ┃
┗━┛
断続的にデータを受けながら並行で時間差リアクションを行う - すぎゃーんメモちょっと動きは違うんだけど、こういうパターンもあるよねー。という事で。
断続的にデータを受けながら並行で時間差リアクションを行う Go はじめて、の次のGo - すぎゃーんメモ にて作った go-genki-bot 、UserStreamから Tweet 取得して返信する...
http://d.hatena.ne.jp/sugyan/20140705/1404493007
package main
import (
"bufio"
"fmt"
"os"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
queue := make(chan rune, 5)
t := time.AfterFunc(-1, func() {
// ある分だけ読み込む
leave: for {
select {
case r := <-queue:
fmt.Println("recv", string(r))
case <-time.After(100 * time.Millisecond):
// 100ms 読めなかったら諦める
break leave
}
}
})
// タイマーは止めておく
t.Stop()
in := bufio.NewReader(os.Stdin)
for {
// 何かキー入力
r, _, err := in.ReadRune()
if err != nil {
break
}
// LFはいらない
if r == 0x0A {
continue
}
// タイマーを活性化(3秒後)
t.Reset(3 * time.Second)
// タイマーに読んで貰う為に入力したキーをchanで送信しておく
queue<-r
}
}
入力を得たらタイマーを活性化する。タイマーは一つしか使わなくて、データが来るたびに更新するのでデータが最後の入力から3秒間何も更新がなければ発動する。タイマーは発動すると100ms内に見つかった分だけ抜き取って表示。
$ go run jisa.go
あ
recv あ
あいうえ
recv あ
recv い
recv う
recv え
この手法は gof の画面表示部分で使われていて、連続するキー入力に対して毎回描画を行っていると画面がチラ付くという問題を回避出来る。Golang でコマンドライン Fuzzy Finder 「gof」作った。 - Qiita
この記事は Go Advent Calendar 2013 の 10 日目の投稿です。 はじめに 業務のツールや連携させる一部の機能として golang を使い出している方もチラホラ現れ始めました。 ...
http://qiita.com/mattn/items/edea1be5a6d84663ab8b
Go Advent Day 19 - Eject the Web - The Gopher Academy Blog
Other Articles Next article Go Advent Day 20 - Go in Academia: Emulating Wireless Networks Previous ...
http://blog.gopheracademy.com/day-19-eject-the-web
Big Sky :: clib の使い勝手にマジ感動した
C言語でアプリケーションを書くのは他の言語と比べて少し気合が必要ですよね。例えば HTTPからデータを取得する 取得したデータを json パースする 結果の一部を色付きで表示する こんな場合、C言語...
http://mattn.kaoriya.net/software/lang/c/20140627222830.htm
mattn/locale-string.c - GitHub使い方は簡単。
https://github.com/mattn/locale-string.c
setlocale(LC_CTYPE, "");
const char* ptr = "こんにちわ世界";
char* mbs = utf8_to_locale_alloc(ptr);
assert(NULL != mbs);
char* utf8 = utf8_from_locale_alloc(mbs);
assert(NULL != utf8);
assert(0 == strcmp(ptr, utf8));
使い終わったら free が必要。utf8_to_locale_alloc で utf-8 文字列をロケール文字列へ、utf8_from_locale_alloc でロケール文字列から utf-8 へ変換します。
#ifdef _WIN32
# define UTF8_ALLOC(p) utf8_from_locale_alloc(p)
# define UTF8_FREE(p) free(p)
# define LOCALE_ALLOC(p) utf8_to_locale_alloc(p)
# define LOCALE_FREE(p) free(p)
#else
# define UTF8_ALLOC(p) (p)
# define UTF8_FREE(p)
# define LOCALE_ALLOC(p) (p)
# define LOCALE_FREE(p)
#endif
Windows 以外ならばメモリ確保も解放も行いませんので、UTF8_ALLOC して使い終わったら UTF8_FREE しておくと UNIX でも Windows でも同じ様に動作する、という仕組みです。mattn/wcwidth.c - GitHub
https://github.com/mattn/wcwidth.c
assert(14 == string_width("こんにちわ世界"));
assert(20 == string_width("こ★ん■に●ち▲わ☆世◆界"));
assert(26 == string_width_cjk("こ★ん■に●ち▲わ☆世◆界"));
こんな感じに使います。mattn/ansicolor-w32.c - GitHubそこで ansicolor-w32.c というのを書きました。
https://github.com/mattn/ansicolor-w32.c
ansicolor-w32.h を include すると、エスケープシーケンスを解析して Windows でも色付けで表示してくれます。
#include <stdio.h>
#ifdef _WIN32
# include "ansicolor-w32.h"
#endif
int
main(int argc, char* argv[]) {
printf("\x1b[2J\x1b[10,10H\x1b[24m\x1b[30m");
printf("\x1b[42m博\x1b[43m多\x1b[46mの\x1b[45m塩\x1b[0m");
return 0;
}
例えばこんなコードを書いて実行すると
この様に表示されます。![]()
このブログを応援する