はてなキーワード: VOIDとは
{
{
Person person = new Person();
person.firstName = "山田";
person.lastName = "太郎";
Console.WriteLine(person.GetFullName()); // "山田 太郎" と表示される
}
}
public class Person
{
// FirstName プロパティ
private string firstName;
public string FirstName
{
get { return firstName; }
}
// LastName プロパティ
private string lastName;
public string LastName
{
get { return lastName; }
}
{
return firstName + " " + lastName;
}
}
午前中にC#について聞いてた人がいて、ついでに聞きたい。
Person person = new Person();
new Person(); としたら、勝手に「Person.cs」の中の「Person」クラスを探してくれるんだろうか。
前の増田が言っていた、Listのやつも知りたい。
paizaとかで入門動画見てれば分かるだろうか。
エロ動画ではない。エロ画像である。なにせこれは20年以上前の話だからだ。
当時、Windows ユーザの間でもモデムとテレホーダイの併用でネット接続が普及しつつあった頃だった。俺は貧乏学生だったけど、常時接続された環境でのうのうとネットワークを使っていて(誤解を避けるために最初に書いておくが、俺は工学系だが情報系の専攻ではない)、Linux で独立したサーバを組んで研究室に設置し、テレホーダイタイムに家の PC98 で hterm を走らせてターミナル接続し、emacs でメールの読み書き、kermit で小さいファイルのやりとりをしているような、そんな感じの日々だった。テキストターミナルだけ、って、今の人には信じられないかもしれないけれど、メールとネットニュースの読み書き、あとはサーバの管理を行う上では、これで何の不自由もなかった。まあそういう時代だったのだと思っていただきたい。
おそらくここを読んでいる方の多くは ネットニュースという言葉を聞いてもピンとこないと思う。誤解を恐れず簡単に言うと、オープンかつ分散的なネットワークで構成された5ちゃんねる、みたいなもの……かな。5ちゃんねるはオープンでも(ネットニュース程に)分散的でもない(いや内部では分散されているんだろうけどね)し、投稿は匿名で行われるわけだけど、ネットニュースは個々のサーバが独立して運営されていて、上流のサーバとの間で NNTP によるバケツリレー方式でニュース記事のファイルが転送される。ネット上を流れているニュースグループとその記事の数は膨大なもので、そこではほとんどの場合所属や名前をオープンにしたやりとりが行われていた。日本では fj.* ってのがあって…… void 氏とか lala 氏とか、何かまあ色々有名人物がいたわけだ。何か投稿する際にびくびくしながらやっていたのを今でも思い出す。
いや、まあ fj の話はよろしい。あくまでここではエロ画像の話だった。先のネットニュースのニュースグループには comp.*, news.*, sci.* 等があったわけだけど、これらの枠組みに入らない、もしくは入れたくないような話題に関して収納する目的で alt.* というのが作られていた。この alt.* はある意味無法状態に近くて、alt(言うまでもなくこれは alternative の略である)は実は "Anarchists, Lunatics and Terrorists" の略である、などと言われた位だった。そしてこの alt.* 内には alt.binaries.* というサブグループが形成され、そこに様々なバイナリデータが流されていた。ただし、ネットニュースはテキストしか流すことはできないので、バイナリデータは uuencode(この頃まだ Base64 なんてなかったので)でテキスト文字列に変換され、分割されて投稿されていたわけだ。
で……長いな前置きが。要するに、alt.binaries.erotica.* というサブグループがあって、ここにエロ画像が大量に流れていたわけだ。勿論、大学や企業のニュースサーバはこんなグループを購読したりはしないわけなのだが、あるときに噂が流れたのだ。**大学のこのサーバで、どうやら購読しているらしいぞ、と。アクセスのあからさまな制限がされておらず、見てみると……うわー、あらかた購読してるじゃん。まさに宝の山であった。ちょっと考えて、俺は自分のサーバ上でスクリプトを書き始めた。
alt.binaries.erotica.* には、様々な性的嗜好に合わせた画像のサブグループがある。ガチムチホモの絡みなんてのはお呼びじゃないので、見目麗しそうな女性の画像がありそうなグループをまず選び、そこの記事を一定時間間隔(traffic を徒に増やすのはさすがに気がひけたので)で自動的に採取、結合し、uudecode でバイナリに変換して HDD にストアする……そういうスクリプトを書いてみた。たまたまある目的で、データストア専用の HDD をサーバに付けたところだったので、そこにバイナリを溜めるようにして、ちょっとわくわくしながら眠りについた。
翌日、早めに研究室に行き、他の学生がいないのを確認して HDD の中身を見ると……おー、溜まっとる溜まっとる。中には外れもあってスカトロやら妊婦やらエラいものも混じっているわけだが、さすがにこれは人力で弾くしかない(今ならそこも自動化するかもしれないが)。数日で HDD 一杯にファイルが蓄積されたのだった。さあ、めくるめくエロライフの始まり始まり……と思ったのだが、そうはならなかった。結論から言うと、俺は1、2週間でそれをやめてしまったのだ。
まず俺は洋ピンマニアではなかった。そして、エロ画像ってのは飽きる。最初は、今風に言うと「これは俺の嫁」みたいなのを選んで、精選版画像アーカイブみたいなのを作ろうかとも思ったのだが、そういうところにそういう食指をそそられる画像ってまぁ流れてこないんだな。圧倒的に多いのは「ノイズ」。人力ノイズリダクションに嫌気がさしてしまったのだった。おまけに HDD は逼迫してくるし、結局あるところで意を決して、HDD を unmount してファイルシステムの再構築。すかーっと容量が空いたそのときが、実は一番快楽を感じた瞬間だったかもしれない。
いや、俺が取った魚拓じゃないので…
このブックマークレットでワンクリックでチェックできるので便利
archive.org
javascript:void(window.open('https://web.archive.org/web/*/'+location.href));
archive.is
javascript:void(open('https://archive.is/search/?q='+escape(location.href)));
class mystring { public: char *buffer; mystring() { buffer = (char*)""; } void operator = (const char*t) { int len = strlen(t); buffer = new char[len + 47]; strcpy(buffer, t); } void operator = (const mystring&src) { int len = strlen(src.buffer); buffer = new char[len + 47]; strcpy(buffer, src.buffer); } mystring& operator + (const char*t) { int len = strlen(buffer); int len2 = strlen(t); char *buffer2 = new char[len + len2 + 47]; strcpy(buffer2, buffer); strcpy(buffer2+len, t); buffer = buffer2; return *this; } mystring& operator + (const mystring&src) { return ((*this) + src.buffer); } };
class mystringV { public: std::vector<char> buffer; mystringV() { buffer.resize(2); buffer[0] = ' '; buffer[1] = NULL; } void operator = (const char*t) { int len = strlen(t); buffer.resize(len+1); strcpy(&buffer.at(0), t); } void operator = (const mystringV&src) { buffer = src.buffer; } mystringV& operator + (const char*t) { int len = strlen(&buffer.at(0)); int len2 = strlen(t); buffer.resize(len + len2 + 47); strcpy(&buffer.at(0) + len, t); return *this; } mystringV& operator + (const mystringV&src) { return ((*this) + &src.buffer.at(0)); } };
いろんな事をプログラマにかわってライブラリがやってしまうということ
どうなんだろうね。
この辺は あまりしっかり おしえてもらえないところではある。
でも プロならみんな 知っている
class mystring { public: char *buffer; mystring() { buffer = (char*)""; } void operator = (const char*t) { int len = strlen(t); buffer = new char[len + 47]; strcpy(buffer, t); } void operator = (const mystring&src) { int len = strlen(src.buffer); buffer = new char[len + 47]; strcpy(buffer, src.buffer); } mystring& operator + (const char*t) { int len = strlen(buffer); int len2 = strlen(t); char *buffer2 = new char[len + len2 + 47]; strcpy(buffer2, buffer); strcpy(buffer2+len, t); buffer = buffer2; return *this; } mystring& operator + (const mystring&src) { return ((*this) + src.buffer); } };
mystring my_space_org; for (int i = 0; i < 8; i++) { mystring space; space = my_space_org + " "; printf("%sHello world\n", space.buffer); my_space_org = space; }
VisualStudioでローカルで動作するアプリを作ろうと思ってるんだけど
本当に初歩的なことかもしれないことが分からない。
「class」というやつについてだ。
そいつの中には複数のclassさんが存在してもいいのか?SAVACLASSとLOADCLASSが存在しても良いのか?
public class Person { public string name { get; set; } public int age { get; set; } } public class Office { public string name; public ObservableCollection<Person> persons; } private Office office; private void init() { office = new Office(); office.name = "オフィス"; office.persons = new ObservableCollection<Person>(); office.persons.Add(new Person { name = "001", age = 11 }); office.persons.Add(new Person { name = "002", age = 22 }); office.persons.Add(new Person { name = "003", age = 33 }); }
OFFICEという属性にはPARSONというものが集まってて、そのPARSONの情報にはNAMEとAGEがありますよ!というのは分かるんだけど
シリアライズも、デシリアライズも、「圧縮⇔解凍」みたいなイメージしかないし
うーん。難しい。
クラスって何なんだ。VBA風に説明できる人いない?(VBAでもClassは使わずにFunctionとSUBだけ使い回してた)
public static void main(String[] args) { System.out.println(helloWorld()); } // https://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world private static String helloWorld() { return IntStream.of(-229985452, -147909649) .mapToObj(Random::new) .map(ran -> IntStream.generate(() -> ran.nextInt(27)) .takeWhile(k -> k != 0) .map(k -> k + '`') .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)) .collect(Collectors.joining(" ")); }
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btClick = findViewById(R.id.btCalc);
CalcListener listener = new CalcListener();
btClick.setOnClickListener(listener);
}
private class CalcListener implements View.OnClickListener {
@Override
public void onClick (View view) {
EditText input1 = findViewById(R.id.etInput1);
EditText input2 = findViewById(R.id.etInput2);
TextView output = findViewById(R.id.tvOutput);
String input1str = input1.getText().toString();
Integer input1int = Integer.parseInt(input1str);
String input2str = input2.getText().toString();
Integer input2int = Integer.parseInt(input2str);
output.setText(input1int + input2int + "です" );
}
}
}
Integer.parseInt()を見つけるのが最大の難所であった
具体的に1から15までの例で考えてみる。
集合で考えるとして、集合Aを3の倍数、集合Bを5の倍数とする。
U = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
A = { 3, 6, 9, 12, 15 }
B = { 5, 10, 15 }
A∩B = { 15 }
¬(A∪B) = { 1, 2, 4, 7, 8, 11, 13, 14 }
ベン図は次のようになる。
+-----------U----------+ | | | +---A------+ | | | 3 6 | | | | 9 12 +--+---B---+ | | | |15| | | | +-------+--+ 5 10 | | | | | | | +----------+ | | | | 1 2 4 7 8 11 13 14 | +----------------------+
¬(A∪B) = ¬A∩¬B
よって、FizzBuzz問題は次のように読み替えられる。
表にしてみる。
5の倍数 | 5の倍数ではない | |
---|---|---|
3の倍数 | "FizzBuzz" | "Fizz" |
3の倍数ではない | "Buzz" | 元の数字 |
よくあるコードのスタイルをWikipediaから借りることにして、使用する言語をCとする。
https://ja.wikipedia.org/wiki/Fizz_Buzz
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 100; i++) { if (i % 3 == 0 &amp;&amp; i % 5 == 0) { printf("FizzBuzz92;n"); } if (i % 3 == 0 &amp;&amp; i % 5 != 0) { printf("Fizz92;n"); } if (i % 3 != 0 &amp;&amp; i % 5 == 0) { printf("Buzz92;n"); } if (i % 3 != 0 &amp;&amp; i % 5 != 0) { printf("%d92;n", i); } } return 0; }
ここで、元増田が発想したような「3の倍数の後に5の倍数を判定させて"Fizz"と"Buzz"を連続出力すれば"FizzBuzz"の段は要らないんじゃね?」作戦を発動する。
"FizzBuzz"の判定をごっそり削り、"Fizz"と"Buzz"の条件が同時に起こることを考慮する。
forの終わりに改行するようにする。
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 100; i++) { if (i % 3 == 0) { printf("Fizz"); } if (i % 5 == 0) { printf("Buzz"); } if (i % 3 != 0 &amp;&amp; i % 5 != 0) { printf("%d", i); } printf("92;n"); } return 0; }
http://techwave.jp/archives/a-source-code-written-by-mr-mikitani.html
書き直してみた
void reverse(char* text, int length)
{
int i = 0;
int j = length;
char temp;
temp = text[i];
text[j] = temp;
i++;
j--;
}
}
int add_comma(int n, int length, char *out)
{
int i = 1;
int j = 0;
n = n / 10;
while (n > 0) {
if ((i % 3) == 0) {
out[j] = ',';
j++;
}
i++;
j++;
n = n / 10;
}
return -1;
}
reverse(out, j);
return j;
}