読者です 読者をやめる 読者になる 読者になる

ひとり部長のひとりごと

社会人1年目で社内起業を始めたひとり部長がその経験を語ります。Mac関連もつぶやきます。映画のレビューはサブブログに移行しました。世の中の明るいニュースだけをまとめたエントリーも始めました。

リンクメーカー。初めてウェブアプリを作り、公開できた日

Python3 HTML/CSS 永久保存版

リンクメーカー

何を作ったかというと、ブロガーのためのリンク作成補助アプリです。

なにをしてくれるのかというと、↑これですよ。シェアしたいURLを入力して送信すると、上のようなリンクカードが貼れるHTMLコードを生成してくれます。

そんなのあふれとるやんけ

と思うかもしれませんが、ここで一つ工夫したのは、 引用されたページのランキングを表示しているというところですかね。

世の中に腐るほど、腐ったページってあるじゃないですか。

こんなにGoogleさん頑張ってるのに、クソの役にも立たないページが検索上位にくる。 はてなさんが頑張ってるのに、クソ記事がはてブに上がってくる。

このリンクメーカーのページは、ブロガーのみなさんが「引用したい」と思ったページのみがランクインしてくるわけです。

Pythonの勉強を始めた

のが去年の11月ですね。

それから、スクレイピングやグラフの描写などいろいろ遊んでたら、

いろんな人から「こういうの作れないか」というちょっとしたお願い事をされるようになった。 というか、「お、それできるぜ」と自分から押し付けたと言った方が良いのかも。

そうこうしているうちに

「自分の作ったアプリを配布してみんなが触れるようにしたい」

と思うように。

よく悩んだ末にHerokuというサービスを使ってウェブアプリを作ることにした。

ウェブアプリというのは

ウェブ上のアプリケーションのことです。まんまやん。

プログラミング言語をつかって、プログラムを組んで、HTMLを書いて、プログラムをHTML上で動かすようにサーバー上で動かせるのがウェブアプリです。

はてなブログは、ウェブアプリな訳です。

でもブログ作ったってしょうがないよね。

ワードプレスっていう既製品があるもの。

というわけで、今はβ版ですが1回くらいは使ってみてください

Python3でAIの"上野ふき"ちゃんを作るプロジェクト【初期段階】

Python3

ちょっとしたAIを作ってみたいと思う

キャラクター設定は、

  • ガジェットが大好きな女子高生
  • 特にAnker製品を好む
  • 製品の箱は綺麗にとっておくタイプ
  • 最新のプレスリリースを漁るのが得意

名前の由来は、 ガジェット→Gadget→God's Jet→神の噴出→上野ふき

まぁこんな感じで。

最終目標は、ガジェットのプレスリリースを読んで、語彙力や学習内容にしたがってオリジナルのコメントや知識を引き出してくれるものを作りたいと思っている。

素人の自分に何ができるのか、

とりあえず始めたのは、語彙の辞書と製品情報の辞書の二つをコントロールするプログラムを作ること!

用意するファイル

同一ディレクトリ内に、

  • ai.py(メインの実行ファイル)
  • brain.py("ふき"の頭脳となるプログラム集)
  • product_dic.dat(製品情報格納庫としてのバイナリデータ)
  • brain_words.dat(彼女の語彙力バイナリデータ。)
  • backupフォルダ(ここに語彙、製品情報の変更があった場合に1日単位でバックアップ)

メインの「ai.py」

ai.pyでは、必要最小限なコードでやりたいことをスッキリ書きたいと思う。 バカなので、煩雑なコードになればなるほどわけわからなくなり、思考がストップしてしまう。

初心者ゆえ、classの書き方や引き出し方にありえない間違いを犯している可能性もあるので許してほしい。

#ai.py
from brane import Brane #オリジナルのbrane.py

text='''
読ませたい記事の文章をここに。自分のプログラムでは、とりあえずサンプルの記事を置いていますが、最終的にプレスリリースサイトをスクレイピングさせて完成させたい。
'''
b=Brane(text)
#b.add_brain()#語彙の追加
#b.check()#語彙からの文章参照チェックリスト
#b.maintenance()#語彙のメンテナンス
#b.add_profile()#製品情報の要素追加
#b.add_product()#製品追加
#b.product_list()#登録製品リスト

