コロンブスの卵

大学生活の思い出と教訓。春から社会人です。

カラオケ嫌いは機会損失を招くから克服したいと思ってる話①【声が低い】

こんにちは。

前からずっと克服したいと思ってたことの中に『カラオケ』がありまして、今回はその点について書いていきたいと思います。

カラオケ嫌いの理由

僕は昔から音痴なのをかなり気にしていて、カラオケに行くのは躊躇しております。以下2つの理由があるからです。

というよりカラオケ嫌いの理由ってこれしかないと思います。

①下手くそな歌を披露したくない。恥をかきたくないし、場の空気が変な感じにならないか不安。

②周りの目の不安もあるし、好きな歌手の歌を歌えないのでカラオケそのものが純粋につまらない。

特に気を許していない人もいる状況だと、見せなくてもいい弱点を晒してしまった気がして僕は嫌な気持ちになります。

同じような理由でカラオケに苦手意識を持っている人も多いのではないでしょうか?

とはいえカラオケ嫌いは機会損失に繋がりやすい

学生時代までは関わるコミュニティもある程度選ぶことができました。周りの知り合いも自分のカラオケ嫌いをだんだん理解してくれるので、無理に誘ってこなくなります。



しかし、社会人になると自分でコミュニティを選べず付き合いで行かざるを得ない部分も出てくるでしょう。

また、僕の経験測では「カラオケが好きな人」が「カラオケが嫌いな人の気持ち」を理解するのは難しいです。分かりやすい例では「身長が高い人は身長が低い人の気持ちを体験できない」のと似たようなものだと思います。

ですのでカラオケのお誘いを無下に断ると、「あっ、この人カラオケ嫌いなんだな」という理解よりも「何でそんな頑なに断るんだろう。感じ悪い…。」という印象を与えかねません。

それが上司だと自分の評価にも影響し得るので慎重に対応する必要があると思われます。

どうやって克服するか

上述した理由から諦めて現実を受け入れて音痴を克服する方が良いかもしれません。

というわけで早速、音痴克服までの道筋を立てていきます。考えるべきは以下のことでしょう。

①音痴の原因を憶測ではなく科学的根拠ベースに明確にする。

②克服できるまでの期間を計算する。

ボイストレーニングプランを立てる。

①原因を明確にする

間違った方向へ努力しないようにここを明らかにするべきでしょう。

例えば自分の場合ですと「音程が合わない(抑揚を出せない)」「高い声のボーカルを歌えない」という悩みを持っているので、これらトータルして「音痴の原因は音域が狭いことだ」と仮説を立てます。

その次に「高い歌声を出す方法」を列挙して、自分に再現性のあるものを選別していきます。

以前に1回調べたときは、「声の低い人の場合、身体の構造上の問題から高い声を出すことはできない」という説明を見ました。

すると高い声を出すには裏声を太くした方が良いということになります。

②克服できるまでの期間をイメージ

僕の場合は「裏声を強化すること」を目標としました。ネット記事のレベルでも良いので、トレーニングを続ければどれくらいで達成できるかをイメージつけるようにしましょう。

というのも「英語学習」や「恋愛」にも言えると思いますが、達成できるビジョンが見えないと挫折してしまいやすいからです。

③トレーニングプランを立てる

最後に具体的なプランを立てていきましょう。

例えば「いっつも会社から帰宅するのは19時で、寝るまでに~時間あるから、裏声のトレーニングを〇〇分やろう」といった感じです。

僕が今回こうして投稿したのも、調べたことを体系化してモチベーションを上げる目的があります。

次回は具体的な話を

今回はここまでで次回、「じゃあ具体的に何するの?」っていう話に続けます。

読んでいただきありがとうございました。

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話②'

f:id:scuration:20200326233136j:plain

おはようございます。

社会人になって最初の週末です。

学生時代はかなりアルバイトしていた方だと思うのですが、連勤はしないようにシフト組んでいたのでまだ新生活に慣れていない状況です。

