みちのいに!!

自分のメモと、他にもハマる人がいそうなことを書く

BigQuery Write API を Python で

BigQuery Write APIはBigQueryにストリーミングでデータを突っ込む新しい(まだ正式版ではない)APIです。無料枠が月1TBと既存のinsertAllよりも太っ腹です。 gRPCでProtocolBufferを送りつけています。

cloud.google.com

まだJavaのサンプルしか公式サイトにない(2021-08-15時点)ので、Pythonのサンプルを書きました。

続きを読む

LinuxでUSB接続のAudioインターフェイスから音が出ない

表題の通り 忘れないうちに取り急ぎ

OSはArchLinux

認識されているのか?

$ cat /proc/asound/modules
0 snd_hda_intel
1 snd_hda_intel

snd_usb_audioが出力されるはずですがされていません.

dmesgをしてみても,

cannot find the slot for index 0 (range 0-1)

とエラーが出ています.

対処

/etc/modprobe.d/alsa-base.confに優先順位を設定します.snd_hda_intelが2つあって区別ができないので,Vendor IDを指定します.

Vendor ID はlspci -nnのさいごの[8086:aa3e]の8086の部分です.

/etc/modprobe.d/alsa-base.conf

options snd slots=snd-usb-audio,snd-hda-intel
optioins snd-hda-intel index=1,2 vid=8086,10de
options snd-usb-audio index=0

indexが0に近いほうが優先になります.

Nimでintの累乗が実は ^ で出来る話

プログラミングに慣れている人ほど引っかかりそう.

Nimで累乗計算するときはmathモジュールをインポートします.

mathモジュール内には累乗に関する以下の3つの函数が定義されています.

proc `^`*[T](x: T, y: Natural): T 
proc pow(x, y: float32): float32
proc pow(x, y: float64): float64

指数が自然数の場合は^を使いましょう.

以下雑感

続きを読む

Nimをnodejsにコンパイルして競技プログラミングした

こんにちは 最近Nimで競技プログラミングをすることにハマっています.

準備

Nimとは?

プログラミング言語です.Pythonライクな文法で気軽に書けます.C言語を介してバイナリを吐くので実行時間はとても早いです.JavaScriptも吐くことができます.

競技プログラミングとは?

問題をプログラミングで解くコンテストです.国内のコンテストサイトには Atcoder, Aizu Online Judge(AOJ), yukicoder, paizaなどがあります.

背景

  • AOJを解こうとしたらNimが使えなかった.
    • ちなみにAtcoderとyukicoderでは使えます.
  • どうしてもNimで書きたかった.
  • Nimの良さの一つは早いことだがこの際仕方ない.JavaScriptで吐いて提出しよう.

解説

普通に解いてコンパイルして投げるだけと思いきや,JavaScriptに吐くときはstdinが使えません.この点だけ注意します.

AOJ 1000 A + B Problem を例に解説します.問題自体は足すだけです.

1.普通にNimで解く

普通に解きます. ただし,NimのstdinはCのstdio.h由来であるため,JSにコンパイルするときは利用できません.そこで,以下のように入力を受け取るmain函数を作ります. mainの引数には適当にテスト用の文字列でも埋め込んでください.

import strutils, sequtils

proc main(inputLines:string): void=
  var 
    input = inputLines.split('\n')
  for line in input:
    var 
      tmp = line.split.map(parseInt)
      a = tmp[0]
      b = tmp[1]
    echo a+b

main("4 6\n3 1\n2 1")

2. JavaScriptコンパイルする

$ nim js -d:nodejs -o:aoj1000.js aoj1000.nim

aoj1000.jsが出力されます.

3. JavaScriptのファイルを編集する

ファイルを開くとやたら長いコードが出てきますが,一番下までスクロールします. すると,

main_53001(makeNimstrLit("4 6\x0A3 1\x0A2 1"));

という部分が一番下にあります.

この部分を標準入力を読み込むように改変します.

ここでは,http://koturn.hatenablog.com/entry/2016/02/04/050000 を参考にしました.

(function() {
  'use strict';
 
  var lines = [];
  require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  }).on('line', function(line) {
    lines.push(line);
  });
  process.stdin.on('end', function() {
    main_53001(makeNimstrLit(lines.join("\x0A")));
  });
})();

4 完成

完成です.ファイルを全部コピーして提出します.

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=2961239#1

シェルにアスタリスク入れたらファイル一覧が出てきた

きっかけ

dotfiles(設定ファイルをGitHubに置いてどこでもマイ環境を構築できるスクリプト)を作ろうと思い,他人の設定を参考にしていたときに目にしたShell Scriptがこちら

cd ${DOT_DIRECTORY}

for f in .??*
do
  [[ ${f} = ".git" ]] && continue
  [[ ${f} = ".gitignore" ]] && continue
  ln -snfv ${DOT_DIRECTORY}/${f} ${HOME}/${f}
done

.??* ってなんだ?????????? どっと はてな はてな あすたりすく????????

続きを読む

GASでMastodonの投稿をTwitterに1分おきに同期する

2018-08-16追記: フォロワーのみ,Directは同期しないように変更 そのへんをいじりたい時は47行目あたりをいい感じに

目的

Mastodonの投稿を高頻度でTwitterに同期したい できれば無料で

おおまかな手順

  1. GASにプログラムをコピペする
  2. Twitterのアクセストークン,Mastodonのアクセストークンを取得する
  3. ライブラリを追加する
  4. 認証する
  5. トリガーを設定して1分おきに同期するようにする
続きを読む

JavaScriptで手っ取り早く64bit符号なし整数文字列の大小関係を比較

JavaScriptが53bitまでしか整数をまともに扱えないのはよく知られた話です.

JavaScriptの整数の精度が保たれるのは9007199254740991まで - Qiita

Twitterからのレスポンスは

id_str:'12345678765543212345'

のように文字列でJSONが降ってきます.

これをそのまま大小関係を比較するのはよくありません.

javascript 文字列のまま数字を比較すると危険が危ない。 - かもメモに詳しいように

'99'<'100' // false

となります.

しかし64bit整数は数値に変換しても不正確になるジレンマがあります.

そこで,

// ES5版
const pad0 = function(num){return ('00000000000000000000'+num).slice(-20)}
// ES6版
const pad0 = num => ('0'.repeat(21)+num).slice(-20)

pad0('99')<pad0('100') // true

という強引な解決策を提案します

'99'>'100'となる理由は桁が揃ってないから起こるのであり,桁を揃えてしまえばいいのです.