このように、それぞれの機能を試したいときに#を外すだけの状態に持ってきています。

ふきちゃんの頭脳、「brain.py」

import re
import pickle
import time
import datetime

#文章を単文と単語に分けるルールづくり。これが悩ましい。
split_list1= '、|。|\n|また|ほか|として|を追加'
split_list2='×1|な|する|いう|も|が|を|に|へ|と|より|から|で|や|の|は|、|。|!|?|!|「|」|(|)|\n|した|など|ほか|させた'

class Brane():
    def __init__(self, text):
        self.text = text

    def sentence(self):
     #単文の場合、split_list1を使う
        keywords=re.split(split_list1,self.text)
        for absent in range(keywords.count('')):
            keywords.remove('')#空白を切り捨て!
        for short in keywords:
            if len(short) < 2:#短いものは切り捨て!
                keywords.remove(short)
            else:
                pass
        return keywords

    #語彙力強化のための単語抽出
    def words(self):
        keywords=re.split(split_list2,self.text)
        for absent in range(keywords.count('')):
            keywords.remove('')
        for short in keywords:
            if len(short) < 2:
                keywords.remove(short)
            else:
                pass
        return keywords

    #知らない単語を覚えさせるプログラム
    def add_brain(self):
        keywords_list=self.words()
        for key in keywords_list:
            print(key)
            #語彙リストを開いて照合
            r=open('./brain_words.dat','rb')
            vo=pickle.load(r)
            r.close()
            if key in vo:
                print('この単語は知っているよ!')
            else:
                ask=input('ボキャブラリーに加えますか?(y or end):')
                if ask=="y":
                    r=open('./brain_words.dat','rb')
                    vo=pickle.load(r)
                    r.close()
                    vo.append(key)#語彙に単語を追加
                    w=open('./brain_words.dat','wb')
                    pickle.dump(vo,w)#語彙を上書き
                    w.close()
                    #バックアップファイルの作成
                    r=open('./brain_words.dat','rb')
                    vo=pickle.load(r)
                    r.close()
                    a=open('./backup/brain_words_%s.dat' % datetime.date.today(),'ab')
                    pickle.dump(vo,a)
                    a.close()
                elif ask=="end":
                    break
                else:
                    pass

    #語彙と抽出文の照合。語彙力があればあるほど、文章解析能力が高まる。
    def check(self):
        sentence_list=self.sentence()
        brain_words_r=pickle.load(open('./brain_words.dat','rb'))
        for word in brain_words_r:
            for i in range(len(sentence_list)):
                try:
                    sentence_list[i].index(word)
                    print('【%s】:%s' % ( word,sentence_list[i]))
                except:
                    pass

    #語彙のメンテナンス(主に消去)いらない語彙を追加してしまった場合、記憶から消しさる
    def maintenance(self):
        brain_words_r=pickle.load(open('./brain_words.dat','rb'))
        while True:
            print(brain_words_r)
            erase_word= input('消去する単語を入力してください:')
            if erase_word=="end":
                break
            else:
                try:
                    brain_words_r.remove(erase_word)
                    f=open('./brain_words.dat','wb')
                    pickle.dump(brain_words_r,f)
                    f.close()
                except:
                    pass

    '''------------------ここから製品情報----------------------'''
    def add_product(self):
        #辞書を引き出して表示
        pd_r=open('./product_dic.dat','rb')
        product_dic=pickle.load(pd_r)
        pd_r.close()
        #空のフレームを取り出す
        pd_r=open('./product_dic.dat','rb')
        new_product=pickle.load(pd_r)[0]
        pd_r.close()
        print(new_product)
        time.sleep(0.5)
        while True:
            yn=input('製品を追加しますか?(y)')
            if yn=="y":
                keys=list(new_product.keys())
                #全ての要素に対して入力
                name=input('製品名を入力:')
                i=0
                product_num=[]#ここに追加された番号の製品しか削除できない
                for item in product_dic:
                    if name==item['製品名']:
                        print('No.%s:%sはすでに登録してあります。' % (i,name))
                        product_num.append(i)#重複した製品の番号をリストに追加
                        i+=1
                        flag='exist'
                    else:
                        i+=1
                        flag='noexist'
                        pass
                if flag=='exist':#すでに製品が登録されている場合
                    #製品リストを抽出
                    pd_r=open('./product_dic.dat','rb')
                    product_dic=pickle.load(pd_r)
                    pd_r.close()
                    try:
                        delete=int(input('製品を削除しますか?:No.'))
                        if delete in product_num:#入力内容が重複リスト番号に一致するか
                            del product_dic[int(delete)]
                            print('削除しています...')
                            #製品リストを開いて、上書き更新
                            pd_w=open('./product_dic.dat','wb')
                            pickle.dump(product_dic,pd_w)
                            pd_w.close()
                            print('削除しました。')
                            #バックアップファイルの作成
                            r=open('./product_dic.dat','rb')
                            pd=pickle.load(r)
                            r.close()
                            a=open('./backup/product_dic_%s.dat' % datetime.date.today(),'ab')
                            pickle.dump(pd,a)
                            a.close()
                        else:
                            print('削除できませんでした。')
                    except:
                        pass
                else:
                    new_product['製品名']=name
                    for key in keys:
                        if key=="製品名":
                            pass
                        else:
                            new_product[key]=input('%sを入力:' % key)
                    #製品リストを抽出
                    pd_r=open('./product_dic.dat','rb')
                    product_dic=pickle.load(pd_r)
                    pd_r.close()
                    #リストに新しいのを追加
                    product_dic.append(new_product)
                    #製品リストを開いて、更新
                    pd_w=open('./product_dic.dat','wb')
                    pickle.dump(product_dic,pd_w)
                    pd_w.close()
                    #バックアップファイルの作成
                    r=open('./product_dic.dat','rb')
                    pd=pickle.load(r)
                    r.close()
                    a=open('./backup/product_dic_%s.dat' % datetime.date.today(),'ab')
                    pickle.dump(pd,a)
                    a.close()
            else:#追加しますか?のelse
                break
    #製品リスト
    def product_list(self):
        pd_r=open('./product_dic.dat','rb')
        product_dic=pickle.load(pd_r)
        pd_r.close()
        print(product_dic[0])
        print('-'*40)
        for item in product_dic:
            print('製品名:%s' % item['製品名'])

    '''------------------ここから製品情報の要素----------------------'''
    def add_profile(self):
        pd_r=open('./product_dic.dat','rb')
        pd_sample=pickle.load(pd_r)[0]
        pd_r.close()
        print(pd_sample)
        while True:
            yn=input('製品情報の要素を追加しますか?(y/n)')
            if yn=="y":
                #要素を追加
                pd_r=open('./product_dic.dat','rb')
                product_list=pickle.load(pd_r)
                add_profile={input('追加する要素名:'):''}
                #製品リストの全てに新要素を追加
                for item in product_list:
                    item.update(add_profile)
                print(product_list)
                #要素情報を上書き
                pd_w=open('./product_dic.dat','wb')
                pickle.dump(product_list,pd_w)
                pd_w.close()
            else:
                break