今回は先日から書いてる「RailsでWEBクローリングする話」の経過報告と課題の洗い出しをします。

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話② - コロンブスの卵

  • ここまでの経過
  • 追記:URIに日本語を含められるようにするURI.encodeメソッド
  • 先日作ったプログラムを実際に動かした
  • 今後の課題
    • WEBクローリング処理後のテキストに変な文字列がいっぱい入る
    • 大手検索エンジンではほぼ使えない
    • xPassのID指定が必要
    • 複数のサイトを横断検索できない
続きを読む

社会人初日の前夜に寝れなすぎたけど強制睡眠法で何とか3時間半寝た話

 f:id:scuration:20200401213817p:plain

 こんばんは。


 2020年3月に大学を卒業して今日、4月1日から社会人になりました。


 今、東京はコロナウィルスが蔓延しており、志村けんさんが亡くなってしまったこともあってか若者も外出を自粛するようになった気がします。


 そんな中、私の会社も入社式が延期になり初日は軽くオリエンテーションだけして帰社しました。


本題に入るのですが、昨日は恐ろしいほど寝付けなくて、

  • 寝るのを諦めてオールする
  • 頑張って寝る

の2択で迷った結果、後者を選択して頑張って寝た話をします。

  • 今まで羊を数えて寝れなかったことはなかったのに
  • 寝付けなかった原因
  • それでも何とか寝るために取り組んだ方法
    • 1. アラーム多重セット
    • 2. 羊ではなく息を数える
    • 3. 自慰で一発抜く
    • 4. 炭水化物を食べる
    • 5. (熱はないけど)熱冷まシートを使う
  • 結局は時間が解決してくれたかもしれない
  • だいたいはこれで寝れる
続きを読む

【VBA】全シートの特定位置を文字列検索して該当シートを抽出するマクロ

大学でMicrosoftOfficeが無料で使えていたのですが、それのライセンスが切れそうなのでこれまで使ったマクロをシェアします。

概要

MicrosoftExcelのVisualBasicで使用可能なマクロのコードです。

指定した位置(セルor列)に検索キーワードが含まれているシートの数を返してくれます。

挙動

①マクロを実行。
②検索したい文字列と検索したい位置を入力。
③ブック内の全シートから②の条件に当てはまるシート数を返してくれる。
④2つ目のキーワードでAND検索するか、1つ目のキーワードをやり直すか聞かれる。
→最大3キーワードまでAND検索可能
→検索を終了した場合は該当シートのみを新規ブックとして複製することが可能

列で検索したいとき、例えばA列を検索したいときは「A:A」と入力してください。

想定される使い道

顧客情報をエクセルで管理しており、各顧客ごとにシートを作成しているとします。

「このセルにはこの属性情報を入れる」というのが全シートで統一されていれば、こちらのマクロで数を調べることができます。

例えば「男性」で検索すればブック内で男性顧客のシート数を返してくれます。

コード

Sub keywordsearch ()
    Dim Flg As Boolean
    Dim Sh As Worksheet
    Dim r As Range
    Dim r_2 As Range
    Dim r_3 As Range
    Dim rc As VbMsgBoxResult
    Dim rc_2 As VbMsgBoxResult

