はてなキーワード:YAMLとは
入社して最初の仕事は「AWS認定ソリューションアーキテクト」の資格を取ることだった。
会社の先輩はAWSアカウントの管理だけで頭を抱えていて、俺は「クラウドってすごいんだろうな」と思っていた。
甘かった。
大学時代はPythonでちょっとしたWebアプリを作るのが楽しかったのに、今はIAMポリシーとSecurityGroupの設定で一日が終わる。
コードを書いているはずが、実際はYAMLとJSONばかり書いている。
先輩(30代)は「昔はサーバーにSSHして直接デプロイしてたんだよ」と言うけど、正直それの何が悪いんだろう。
デプロイ自体は確かに自動化されるけど、その仕組みを作るのに疲れ果てる。
Kubernetes?EKS?ECS?Fargate?Lambda?Step Functions?どれを使えばいいのか分からない。
友人はGCPを使っているけど、別の呪われた世界があるだけだと言っている。
Azureの話は聞きたくもない。
懐かしい感覚だった。「gitpushherokumain」だけで済んだ。
こんなに簡単だったのか。
herokuの料金は高いってよく聞くけど、精神衛生上の価値はある。
最近のスタートアップでは「NoOps」とか「クラウドレス」みたいな言葉が流行っていると聞いた。
Vercel、Netlify、Railway、Fly.ioなどを使ってインフラをほぼ考えずにデプロイするらしい。
もしかして、クラウドの複雑さに耐えられなくなった開発者が増えているのかもしれない。
いや、きっと俺のスキルが足りないだけだ。「クラウドネイティブ」になるべきなのだろう。でも正直、モノリスに戻りたい気持ちもある。
きっと、単純なものが複雑になりすぎたんだ。
分かりづらい例はググれば出てくるから具体例は略するが、
JSONはキーをクオートしたりケツカンマかけなかったりコメントかけなかったり、不便点あるのはわかるが、改良されたJSON5だとかJSONCだとかある
構造的に深くなって人が見づらいならTOMLというのもある
インデントはすっきりしてるかもしれないが、意図せずズレても気づきづらい
ホワイトスペースは崩れやすく、一度崩れたのを直すのはかなり大変だ
Pythonもインデントベースだが、こっちはプログラミング言語でロジックを記載してるわけだから実行時やテストでおかしくなってることは検出しやすいのでまだマシ
他にもYAMLは便利機能として名前をつけておいて他の場所で参照したりインポートしてマージするようなこともできるが、これがさらにわかりづらくしてる
データ構造なのに考えないとどうなってるかわからず直感的でない
M1 proMacにて。ここ参照:https://github.com/magnusviri/stable-diffusion/tree/apple-silicon-mps-support
git clonehttps://github.com/magnusviri/stable-diffusion.git
cd stable-diffusion
curl --proto '=https' --tlsv1.2 -sSfhttps://sh.rustup.rs |sh
conda activate ldm
mkdir -pmodels/ldm/stable-diffusion-v1/
https://huggingface.co/CompVis/stable-diffusion-v-1-4-originalから`sd-v1-4.ckpt`をダウンロードして、
ln ~/Downloads/sd-v1-4.ckptmodels/ldm/stable-diffusion-v1/model.ckpt
以下のパッケージを追加した。https://twitter.com/hevohevo/status/1562364961481162754?s=20&t=KxNXNB9fz99fbosZ8TfnvQ を参考に。
conda install onnx
pip install invisible-watermark
それで実行
python scripts/txt2img.py --prompt "a photograph of an astronautriding a horse" --plms
するとエラーになる。https://qiita.com/hevo2/items/e646148a05118074fecf に従い、下記ファイルの2511行目を書き換え。
vi /opt/homebrew/Caskroom//miniforge/base/envs/ldm/lib/python3.10/site-packages/torch/nn/functional.py
何もしてないのに壊れた。と言いたいところだけど多分こないだドッカーをアップデートしたからだとおもう
でもあっぷでーとしただけでこわれないでほしい
ITってさマジでろくな情報がネットに転がってねーよな。あるかもしれんけどグーグル検索がゴミすぎてヒットしないっていう
とりあえず念力でdocker-comppose.yaml がおかしいかもしれないと当たりをつけた。
{service-name} っていうサービスをyamlにとうろくしてるんだけど、なんかの手違いでこのサービスの値をうまく読み込めていないのだろうと、直感だけで決めつける
そんでとりあえずyamlふぉーまっとをググってみてくる。
へいしゃかんきょうのファイルはyamlルート空間直下にサービスをチョクで併記する感じなのだが、ネットで出てくる参考記事にはservice: 要素でくるんでいる
今まで動いてたのが動かなくなるの死ねって感じなので死ねって祈りながら、とりあえずservice:要素をルートに追加して、いままでトップレベルに野ざらしにしてた各種サービス要素をservice:の下に入れる
docker-conpose up -d
ドッカーアップデートするのいいけど設定ファイル読み込みの後方五巻壊すんじゃねーよかす
自分が開発を始めたソフトウェアがイスラエルの企業の目に留まってそのまま現地に行っちゃった人のお話を読んでいた。
すごいなー→仕事心底楽しそうやなー→自分の実現したいことが周囲から認められて幸せそうやなーまでは思った。
けれども、こーなりたいなーとか自分もいつかのために勉学に励まなくちゃ!って気概まで全く至らなくて
プロ野球選手目指しますとはちゃうんだからと思っても、自分にはもう踏み出す足がないことにため息をついてしまった。
プログラミング嫌い、特にgo言語なにそれおいしいの?原始的で野蛮書くの辛いって口悪しくぶっちゃけたら転職の面接で落ちたばかりだ。
実際に似たような業界だけど、プログラマーとしての才能まじでないし、寿司打は一回り年下の後輩にぼろ負けするくらいタイピング遅いし、
正直コーディングよりも、yamlファイル、tomlファイルという設定ファイルをもっちり整えてる時間の方が好き。
マネージャー職もリーダーも無理。自分はこのポジむいてないなっていうのはよく知ってる。ソフトバンク行った同僚の残した資料を見てるとこれと同じレベルのドキュメント作る自信も皆無で。
結局yamlはデータ構造を現すもので、プログラミング的な繰り返しとかIF文は無理やり過ぎて違和感しかない
RubyのDSLって普通にダメだねこりゃ。実行順序も分からんし、普通にRubyで書いた方が良い気さえする
独自のSyntax覚えるのかったるすぎる。大して便利じゃない
何でもやろうとすると結局、プログラミング言語みたくなってどんどん可読性が落ちる
結局最後はbashで良いんじゃねーかなってなる。シンプルにできるなら一番筋が良いのはansibleだけど微妙に書き方変わったりして追従がかったるい
俺の知ってる会社でchefで全自動だぜ!とか言ってキラキラ感だしてる会社あったんだが今は全然回ってないらしいww
一時はもてはやされたけどDockerとか出てきた昨今こんなの今頑張らなくてもいいのかもな
http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/
良いPHPerだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。
つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。
それじゃ、始めよう。
?>なんて使っちゃいけない。そう俺たちはBADPHPer。
無駄なホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めてゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。
require_once("config.php");
未だにこんなことやってるやつがいるのかいベイベー。絶対にダメだ。この一行を見たら俺は悶絶する。
ダメだ、早く何とかしないと。
大抵このconfig.phpの中身はこうなっている。見て絶望だ。
$hoge_path = '';if (!LOCAL) { define('FOO_FLAG', 1); if (HONBAN) { define('HOGE_FLAG', 1); } else if (TEST) { define('HOGE_FLAG', 2); }}else { $hoge_path = '/local'; define('FOO_FLAG', 2); define('HOGE_FLAG', 3);}define('HOGE_URL', $hoge_path.'/hoge/');
こういうのが延々と続くわけだ。もういやだ。もう見たくない。
本番環境とテスト環境でどういう値の違いがあるのか、ローカル環境だとどうなるのか、まったく把握できる気がしない。
なまじPHPな設定ファイルのせいで、処理をついつい書いてしまう。そしてどんどん複雑になってしまう。
やはり設定データは基本的にYAML等のデータしか定義できない形式のもので用意すべきだ。そして環境ごとに設定ファイルを分けるべきである。
そうすることで何にどういう違いがあるのかすぐにわかるし、diffすれば一度にすべて把握することができる。
# 本番環境設定ファイルfoo_flag: 1hoge_flag: 1hoge_url: '/hoge/'
#テスト環境設定ファイルfoo_flag: 1hoge_flag: 2hoge_url: '/hoge/'
#ローカル環境設定ファイルfoo_flag: 2hoge_flag: 3hoge_url: '/local/hoge/'
// ここで後の処理のためにhogeメソッドを呼び出しておく$q->foo();// $a['foo']はここに来る時点で真のはず//2010-03-10 判定がおかしいので修正//2010-06-21 やっぱり値が入ってる方が正しいif ( !isset($hoge[0]) ) {}
コメントは保守されない。そう、それは真実。こんなコメントを発見したら即効削除しよう。コメントは基本信じるな。
俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。
わかる。いいたい事はとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。
タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)
そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。
この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。
私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。
われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。
御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。
そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。
$iNumber = 'aaa';
になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。
変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。
$foo = null;$foo = $q->foo();
こんな初期化に意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう
$foo = null;if ( $hoge ) { $foo = 1;}else if ( $bar ) { $foo = 2;}
このときの初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。
functiongetStatus() { $bReturn = false; if ($i == 2) $bReturn = true; return $bReturn;}(中略)
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
trueとfalseの条件がいまいち明確ではないが、本当に動かないコードを書けというのであれば以下のようにすべきだ
functiongetStatus() { $bReturn = false; if ($i == 2) $bReturn = true; else if ($i == 1) $bReturn = false; else throw new Exception("bad status! $i"); return $bReturn;}
中途半端にfalseを返して生存させる必要性はまったくない。今すぐ死ね!
連想配列のキーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。
更に後世のプログラマが処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にしたい場合はconstantを使うと良い。
// 定数のFOOを使うよということが明確になるprint $a[constant('FOO')];
もし、文字列を変数の値と一緒に出力するとき、PHPではコンマの代わりにprintfを使うことが使える。
printf( “Hello, myname is %s“, $sName);
以下の代わりに上記のコードを使う。
echo “Hello, myname is “, $sName;
出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。
三項演算子はとても有効だ。しかし優先順位に難があるせいで、三項演算子をネストしようとすると以下のようなコードになってしまう
$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));
括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めてゴミ箱にでも捨てちまえ。
if ( $flag ) {}
仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。
もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。
インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい。
わけがわからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。
文句なしだ。これは文句がない。
他にも色々あるので覚えておこう
$a %= 1;$a &= 1;$a |= 1;$a ^= 1;$a <<= 1;$a >>= 1;
てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。
なのでdivを使って以下のようにしとくと便利だろう。
function p($var) {echo "<div align='left' style='background-color:white;color:black;'><pre>";print_r($var);echo "</pre></div>";}
君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!
大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがわからなくなってるパターンが多い。
貴様みたいなもんに、定数は制御できん。いいか設定ファイルはYAML等のデータで持つようにし、その連想配列のデータ構造を一つ持ってるだけで定数の変わりになる。
このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めてゴミ箱へ捨ててしまうといい。
認識を改めろ。俺たちはより良いPHPerにならないために努力している。
class Request { private $parameters; private $method; function __construct () { $this->method = $_SERVER['REQUEST_METHOD']; if ( strtoupper($this->method) === 'POST' ) { $this->parameters = $_POST; } else { $this->parameters = $_GET; } } function param ($key) { return isset($this->parameters[$key]) ? $this->parameters[$key] : null; }}
これだけでもいい。たったこれだけでもとても便利だ。ここから拡張してGETやPOSTを明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!
例が良くない。こんなのは引数が20個ある関数から、setを20回呼ぶオブジェクトに変わっただけではないか。
そもそもこの20個の引数とはなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし、20個も引数取る時点で設計が間違えている。
何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。
そんなことで悩んでる暇があったら設計を見直せ。
スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。
ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。
どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
・・・と、いうのはやめなさい。
一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。
まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。
確かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!
あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。
気を抜いて。そう気を抜いて。所詮あなたのコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。
結合度を減らすというのは非常に難しい。何度も何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。
まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。
そしてその後に、一部分使いまわしたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。
何事も経験が必要である!経験を積まないプログラマは丸めてゴミ箱に捨ててしまえ。
さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だって、addとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか。
functionadd_result_output ($iVar, $iVar2) { $r =add($iVar, $iVar2);echo result($r);}
もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!
このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。
あくまでも「より良いPHPerにならないための20Tips」なのだ。
君はこの記事を鵜呑みにしてはならない。PHPをPHPと見抜けないPHPerはPHPを使うのは難しい。
もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのケツの穴を拭くための紙になるだろう。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。
この記事があなたの役に立たない事を。
ふざけんな!
Could not load class (App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS) because :Can't locateXML/LibXML.pm in @INC (@INC contains: /home/pc/mobirc/lib /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .)at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.
BEGIN failed--compilation abortedat /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.
Compilation failed inrequireat /usr/local/lib/perl/5.8.8/Class/MOP.pm line 151.
at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 133
Class::MOP::load_first_existing_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') calledat /usr/local/lib/perl/5.8.8/Class/MOP.pm line 157
Class::MOP::load_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') calledat /usr/local/share/perl/5.8.8/MooseX/Plaggerize.pm line 20
App::Mobirc::load_plugin('App::Mobirc=HASH(0x8d7e490)', 'HASH(0x8d7536c)') calledat /home/pc/mobirc/lib/App/Mobirc.pm line 44
App::Mobirc::_load_plugins('App::Mobirc=HASH(0x8d7e490)') calledat /home/pc/mobirc/lib/App/Mobirc.pm line 35
Class::MOP::Class:::around('CODE(0x8ab5250)', 'App::Mobirc', '/home/pc/mobirc/config.yaml') calledat /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 129
Class::MOP::Method::Wrapped::__ANON__('App::Mobirc', '/home/pc/mobirc/config.yaml') calledat /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 89
App::Mobirc::new('App::Mobirc', '/home/pc/mobirc/config.yaml') calledatmobirc/mobirc line 36
pc@ubuntu-vm:~$ sudomobirc/mobirc
Could not load class (App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS) because :Can't locateXML/LibXML.pm in @INC (@INC contains: /home/pc/mobirc/lib /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .)at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.
BEGIN failed--compilation abortedat /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.
Compilation failed inrequireat /usr/local/lib/perl/5.8.8/Class/MOP.pm line 151.
at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 133
Class::MOP::load_first_existing_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') calledat /usr/local/lib/perl/5.8.8/Class/MOP.pm line 157
Class::MOP::load_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') calledat /usr/local/share/perl/5.8.8/MooseX/Plaggerize.pm line 20
App::Mobirc::load_plugin('App::Mobirc=HASH(0x8d799e0)', 'HASH(0x8d7089c)') calledat /home/pc/mobirc/lib/App/Mobirc.pm line 44
App::Mobirc::_load_plugins('App::Mobirc=HASH(0x8d799e0)') calledat /home/pc/mobirc/lib/App/Mobirc.pm line 35
Class::MOP::Class:::around('CODE(0x8ab4390)', 'App::Mobirc', '/home/pc/mobirc/config.yaml') calledat /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 129
Class::MOP::Method::Wrapped::__ANON__('App::Mobirc', '/home/pc/mobirc/config.yaml') calledat /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 89
App::Mobirc::new('App::Mobirc', '/home/pc/mobirc/config.yaml') calledatmobirc/mobirc line 36
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものをgem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo offsetlocalset WD=%~dp0cd/d%WD%ruby get_movies.rbruby get_images.rbruby create_m3u.rb
user:ユーザIDpassword:パスワードids_file: ids.txtdone_file: ids_done.txtmovies_dir: movieslog4r_config:pre_config:global: INFOloggers:-name: apptype:Log4r::Loggerlevel: INFOoutputters:- STDOUT- FILEoutputters:-name: STDOUTtype:Log4r::StdoutOutputterformatter:type:Log4r::PatternFormatterpattern:"%d [%l] %C - %M"date_pattern:"%H:%M:%S"-name: FILEtype:Log4r::FileOutputterfilename:"#{LOGDIR}/sangels.log"formatter:type:Log4r::PatternFormatterpattern:"%d [%l] %C - %M"date_pattern:"%Y-%m-%d %H:%M:%S"
require'fileutils'require'logger'require'mechanize'BASEDIR =File.dirname($0)require"#{BASEDIR}/util"require"#{BASEDIR}/sangels"$config = load_config(BASEDIR)prepare_logger(BASEDIR)$log = new_logger("get_movies")WWW::Mechanize.log = new_logger("mechanize")WGet.log =$logclassIDFiledefinitialize(file)@file = file unlessFile.exist?(@file)Fileutils.touch(@file)endenddefids(contains_comment =nil)File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty?nilelsif contains_commenttrueelsenot /^\s*\#/ =~ xend } }enddefadd(id) ids = ids(true) unless ids.any? {|x| x ==id} write(ids + [id])endenddefdelete(id) ids = ids(true) if ids.any? {|x| x ==id} write(ids - [id])endenddefwrite(ids)File.open(@file,"w") {|io| ids.each {|x| io.puts x} }endend$log.info("BEGIN#{$0} ================")exit_code =0begin ids_file =IDFile.new($config.ids_file) done_file =IDFile.new($config.done_file) movies_dir =$config.movies_dirwget =WGet.new sangels =SAngels.new sangels.login($config.user,$config.password) ids_file.ids.each {|id|begin movies = sangels.movies(id)rescueSAngels::Movies::InvalidMoviesError$log.warn("invalid movieid:#{id}")nextenddir =File.expand_path(id, movies_dir) movies.each {|link|wget.retrieve(link.href,dir) } expected = movies.movie_links.map{|x|File.basename(x.href)} actual =Dir.glob("#{dir}/*").map {|x|File.basename(x)} if (expected - actual).empty? done_file.add(id) ids_file.delete(id)end }rescue => e$log.error(e) exit_code =1end$log.info("END#{$0} (#{exit_code}) ================")exit exit_code
require'fileutils'require'logger'require'mechanize'require'ostruct'BASEDIR =File.dirname($0)require"#{BASEDIR}/util"require"#{BASEDIR}/sangels"$config = load_config(BASEDIR)prepare_logger(BASEDIR)$log = new_logger("get_images")WWW::Mechanize.log = new_logger("mechanize")WGet.log =$log$log.info("BEGIN#{$0} ================")exit_code =0begin movies_dir =$config.movies_dir sangels =SAngels.new sangels.login($config.user,$config.password) thumbnails = sangels.thumbnailsDir.glob("#{movies_dir}/*").each {|dir|nextunlessFile.directory?dirid =File.basename(dir)url = thumbnails.url(id) unlessurl$log.warn("#{id} isnot found")nextend path =File.expand_path("00_thumbnail#{File.extname(url)}",dir)nextifFile.exist? path$log.info("retrieving#{url}") thumbnail = thumbnails.get_file(id)File.open(path,"wb") {|io| io.write(thumbnail)} }rescue => e$log.error(e) exit_code =1end$log.info("END#{$0} (#{exit_code}) ================")exit exit_code
BASEDIR =File.dirname($0)require"#{BASEDIR}/util"$config = load_config(BASEDIR)movies_dir =$config.movies_dirDir.glob("#{movies_dir}/*") {|dir|nextunlessFile.directory?dirname =File.basename(dir) files =Dir.glob("#{dir}/*.wmv").sortFile.open("#{movies_dir}/#{name}.m3u","w") {|io| files.each {|file| io.puts"#{name}/#{File.basename(file)}" } }File.open("#{dir}/00_movies.m3u","w") {|io| files.each {|file| io.puts"#{File.basename(file)}" } }}
require'mechanize'require'hpricot'BASEDIR =File.dirname($0)require"#{BASEDIR}/util"classSAngelsHOST ="real2.s-angels.com"LOGIN_URL ="http://#{HOST}/member/"INFO_URL ="http://#{HOST}/teigaku/item.php"THUMBNAILS_URL ="http://#{HOST}/teigaku/"THUMBNAIL_URL ="http://#{HOST}/images/default/thumb/"definitialize()@agent =WWW::Mechanize.newenddeflogin(user,password) login_form =@agent.get(LOGIN_URL).forms.find {|form| form.fields.any? {|field|field.name =="frmLoginid"} } login_form.frmLoginid =user login_form.frmPw =password@agent.submit(login_form)enddefmovies(id, no_validate =nil)Movies.new(@agent,id, !no_validate)enddefthumbnailsThumbnails.new(@agent)end classThumbnailsdefinitialize(agent)@agent = agent doc =Hpricot(@agent.get_file(THUMBNAILS_URL)) elems = doc.search("div[@class=realthum]/a")@links =Hash( elems.map {|elem|href = elem["href"]id =$1if /ID=(.+)/ =~hrefurl = elem.search("img")[0]["src"] [id,url] })enddefget_file(id)@agent.get_file(url(id))enddefurl(id)@links[id]enddefexist?(id)url(id)endend classMovies classInvalidMoviesError <StandardErrorenddefinitialize(agent,id, no_validate)@agent = agent@id =id if !no_validate && !valid?raiseInvalidMoviesErrorendenddefinfo_page_url"#{INFO_URL}?ID=#{@id}"enddefinfo_page@agent.get(info_page_url)enddefmovies_page@agent.click(info_page.links.find {|link| /P=10/ =~link.href})enddefmovie_links movies_page.links.select {|link| /wmv$/ =~link.href }.sort {|a, b|File.basename(a.href) <=>File.basename(b.href) }enddefvalid? info_page.uri.to_s == info_page_urlenddefeach(&block) orig_links = movie_links orig_links.each {|orig_link|link = movie_links.find {|l|File.basename(l.href) ==File.basename(orig_link.href)} block.call(link) }endendend
require'log4r'require'log4r/yamlconfigurator'require'singleton'require'fileutils'require'ostruct'defHash(a)Hash[*a.flatten]enddefload_config(basedir)OpenStruct.new(File.open("#{basedir}/config.yaml") {|io|YAML.load(io)})enddefnew_logger(name)Log4r::Logger.new("app::#{name}")enddefprepare_logger(basedir, logdir =nil) logdir ||= basedirLog4r::YamlConfigurator["LOGDIR"] = logdirLog4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml")endclassNullObject includeSingletondefmethod_missing(message, *arg)NullObject.singletonendendclassWGet class<<self attr_accessor:logdefinitializesuper@log =NullObject.singletonendenddeflogself.class.logenddefretrieve(url,dir)FileUtils.mkdir_p(dir) file =File.expand_path(File.basename(url),dir) ifFile.exist?(file) log.info("already retrieved#{url}")returntrueend tmp ="#{file}.part" log.info("retrieving#{url}") ret = system("wget","-c","-O", tmp,url) if ret log.info("retrieving succeeded#{url}")File.rename(tmp, file)else if$? ==0x020000# Ctrl-Cexit($?)else log.error("retrieving failure#{url} (#{$?})")endendreturn retendend
http://anond.hatelabo.jp/20080601175525
他の有料レンタルサーバを使ったことないので、あてにはできないけど。
プラン変更は出来ない。変更したい場合は別プランで新規登録後、データを移すことになる。
公式にはこちら
以下私の環境。これは割り当てられたサーバにより多少の違いがあり得る。その他詳細はアカウント毎に確認できる。
CPU | Intel(R)Pentium(R) M processor2.00GHz |
メモリ | 2GB |
OS | FreeBSD 6.1-RELEASE-p23i386 |
Apache | Apache/1.3.39 |
Perl | 5.8.8 |
Ruby | 1.8.5 |
Python | 2.4.5 |