進捗したい日記

プログラミングを覚えたい人のメモや感想。10月後半まで活動休止

バイナリファイルの操作(C)

バイナリファイルを扱うとき
fopen("a.bin", "rb+")

のように、モードにbを記す

#include <stdio.h>
int main(void){
    FILE *hoge;
    hoge = fopen("b.bin", "wb");
    fclose(hoge);
    return 0;
}

bと+はどちらが先に来てもかまわない。

ファイルに値を直接書きこむ

fwriteを使う

fwrite(書きこむ変数のアドレス, 1つのサイズ, 項目数, ファイルポインタ)

テキストファイルの操作(C)

もうすぐC言語を授業でやる。
ということで、まだ使ったことがなかった、テキストファイルに直接書いたりする方法を勉強するぞ

ファイルを開くときの形

ファイル型のポインタ変数 = fopen("テキストファイル名", "モード")

モード

ファイルを開いてどうするか。

  • r:読み込み
  • r+:読み書き

ファイルが存在しない場合、失敗する

  • w:書き込み
  • w+:読み書き

ファイルに上書きする。存在しない場合、新しいファイルを作る。

  • a:追加書き込み
  • a+:追加読み書き

ファイルに追記する。存在しない場合、新しいファイルを作る。

"+"は対のモードを追加して、読み書き両方を可能にする。

実際にファイルを開閉してみる
#include <stdio.h>
int main(void){
    FILE *hoge;  //ファイル型のポインタ変数を定義
    hoge = fopen("a.txt", "w"); //a.txtファイルをwモードで開く(存在する場合は上書きする)
    fclose(hoge);
    return 0;
}

f:id:CNaan:20180913230952p:plain
実行すると、
f:id:CNaan:20180913230954p:plain
a.txtファイルが増えた!!

ファイルに書き込む

fprintf(ファイル型のポインタ変数, "文字列")を使う

#include <stdio.h>
int main(void){
    int num;
    num = 1;
    FILE *hoge;
    hoge = fopen("a.txt", "w");
    fprintf(hoge, "Good morning, %d" ,num);
    fclose(hoge);
    return 0;
}
>> Good morning, 1

このように、変数を表示させることも可能

ファイルから読み込む
Thank_you!

この、c.txtファイルの内容をコマンドラインに表示させる。

#include <stdio.h>
int main(void){
    char str[100];
    FILE *hoge;
    hoge = fopen("c.txt", "r");
    fscanf(hoge, "%s", str);
    fclose(hoge);
    printf("%s", str);
    return 0;
}
>>Thank_you!

Ruby合宿に行ってきた

Ruby合宿2018夏に参加した2018_summer_poster

Ruby合宿に初めて参加しました。
とても良いところでした。全員一度は行った方が良いのでは?と感じるほどです。
筆者の主観たっぷりの内容となっておりますが、これから行きたいと考えている人の参考となれば良いなと考えています。

最初に

現在の筆者のプロフィール
  • 大学一年生
  • 情報系
  • Rubyは勉強を始めて2か月くらいの初心者
応募のきっかけ
  • サークルの先輩が参加したことがあったため
  • チーム開発に興味があり、面白そうだと感じたため
筆者が合宿に求めていたもの
  • 技術的な話ができる友人作り → 達成
  • 普段の生活で経験しない刺激を得ること → 達成
  • チーム開発を体験すること → 達成


Ruby合宿とは*1

島根県で開催されている合宿
DXRubyを使って4泊5日、チーム開発を行う
詳しくは公式サイトで↓
www.rubycamp.jp

参加するために

  • 学生または求職中の25歳未満の人であること
  • 主催者が行うメール等でのアンケートに協力できる人
  • 多少はRubyを扱えること(ほぼ未経験なら事前講義を見て学習すると良い)
  • Git、GitHubが使えるとなお良い(GitHubリポジトリが用意されている)
  • 応募期間中に自己アピールを考えて応募する
  • 参加費(今回は計7000円)を用意する
  • 名刺があると参加者とスムーズに連絡先を交換できて楽しい
今回筆者が持って行ったもの+良いなと思ったもの

・ノートPC
・充電器
スマートフォン
・財布
・たのしいRuby(第5版)
・保険証
・保護者同意書(未成年のため)
・名刺
・筆記用具
・メモ帳
・ナイロン袋
・タオル
・着替え
・シャンプー
・リンス
洗顔
・歯磨きセット
・洗濯ばさみ
・洗濯ネット
・カメラ
タブレット