#Sheet(1)には一番左のシート名を入力して一応リセットしてください。
Sheets(1).Select
        Flg = True
        FindStr = ""
        FindStr = Application.InputBox("検索する文字列を入力してください。")
        If Len(FindStr) = 0 Then Exit Sub
        FindRng = ""
        FindRng = Application.InputBox("検索する範囲を入力してください。")
        If Len(FindRng) = 0 Then Exit Sub
        
  #LookAtがxlPartの場合は部分検索
       #LookAtがxlWholeの場合は全体一致検索
        For Each Sh In ThisWorkbook.Worksheets
         Set r = Sh.Range(FindRng).Cells.Find(What:=FindStr, LookAt:=xlPart)
         If Not r Is Nothing Then
         Sh.Select Replace:=Flg
         Flg = False
         End If
        Next Sh
        
        MsgBox "該当するシート数は" & ActiveWindow.SelectedSheets.Count
        If Flg Then MsgBox "対象のシートはありません"
    
    
    rc_1 = MsgBox("2つ目のキーワードで絞り込みますか?", vbYesNo + vbQuestion)
        If rc_1 = vbYes Then
          MsgBox "2つのキーワードで検索します", vbCritical
           Do
           Sheets(1).Select
           Flg = True
           FindStr_2 = ""
           FindStr_2 = Application.InputBox("2つ目の文字列を入力してください。")
           If Len(FindStr_2) = 0 Then Exit Sub
           FindRng_2 = ""
           FindRng_2 = Application.InputBox("2つ目の検索範囲を入力してください。")
           If Len(FindRng_2) = 0 Then Exit Sub
           
           For Each Sh In ThisWorkbook.Worksheets
           Set r = Sh.Range(FindRng).Cells.Find(What:=FindStr, LookAt:=xlPart)
           Set r_2 = Sh.Range(FindRng_2).Cells.Find(What:=FindStr_2, LookAt:=xlPart)
           If Not r Is Nothing And Not r_2 Is Nothing Then
           Sh.Select Replace:=Flg
           Flg = False
           End If
           Next Sh
           
           MsgBox "該当するシート数は" & ActiveWindow.SelectedSheets.Count
           If Flg Then MsgBox "対象のシートはありません"
           
           rc_4 = MsgBox("2つ目のキーワードをやり直しますか?", vbYesNo + vbQuestion)
           If rc_4 = vbNo Then
           MsgBox "終了します", vbCritical
           Exit Do
           End If
      Loop
      End If
      
      
        rc_2 = MsgBox("3つ目のキーワードで絞り込みますか?", vbYesNo + vbQuestion)
        If rc_2 = vbYes Then
         MsgBox "3つのキーワードで検索します", vbCritical
         Do
         Sheets(1).Select
        Flg = True
        FindStr_3 = ""
        FindStr_3 = Application.InputBox("3つ目の文字列を入力してください。")
        If Len(FindStr_3) = 0 Then Exit Sub
        FindRng_3 = ""
        FindRng_3 = Application.InputBox("3つ目の検索範囲を入力してください。")
        If Len(FindRng_3) = 0 Then Exit Sub
        For Each Sh In ThisWorkbook.Worksheets
        Set r = Sh.Range(FindRng).Cells.Find(What:=FindStr, LookAt:=xlPart)
        Set r_2 = Sh.Range(FindRng_2).Cells.Find(What:=FindStr_2, LookAt:=xlPart)
        Set r_3 = Sh.Range(FindRng_3).Cells.Find(What:=FindStr_3, LookAt:=xlPart)
        If Not r Is Nothing And _
           Not r_2 Is Nothing And _
           Not r_3 Is Nothing Then
            Sh.Select Replace:=Flg
            Flg = False
            End If
        Set r = Nothing
        Set r_2 = Nothing
        Set r_3 = Nothing
        Next Sh
        MsgBox "該当するシート数は" & ActiveWindow.SelectedSheets.Count
        If Flg Then MsgBox "対象のシートはありません"
               rc_5 = MsgBox("2つ目のキーワードをやり直しますか?", vbYesNo + vbQuestion)
        If rc_5 = vbNo Then
          MsgBox "終了します", vbCritical
          Exit Do
        End If
        Loop
        End If
        
 rc_3 = MsgBox("ここまで該当するシートを別にまとめますか?", vbYesNo + vbQuestion)
        If rc_3 = vbYes Then
           ActiveWindow.SelectedSheets.Copy
 thisPath = ThisWorkbook.Path
 ActiveWorkbook.SaveAs _
 Filename:=thisPath & ":" & ThisWorkbook.Name & "_" & FindStr & "_" & FindStr_2 & "_" & FindStr_3 & ".xlsx", _
 FileFormat:=51
         End If
    
End Sub

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話②

