Konta's Blog

適当に書いていきます

Node.jsのアンインストールとnodebrewのインストール

homebrewを使ってnode.jsをインストールしている場合のアンインストールとnodebrewのインストールでつまづいたのでメモ。

だいたいはこちらの記事の通りでオッケーだった。
homebrewでインストールしたnode.jsをアンインストールする | ひびテク

僕の場合、brew doctorを実行すると、

Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

と言われて大量ファイルが羅列されたがこれは無視しても大丈夫なようだ。

nodebrewのインストールはこちらの記事の通りでオッケー
macにnodebrewをインストールする

nodebrew list nodebrew user [#version] とか忘れがちなので注意。

あまり知られていない簡単歯磨き方法

よく、歯をみがくのに歯ブラシ一本でみがいている人がいるんですが、それでは効率も悪いしうまくみがけないので、もっとうまくみがく方法をご紹介します。



ちなみに僕はこの方法でみがいているおかげで、この間1年ぶりに歯医者にいったのに、歯科助手さんと歯科医さん、両方に「綺麗にみがいてますねぇ」と褒められました。二人が口裏合わせて褒めたわけじゃないと思うので、本当に綺麗だったんでしょう。(できれば、歯科医には四ヶ月に一回か半年に一回は通うべきです)




では本題ですが、歯ブラシは3種類使うのがいいです。
歯の表面をみがく用、歯のくぼみや奥歯の側面をみがく用、歯と歯の隙間をみがく用です。
詳しく説明していきます。


歯の表面をみがく

これに最適なのは毛先が平らで少し硬めの歯ブラシです。
毛先が波になっていると表面に当たる毛の量は減りますし、毛が柔らかいと歯垢をとる効果も薄くなるからです。
僕が使っているのはこちらの歯ブラシです。

みがく時は力を入れすぎないようにして歯の表面の平らな部分をみがくイメージです。
でないと歯肉が傷ついてしまったり知覚過敏になるおそれがありますからね。


歯のくぼみや奥歯の側面をみがく

これにはワンタフトブラシを使います
こんな感じの毛先が小さいやつです。

歯と歯の間や、歯肉間際の部分、歯の裏側のカーブしている箇所なんかをピンポイントにみがいていきます。
普通の歯ブラシでは届きにくいところ全般をみがくイメージですね。


歯の隙間をみがく

歯の隙間をみがくのは歯間ブラシです。
仕上げに歯に詰まった食べかすなんかをとるのに便利なんですが、太いものはうまく入らないところもあるので全ての隙間に入れられるよう、なるべく細いものを使うのがおすすめです。
僕はこちらを使ってます。

歯間ブラシは毎回使う必要はないですが、一日一回は使って歯間を綺麗にしておくべきです。
僕の場合奥歯にものが詰まりやすいので肉類を食べた後は必ず歯間ブラシも使ってます。



ワンタフトブラシを普段使っている人はあまり見かけないのですが、これを使うだけで歯みがきの精度もかなり上がるし、時間短縮にもなるしいいことしかないので一度使ったらもう手放せなくなりますよ♪

Googleに機械学習を習ったところ謎のエラーが発生した

こちらの動画で機械学習を学んで見たんだけど
www.youtube.com

動画の通りにコードを打つと、8行目のところで

TypeError: 'numpy.ndarray' object is not callable

こんなエラーがかえってきてしまい、困った。
ググったら予約語を変数に使うと出ることがあるということで、test_idxをtest_indexnに書き換えて見たらうまくいった。
コードはこんな感じ。

import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree

iris = load_iris()
test_index = [0,50,100]

train_target = np.delete(iris.target,test_index)
train_data = np.delete(iris.data,test_index,axis=0)

test_target = iris.target[test_index]
test_data = iris.data[test_index]

clf = tree.DecisionTreeClassifier()
clf.fit(train_data,train_target)
print(test_target)
print(clf.predict(test_data))

あと、変数使うのやめて[0,50,100]を直接関数に書き込んでもいけた。
test_idxって予約語じゃないと思うんだけど、どうしてこうなるんだろ?

ヘッドレスChromeを使ってみた

備忘録など。
参考サイト:
ヘッドレス Chrome ことはじめ  |  Web  |  Google Developers

環境はMacOS バージョン10.13.5



ヘッドレスChromeの動かし方

1.まずコマンドのエイリアスを作成するため、ホームディレクトリ(ユーザー名の付いてるディレクトリ)に.bashsrcを作成、編集する(ターミナルで以下のコマンドを打つ)

vi .bashsrc

2.以下のエイリアスを書き込む(viで開いてiで編集モード、escで編集モード終了、:wqで保存して閉じる)

alias chrome="/Applications/Google\ Chrome.app"

3..bash_profileを開いて(vi .bash_profile)設定を反映させるため以下の書き込みをする(GUIでファイルをみたい時は[command]+[shift]+[.])

source ~/.bashrc

4.bashファイルの変更を反映するため以下のコマンドをターミナルで打つ

source  .bash_profile

5.chrome headlessを起動!

chrome --headless --disable-gpu --remote-debugging-port=9222  任意のURL

あとは参考サイトを見てやりたいコマンドを打つだけです。

僕の場合は自分で作ったウェブサービスのテストをやらせたくてヘッドレスchromeを使えるかと思ったのですが、seleniumなどを使っても同じことはできそうです。
ヘッドレスの方がGUIがない分高速なのでしょうが。

pythonなどのプログラムから扱う方法がまだわからないので今後の課題です。

ニコ生のコメビュを作りたかったけどできない

pythonスクレイピングの練習もかねてニコ生のコメントのスクレイピングに挑戦したがダメだった。
ニコ生のHTMLを覗くと、コメントはここに書いてあった。

<span class="___comment-text___2plM2">コメント</span>

なので最初はrequerst()でhtmlをとってきてクラス名で抽出すればいけると思ったがニコ生のコメントはreactで動的に生成しているいて、さらにログインしないとアクセスできないと言う二つの問題点があった。
なのでseleniumを使って頑張ったが自分のIDとパスワードを入力させないと動かないし、コメントも表示されている10件分ほどしか取れなかった
コードはこんな感じ

import bs4,requests,time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(放送ページのURL)                                             #ログインしていない状態で放送ページにアクセスするので、ログインページに飛ばされる
time.sleep(1)
passelm=driver.find_element_by_id('input__password')  #パスワードを入力させる
passelm.send_keys(自分のパスワード)
mailelm=driver.find_element_by_id('input__mailtel')        #メールアドレスを入力させる
mailelm.send_keys(自分のメールアドレス)
mailelm.submit()
driver.get("http://live2.nicovideo.jp/watch/コミュニティID?ref=grel")  #再度放送ページにアクセスする
time.sleep(5)
html = driver.page_source
bs = bs4.BeautifulSoup(html,"html.parser")
comments = bs.select(".___comment-text___2plM2")
print(len(comments))
for i in comments:
    print(i.getText())

一般的なコメビュって100件以上取ってくるし、ログインも自動的にしてくれる
あれどうやって動いてんだろ

チャットで改行をそのまま反映させつつHTMLなどはエスケープする方法

ユーザーの入力を以下の関数でエスケープして要素.innerHTMLに渡した

function escapestr(str){
     str = str.replace(/&/g,'&amp');
     str = str.replace(/</g, '&lt;');
     str = str.replace(/>/g, '&gt;');
     str = str.replace(/"/g, '&quot;');
     str = str.replace(/'/g, '&#39;');
     str = str.replace(/\n/g, '<br>');
     return str;
   }
<||

CSSで似顔絵描いてみた

このようなピョコタン先生の似顔絵をCSSで作ったのでコードを紹介します。

<html>
<head>
<style>
.content{
position:relative;
width:600px;
height:600px;
border:solid 1px black;
}
.hair{
position:absolute;
width:470px;
height:400px;
background-color: black;
border-radius: 50%;
bottom: 130px;
right:65px;
z-index:1;
}
.face:before{
content:"";
position:absolute;
border:solid 1px black;
background-color: black;
width:100%;
height:30%;
left:0px;
bottom:70%;
border-radius: 50% 50% 0% 0%/100% 100% 0% 0%;
border: solid 1px black;
}
.righteye{
position:absolute;
overflow:hidden;
border-radius:50% 50% 70% 30%/90% 70% 30% 10%;
transform:rotate(5deg);
border:solid 1px black;
width:25%;
height:30px;
left:65%;
top:50%;
}
.lefteye{
position:absolute;
border-radius:50% 50% 30% 70%/70% 90% 10% 30%;
transform:rotate(-5deg);
border:solid 1px black;
width:25%;
height:30px;
left:10%;
top:50%;
overflow: hidden;
}
.kurome{
position:absolute;
width:40%;
height:120%;
left:30%;
top:-30%;
background-color:black;
border-radius:50%;
}
.face{
position:absolute;
background-color: white;
bottom:100px;
right:100px;
width:400px;
height:400px;
border:solid 1px black;
border-radius:50% 50% 50% 50%/50% 50% 50% 50%;
z-index:2;
}
.nose{
margin:0px;
padding:0px;
position:absolute;
width:25%;
height:25%;
border:solid 1px black;
border-radius: 50%;
left:37%;
top:60%;
}
.nose:before{
margin:0px;
padding:0px;
content:"";
position:absolute;
width:100%;
height:35%;
top:-1px;
right:0px;
background-color: white;
}
.nose:after{
content:"";
position:absolute;
width:100%;
height:35%;
bottom:-1px;
right:0px;
background-color: white;
}
.lefthole{
position:absolute;
width:20%;
height:20%;
left:10%;
bottom:35%;
background-color: black;
border-radius: 50%;
}
.righthole{
position:absolute;
width:20%;
height:20%;
right:10%;
bottom:35%;
background-color: black;
border-radius: 50%;
}
.mouth{
position: absolute;
width:40%;
height:5%;
left:30%;
top:85%;
border-radius: 50%;
border:solid 1px black;
}
.mouth:after{
content:"";
background-color: white;
position: absolute;
width: 100%;
height:52%;
top:50%;
left:0%;
}
.leftbrow{
position: absolute;
width: 25%;
height: 5%;
left:10%;
top:40%;
border-radius: 50% 50% 50% 50%/80% 60% 40% 20%;
border:solid 5px black;
}
.leftbrow:after{
content:"";
position: absolute;
width: 110%;
height: 70%;
left:-5%;
top:60%;
background-color: white;
transform: rotate(-3deg);
}
.rightbrow{
position: absolute;
width: 25%;
height: 5%;
right:10%;
top:40%;
border-radius: 50% 50% 50% 50%/60% 80% 20% 40%;
border:solid 5px black;
}
.rightbrow:after{
content:"";
position: absolute;
width: 110%;
height: 70%;
right:-5%;
top:60%;
background-color: white;
transform: rotate(3deg);
}
</style>
</head>
<body>
<div class="content">

<div class="face">
<div class="leftbrow">
</div>
<div class="rightbrow">
</div>
<div class="lefteye">
<div class="kurome">
</div>
</div>
<div class="righteye">
<div class="kurome">
</div>
</div>
<div class="nose">
<div class="lefthole">
</div>
<div class="righthole">
</div>
</div>
<div class="mouth">
</div>
</div>
<div class="hair">
</div>
</div>

</body>
</html>

黒目のサイズとか色を動的に変えれるのでどっかで使えるかもしれない。