Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「YAML」を含む日記RSS

はてなキーワード:YAMLとは

次の25件>

2025-03-19

いまの20代開発者は複雑化した「クラウド」にうんざりしている

正直言うと、「クラウド」の複雑さにうんざりしている。

入社して最初仕事は「AWS認定ソリューションアーキテクト」の資格を取ることだった。

会社の先輩はAWSアカウント管理だけで頭を抱えていて、俺は「クラウドってすごいんだろうな」と思っていた。

甘かった。

大学時代PythonちょっとしたWebアプリを作るのが楽しかったのに、今はIAMポリシーとSecurityGroupの設定で一日が終わる。

コードを書いているはずが、実際はYAMLJSONばかり書いている。

先輩(30代)は「昔はサーバーSSHして直接デプロイしてたんだよ」と言うけど、正直それの何が悪いんだろう。

今はCI/CDパイプラインを構築するのに一週間かかる。

デプロイ自体は確かに自動化されるけど、その仕組みを作るのに疲れ果てる。

Kubernetes?EKS?ECS?Fargate?LambdaStep Functions?どれを使えばいいのか分からない。

新しいサービスリリースされるたびに、また一から学び直し。

AWSドキュメントを読むだけで目が疲れる。

友人はGCPを使っているけど、別の呪われた世界があるだけだと言っている。

Azureの話は聞きたくもない。

昨日、単純なWebアプリHerokuデプロイしてみた。

懐かしい感覚だった。「gitpushherokumain」だけで済んだ。

こんなに簡単だったのか。

herokuの料金は高いってよく聞くけど、精神衛生上価値はある。

最近スタートアップでは「NoOps」とか「クラウドレス」みたいな言葉流行っていると聞いた。

Vercel、Netlify、Railway、Fly.ioなどを使ってインフラをほぼ考えずにデプロイするらしい。

もしかしてクラウドの複雑さに耐えられなくなった開発者が増えているのかもしれない。

いや、きっと俺のスキルが足りないだけだ。「クラウドネイティブ」になるべきなのだろう。でも正直、モノリスに戻りたい気持ちもある。

きっと、単純なものが複雑になりすぎたんだ。

クラウド」という名前の下に。

Permalink |記事への反応(4) | 05:48

このエントリーをはてなブックマークに追加ツイートシェア

2025-03-13

YAMLゴミ

YAMLなんて読みづらい物使う必要ないだろ

構文がゆるすぎて曖昧ものが多い

分かりづらい例はググれば出てくるから具体例は略するが、

これどうなるんだろう、とJSON化して確認してるやつが多い

それするなら最初からJSONでいい

JSONは見たままでしかなく、迷う余地がない

JSONキーをクオートしたりケツカンマかけなかったりコメントかけなかったり、不便点あるのはわかるが、改良されたJSON5だとかJSONCだとかある

構造的に深くなって人が見づらいならTOMLというのもある

YAMLは書くのがラクの一点だけ

インデントはすっきりしてるかもしれないが、意図せずズレても気づきづらい

コピペするとおかしくなってるのはよくある

ホワイトスペースは崩れやすく、一度崩れたのを直すのはかなり大変だ

Pythonもインデントベースだが、こっちはプログラミング言語ロジック記載してるわけだから実行時やテストおかしくなってることは検出しやすいのでまだマシ

他にもYAMLは便利機能として名前をつけておいて他の場所で参照したりインポートしてマージするようなこともできるが、これがさらにわかりづらくしてる

データ構造なのに考えないとどうなってるかわから直感的でない

共通化されすぎて変更がしづらい

多少冗長でも展開済みで誰が見てもどういうデータがあるかわかるというあたりまえのことができない

Permalink |記事への反応(0) | 20:34

このエントリーをはてなブックマークに追加ツイートシェア

2024-11-04

anond:20241104150415

GNUとかYAMLみたいなやつやろ

Permalink |記事への反応(0) | 15:10

このエントリーをはてなブックマークに追加ツイートシェア

2024-10-18

resxスキーマって何のために作られたんだ。別に人間に見やすくしたいならyamlでもJSONでもいいだろ

https://cammy.co.jp/technical/c_resource/

Permalink |記事への反応(0) | 00:39