また追って、報告します!とりあえずこれで遊んでみてください! (遊ぶ要素ねえええ)

また新しいブログを立ち上げてしまった・・・。

番外編

どうも、ひとり部長です。

また新しいブログを立ち上げてしまいました・・・。

なんか、一つのジャンルに凝ったページを作りたくなるんですかね、人ってのは。

Python3にハマってしまいました。

まぁ、ハマるっていってもコードがうまく実行されずにハマるって方が主な意味ですけど。


素人がMacでコソコソとPythonを始めた勉強忘備録。練習問題とか充実させたい。

ますます、 このブログの存在意義が薄くなってきました・・・・というか、何書けばいいんだ!

というわけで、映画、ガジェット、プログラミングと三本立てでなんとかのらりくらりやっていきますので、どうかよろしくお願いいたします。

【新幹線の料金表一瞬で出す!】python始めました。練習その1【追記】

https://www.python.org/static/img/python-logo@2x.png

いきなりどうした

どうも、ここ最近javascriptやらブックマークレットがどうのとか、なんやらって関係ない人にはほんっとにいらん記事バッカあげてるんですが、

pythonはじめました

なんだいきなり、pythonってなんぞやって人は、こいつの将来性にギョッとすると思います。

手始めに「新幹線の料金」

練習がてら、さくっと出してくれるプログラムを組んでみました。

