PythonでI2Cを使う際のコマンドをまとめた

趣味が趣味なので,Raspberry piPythonで I2 Cを使うことが多い.

しかしいつもコマンドを忘れるので,自分のメモ用として今回の記事を書きます.

実際にRaspberry piでI2 Cを使う際の設定なども書いていきます.

実行環境としては Raspberry pi 3 + Python 3.6.0 です.

Raspberry pi側の設定

まずはPythonのI2 Cライブラリをインストール

$ sudo apt-get update
$ sudo apt-get install i2c-tools

これでとりあえずPythonのI2 Cを使用するライブラリをインストールします.

そもそも最初の状態ではRaspberry piはI2 Cを使用することができないので,設定画面から有効にする.

そのためにはまず,

$ sudo raspi-config

Raspberry piの設定画面を開きます.

f:id:flying_hato_bus:20170802193218p:plain

ここの 5.Interfacing Optionを選択.すると,色々なものを有効/無効化するところに遷移するので.この先の P5 I2Cを選択

f:id:flying_hato_bus:20170802193310p:plain

この先で色々聞いてくるので,適当に enable ってすればおkです.

最後に Pythonで I2 C-busをコントロールするためのライブラリである 「Python-smbus」をインストールします.

 $ sudo apt-get update
 $ sudo apt-get install python-smbus

これで一通りRaspberry pi でI2 Cを制御できるようになりました.

多分これで sudo i2cdetect -r -y 1などを打つと,下のような表示がされるようになるはずです.ダメだった場合,1の部分を0に変えてみてください.

$ sudo i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

こんな画面が出てくれば大丈夫です.この画面は,実際にI2 Cデバイスが接続された際,アドレスが表示されます.

例)

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- 64  -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

この場合,アドレスは 0x64になります.

本題

と言うわけでリファレンスから抜粋,下のカッコでざっくりと和訳しています.

long write_quick(int addr)

Send only the read / write bit (読み取り/書き込みビットだけを送信)

long read_byte(int addr)

Read a single byte from a device, without specifying a device register. (デバイスレジスタを指定せずに、デバイスから1バイト読み出し)

long write_byte(int addr,char val)

Send a single byte to a device. (1バイトデバイスに送る.)

long read_byte_data(int addr,char cmd)

Read Byte Data transaction. (トランザクションデータをデバイスから読み出す)

long write_byte_data(int addr,char cmd,char val)

Write Byte Data transaction. (トランザクションデータを書き出す)

long read_word_data(int addr,char cmd)

Read Word Data transaction. (トランザクションデータを読む)

long write_word_data(int addr,char cmd,int val)

Write Word Data transaction. (ワードトランザクションデータを書き出し)

long process_call(int addr,char cmd,int val)

Process Call transaction. (プロセスを呼び出す)

long[] read_block_data(int addr,char cmd)

Read Block Data transaction. (ブロックデータトランザクションを読み取り.)

write_block_data(int addr,char cmd,long vals[])

Write up to 32 bytes to a device. This fucntion adds an initial byte indicating the length of the vals array before the valls array. Use write_i2c_block_data instead! (デバイスに最大32バイトを書き込み.ただしこの関数は,val配列の前にvals配列の長さを示す最初のバイトを追加する必要がある.代わりにwrite_i2c_block_dataを使用しなければいけない)

long[] block_process_call(int addr,char cmd,long vals[])

Block Process Call transaction.
(プロセス・コール・トランザクションをブロック.)

I2C Access Functions

long[] read_i2c_block_data(int addr,char cmd)

Block Read transaction. (トランザクションデータをブロックで読み出し)

write_i2c_block_data(int addr,char cmd,long vals[])

Block Write transaction. (トランザクションデータをブロックで書き出し)

なんか絶対和訳を間違っている気がします.(気にしない)

何か間違いがあった場合,コメント等で教えてもらえると幸いです.

たまには真面目にPythonのお話をしてみる

どうもはとバスです.最近めちゃくちゃ暑くてかないませんね.