得られるもの

  • 記念Tシャツ
  • 健康的な食生活
  • ありがたいお話
  • 技術交流ができる友人
  • 技術力

良いところ

  • 県が負担している部分もあって参加費がとても安い!
  • 自分で企画したり、プログラムを書くことができる
  • 参加者はみんな優しく、意見を尊重してくれる
  • 情報系の人だけでなく色々な分野の参加者と知り合える
  • 講師の人がわかりやすく教えてくれる
  • わからないことはすぐに(講師や他の参加者に)聞くことができる
  • 色々な企業の話を聞くことができる
  • 実際に企業を見学できる
  • セブンティーンアイスの自販機がある
  • ペンタブの貸し出しがある
  • 蚊などの虫は見かけなかった
  • 食堂から宍道湖と山が見えて景色◎

大変なこと

  • 最寄りのコンビニまで片道徒歩10分(坂有り)

 →良い運動になる

  • 洗濯に思ったよりも時間がかかること

 →洗濯をして乾燥機まで使いたいのならスピード洗濯をオススメ。
  完全に乾かないことは想定した方が良い。

  • 風呂場近くなど一部の場所で圏外になる

 →諦めよう

  • 夜間ネットワークに繋がらなくなった

 →途中から改善された
  近年はなかったことだそうなので、きっと次回からは改善される

合宿を終えて

  • 将来何がしたいか、ということが何となくわかった
  • チームで設計・制作・完成まで持っていくことが楽しかった
  • 今回出会った人と仕事の話ができるようになりたいと感じた
  • 今回得た関係を大切にしていきたい
  • 触れ合うことでモチベーションが高まった
  • 一人で調べるよりもチームで調べる方が理解も解決も早まると感じた
  • 調べたり、聞いたりすることが大事である

これから

合宿で得たモチベーションをもとに、学習を続けていきたい。
そして数年後、今回交換した方々に新しい名刺を渡せるよう頑張りたい。

Ruby合宿へ行ったことのない方は是非応募してみてください!


今回の参加者の記事

qiita.com
ameblo.jp
fcnmkf.hatenablog.com
medium.com




Ruby合宿の歴代の作品

github.com

*1:2018年夏時点での情報です

attr_reader, attr_writerの確認(Ruby)

なんとなく理解できるようになったとはいえ、「理解できました」というにはまだ遠い。
ということで、attr_writerはこうやって動くんだなーということを確認。

class Name
  attr_reader :user_name
  def initialize
    @user_name = "Tom"
  end
end

class Greet < Name
  attr_writer :user_name
end

a = Greet.new
p a.user_name # "Tom"
p a.user_name = "Thomas" # "Thomas"
class Name
  attr_reader :user_name
  def initialize
    @user_name = "Tom"
  end
end

class Hello < Name
  attr_writer :user_name
  def hello
    @user_name = "Ken"
    puts "Hello, #{@user_name}"
  end
end

b = Hello.new
b.hello # Hello, Ken
p b.user_name # "Ken"
p b.user_name = "Bob" # "Bob"
attr_reader, attr_writerを使わずに書くとこうなる
class Name
  def initialize
    @user_name = "Tom"
  end
  
  def user_name
    @user_name
  end
  
  def user_name=(name)
    @user_name = name
  end
end

class Hello < Name
  def hello
    @user_name = "Ken"
    puts "Hello, #{user_name}"
  end
end

b = Hello.new
b.hello # Hello, Ken
p b.user_name # "Ken"
p b.user_name = "Bob" # "Bob"

もうちょっと使いこなせるようになったらまたメモしにくる

case文(Ruby)

やっぱりcase文ってどの言語においてもなんとなく好きなんですよね。
Rubyのcase文って、JavaScriptだとかC言語だとかのswitch文とは違うな~と。
defaultじゃなくてelseだったり。

case文
case 比較したいオブジェクト
when1 then
  処理
when2 then
  処理
~~
else
  処理
end

thenは省略できる

caseを使ってじゃんけんをしてみた
puts "グー: 1, チョキ: 2, パー: 3, おわり: 4"
list = [1, 2, 3]
loop do
  hand1 = gets.to_i
  hand2 = rand(1..3) # 1, 2, 3の中からランダムに
  result = (hand1 - hand2)
  if hand1 == 4
    break
  elsif list.count(hand1) == 0 #入力がlist(123)以外だったら次に行く
    next
  else
    puts hand2
    case result
    when -2
      puts "負け"
    when 0
      puts "あいこ"
    when 1
      puts "負け"
    else
      puts "勝ち"
    end
  end