import lxml
import codecs
from bs4 import BeautifulSoup
import urllib.request
q = "http://www.shinkansen.co.jp/ryoukin_tokaido_sanyo.html"
html = urllib.request.urlopen(q).read()
soup = BeautifulSoup(html, "lxml")
table = soup.find("table", {"class":"demoTable"}) 
fromStation="品川"#上り駅を入力してください
toStation="新大阪"#下り駅を入力してください
#出発駅リスト
if fromStation == "東京":
    yoko = 2
if fromStation == "品川":
    yoko = 3
if fromStation == "新横浜":
    yoko = 4
if fromStation == "名古屋":
    yoko = 5
if fromStation == "京都":
    yoko = 6
if fromStation == "新大阪":
    yoko = 7
if fromStation == "新神戸":
    yoko = 8
if fromStation == "姫路":
    yoko = 9
if fromStation == "岡山":
    yoko = 10
if fromStation == "福山":
    yoko = 11
if fromStation == "広島":
    yoko = 12
#行き先リスト
if toStation == "品川":
    tate = 1
if toStation == "新横浜":
    tate = 2
if toStation == "名古屋":
    tate = 3
if toStation == "京都":
    tate = 4
if toStation == "新大阪":
    tate = 5
if toStation == "新神戸":
    tate = 6
if toStation == "姫路":
    tate = 7
if toStation == "岡山":
    tate = 8
if toStation == "福山":
    tate = 9
if toStation == "広島":
    tate = 10
print("出発駅:"+table.findAll("th")[yoko].text+"駅")
print("到着駅:"+table.findAll("tr")[tate].th.text+"駅")
price = table.findAll("tr")[tate].findAll("td")[yoko-1].text.replace(",","")

if len(price) == 13:
    ticket = int(price[0:5])
    seat = int(price[5:9])
    none_seat = int(price[9:13])
    print("運賃:"+str(ticket)+"円")
    print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
    print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
if len(price) == 12:
    ticket = int(price[0:4])
    seat = int(price[4:8])
    none_seat = int(price[8:12])
    print("運賃:"+str(ticket)+"円")
    print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
    print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
if len(price) == 11:
    ticket = int(price[0:3])
    seat = int(price[3:7])
    none_seat = int(price[7:11])
    print("運賃:"+str(ticket)+"円")
    print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
    print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
if len(price) == 10:
    ticket = int(price[0:3])
    seat = int(price[3:7])
    none_seat = int(price[7:10])
    print("運賃:"+str(ticket)+"円")
    print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
    print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")

こいつを実行すると、こうなります。

出発駅:品川駅
到着駅:新大阪駅
運賃:8750円
指定席:5700円(合計:14450円)
自由席:4870円(合計:13620円)

広島までしか登録してないけどwww

理屈

こちらの「情報新幹線」さんのテーブルから情報を頂いています。 http://www.shinkansen.co.jp/ryoukin_tokaido_sanyo.html

実行環境

python3で書いてます。

使いかたとか、pythonってどうやんねんみたいなことはおいおい僕も知識がついてから、、、説明します・・・。 まだぜんぜんよくわかってないので。

では

追記

inputを知ったので、実行時に入力できるようにしました

import lxml
import codecs
from bs4 import BeautifulSoup
import urllib.request
q = "http://www.shinkansen.co.jp/ryoukin_tokaido_sanyo.html"
html = urllib.request.urlopen(q).read()
soup = BeautifulSoup(html, "lxml")
table = soup.find("table", {"class":"demoTable"}) 
fromStation =input("上り駅:")#
toStation = input('下り駅:')#
#出発駅リスト
if fromStation == "東京":
    yoko = 2
if fromStation == "品川":
    yoko = 3
if fromStation == "新横浜":
    yoko = 4
if fromStation == "名古屋":
    yoko = 5
if fromStation == "京都":
    yoko = 6
if fromStation == "新大阪":
    yoko = 7
if fromStation == "新神戸":
    yoko = 8
if fromStation == "姫路":
    yoko = 9