最近,トランプとデートした話や,エアコンが部屋になくてIQがマイナスに振り切れてるようなブログの記事を書いていて,さすがに友人たちに頭を疑われ,父親心療内科の受診と実家での休養を勧められたので,今日は真面目にブログを書きます.

Pythonのリスト内包表記と辞書内包表記

Pythonでよく言われるのが「速度」

速さが足りない!

f:id:flying_hato_bus:20170715003537p:plain

そう,速さが足りません.

Pythonはインタプリンタで一行ずつの処理をしているわけで,圧倒的に遅いという悲しい性を持っています.それに加えてfor文などは,一度リストを作成し,それを参照することでループをさせています.つまり,大きいリストを作れば作るほど,実行には時間がかかります.

それを一発で解決するのが今回お話をするリスト内包表記と辞書内包表記,for文の中で,新たにリストを作成する時,これらを使うとプログラムを短く,かつ速くすることができます.

普通のforループで,偶数だけを要素とするリストを作成する.
hoge=[]

for i in range(5000):
    if i%2 == 0:
        hoge.append(i)

print(hoge)

やっていることは,

最初に0から5000までのリストを作り,その要素の一つを変数 i と置く.

そのiを2で割って,0になるかどうかで判定.

0になった場合,リストに追加する.

ただこれだけ.

Cで書くとこんな感じ.

int i,j=0,huga[5000];

for(i=0;i<5000;i++){
    if(i % 2 == 0) {
        huga[j] = i;
        j++;
    }
}

Pythonでこれを実行すると遅くなる理由が二つある.

  1. 条件を満たす度にリストオブジェクトのappendを参照する

  2. appendをそもそもpythonの関数として呼び出している.

この二つです.この二つがこのループを遅くさせている原因なのですが,参照をループ外で定義してあげればある程度は早くなってくれます.

しかしappendが邪魔をしてしまうので,appendを使わないリスト内包表記のほうが結果的に早くなります.

これをPythonのリスト内包表記を使用して書くとこうなります

hoge = [i for i in range(5000) if i % 2 == 0] 

一行だけで済ますことができます.

説明

Pythonのリスト内包表記の基本構文はこんな感じ,これに色々修飾して書いていくのが多いです.

[変数 for 変数 in iterator]

今回はこのリスト内包表記に後置ifで判別させています. (原則として,Pythonでは後置ifが使用できませんが,リスト内包表記の時だけは使用が可能)

後ろについているif文の条件を満たす時だけ,hogeのリストに値が追加されます.

いちいちリストを作成しなくても,これで要件に応じた処理をできるので,そりゃfor文よりも速くなりますよねって話です.

ちなみに,後ろにくるのはif文で処理できるものなら何でも大丈夫で,例として関数の返り値などが使用できます.

辞書内包表記

次に辞書内包表記です. やっていることは,リスト内包表記を辞書にしただけなのですが,これがなかなか使いやすい.

辞書内包表記の基本構文はこんな感じです.

{key : value for 変数 in iterator}

key,valueともに変数を用いた値を代入することができます.

たとえば,100までの値をkeyとvalueにした辞書を作りたいときは

nya = {str(i) : i for i in range(100)}

こんな感じでできます,ちなみにkeyはstr型ではないとエラーが出るので,整数などをkeyにしようとする際には注意が必要です.

は?これじゃリスト内包表記とほぼ同じじゃん,何言ってんのw

こう思う方もいるかもしれません.

しかし,辞書内包表記は,イテレータの部分を辞書にすることで真価を発揮することができるようになります.

たとえば,辞書のkeyとvalueを関数に飛ばし,帰って来た値を新たに辞書のvalueの部分に代入することができます.

def nyan(noc,n):
    s = "ねこが{}匹 ".format(noc)
    nyaa = "にゃあ"
    neko = s+nyaa*n

    return neko

nyandict={'1':2, '2':4, '3':6}

neko_nyan = { k : nyan(k,v) for k,v in nyandict.items()}

print(neko_nyan)

