Hiroto's diary

プログラミング関連とイベントの感想を書くかもしれない

iTunesで大きいサイズのジャケットを取得するブックマークレット

iTunesでサイズの大きいジャケット(アートワーク)を取得するブックマークレットを書いた。iTunesのアートワーク自動取得機能が使えない時や、ジャケットのサイズの大きい物にしたい時などに使えます。

iTunesで大きいサイズのジャケットを取得する。 · GitHub

ブックマークに登録するコード

3000x3000の画像を取得する方。

800x800の画像を取得する方。

未圧縮のコード

実際の動作。新しいタブで開きます。

RubyのThorで設定出来ないコマンド名を無理矢理設定する

Rubyで簡単にCLIツールを作れるThor。

github.com

Thorを使って、runshellなどのコマンド名でコマンドを作ろうとすると怒られます。

test-run.rb

require 'thor'

class Cli < Thor

  desc 'run', 'Run command.'
  def run
    puts 'Running "run" command.'
  end

  desc 'shell', 'Shell command.'
  def shell
    puts 'Running "shell" command.'
  end

end

Cli.start(ARGV)

実行すると…

$ ruby test-run.rb
/path/to/ruby/2.4.0/gems/thor-0.20.0/lib/thor/base.rb:557:in `is_thor_reserved_word?': "run" is a Thor reserved word and cannot be defined as command (RuntimeError)
    from /path/to/ruby/2.4.0/gems/thor-0.20.0/lib/thor/base.rb:620:in `method_added'
    from test-run.rb:6:in `<class:Cli>'
    from test-run.rb:3:in `<main>'

と怒られる。

設定出来ないメソッド名

Thor::THOR_RESERVED_WORDSで定義されているワードが使えません。

具体的には

invoke
shell
options
behavior
root
destination_root
relative_root
action
add_file
create_file
in_root
inside
run
run_ruby_script

です。

runshellは割りと使うので普通に困る。(startconsoleなどの別のコマンド名にすれば回避出来るとかは無しで…)

解決策

適当なメソッド名で書いた上で mapを使って紐付け

どうせ紐付けるのでメソッド名は何でも良いんですが、後ろに_commandとでも付けておくのがベタ。

require 'thor'

class Cli < Thor

  desc 'run', 'Run command.'
  def run_command
    puts 'Running "run" command.'
  end

  # runコマンドをrun_commandに紐付け
  map 'run' => 'run_command'

  desc 'shell', 'Shell command.'
  def shell_command
    puts 'Running "shell" command.'
  end

  # shellコマンドをshell_commandに紐付け
  map 'shell' => 'shell_command'

end

Cli.start(ARGV)

実行してみる。

$ ruby test-run.rb
Commands:
  test-run.rb help [COMMAND]  # Describe available commands or one specific com...
  test-run.rb run             # Run command.
  test-run.rb shell           # Shell command.

$ ruby test-run.rb run
Running "run" command.

$ ruby test-run.rb shell
Running "shell" command.

これで怒られずにrunshellコマンドを作成出来ます。

Twitterで280文字のツイートをする

Twitterは9月26日に、ツイート可能な文字数を140文字から280文字に増やすための実験を開始すると発表。

blog.twitter.com

しかし、対象ユーザーは無作為に選ばれる上に日本語, 中国語, 韓国語は対象ではありません

APIにパラメータをつければ誰でも280文字ツイートが出来たので280文字投稿の方法を紹介。

この記事ではPHPCowitterを用いて投稿しますが、他の言語やライブラリでもパラメーターをつければ投稿可能です。

280文字の投稿方法

簡単に言ってしまうとツイートを投稿するAPIであるstatuses/updateを叩く際、パラメーターにweighted_character_count=trueを付ければ投稿可能です。

とりあえずサンプルコードを書いてみます。

<?php

require __DIR__."/vendor/autoload.php";

use mpyw\Cowitter\Client as CowitterClient;

// ランダムな文字列を生成。
function rand_str($len = 10) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJLKMNOPQRSTUVWXYZ0123456789';
    $str = '';
    for ($i = 0; $i < $len; ++$i) {
        $str .= $chars[mt_rand(0, 61)];
    }
    return $str;
}

$client = new CowitterClient(['CK', 'CS', 'AT', 'ATS']);

// パラメーターにweighted_character_count=trueを付けて280文字をツイート。
// また、ツイートの文字数が140文字を越すためtweet_mode=extendedを使用。
$params = [
    'status' => '280文字ツイート'. PHP_EOL. rand_str(270),
    'tweet_mode' => 'extended',
    'weighted_character_count' => true,
];
$response = $client->post('statuses/update', $params);

// 280文字全てを取得するため、textではなくfull_textを使用。
echo 'text : '. $response->full_text. PHP_EOL. PHP_EOL;
echo 'length : '. mb_strlen($response->full_text);

実行すれば分かると思いますが、これだけで誰でも280文字投稿が可能です。

ここで注意が必要なのは、140文字オーバーのツイートを投稿する時や取得する時にはパラメーターにtweet_mode=extendedが必要になることです。詳しくは以前書いた以下の記事をどうぞ。

hiroto-k.hatenablog.com

エラーメッセージ

280文字を越してAPIを叩いても、エラーメッセージは140文字を超えている時と同じメッセージが返ってきます。

<?php

try {
    // statusに295文字を使用。
    // 280文字を超えているのでもちろんエラーが返ってきます。
    $response = $client->post('statuses/update', ['status' => '280文字以上のツイートテスト'. rand_str(280), 'tweet_mode' => 'extended', 'weighted_character_count' => true]);

    echo 'text : '. $response->full_text. PHP_EOL. PHP_EOL;
    echo 'length : '. mb_strlen($response->full_text);
} catch (\Exception $e) {
    var_dump($e->getMessage());}
}

実行してみると

Status is over 140 characters.

とエラーが返ります。

© 2015-2018 Hiroto-K