end
===

値と一致するかどうかは「===」演算子を使って判定
左辺が数値や文字列 のときは「==」と同じ意味
正規表現の場合はマッチしたかどうか、クラスの場合はクラスのインスタンスかどうかを判定する

やってて気づいたこと

"\n"の入力はto_iを使うと0になってしまう

取り除いたりする その2(Ruby)

○引数で指定した文字を文字列から削除する

delete
delete!
>> moji = "chocolate"
=> "chocolate"
>> moji.delete("c")
=> "hoolate"

○ 文字列中の部分文字列を削除

slice!
>> moji
=> "cooperate"
>> moji.slice!(1) # moji[1]を削除
=> "o"
>> moji
=> "coperate"
>> moji.slice!(0, 1) # moji[0]から1つ削除
=> "c"
>> moji
=> "operate"
>> moji.slice!(5..6) # moji[5]からmoji[6]までを削除
=> "te"
>> moji
=> "opera"
>> moji.slice!("op") # 文字列"op"を削除
=> "op"
>> moji
=> "era"

○文字列を置換する

gsub
gsub!

正規表現が関わってくるので後々詳しくやりたい

>> moji = "cooperate"
>> moji.gsub("co", "") #"co" を""に置換(削除)
=> "operate"

○同じ文字が連続しているとき、一つにまとめる

squeeze
squeeze!

引数を指定すると、指定した文字のみまとめる

>> moji = "cooperate"
=> "cooperate"
>> moji.squeeze()
=> "coperate"

取り除いたりする(Ruby)

取り除くで!!という感じのものをまとめた

○末尾の改行文字(\n, \r)を取り除く

chomp
chomp!

chomp!はレシーバ自身を変更する。
引数に文字列を指定すると、その文字列を改行文字とみなす
末尾に改行文字があればレシーバ自身、ない時はnilを戻り値とする

>> moji = gets #Hello Curryと入力
>> moji
=> "Hello Curry\n"
>> moji.chomp #改行文字を取り除く
=> "Hello Curry"
>> moji
=> "Hello Curry\n"
>> moji.chomp! #レシーバ自身を変更
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.chomp!("y") #文字列を指定
=> "Hello Curr"

○末尾から1文字取り除く

chop
chop!

chop!はレシーバ自身を変更する。
末尾が"\r\n"で終わっている場合は"\r\n"を取り除く
漢字のように2バイト以上の文字でも1文字分消してくれる

>> moji = gets # Hello Curry
=> "Hello Curry\n"
>> moji.chop # 1文字(\n)取り除く
=> "Hello Curry"
>> moji.chop!
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.chop! # 1文字(y)取り除く
=> "Hello Curr"
>> moji
=> "Hello Curr"

○文字列の先頭の空白文字を取り除く

lstrip
lstrip!

lstrip!はレシーバ自身を変更する。

>> moji = gets"    Hello Curry\n"
>> moji.lstrip
=> "Hello Curry\n"
>> moji
=> "    Hello Curry\n"
>> moji.lstrip!
=> "Hello Curry\n"
>> moji
=> "Hello Curry\n"

○文字列の末尾の空白文字を取り除く

rstrip
rstrip!

rstrip!はレシーバ自身を変更する。
半角空白・タブ・復帰・改行・末尾のヌル文字など

>> moji = gets # "Hello Curry    \n"
=> "Hello Curry    \n"
>> moji.rstrip
=> "Hello Curry"
>> p moji
=> "Hello Curry    \n"
>> moji.rstrip!
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.rstrip! # 末尾が空白文字でないとき
=> nil

○文字の先頭と末尾の空白文字を取り除く

strip
strip!

strip!はレシーバ自身を変更する。

>> moji = gets # "   Hello Curry   \n"
>> moji.strip
=> "Hello Curry"
>> moji
=> "   Hello Curry   \n"
>> moji.strip!
=> "Hello Curry"
>> moji
=> "Hello Curry"

○配列の末尾の要素を削除し要素を返す

pop

レシーバ自身を変更する
空の時はnilを返す

>> list = ["N", "a", "a", "n", "\n"]
>> list.pop
=> "\n" # 末尾の要素
>> list
=> ["N", "a", "a", "n"] # list自身が変更された

○配列の先頭の要素を削除し要素を返す

shift

レシーバ自身を変更する
空の時はnilを返す

>> list = ["K", "a", "n", "p", "a", "n"]
>> list.shift
=> "K" # 先頭の要素
>> list
=> ["a", "n", "p", "a", "n"]