=> {'1': 'ねこが1匹 にゃあにゃあ', '2': 'ねこが2匹 にゃあにゃあにゃあにゃあ', '3': 'ねこが3匹 にゃあにゃあにゃあにゃあにゃあにゃあ'}
 

こんな感じで,key,valueを引数とした関数を要素にもできます.

forループで書いていってもいいのですが,それだと冗長,そして時間がかかるので,個人的には可読性が少し下がりますが, 辞書内包表記を使用したほうがいいかなと思います.

上のにゃあをforループを使って書いた場合.

for k,v in nyandict.items():
    neko_nyan2[k]=nyan(k,v)

print(neko_nyan2)

forループの方がよくね?って思った方,僕も同感です.

それでは実家に帰って来たので,父親に連れられ心療内科からの隔離病棟で優勝して来ます.ありがとうございました.

熱いよーーーー助けてよーーーーー

あああああああっっあついwwwwwあついwあつwwwあつつつつつつううあああつつつあつあつあつwwwwwwwwww

あつwあちちwあちwwwwwww

アチュチャチャアチュイアチュイアチュイイイイイイイイイイイaaaaaaaaaaaaaaaaaaaaaa

ンコホォwアチュイノオオオオアチュイノタシュケテエエエエエエエエエエエエエエエエエエエエ

アチュシュギテアカチャンニナッチャッタバブwバブバブwwwwwブブッブフッブwwwwwwwwwwwwwwww

トウチャン!!!!! カアシャン!!!! ボキュニエアコンカッテカッテ!!!!!!!!!!!!

カッテクレリュウウウウウウウウウウウウウウウウウウウウウウウウウウ!?!?!?!??????

チュイノオオオオアチュイノタシュケテエエエエエエエエエエエエエエエエエエエエあつつつつつつううあああつつつあつあつあつwwwwwwwwwwいwwwwwあついwあつwwwあつつつつつつううあああつつつあつあつあつwwwwwwwwww

イアチュイイイイイイイイイイイaaaaaa

トウチャン!!!!! カアシャン!!!!トウチャン!!!!! カアシャン!!!!トウチャン!!!!! カアシャン!!!!トウチャン!!!!! カアシャン!!!!トウチャン!!!!! カアシャン!!!!

チュイノオオオオアチュイノタシュケテエエエエボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!ボキュニエアコンカッテカッテ!!!!!!!!!!!!、「、、、ヲ、## ィ、ェ 」ー」ア」イ」ウ」皀筌� 」リ」ル」レ竺軸宍雫七 而耳自蒔・ゥハクサ嵂ス、ィ、ェ 」ー」ア」イ」ウ」皀筌� 」リ」ル」レ竺軸宍雫七 而耳自蒔・ゥハクサ嵂ス、ア・ム・ソ。シ・�オ。ヌス。ヲクヲオ�。チ。ス。ン。�。ュカア・ム・ソ。シ・�オ。ヌス。ヲクヲオ�。チ。ス。ン。�。ュカ」イ」ウ」皀筌� 」リ」ル」レ竺軸宍雫七 而耳自蒔・ゥハクサ嵂ス、筌� 」リ」ル」レ竺軸宍雫七 而耳自蒔・ゥハクサ嵂ス、ィ、ェ 」ー」ア」イ」ウ」皀筌� 」リ」ル」レ竺軸宍雫七 而耳自蒔・ゥハクサ嵂

jupyter notebookでなんちゃってGUI

どうもはとバスです.最近は大学の研究室にいることが多いです.

今回は研究室でやったことについてです.

現在やっているのは自動車の自動走行です.

大学のレーザーカッターや3Dプリンターを使って,ある程度は車体ができたので,これからは実際に走行させ,データを収集するというところまで来ています.

そこでやろうとしたのがjupyter notebookを使用したコントロールです.

jupyter notebookに入っているのはpythonです.

pythonでよく使われるGUIツールの開発は,Tkinterというツールです.

これを使えばすぐにGUIツールを作ることができ.ボタンやスライダもすぐに作成できます.

さっそくこれを使ってコントローラを作ろうとしましたが.壁がありました.