このエントリーをはてなブックマークに追加ツイートシェア

2024-07-21

anond:20240711233718

YAMLPythonを200行も書くような奴は最初から願い下げだわな。

直したかOKかいう話じゃなくて、そもそもそんな選択する奴が語る技術による都政なんて、危な過ぎて素人の方がまだマシなレベル

Permalink |記事への反応(0) | 22:10

このエントリーをはてなブックマークに追加ツイートシェア

2024-07-03

anond:20240703110722

日中コード書くか設計するかの仕事だけど

最後の二つは使えた試しがない

書くのがだるいSQLとかyamlフォーマットかには非常に便利だから使いまくってて1割くらいは生産性上がってる気はするけど

Permalink |記事への反応(1) | 11:11

このエントリーをはてなブックマークに追加ツイートシェア

2024-05-25

anond:20240524175356

いまどきjpegって拡張子は見ないよ・・・

yml/yamlは混ざってて困る

Permalink |記事への反応(1) | 03:14

このエントリーをはてなブックマークに追加ツイートシェア

2023-09-21

https://b.hatena.ne.jp/entry/s/news.ycombinator.com/item?id=37586580

YAMLリストマッピングが絡んだ時のインデントのわかりにくさが絶望的に駄目

自分で作ってるアプリ設定ファイルは一周回ってJSONに戻ってしまった

Permalink |記事への反応(0) | 15:12

このエントリーをはてなブックマークに追加ツイートシェア

2023-09-19

anond:20230919120727

CoPilotもテンプレ出してくるだけで邪魔からintelliJでいいのよ

別にChatGPTが嫌いなわけでも使ってないわけでもなくてむしろ人よりガンガンいじってんだけどね

Yamlフォーマットとかは目視してインデント確認とかだるいしChatGPTの精度高いのでもう自分ではやらん

Permalink |記事への反応(0) | 12:21

このエントリーをはてなブックマークに追加ツイートシェア

2023-08-09

anond:20230809121441

適当にできるのが売りだから

チューニングとかニッチマーケットはあると思うよ

ChatGPTがRegexとかYamlフォーマットするのとか得意だけどな

あえてSQLがどうかはしらんけど

場末SQL職人で食ってる人が結構いてなるべくさけてるし履歴書にも絶対載せない

Permalink |記事への反応(0) | 12:31

このエントリーをはてなブックマークに追加ツイートシェア

2022-12-12

anond:20221212220128

画面仕様とかは作らない、ノートアイデア書きなぐったやつならある。

API仕様はOpenAPIyamlを作ってそこからドキュメント生成する。

Permalink |記事への反応(0) | 22:06

このエントリーをはてなブックマークに追加ツイートシェア

2022-11-02

Victoria3ではMOD用設定の記述言語としてyaml採用されているので、仕様を調べるため「Victoria3yaml」で検索する

→「Victoria3」と「v3」は同じ意味だろうとGoogle君に判断され、何らかのバージョン3のyaml情報ばかりが出てくる(なおVictoriaに関する情報はない)

 

うーんこの

Permalink |記事への反応(0) | 16:33

このエントリーをはてなブックマークに追加ツイートシェア

2022-08-25

猫も杓子もStable diffusion

単なる車輪の再発明メモ

M1 proMacにて。ここ参照:https://github.com/magnusviri/stable-diffusion/tree/apple-silicon-mps-support

git clonehttps://github.com/magnusviri/stable-diffusion.git

cd stable-diffusion

git checkoutapple-silicon-mps-support

conda env create -f environment-mac.yaml

うまくいかないのでRustをインストール

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

Permalink |記事への反応(0) | 18:08

このエントリーをはてなブックマークに追加ツイートシェア

2021-08-26

(root) Additional property {service-name}is not allowed

ドッカー今ポーズ?とかいうのがうごかなくなった

何もしてないのに壊れた。と言いたいところだけど多分こないだドッカーをアップデートたからだとおもう

でもあっぷでーとしただけでこわれないでほしい

ググったけいつものようにろくな情報が出てこない

ITってさマジでろくな情報ネットに転がってねーよな。あるかもしれんけどグーグル検索ゴミすぎてヒットしないっていう

とりあえず念力でdocker-comppose.yamlおかしいかもしれないと当たりをつけた。

