はてなキーワード: Fieldsとは
Java is one of the most widely used programming languages today, powering everything from mobile apps to enterprise-level software solutions. With its simplicity, versatility, and scalability, it is no wonder that many students pursuing computer science, software engineering, or related fields are required to learn Java as part of their curriculum. However, mastering Java programming can be a challenging task, and many students struggle to complete their assignments on time. If you find yourself overwhelmed with Java programming assignments, expert help is available to guide you through the complexities and ensure your academic success.
Java programming assignments often require students to write code that is both efficient and effective, while also ensuring that it is properly structured and debugged. This can be daunting for beginners or those with limited experience. Furthermore, Java involves understanding complex concepts such as object-oriented programming (OOP), algorithms, data structures, and more. With so much to learn and implement, it is easy to feel stuck, especially when deadlines are approaching.
The Importance of Java Programming Skills
Before we dive into the solutions, it's essential to understand why Java programming skills are so important. Java is not only used in academic settings but is also highly valued in the professional world. Its usage spans across industries, from finance to healthcare, and it's one of the most sought-after skills by employers. Java's robust frameworks and tools, such as Spring, Hibernate, and JavaFX, allow developers to create highly functional and secure applications.
For students, mastering Java gives them a competitive edge in the job market. Strong programming skills in Java open up opportunities for internships, freelance work, and permanent roles in software development, app development, and system engineering. Hence, excelling in Java programming assignments will not only help students complete their coursework but also prepare them for future career success.
Why You Need Expert Help with Java Assignments
If you are struggling with Java programming assignments, expert help can make a significant difference. Experts in the field can provide guidance on a variety of aspects, such as understanding key concepts, writing efficient code, and debugging errors. Whether you need help grasping object-oriented principles or implementing complex algorithms, professional programmers can offer tailored solutions to your specific needs.
Java programming assignments require precision and attention to detail, which can sometimes be overwhelming for students. By seeking Java programming assignment help, you can gain insights from professionals who have years of experience and knowledge of the language. They will help you improve your coding skills, and provide tips and best practices for writing cleaner, more maintainable code.
Additionally, experts can assist in optimizing your assignments, ensuring your code runs smoothly and meets all the required specifications. This is particularly important if you're working on a complex assignment with multiple parts, where small errors can lead to bigger issues. With expert assistance, you can avoid common mistakes and submit assignments that meet the highest academic standards.
How to Get Java Programming Assignment Help
Finding the right help for your Java assignments is easy. Many online platforms offer Java programming assignment help services, providing students with access to qualified experts who specialize in Java. These services typically include customized solutions, real-time support, and the option to communicate directly with tutors or assignment helpers.
To get the most out of these services, ensure that you provide clear details about your assignment requirements. This helps the experts understand your needs and deliver accurate solutions. Additionally, using Java programming assignment help allows you to learn the concepts behind your assignments, which will be beneficial in your future courses or professional projects.
In conclusion, mastering Java programming is essential for students pursuing a career in tech. However, the complexity of Java assignments can make it difficult to achieve success on your own. With expert help, you can strengthen your programming skills, overcome challenges, and confidently complete your assignments. Don’t hesitate to seek assistance and ensure that your Java programming journey is a smooth and rewarding one.
Visit here: https://myassignmenthelp.com/programming-help/java-programming-assignment-help.html
Java is one of the most widely used programming languages today, powering everything from mobile apps to enterprise-level software solutions. With its simplicity, versatility, and scalability, it is no wonder that many students pursuing computer science, software engineering, or related fields are required to learn Java as part of their curriculum. However, mastering Java programming can be a challenging task, and many students struggle to complete their assignments on time. If you find yourself overwhelmed with Java programming assignments, expert help is available to guide you through the complexities and ensure your academic success.
Java programming assignments often require students to write code that is both efficient and effective, while also ensuring that it is properly structured and debugged. This can be daunting for beginners or those with limited experience. Furthermore, Java involves understanding complex concepts such as object-oriented programming (OOP), algorithms, data structures, and more. With so much to learn and implement, it is easy to feel stuck, especially when deadlines are approaching.
The Importance of Java Programming Skills
Before we dive into the solutions, it's essential to understand why Java programming skills are so important. Java is not only used in academic settings but is also highly valued in the professional world. Its usage spans across industries, from finance to healthcare, and it's one of the most sought-after skills by employers. Java's robust frameworks and tools, such as Spring, Hibernate, and JavaFX, allow developers to create highly functional and secure applications.
For students, mastering Java gives them a competitive edge in the job market. Strong programming skills in Java open up opportunities for internships, freelance work, and permanent roles in software development, app development, and system engineering. Hence, excelling in Java programming assignments will not only help students complete their coursework but also prepare them for future career success.
Why You Need Expert Help with Java Assignments
If you are struggling with Java programming assignments, expert help can make a significant difference. Experts in the field can provide guidance on a variety of aspects, such as understanding key concepts, writing efficient code, and debugging errors. Whether you need help grasping object-oriented principles or implementing complex algorithms, professional programmers can offer tailored solutions to your specific needs.
Java programming assignments require precision and attention to detail, which can sometimes be overwhelming for students. By seeking Java programming assignment help, you can gain insights from professionals who have years of experience and knowledge of the language. They will help you improve your coding skills, and provide tips and best practices for writing cleaner, more maintainable code.
Additionally, experts can assist in optimizing your assignments, ensuring your code runs smoothly and meets all the required specifications. This is particularly important if you're working on a complex assignment with multiple parts, where small errors can lead to bigger issues. With expert assistance, you can avoid common mistakes and submit assignments that meet the highest academic standards.
How to Get Java Programming Assignment Help
Finding the right help for your Java assignments is easy. Many online platforms offer Java programming assignment help services, providing students with access to qualified experts who specialize in Java. These services typically include customized solutions, real-time support, and the option to communicate directly with tutors or assignment helpers.
To get the most out of these services, ensure that you provide clear details about your assignment requirements. This helps the experts understand your needs and deliver accurate solutions. Additionally, using Java programming assignment help allows you to learn the concepts behind your assignments, which will be beneficial in your future courses or professional projects.
In conclusion, mastering Java programming is essential for students pursuing a career in tech. However, the complexity of Java assignments can make it difficult to achieve success on your own. With expert help, you can strengthen your programming skills, overcome challenges, and confidently complete your assignments. Don’t hesitate to seek assistance and ensure that your Java programming journey is a smooth and rewarding one.
Visit here: https://myassignmenthelp.com/programming-help/java-programming-assignment-help.html
Java is one of the most widely used programming languages today, powering everything from mobile apps to enterprise-level software solutions. With its simplicity, versatility, and scalability, it is no wonder that many students pursuing computer science, software engineering, or related fields are required to learn Java as part of their curriculum. However, mastering Java programming can be a challenging task, and many students struggle to complete their assignments on time. If you find yourself overwhelmed with Java programming assignments, expert help is available to guide you through the complexities and ensure your academic success.
Java programming assignments often require students to write code that is both efficient and effective, while also ensuring that it is properly structured and debugged. This can be daunting for beginners or those with limited experience. Furthermore, Java involves understanding complex concepts such as object-oriented programming (OOP), algorithms, data structures, and more. With so much to learn and implement, it is easy to feel stuck, especially when deadlines are approaching.
The Importance of Java Programming Skills
Before we dive into the solutions, it's essential to understand why Java programming skills are so important. Java is not only used in academic settings but is also highly valued in the professional world. Its usage spans across industries, from finance to healthcare, and it's one of the most sought-after skills by employers. Java's robust frameworks and tools, such as Spring, Hibernate, and JavaFX, allow developers to create highly functional and secure applications.
For students, mastering Java gives them a competitive edge in the job market. Strong programming skills in Java open up opportunities for internships, freelance work, and permanent roles in software development, app development, and system engineering. Hence, excelling in Java programming assignments will not only help students complete their coursework but also prepare them for future career success.
Why You Need Expert Help with Java Assignments
If you are struggling with Java programming assignments, expert help can make a significant difference. Experts in the field can provide guidance on a variety of aspects, such as understanding key concepts, writing efficient code, and debugging errors. Whether you need help grasping object-oriented principles or implementing complex algorithms, professional programmers can offer tailored solutions to your specific needs.
Java programming assignments require precision and attention to detail, which can sometimes be overwhelming for students. By seeking Java programming assignment help, you can gain insights from professionals who have years of experience and knowledge of the language. They will help you improve your coding skills, and provide tips and best practices for writing cleaner, more maintainable code.
Additionally, experts can assist in optimizing your assignments, ensuring your code runs smoothly and meets all the required specifications. This is particularly important if you're working on a complex assignment with multiple parts, where small errors can lead to bigger issues. With expert assistance, you can avoid common mistakes and submit assignments that meet the highest academic standards.
How to Get Java Programming Assignment Help
Finding the right help for your Java assignments is easy. Many online platforms offer Java programming assignment help services, providing students with access to qualified experts who specialize in Java. These services typically include customized solutions, real-time support, and the option to communicate directly with tutors or assignment helpers.
To get the most out of these services, ensure that you provide clear details about your assignment requirements. This helps the experts understand your needs and deliver accurate solutions. Additionally, using Java programming assignment help allows you to learn the concepts behind your assignments, which will be beneficial in your future courses or professional projects.
In conclusion, mastering Java programming is essential for students pursuing a career in tech. However, the complexity of Java assignments can make it difficult to achieve success on your own. With expert help, you can strengthen your programming skills, overcome challenges, and confidently complete your assignments. Don’t hesitate to seek assistance and ensure that your Java programming journey is a smooth and rewarding one.
Visit here: https://myassignmenthelp.com/programming-help/java-programming-assignment-help.html
こいつはおすすめで出てきたから見ただけで初見だから、身元とか興味ないしあんたが調べたのか?それ見て初めて経歴を知ったくらいだが
さすがに女性ファン向けにやってるにじやホロみたいな箱の男Vをずっと追ってたりはしないけど
普通に自分と同じゲームやって実況してる人の配信とかは見るぞ、アバター使ってない人も多いけどな
k4senとかMハシとかモスラメソとかFields foodとか
解説系ならマグロヘッドとかこへーとかボビーとか飛花リリスとかだな
このへんはあんたに紹介してるわけじゃなくROMってる既プレイヤーの参考になれば程度のもんだから無視してくれ
まあ実況ならフツーに女性実況者の方が見たくなるのはあるけど別に男を毛嫌いするほどでもない
女性実況だとあんまり練度高い人がいないのが問題だけど、YouTubeなら浅瀬みやこって人が信頼できるな
Twitchだと単純に声とキャラが可愛いからひのあんって人をこっそり見てる(あそこは内輪感強い文化だからちと苦手)
ただ女性実況者だとカプ目線や男キャラ中心の消費の仕方になることが多くて、気づかなかった視点もあるからそれも悪くないんだけど
共感しやすさの点ではやっぱ感性の近い男性実況者のほうが有利な部分もある
というかここのゲームは男女の別に執着せず、全員好きになってくれってゲーム作りしてるし
プレイヤーとしても素直に全員好きになっていったほうが楽しめる
性的に保守的な人間は男キャラ引くなんて嫌かもしれないが生粋の美少女作品好きのオタだった俺でも男キャラへの生理的な嫌悪はなくなった
ていうか原神に関してはみんなヌヴィレット引いて使ってるしみんなそこそこ好きだろアイツ
https://darioamodei.com/machines-of-loving-grace
・Behavioral interventions. I haven’t much mentioned it given the focus on the biological side of neuroscience, but psychiatry and psychology have of course developed a wide repertoire of behavioral interventions over the 20th century; it stands to reason that AI could accelerate these as well, both the development of new methods and helping patients to adhere to existing methods. More broadly, the idea of an “AI coach” who always helps you to be the best version of yourself, who studies your interactions and helps you learn to be more effective, seems very promising.
(Google翻訳)
・行動介入。神経科学の生物学的側面に焦点が当てられているため、これについてはあまり触れていませんが、精神医学と心理学は、もちろん 20 世紀を通じて行動介入の幅広いレパートリーを開発してきました。AI が、新しい方法の開発と、患者が既存の方法に従うのを支援することの両方で、これらを加速させる可能性もあるのは当然です。より広い意味では、常に最高の自分になれるよう支援し、あなたのやり取りを研究して、より効果的になる方法を学ぶのを手助けしてくれる「AI コーチ」というアイデアは、非常に有望に思えます。
・Everyday problems that we don’t think of as clinical disease will also be solved. Most of us have everyday psychological problems that are not ordinarily thought of as rising to the level of clinical disease. Some people are quick to anger, others have trouble focusing or are often drowsy, some are fearful or anxious, or react badly to change. Today, drugs already exist to help with e.g. alertness or focus (caffeine, modafinil, ritalin) but as with many other previous areas, much more is likely to be possible. Probably many more such drugs exist and have not been discovered, and there may also be totally new modalities of intervention, such as targeted light stimulation (see optogenetics above) or magnetic fields. Given how many drugs we’ve developed in the 20th century that tune cognitive function and emotional state, I’m very optimistic about the “compressed 21st” where everyone can get their brain to behave a bit better and have a more fulfilling day-to-day experience.
(Google翻訳)
・臨床疾患とは考えていない日常的な問題も解決されるでしょう。私たちのほとんどは、通常は臨床疾患のレベルに達するとは考えられないような日常的な心理的問題を抱えています。怒りっぽい人もいれば、集中力に欠けたり眠気を催すことが多い人もいれば、恐れや不安を感じたり、変化に反応しにくい人もいます。今日、覚醒や集中力を高める薬(カフェイン、モダフィニル、リタリン)はすでに存在していますが、他の多くの以前の分野と同様に、さらに多くの薬が開発される可能性があります。おそらく、そのような薬はもっとたくさん存在し、発見されていないでしょう。また、標的を絞った光刺激(上記のオプトジェネティクスを参照)や磁場など、まったく新しい介入方法もあるかもしれません。20世紀に認知機能と感情状態を調整する薬がどれだけ開発されたかを考えると、誰もが脳の働きを少し良くし、より充実した日々を送れるようになる「圧縮された21世紀」について私は非常に楽観的です。
・Human baseline experience can be much better. Taking one step further, many people have experienced extraordinary moments of revelation, creative inspiration, compassion, fulfillment, transcendence, love, beauty, or meditative peace. The character and frequency of these experiences differs greatly from person to person and within the same person at different times, and can also sometimes be triggered by various drugs (though often with side effects). All of this suggests that the “space of what is possible to experience” is very broad and that a larger fraction of people’s lives could consist of these extraordinary moments. It is probably also possible to improve various cognitive functions across the board. This is perhaps the neuroscience version of “biological freedom” or “extended lifespans”.
(Google翻訳)
・人間の基本的な経験は、もっと良くなる可能性があります。さらに一歩進むと、多くの人が啓示、創造的なインスピレーション、思いやり、達成感、超越、愛、美しさ、瞑想的な平和といった特別な瞬間を経験しています。これらの経験の性質と頻度は、人によって大きく異なり、同じ人でも時期によって異なり、さまざまな薬物によって引き起こされることもあります(ただし、多くの場合は副作用があります)。これらすべては、「経験可能な空間」が非常に広く、人々の人生の大部分がこれらの特別な瞬間で構成されている可能性があることを示唆しています。さまざまな認知機能を全面的に改善することもおそらく可能です。これはおそらく、神経科学版の「生物学的自由」または「寿命の延長」です。
発達障害持ちでスペックが低い上、達成感とかの青春な感情を体験できなかった自分からすると夢のようだが、同時にこういうのを人工的に作れて皆良い人間になれるのってなんか怖くもあるな
イギリスとノルウェーのすべてをレビューすることはできませんが、ロンドン(Lūndonjon / Lūndyn / Lunden)をレビューすることができます。
西暦873年にそこに立っていたであろうものの多くは欠けています。ユービーアイソフトの歴史家は、ウィキペディアからこの地図を参考にしたようだ。
https://en.wikipedia.org/wiki/File:Map_Londinium_400_AD-en.svg
しかし、その地図には、当時のロンドンの少量の建物が含まれています。このレベルの歴史研究では、ウィキペディアのような一般的な知識サイトは不十分です。
一般:
または、フォーラムの南にあるCandelwic Strætのロンドンストーン(Millarium / Praetoriumゲート)から放射する道路のパターン:
Trajectus Way:Douegæt(川までダウンゲート)からLondon Stone(Candelwic StrætのPraetoriumゲート)まで
Wæcelinga Stræt(Praetorian Way):南東からニューゲートまで
Earninga Straete (Ermyn/Ermine street a.k.a.オールドノースロード)は、Wæcelinga Stræt southwarkに同行し、南西からDouegætに入り、Cripplegateまで北上しました
ヴィシナルウェイ(フェンチャーチ通り)TrajectusからAeldgate(旧門)を通ります
フォーラムの東:
フォーラムの西:
クリップルゲート:
ルンデンウィッチ:
ゲームには一般的な「Lundenwic Abbey」が1つあります。9世紀には、ルンデンウィッチには5つまたはおそらく7つの修道院があっただろう。
他のいくつかの観察:
LOAD DATA INFILEでCSVを分割して読み込むことは可能なのでしょうか。そのときautoincrementのidがあった場合はどうしたらよろしいでしょうか。
はい、LOAD DATA INFILEステートメントを使用してCSVファイルを分割して読み込むことは可能です。CSVファイルを分割するには、LOAD DATA INFILEステートメントのファイル名の部分にワイルドカードを使用することができます。
以下は、例としてMySQLデータベースでのLOAD DATA INFILEステートメントの使用方法です。
LOAD DATA INFILE 'path/to/files/file*.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '92;n' (col1, col2, col3); -- 列のリスト
上記の例では、path/to/files/ディレクトリ内のfile*.csvというパターンに一致するすべてのCSVファイルが読み込まれます。また、FIELDS TERMINATED BY句とLINES TERMINATED BY句を使用して、フィールドと行の区切り文字を指定しています。さらに、col1, col2, col3のように列のリストを指定することで、CSVファイルの対応する列とテーブルの列をマッピングします。
autoincrementのidがある場合、LOAD DATA INFILEステートメントでは自動的に次の値を生成することはできません。そのため、CSVファイル内に明示的にid列が存在する場合は、id列を指定して読み込む必要があります。id列がCSVファイルに存在しない場合は、テーブルの定義でid列をautoincrementに設定しておく必要があります。その場合、データベースが自動的に新しい値を生成します。
CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, col1 VARCHAR(50), col2 VARCHAR(50), col3 VARCHAR(50) );
この場合、LOAD DATA INFILEステートメントでid列を省略することで、自動的に新しい値が生成されます。
LOAD DATA INFILE 'path/to/files/file*.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '92;n' (col1, col2, col3);
このようにして、CSVファイルのデータを分割して読み込むことができます。ただし、autoincrementのid列は明示的に指定するか、データベースによって自動的に生成されるようにテーブルを設定する必要があります。
SETしないと動かない。
分割するとauto incrementの値が飛ぶ。
LOAD DATA INFILEでCSVを分割して読み込むことは可能なのでしょうか。
そのときauto incrementのidがあった場合はどうしたらよろしいでしょうか。
現象としては、分割して読み込ませるとidが連続しないで飛ぶ。
1.csvを読み込ませた最後のidが1378だと、次の2.csvに読み込ませたのは2048から始まってる。
LOAD DATA LOCAL INFILE '***.csv' INTO TABLE *** FIELDS TERMINATED BY '92;t' LINES TERMINATED BY '92;n' (@pref_name, @type, @name, @zip, @address, @tel, @fax, @lat, @lng) SET ...
唐突にreviewerがいない、とか何の話だよw
Nature is a weekly international journal publishing the finest peer-reviewed research in all fields of science and technology on the basis of its originality, importance, interdisciplinary interest, timeliness, accessibility, elegance and surprising conclusions.
何気なくググったらオルフェンズEDのライブ動画あったから見たけど歌唱力やべえ
MISIAで一番好きな曲は包み込むようにっていうくらい最初のインパクトが今でも強いし
当時はなんかすげえ高い声出せるっていうのが売りだったけどいつのまにかそんなこと言われなくなったしそんな売りがなくても普通の歌唱力で圧倒できるすごさのある歌手だった
ああそれにしてもオルフェンズの涙いいわ
アニメのEDでなぜか飛ばせないEDってあるけどオルフェンズはまさにそれだった
オルフェンズ1期だけは全部みたけど一度も飛ばせなかったわ
それにしても包み込むようにはやっぱりいいわ
大好き
ぐぐったら
作詞・作曲者である島野聡は、自身が男性2人組『Love Lights Fields』のメンバーとして活動していた時にこの曲を製作し、レコーディングも試みられていたが、同グループのボーカルだった園田利隆の歌声で発表する事に納得がいかず断念。いつかこの楽曲を歌いこなせる歌手に巡り会うまでと、封印していたのだという
だってさ
すげえわ
誰かのためになればいいなぁとは思ったけど、ほぼ自分のために書いた文章というか日記なので読みにくいと思う。ごめんなさい。
最近、鬱っぽいというか夜勤中に精神的余裕がなくなるスピードが早いのと物忘れがひどくなってきたので、心療内科に行ってみたんよ。元々、自分は精神的な病気なんかとは関係ないと思ってたんだけど、ツイッターなんかでわかり手さんとか借金玉さんとかのツイートやブログ見てたら行ってみるのもありかなぁと思いまして。
心療内科の初診の予約取るのもわりと時間が必要だった。電話をすることへのストレスと電話をしたらもうあとに引けない気がしたから。でも、仕事中に頭がパンクしそうになった時があってそこでもうダメだと思って勢いで予約の電話をした。
とりあえず、電話に出てくれた看護師の人には鬱っぽくてということで受診の予約をした。
初受診当日、逆算思考が苦手なのと方向音痴な自分を気遣ったら予約時間の40分以上前に最寄駅に着いてしまったので30分くらい散歩してから病院に向かった。
何というか、最寄駅から病院の場所を確認して散歩で時間を潰している間、ずっと憂鬱だった。怒られるわけじゃないと分かっていても、どんなことを聞かれるんだろうと考えていると頭がずっしりとしてくる。
それで、いよいよ、初受診の時間。心療内科らしく待合室のソファも診察室の椅子もふかふかだった。
ドクターには具体的に困っていることを聞かれたので前述した通り、夜勤中の精神的余裕の無さと物忘れがひどくなってきていることを伝えた。
それから、鬱の診断を下すための質問をされた。DSM-5とかいう本(世界共通の診断基準って言ってた)に沿って質問されて、それによると鬱ではないということで、抑うつという鬱っぽい状態だと思う的なことを伝えられた。
それから、順序が曖昧だけど次にADHDかどうか診断する質問をされた。集中力はあるかとかそういうやつ。それによるとたしか、軽いADHDとのことだった(ADHDに軽いとかあるかどうかわかんないし、もしかしたら自分を障害者と認めたくない自分の意識が邪魔して軽いやつと認知したのかもしれない)。
まぁ、その時点で多少はショックだったんだけど、高校で塾やめたら一気にガタ落ちした成績のこととか集中力の件とか思い返すと、しょうがないかぁという感想。
で、たしか次が心理テストでA4の紙に実がなっている木を書かされた。ドラマとか映画で見たやつ!と思いながら、真ん中にこれだと小ちゃいかなぁ…でも大きく書くのめんどくせえしなんでそもそも大きく書かんとあかんのやと思いながら木を書いてリンゴを3つほど付け足した。書いた後にリンゴの味を聞かれたので普通ですかね、と答えた。
診断によると自分は頑固で人の目を気にして抑圧状態になってると言われた。まあ、たしかにーという感じだったのでそうですねーと答えて、ドクターからの総合的な見解はADHDとそれによる二次障害的抑うつ状態とのことだった。
集中力がなくて仕事がうまく回せてないのをどうにかしないとという話の結果、コンサータが処方された。あー、借金玉さんが言ってた飲んで吐き気と戦いながら仕事するやつかと思いながら、それを2週間分処方してもらった。
それと、ドクターからは仕事のストレスを溜め込むのはよくないから自分でブログに書くなり愚痴ノートを作った方がいいとの言葉も頂いた。
で、先月にインターネットのお陰でできた彼女の家に向かうバスの中でぼおーっとEva CassidyのFields of goldを聞いてたらどういうわけか涙が止まらなくなった。どういうわけもなく、自分が発達障害であるというショックがそのタイミングで襲ってきたんだろう。彼女には病院に行くとは言ってたけど、「なんの病院?」という質問には答えられず、健康診断の聴力検査でひっかかったから耳鼻科に行くと嘘をついた。
自分が障害者であることを家族にも彼女にも、今度新幹線で久しぶりに会いに行く数少ない友達にも言えないなぁと考えるとセンチな気分になってバスの中で泣いてしまった。
重く考えすぎだよなぁとこれを書きながら思いつつも、あと1回くらいは泣きそうだなとも思う。案外、言ってしまえば周りは受け入れてくれるのかもしれないけど、急に「俺、実は発達障害だったんだよね」と知り合いに言われても反応に困るだろうから、とりあえずは言わないでおこうと思う。
それにしてもなー、これからどうしよう。いや、特別どうもしないんだけども。
とりあえず、彼女の家で帰宅を待ちつつ、夕食の献立を考えつつ彼女に貸したスプラトゥーンでもするかなぁ。あ、コンサータ飲んだらウデマエ上がるかな?
私はコミットログの書き方に悩む英語の苦手な人間である。実際、似たような人は世の中に結構いるようで、頻出単語を集計したりまとめたものは既にあって役に立つのだけれど、これらはあくまで単語の話であり、具体的な文を構成する過程でやっぱり困る部分がかなりあった。
要するに、どういう時にどういう文が使われているのか、ということを示した例文集が欲しいのである。ググると他にも「例文集があればいいのに」みたいな声はあるくせして、しかし誰も作ろうとしない。何なんだお前ら。それじゃ私が楽できないじゃないか。
ここで挙げているコミットログは全て実際のコミットログからの転載である。当然ながら各コミットログの著作権はそれぞれの書き手にある。いずれも各英文でググれば出てくるし、フェアユースの範囲なら許してくれるだろうと考え名前とプロジェクト名は割愛したが、ここにお詫びと感謝を述べておきたい。
抽出条件だが、参考にできそうなコミットログを多く含んでいそうなリポジトリをGitHubのSTARの多い方からざっと目で見て適当に選び、それぞれ最新コミットから5000件抽出した(あわせて前処理として、コミットログ冒頭のタグ情報は消去した)。
atomのみ5400件抽出していたため、計25400件のコミットログがベースである。このうち、以下の条件に合致するものは参考例にすべきでないとして一律排除した。
こうして残った8540件を眺めながら、適当に切り出したのがこの用例集である。個人的に「うーんこの」と思った表現も、散見される場合は載せた。
ということで、以下用例を羅列していく。
以上の用例をふまえ、今回の参考ログ8540件から先頭の単語を出現回数で並べると次のようになった。
Add | 1149 |
Fix | 1014 |
Update | 584 |
Remove | 566 |
Use | 382 |
Don't | 260 |
Make | 228 |
Move | 178 |
Change | 103 |
Rename | 85 |
Improve | 76 |
Avoid | 68 |
Allow | 65 |
Implement | 60 |
Handle | 58 |
コミットログの基本形はもちろん動詞 + 名詞である。名詞は固有名詞、複数形、不可算名詞が多いが、単数形の場合の冠詞は a が使われるか、あるいは省略される。the はまず使われない。
何かを追加した、という表現では非常に広く Add が使われる。メソッドからテスト、ドキュメントに至るまで大概これでまかなえる。
一方、何かを修正した、という表現では広く Fix が使われる。「何か」は typo や crash といった単語からメソッド名まで幅広い名詞を取るが、動名詞はあまり取らないのと、that節は取らないのでその点は注意が必要である。
Fix は「何かが正しく動くようにした」ことを示し、正しい動作内容が何かを説明しない。そこで正しい動作内容に言及したい場合は Make sure が使われる(こちらはthat節が取れる)。ただし Fix よりもニュアンス的に重い表現と思われ、Fix を使わず Make sure ばかり使うのはちょっとキモいのではないかと思う(Ensure はさらに重い表現っぽい)。
また、Fix は typo 以外でのドキュメント修正に対して使われることは稀である。対して Update はドキュメント、コメント、テストに使われ、本体のコードの修正に対しては使われない。本体コードの修正にあわせてテストも更新したなら Update が使われる。ただ、テスト機構それ自体のバグを修正したなら Fix である。
無駄な何かを単純に除去したなら Remove を使う。これまでのもの(A)から別のもの(B)に切り替えたのであれば Use B instead of A か Change A to B が使われる。新たに何かを利用するようにしたのであれば Use を、利用を取りやめた場合は Don't use を使うことが多い。
何かをしないようにしたなら Don't を、内部実装の効率化なら Make A + 比較級/形容詞 か Improve が使われる。
中身の変更を伴わない単なる名前の変更なら Rename A to B、コードや機能の論理上の場所を移動させたなら Move A to B である。
この辺はリファクタリングと呼ばれる行為と思うが、Refactor というぼんやりした動詞はあまり使われず、このように変更内容の種類に応じて動詞が使い分けられている。
コミットログにはWhyを書くべきだ、というのを何かで見かけたので because とか since を使ったログがどの程度あるかを調べたが、8540件のうち22件だった。基本的に短く、シンプルに、一目で意味が取れるログが好まれる傾向がある。例えば get rid of とか2件しか使われておらず、圧倒的に remove である。
一方で、シンプルな単語だけど開始単語としては使われないものもある。例えば次のような単語である。Expand(9)、Extend(8)、Print(5)、Optimize(5)、Publish(4)、Append(4)、Modify(3)、Manage(2)、Revise(2)、Dump(2)、Insert(2)、Migrate(2)、Enhance(1)、Edit(1) 。いずれもカッコ内は8540件に対する冒頭での登場回数である。結局、より一般的で平易な単語で表せたり、Refactor同様に抽象度が高すぎると使われないのだろう。
8000件もログを見たおかげで、迷いなくコミットメッセージが思いつくようになったのが個人的には今回書いてて最大の収穫だった。たぶんカンニングペーパーを作る行為それ自体が効率のいい学習になるという話と同じだと思う。
このまとめも100以上用例を転載してあるので、それを読むだけでも多少は効果があるんじゃないかと思う。同じようにコミットログ書きたくねぇなぁ英語わっかんねぇなぁと思っている人にとって、何か役に立つところがあれば幸いである。
Physics の青色ダイオードの中村・赤崎・天野の受賞や私戦予備陰謀疑いのほうがさわがしいかもしれませんが,ノーベル生理学・医学賞に関して.
John O' Keefe, May-Britt Moser, Edvard Moser の三名が 2014 年のノーベル生理学・医学賞を受賞した.受賞理由は脳の位置定位系を構成する細胞の発見に対してである.“for their discoveries of cells that constitute a positioning system in the brain”. 視覚や聴覚,触覚で得た物理的な環境のあるいは自己の位置に関する情報は脳内でどのように処理されているだろうか.力学的に考えると,質点と空間座標と時間の成分がありそうなものである.マウス生体での神経科学的な実験で,位置特異的に神経の活動(活動電位の頻度)が上昇する細胞が海馬でみつかった.最近の in vivo の実験で place cell の特性や grid cell の特性,視覚系・運動系との place cell 回路の連絡等がさらに解明され始めている.少し古い神経生理学に関連する著名な科学者では,James Gibson や David Marr が有名かもしれない.聴覚系での位相差からの音源位置推定,視覚系での網膜および外側膝状体 LGN,一次視覚野,高次視覚野の回路等感覚の認知の神経科学はよく調べられてきたが,受賞対象の位置定位系は脳内の感覚と運動を統合する上で重要な具体的な情報表現と情報処理にせまった分野になっている.
ごくごく戯画化した,脳の作動機構は,神経細胞は他の細胞と同様に細胞膜をもちその内外のイオン組成をポンプとチャネルとよばれる細胞膜にタンパク質で糖を燃焼してえたエネルギーを元に維持する.神経細胞が同士が突起を多数のばし接触点を多数つくりそこで,膜のイオンを電位差をより正にする化学分子を放出したり,より負にする化学分子を放出したりする.電位差が十分小さくなると多くの神経細胞では電位依存的なナトリウムイオンチャネルが活発に作動し突起を一次元的に減衰せずに伝わっていく活動電位をおこす.多くの神経系での通信と計算の実体は,この化学伝達と電気伝導の組合せで,静的な記憶は細胞の結合(シナプス synapses)が構成する回路に,シナプスの化学伝達特性や回路水準の論理演算やより高度な情報処理の結果であると作業仮説がたっており,具体的な情報処理の神経回路の機構を解明することは重要である.
位置定位系の回路を構成する要素の place cell は,脳の大脳の海馬とよばれる短期記憶や長期記憶化に重要な部位にあるアンモン角 (Cornu Ammonis)の錐体(神経)細胞 pyramidal neuronである.特定の場所で活動が上昇することが証明されている.脳内の空間情報処理で他の細胞とともにどのような回路をなしているか調べるには,place cell への入力と出力,place cell 間の直接的な結合をさらに調べることになる.O'Keefe, Moser 以後も熱心に研究されている神経科学の重要な問題である.海馬に出力する嗅内皮質 entorhinal cortex の格子細胞 grid cell(環境のスケールに応じた格子を表現するようなユークリッド空間中の格子のような役割を担う細胞),各所の頭方位細胞 head direction cell,時間細胞 time cell も発見されている.物理学的な情報の表現と計算に必要な神経回路の構成要素がわかりその作動機構がわかってきそうな気がしてくる.21 世紀は,人体生理学のおそらく最大で最後の問題である脳の作動機構の同定にかなりせまってきており,先のことはよくわからないが脳のことは今世紀中にはだいたいのことがわかり,計算機でもっとよい知能が実装できそうな勢いである.
ノーベル賞は「物理学、化学、医学生理学、文学、平和、経済(ただし経済分野はスウェーデン国立銀行賞)」の分野で重要な業績を残した個人に贈られる.Physiology or Medicine の分野ではカロリンスカ研究所が選考にあたる.ノーベル賞は,ダイナマイトの開発生産でノーベルが残した遺産を基金としはじまった.現代では,数学の Fields Medal や計算機の Turing Award とならびたつような権威ある賞として,世界中で科学の営みに参加する人々・興味ある人々が注目する伝統儀式を続けるお祭りになっている.医学生理学の分野では生理学的に重要な機構の解明や臨床応用で人類の医学的な福利向上につながる発見などにおくられる.なかなか毎年趣味がよいとおもわれる.繰り返しであるが,選考委員会が示した,今回の授賞は,脳での空間認識の回路で重要な働きをする place cell 場所細胞の発見が理由である.
匿名ダイアリーにこんな言い訳も不要かと思うのだけれど,ノーベル賞委員会の公式アナウンスメントとFundamental Neuroscience か Principles of Neural Science や関連論文や日本語の教科書・一般書等を読めばよい.高校生物に毛が生えた教養程度の神経科学の知識しかない劣等の学部生ながら,今回受賞の対象になった O’ Keefe と Moser 夫妻の神経系における自己位置の表現の神経回路の重要な細胞というテーマに興味があるので駄文を書いた.
脳科学辞典 場所細胞 http://bsd.neuroinf.jp/wiki/%E5%A0%B4%E6%89%80%E7%B4%B0%E8%83%9E
プログラムはclassに記述します。たとえばSampleという名前のclassを作る場合、Sample.csファイル内に次のように書きます。(C#の場合、ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)
public class Sample { }
プログラムはclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます。
public class Sample { public static void Main( String[] args ) { // 処理を書く } }
Console.WriteLine( "Hello world" );
コメントです。
// 一行コメント /* 複数行コメント */
// 変数 int num;
データ型です。C#のデータ型には値型と参照型とがあります。以下は値型のデータ型です。
// int(整数)型 int num; // char(文字)型 char c; // float(単精度浮動小数点)型 float val; // double(倍精度浮動小数点)型 double val; // bool(論理)型 bool flag; // DateTime(日付)型 DateTime date;
以下は参照型のデータ型です。
// String型 String s; // 配列型 String[] array;
プログラムをコンパイルするには、コマンドラインで以下のようにします。
csc Sample.cs
プログラムを実行するには、コマンドラインで以下のようにします。
Sample.exe
mono ./Sample.exe
int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます。
int i = 2; int i = 100000000; float num = 1.234f; double num = 1.234;
四則演算です。
num = 1 + 1; num = 1 - 1; num = 1 * 2; num = 1 / 2;
商の求め方です。割る数と割られる数が両方とも整数の場合、計算結果の小数点以下が切り捨てられます。
num = 1 / 2; // 0
割る数と割られる数のどちらかが小数の場合、計算結果の小数点以下が切り捨てられません。
num = 1.0 / 2; // 0.5 num = 1 / 2.0; // 0.5 num = 1.0 / 2.0; // 0.5
余りの求め方です。
// 余り mod = 4 % 2
インクリメントとデクリメントです。
// インクリメント ++i; // デクリメント --i;
String str = "abc";
// 結合 String join = "aaa" + "bbb"; // 分割 String[] record = "aaa,bbb,ccc".Split( "," ); // 長さ int length = "abcdef".Length(); // 切り出し "abcd".Substring( 0, 2 ) // abc // 検索 int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
配列です。
// 配列の宣言 int[] array;
配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。
int[] array; // 要素数を指定して配列を生成 array = new int[5]; // 初期データを指定して配列を生成 array = new int[] { 1, 2, 3 }; // 宣言と同時に配列を生成 int[] array2 = new int[5];
配列の要素の参照と代入です。
// 要素の参照 array[0] array[1] // 要素の代入 array[0] = 1; array[1] = 2;
array_num = array.Length;
int[] from = new int[] { 1, 2, 3 }; int[] to = new int[5]; from.CopyTo(to, 0);
if文です。
if ( 条件 ) { }
if ~ else文です。
if ( 条件 ) { } else { }
if ~ else if文です。
if ( 条件 ) { } else if ( 条件 ) { }
while文です。
int i = 0; while ( i < 5 ) { // 処理 ++i; }
for文です。
for ( int i = 0; i < 5; ++i ) { // 処理 }
int[] fields = new int[] { 1, 2, 3 }; foreach (int field in fields) { // 処理 }
C#では関数をメソッドと言います。メソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います。
static int sum( int num1, int num2 ) { int total; total = num1 + num2; return total; }
ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。
using System.IO;
以下がファイル入力の雛形になります。ファイルのオープンや読み込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamReader reader = null; try { reader = new StreamReader(filename); String line; while ((line = reader.ReadLine()) != null) { } } catch (IOException e) { // エラー処理: } finally { if (reader != null) { try { reader.Close(); } catch (IOException e) { } } }
またはC#ではusing ステートメントと言うものがあり、この様にも書ける
String filename = "text.txt"; using (StreamReader reader = new StreamReader(filename)) { try { String line; while ((line = reader.ReadLine()) != null) { // 読み込んだ行を処理 } } catch (IOException e) { // エラー処理: } }
usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるときに自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードがスッキリするが、使いにくい場面もあるので考えて使うこと。
以下がファイル出力の雛形になります。ファイルのオープンや書き込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamWriter writer = null; try { writer = new StreamWriter(filename)); writer.WriteLine("abc"); writer.WriteLine("def"); writer.WriteLine("fgh"); } catch (IOException e) { // エラー処理: } finally { if (writer != null) { writer.Close(); } }
こちらもusingを使って書ける。が、割愛する。
C#でよく出てくる知っておいたほうがよい文法の一覧です。
繰り返し文の途中で抜けるにはbreak文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { break; // 条件を満たす場合、for文を抜ける。 } }
残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { continue; // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。 } }
例外を投げるにはthrow文を使用します。
throw new Exception( "Error messsage" );
try { // 例外が発生する可能性のある処理 } catch ( Exception e ) { // 例外発生時の処理 }
アグリコラのWMデッキについては、Table Games in the Worldで和訳が公開されている( http://www.tgiw.info/2012/03/wm5.html から辿れる。)。WMデッキについては公式の和訳が存在しないことから、このような有志による和訳の公開は貴重であり、アグリコラファンの1人として最大の感謝の意を示したい。
しかしながら、公開されている英語版のテキストとつき合わせて見たときに、上記和訳にはいくつかの点で致命的な誤訳があり、また、いくつかのカードについては補足が必要であることに気づいた。
そのため、上記和訳には感謝を示しつつも、日本のアグリコラファンがより適切なプレイングを楽しめるよう、誤訳の指摘と補足を執筆することにした。なお、筆者がブログを持ち合わせていないために、このような匿名ダイアリーで指摘をさせていただくことになった非礼をお詫びしたい。
原文:「At the end of the game, you receive 1 Bonus point for each of the 5 columns of your farmyard that is either all rooms, all fields or all in the same pasture.」
誤「得点計算のとき、自分の農場の縦5マスの列を見て、5マス全てが部屋か、5マス全てが畑か、5マスのうち3マスが同じ牧場に属していたら、1列につき1点を得る」
↓
正「得点計算のとき、自分の農場の各列(縦3マス)を見て、3マス全てが部屋か、3マス全てが畑か、3マス全てが同じ牧場に属していたら、1列につき1点を得る。」
【補足】縦1列は3マスである。3マス全てが部屋か、畑か、同じ牧場に属していれば、そのような列1つにつき1点(最大で5点になる)ということ。
【補足】増改築、大進歩のコストとして支払うべき資材のうち最大1つを食料で代用できるという意味。コストと無関係の手元の資材をこの機会に食料1に代えておける、ということではない。
原文:「Whenever you use an Action space orthogonally adjacent to an occupied "Family growth" Action space from stage 2 or stage 5, you receive 1 Grain immediately before.」
【補足】occupiedとあるので、「家族を増やす」のアクションスペースが既に埋まっている場合に限定されるようである。
【補足】厩は「逆さま」ではなく横向けに倒して置く。というかあのコマを逆さまには置けない(笑)
原文:「Once any player has built an Oven, place 1 Food on the remaining Round spaces. At the start of these rounds, you receive the Food. (If an Oven has already been built, place the Food immediately. If multiple Ovens are built, you only receive the Food once.)」
誤:「次にかまどを作ったら、残っているラウンドスペース全てに食料1ずつ置く。各ラウンドのはじめに、この食料を得る(すでにかまどをもっていたら、かまどがいくつあってもすぐに食料1ずつ置く。「かまど」とは○○かまどという名前の、パンを焼く進歩カード)」
↓
正:「誰かが暖炉を作ったら、それ以降のラウンドスペース全てに1つずつ食料を置く。各ラウンドのはじめに、この食料を得る(すでに暖炉ができていたらすぐに食料を並べる。複数の暖炉が作られても、食料を置くのは一度だけ)」
【補足】Ovenは「かまど(Fireplace)」ではなく「暖炉」である(大きい進歩としては「レンガの暖炉(Clay Oven)」と「石の暖炉(Stone Oven)」がある)。また、暖炉を作るプレイヤーは誰でもよい。井戸で起動する「水運び」(I262)の暖炉版である。
【補足】直後にそのアクションスペースを使ったプレイヤーが回収しなかった場合には、置かれた資材はそのままそこに残る。誰かが回収するまで、そこを使ったプレイヤーに購入権が与えられる。
(参照:http://play-agricola.com/Agricola/Cards/index.php?id=1068 )
【補足】この職業自体には、資材が累積するスペースに複数ある資材のうちの1つだけを取って他を残しておく、という能力はない。あくまでも、1つしか累積がなかった場合の救済措置である。もっとも、キノコ探し(I196)やかご(E34)のように資材の一部を残しておく能力が別にあって、その効果で結局1つしか資材を取らなかった、という場合には、この職業の効果は発動する。
なお、5人プレイ時に葦が累積する葦石木のアクションスペースについては、葦の累積個数にかかわらず、全体で最低3つの資材を取ることとなるから、この職業の効果は発動しない。
(参照:http://play-agricola.com/Agricola/Cards/index.php?id=1885 )
【補足】追加で繁殖するのは、6,8,10,12ラウンドの「終了時」である。
原文:「Whenever you build a Baking Improvement with the bread symbol, you receive 1 Grain before building the Improvement. Whenever you build an Oven, pay 1 Building resource less of your choice. (An Oven is a Baking Improvement with "Oven" in the name.)」
誤:「すべての暖炉を資材どれか1つ少なく作ることができる。パンを焼くアクションのたびに、その直前に小麦1をストックから手に入れる。(パンを焼くアクションにはパンのマークが付いています。暖炉(「○○暖炉」という名前の進歩カード)を使うのもパンを焼くアクションです)」
↓
正:「あなたがパンのマークのついた進歩をプレイするたびに、その直前に小麦1を共通のストックから手に入れる。すべての暖炉を、好きな資材1つ少なく作ることができる」
【補足】パンを焼く進歩カードをプレイ(・購入)するたびに起動する。「炭焼き」(E182)と同じ。
原文:「Each round, instead of placing your first Family member on an Action space, you may place it on this card and receive 2 Food and 1 Guest token to place that round. (You may not do this if you will be placing more people after your first without another player placing in between.)」
誤:「~(最初の家族を置いた直後にこのカードを使うことはできない)」
↓
【補足】最後の括弧は、「遅寝(Late Sleeper)」(G037)のように、他の全プレイヤーの手番が終了するまで自分の手番がスキップされる状況でこの効果が使えると強すぎるため、それを回避する趣旨で設けられたルールである。
(参照:http://play-agricola.com/Agricola/Cards/index.php?id=505 )
原文:「Immediately place a person that is not already placed on an Action space on the "After Family Growth also 1 Minor Improvement" Action space even if it is occupied by you or another player and take that action.」
誤:「~ほかのプレイヤーがそのアクションスペースに家族を置いていてもよい。~」
↓
【補足】自分自身が既にそのアクションスペースを使っている場合にも使える。
【補足】「得点計算の直前に葦をボーナス点に換えられる」ということの意味は、かご製作所のボーナス点を計算する前にこれらの葦を消費してしまうことにある。
【補足】誤:「子孫」→正:「新生児」
【補足】収穫「の開始時」のたびに
【補足】「労働から帰宅の間に」に相当する原文は「between the Work and Returning home phase」であり、労働フェイズと帰宅フェイズの間、すなわち「全員が家族を置いた後」を意味する。「曲芸師」(I269)や「営農家」(K289)と同様。
【補足】捨ててもよい物乞いカードは、直前の食糧供給フェイズに受け取ったものに限らない(以前の収穫の食糧供給フェイズに受け取ったものでもよい。)。
【補足】誤:「柵」→正:「厩」(stable)
【補足】「厩作り」という名前のカードは他に存在する(E208)。「厩務員」という名前はどうだろうか。
原文:「At any time, you may convert all the printed Victory points (if any) of an Improvement in front of you to 3 Food per point. After, you may not return or remove the Improvement and you no longer receive its Victory points. If Pawnbroker gets turned face down or discarded, you still lose the points.」
誤:「~食料を取ったカードは戻したり取り除いたりしない~」
↓
【補足】例えば「かまど」を3食糧に変換したら、その「かまど」を返して「調理場」にアップグレードすることができなくなる。
【補足】「木こり」という名前のカードは他に存在する(E176)。「木工職人」という名前はどうだろうか。
【補足】「この木材はいつでも共通のストックに戻すことができ、戻したラウンドが終わるまでの間に家畜を何頭でも食料にできる」というのは、戻したラウンドに限り(その終了時までは)家畜を食料に変換できる、という意味である。
【補足】たとえば次の盤面なら「ほかの畑1ヵ所のみと接している畑」が3つで2点。
畑 畑 畑 牧 牧 家 畑 空 牧 牧 家 家 家 牧 牧
5点(「ほかの畑1ヵ所のみと接している畑」が5以上)取るためにはこういった配置が必要。
家 牧 畑 空 畑 家 畑 畑 畑 畑 家 家 畑 空 畑
(参照:http://play-agricola.com/Agricola/Cards/index.php?id=637 )
原文:「Clockwork Man counts as 1 Occupation and 1 Minor Improvement.」
↓
【補足】1枚目の職業を出す前にこのカードをプレイすると、「職業」のアクションスペースでの食料の支払いが無料ではなくなることに注意。
原文:「Whenever you use the "Plow 1 Field" Action space, you may Plow 2 fields if they are not diagonally or orthogonally adjacent to each other instead of 1.」
誤:「家族コマで「畑1を耕す」のアクションを行い、実際に畑1だけを耕すたびに、すぐさらに畑2を耕せる。~」
↓
正:「「畑1を耕す」のアクションを行うたびに、畑1の代わりに畑2を耕すことができる。~」
【補足】追加は畑1
シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編 - Yamashiro0217の日記の解答例です。MySQL 5.5です。
mysql> CREATE TABLE log ( -> id BIGINT PRIMARY KEY AUTO_INCREMENT, -> server_host VARCHAR(30), -> access_time DATETIME, -> user_id INT, -> access_url VARCHAR(191) -> ); Query OK, 0 rows affected (0.00 sec) mysql> LOAD DATA LOCAL INFILE 'log.csv' -> INTO TABLE log -> FIELDS TERMINATED BY ',' -> (server_host, @unixtime, user_id, access_url) -> SET access_time = FROM_UNIXTIME(@unixtime); Query OK, 9 rows affected (0.01 sec) Records: 9 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT server_host, access_time, user_id, access_url -> FROM log; +-------------+---------------------+---------+--------------+ | server_host | access_time | user_id | access_url | +-------------+---------------------+---------+--------------+ | server1 | 2012-07-27 13:25:24 | 30 | /video.php | | server2 | 2012-07-27 13:25:10 | 20 | /profile.php | | server3 | 2012-07-27 13:25:15 | 7 | /login.php | | server1 | 2012-07-27 13:25:05 | 8 | /profile.php | | server2 | 2012-07-27 13:26:45 | 35 | /profile.php | | server2 | 2012-07-27 13:25:10 | 20 | /profile.php | | server3 | 2012-07-27 13:26:45 | 30 | /login.php | | server4 | 2012-07-27 13:27:05 | 12 | /video.php | | server1 | 2012-07-27 13:27:45 | 7 | /video.php | +-------------+---------------------+---------+--------------+ 9 rows in set (0.00 sec)
mysql> SELECT server_host, access_url -> FROM log; +-------------+--------------+ | server_host | access_url | +-------------+--------------+ | server1 | /video.php | | server2 | /profile.php | | server3 | /login.php | | server1 | /profile.php | | server2 | /profile.php | | server2 | /profile.php | | server3 | /login.php | | server4 | /video.php | | server1 | /video.php | +-------------+--------------+ 9 rows in set (0.00 sec)
mysql> CREATE INDEX log_ix1 ON log (server_host); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT server_host, access_time, user_id, access_url -> FROM log -> WHERE server_host = 'server4'; +-------------+---------------------+---------+------------+ | server_host | access_time | user_id | access_url | +-------------+---------------------+---------+------------+ | server4 | 2012-07-27 13:27:05 | 12 | /video.php | +-------------+---------------------+---------+------------+ 1 row in set (0.00 sec)
mysql> SELECT COUNT(*) -> FROM log; +----------+ | COUNT(*) | +----------+ | 9 | +----------+ 1 row in set (0.00 sec)
mysql> SELECT server_host, access_time, user_id, access_url -> FROM log -> ORDER BY server_host, user_id -> LIMIT 5; +-------------+---------------------+---------+--------------+ | server_host | access_time | user_id | access_url | +-------------+---------------------+---------+--------------+ | server1 | 2012-07-27 13:27:45 | 7 | /video.php | | server1 | 2012-07-27 13:25:05 | 8 | /profile.php | | server1 | 2012-07-27 13:25:24 | 30 | /video.php | | server2 | 2012-07-27 13:25:10 | 20 | /profile.php | | server2 | 2012-07-27 13:25:10 | 20 | /profile.php | +-------------+---------------------+---------+--------------+ 5 rows in set (0.00 sec)
mysql> SELECT COUNT(DISTINCT server_host, access_time, user_id, access_url) -> FROM log; +---------------------------------------------------------------+ | COUNT(DISTINCT server_host, access_time, user_id, access_url) | +---------------------------------------------------------------+ | 8 | +---------------------------------------------------------------+ 1 row in set (0.00 sec)
COUNT関数の中にDISTINCTを書けるのは覚えておくと便利です。
mysql> SELECT COUNT(DISTINCT user_id) -> FROM log; +-------------------------+ | COUNT(DISTINCT user_id) | +-------------------------+ | 6 | +-------------------------+ 1 row in set (0.00 sec)
mysql> SELECT access_url, COUNT(*) -> FROM log -> GROUP BY access_url -> ORDER BY COUNT(*) DESC -> LIMIT 1; +--------------+----------+ | access_url | COUNT(*) | +--------------+----------+ | /profile.php | 4 | +--------------+----------+ 1 row in set (0.00 sec)
mysql> SELECT REPLACE(server_host, 'server', 'xxx'), COUNT(*) -> FROM log -> GROUP BY server_host; +---------------------------------------+----------+ | REPLACE(server_host, 'server', 'xxx') | COUNT(*) | +---------------------------------------+----------+ | xxx1 | 3 | | xxx2 | 3 | | xxx3 | 2 | | xxx4 | 1 | +---------------------------------------+----------+ 4 rows in set (0.00 sec)
mysql> SELECT DISTINCT user_id -> FROM log -> WHERE user_id >= 10 -> ORDER BY user_id; +---------+ | user_id | +---------+ | 12 | | 20 | | 30 | | 35 | +---------+ 4 rows in set (0.00 sec)
やー。面倒でした。
古い情報だと Outlook Express を経由しろと書いてあるので、後継であるらしいWindows Live Mail を経由して(Windows Live Mail からエクスポートする方法で)
Outlook に移行したのだが、どういうわけか宛名が文字列として移行されてしまい、xxx@example.com というメールアドレスの移行ができなかったんです。
で eml → msg もしくは pst 形式への変換ソフトを探すのですが、無料のものが見つからなくてあんまり情報もありませんでした。が、ありましたよ!お兄さん。
====
MAPI data collection and parsing tool. Supports property tag lookup, error translation, smart view processing, rule tables, ACL tables, contents tables, and MAPI<->MIME conversion. MrMAPI currently knows: 3916 property tags 801 dispids 35 types 58 guids 148 errors 27 smart view parsers Usage: MrMAPI -? MrMAPI [-Search] [-Dispids] [-Number] [-Type <type>] <property number>|<property name> MrMAPI -Guids MrMAPI -Error <error> MrMAPI -ParserType <type> -Input <input file> [-Binary] [-Output <output file>] MrMAPI -Flag <flag value> [-Dispids] [-Number] <property number>|<property name> MrMAPI -Rules [-Profile <profile>] [-Folder <folder>] MrMAPI -Acl [-Profile <profile>] [-Folder <folder>] MrMAPI [-Contents | -HiddenContents] [-Profile <profile>] [-Folder <folder>] [-Output <output directory>] [-Subject <subject>] [-MessageClass <message class>] [-MSG] [-List] MrMAPI -ChildFolders [-Profile <profile>] [-Folder <folder>] MrMAPI -XML -Input <path to input file> -Output <path to output file> MrMAPI -FID [fid] [-MID [mid]] [-Profile <profile>] MrMAPI -MAPI | -MIME -Input <path to input file> -Output <path to output file> [-CCSFFlags <conversion flags>] [-RFC822] [-Wrap <Decimal number of characters>] [-Encoding <Decimal number indicating encoding>] [-AddressBook] [-Unicode] [-Charset CodePage CharSetType CharSetApplyType] All switches may be shortened if the intended switch is unambiguous. For example, -T may be used instead of -Type. Help: -? Display expanded help. Property Tag Lookup: -S (or -Search) Perform substring search. With no parameters prints all known properties. -D (or -Dispids) Search dispids. -N (or -Number) Number is in decimal. Ignored for non-numbers. -T (or -Type) Print information on specified type. With no parameters prints list of known types. When combined with -S, restrict output to given type. -G (or -Guids) Display list of known guids. Flag Lookup: -Fl (or -Flag) Look up flags for specified property. May be combined with -D and -N switches, but all flag values must be in hex. Error Parsing: -E (or -Error) Map an error code to its name and vice versa. May be combined with -S and -N switches. Smart View Parsing: -P (or -ParserType) Parser type (number). See list below for supported parsers. -B (or -Binary) Input file is binary. Default is hex encoded text. Rules Table: -R (or -Rules) Output rules table. Profile optional. ACL Table: -A (or -Acl) Output ACL table. Profile optional. Contents Table: -C (or -Contents) Output contents table. May be combined with -H. Profile optional. -H (or -HiddenContents) Output associated contents table. May be combined with -C. Profile optional -Su (or -Subject) Subject of messages to output. -Me (or -MessageClass) Message class of messages to output. -Ms (or -MSG) Output as .MSG instead of XML. -L (or -List) List details to screen and do not output files. Child Folders: -Chi (or -ChildFolders) Display child folders of selected folder. MSG File Properties -X (or -XML) Output properties of an MSG file as XML. MID/FID Lookup -Fi (or -FID) Folder ID (FID) to search for. If -FID is specified without a FID, search/display all folders -Mid (or -MID) Message ID (MID) to search for. If -MID is specified without a MID, display all messages in folders specified by the FID parameter. MAPI <-> MIME Conversion: -Ma (or -MAPI) Convert an EML file to MAPI format (MSG file). -Mi (or -MIME) Convert an MSG file to MIME format (EML file). -I (or -Input) Indicates the input file for conversion, either a MIME-formatted EML file or an MSG file. -O (or -Output) Indicates the output file for the convertion. -Cc (or -CCSFFlags) Indicates specific flags to pass to the converter. Available values (these may be OR'ed together): MIME -> MAPI: CCSF_SMTP: 0x02 CCSF_INCLUDE_BCC: 0x20 CCSF_USE_RTF: 0x80 MAPI -> MIME: CCSF_NOHEADERS: 0x0004 CCSF_USE_TNEF: 0x0010 CCSF_8BITHEADERS: 0x0040 CCSF_PLAIN_TEXT_ONLY: 0x1000 CCSF_NO_MSGID: 0x4000 CCSF_EMBEDDED_MESSAGE: 0x8000 -Rf (or -RFC822) (MAPI->MIME only) Indicates the EML should be generated in RFC822 format. If not present, RFC1521 is used instead. -W (or -Wrap) (MAPI->MIME only) Indicates the maximum number of characters in each line in the generated EML. Default value is 74. A value of 0 indicates no wrapping. -En (or -Encoding) (MAPI->MIME only) Indicates the encoding type to use. Supported values are: 1 - Base64 2 - UUENCODE 3 - Quoted-Printable 4 - 7bit (DEFAULT) 5 - 8bit -Ad (or -AddressBook) Pass MAPI Address Book into converter. Profile optional. -U (or -Unicode) (MIME->MAPI only) The resulting MSG file should be unicode. -Ch (or -Charset) (MIME->MAPI only) Character set - three required parameters: CodePage - common values (others supported) 1252 - CP_USASCII - Indicates the USASCII character set, Windows code page 1252 1200 - CP_UNICODE - Indicates the Unicode character set, Windows code page 1200 50932 - CP_JAUTODETECT - Indicates Japanese auto-detect (50932) 50949 - CP_KAUTODETECT - Indicates Korean auto-detect (50949) 50221 - CP_ISO2022JPESC - Indicates the Internet character set ISO-2022-JP-ESC 50222 - CP_ISO2022JPSIO - Indicates the Internet character set ISO-2022-JP-SIO CharSetType - supported values (see CHARSETTYPE) 0 - CHARSET_BODY 1 - CHARSET_HEADER 2 - CHARSET_WEB CharSetApplyType - supported values (see CSETAPPLYTYPE) 0 - CSET_APPLY_UNTAGGED 1 - CSET_APPLY_ALL 2 - CSET_APPLY_TAG_ALL Universal Options: -I (or -Input) Input file. -O (or -Output) Output file or directory. -F (or -Folder) Folder to scan. Default is Inbox. See list below for supported folders. Folders may also be specified by path: "Top of Information Store\Calendar" Path may be preceeded by entry IDs for special folders using @ notation: "@PR_IPM_SUBTREE_ENTRYID\Calendar" MrMAPI's special folder constants may also be used: "@12\Calendar" "@1" -Pr (or -Profile) Profile for MAPILogonEx. -M (or -MoreProperties) More properties. Tries harder to get stream properties. May take longer. -No (or -NoAddins) No Addins. Don't load any add-ins. -On (or -Online) Online mode. Bypass cached mode. -V (or -Verbose) Verbose. Turn on all debug output. Smart View Parsers: 1 Additional Ren Entry IDs Ex 2 Appointment Recurrence Pattern 3 Conversation Index 4 Entry Id 5 Entry List 6 Extended Folder Flags 7 Extended Rule Condition 8 Flat Entry List 9 Folder User Fields Stream 10 Global Object Id 11 Property 12 Property Definition Stream 13 Recipient Row Stream 14 Recurrence Pattern 15 Report Tag 16 Restriction 17 Rule Condition 18 Search Folder Definition 19 Security Descriptor 20 SID 21 Task Assigners 22 Time Zone 23 Time Zone Definition 24 Web View Persistence Object Stream 25 Nickname Cache 26 Encode Entry ID 27 Decode Entry ID Folders: 1 Calendar 2 Contacts 3 Journal 4 Notes 5 Tasks 6 Reminders 7 Drafts 8 Sent Items 9 Outbox 10 Deleted Items 11 Finder 12 IPM_SUBTREE 13 Inbox 14 Local Freebusy 15 Conflicts 16 Sync Issues 17 Local Failures 18 Server Failures 19 Junk E-mail Examples: MrMAPI PR_DISPLAY_NAME MrMAPI 0x3001001e MrMAPI 3001001e MrMAPI 3001 MrMAPI -n 12289 MrMAPI -t PT_LONG MrMAPI -t 3102 MrMAPI -t MrMAPI -s display MrMAPI -s display -t PT_LONG MrMAPI -t 102 -s display MrMAPI -d dispidReminderTime MrMAPI -d 0x8502 MrMAPI -d -s reminder MrMAPI -d -n 34050 MrMAPI -p 17 -i webview.txt -o parsed.txt
これからWordpressを始める方、あるいは始めている方が
Wordpressのプラグインを探す際に便利になるかな、と思いまとめてみました。
(1)基本的なプラグイン
2011年版!絶対にインストールしたいWordPressプラグイン45個|Vanilla Rock
http://vanilla-rock.com/blog/wordpress/45-absolutely-install-wordpress-plugin/
Wordpressを始めた人が最初に見ておくと、何かと便利かと思います。
WordPressでブログを作ったら入れるべき27個のプラグイン|AUTHORITY SITE
http://www.authority-site.com/2010/04/wordpress/27-wordpress-plugin.html
記事内やサイドバー内で、PHPを扱うことができるものなどの紹介。
使用中のおすすめWordPressプラグイン15個 | Webクリエイターボックス
http://www.webcreatorbox.com/tech/recommended-wordpress-plugin/
フォーム用キャプチャのプラグインReally Simple CAPTCHAや、
管理画面に行かなくてもタイトルや本文、カテゴリー名などを編集できるFront-end Editorなどの紹介。
WordPressプラグイン 必須なものから便利なちょっとしたものまで(Webデザインレシピ)
http://webdesignrecipes.com/my-favorite-wordpress-plugins/
記事中の画像を1枚だけ取得してサムネイル表示してくれるPost Thumb Revisitedや、
携帯電話から記事を投稿できるKtai Entryなどの紹介。
あまり知られていないかもなSEO関連のWordPressプラグイン集:phpspot開発日誌
http://phpspot.org/blog/archives/2011/03/seowordpress_1.html
かなりマニアックなSEOに関するまとめです。検索対策にこだわりたい方向けです。
クライアントに頼まれやすい機能を補えるWordPressプラグインいろいろ-かちびと.net
http://kachibito.net/wordpress/plugins-for-commercial.html
アップロードした画像を一括で記事内に挿入できる、File Galleryや、
管理画面TOPにメモを加えるQuickNotes on WP Dashboardなどの紹介。
特集記事や新着記事を見栄えよくスライドショーしてくれるWordPressプラグインまとめ « Web制作覚え書き
http://webdevtoolsoboegaki.wordpress.com/2010/06/22/%E7%89%B9%E9%9B%86%E8%A8%98%
E4%BA%8B%E3%82%84%E6%96%B0%E7%9D%80%E8%A8%98%E4%BA%8B%E3%82%92%E8%A6%8B%E6%A0%84%
E3%81%88%E3%82%88%E3%81%8F%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC/
イメージをフェードイン・アウトしてくれるプラグインWordPress Content Slideなどの紹介。
(URLが長いので繋げてアクセスするか、記事名で検索するかしてください)
WordPressでサイトを構築した際に活用したプラグイン5個+α - id:HolyGrailとid:HoryGrailの区別がつかない日記
http://d.hatena.ne.jp/HolyGrail/20110228/1298889864
会員登録時に必要な項目を追加する、Cimy User Extra Fieldsなどの紹介。
WordPress 3.0対応のとっても便利なプラグイン集|コリス
http://coliss.com/articles/blog/wordpress/plugin/best-plugins-for-wordpress-3.html
管理画面のメニューに好きなアイテムを追加できるFavorites Menu Manager
や、投稿編集ページにカスタムフィールドのHTMLを挿入できるInsertMeta ShortCodeなどの紹介。
WP Social Bookmarking Light | NINXIT-BLOG
http://www.ninxit.com/blog/2010/06/13/wp-social-bookmarking-light/
はてぶ、Facebook、Twitter他、表示させたいものは各々で選択可
WordPress用Twitterコメントシステムプラグインリリース!– [Mu]ムジログ
http://musilog.net/webdesign/wordpress/twitter-anyware-comment-system.php
RTしてくれたTwitterの呟きがコメント欄に全文表示されるプラグイン “BackType Connect”がとても良い!
[WordPress] [Twitter] [net] | No Second Life
http://www.ttcbn.net/no_second_life/archives/1144
1つ上のと同じような機能です、お好みでどうぞ。
WordPresプラグイン「Twitter tools」のバージョンアップ版のインストールと設定、使い方を日本語で解説!:WordPress|アマモ場
とても簡単な話で、Jane Plantのキャリアは地質学からその延長の環境科学に関するものであって医学ではない。
http://www.komichi.co.jp/bd/4-7705-0200-1.html
インペリアル大学教授としての執筆リストでもそれは裏付けられる
http://www3.imperial.ac.uk/people/jane.plant/publications
出版元に「2005年 英国王立医学協会(Royal Society of Medicine) 終身会員」とあるが、
http://www3.imperial.ac.uk/people/jane.plant
では 2005 FRSM とある。Fellow ということ。
http://www.rsm.ac.uk/membersh/catmem.php
によれば、会員は Fellow か 学生か 準会員か、しかないので、
Those holding medical, dental, veterinary or higher scientific qualifications; or in senior positions in healthcare and related fields.
にあてはまれば会員となれる。Jane Plantは地質学、環境科学で十分にこれをクリアする。だって大学教授長年やってるんだもん。
「終身」については、偉いのではなくて、単に老い先短いと会費を一括払いして節約できるというだけ。「王立医学協会」って、要は学会だからねぇ。
http://www.rsm.ac.uk/membersh/rates.php#life
本人の健康本宣伝目的の個人サイトでも、経歴的にはこれはあきらかで、健康法の話はまったく関係ない。
http://www.cancersupportinternational.com/janeplant.com/science.asp
http://www.cancersupportinternational.com/janeplant.com/prof.asp
過去多くの実績があり、キャリアを築き上げてきた学者が、ほぼ一線の研究からは引退するタイミングで
奇妙な健康本を自分のキャリアを利用して売り始めました、という以上のものではない。
最初の健康本を出してから2年ほどで RSM に終身で入会しているが、 RSMが拒否する理由はない、という以上のことはないだろう。
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
user: ユーザID password: パスワード ids_file: ids.txt done_file: ids_done.txt movies_dir: movies log4r_config: pre_config: global: INFO loggers: - name: app type: Log4r::Logger level: INFO outputters: - STDOUT - FILE outputters: - name: STDOUT type: Log4r::StdoutOutputter formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%H:%M:%S" - name: FILE type: Log4r::FileOutputter filename: "#{LOGDIR}/sangels.log" formatter: type: Log4r::PatternFormatter pattern: "%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 = $log class IDFile def initialize(file) @file = file unless File.exist?(@file) Fileutils.touch(@file) end end def ids(contains_comment = nil) File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty? nil elsif contains_comment true else not /^\s*\#/ =~ x end } } end def add(id) ids = ids(true) unless ids.any? {|x| x == id} write(ids + [id]) end end def delete(id) ids = ids(true) if ids.any? {|x| x == id} write(ids - [id]) end end def write(ids) File.open(@file, "w") {|io| ids.each {|x| io.puts x} } end end $log.info("BEGIN #{$0} ================") exit_code = 0 begin ids_file = IDFile.new($config.ids_file) done_file = IDFile.new($config.done_file) movies_dir = $config.movies_dir wget = WGet.new sangels = SAngels.new sangels.login($config.user, $config.password) ids_file.ids.each {|id| begin movies = sangels.movies(id) rescue SAngels::Movies::InvalidMoviesError $log.warn("invalid movie id: #{id}") next end dir = 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 = 1 end $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 = 0 begin movies_dir = $config.movies_dir sangels = SAngels.new sangels.login($config.user, $config.password) thumbnails = sangels.thumbnails Dir.glob("#{movies_dir}/*").each {|dir| next unless File.directory? dir id = File.basename(dir) url = thumbnails.url(id) unless url $log.warn("#{id} is not found") next end path = File.expand_path("00_thumbnail#{File.extname(url)}", dir) next if File.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 = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
BASEDIR = File.dirname($0) require "#{BASEDIR}/util" $config = load_config(BASEDIR) movies_dir = $config.movies_dir Dir.glob("#{movies_dir}/*") {|dir| next unless File.directory? dir name = File.basename(dir) files = Dir.glob("#{dir}/*.wmv").sort File.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" class SAngels HOST = "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/" def initialize() @agent = WWW::Mechanize.new end def login(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) end def movies(id, no_validate = nil) Movies.new(@agent, id, !no_validate) end def thumbnails Thumbnails.new(@agent) end class Thumbnails def initialize(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 = $1 if /ID=(.+)/ =~ href url = elem.search("img")[0]["src"] [id, url] }) end def get_file(id) @agent.get_file(url(id)) end def url(id) @links[id] end def exist?(id) url(id) end end class Movies class InvalidMoviesError < StandardError end def initialize(agent, id, no_validate) @agent = agent @id = id if !no_validate && !valid? raise InvalidMoviesError end end def info_page_url "#{INFO_URL}?ID=#{@id}" end def info_page @agent.get(info_page_url) end def movies_page @agent.click(info_page.links.find {|link| /P=10/ =~ link.href}) end def movie_links movies_page.links.select {|link| /wmv$/ =~ link.href }.sort {|a, b| File.basename(a.href) <=> File.basename(b.href) } end def valid? info_page.uri.to_s == info_page_url end def each(&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) } end end end
require 'log4r' require 'log4r/yamlconfigurator' require 'singleton' require 'fileutils' require 'ostruct' def Hash(a) Hash[*a.flatten] end def load_config(basedir) OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)}) end def new_logger(name) Log4r::Logger.new("app::#{name}") end def prepare_logger(basedir, logdir = nil) logdir ||= basedir Log4r::YamlConfigurator["LOGDIR"] = logdir Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml") end class NullObject include Singleton def method_missing(message, *arg) NullObject.singleton end end class WGet class << self attr_accessor :log def initialize super @log = NullObject.singleton end end def log self.class.log end def retrieve(url, dir) FileUtils.mkdir_p(dir) file = File.expand_path(File.basename(url), dir) if File.exist?(file) log.info("already retrieved #{url}") return true end 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-C exit($?) else log.error("retrieving failure #{url} (#{$?})") end end return ret end end