jupyter notebookというのはssh接続でraspberry piと接続しています.

sshでは,原則ではGUIを飛ばしてくることはできず,エラーが出てしまいます.

そのために,他のライブラリを使用する必要がありました.

そこで出てくるのが, ipywidgets というライブラリです.

ipywidgetsって何よ

という話があります.そもそもこれは何かという話なのですが.jupyter notebookでインタラクティブGUIを作成できます.

作成できるものとしては,ボタンやスライダや入力フォームなどを作成できます.

これが動くのはjupyter notebook上なので,Tkinterのように,GUIの画面を飛ばしてくる必要がなくなります.

これを使用することで,Raspberry piを同一LAN上で制御し,なおかつそれっぽいGUIを使用することができます.

ipywedgetsのドキュメントはこちら,ここを見れば一通り使うことはできると思います,

僕がまとめたipywedgetsのgithubこちら,ここで一から解説するとなると修羅の道になると思うので,参考までにこちらをご覧ください.

ちなみに,これを使って,僕はラジコンのコントローラーを作成しました.

こちらがその動画です.

PythonでCounting Sortした

たまには真面目に記事を書きます.

今大学でやっているアルゴリズムの授業で書いたものです.

実行速度で差をつけろ!というときは,CやC++などで書くのがメジャーで,Pythonスクリプト言語で,逐次実行というところからすると,やはり遅くなってしまいます.

僕も大体の部分ではCを使って書いていたのですが,今回始めてPythonでじっくり書きました.

この大学のアルゴリズムの講義では会津大学のAOJというサイトを使用し,そこに用意されている問題をACさせることが,授業の課題という感じです.

今回の問題はこちら

問題を要約すると,入力された数字を計数ソートにより昇順に並べ換えるという問題です.

これをするためには Counting sort という手法で数字を並べ換える必要があります.

やり方としては以下の通り

  1. キー(配列Aのデータ)を数え上げるための配列Cとソートのための作業用配列Bを用意する
  2. 配列Cを利用して,配列Aのデータの出現頻度を数える
  3. 配列Cが保持したキーの累積度数分布を求める
  4. (配列Cの)累積度数分布に従って配列Aから配列Bにデータをコピーする
  5. 必要な場合,配列Bから元の配列Aにデータをコピーする

累積度数分布って何ですか?

累積度数分布とは,その値がいくつあるか?という分布です. 例として,以下のような数列が与えられたとき.

1 5 2 3 1 1 3 3

この場合,要素数は8,分布が均等であれば,1~8がそれぞれ1つずつ存在することになります.

実際は重複がいくつかあり,この場合の累積度数分布は f:id:flying_hato_bus:20170602002701p:plain

こうなる,あとはこのリストを分布に沿ってコピーすればいいという感じです.

実際のコードはこんな感じ,sort内のmはカウントをする配列の数になる.count = [0]*(m)の表記は,これだけで要素を0で初期化が出来ます.

ここまで言って何なんですが,このコードの中では累積度数分布を使用していません.

count[a] += 1 の部分で出現回数の計算をし,

for c in range(count[a]):
            array[i] = a
            i += 1

で値の出現回数だけ繰り返して元のリストに値をコピーしています.

サンプルにするとこんな感じ,print部分でごちゃごちゃしているのは出力に制限があり,それに当てはめた結果がこのようになりました.

ただただ出力したい場合は print(li)で出力が可能です.

def counting_sort(array, maxval):
    m = maxval+100
    count = [0] * (m)
    for a in array:
        count[a] += 1
    i = 0
    for a in range(m):
        for c in range(count[a]):
            array[i] = a
            i += 1
    return array
 
if __name__ == '__main__':
    N = int(input())
    l = list(map(int, input().split()))
    a = 0
    li = counting_sort(l, N)
    for a in range(N-1):
        print(li[a], end=" ") 
    print(li[N-1])

実行例

入力1

6 1 1 4 5 1 4

出力1

1 1 1 4 4 5

入力2

10 2 2 2 1 1 5 5 9 1 1

出力2