{service-name} っていうサービスyamlにとうろくしてるんだけど、なんかの手違いでこのサービスの値をうまく読み込めていないのだろうと、直感だけで決めつける

そんでとりあえずyamlふぉーまっとをググってみてくる。

へいしゃかんきょうのファイルyamlルート空間直下サービスをチョクで併記する感じなのだが、ネットで出てくる参考記事にはservice: 要素でくるんでいる

今まで動いてたのが動かなくなるの死ねって感じなので死ねって祈りながら、とりあえずservice:要素をルートに追加して、いままでトップレベル野ざらしにしてた各種サービス要素をservice:の下に入れる

docker-conpose up -d

実行で無事動作しました。

ドッカーアップデートするのいいけど設定ファイル読み込みの後方五巻壊すんじゃねーよかす

なんでいつもいつもエスパー能力使わないと行けないんだよ。このていどの記事ネット上に置いとけバカちんが

Permalink |記事への反応(0) | 19:10

このエントリーをはてなブックマークに追加ツイートシェア

2021-08-17

anond:20210817123214

かにJSONYAML といったシンプルな方が、楽だし、そこは許して。

Permalink |記事への反応(1) | 12:36

このエントリーをはてなブックマークに追加ツイートシェア

2021-07-29

自分が開発を始めたソフトウェアイスラエル企業の目に留まってそのまま現地に行っちゃった人のお話を読んでいた。

すごいなー→仕事心底楽しそうやなー→自分の実現したいことが周囲から認められて幸せそうやなーまでは思った。

けれども、こーなりたいなーとか自分もいつかのために勉学に励まなくちゃ!って気概まで全く至らなくて

プロ野球選手目指しますとはちゃうんだからと思っても、自分にはもう踏み出す足がないことにため息をついてしまった。

プログラミング嫌い、特にgo言語なにそれおいしいの?原始的で野蛮書くの辛いって口悪しくぶっちゃけたら転職面接で落ちたばかりだ。

実際に似たような業界だけど、プログラマーとしての才能まじでないし、寿司打は一回り年下の後輩にぼろ負けするくらいタイピング遅いし、

正直コーディングよりも、yamlファイル、tomlファイルという設定ファイルもっちり整えてる時間の方が好き。

マネージャー職もリーダーも無理。自分はこのポジむいてないなっていうのはよく知ってる。ソフトバンク行った同僚の残した資料を見てるとこれと同じレベルドキュメント作る自信も皆無で。

...そんなワイでも、もっとお金もらえる仕事いかな。さすがに禿が気になる年頃だし、600万円ほしいな。無理かな。

Permalink |記事への反応(1) | 16:53

このエントリーをはてなブックマークに追加ツイートシェア

2020-07-20

YAMLエンジニアめっちゃ大変だからノーコードも似たようなもんだろ

絶対無理

土方で十分です

Permalink |記事への反応(0) | 04:13

このエントリーをはてなブックマークに追加ツイートシェア

2018-08-03

Golangでtomlをよく使うようになった

Golangでtomlをよく使うようになった

Rubyではyaml/jsonをよく使っていたんだけど、Golangだとなぜかtoml

なんとなく理由を考えてみるに、yaml/json本質的にHashMapなので、常に型を要求する(ことが多い)Golangとは相性悪いのかも、と思った

全然根拠はないけど

単純に好みの問題かも

Permalink |記事への反応(0) | 16:36

このエントリーをはてなブックマークに追加ツイートシェア

2018-06-07

yamljsonよりクソ

異論は認めない

Permalink |記事への反応(1) | 18:56

このエントリーをはてなブックマークに追加ツイートシェア

2017-05-06

Infrastractureas code(笑)

ansible

結局yamlデータ構造を現すもので、プログラミング的な繰り返しとかIF文は無理やり過ぎて違和感しかない

chef

RubyDSLって普通にダメねこりゃ。実行順序も分からんし、普通にRubyで書いた方が良い気さえする

puppet

独自のSyntax覚えるのかったるすぎる。大して便利じゃない

でどうなった?

何でもやろうとすると結局、プログラミング言語みたくなってどんどん可読性が落ちる