f:id:scuration:20200326233136j:plain
 こんにちは。

 前回は簡単な検索サイトクローリングプログラムを作成しました。

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話① - コロンブスの卵


 今回はRailsを使ってブラウザ上から実行できるようにリメイクしていきたいと思います。
 ※初心者が初心者のために書いているのでお手柔らかにお願いします。

  • まずはRailsでアプリを新規作成
  • Model・View・Controllerを編集
    • generateコマンドでページ生成
      • Model
      • View
      • Controller
      • ルーティング設定
  • 動作確認
続きを読む

当たり前のはずだけどコロナ対策に自粛が有効な理由を今さら調べた話

 f:id:scuration:20200328131556p:plain

 先日、小池都知事から週末の外出を控えるように要請がありました。

 会見が行われたのは3月25日で、これをきっかけにコロナウィルスへの対応を急変更した企業も非常に多いようです。

 最近また都内で感染者が急増したのは

  • 前の3連休での外出が多かったから
  • オリンピック延期したからぶっちゃけたから

などと世間では言われてますね。
 
 ここで僕は「どうして不要不急の外出を控えることがコロナ対策になるのか?」という疑問を持ちました。

 もちろんコロナウィルスに限らず、これまでのインフルエンザ対策についても「人混みを避けるように」というのは毎年言われてきました。それでも「その当たり前と思って実践していることが、なぜ効果を発揮するのか?」という疑問を解決すべく、インターネットで情報を集めました。

新型コロナウィルスについて知る

3つの疑問

疑問1. そもそも「ウィルスに感染した」ってどういう状態?

 ウィルスというのは細菌よりはるかに小さい感染性微生物のことです。

 ウィルス自体は細胞を持たないのでヒトなど、他の生物の細胞を乗っ取ることで増殖を図ります。この細胞がウィルスによってジャックされた状態を「感染した」と呼んでよさそうです。

 ウィルスによって支配された細胞は本来の働きを果たすことができず、ウィルスの増殖に使われたあとに死んでしまいます。細胞が死ぬと増殖した新しいウィルスが”放出”されて、また他の細胞に感染するようです。

ウイルス感染症の概要 - 16. 感染症 - MSDマニュアル家庭版

疑問2. 新型コロナウィルスの感染経路は?

 ウィルスは感染力が高いという特徴がありますが、主に感染経路は、

 コロナウィルスは特に飛沫感染のイメージが強いですね。ニュースではマスクなしで咳やくしゃみをするとそれだけで事件になった例もありました。
ウィルスは口や鼻から取り入れることでほぼ感染するので鼻水や唾液には当然多くのウィルスが含まれております。すると満員電車などの密集空間で咳やくしゃみをすることは”テロ”と呼べるレベルになりそうです。

 後に政府によって禁止されましたが1月~2月はマスクの買い占めが話題になってました。マスクが不足しすぎて本当に必要な人の手に渡らないのは転売屋が思っている以上に深刻な事態です。それが社会の疲弊などによって自分に返ってくることも考えるべきだったでしょう。

 もう1つの接触感染は、感染者から飛び出たウィルスが物に付着しそれに触れることで起こります。体外に出たウィルスは最終的に死ぬものの一定時間は生存し、再び感染する力を持っています。なので定期的に手洗いうがい、アルコール消毒をするのが有効ということです。

 現時点では輸送荷物に触れることや食べ物そのものから感染した報告はないようです。また空気感染はしていないという見解であり、そうであれば「自粛によって感染症拡大の抑止を図る」という発想に納得感が増します。


ウイルスの感染経路・その対策は?病院でうつらない?二次感染予防について解説 – EPARKくすりの窓口コラム|ヘルスケア情報

新型コロナウイルスに関するQ&A(一般の方向け)|厚生労働省

疑問3. 1回治癒したら耐性がつくの?

 ほとんどの場合は治癒することが可能で、「症状が収まった・検査で陰性に戻った」ことを確認して治癒したと判断するそうです。

 一般的に一度ウィルスに感染してから治癒すると、対処法が体内に記憶されるので免疫がつきます。

 これを言うと叩かれるかもしれないが「自粛なんてせずに全員が免疫を持てば終息に向かうのではないか」と思ったこともありました(ちゃんと考えればオーバーシュートに陥るリスクは高く、現にイタリアでも医療機関が追い付いておらず混乱しています。すみません。)。

 ちなみにこれは”集団免疫の獲得”と呼ばれる概念らしいですが、厚生労働省の資料には「現在の感染状況は集団免疫を期待できるレベルではありません。」と書かれてあります。

 また再感染の可能性についても現段階で確かなことは判明していないようです。


