OmniAICreator/Qiita-1.07M huggingface dataset:
MQTTでPublishしてしまったメッセージを取り消したい/なかったことにしたい/キャンセルしたい


# Publishしてしまった！しかもqos=1 or 2で！
さらに、retain=true、MQTT初心者だった私は当時パニックになりました
試しにMQTTを触っていた私は、思わぬ動作を引き起こし、ついついやってしまったということです
　＃正直コレ自体は正しい使い方をすれば優れた機能で、間違っていません
　　間違っていたのは私の理解と使い方です

```
publishってなぁに？
subscribeってなぁに？
qosってなぁに？
qos levelってなぁに？(1 or 2 or 3)
retainってなぁに？
```

```
仕組みが分かっていないプロパティは使うものじゃないよね、というお話
```

## あ、間違えてPublishしちゃった。。。
[公式Doc](http://www.rubydoc.info/gems/mqtt/MQTT/Client:publish)

```
#publish('dummy/topic', payload = '{ "message": "hello!"}', retain = true, qos = 1)
```

これでメッセージがMQTTブローカーに保存され、subscribeする側は、
永遠に同じメッセージが取得出来ます
でも、使い方によってはこれじゃ困る！qos=0でいいし、読み捨てたい！

そう思ったらこれ！

## 誤って保存されてしまったメッセージを取り消す
```
#publish('dummy/topic', payload = '', retain = true, qos = 1)
```
同じTopicに、同じqos levelで、payloadを空でPublishすることで
MQTTブローカーに保存されてしまったメッセージを削除することができます
　＃知らないと意外とハマる

# 感想
わからないモノ(APIやフレームワークのメソッドやOSSライブラリも)は、理解するまで使うべからず
使って、やっちゃったら、自分の責任ということを忘れるべからず
omniauth-facebookでユーザー情報を取得する

Railsでomniauth-facebookを使用したOAuthでFacebookユーザーの情報を取得するまでのメモ。

#Facebook for developers
[Facebook for developers](https://developers.facebook.com/)でデベロッパ登録して、さらにアプリを登録する。
その際の注意点として、「アプリドメイン」と「有効なOAuthリダイレクトURI」をちゃんと設定しておかないとOAuth実行時に「このURLのドメインはアプリのドメインに含まれていません。このURLを読み込むには、アプリ設定のアプリドメインにすべてのドメインとサブドメインを追加してください。」なんて文言のエラーが出て失敗します。
「アプリドメイン」は普通にアプリのドメイン(https://www.アプリ名.com等)
「有効なOAuthリダイレクトURI」はOAuthの結果がCBされるURI（omniauth-facebookの場合はhttps://www.アプリ名.com/auth/facebook/callback）

![ss0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/200860/0aa9ebe8-581c-fabc-43fb-424411777319.jpeg)


![ss0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/200860/fa00ce53-1cef-3c9a-6d9e-0df2d5e29777.jpeg)


#omniauth-facebookのインストール
Gemfileに「gem 'omniauth-facebook'」を追記して

```bash
$ bundle install
```

#omniauth-facebookを設定
config/initializers/omniauth.rbを作成して↓を記載。

```ruby:omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
    scope: 'email', display: 'popup', local: 'ja_JP', info_fields: "id, name, gender"
end
```

FACEBOOK_KEY、FACEBOOK_SECRETはFacebookにアプリを登録した時の情報を記載。
scope等の詳細は[omniauth-facebookのサイト](https://github.com/mkdynamic/omniauth-facebook)に記載あり。

#routesを設定
OAuthした結果がCallbackされるURLのroutesを設定しておく。

```ruby:routes.rb
  get '/auth/facebook/callback', to: 'facebook#auth_done'
```

#コントローラーを作成
Callback先を作成。

```ruby:facebook_controller.rb
  def auth_done
    facebook_id = request.env['omniauth.auth']['extra']['raw_info']['id']
    name = request.env['omniauth.auth']['extra']['raw_info']['name']
    gender = request.env['omniauth.auth']['extra']['raw_info']['gender']
    redirect_to :root
  end
```

#OAuthをトリガする
Facebookボタン等をアプリに配置してユーザーが押した際に「/auth/facebook」に飛ばすとFacebookのサインイン画面が表示される。

#Callbackが来る
ユーザーが正常にサインインしてくれた場合作成したfacebook_controllerのメソッドが実行され晴れてユーザーの情報が取得出来る。

#参考
https://github.com/mkdynamic/omniauth-facebook
https://github.com/omniauth/omniauth
https://developers.facebook.com/docs/facebook-login
【サルが書く】cakephp2.xでcanonical設定

わきゃ！

# URLの正規化をするぞ

それぞれのView

```php
echo $this->Html->meta('canonical', $this->Html->url('設定したい正規化URL', false),
 array('rel' => 'canonical', 'type' => null, 'title' => null, 'inline' => false));
```



レイアウト側

```php

echo $this->fetch('meta'); 
```

をするだけでHEAD内にMETAタグとして出力されます。
PythonでUnicodeDecodeErrorが出る

# エラー内容
### UnicodeDecodeError
'utf-8' codec can't decode byte 0x83 ...

![decode1.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/e3060e73-46ca-a4a3-2472-1a813147a1e5.png)
### 環境
Python：3.6.3
Django：1.11.12
開発環境：Windows7 32bit
実行環境：Windows7 32bit & IIS7.5
#事象
開発環境にて機能改修を行った。その後、実行環境へソースコードをコピーし、実行環境のwebサービスを呼び出したところ、上記エラーが表示された。

# 原因と対策
エラー内容は、ソースコードをutf-8に変換できないことを示している。つまり、ソースコードファイルがutf-8で保存されていない。問題のあるファイルを正しくutf-8で保存してあげればよい。

まずエラー画面下部を見て、問題が発生しているファイル名を見つける。
以下の例だと、app\loginparcial.htmlというファイルがおかしい模様。

![decode2.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/636e33ed-09e6-f45a-a869-49d9a4643f85.png)

問題のファイルをテキストエディタで開く。
例では、フリーソフトのエディタ「Mery」を使用している。
![decode3.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/1a14a942-9b63-bf15-0cb2-4f4e3a938952.png)
ウィンドウフッタを見れば、シフトJISで保存されていることが分かる。

エディタの「名前をつけて保存」を行う。この時、エンコードを「UTF-8」に変える。ファイル名は同じままで上書き保存すればよい。
![decode4.png](https://qiita-image-store.s3.amazonaws.com/0/241999/8eb5f416-3606-fc89-2969-849412e8e1e9.png)

ウィンドウフッタのエンコードがUTF-8に変わった。
![decode5.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/358a1f6b-5416-a550-3731-a193e4a34b6e.png)

webサービスを呼び出すと、ページが正しく表示された。
![decode6.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/cc53616c-7261-ffdf-77ab-970a7d6fea51.png)
初心者にもわかりやすい初心者レシピを楽しもう！

初心者にもわかりやすく教えられるエンジニア教師になるために！

IchigoJam RaspberryPi を　　知っていますか？と聞いたら,
多くの人の答えは、パンにぬるジャム！！
　
それなら、もういっそ　　
　　食べる🍓イチゴジャム🍓　　作ってみても。

　まず、お料理する時も、レシピ＝　プログラミングと考えてみましょう！

いちごの種類もあって、どれが、イチゴジャムに合っているのか？　もあるんんですよ！
　プログラミングも、いろいろ種類があるので、お料理してみませんか！！

食べる🍓イチゴジャム🍓　　
　食べられない🍓 IchigoJam💝 と、Jam で、ある優秀なことを考えたら、
　あるアイデアソンで　🎵優勝🎵 してしまいました！
　　　　　　　　　　　　　　　（当日仲間になった人、ありがとう）
　　　さて、そういう話を聞いて見たくありませんか。

　あなたも、仲間で楽しむ時にも、エンジニアだけでない、楽しい話を共に、お料理も共に、親子でも楽しめたらいいなと思い、　先生からもやるように言われて　始めました。

　だけど、かなりしんどうです。専門用語や　プログラミングはHTMLやJavaScript ｲﾗｽﾄﾚｰﾀを習ったぐらいなので、大変です。
Linuxでファイルをディレクトリで再帰的に調べた上でサイズ順にならべて大きいもの5つを調べたりする

`ls -r`とか`ls -S`とかだと現在ディレクトリだけなんですが、Gitだとファイルサイズに制限があったりするのでその辺りを調べる用に。

```bash
$ du -ah ./ | sort -rh | head -5
```

![Screen Shot 2018-04-16 at 15.41.39.png](https://qiita-image-store.s3.amazonaws.com/0/47327/f60be9b8-faab-a981-cf5d-876703c2a9a3.png)


| オプション | 説明 |
|----|----|
| du -a | ディレクトリだけじゃなくてファイルも表示する（allのa） |
| du -h | サイズ表記をMBやGBで出力する（Human-readableのH）|
| sort -h | 上記 Human-readable のサイズ表記で、MBやGBの大小関係をただしく解釈する |
| sort -r | 降順（大きいものから小さいもの順）で出力する |
| head -5 | 先頭から5行を出力する |

```bash
$ du -ah ~/Downloads/ | sort -h | head -6
```

ディレクトリを省く

```bash
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
```


ディレクトリを省いて小さい順

```bash
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
```


https://unix.stackexchange.com/questions/88065/sorting-files-according-to-size-recursively
ロボティクス講義資料リンク集

ロボティクス関連の各大学の講義資料をまとめておきます

#講義資料

北海道大学
http://www.ssc-lab.com/robotics/

豊橋技術科学大学
http://www.syscon.me.tut.ac.jp/lecture/Intelligent_robotics_engineering/index.html

電気通信大学
http://www.medigit.mi.uec.ac.jp/lect_robotics.html

東北学院大学
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/indexframe.html

神奈川工科大学
http://yamalab.com/ja/lecture/index.html

千歳科学技術大学
http://odalab.spub.chitose.ac.jp/material.html


Stannford University
https://see.stanford.edu/course/cs223a

Princeton University
http://www.princeton.edu/~stengel/MAE345Lectures.html

Cornell University
http://www.cs.cornell.edu/courses/cs4758/2011sp/lectures.html

MIT
https://ocw.mit.edu/courses/mechanical-engineering/2-12-introduction-to-robotics-fall-2005/
https://ocw.mit.edu/courses/mechanical-engineering/2-017j-design-of-electromechanical-robotic-systems-fall-2009/
http://ocw.alfaisal.edu/OcwWeb/Mechanical-Engineering/2-12Fall-2005/LectureNotes/index.htm
http://ocw.fudutsinma.edu.ng/courses/aeronautics-and-astronautics/16-412j-cognitive-robotics-spring-2005/lecture-notes/



その他
https://www.roboticscity.com/lecture-notes.html
http://ogata-lab.jp/ja/lecture_ja.html
http://nptel.ac.in/downloads/112101098/
https://www.ethz.ch/content/dam/ethz/special-interest/mavt/robotics-n-intelligent-systems/rsl-
https://see.stanford.edu/course/cs223a
【Git】git 操作メモ

#git操作フロー
gitlabを用いた運用・使用するGitの操作コマンドのメモ。

##通常の操作方法

###作業ディレクトリの移動
<pre>
cd [プロジェクトのパス]
</pre>
該当のプロジェクトのフォルダに移動する。

###作業用に新たにブランチを作成
<pre>
git checkout -b [ブランチ名]
</pre>
testブランチを作成して、testブランチに移動する。

###変更ファイルがあるか確認
<pre>git status</pre>

###変更ファイルの差分を確認
<pre>git diff</pre>

###変更をコミット
・git add
<pre>git add [ファイル名]</pre>

・git commit
<pre>git commit -m "[コメント]"</pre>

###masterから最新状態を反映
・masterブランチに移動
<pre>git checkout master</pre>

・最新状態を取込
<pre>git pull origin master</pre>

・作業ブランチに移動
<pre>git checkout [ブランチ名]</pre>

・最新状態を作業ブランチに反映
<pre>git merge master</pre>

###変更を反映
<pre>git push origin [ブランチ名]</pre>

###変更をmasterにmerge
・gitlabを開いてマージリクエストを申請 ⇒ マージリクエストを承認 ⇒ 完了
Sorceryを使ったFacebookログイン

## 1, Facebook Developerにアプリを登録！
 必要になるものは、アプリIDとapp secretです。
 ローカル環境でもFacebookログインの挙動を確認するためにクライアントOAuth設定で自身のローカル環境のURIも追加しておく。
　![Screen Shot 2017-09-23 at 4.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/138318/eddda853-d905-c867-1339-1b14d75725da.png "Screen Shot 2017-09-23 at 4.54.58.png")
　
![Screen Shot 2017-09-23 at 4.55.18.png](https://qiita-image-store.s3.amazonaws.com/0/138318/649852e7-ab7c-45fc-74c0-76d46778edfd.png "Screen Shot 2017-09-23 at 4.55.18.png")



## 2, Sorceryを入れる！
## バージョンは0.11.0以降のものを指定します！(エラーが出るため。[Sorcery] (https://github.com/Sorcery/sorcery/issues/74))


https://github.com/Sorcery/sorcery/wiki/External
公式に従う。

注意点

```ruby:sorcery.rb
config.facebook.key = ENV["FACEBOOK_KEY"]
  config.facebook.secret = ENV["FACEBOOK_SECRET"]
  case Rails.env
    when "production"
      config.facebook.callback_url = ENV["FACEBOOK_CALLBACK"]
    when "development"
      config.facebook.callback_url = ENV["FACEBOOK_CALLBACK_DEVELOPMENT"]
    end
  config.facebook.user_info_mapping = { email: "email", first_name: "first_name", family_name: "last_name" }
  config.facebook.user_info_path = "me?fields=email,first_name,last_name"
  config.facebook.access_permissions = ["email", "public_profile"]
  config.facebook.display = "page"
  config.facebook.api_version = "v2.10"
```
  
  - envファイルで開発環境と本番環境両方のcallback_urlを登録することもできる。
 - access_permissionsでFacebook側のどんな情報を必要とするかを登録する。
 - user_info_pathにUserをcreateする際に保存したいFacebookから取ってくる情報を挙げる。
 > [最近のバージョンのAPIでは fields パラメータを用いて取得する情報を明示的に指定する必要があるため、ユーザー情報取得部分を変更することで、メールアドレスの取得ができます。](https://qiita.com/misogi@github/items/366d1e0582b333b16130)
 - アクセス許可のリファレンス https://developers.facebook.com/docs/facebook-login/permissions/#reference-public_profile

## 3, ローカル環境で各keyのpathを通す！
	export="あなたのアプリID"
	export="あなたのapp secret"
	source ~/.bash_profile

pathが通っているかどうかexport -pで確認できます

  
  参考　http://d.hatena.ne.jp/jiikko/20140521
Sorceryを使ったTwitterログイン


## 1, Twitter Developerにアプリを登録！
必要になるのは、Consumer Key(API Key)とConsumer Secret(API Secret)です！

## 2, Sorceryの設定をする

https://github.com/Sorcery/sorcery/wiki/External
公式に従う。

```ruby:sorcery.rb
Rails.application.config.sorcery.submodules = [:remember_me, :external]
  Rails.application.config.sorcery.configure do |config|
	config.external_providers = [:twitter]
	config.twitter.key = ENV["TWITTER_KEY"]
 	config.twitter.secret = ENV["TWITTER_SECRET"]
 	case Rails.env
 		when "production"
 			config.twitter.callback_url = ENV["TWITTER_CALLBACK"]
		when "development"
			config.twitter.callback_url = ENV["TWITTER_CALLBACK_DEVELOPMENT"]
	end
	config.twitter.user_info_mapping = { email: "screen_name" }
	
	user.authentications_class = Authentication
	
  end
end
	
```


## 3, ローカル環境で各keyのpathを通す！
	export="あなたのAPI Key"
	export="あなたのAPI Secret"
	export="http://localhost:3000/oauth/callback?provider=twitter"
	source ~/.bash_profile

pathが通っているかどうかexport -pで確認できます。

## 4, 注意点！！！

callbackURLの指定をしない場合、PINcode入力ありのログイン機能になってしまいます。
emailを取得してない、かつ
``` validates :email, uniqueness: true ```
をかけているとemail nullで引っかかります。

## 5, メールアドレスを取得するには？

![スクリーンショット 2018-04-16 15.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/138318/caf8d2ca-b3a6-12e4-c508-f59d2e3971f5.png "スクリーンショット 2018-04-16 15.14.36.png")

まずAdditional Permissionsを要求するためにプライバシーポリシー、利用規約ページのURLを設定します。
次に記述です。

```ruby:sorcery.rb
  config.twitter.user_info_path = "/1.1/account/verify_credentials.json?include_email=true"
  config.twitter.user_info_mapping = { nickname: "screen_name", email: "email" }
```
これで終わりです！
KinesisFirehose+ElasticSearchの連携


KinesisFirehose→AWS ElasticSearchの連携はとても簡単で、
KinesisFirehoseの作成時にElasticSearchのドメインを作っておけば、すぐに設定できます。

直接ElasticSearchにPUTするやり方もあると思いますが、
何と言ってもtypeの作成はJSONが複雑になるにつれ糞めんどくさいですよね。

でも、一度FirehoseにPUTしてしまえば、かなりのメリットがあります。

Firehose+ElasticSearch連携のメリット
---

* ログをすべてS3に保存する設定にしておけば、Athena等で解析が可能。ElasicSearchのエンドポイントを削除してしまっても安心
* ElasticSearch側にindex, typeの設定をしておく必要がない。
	* なければ自動でつくられます
* KinesisFirehoseにPUTするものがネストしたjsonでも、ElasticSearch側はエラーを起こさずにそのネストした状態でtypeを作ってくれる
	* string, int, dateの解釈もしれてくれます。
* KinesisfirehoseにPUTされるJSONの中身に、あらたなキーが追加されてもそれに自動で対応してくれる
	* update作業いらずですね。すごすぎる
コンパイラ講義資料リンク集

各大学のコンパイラの講義資料を集めました
また、コンパイラ関連の書籍も載せておきます

#講義資料

・京都大学
http://www.fos.kuis.kyoto-u.ac.jp/~umatani/le4/mainSlides.pdf

・東北大学
http://www.pllab.riec.tohoku.ac.jp/education/lectures/compiler/compiler.html

・近畿大学
http://www.info.kindai.ac.jp/compiler/

・筑波大学
http://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp-lecture/comp-lecture-note-v1-1.pdf

・慶応大学
http://www.sakurai.comp.ae.keio.ac.jp/classes/2012Compiler.html
http://www.cs.is.noda.tus.ac.jp/~mune/keio/b13/

・関西学院大学
https://ist.ksc.kwansei.ac.jp/~ishiura/xcpl/overview.html

・青山学院大学
https://www.sw.it.aoyama.ac.jp/2014/Compiler/

・山梨大学
http://www.ccn.yamanashi.ac.jp/~ysuzuki/automaton/

・北陸先端技術大
http://www.jaist.ac.jp/~uehara/course/2006/i113/

・法政大学
https://asasaki.cis.k.hosei.ac.jp/lect/compiler/

・東京大学
http://www-sato.cc.u-tokyo.ac.jp/SATO.Hiroyuki/PLDI2010/

・岡山大学
http://www.arc.cs.okayama-u.ac.jp/~nobuya/lecture/compiler2014/

・佐賀大学
http://www.fu.is.saga-u.ac.jp/~yaman/AUTOMATA2/auto.pdf


・Yale University
http://flint.cs.yale.edu/cs421/lectureNotes/index.html

・Stanford University
http://web.stanford.edu/class/cs143/

・UCLA
http://web.cs.ucla.edu/~palsberg/course/cs132/lec.pdf

・ETH
https://www.inf.ethz.ch/personal/wirth/CompilerConstruction/CompilerConstruction1.pdf


https://www.clear.rice.edu/comp412/Lectures/
http://nptel.ac.in/downloads/106108113/
http://iiscs.wssu.edu/drupal/node/4344
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

#書籍
「コンパイラ［第2版］ 原理・技法・ツール」，A．V．エイホ，M．S． ラム，R．セシィ，J．D．ウルマン著，原田賢一訳，サイエンス社．

「プログラミング言語処理系」，佐々政 孝，岩波書店．

「コンパイラの構成と最適化」，中田育男著，朝 倉書店．

「 コンパイラの基盤技術と実践」，中田育男，佐々政孝，渡辺坦，滝本宗宏著，朝倉書店．

「最新コンパイラ構成技法」，A. W. エイペル著，神林 靖，滝本宗宏訳，翔泳社
EC2 on SQLServerでWindows認証できない！という方に

コミュニティAMIから立ち上げたEC2 on SQLServerでインスタンスを作ったら、SQLServerにWindows認証で繋がらない！
そんなあなたは、ここを確認してみよう～！

```
先に結論を書いておくと、
コミュニティAMIでEC2 on SQLServerを立ち上げると
デフォルトのサーバー名が違うサーバーの名前になっています
```


#１．例えばこんなコミュニティAMIを立ち上げる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/65246cd8-df99-26a6-d203-5191cb0fa371.png)


#２．SSMSでWindows認証しようとする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/20b2cfc2-c1e8-50ea-afcb-791e70149b8f.png)

#３．認証エラーが発生する。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/2bc8e78d-1772-28b2-4bad-60f6d2ff0a2c.png)

#４．よく見たらサーバー名が違っている！！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/56e19101-5835-0e3a-82b7-ecba7e8ea979.png)

#５．サーバー名を直したら無事繋がりました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/362d0fac-281f-74ed-6b9d-3e80c630bf79.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/7515f587-f4bf-861c-5346-082e7e09df48.png)


**つまらないことで、一時間ぐらい悩みましたよ。。。**
Pythonでテキストマイニング

# 背景
ただなんとなくやってみようと…。

# 環境
* Windows
* Python 2.7

# 使用ライブラリ
* janome：他にもmecabなどがありますが、今回はこちら
* matplotlib：描画用
* wordcloud：描画用

これらをpip installでインストールします。

# janome確認
このライブラリがどのように動くかを確認します。

```py
from janome.tokenizer import Tokenizer

t = Tokenizer()
tokens = t.tokenize(u'私はPythonが好きです。')
for token in tokens:
    print str(token).decode('utf-8')
```
※Windowsのコマンドプロンプトだと文字コードに注意してください。

実行結果は下記です。

```
私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
Python  名詞,固有名詞,組織,*,*,*,Python,*,*
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き    名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
```

# データ
実際テキストマイニングするデータですが、
当初Twitterのデータを取得する方法も考えたが途中頓挫したので、国会の議事録を取得
http://www.shugiin.go.jp/internet/itdb_kaigiroku.nsf/html/kaigiroku/kaigi_l.htm


# 実装
まず上のデータをちょっと加工してテキストで保存。

```py
from janome.tokenizer import Tokenizer

# データ読み込み
fin = open('test_data.txt')
txt = fin.read().replace('\n', '')
fin.close()

# テキストマイニング実行
t = Tokenizer()
tokens = t.tokenize(txt.decode('utf-8'))
words = {}
for token in tokens:
    data = str(token).decode('utf-8').split()[1].split(',')
    # 名詞のみ取得
    if data[0] == u'名詞':
        key = data[6]
        if key not in words:
            words[key] = 1
        else:
            words[key] += 1
```
ソースが汚いのはおいといて、
これでWindowsで実行すると、[文字：個数]の辞書型が取得できます。

# 描画
wordcloudを使って描画してみます、一般的な使い方はこちらです。

```py
wordcloud = WordCloud().generate(txt)
```
テキストのままだとgenerateもしくはgenerate_from_txt、辞書型の場合はgenerate_from_frequenciesになります。
では上のwordsで描画してみます。

# 失敗

```py
import matplotlib.pyplot as plt
from wordcloud import WordCloud

wordcloud = WordCloud().generate_from_frequencies(words)
plt.figure(figsize=())
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
```
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/88552/e6963b9d-6c81-fafa-7b88-99adafe332b0.png)

幾何学模様の完成です（笑）

# 成功
先程失敗した原因はフォントの指定がないためでした。

```py
import matplotlib.pyplot as plt
from wordcloud import WordCloud

# Windows標準フォントを定義
fpath = "C:\\Windows\\Fonts\\msgothic.ttc"
wordcloud = WordCloud().generate_from_frequencies(words)
plt.figure(figsize=())
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
```
![Figure_1-1.png](https://qiita-image-store.s3.amazonaws.com/0/88552/29bc0448-c272-66b6-c4a5-bb87a2a57cd3.png)

見事に成功。

※画像が見にくい場合はWordCloudの引数に背景色の設定などがありますので、適宜変更するとよいと思います。
WordPressをComposerで場所を指定しながらインストールする

# はじめに
WordPressの案件で本体のインストールをどうしようかな、ということが多くて、最近はComposerでインストールしています。

利点としては

1. コアファイルをGitなどのリポジトリで持たなくても、後から拾ってくればいいやとなる
2. おかげでCIしたり後からリポジトリ拾い出しても便利
3. Dockerとも相性がいい
4. PhpStromで補完用のディレクトリに指定できる

といったことがあります。

# コマンド

```bash
composer config extra.wordpress-install-dir public/wp
composer require johnpbloch/wordpress
```

![Screen Shot 2018-04-16 at 14.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/47327/a6712b5f-b1c4-697c-fc8f-c9ec04cb3093.png)



# ファイルベース

```conf:composer.json
{
    "require": {
        "php": ">=5.4",
        "johnpbloch/wordpress": "4.9.2"
    },
    "extra": {
        "wordpress-install-dir": "public/wp"
    },
}
```

```bash
$ compser update
```

# gitignore
リポジトリ直下においても良いのですが.gitignoreが肥大化しやすいため、WordPress用に分けています。


```conf:public/wp/.gitignore
/*
wp-includes/
wp-admin/
# !wp-content/
!.gitignore

### https://raw.github.com/github/gitignore/5d896f6791c4257b74696714c66b2530b8d95a51/WordPress.gitignore

*.log
wp-config.php
wp-content/advanced-cache.php
wp-content/backup-db/
wp-content/backups/
wp-content/blogs.dir/
wp-content/cache/
wp-content/upgrade/
wp-content/uploads/
wp-conetnt/languages/
wp-content/wp-cache-config.php
wp-content/plugins/hello.php

/.htaccess
/license.txt
/readme.html
/sitemap.xml
/sitemap.xml.gz
```
Viewが画面領域内にあるかどうかを判定する

Swiftで`UIView`が画面領域(`UIWindow`)内にあるかどうかを判定する方法です。

色々と状況を考慮するとチェックすべきポイントがいくつかあります。

1. 対象の`UIView`自身の`isHidden`プロパティと`alpha`プロパティ
2. 対象の`UIView`から親にあたる階層全ての`superview`の`isHidden`プロパティと`alpha`プロパティ
3. 対象の`UIView`と対象の`UIView`の親にあたる`UIWindow`の交差領域とその面積比

> 更に正確に考慮を入れると対象の`UIView`の上に覆いかぶさるViewも考える必要があるのですが、それについては出来ていません。

1と2の`isHidden`と`alpha`を親も含めて再帰的にチェックするのは下のような関数を考えました。

```swift
func isVisibleAllViewHierarchy(of view: UIView, alpha: CGFloat) -> Bool {
    var view: UIView? = view
    while view != nil, let v = view {
        let isHidden = v.isHidden
        let isTransparent = v.alpha < alpha
        if isHidden || isTransparent {
            return false;
        }
        view = v.superview
    }
    return true
}
```

引数に対象の`UIView`と許容する透過率(`alpha`)を渡し`true`が返れば可視状態にあるという判定になります。

次に対象の`UIView`と`UIWindow`を渡し、`UIWindow`の領域内に対象の`UIView`が入っているかどうかを判定する関数は以下のようになりました。

```swift
func isIntersectRect(target: UIView, parent: UIView, ratio: CGFloat) -> Bool {
    // convert(_:to:)でtoで渡したUIViewからの相対座標を取得
    let coordinates = target.convert(target.bounds, to: parent)
    // intersection(_:)で交差領域を取得
    let intersection = coordinates.intersection(parent.frame)
    // 交差領域の面積を計算
    let intersectionArea = floor(intersection.width * intersection.height)
    guard intersectionArea > 0 else {
        return false
    }
    // 対象UIViewの面積を計算
    let targetArea = floor(target.bounds.width * target.bounds.height)
    guard targetArea > 0 else {
        return false
    }
    // 引数の比率を計算して、対象UIViewが交差領域内かどうかを判定
    return intersectionArea >= (targetArea * ratio)
}
```

ポイントは上記のコメントに書いたように、CGRectのそれぞれの交差領域を割り出して判定するというところです。

ある機能を持ったViewコンポーネントが画面内に入ったら何かのアクションを行うといったデザインは結構あるんじゃないかなぁと思います。
ということで、それらを考慮したライブラリを作成しました。

https://github.com/darquro/Visibility

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/92539/82b2c21a-03d6-b89f-7eeb-0f0c8b941b33.gif)


swiftのTargeted Extensionsを用いて、UIViewのプロパティとしてアクセスすることができます。

```swift
// start handling visibility
targetView.visibility
    .changed { state in
        switch state {
        case .visible:
            // visible process here
        case .invisible:
            // invisible process here
    }
}

// stop handling visibility
targetView.visibility.invalidate()
```

CocoaPods、Carthageでのインストールが可能ですので、是非試してみて頂けたら幸いです。
（ついでにスターも頂けると喜びます）
C++ Builder 10.2 Tokyo, XE4 > 構造の記憶を強いるUI > 検索で見つかるUI > 右上の検索ボックス(IDE Insight search box)からの「To-Doリスト表示」

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 (以下、10.2 Tokyo)
秀丸エディタ Version 8.79
```

### 関連

- [C++ Builder 10.2 Tokyo > IDE > To-Doリストの表示 > Alt + v, t, t](https://qiita.com/7of9/items/5775d745402a71e37e13)

### 「To-Doリスト表示」はどこだっけ問題

機能が豊富なIDEの場合、「xxx表示」はどこだっけ、という問題が発生する (**構造の記憶を強いるUI**)。複数のIDEを使うユーザの場合は、それが発生しやすいだろう。
10.2 Tokyoでもそれが起きうる。

「To-Doリスト表示」方法は検索で見つかるようだ。

### 機能検索

右上の検索キーボックス([IDE Insight search box](http://docwiki.embarcadero.com/RADStudio/Tokyo/en/IDE_Insight))に`To-Do`と入力する。
以下のように見つかり、To-Doリストを表示できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f1a0beea-ebf1-3001-9a0d-0f7d1d73d261.png)

「検索で見つかるUI」は「構造の記憶を強いるUI」よりも短時間で使いたい機能にたどり着ける。

~~そういう点で、XE4よりも10.2 Tokyoは良くなっている。~~(下記に訂正)

### 検索用キーワード

C++ Builderでは`To-Doリスト`というハイフン付きの用語になっている。
この記事の検索用に下記の用語を記載しておく。

- TODOリスト

### XE4でも用意されていた
(追記 2018/04/18)

XE4でもIDE Insight search boxは用意されていた。

1. F6
    - > IDE Insight search boxが表示される 
2. `To-do`入力
    - > `コマンド: 表示|To-Doリスト表示`が表示される
3. 表示されたコマンドを選択
delegatecallでさし替え

「一度デプロイしたスマートコントラクトは修正することができない」
というのは理解はしていました
そのためデプロイする際には、不具合が無いようにするのだけど、やはり完全ではない
だとすればどうすれば？
いくつか調べてたところ、「delegatecallを使えば外部コントラクトを呼び出せる」とあったのでそれで差し替えることにしてみる

２つのコントラクトを用意、先にconslibのアドレスをmainにセットする形をとる


```conslib.sol
pragma solidity ^0.4.0;

library conslib {

    function foo(uint _offset) constant returns(string _result)
    {
        return "hello world";
    }

}
```


```main.sol
pragma solidity ^0.4.18;
//
contract main
{
    uint public result_;
    address public conslib = 0x00;
    string public message = "no message";
    function main(address _const) public{
        conslib = _const;
    }
    function foo() public returns(bool){
        return conslib.delegatecall(msg.data);
    }
    function setContract(address _const) public {
        conslib = _const;
    }
    function getContract() returns(address){
        return conslib;
    }
    function setMessage(string _message) returns(bool){
        message = _message;
        return true;
    }
    function getMessage() returns (string) {
        return message;
    }
}
```

こんな感じで差し替えができる感じとなる
あとは、conslibの新しいものを別途作りデプロイして、setContractでアドレスを設定すれば差し替えれれる・・・はずです。

この後の課題としては、差し込んだコントラクトの戻り値をどうやって取得するか、もしくはコントラクトから元のを操作させるかである
スタイルをアプリケーション側から操作する

この記事は、以前 EDN に投稿した[「FireMonkey: スタイルのプロパティの変更やメソッドの実行を動的に行う」] ( http://edn.embarcadero.com/article/42358 ) を 10.2 Tokyo 用にリライトしたものです。
EDN の記事はカスタムスタイルを自分で作って操作するという内容でしたが、スタイルを動的に操作するところにフォーカスしてみました。

アプリケーション上で、ユーザーが行なった動作に対して、色を変えたり、ボタン上に表示される文字を変えたりすることってありますよね。
Delphi (C++Builder) の FireMonkey フレームワークには、スタイルという概念がありまして、このスタイルを使って、コンポーネントのルックアンドフィールを定義しています。
スタイルのプロパティを動的に操作すると、ユーザーが行なった動作に対して、次の動作を誘導するなどを行なうことができます。

動的に操作する際ですが、FindStyleResource メソッドを使用するとスタイルのサブコンポーネントを検索することができます。
検索したスタイルのサブコンポーネントのプロパティの値などを変化させるという方法で操作します。

# サンプル
簡単なサンプルアプリケーションの実際の動きで確認します。
フォームに TButton を 2 つと、TRadioButton を 2 つ配置します。

## サンプルコード

```pascal

// users に FMX.Styles.Objects, FMX.Styles, FMX.Objects を追加する

// 背景だけを回転
procedure TForm1.RadioButton1Change(Sender: TObject);
var
  mBack: TButtonStyleObject;
begin
  if RadioButton1.IsChecked then
  begin
    mBack := Button1.FindStyleResource('background') as TButtonStyleObject;
    if Assigned(mBack) then
      mBack.RotationAngle := mBack.RotationAngle + 30;
  end;
end;

// Button コンポーネントを回転
procedure TForm1.RadioButton2Change(Sender: TObject);
begin
  if RadioButton2.IsChecked then
  begin
    Button2.RotationAngle := Button2.RotationAngle + 30;
  end;
end;

```

## 実行

- RadioButton1 をチェックすると Button1 の背景だけが 30度回転する
- RadioButton2 をチェックすると Button2 が 30度回転する

![style.png](https://qiita-image-store.s3.amazonaws.com/0/164551/042697fa-c08f-8bc9-0c7d-2272096ee94e.png)

## サンプルの解説
デフォルトの TButton のスタイルは

- TText (リソース名 text)
- TButtonStyleObject (リソース名 background)
- TGlyph (リソース名 glyphstyle)
 
の３つのサブコンポーネントから構成されています。

RotationAngle というプロパティは、回転の角度を示すプロパティです。（デフォルトは 0)
TButton プロパティの RotationAngle のプロパティの値を変えると、TButton 自身が回転します。
TButton のスタイルの背景を受け持つ TButtonStyleObject の RotationAngle のプロパティの値を変えると、背景となる枠のみが回転します。

# 参考

- [FindStyleResource]( http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Controls.TStyledControl.FindStyleResource )
- [スタイルを使った FireMonkey アプリケーションのカスタマイズ]( http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F_FireMonkey_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA )
pyenv を用いた Python3 インストール

## **pyenv を用いた Python3 インストール**
備忘録として残します．


### **実行環境**
Cent OS Linux release 7.4.1708 (Core) 64 bit

### **手順**

#### 1. 事前準備
事前に必要なものをインストールします．
git から pyenv を取得するので，忘れずにインストールしましょう．

```
$ sudo yum groupinstall "Development tools"
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git
```
<br />

#### 2. pyenv インストール
git からインストールします．

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```
<br />

#### 3. PATH を通す
echoコマンドの代わりに vi や gedit などで編集しても良いです．
最後に変更を反映させるのを忘れないようにしましょう．

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source .bash_profile
```
<br />

#### 4. 確認
pyenv がインストールされて PATH が通ったか確認しましょう．
以下のように，コマンドを打ってバージョンがしっかりと表示されれば大丈夫です．
うまくいかなければ，正しくインストールされていないか PATH が通っていないことになるので，
前項までの手順をもう一度確認してみましょう．

```
$ pyenv --version
pyenv 1.2.3-43-g35f7ef8
```
  
ダメな例

```
$ pyenv --version
bash: pyenv: コマンドが見つかりませんでした...
```
<br />

#### 5. Python3 のインストール
まずはインストール可能なバージョンを確認します．
※出力が長いので一部省略しました．

```
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  .....
  2.7.12
  2.7.13
  2.7.14
  3.0.1
  3.1
  3.1.1
  3.1.2
  .....
  3.6.3
  3.6.4
  3.6.5
  3.7.0b3
  3.7-dev
  3.8-dev
  activepython-2.7.14
  activepython-3.5.4
  ......
```
この場合ですと，2.x系は2.7.12，3.x系は3.6.5が安定版となります．
今回は Python3 のインストールが目的ですので，3.6.5をインストールします．

```
$ pyenv install 3.6.5
```
次に pyenv を用いてちゃんとインストールされているか確認しましょう．
3.6.5 が表示されていればOKです．

```
$ pyenv versions
* system (set by /home/hasepyon/.pyenv/version)
  3.6.5
```
これで python のインストールは完了しましたが，実際に使えるようにするためにはもう一手間かかります．
<br />

#### 6. python のバージョン切り替え
まずは python のバージョンを確認します．

```
$ python --version
Python 2.7.5
```

先ほどインストールしたはずの 3.6.5 にはなっておらず，Cent OS デフォルトのものになっています．
global コマンドでバージョンを切り替えましょう．

```
$ pyenv global 3.6.5
```

もう一度 python のインストール一覧を確認しましょう．

```
$ pyenv versions
  system
* 3.6.5 (set by /home/user/.pyenv/version)
```
\* の位置が 3.6.5 にズレていますね．
これが付いているものが現在指定されている python のバージョンになります．
system はデフォルトでインストールされているものになります (ここでは2.7.5)．
("user" には各々のアカウント名が入ります)

念のためさらに確認しておきましょう．

```
$ python --version
Python 3.6.5
```

```
$ python
Python 3.6.5 (default, Apr 12 2018, 12:43:01) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```
これで使えるようになりました．
Ubuntu Server 16.04 LTSのインストールUSBの作成

#はじめに
Ubuntu ServerのUSBメモリを使ったインストールメディアを作成する。

#必要なのもの
- Ubuntu Server 16.04 LTS
- 16GB以上のUSBメモリ(できるだけ高速なもの) //1GBなので、十分すぎる
- クライアントマシン //MacBook Airを使用

#手順
##1. ダウンロード
1-1: ubuntu.comから[Ubuntu Server](https://www.ubuntu.com/server)のisoイメージのダウンロードします。イメージの種類は、『Ubuntu 16.04 LTS』使用します。

1-2:『Download Ubuntu Server』ボタンをクリックする。
![スクリーンショット 2018-04-04 18.04.06.png](https://qiita-image-store.s3.amazonaws.com/0/54439/afe30ae0-2df2-1ca2-701c-2ba2979c78a2.png)

1-3: Ubuntu Server 16.04.4 LTSの『Downlad』ボタンをクリックする。
![スクリーンショット 2018-04-04 18.06.54.png](https://qiita-image-store.s3.amazonaws.com/0/54439/9f0be184-26e1-cbca-cd2c-68125a666524.png)

1-4: ダウンロードが開始され、次のページにリダイレクトされる。（別段入力の必要なし）
![スクリーンショット 2018-04-04 18.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/54439/8ed48393-f638-38e3-4a3f-4bf2e887e25a.png)

1-5: 『ubuntu-16.04.4-server-amd64.iso』がダウンロードされる。

##2. OSインストールメディアの作成
<font color="Red">重要: この作業は、書き込むディスクを間違えるとデータロストに繋がりますので慎重に作業してください。誤り避ける為、起動ディスク以外は接続をはずしてください。</font>
クライアントマシンにダウンロードした『ubuntu-16.04.4-server-amd64.iso』ファイルをUSBメモリに書き込みします。ターミナル.aapを使って、次のコマンドを入力して作業を進めます。

- diskutil: ディスクの管理
- sudo: 管理者権限でコマンドを実行
- dd: isoイメージをそのままUSBに書き込み

カレントディレクトリは、Desktopし、『ubuntu-16.04.4-server-amd64.iso』ファイルもDesktopに移動します。

2-1: diskutilコマンドで現在のディスクの接続状況を確認する。

```
$ diskutil list
```
(例)ここでは、内蔵SSDが/dev/disk1でマウントされている。『THEBE_HD』と言う名前のボリュームがある。
![スクリーンショット 2018-04-07 11.11.27 2.png](https://qiita-image-store.s3.amazonaws.com/0/54439/bdc785f6-2ec5-a3d6-2250-5b2a6b09dac6.png)

2-2: USBメモリを接続して、diskutilコマンドで現在のディスクの接続状況を再確認する。

```
$ diskutil list
```
(例)ここでは、USBメモリが/dev/disk2でマウントされている。『Untitled』と言う名前のボリュームがある。

![スクリーンショット 2018-04-07 11.12.37 2.png](https://qiita-image-store.s3.amazonaws.com/0/54439/0e912446-d2b6-90b3-b26d-2363170c0d8b.png)


2-3: USBメモリをアンマウントする。

```
$ diskutil unmountDisk /dev/diskN #Nは数字
```
(例)ここでは、USBメモリを『diskutil unmountDisk /dev/disk2』でアンマウントされた。アイコンも消える。

![スクリーンショット 2018-04-07 11.15.47.png](https://qiita-image-store.s3.amazonaws.com/0/54439/f4c1a100-4267-8d45-cf46-66c2f7bf9ca6.png)


2-4: ddコマンドでファイルをコピーする。完成したらイジェクトする。

```
$ sudo dd if=ubuntu-16.04.4-server-amd64.iso of=/dev/rdiskN bs=1m
#Nは数字
```
(例)ここでは、USBメモリを『sudo dd if=ubuntu-16.04.4-server-amd64.iso of=/dev/rdisk2 bs=1m』でファイルコピーした。ダイアログからイジェクトした。イメージもサイズもコピーしたサイズもまったく同じの889,192,448バイトなので、正しく作成できた。ちなみに/dev/diskと/dev/rdiskは同じディスクを指して、ランダムアクセスかシーケンシャルアクセスかの違いです。


![スクリーンショット 2018-04-07 11.19.23.png](https://qiita-image-store.s3.amazonaws.com/0/54439/ed5672e2-1547-d18c-6761-559081805798.png)

![スクリーンショット 2018-04-07 11.23.02.png](https://qiita-image-store.s3.amazonaws.com/0/54439/77555cdd-06e4-09c3-d570-cde0fb0a6087.png)

#リファレンス
PyMC　環境設定

#PyMCをインストールする手順#

この投稿ではAnacondaとPyMCをインストールする手順を記載する。
対象はWindows。
ただの備忘録。

##STEP1. Anacondaをインストール##
最新版のAnacondaを下記サイトからインストール。
https://www.continuum.io/downloads

##STEP2. コマンドプロントを起動し、コマンドを入力##
Anaconda Promptを起動し、下記コマンドを入力する。

`conda update conda`
`conda update --all`

続いて次のコマンドを入力し、PyMCをインストールする。
`conda install pymc`

##STEP3.インストールされたかチェック##
Jupyter Notebookで新規IPython Notebookファイル(.ipynb)を作成し、
`import pymc`
を実行してエラーが出なければ問題なくインストールされている。

以上！
git push の引数指定が面倒。デフォルト設定スクリプトを書いてみた

ローカルのブランチのコミットをリモートに反映するとき

```sh
$ git push origin [ブランチ名]
```

とかってやりますよね。この `origin [ブランチ名]` の指定って正直面倒くさいです。

基本同じ名前のブランチにPUSHしますし、ブランチ名がある程度長くなってくるともう...


それだからといって、新しいブランチを作るごとに
`git push -u　origin [ブランチ名]` で設定するのも面倒くさい。[(参考)uオプションによるデフォルト設定](https://gotohayato.com/content/114)

違うリモート先にPUSHするときは結局指定してやらないといけなくなります。

ならば、git push コマンドの挙動を変えてやりましょう。

## 想定する使い方

- pushによって反映するリモート先は選択できるようにしたいので、リモートの名前を引数に取ります。
- 第2引数を指定しなければ、カレントブランチと同名ブランチにpushします。

```sh
# originのカレントブランチと同名のブランチにpush
$ gipush origin

# originのnew_branchブランチにpush
$ gipush origin new_branch
```

- また、pushを実行する前にpush先を以下のような形で最終確認できるようにします。

```
origin/develop にpushしてよろしいですか? (y/n) : 
```

## bashのalias作成

### ソース

`~/.bashrc` で git push のaliasを作成します。

```sh
function gipush {
  if [ ! $1 ]; then
    echo '[error] PUSHするリモート先を指定してください';
    return;
  fi
  branch_name=${2:-$(git symbolic-ref --short HEAD)}
  read -p "${1}/ ${branch_name} にpushしてよろしいですか? (y/n/f) :" YN
  if [ "${YN}" = "y" ]; then
    git push $1 $branch_name
  elif [ "${YN}" = "f" ]; then
    git push --force-with-lease $1 $branch_name
  fi
}

alias gipush=gipush
```

### 解説

今回の場合、引数によって処理を加えたいので関数として定義します。
そしてその関数をaliasとして設定しておけば、そのコマンドで実行することができます。

コマンドラインで指定した引数は、`$1` , `$2` という形で順に取得します。

まず、第一引数のpush先のリモート名がなければ、エラーを出し無効とします。

次に、第二引数の有無によってpush先ブランチを決定しています。

```sh
branch_name=${2:-$(git symbolic-ref --short HEAD)}
```

`git symbolic-ref --short HEAD` で現在のカレントブランチが出力されるので
引数があればそちらを、なければカレントブランチでという指定になります。


この時push先を最終確認したいのでメッセージを表示し、
`read` によって対話的な処理を行い分岐させています。

今回、普通の `git push` 以外にrebaseした際などに
使う `--force-with-lease` オプションも使いたかったのでこのような分岐にしています。

### 余談

カレントブランチ名を取得して...とやっていますが
ただリモートのカレントブランチにpushしたい場合は以下で問題ないようです。
（yamap_55 さん、ありがとうございます。）

```sh
$ git push origin HEAD
```



## 終わりに

普段シェルスクリプトを書かないので、ORの指定の仕方など勉強になりました。
`elif` なのが一番びっくりしました。rubyでも `elsif` なのに...

今回は、`git push`　の挙動を変えるという方針で行きましたが
後から考えてみれば、git branchで作った際に、 `-u` で設定するって感じでもよかったですね..

今回のスクリプト別にいらないんじゃない感が残りますが、

最終確認のダイアログが欲しかったので、これでよしとします。:innocent:
Pythonの実行終了をLINEで通知する

#背景
機械学習の勉強を近頃始めたのですが、LSTMとか組んじゃうと待ち時間長いですね。
待ってる間に次のモデルを書いてみたりソシャゲやったり寝てみたりと…
ただ、終わったかな？と逐一コマンドラインを確認するのに飽きました。
スマホにLINEでPythonの実行終了を通知してもらおうと思います。

明日の朝には終わってるだろうと思って実行だけ押して寝てみると、入力ファイルのパスが間違ってて3行目で実行が止まってたなんてことが先日ありました。GPUが欲しい。

#方法

・LINEのアカウントを作る（既存のもので良い）
・LINE Notifyを友達登録
・通知用のPythonを書く

やることはそんなありません。
わざわざこの記事に来る人はLINEアカウントを持ってると思うのでLINE Notifyについてから書きます。

##LINE Notifyとは

>Webサービスからの通知をLINEで受信
>Webサービスと連携すると、LINEが提供する公式アカウント"LINE Notify"から通知が届きます。
>複数のサービスと連携でき、グループでも通知を受信することが可能です。

出典：https://notify-bot.line.me/ja/

要するにプログラムでLINEに通知だせるサービスです、と書いてあります。
かなり丁寧に作られていると感じました。ぜひドキュメントも読んでみてください。
既に色々と紐ついてるサービスもありますが、今回はtokenを発行して使います。

##LINE Notifyでやること
まずはLINE Notifyをスマホで友達登録。

LINE Notify : https://notify-bot.line.me/ja/
上記のサイトに行き、右上からログインします。
ログインしたらマイページへ。
アクセストークンの発行(開発者向け)の下にあるトークンの発行をクリック。
[1:1でLINE Notifyから通知を受け取る] を選択します。
トークンが発行されたらその画面で一度ストップさせてください。
消してしまった場合は同様の手順で再発行になります。一度しか表示されません。

## コード

Python3でしか実行を確認していません。
大体は[「PythonからLINE NotifyでLINEにメッセージを送る」](https://qiita.com/tadaken3/items/0998c18df11d4a1c7427)と同じです。

　発行したトークン　と書かれたところを、さきほどのLINE Notifyの画面に表示されているトークンに置き換えてください。

```python:notify.py
import requests
import sys

def main():
    url = "https://notify-api.line.me/api/notify"
    token = '発行したトークン'
    headers = {"Authorization" : "Bearer "+ token}

    args = sys.argv
    if args[0] == 1:
        message =  '通常終了'
    else :
        message = '異常終了'
    payload = {"message" :  message}
    files = {"imageFile": open("end.jpg", "rb")}

    r = requests.post(url ,headers = headers ,params=payload, files=files)

if __name__ == '__main__':
    main()

```

notify.pyという名前で保存しておきます。
コマンドライン引数で1と入力されたときに、通常終了、それ以外は異常終了とメッセージを送るものです。
end.jpgという名前で適当な画像を保存して同一ディレクトリにおけば一緒に送られてきます。
可愛い鳥の画像とかどうでしょう。

#使い方

コマンドラインで実行する際、以下のようにして動かしてください。

```
python [実行するPythonファイル] && python notify.py 1 || python  notify.py
```

やってることの割に記事が無駄に長くなりました。
もっと簡潔に書けると思います。コメントの方で是非。

#参考
・[PythonからLINE NotifyでLINEにメッセージを送る - Qiita](https://qiita.com/tadaken3/items/0998c18df11d4a1c7427)
stats cachedumpの上限


```
$ echo -e "stats items"|nc localhost 11211

...

STAT items:10:number 200000
```

みたいなデータのキー一覧を取得しようとして

```
$ echo -e "stats cachedump 10 200000"|nc localhost 11211 > dump

$ wc -l dump
25000 dump

$ ls -lh dump
-rw-r--r-- 1 owner group 2.0M  4月 16 13:04 dump
```

だったりすることがある。

全件とれないのでおかしいなぁと思っていたら

https://github.com/memcached/memcached/blob/dbb7a8af90054bf4ef51f5814ef7ceb17d83d974/items.c#L589

```items.c
char *item_cachedump(const unsigned int slabs_clsid, const unsigned int limit, unsigned int *bytes) {
    unsigned int memlimit = 2 * 1024 * 1024;   /* 2MB max response size */
```

上限ありましたかー。
portAudioでストリーミング処理 + マルチチャンネル処理

#概要
portaudioを使ってストリーミング音声処理をしたい
オーディオインタフェースを使う場合のマルチチャンネル入力（4ch,8ch...）の場合のコードの書き方を載せる

#環境
portAudio
win10
WASAPI（DirectSoundではマルチチャンネル入力ができなかった，OSやサウンドドライバに依ってマルチチャンネルが使える/使えないが決まるので注意）

#ソースコード(C言語)
* portAduioを使ってデバイスをopen
* callback関数によってオーディオストリーミングを処理
* callback関数内でストリーミングから入力チャンネルを切り分ける

```portaudio_multiInput_sample.c
PaStream *stream;
PaError err;

static int NUM_OF_CHANNEL = 4;
/* Open an audio I/O stream. */
err = Pa_OpenDefaultStream( &stream,
                            NUM_OF_CHANNEL,          /* 4 input channels */
                            0,          /* no output channel*/
                            NULL,  /* 32 bit floating point output */
                            SAMPLE_RATE,
                            256,        /* frames per buffer, i.e. the number
                                               of sample frames that PortAudio will
                                               request from the callback. Many apps
                                               may want to use
                                               paFramesPerBufferUnspecified, which
                                               tells PortAudio to pick the best,
                                               possibly changing, buffer size.*/
                            Callback, /* this is your callback function */
                            &data ); /*This is a pointer that will be passed to
                                      your callback*/
if( err != paNoError ) goto error;

static int Callback( const void *inputBuffer, void *outputBuffer,
                           unsigned long framesPerBuffer,
                           const PaStreamCallbackTimeInfo* timeInfo,
                           PaStreamCallbackFlags statusFlags,
                           void *userData )
{
  //入力信号は16bitの音声信号
  SP16 **recogData; 
 
  //チャンネルごとのメモリ確保
  recogData = (SP16**)malloc(sizeof(SP16*) * NUM_OF_CHANNEL);
  for(int i=0; i<NUM_OF_CHANNEL; i++)
    recogData[i] = (flaot*)malloc(sizeof(SP16*) * framesPerBuffer);

  //ストリーミングからチャンネル毎に信号を切り分ける
  SP16 *in = (SP16*)inputBuffer;
  for (int j=0; j<NUM_OF_CHANNEL; j++)
    for (int i=0; i<framesPerBuffer; i++)
      recogData[j][i] = in[i*NUM_OF_CHANNEL+j];
}
```

#要点
以下の部分でストリーミング入力を切り分けている

```
//ストリーミングからチャンネル毎に信号を切り分ける
SP16 *in = (SP16*)inputBuffer;
for (int j=0; j<NUM_OF_CHANNEL; j++)
  for (int i=0; i<framesPerBuffer; i++)
    recogData[j][i] = in[i*NUM_OF_CHANNEL+j];
```
#解説
ストリーミングの場合，inputBuffer変数としてcallbackに渡されるデータは
|1chのデータ| |2chのデータ| |3chのデータ|...|Nchのデータ|
各データ長はストリーミングのframePerBuffer引数として渡されている
なのでfor文でこれらを切り分けている

#注意点
streamingをopenする際には「オーディオインタフェース側のsampling rateやbit深度」と「プログラムで指定するsampling rateやbit深度」が一致していないとerrorを吐く
オーディオインタフェースの設定，ソフトウェアのオーディオドライバ，portaudioのプログラムの3点を一致させる必要がある
WSLでWindowsにLinux開発環境を構築する

## Windows Subsystem for Linux（WSL）とは

Windwos 10またはWindows Server上でLinuxのツールを実行するためのサブシステムです。
嬉しいことにWindowsでBashが使えるようになります。

## WSLが解決できるもの

Windowsで開発していたがツールの関係上仕方なくMacで開発している人。
Macで開発していたが様々な事情で仕方なくWindowsで開発している人。
両方の悩みを解決します。

## 導入手順

今回はWSLのセットアップからNode.jsをインストールしHELLO WORLDまでを行います。

## 1. 機能の有功化

まず、コントロールパネルから `プログラムと機能` を選択し、 `Windowsの機能の有功化または無効化` をクリック。
`Windows Subsystem for Linux` にチェックを入れてPCを再起動します。

<!-- img -->
<img width="526" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/e9c8510d-56b3-f4cd-4ab6-635c8777601c.png">

## 2. ディストリビューションの入手

次にMicrosoft Storeを開き、検索フォームに `linux` と入力。 `WindowsでLinuxを実行する` をクリックし好きなディストリビューションを選びましょう。

<!-- img -->
<img width="1042" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/405784fd-f856-e3ff-4368-db8a9de1e327.png">

入手をクリックしダウンロード。

<!-- img -->
<img width="1045" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/925cca96-7b0d-70e7-707a-fbc8e4e502d3.png">

ダウンロードが完了すると起動するか尋ねられるので `起動` をクリック。
するとコンソールが立ち上がり、名前とパスワードの設定を求められます。

<!-- img -->
<img width="994" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/5e8a548a-23fa-3919-c373-639719f7e6ca.png">

設定が終わったら `exit` でコンソールを閉じちゃいましょう。

## 3. anyenvとnodenvのインストール

ここからはBashで作業してきます。
Bashを検索し起動します。

<!-- img -->
<img width="405" alt="06.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/68aab413-ee77-7752-3709-7cfff2327358.png">


開発言語のバージョン管理は好みがありそうですが、今回はanyenvとnodenvを導入します。

### anyenv

```
git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(anyenv init -)"' >> ~/.bashrc
exec $SHELL -l
```

### nodenv

```
anyenv install nodenv
...中略
exec $SHELL -l
```

## 4. Node.jsのインストール

現時点の最新版とLTSを調べてインストールします。
グローバルには最新版を設定しておきます。
（現在の最新版はv9.11.1、LTSがv8.11.1でした）

```
nodenv install --list
...中略
nodenv install 9.11.1
...中略
nodenv install 8.11.1
...中略
nodenv global 9.11.1
node -v
v9.11.1
```

## 5. Windwos上のファイル操作

さて、Node.jsをインストールしたまでは良いですが、どうやってBashからWindows上のファイルを操作したら良いでしょうか。
実は `/mnt/c` 配下は、WindowsのCドライブをマウントしています。
ですので、

```
cd /mnt/c/Users/<USER_NAME>
```

で、ユーザーフォルダに移動できます。
いちいち打つのは面倒なので適当なaliasを設定しておくと良いでしょう。
（ちなみにWindowsからもLinux上のファイルを操作できるそうですが、壊れる可能性があるので注意してください。）
[Bash on WindowsでWindows側からUbuntu側のファイルをいじると壊れることがあるので注意](https://www.kaitoy.xyz/2016/11/19/bow-do-not-change-linux-files-from-windows/)

では、ユーザーフォルダに `workspace` フォルダを作り、Node.jsのLTS版（v8.11.1）を設定してみます。

```
cd /mnt/c/Users/<USER_NAME>
mkdir workspace
cd workspace
nodenv local 8.11.1
node -v
v8.11.1
```

続いてHELLO WORLDを出力してみます。

```
echo 'console.log("HELLO WORLD")' > helloWorld.js
node helloWorld
HELLO WORLD
```

以上です。あとは好きな言語やツールを入れてWindowsでの快適な開発を楽しみましょう。
もし、デジタルサイネージのシステムを構築しなければならなくなったときに見るページ

## 経緯
お世話になっている僕のゼミの先生が、研究活動の一環としてデジタルサイネージ（他画面同時出力）をやってみたいと言い出した。しかし先生自身は元々写真を撮影することを生業としてきた経歴を持つ人物だったため自身構築するようなスキルもない。色々思いつく限りを当たったものの納得のいく結論は見出せなかったことから、数週間前に「お前暇だろ？ちょっと調べてきてよ」私に匙を投げつけてきたというのが事の経緯。この話を受けるにあたりお節介にもサイネージのスタンドアローンプレイヤーまで買ってきやがったのでこれから卒論等々でますますお世話に避けられずもう後には引けない。渋々やることにした。

### やりたい事
- 3画面以上のモニターでコンテンツを再生したい
- 現場に置く機材は少なく、安いほうがいい（もしくは隠しておける）
- それぞれの再生時間などをしっかりとコントロールしたい
- 上流ネットワークがどうなっているのかわからないため学内での発表も視野に入れると外部ネットワークとの接続はなるべく避けたい


## 調べてみた
デジタルサイネージのシステムは基本的にBtoBの商材であることから個人向けの簡易的なシステムは見つけることができなかった(そういった意味ではBrightSignがもっとも簡易的)。自身でシステムを購入/構築するという観点から言っても機材を揃えること、自分でコンテンツを制作するという事に趣味的な旨味を感じる人が非常に少ない(まぁ、無理もないよね。単画面出力の一番簡単なプレイヤーでも普通に4万円コースだし) こともありやってみた的なレポートもヒットしなかった。舞台演出などを手がける人の同業向けと思しき試用は数件見つかったが、どう読んでも初見で理解できない専門知識の嵐なのでもうすぐ定年の先生に読ませるには非常に酷。


### 考えてみた
今回のケースでやりたい事に対しての直接的な弊害は

- 外部と繋がるネットワークが利用できない点
- BrightSign製ハードを利用する方向で考えねばならない点
- イニシャルコストをできる限り減らしていく必要がある点
- 機材を減らす（隠す）必要がある点

逆に言えばこれらをクリアできるシステムを構築すればいいってわけだ。（アッタマイイ〜！！フゥ〜〜〜〜ッ！！）

### 検討
今回は以下のうち3つの方法を検討することにする。

- BrightSign製のデジタルサイネージシステムを利用する
- 自前でLAN内同期システムを構築する
- 映像出力のポートを3つ以上用意できるPCを用いる
- 人力でスイッチングする

> ##### BrightSignとは<br>アメリカで創業したデジタルサイネージ向けに製品やサービスを提供する企業。紫色の筐体のプレイヤーは専用OSを搭載していて、mov,flvなどに加えHTML5動画も再生することができ、コマ落ちやレイテンシも非常に少ないことが特徴。業界シェアNo.1とか

人力スイッチングはどう考えても人を常駐させねばならず非効率なので今回考慮しないが、私のアンテナの届く範囲で解決策を検討した結果3つの方法まで絞られた。

---
##### **BrightSign製のシステムを利用する方法**
![brightsign.jpg](https://qiita-image-store.s3.amazonaws.com/0/211087/91e7da53-06b9-08de-9dfb-77afd76423c6.jpeg)

端的に言えばBrightSign社が提供しているCDNを利用する方法。ここのプレイヤーは付属のうっすい取説を読む限りスタンドアロンでの使用よりもBrightSignNetworkというクラウドサービスを利用することを前提としているような書き方をしている。ここのマシンを利用する場合にはBrightAuthorという専用ソフトを介してiPhoneに対するiTunes的な運用をせねばいけないらしく覚えなくちゃいけないことがたくさん。究極的にはちゃんと覚えればノープロブレムなんだけど、BrightSignNetworkは有料プランに入らないと細かな操作ができないから難儀する事請け合い。そうは言っても専用ハードを使えるメリットは非常に大きいため学校の上流ネットワークを介してもちゃんとストリーミングができるなら十分に対象となる。


##### **自前でLAN内同期させ、ローカルで配信する方法**
![プレゼンテーション1.jpg](https://qiita-image-store.s3.amazonaws.com/0/211087/e4b2fdb0-2a37-21f6-89c9-aef8d262d3d8.jpeg)

色々と調べているとどうやら動画を配信するのにRTSP (Real Time Streaming Protocol)やHLS (HTTP Live Streaming)といったプロトコルを使って配信さえできれば良いということに気がついた。そこで上の図。ざっとググった限りではあるけれどNGINXからRTSPが配信できるらしいぞということを掴んだ。NGINXなら僕も普段管理しているWEBサーバーで使ってるし、ドキュメントも充実しているからきっと使いこなせるはず。たとえは現場で小さなネットワークを作ってNginxのサーバーをスティックPCか何かで立ててしまえばクライアント側でVLCやブラウザを走らせればいいので機材に依存することはない。今ある設備を使ってシステムを組み上げることができるということは非常に大きなメリットにはなるけれど、構築, 運用には多少のスキルが必要になる。


##### **他画面出力ができるPCを利用する方法**
![pc.jpg](https://qiita-image-store.s3.amazonaws.com/0/211087/af47128d-0d7c-fb80-0cff-abeee933b7f1.jpeg)


おそらくこの方法が最も簡単かつ現実的。お猿さんでもできる。ネットワークも利用しなくていいし、複雑なシステムを組み上げる必要もない。ただ、今回のケースでは少なくとも映像の外部出力を最低3ポート以上確保せねばならないため並みのPCでは達成できない。（グラボ積んだデスクトップならワンチャン）コストが最もかかる方法ではある。<p>もっと言えば高価な機材を現場に置きたくないという意向も無視せざるを得ないこともあり、なかなか難しそう。


---

### 結論

ということで散々検討をしてきた結果、不要なマシンを利用できたりメリットも多いことからとりあえず僕のスキルアップも兼ねてLAN同期させる方向で考えている。具体的にこういうことしたよってことがもし出てくればまたここにあげます。

### 参考
[BrightSign正規販売代理店の製品紹介ページ](https://www.tekwind.co.jp/BRS/products/category.php)
スクレイピングでTwitter, Instagramのフォロー/フォロワー数などを取得

# はじめに
本稿は以下のような人向けです。

* Twitter, Instagramのフォロー/フォロワー/投稿数取得を自動化したい
* API連携をしてまでやるほど大規模なものじゃない。手間をかけず実装したい
* 少数のユーザーを対象にしたもので、多くのリクエストを送ったりしない

# 動作確認環境
* Python 3.5.2
* beautifulsoup4 (4.6.0)

# 実装
Twitterは普通にDOMを抜き出し、Instagramはjavascriptを抜き出しました。
request時のエラーハンドリングや、DOMが変わってしまった時の対策等は書いてませんが、
サービスに載せる際にはそのあたりも考えておくと良いと思います。

コードではフォロー数とフォロワー数しか取得していませんが、
取得部分を変更すれば投稿数やいいね数なども取れると思います。


```python:social_medias.py
import json
import re
import requests
from typing import Dict

from bs4 import BeautifulSoup

class SocialMedias():

    @classmethod
    def get_statuses(cls) -> Dict:
        statuses = {}

        statuses['instagram'] = cls.__get_instagram_statuses('https://www.instagram.com/nyakuro/')
        statuses['twitter'] = cls.__get_twitter_statuses('https://twitter.com/nyakuro')
        return statuses

    @classmethod
    def __get_twitter_statuses(cls, url: str) -> Dict:
        statuses = {}

        # ToDo: error handling
        response = requests.get(url)
        soup = BeautifulSoup(response.content, 'lxml')

        # get follow count
        content = cls.__get_element_by_class(soup, 'ProfileNav-item--following')
        statuses['following_count']\
            = int(cls.__get_element_by_class(content, 'ProfileNav-value').string.replace(',', ''))

        # get follower count
        content = cls.__get_element_by_class(soup, 'ProfileNav-item--followers')
        statuses['follower_count']\
            = int(cls.__get_element_by_class(content, 'ProfileNav-value').string.replace(',', ''))

        return statuses


    @classmethod
    def __get_instagram_statuses(cls, url: str) -> Dict:
        statuses = {}

        # ToDo: error handling
        response = requests.get(url)

        soup = BeautifulSoup(response.content, 'lxml')
        js = soup.find("script", text=re.compile("window._sharedData")).text
        data = json.loads(js[js.find("{"):js.rfind("}")+1]);

        statuses['following_count'] = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_follow']['count']
        statuses['follower_count'] = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_followed_by']['count']

        return statuses


    @staticmethod
    def __get_element_by_class(soup: BeautifulSoup, class_name: str) -> BeautifulSoup:
        return soup.find(attrs={'class': re.compile('^' + class_name + '$')})


social_medias = SocialMedias()
print(social_medias.get_statuses())
```

```bash:実行結果
$ python social_medias.py
{'instagram': {'follower_count': 17, 'following_count': 10}, 'twitter': {'follower_count': 763, 'following_count': 615}}
```

# 参考させていただきました
* [簡単に出来るサーバレスでのInstagramのスクレイピング](https://qiita.com/uda0922/items/c80f38bb65db5c64cce1)
【要約】最強の働き方

## 1. はじめに
以下書籍の要約。

- 題名：[最強の働き方](https://www.amazon.co.jp/%E6%9C%80%E5%BC%B7%E3%81%AE%E5%83%8D%E3%81%8D%E6%96%B9-%E4%B8%96%E7%95%8C%E4%B8%AD%E3%81%AE%E4%B8%8A%E5%8F%B8%E3%81%AB%E6%80%92%E3%82%89%E3%82%8C%E3%80%81%E5%87%84%E3%81%99%E3%81%8E%E3%82%8B%E9%83%A8%E4%B8%8B%E3%83%BB%E5%90%8C%E5%83%9A%E3%81%AB%E5%AD%A6%E3%82%93%E3%81%A077%E3%81%AE%E6%95%99%E8%A8%93-%E3%83%A0%E3%83%BC%E3%82%AE%E3%83%BC%E3%83%BB%E3%82%AD%E3%83%A0/dp/4492045937/)
- 著者：ムーギー・キム
- 出版：東洋経済新報社

## 2. 最強の働き方
### 2-1. メールの返信は即座に行う
メールの返信が遅いと「相手から軽視されているのかな」と不信が募るものです。
メールくらい、と思うこともあるかもしれませんがその積み重ねが相手に対する感情や評価を大きく左右します。
メールに限らずですが、小さい仕事でも後回しにするとチリツモです。
「３分以内でやれる仕事は今やる！」ことはとても重要です。


### 2-2. いい会話の一番大切な基本は、相手に興味を持つこと
相手の言葉を進んで傾聴する姿勢、聴き方の技術を「アクティブ・リスニング」と言います。
会話を単なる情報交換ではなく、相手のニーズを理解することで、信頼関係構築の機会にすることができます。
また相手に興味を持つほど、会話が楽しくなるかと思います。


### 2-3. 日常のストレスが大きい人ほど、非日常の趣味が必要
少なからず、仕事にストレスはつきものです。
たまには日常の仕事から離れて、自分の関心事や欲求を満たしてあげる趣味の時間を持つことはとても重要です。
「週末にこの楽しみが待ってるぞ！」と思うことで、仕事に対するエネルギーにもなります。


### 2-4. 危機感と競争意識をもつ
「自然界では最強のものが生き残るのではなく、変化できるものが生き残る」
と言われています。その変化の最大の原動力は、生存競争への危機意識です。
「今自分がやっている仕事は、もっと給料が安い人の中にも、自分以上に速く正確に仕上げられる人がいる」という厳しい競争を想像すると自然と緊張感をもって働けるようになり、100パーセント以上の力を発揮できるかと思います。


## 3. おわりに
新入社員の皆様の参考になりましたら幸いです。
また何かありましたら追記させて頂きます。