1 1 1 1 2 2 2 5 5 9

入力3

100 0 33 43 62 29 0 8 52 56 56 19 11 51 43 5 8 93 30 66 69 32 17 47 72 68 80 23 49 92 64 69 51 27 90 24 35 20 44 10 62 84 63 1 10 36 76 31 29 97 75 91 90 44 34 25 29 30 27 26 43 34 4 60 49 20 56 32 72 13 90 9 19 5 95 49 27 19 97 24 96 49 56 84 93 45 7 6 9 54 52 65 83 38 1 90 30 37 95 56 63

出力3

0 0 1 1 4 5 5 6 7 8 8 9 9 10 10 11 13 17 19 19 19 20 20 23 24 24 25 26 27 27 27 29 29 29 30 30 30 31 32 32 33 34 34 35 36 37 38 43 43 43 44 44 45 47 49 49 49 49 51 51 52 52 54 56 56 56 56 56 60 62 62 63 63 64 65 66 68 69 69 72 72 75 76 80 83 84 84 90 90 90 90 91 92 93 93 95 95 96 97 97

このように間違いはなく,実際にソートがされているということが分かる.

トランプとサイゼリアに行って来た.

どうもはとバスです.先日このような記事を書き,このようなツイートをしました.

hatobus.hatenablog.jp

f:id:flying_hato_bus:20170520163137j:plain

これはよくある,ドナルドトランプをサイゼリアに誘うツイートなのですが.

f:id:flying_hato_bus:20170520163112j:plain

一緒にドナルドトランプとサイゼリアに行くことにしました.

ドナルドトランプはどうするの?

そう思う方もいると思います.しかし僕はPhotoshopというツールを使うことができます. 実際は,部屋の片隅でネズミに緑色の液体をかけて体液をチューチュー吸っているカブトムシが画像を編集してくれるのですが.

f:id:flying_hato_bus:20170520163811j:plain

こういった画像を

f:id:flying_hato_bus:20170520163940p:plain

こんな感じに切り取ります.

あとはこれを印刷して.

f:id:flying_hato_bus:20170520164251j:plain

風景と一緒に写真を撮ってあげれば…….

f:id:flying_hato_bus:20170520164100j:plain

あっ!ドナルドトランプだ!!!!!それも俺と会うっていうことでめちゃくちゃ笑ってくれてる!!!

www.youtube.com

どこからともなく The Star-Spangled Banner が再生されます.

これで一緒にトランプと遊ぶことができます.

待ち合わせの時間が10時45分でした.どうやら北朝鮮情勢で朝早くから遊ぶと言うことが難しいらしいです.

ちなみに待ち合わせの場所なのですが,福島県民なら誰でも知っている.郡山駅前です.

時間は午前10時45分.サイゼリアに行くにはちょっと早いです.

トランプが電気屋に行きたいって言ったので,出てすぐの場所にあるヨドバシカメラに行きます.

f:id:flying_hato_bus:20170520165014j:plain

トランプ「ちょwwwww俺エゴサしてみたらwwwwwwwwネットに悪口書かれまくりワロタwwwwwwww」

f:id:flying_hato_bus:20170520165559j:plain

トランプとヨドバシカメラで小一時間イチャイチャしたところで,そろそろお腹が減って来ました.

f:id:flying_hato_bus:20170520165812j:plain

ドナルドトランプに運転させるのはさすがにいけません.腐っても一国の大統領.私が運転します. ヨドバシカメラがとても面白かったのか,ご満悦のご様子です.車で5分ほどのサイゼリアに行きます.

トランプ「そういえば,お前以外にpaiza_runもいたよな,今日は来ていないようだが,どうしたんだ?」

この質問がきました.実はpaiza_runも誘っていたのですが.

f:id:flying_hato_bus:20170520170756p:plain

なぜかtwitterの鳥とオフ会しているそうなので,僕とトランプの二人でのサイゼリアになりました. paiza_runを介して会話をしていたため,二人共通の友人であるpaiza_runがいないことによって会話が困難かと思われました.