結局最後bashで良いんじゃねーかなってなる。シンプルにできるなら一番筋が良いのはansibleだけど微妙に書き方変わったりして追従がかったるい

俺の知ってる会社chefで全自動だぜ!とか言ってキラキラ感だしてる会社あったんだが今は全然回ってないらしいww

一時はもてはやされたけどDockerとか出てきた昨今こんなの今頑張らなくてもいいのかもな

Permalink |記事への反応(0) | 05:08

このエントリーをはてなブックマークに追加ツイートシェア

2011-03-20

より良いPHPerにならないための20Tips

http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/

良いPHPerだって?そんなものは丸めゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。

つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。

それじゃ、始めよう。

1. ?>を使うな

?>なんて使っちゃいけない。そう俺たちはBADPHPer。

無駄ホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。

2. 設定ファイルPHPで書くな

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/'

3.コメントを信用するな

そう、あなたはこんな状況に遭遇したことがあるんじゃ?

// ここで後の処理のためにhogeメソッドを呼び出しておく$q->foo();// $a['foo']はここに来る時点で真のはず//2010-03-10 判定がおかしいので修正//2010-06-21 やっぱり値が入ってる方が正しいif ( !isset($hoge[0]) ) {}

コメント保守されない。そう、それは真実。こんなコメント発見したら即効削除しよう。コメントは基本信じるな。

俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。

4. タブとうまく付き合うしかない

わかる。いいたいはとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。

タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)

そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。

この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。

私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。

5.変数名に時間をかけるな

われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。

御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。

そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。

コンパイラ様に保証されてない状態での

$iNumber = 'aaa';

になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。

6.変数初期化場所

変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。

$foo = null;$foo = $q->foo();

こんな初期化意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう

$foo = null;if ( $hoge ) {    $foo = 1;}else if ( $bar ) {    $foo = 2;}

このとき初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。

7.不正なら常に死ね

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を返して生存させる必要性はまったくない。今すぐ死ね

8.連想配列キーアクセスする場合

単なる配列に対して数値をクオートで囲う必要はない。

連想配列キーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。

更に後世のプログラマ処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にした場合はconstantを使うと良い。

// 定数のFOOを使うよということが明確になるprint $a[constant('FOO')];

9.echoよりもprintfを使え

もし、文字列変数の値と一緒に出力するときPHPではコンマの代わりにprintfを使うことが使える。

なぜ?コンマを使うよりも可読性がグッとあがるから

printf( “Hello, myname is %s“, $sName);

以下の代わりに上記のコードを使う。

echoHello, myname is “, $sName;

出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。

10.三項演算子は一回まで

三項演算子はとても有効だ。しか優先順位に難があるせいで三項演算子ネストしようとすると以下のようなコードになってしま

$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));

括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めゴミ箱にでも捨てちまえ。

11. 真偽値のチェックは生でいけ

if ( $flag ) {}

仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。

もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。

12. ++と--の演算子を見極めろ

インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい

けがからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。

13. 代入演算子を使え

文句なしだ。これは文句がない。

他にも色々あるので覚えておこう

$a %=  1;$a &=  1;$a |=  1;$a ^=  1;$a <<= 1;$a >>= 1;

14.変数dump関数はより便利に

てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。

なのでdivを使って以下のようにしとくと便利だろう。

function p($var) {echo "<div align='left' style='background-color:white;color:black;'><pre>";print_r($var);echo "</pre></div>";}

15. 定数から手を洗え

君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!

大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがからなくなってるパターンが多い。

貴様たいなもんに、定数は制御できん。いいか設定ファイルYAML等のデータで持つようにし、その連想配列データ構造を一つ持ってるだけで定数の変わりになる。

このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めゴミ箱へ捨ててしまうといい。

認識を改めろ。俺たちはより良いPHPerにならないために努力している。

16. $_GETと$_POSTを生で使うな

できれば何かしら簡単なクラスでもいいのでラップしろ。

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を明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!

17.関数だのオブジェクトだのの問題ではな

例が良くない。こんなのは引数20個ある関数からset20回呼ぶオブジェクトに変わっただけではないか

そもそもこの20個の引数はなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし20個も引数取る時点設計が間違えている。

何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。

そんなことで悩んでる暇があったら設計を見直せ。