新型コロナウイルス感染症対策専門家会議|厚生労働省

新型コロナウイルスには「2度の感染」がありうる? その日本人女性は、なぜ症状が再発したのか|WIRED.jp

基本再生産数の概念と自粛の呼びかけ

 ウィルスの感染力を示す指標として基本再生産数(R0)というものがあります。この感染力というのは一定ではなく密度・湿度・温度など、環境の違いによって変動します。

 自分は数学の専門ではないので詳しいことは存じ上げませんが、基本再生産数(R0)とは簡単に「あるウィルスに感染した人から発生する2次感染者数」を表します。数理モデルの研究からの感染症対策もなされているようで、R0<1になれば終息に向かうことが期待でき、R0>1になると流行の危険性が高まるそうです。

 「自粛の呼びかけ」も含めた感染症対策の施策はR0<1を目指して行われているとのこと。

自粛はここまでやれば良い、新型コロナ対策:日経バイオテクONLINE Webマスターの憂鬱 Premium

万が一が起きてからでは遅い。そのための自粛。

 既に多くの先進国がロックダウンの状況に追い込まれています。小池知事の会見にも出てきたキーワードだと思われますが、このような国はまず感染急拡大によってオーバーシュートに陥っていることが多いです。

 昨今の動きから「いつロックダウンが起こるか分からない」と不安になっている人も多いのではないでしょうか。しかし逆に、医療機関が正常に回るレベルであれば致命的な混乱は避けられると考えられるかもしれません。

 そのためにはオーバーシュートを防ぐことが必要であり「最低限の経済活動は行いながらクラスター化を防ぐための自粛」というのは仕方ないでしょう。

 
 余談ではありますが、個人的に新型コロナウィルスで怖いのは社会的混乱だけでなく、感染者に対して堂々と差別が行われるのではないかという点です。会社員などで一度感染してしまった人は復帰し辛くなるといった状況も起こりうるのではないでしょうか。速やかに混乱が終息に向かうことを祈ります。

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話①

f:id:scuration:20200326233136j:plain 

 あるとき突然「自分もWEBアプリ開発者になりたい」と思ってRubyの学習を始めました。メタ検索(検索サイト横断)サイトを作りたいと思って、WEBクローリングの機能を使ってできないか検討中です。入門書はモチベが保てなくて辞めました。

 今回はRailsを使わずにMVCモデルのmodel部分を単独作成したところまで記事にしました。

※文系未経験初心者で忘備録も兼ねているものなのでお手柔らかにお願いします。

WEBクローラーとは

 WEBクローラーとはWEBサイトを巡回して情報をピックアップするプログラムのことです。僕はWEBクローラーの機能を使ってメタ検索サイトを作りたいと考えました。
 メタ検索サイトというのは複数のサイトを横断検索して結果をまとめて表示するもののことです。例えば複数のサイトを横断して一番安い航空券を見つけられるスカイスキャナーというサイトもメタ検索サイトに分類されると思います。

完成物のイメージ

 僕のイメージとしては

  • 前提として横断対象の検索結果ページのURLが「固定URL+検索ワード」で成り立っている
  • 検索結果ページURLの固定部分をWEBクローリングに組み込んでおく。
  • キーワードを入力してプログラムが実行されると「http://〇〇〇+検索ワード」を対象にWEBクローリングが実行される。
  • WEBクローリングして得たページのソースから必要部分をピックアップして変数に入れる
  • メタ検索結果ページに遷移する。

というメカニズムでのコーディングを考えました。