しかしさすが大統領.話をうまく繋げてくれます.ああ.この人になら,抱かれても…….

てな訳でサイゼリアの駐車場です.

僕の車はめちゃくちゃ安い車で変にビヨビヨします.運転免許を取って一年ということもあるかもしれません.変な運転をしたせいで気分を悪くしたのか.

f:id:flying_hato_bus:20170520165801j:plain

トランプが死んだような表情をしていました.

サイゼリア店内

サイゼリア店内では真ん中の方の席に案内されました.窓際や壁際だとどうしても死角ができてしまうので,当然と言ってもいいでしょう.しかしトランプ,まだ車に酔っている様子.これはいけない,僕はドリンクバーを注文します.

f:id:flying_hato_bus:20170520171729j:plain

炭酸水を飲んだら少し気分が安らかになったそうです.炭酸水って偉大ですね.

Amazon | クリスタルガイザー 500ml×24本 [並行輸入品] | 食品・飲料・お酒 通販

Amazon CAPTCHA

とりあえずトランプが持ち直したので注文をします.

僕は王道を征くミラノ風ドリア.トランプはパンチェッタのピザを選択.トランプ,さすがアメリカ人である.

前の大統領が夜になると見つけづらいなどの話をしていると,料理が来ました.

f:id:flying_hato_bus:20170520172510j:plain

パンチェッタのピザです.おいしそうですね.

しかしトランプ,ここで吠える!

「日本人はこんな小さなピザで満足出来んのか!!!!お前らは国も小さければピザも小さいのか!?!?」

f:id:flying_hato_bus:20170520172858j:plain

「お前の国が冷戦してる国に領土取られてんだろ,察しろよ」など言えないので適当に受け流します.

やっぱりアメリカ人ですね,ピザになるとここまで話がガチになる.そんな感じで騒いでいると,トランプがひらめきます.

f:id:flying_hato_bus:20170520173434j:plain

「この切り方だとでっかいピザの一部みたいになるだろ?」

この言葉を聞いた瞬間に,「こいつクレヨンしんちゃんなんじゃないのか?」っていう考えが頭をよぎりました.

ちなみに余った部分はくれるというので僕が食べました.うまうま f:id:flying_hato_bus:20170520174014j:plain

トランプは満足してピザを食べていると思っていると,また吠えます.

「このピザには味が足りない!!!なんだよこれ!!!」

そうすると机の上にあるビンを突然掴みました.

こっ!

これはぁ〜〜!!

f:id:flying_hato_bus:20170520174249j:plain

f:id:flying_hato_bus:20170520174538j:plain

f:id:flying_hato_bus:20170520174905p:plain

なんということでしょう,トランプはあのSalt Baeの真似をしました.

まさか,twitterで有名なあの人の真似をするとは……

そんなこんなで完食しました.

するとここで

トランプ「なんかデザート食いたいわ」

アイスを注文しました

運ばれて来ました.トランプ,これにメロンソーダを合わせます.

f:id:flying_hato_bus:20170520180758j:plain

優勝!

なんか言ってましたが多分あっちの国のネットスラングかなんかなんでしょう.

そんなこんなで楽しいサイゼリアの時間を過ごして行きました.

そのあとは……

f:id:flying_hato_bus:20170520181244j:plain

ゲームセンターに行ったり.

僕の部屋に行って入るなり人をダメにするソファに陣取ったりしてました.

f:id:flying_hato_bus:20170520181355j:plain

f:id:flying_hato_bus:20170520181411j:plain

意外に楽しかったので,画像編集に長けたサイバークカブトムシを持っている方はやってみるととても面白いですよ.

あとがき

サイゼリアで家族連れの方々に白い目で見られました.これだけならよかったのですが,幼稚園生くらいの男の子に「お兄ちゃん,何してるの〜?」って聞かれたことです.神経が太くないときついです.

ちなみに今回使用した画像はこちらです. f:id:flying_hato_bus:20170520181833p:plain f:id:flying_hato_bus:20170520181840p:plain f:id:flying_hato_bus:20170520181853p:plain f:id:flying_hato_bus:20170520181907p:plain f:id:flying_hato_bus:20170520181917p:plain f:id:flying_hato_bus:20170520181932p:plain