if fromStation == "岡山":
    yoko = 10
if fromStation == "福山":
    yoko = 11
if fromStation == "広島":
    yoko = 12
#行き先リスト
if toStation == "品川":
    tate = 1
elif toStation == "新横浜":
    tate = 2
elif toStation == "名古屋":
    tate = 3
elif toStation == "京都":
    tate = 4
elif toStation == "新大阪":
    tate = 5
elif toStation == "新神戸":
    tate = 6
elif toStation == "姫路":
    tate = 7
elif toStation == "岡山":
    tate = 8
elif toStation == "福山":
    tate = 9
elif toStation == "広島":
    tate = 10
else:
    yoko = "none_type"
    if yoko == "none_type":
        print("行き先を指定してください")
if yoko != "nonetype":
    price = table.findAll("tr")[tate].findAll("td")[yoko-1].text.replace(",","")

    if len(price) == 13:
        ticket = int(price[0:5])
        seat = int(price[5:9])
        none_seat = int(price[9:13])
        print("運賃:"+str(ticket)+"円")
        print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
        print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
    if len(price) == 12:
        ticket = int(price[0:4])
        seat = int(price[4:8])
        none_seat = int(price[8:12])
        print("運賃:"+str(ticket)+"円")
        print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
        print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
    if len(price) == 11:
        ticket = int(price[0:3])
        seat = int(price[3:7])
        none_seat = int(price[7:11])
        print("運賃:"+str(ticket)+"円")
        print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
        print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")
    if len(price) == 10:
        ticket = int(price[0:3])
        seat = int(price[3:7])
        none_seat = int(price[7:10])
        print("運賃:"+str(ticket)+"円")
        print("指定席:"+str(seat)+"円(合計:"+str(ticket+seat)+"円)")
        print("自由席:"+str(none_seat)+"円(合計:"+str(ticket+none_seat)+"円)")

課題は、エラー表示をなくすことと、 if文半分にできるんじゃね?って所。

また追記します。

「SNUS(スヌース)」というiQOSを超えたタバコの新時代が来た。吸わない。燃やさない。

iQOS 番外編

iQOS(アイコス)はどうした

どうもひとり部長です。

先日、iQOSを買いました。

その記事を書きました。


挨拶 どうも、ひとり部長です。 先日、iQOSを買いました。 hitoribucho.hatenablog.com 理由は、徐々に「タバコが嫌い」だという人が周りに増えてきて、というか、いよいよタバコの周りへの影響について本気で考えなければならないと感じ始めたからでした。 タバコを嗜む我が身でさえ、道行く人が歩きタバコ

まぁ、すごく良かったんです。アイコス自体は。

ただ、欠点があった。

  • 壊れやすい
  • 一回吸ったら充電

この二つを解決できたら、まず間違いなく使い続けていることでしょう。

ただ、壊れてしまいまして。

交換もできるとかんがえたのですが、なんせ購入時の証拠を持っておらず、うやむやにしてしまいまして。

そんな時、見つけたのが

SNUS(スヌース)

え?

SNUSってなんだ

知らない人は、たくさんいると思う。

そして、この記事はそんな人のために書かれている。

SNUSとは

JT公式サイトにはこう書かれている。


SNUS(スヌース)は、無煙たばこのひとつである「かぎたばこ」です。粉状にしたたばこ葉の味・香りを口内で楽しみます。スウェーデンの伝統的なたばこ製品であり、現在も多くのお客様に広く親しまれています。

ひとつの大きな特徴としては、

無煙タバコである

ということ。

最近の禁煙ブームの傾向から、やはり「煙」を出すことで「他人に迷惑をかける」ということに注力して今後のタバコを考えていかなければならない。

そして、

喫煙者にとっては、「他人に迷惑かけずに好きな場所、好きな時」に吸いたい。

このニーズを満たしている商品が今後売れていくとみた。

そして、このSNUSはかぎタバコであるため、

  • 煙が出ない=他人に迷惑をかけない
  • 火をつけない=吸える時・範囲が広がる
  • タールがでない=従来のものと比較して特に肺がんなどのリスクを抑える、肌が黒くならない

というメリットが存在する。