入門書は続かなくて挫折した

  以前から何かしらプログラミングを学ぼうと考えていた時期がありました。最初は”大は小を兼ねる理論”でJavaを始めましたがモチベーションが続かず挫折。それから時間が経ってRubyを始めようと思い、入門書を購入するも目的もなくひたすらインプットを続ける作業が苦痛で辞めてしまいました。

 そこで僕が至った結論は「独学ならより具体的な作品の方がモチベーション保てるし後から知識はついてくる」ということです。実現したい機能をネットで調べてあとからコードの意味や動作のメカニズムを理解していくという感じですね。

0.準備

  • エディタのインストール(自分はVScodeにしました)
  • Rubyのインストール→Download
  • Railsのインストール

1.RubyでWEBクローリングのプログラムを作成

まずはRailsを使わずにターミナル上で動作するWEBクローリングを作成します。

今回述べる部分はほとんどこちらのサイトを参考にさせていただきました。

1-0. open-uriとnekogiri

 今回はopen-urlとnekogiriという機能を使います。open-uri=対象ページのHTMLを取得、nekogiri=分析・抽出といった役割の違いがあると思われます。
 
 open-uriは標準で入っているのに対してnekogiriは後から自分でインストールする必要があります。ちなみにopen-ur"l(エル)"ではなくur"i(アイ)"です笑

koooza.net

1-1. nekogiriのインストール

まずRubyがインストールされた状態でターミナルからnekogiriをインストールします。

$ gem install nokogiri
1-2. コードを記述

コードエディタで以下のプログラムを記述します。
参考サイトを検索用にアレンジし、自分なりに補足を加えました。

#1
#open-uriとnekogiriの呼び出し
#openはページのHTML取得、nekogiriは解析して必要な情報を抽出という役割分担

require 'open-uri'
require 'nokogiri'

#2
# 検索URLの形成
#ARGV[0]では検索キーワードを1個だけ読み込める

ARGV[0]
#keywords = ARGV[0]
url = 'https://' + ARGV[0]

charset = nil

#3
#先に読み込んだopen-uriを使用
#ここでは通常の呼び出しではなくブロック呼び出しを行う
#open(url)でWEBページをオブジェクトとして読み込み
#do~endがメソッド(引数のかたまり)
#do~endをひとかたまりで処理して変数htmlに渡す
#変数htmlには対象ページのソースが全て含まれている

html = open(url) do |f| #urlをオブジェクト化し|f|内に配列化
  charset = f.charset # fの文字コードを返す
  f.read  # WEBページfを読み込んで文字列化し、変数htmlに渡す
end

#4
# open-urlで読み込んだHTMLをnekogiri解析用に変換
doc = Nokogiri::HTML.parse(html, nil, charset)

#5
#titlesのブロック化
titles = []

#6
#抽出部分の指定
#Xpath以外ではCSS方式での指定が可能
#指定した要素に該当するものを全て取得して|node|に配列化

doc.xpath('//div/p[@class="text"]').each do |node|

#7
#取得した要素のうち、aタグのなかのテキスト部分を取得
    title = node.css('a').inner_text
#そのaタグの中のテキストをtitles配列に入れ込む
    titles << title
end

#今回は使わない
#入れ込んだtitles配列をファイルに書き込む
#titles.each do |text|
#  File.open("output.txt","a") do |f|
#    f.puts text
#  end
#end

#8
#今回はテキストファイルにアウトプットする代わりにインスタンス変数に移す
#titile配列を全てインスタンス変数@resultに格納
titles.each do |result|
                    @result = puts result
            end

#9
インスタンス変数@resultにtitles配列が全て格納されていることを確認
puts = @result

2. 実行方法

ターミナル上で以下を叩いて実行。

 $ ruby 〇〇(プログラム名).rb △△(ARGVに格納したいキーワード)

上手くいけば対象URLの抽出したい部分が表示されるはずです。

次回に続く

 WEBクローリングのプログラム単品はできたので次はブラウザ上で実行できるようにしたいです。検索ボックスにキーワードを入れると裏でプログラムが動いて、実行にページ遷移してリザルトが表示されるようにします。