2017年最もスマートなクソリプを送る方法

みなさん,クソリプ,送ってますか?

いきなり意味のわからない言葉を書いてしまって申し訳ありません.とりあえず聞きたかったのは,みなさんが日頃どれくらいtwitterクソリプを送っているかということです.

僕は日頃から,度々クソリプをフォロワーの方に送ってはブロックされるような生活をしております.

ところでこのクソリプ,相手に迷惑をかける以外にもちょっと難点があります.

ブロックされるとその人に二度とリプライを送れないんです.

いつも楽しくクソリプを飛ばしていた人が,キレやすい若者だったのでしょう,アカウントをブロックされることがあります.

f:id:flying_hato_bus:20170515233635p:plain

ブロックされると,その人のツイートが見られなくなるほか,いままでにしてきたように,自由にクソリプを飛ばすことができなくなります.

致命傷です.

いままでできていたクソリプができなくなります.もうその人には,ブロックを解除してもらうしかリプライを送る方法がないんです…….

……

これって,地獄じゃないですか?

僕はそう感じます.

しかし,最近このようなツイートを見ました.

f:id:flying_hato_bus:20170515234843p:plain

paiza_runを使えばブロックされたユーザーにもリプが送れるんです

paiza_runってそもそも何?

こう考える方もいらっしゃると思います.paiza_runというのは言うなれば「Twitter上でコードを送って実行できるアカウント」です.

仕組みとしては簡単.

まずは paiza_runのアカウントに向けてツイートをします. このとき,@を付ける以外にも#paiza_runを付けても構いません. あとは後ろに言語を指定して,プログラムを140字を超えない範囲で書くだけです.

これでなんでクソリプを飛ばせるのか

プログラム内では,定義された文字はなにも考えずに実行します.たとえば “@"という文字と"hogehoge"という文字を別の変数に格納して,表示する際に@という文字とhogehogeという文字を一緒に表示させてあげれば,paiza_runのアカウントがhogehogeという人にリプを飛ばすことができるというわけです.

ちなみにこのpaiza_rumは@とhogehogeというのを別に考えているので,@hogehogeでその人にリプが飛ばせるということを検知する機能がないということと等しいです.つまりこれを利用すれば直接リプライを送ることができない相手にpaiza_runを使用してリプライが飛ばせるということです.

テンプレ

僕はpythonくらいしか試してないため,pythonでのテンプレになります.

#paiza_run python:
# -*- coding: utf-8 -*-
s = "@"
t = "相手のID "
u = "言いたい言葉"
print s + t + u

これをtwitterに貼り付けてツイートすればとりあえずは大丈夫なようです.(twitterで実際に動くことを確認しています)

これを使えば

f:id:flying_hato_bus:20170516001006p:plain

アメリカの大統領のことをサイゼリアに誘うことができたり

f:id:flying_hato_bus:20170516001005p:plain

アメリカの大統領とねんごろな関係に発展させることもできます.

ちなみに日米関係が悪化すると僕のせいになりかねないので,これ以上は遠慮ください.

また,この方法のデメリットとしては,相手がブロックしてもずっとクソリプを送ることが可能になるので,あまりにもしつこいリプを飛ばしていると訴訟問題にも発展する可能性があるのでご注意ください.

また,この方法は本来の使用用途を逸脱しています.これを仲間内などで楽しむぶんには構いませんが,これを悪用し相手の迷惑になるような行為や犯罪の踏み台などとして使用することはおやめください.

もしそのような問題が発生してもこのブログでは一切の責任を負いません.

2017/05/16 追記 もっと簡単な方法があったので追加しておきます.

#paiza_run python:
# -*- coding: utf-8 -*-
print "@" + "相手のID " + "言いたい言葉"

単にこれだけでクソリプを送ることができます. スクリプト言語の場合,このように表記を簡略化することができる場合が多いため,これ以上に簡易化できる方法があるかもしれませんね