もちろん、タバコである以上口に含み、ニコチンやその他葉に含まれる成分を摂取するので健康上のリスクを抑えることはできない。

ただ、火をつけるタイプに比べて圧倒的に「自由度」と「タールからの開放感」があるのだ。

使用レビュー

開封の儀。

f:id:hitoribucho:20161118180859j:plain

これがSNUSのパッケージ。

味は、ミント。

なぜ袋に入っているかと聞いたところ、「小さな子供が誤って手に取らないように」らしい。

それがなぜこうなっているのかさっぱりわからないけどそういうことらしい。

中を開けて見ると、ミントタブレットのように小さなケースに小さな袋詰めされたタバコの葉が入っている。

f:id:hitoribucho:20161118181112j:plain

数量は、12袋。

これで390円。

うーん、他の製品とかをみて見ると20袋入りで460円とかあるので、多少はパッケージ代がかかっている感否めないけども。


最上級のタバコ葉+甘味料+ミント。 効果は30分以上。程好いタバコの香り。 コストパフォーマンス◎!! ニコチン3.0mgで超強力!!   0.3g×20袋入り

使い方(含み方)

f:id:hitoribucho:20161118181544j:plain

  1. ポーションを口に含み、頬と歯茎の間に挟んでご使用ください。
  2. 人により感じ方は異なりますが、15~30分程度がお取替えの目安です。
  3. 味・香りが薄まったら紙等に包んで捨ててください。ポイ捨ては厳禁です

こんな感じで使う。

つまり、口の中に含んで味わうのだ。

初回の感想

初めて口に入れると、メンソールのピリピリ感が局所的に現れる。

慣れないが、我慢して歯と歯茎の間に挟んでいると、確かにニコチンを摂取している感覚が訪れて来た。

次第にそれは強くなり、

ほのかな苦味を喉で感じるように。

これが、吸っているときの疑似体験になるのか、なるほど。

とは思ったが、やはり吸っている時以上の「フゥー」といった感触がない以上、多少の違和感を感じてしまう。

個人的には不味くもなく、「煙を出さない」「迷惑をかけない(こっそりふくませられる)」「コンパクト」な点に非常にメリットを感じたので、

しばらく使用してみようと思っています。

以上!

・・・しかし、吸っている感がないというのはちょっとイタイ。ただのニコチン依存者じゃないか・・・。

参考記事


健康増進法の施行以後、決められた喫煙所以外でタバコを吸えるケースがかなり少なくなってきたようです。主な理由は受動喫煙を防止するというものでした。その点、無煙タバコは煙が出ないので、周囲の人に煙による不快な思いをさせてしまう心配がなく、これまでのタバコに比べると気兼ねせずに楽しめるという点が喫煙者には魅力かもしれません。

SNUS(スヌース)は、刻んだタバコを塩と共に熟成させた北欧(スェーデン、ノルウェー)の 伝統的なタバコで、ポーション(小袋入り)とルース(粉)の2種類があります。 スヌースを歯茎にはさむといったシンプルな味わい方で、火を必要せず煙もでません。

SNUSは火を使って煙の出る、一般的なたばこ(シガレット)とは別物です。使い方も違えば、使った感覚もまるで違います。たとえば、コーヒーやビールのように、初めはおいしいと思えなくても、何度か口にするうちにだんだん味や良さが分かってきて、いつの間にか好物になっている。SNUSもそれに似ています。 最初は独特の刺激に違和感をおぼえるかもしれませんが、気づけば魅力が分かってくる、そんな通な味と使い方のSNUSを新しい嗜好品として楽しんでください。

スヌースは上唇と歯茎の間に挟んで使用します。 ニコチンは、歯茎や唾液を通して胃から吸収されますので、通常のタバコと違いゆっくりと効いてきます。 初めての方は1袋の容量の少ないものがお勧めです。

古くからたばこには“煙を吸う”だけではなく、“火をつけずに無煙で嗅ぐ・噛む”といった多様なスタイルがあり、「紙巻たばこ」と共に、「かぎたばこ」や「かみたばこ」のような無煙たばこも世界中の様々な場所で楽しまれています。また、日本の多くのお客様は「紙巻たばこ」を楽しまれていますが、近年は周囲のたばこを吸われない方などに配慮した商品も望まれています。