18.メソッドチェインを愛用せよ

スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。

ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。

19.コードの汎用化は慎重に

どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。

・・・と、いうのはやめなさい。

一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。

まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。

かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!

20. 結合度は適切に減らし、適切に結合せよ

あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。

気を抜いて。そう気を抜いて。所詮あなたコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。

結合度を減らすというのは非常に難しい何度何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。

まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。

そしてその後に、一部分使いましたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。

何事も経験が必要である経験を積まないプログラマ丸めゴミ箱に捨ててしまえ。

さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だってaddとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか

functionadd_result_output ($iVar, $iVar2) {    $r =add($iVar, $iVar2);echo result($r);}

もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!

最後

このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。

しかしもう一度タイトルを確認してほしい

あくまでも「より良いPHPerにならないための20Tips」なのだ。

君はこの記事を鵜呑みにしてはならない。PHPPHPと見抜けないPHPerはPHPを使うのは難しい

おまけ

もし、あなたPHPプログラマなら、公式のPHPドキュメントあなたのケツの穴を拭くための紙になるだろう。

私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。

あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。

この記事があなたの役に立たない事を。

どんなコメントでも待ってます

ふざけんな!

個人的な感想

この記事に書かれている内容は、丸めゴミ箱に捨てた方が良いレベルです

もしここまで読んでしまったら、丸めゴミ箱に捨てましょう。

プログラ増田のあなぐら

Permalink |記事への反応(3) | 22:34

このエントリーをはてなブックマークに追加ツイートシェア

2009-06-17

やっぱLLだな

SQL +Perl/Python/Ruby/Java +JavaScript +CSS +HTML、おまけにXMLとかJSONとかYAMLとか。DOMとかXPathとか。

Permalink |記事への反応(0) | 23:38

このエントリーをはてなブックマークに追加ツイートシェア

2008-11-01

http://anond.hatelabo.jp/20081101031143

pc@ubuntu-vm:~$mobirc/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(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

イミフ

Permalink |記事への反応(1) | 03:13

このエントリーをはてなブックマークに追加ツイートシェア

2008-10-18

real streetangels から mechanize を使って動画を取ってきてEmacsで見てみるよ

せっかく書いたから匿名でのせてみるよ

使い方は

  • 動画を取ってきたいよ
    • config.yamlユーザとかを設定するよ
    • ids.txt に取ってきたいIDを書くよ
    • sangels.bat を実行するよ
  • Emacs動画を見たいよ
    • sangels.el を load するよ
    • M-x sangels だよ

必要なものをgem で取ってくるにはこうすればいいよ

  • gem install -r log4r
  • gem install -r -v 0.6 hpricot
  • gem install -r mechanize

長すぎてelispが消えたから続きがあるよ

sangels.bat - 起動用バッチファイル

@echo offsetlocalset WD=%~dp0cd/d%WD%ruby get_movies.rbruby get_images.rbruby create_m3u.rb

ruby

config.yaml - 設定ファイル
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"
get_movies.rb
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
get_images.rb
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
create_m3u.rb
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)}"    }  }}
sangels.rb
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 &amp;&amp; !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(&amp;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
util.rb
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

Permalink |記事への反応(2) | 07:28

このエントリーをはてなブックマークに追加ツイートシェア

2008-06-02

さくらのレンタルサーバ ライトユーザが書く実情(または宣伝もしくは疑問)

http://anond.hatelabo.jp/20080601175525

他の有料レンタルサーバを使ったことないので、あてにはできないけど。

総評

ライトプランの制限

重要なこと

プラン変更は出来ない。変更したい場合は別プランで新規登録後、データを移すことになる。

その他

実際の環境

公式にはこちら

以下私の環境。これは割り当てられたサーバにより多少の違いがあり得る。その他詳細はアカウント毎に確認できる。

CPUIntel(R)Pentium(R) M processor2.00GHz
メモリ2GB
OSFreeBSD 6.1-RELEASE-p23i386
ApacheApache/1.3.39
Perl5.8.8
Ruby1.8.5
Python2.4.5

主なperlライブラリ

Permalink |記事への反応(0) | 00:54

このエントリーをはてなブックマークに追加ツイートシェア

次の25件>
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp