OmniAICreator/Qiita-1.07M huggingface dataset:
ionic 環境構築(Mac)

#ionic環境構築(Mac)
```
sudo npm install ionic cordova -g
```

#プロジェクト作成
```
ionic start プロジェクト名

cd プロジェクト名　でプロジェクト内に移動して後続の作業を行う
```

#ionic 起動
```
ionic serve
```

自動でブラウザが立ち上がり、画面の確認が可能。
ソースの変更をした場合に自動で変更後のソースコードをビルドして再描画してくれるので、とても楽

```
ionic serve --lab
```

こちらはiOSとAndroidの画面表示が確認できるので、よく使う
（結構描画に失敗したりするので、軽い確認程度で最終的には実機でテスト必要）

確認が終わったら、Ctrl + C で停止しておくこと

#ページ追加
```
ionic g
```

ページの表示方法自体はタブとして表示とかルーティングとかで異なるので省略

#モジュール追加
諸々のモジュールがあるが今回はカメラ機能で
```
Ionic cordova plugin add cordova-plugin-camera
npm install --save @ionic-native/camera
```

なお、app.module.ts内のimportと@NgModeluにも定義を追加しないといけないので注意

```
import {Camera} from '@ionic-native/camera/ngx';
〜

NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
  providers: [
    StatusBar,
    SplashScreen,
    //こことかに追加
    Camera,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})
```

モジュールを使用するページのtsファイル（tab1.page.tsとか）にもimport

```
import { Camera, CameraOptions } from '@ionic-native/camera/ngx';

〜

constructor(
    private camera:Camera,
) {}

shootPhoto: string;

takePhoto(){
    const options:CameraOptions = {
      saveToPhotoAlbum:true,
      quality:100,
      destinationType:this.camera.DestinationType.DATA_URL, 
      encodingType:this.camera.EncodingType.JPEG,
      mediaType:this.camera.MediaType.PICTURE
    };

    this.camera.getPicture(options).then((imageData) =>{
      this.shootPhoto = 'data:image/jpeg;base64,' + imageData;
    });
  }
```

HTMLを修正（上のshootPhotoの値を取得して表示するように）

ionic4からはion-button (tap)は効かなくなったので、
ion-button (click)を使う

```
<ion-button (click)="takePhoto()">
     <ion-icon name="camera"></ion-icon>
     <div>Get Photo</div>
</ion-button>

<img src ="{{shootPhoto}}"/>
```

なお、カメラ機能なので、もちろんブラウザ上では動作しないため、実機ビルドが必要

#実機ビルド(Android)
今回はAndroidで

```
ionic cordova build android
```

成功すればplatforms/android が出来上がるので、これをAndroidStudioで開いてビルドし、実行する
（初回時は結構時間がかかったり、必要のない定義があってビルドエラーとなったりするが、必要に応じてエラーメッセージを見て対処する）

#感想
最初は慣れるのに時間がかかりますが、いい感じのアイコンが用意されていたり、
Angularの知識さえあれば容易にスマホアプリが作れるので、個人的には気に入った。

また、マニュアルも豊富で、StackOverFlowなどでもよく情報が落ちているので、詰まった時にも対処がしやすかった。
https://ionicframework.com/docs/v3/

なお、日本語の記事は少ないので、そこは少し困るかも
（日本語だとionic3,ionic4で１冊ずつくらいしか本がなかったような。。。）
Udemyで勉強してるだけで、AWSから高額請求がきた話

#背景

AWSを勉強でよく使ってました。AWSソリューションアーキテクトの資格が欲しかったので、[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け21時間完全コース）](https://www.udemy.com/aws-associate/)を見ながら、色々作っては壊してを繰り返してました。

動画の最後でもすぐ消すように言われるのでなるべく消してはいましたが、**AWSには1年間の無料枠があり、大体のサービスは少しくらい削除し忘れても何とかなります。**

そしてAWSの高額請求でよく聞くのは削除忘れではなく、**キーをパブリックに公開して大量の不正アクセスをもらうパターン**が多いです。

なので多少の削除忘れは大目に見ながら遊んでました。

そしてそれが、**高額請求**の幕開けだった…

#DAX(DynamoDB Accellerator)の削除し忘れ
DynamoDBを試しに作ってみた時、同時に**DAX(DynamoDB Accelerator)**も作っていました。

これはアプリ開発者がキャッシュのクリアを気にすることなく利用できるサービスです。

具体的には、**読み込み消費キャパシティの削減や読み込みスループット向上**が期待できるらしい。

まあDynamoDBの付属品だし、そんな高額ではないやろwwwと思い、すぐには消しませんでした。

ですがこれ、めっっっっっちゃ高いみたいです

たった1週間ほど放置した結果がこれです。

![aws-dax-money.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211530/441c0600-b583-9654-e34f-aa7731bdfdf7.png)


DAXが130ドルになってました。1$=110円と考えると約1万3000円です。つまり**1日2000円!?**

たまったもんじゃありませんねぇ…

ちなみにこの後、急いでDAXを消したら料金は上がらなくなりました。

まあこれは自分の責任なので、勉強代として1万3000円は仕方ないか…と思いましたが、貧乏人にとってはそれなりの額です。

ダメ元で、AWSに泣きついてみました。

![aws_message1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211530/60ba4a52-cd48-b22e-3d3f-8d0190d58cf3.png)


完全にクレーマーですね。でもこんなん、できれば払いたくないでしょ...

さすがに全額免除になるとは思っていませんでしたが、最初に強く出ておく分には損がないのでこれを送りました。

果たしてこんなメッセージに、AWSは反応してくれるのか!?

![aws_message2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211530/1ef301fc-ae1d-e3a5-b59d-0a1619aad0ca.png)

何と！返信を頂けました！そして…

![aws_message3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211530/7ec5f3bd-6d32-fcb6-65df-a5b7e1eb7218.png)

まさかの全額免除wwwwwありがとうごじゃいます、ありがとうごじゃます…；；

AWSの神対応に全米が泣きました。自己責任なのにホント申し訳ないです。

#まとめ
AWSは高額なサービスなので、ちょっとでも使い方を間違えるとものすごい料金を請求されることがるんだな〜と実感しました。。。

でもAmazonだって、そこまで鬼じゃないですね。間違えた使い方をしてしまった場合、ちゃんとサポートセンターに相談すれば然るべき対応をしてもらえることが分かりました。

もしAWSを使ってみたいけど、料金が怖い…と思ってる方がいたら、躊躇わずに使ってみて下さい！


実際に使うことで初めて学べる世界が、そこにはあるのです...
個人開発者のためのQuoraを作りたい！「AskMakers」を作りました

![ogimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/f6ce90cb-a77e-9edd-3e86-456bea09275d.png)
[Askmakers]（https://askmakers.co/）をProduct Huntにローンチしました。
https://www.producthunt.com/posts/askmakers

🔈ちなみにバンクーバーの時間で現在20:08、ありがたいことにUpvote数は90になりました！
みなさま本当に感謝！

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">🔈I finally launch <a href="https://twitter.com/hashtag/AskMakers?src=hash&amp;ref_src=twsrc%5Etfw">#AskMakers</a> on <a href="https://twitter.com/hashtag/ProductHunt?src=hash&amp;ref_src=twsrc%5Etfw">#ProductHunt</a> !<br>Please chack it out👍<br><br>AskMakers: The best place to ask experienced makers questions💡 <a href="https://t.co/VTppqPXLVu">https://t.co/VTppqPXLVu</a> via <a href="https://twitter.com/taishikat0?ref_src=twsrc%5Etfw">@taishikat0</a> <a href="https://t.co/NJ55d8Tnno">pic.twitter.com/NJ55d8Tnno</a></p>&mdash; Taishi🇨🇦🇯🇵 (@taishikat0) <a href="https://twitter.com/taishikat0/status/1173132169180565505?ref_src=twsrc%5Etfw">September 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

AskMakerは、経験あるメイカーたちに質問を投げられる、いわばIndie Maker(個人開発者)専用の質問箱です。

5月にバンクーバーに移住してから、ほぼ毎月新規プロダクトを作り続けて、要約何かを掴み始めたかな？と感じられるようになったのがAskMakersです。

# 🤔何ができるの？

## 特定開発者への質問投稿
<img width="910" alt="Screen Shot 2019-09-15 at 7.01.15 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/3071aa0a-0b42-9ad0-ce6e-8459d0a30f7f.png">

特定の開発者へ質問を投稿できます。

## 回答のブックマーク
<img width="748" alt="Screen Shot 2019-09-15 at 7.02.59 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/32087c95-4ada-cbc0-26e9-bfd47fe27944.png">

やはりこの機能は必須だなと思ってます。自分の知りたかったものを貯めて置ける場所にAskMakersをしたいので。

# 🛠Stack

* Nuxt.js
* Firebase Hosting
* Firestore
* Firebase storage
* mailgun
* Bulma

# 💫AskMakersの将来
一言でいうと、個人開発者のためのQuoraにしたいと思っています。

* 誰でも答えられる質問を投稿
* 回答にコメント
* 回答をupvote

できるようにしたいです。

# 💰3kRevenueChallenge

現在、アプリで月$3,000稼ごう！という3kRevenueChallengeをしています。
その過程をメールで配信しているのでぜひ購読してみてください！ペースは月一くらいですが…
[<img width="587" alt="mailchimp" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/6c855f73-a70d-d1af-c523-74be93fad8ec.png">](http://eepurl.com/gp5OuP)

# 🔗その他リンク
* https://www.producthunt.com/@taishi_kato
* https://twitter.com/taishikat0_Ja
* https://taishikato.com/
* https://wip.chat/@1491
VagrantでRailsの開発環境を作ったときに躓いたこと

#はじめに

vagrantを使い、躓いたことの個人メモです。

#共有フォルダ上でbundle installするとエラーになる

```:Vagrantfile
config.vm.synced_folder "./data", "/home/vagrant/data", create:"true"
```

こんなふうに共有フォルダを設定し、`bundle install --path vendor/bundle`を行うとnokogiriのインストールでエラーになりました。

以下のリンクを参考↓
[Vagrantで共有フォルダ設定したフォルダでbundle installがコケる](https://qiita.com/ichiren1/items/323f7951b45a4522d26a)

結果的にgemのインストール先を共有ファルダじゃないところに変更しました。
`/home/vagrant/.bundles`を作成しここにインストールします。

```
$ mkdir /home/vagrant/.bundles
$ bundle install --path /home/vagrant/.bundles/vendor/bundle
```

これでちゃんと`bundle install`が通ります。
bundle installのパスもちゃんと変更になっていました。なので次回以降は`bundle install`でちゃんと`/home/vagrant/.bundles/vendor/bundle`にインストールされます。

```rb:.bundle/config
---
BUNDLE_PATH: "/home/vagrant/.bundles/vendor/bundle"
```

#ソースコードが自動リロードされない

rails serverを立ち上げて、コントローラーの記述を変更するとコードが自動で反映されず、rails serverを再起動する必要がありました。

以下参照↓
[Rails5.1 サーバーのソースコード変更後の自動リロードの設定](http://takaya030.hatenablog.com/entry/2017/07/06/232205)

以下の設定を行うだけで問題が解決しました。

```rb:config/environments/development.rb
# コメントアウト↓
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# 追記↓
  config.file_watcher = ActiveSupport::FileUpdateChecker
```

# railsアプリの作成からrails s　まで

```
$ mkdir アプリ名
$ cd アプリ名
$ bundle init
$ bundle install --path vendor/bundle
$ bundle exec rails new . -d データベース
$ bundle exec rails db:create
$ bundle exec rails s -b 0.0.0.0 -d
```
Chart.jsの折れ線グラフで線をホバーするときにエラーになる場合の解決法

少し解決に時間がかかったので投稿。誰かの役に立てば幸いです。

## 現象

Chart.jsで作った折れ線グラフの線をホバーしてツールチップを表示させようとしたらJavaScriptのエラーになった。
※Chart.jsのバージョンは2.8.0です。

コンソールには以下のエラーが。

```
Chart.min.js:7 Uncaught TypeError: i is not a function
    at ni.render (Chart.min.js:7)
    at Object.callback (Chart.min.js:7)
    at Object.advance (Chart.min.js:7)
    at Object.startDigest (Chart.min.js:7)
    at Chart.min.js:7
```

`i` とはなんのこっちゃ？ミニファイされていないファイルに差し替えてみると

```
Chart.js:8866 Uncaught TypeError: easingFunction is not a function
    at Chart.render (Chart.js:8866)
    at Object.callback (Chart.js:1778)
    at Object.advance (Chart.js:2952)
    at Object.startDigest (Chart.js:2925)
    at Chart.js:2914
```

というエラー。

## 解決方法

[こちらのissue](https://github.com/chartjs/Chart.js/issues/1576#issuecomment-162213102) によると `options.animation` を`false` にしろとあるので、falseにしたところエラーにならずにツールチップが表示されるようになった。
アニメーション表示にこだわらなければこれでよし。
はじめてのパターン認識 8章　ソフトマージンSVM

# 注意
当記事は「はじめてのパターン認識」輪読会で担当した8章について備忘録です。
間違いや誤記があった場合は教えてくれると幸いです。

# 流れ
はじめてのパターン認識8章の以下三節について整理していく。
・ハードマージンSVM
・ソフトマージンSVM
・非線形特徴写像
→今回はソフトマージンSVM
→前回はハードマージンSVM(https://qiita.com/samsa/items/aa0686dba5ee0e9881eb)

線形分離不可能な分類問題への拡張
-----------
ハードマージンSVMは線形分離可能な場合に限って言えば、素晴らしい手法です。しかし、線形分離可能な場合というのは非常に整備された問題です。
世の中には線形分離不可能な場合に分類したいという問題の方が多いでしょう。また、どうやってその問題が線形分離可能か判定することも課題として生じます。
そこで次に線形分離不可能な場合に対しても、SVMが使えるよう、細工をします。

具体的には、ハードマージンSVMの誤分類無しの条件を緩和します。


ソフトマージンSVM　定義
-----------
![SVM-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/e6b2715e-80b3-97c8-201e-829cf9c72c79.png)
定義は凡そハードマージンSVMと変わりませんが、誤分類無しの条件にスラック変数というものを導入します。
スラック変数はデータがマージンや線形識別境界に対してどの位置にあるかを示す変数です。

スラック変数を導入することで誤分類無しの条件は次のように書き換えられます。
![SVM-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/535d3d90-4050-18b9-1bc7-4e70f4ffb232.png)

しかし、そもそもサポートベクトル(SV)は線形識別境界に最も近いデータ点だったが今回はどう決めるのか？
→スラック変数を導入することで、データ点の位置をSVの位置まで移動させると考えればよい


ソフトマージンSVM　最適化問題（主問題）
-----------
スラック変数を導入し、ソフトマージンSVMの最適化問題（主問題）は次のように書き換えらる。
また、そのままラグランジュ関数まで示す.
![SVM-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/39e188b9-6fee-3cf4-d7d0-207d1c16634a.png)

前回と同様にラグランジュ関数は展開しておく。
![SVM-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/7f843a6e-615e-2430-7b37-29bbf09021f8.png)


ソフトマージンSVM　最適化条件（KKT条件）
-----------
最適化条件（KKT条件）は以下の通り。
![SVM-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/707b237e-9137-41df-00c2-dcccd1cf0d0e.png)

KKT条件(1)～(3)は偏微分を行い、書き直すと
![SVM-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/cddd4933-b1e4-fdf8-2612-2813f0913b9b.png)

これらをラグランジュ関数に適用すると、
![SVM-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/480e16a6-5a6f-ed73-685e-07c9f4349e8f.png)
KKT条件(2)の適用によりバイアスbのかかる項は消える。
KKT条件(3)の適用により$C=\alpha+\mu$となり、後ろ2項はまとめられる→Cのかかる項が±存在するので消える。
途中でKKT条件(1)（$\boldsymbol{w}=\boldsymbol{w_{0}}$）を適用するため、等号ではなく右矢印で表現。

ソフトマージンSVM　双対問題
------------
双対問題を整理する過程はハードマージンSVMと変わらない。
![SVM-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/21086801-d5ad-e319-9ace-edecca22352d.png)
![SVM-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/8fe34d63-d902-0b21-9f22-6c231ce58078.png)
![SVM-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488577/48769d03-7188-7337-b727-7e2f0c96358a.png)


まとめ
------------
SVMは線形分離不可能な問題に対して拡張可能である。しかし、ハイパーパラメータCをどのように設定するかという問題が新たに出現した。
これは交差検証法やグリッドサーチを行うなどして決める必要がある。極端に大きくしてしまった場合は誤分類を許さないことになり、ハードマージンSVMと
同等になる。
CATSだけ使えればいい人向け Blender 2.79から2.8への移行

Blender2.8で、2.79から大幅刷新されありとあらゆる操作が変わったので
とりあえず、CATSだけ使えればいい人向けにまとめました
なんかわからないことがあればコメントに書いてください

##ユーザー設定どこ？
Editのメニューに移動しています
![preferences.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/7dbd05ec-e88c-98c6-5ac6-5234af10f5dd.png)

##CATSのタブどこ？
右上のすごく小さい＜のマークをクリック
![catstab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/f66a1908-35c4-5d59-d29a-f4b86fab78ee.png)

##Optimaization(最適化)のマテリアル結合でエラー
Blenderの言語設定を英語にする
くわしくは[こちら](https://qiita.com/izmktr/items/07ba87cea622c18e50a6)
React にGoogle Web Fontsを追加する方法

### 概要
一番最初に読み込まれるCSSファイルに`@import`文を書く

### 手順
1) create-react-appなら、index.cssを開く
2) Google Web Fontsの`@import`をコピペ  

```css
@import url('https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz&display=swap');
```

3) cssファイルで`font-family`を指定

```css
font-family: 'Yanone Kaffeesatz', sans-serif;
```

### 注意
- 一番最初に読み込まれるファイルにしないと、フォントがロードされない
- 開発端末以外でページを開くとフォントがロードされてないこともあるので、確認が必要
vue-routerのHistoryモード導入後、リロードした際のNot foundを解決する

Laravelでvue-routerを使うとき
画面遷移はうまくいくがページをリロードした際
<img width="1440" alt="スクリーンショット 2019-09-16 11.52.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/0d8b87ee-c7df-0cfd-b2ca-8521369cadb5.png">

このようにNot foundになってしまった。

これはhistoryモードの性質上起こるものなのですが
説明は割愛するので詳しく知りたい方は公式ドキュメントをどうぞ。

https://router.vuejs.org/ja/guide/essentials/history-mode.html#html5-history-%E3%83%A2%E3%83%BC%E3%83%89

#解決法
```:web.php
Route::get('/{path}', 'HomeController@index')->where( 'path', '([ A-z\d-\/_.]+)?' );
```

ルーティングを設定するweb.phpに上記のコードを追加
テキストボックスでファイルをドロップ選択可能にする。

テキストボックスの横に「参照」ボタンとかつくったり面倒なので
1行でファイルのドロップ選択できるテキストボックスを作るやつ用意しました。

作るやつ

```VB:BenriGoods.vb
Public Class BenriGoods
    Public Shared Sub SetFileDropTextBox(ByRef tbx As TextBox)
        Try
            tbx.AllowDrop = True
            'ファイルが一つであればファイルパスを読み込み対象テキストへ反映
            AddHandler tbx.DragDrop, New DragEventHandler(
                Sub(sender As Object, e As DragEventArgs)
                    Dim fileName As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
                    If fileName.Length = 1 Then
                        CType(sender, TextBox).Text = fileName(0)
                    End If
                End Sub)

            'ファイルが一つであればカーソル色変更（複数ファイルは無視）
            AddHandler tbx.DragEnter, New DragEventHandler(
                Sub(sender As Object, e As DragEventArgs)
                    Dim fileName As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
                    If fileName.Length = 1 Then
                        e.Effect = DragDropEffects.Copy
                    End If
                End Sub)
        Catch ex As Exception
        End Try
    End Sub
End Class
```

使い方

```VB:FormUNKO.vb
BenriGoods.SetFileDropTextBox(textboxUnko) 'テキストボックスを引数に与える
```
CocoaPodsからCarthageに移行する

# はじめに
この記事は、CocoaPodsからCarthageに移行したい人向けの記事です。
ビルドツールが何もない状態からCarthageを利用する方法は、調べればすぐに出てきます。しかし、CocoaPodsからCarthageに移行する方法は見つからなかったので、ここにまとめます。

# 前提

利用ライブラリ：RealmSwift, Alamofire
Xcodeプロジェクト名：NaniTaberu

# XcodeプロジェクトからCocoaPodsを削除する

[プロジェクトからCocoaPodsを完全削除](https://blog.yukim.xyz/post/2015-09-18-how-to-uninstall-cocoapods/#CocoaPods-2)を参考にXcodeプロジェクトからCocoaPodsを削除します。具体的には次の通りです。

1. Xcodeプロジェクトのフォルダから、以下のファイル・フォルダを削除する。
 - Podfile
 - Podfile.lock
 - NaniTaberu.xcworkspace
 - Pods
2. NaniTaberu.xcodeprojを開き、Project NavigatorでPodsフォルダとFrameworks/Pods_*.frameworkを削除する

<img width="294" alt="スクリーンショット 2019-09-16 11.10.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94278/de2d42bf-cad8-4e6d-9f74-ce89844ccba8.png">
3. Project Navigatorで、NaniTaberu>TARGETS:NaniTaberu>BuildPhasesで、CocoaPods関連の以下のRunScriptを削除する。
 - [CP] Check Pods Manifest.lock
 - [CP] Embed Pods Frameworks
<img width="1064" alt="スクリーンショット 2019-09-16 11.14.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94278/f1fc62f0-1620-122b-72c7-97f4d297cb01.png">




# Carthageをインストールする
ここからは、[Carthageを使ってビルド時間を短縮しよう](https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)を参考に、Carthageをインストールし、設定していきます。

1.HomebrewでCarthageをinstallします。

   ```
  $ brew install carthage
  ```

2.Cartfileを作成します。

```
$ cd ~/work/NaniTaberu # Xcodeプロジェクトのフォルダに移動
$ vi Cartfile
```

3.以下の内容を記載して保存します。

```
github "Alamofire/Alamofire"
github "realm/realm-cocoa"
```

4.ライブラリをビルドします。（iOS用なので、platformオプションを指定しています。)

```
carthage update --platform iOS
```


5.NaniTaberu.xcodeprojを開き、Project Navigator「NaniTaberu」> TARGETS「NaniTaberu」>General>Linked Framework and Library > "+" > Add otherをクリックし、NaniTaberu/Carthage/Build/iOS/から、以下を選択します。
- Realm.framework
- RealmSwift.framework
- Alamofire.framework

<img width="723" alt="スクリーンショット 2019-09-16 11.31.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94278/be4cf99a-5a62-d5e1-7129-d08f5d1c4b69.png">


6.Project Navigator「NaniTaberu」> TARGETS「NaniTaberu」> Build Phases>"+">New Run Script PhaseでRun Script Phaseを作成します。

7.作成したRun Script Phaseに以下のように設定します。

シェルスクリプト：

```
/usr/local/bin/carthage copy-frameworks

```

InputFiles:

```
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework
```

<img width="1063" alt="スクリーンショット 2019-09-16 11.33.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94278/d7959a8f-9564-0fc0-42f2-bebada11ac96.png">


以上

# 参考資料
- [CocoaPodsのアンインストール方法](https://blog.yukim.xyz/post/2015-09-18-how-to-uninstall-cocoapods/#CocoaPods-2)
- [Carthageを使ってビルド時間を短縮しよう](https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)
【GoogleChrome】ユーザデータディレクトリを使ったマルチプロファイル設定

## どんな時使うのか？
同じURLに異なるユーザでログインする時に使います。
わたしは複数のアカウントでAWSコンソールにログインする際に使用していて、とても重宝しています。

## 設定方法
#### ショートカットの作成
まずはログイン対象URLのショートカットを作成します。
下記手順で作成可能です。

1.ログイン対象ページを表示する
2.アドレスバーをクリックし、URLを選択する
3.そのままデスクトップにドラッグ&ペーストする

#### リンク先の編集
次に作成したショートカットのプロパティを開き、「リンク先」の欄を下記のように編集します。

```
実行ファイルのパス -—user -data -dir=”ディレクトリパス” ショートカット先URL
```

するとショートカット初回実行時に自動でディレクトリが生成され、デフォルトとは別のプロファイルでChromeを起動できます。

キャッシュディレクトリも分けられるので、ユーザごとにパスワードも保存でき、ログインが簡単になります。
（※パスワード保存の使用を禁止している現場もあるので、使用の際は注意が必要です。）

以上
【JSP】情報収集

#参考サイト
######Thymeleafがメインだったので復習のため情報収集

[Tomcatを使う「JSPプログラミング」連載記事一覧]
(https://www.atmarkit.co.jp/ait/series/2523/)
- [JSPの特徴を理解する](https://www.atmarkit.co.jp/ait/articles/0105/11/news003.html)
- [JSPの実行環境を整える](https://www.atmarkit.co.jp/ait/articles/0105/30/news002.html)
- [JSPプログラミングの基本を覚える](https://www.atmarkit.co.jp/ait/articles/0106/14/news002.html)
- [Webプログラミングの前提知識をおさえる](https://www.atmarkit.co.jp/ait/articles/0107/10/news004.html)
- [インクルードによるコードの再利用で効率化をはかる](https://www.atmarkit.co.jp/ait/articles/0107/31/news001.html)
- [クラスやBeanの作成とJSPとの連携](https://www.atmarkit.co.jp/ait/articles/0108/08/news001.html)
- [JSPでセッションを扱うための基礎知識](https://www.atmarkit.co.jp/ait/articles/0108/29/news002.html)
- [JSPプログラムでクッキーを扱う](https://www.atmarkit.co.jp/ait/articles/0109/19/news002.html)
- [JSPから別のファイルにアクセスする](https://www.atmarkit.co.jp/ait/articles/0110/13/news001.html)
- [データベースと連携する](https://www.atmarkit.co.jp/ait/articles/0111/02/news003.html)
- [データベースを活用したアプリケーション](https://www.atmarkit.co.jp/ait/articles/0111/09/news002.html)
※いずれも20年近く前の記事なので注意。
スマホでlocalhostの画面を確認

1) この手順に従う

https://qiita.com/sssssumito/items/bebd5e750c8194b30c9e#pc%E5%81%B4%E4%BD%9C%E6%A5%AD

2) Inspect with.. のタブでPort forwardingボタンをクリック
localhost:3000なら、

- port 3000
- IP address and port localhost:3000

を指定

3) enable portfowardingにチェック

4) Done!
ポートフォワーディングアクセス

主に直接アクセスできないようになっているデータベースにアクセスするため、ポートフォワーディングを使用することがありますが、どうも毎回調べちゃう＆調べるたびにちょうどピッタリな記事がなかなかないので、備忘用にまとめました。

## まず接続

以下、シェルスクリプト(bash)です。
Amazon EC2からRDS(MySQL)に接続する例ですが、それ以外でも使えます。`***` で一部マスキングしています。

```bash:db_connect.sh
DB_HOST=***.rds.amazonaws.com
LOCAL_PORT=13306

SECRET_KEY=***.pem
SSH_USER=ec2-user
SSH_HOST=***.***.***.***
DEST_PORT=3306
DB_USER=***
DB_NAME=***

CONNECT=`lsof -i -n -P | grep $LOCAL_PORT | wc -l`
if [ $CONNECT -gt 0 ] ; then
    :
else
    ssh -f -N -L $LOCAL_PORT:$DB_HOST:$DEST_PORT -i $SECRET_KEY $SSH_USER@$SSH_HOST
fi

mysql -u $DB_USER -D $DB_NAME -h 127.0.0.1 -P $LOCAL_PORT -p
```

上記を実行すると、上記の例ではローカルの13306番ポートがリモートのMySQLポートに接続します。（パスワード入力を求められます）

## ちょっと修正
MySQL接続まで行く→使用後抜ける→もう一度使う→コネクションが増える→なので、既存の接続がある場合には新たに張らないようにしました。

## 使用後の切断

```bash
$ ps aux | grep " [s]sh"
takepan          66732   (途中略) ssh -f -N -L (以下略)
```

上記例ではPID 66732がプロセスなので、killします。

```bash
$ kill 66732
```

実行後は、もう一度`grep`したり、`telnet`したりすると良いかもしれません。

#### 参考
下記を参考にさせていただきました。 :bow: 
[踏み台の向こうにあるMySQLサーバに一発アクセスする](https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4)
【Python】優先度付きキューの使い方【heapq】【ABC141 D】

# はじめに
今回はPythonの優先度付きキューについてまとめます。
AtCoderのPython3.4.3と3.8で動作確認済みです。

# 優先度付きキューについて
優先度付きキュー (Priority queue) はデータ型の一つで、具体的には

* **最小値（最大値）を $O(\log{N})$で取り出す**
* **要素を $O(\log{N})$ で挿入する**

ことが出来ます。通常のリストだとそれぞれ $O(N)$ ですので高速です。
「リストの要素の挿入」と「最小値（最大値）を取り出す」ことを繰り返すような時に使います。


# Pythonでの使い方
Pythonでは優先度付きキューは **heapq** として標準ライブラリに用意されています。使いたいときはimportしましょう。

## 各メソッドについて
頻繁に使うメソッドは3つです。

* `heapq.heapify(リスト)`でリストを優先度付きキューに変換。
* `heapq.heappop(優先度付きキュー (=リスト) )`で優先度付きキューから最小値を取り出す。
* `heapq.heappush(優先度付きキュー (=リスト) , 挿入したい要素)`で優先度付きキューに要素を挿入。

※ Pythonではheap化されたリストのクラスもリストであるためこのような書き方をしています。↓参考

```python
import heapq
a = [1, 6, 8, 0, -1]
print(type(a))  # <class 'list'>

heapq.heapify(a)
print(type(a))  # <class 'list'>
```

では、各メソッドの使い方について見ていきましょう。


```python
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
heapq.heapify(a)  # リストを優先度付きキューへ
print(a)
# 出力: [-1, 0, 8, 1, 6] (優先度付きキューとなった a)

print(heapq.heappop(a))  # 最小値の取り出し
# 出力: -1 (a の最小値)
print(a)
# 出力: [0, 1, 8, 6] (最小値を取り出した後の a)

heapq.heappush(a, -2)  # 要素の挿入
print(a)
# 出力: [-2, 0, 1, 8, 6]  (-2 を挿入後の a)
```

なお、もちろんリストのheap化は行わなくても`heappop()`と`heappush()`は使用できます。しかし`heappop()`ではリストの先頭の要素が取り出される仕様になっているため、初回の`heappop()`を行う際は気をつけましょう。最初のリストが空のリスト`[]`であるような場合には`heapify`を行う必要がないので以下の通りで問題ありません。

```python
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
# heapq.heapify(a)

print(heapq.heappop(a))  # 先頭の要素 (1) が取り出される！！！！
print(a)  # [-1, 6, 8, 0]

heapq.heappush(a, -2)  # 要素の挿入
print(a)  # [-2, -1, 8, 0, 6]

print(heapq.heappop(a))  # 最小値の取り出し
print(a) # [-1, 0, 8, 6]
```

## 最大値の取り出し
heapqでは最小値しか取り出すことが出来ません。では最大値の時はどうするかというと、各要素に-1をかけた上で最小値を取り出していきます。以下のコードでは`map`関数で各要素を-1倍していますが、実際に問題を解く際には入力時に-1した方が高速です。

```python
import heapq
a = [1, 6, 8, 0, -1]
a = list(map(lambda x: x*(-1), a))  # 各要素を-1倍
print(a)

heapq.heapify(a)
print(heapq.heappop(a)*(-1))  # 最大値の取り出し
print(a)
```

```python:出力
[-8, -6, -1, 0, 1]
8
[-6, 0, -1, 1]
```

# 例題 (ABC141 D)
[AtCoder Beginners Contest 141 D問題 Powerful Discount Tickets](https://atcoder.jp/contests/abc141/tasks/abc141_d)
この問題は  **最大値を1/2することをM回繰り返す** だけでよいのですが、通常のリストを使うと、最大値の選定に $O(N)$ 、それをM回のため計算量が $O(NM)$ で間に合いません。
そこでheapqの出番です。heapqでは最大値の選定に $O(\log{N})$ 、それをM回のため計算量が $O(M \log {N})$ となり間に合います。以下が実装です。

```python:ABC141D.py
import heapq

n, m = map(int, input().split())
a = list(map(lambda x: int(x)*(-1), input().split()))
heapq.heapify(a)  # aを優先度付きキューに

for _ in range(m):
    tmp_min = heapq.heappop(a)
    heapq.heappush(a, (-1)*(-tmp_min//2))  # 負数の剰余演算を避けるため一時的に0以上の整数にしています
print(-sum(a))
```


# おわりに
読んでいただきありがとうございました。指摘等ありましたら是非コメントお願いします。
Linux基礎(ハードディスクのレイアウト設計)

#Linuxインストールに必要なパーティション
ハードディスクはパーティションという区画に分割して利用することができる。Linuxをインストールするためには、少なくとも次の2つのパーティションが必要になる。

##最低限必要なパーティション

- <b>ルートファイルシステムに割り当てるルートパーティション</b>
- <b>スワップ領域</b>

実際には、さらにいくつかのパーティションに分割して利用することが以下の理由で推奨されている。

- 柔軟なシステム管理を行うことができる
- ディスクに障害が発生した時の被害を抑えることができる
- 障害発生時にスムーズな復旧作業ができる

##主要なディレクトリ群
以下のディレクトリ群は、独立したパーティションに割り当てるのが一般的。

|ディレクトリ群|説明|
|---|---|
|/home|一般ユーザーがそれぞれ利用するファイルが格納されている。ファイルサーバーなど、多数のユーザーが利用するシステムの場合は、とりわけ専用のパーティションに分割する必要がある。/homeを別パーティションにて管理する事で、ディストリビューションを変更したり、再インストールする際、環境を引き継ぐ事ができるため便利となる。|
|/var|各種ログファイルやメールスプールなど更新頻度の高いファイルが格納される。ログが大量に生成されログファイルが肥大化するとファイルシステムの容量を超えてしまう恐れがある。ルートファイルに/varがあると、ログがルートシステムに溢れてしまい、システム全体に影響を与えてしまう。/varを別パーティションにすることによって、被害を最小限にすることができる。|
|/usr|プログラムやライブラリ、ドキュメントが置かれている。後からプログラムを追加することがなければ、運用中に容量が増えることは基本的にない。NFSを使ってコマンドやプログラムを共有する場合には、/usrを読み込み専用でマウントしておくことによりセキュリティを高めることができる。|
|/boot|システムによってはディスクの先頭パーティションとして数100MB程度を/bootパーティションに割り当てた方が良い場合がある。例えば、RAIDを利用する場合、内蔵ハードディスク内に/bootパーティションが必要とされることもある。|
|スワップ領域|スワップ領域は仮想メモリ領域として利用される。仮想メモリとは、物理メモリが不足した場合に、ディスクの一部を一時的にメモリの延長として使うことができる機能。スワップ領域のサイズの目安は、搭載されている物理メモリの1〜2倍。つまり、物理メモリを1GB搭載している場合は、スワップ領域を1GB程度確保する。|
|/|上記以外は、ルートファイルシステムになる。ルートファイルシステムは、ファイルシステムに障害が発生した時の復旧を容易にするため、できるだけ小さくした方が良い。|

#パーティションのレイアウト設計
ディスクのパーティションレイアウトを設計する場合、次の点を考慮する必要がある。

- <b>システムの用途</b>
- <b>ディスクの容量</b>
- <b>バックアップ方法</b>

##レイアウト例
###20GBのハードディスクと512MBのメモリを搭載している場合

- スワップ｜512MG(物理メモリと同程度にする)
- /(ルート)｜19GB

###200GBのディスクと1GBのメモリを搭載し、ユーザー100人が利用するファイルサーバーを構築する場合(/home配下)

- スワップ｜1GB
- /boot｜100MB
- /usr｜10GB
- /var｜10GB
- /(ルート)｜1GB
- /home｜約180GB


###Webサーバーを構築する場合(ディスク：100GB, メモリ：4GB, Webサーバー：Apache)

- スワップ｜1GB
- /boot｜100MB
- /usr｜10GB
- /var｜20GB
- /var/log｜50GB(Apacheのログファイルが容量を必要とするため)
- /(ルート)｜15GB

##論理ボリューム
最近では、LVM(Logical Volume Management)を使った柔軟なディスク管理が行われている。
LVMは、パーティション場にそのままファイルシステムを作成するのではなく、ボリュームグループという仮想ディスクを作成し、その上に仮想的なパーティションを作成する仕組み。LVMを利用すると、ディスクの取り扱いや、バックアップなどをより柔軟に実施することができる。

![スクリーンショット 2019-09-16 10.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/127553f4-add8-e5bd-281d-c0ccc001e763.png)
VPC内におけるアドレス解決（ARP）を確認してみた（キャプチャ付き）

# VPCのおさらい

- VPCは[ブロードキャストをサポートしていない](https://aws.amazon.com/jp/vpc/faqs/)
- アドレス解決は[Mapping Service](http://txens.io/index.php/2016/12/16/a-deep-dive-into-the-aws-network/)で実施されている

# 実機で確認してみた

## 構成
- VPCにEC2インスタンス×2
- ARPキャッシュが無い状態でICMP Echo/Reply

# 結果

- クライアントはリクエスト時にARP解決を試みる
- 通常通りARP応答が来たようにみえるが、これはVPCのMapping Serviceから返答される（したがってサーバにはARPリクエストは届いていない）
- サーバはICMP Echoパケットを受信し、その返答のためにARP解決を試みる（これも上記同様Mapping Serviceを介して解決される）

## イメージ図
![mapping service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/bd9be254-200d-62df-e73e-c891d2421514.png)

## パケットキャプチャ

上記「結果」の通りのシーケンスとなっている（割ときれいに取れた）。

### クライアント
![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/32ab2415-a9d4-6e2a-8869-17b5a37033f7.png)

### サーバ
![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/7edd5ba4-5cd8-d445-da38-bc38bedb6e8b.png)
Unityゲームエフェクトマスターガイドを読んで

#しぇーだーぐらふ　なるものを使ってみたいぜ　というときの必要な準備

- プロジェクト作成時に、通常のプロジェクトを作成していた場合

    1. パッケージマネージャを起動して、

        2. ライトウェイトと　シェーダーグラフを　インストールする

        3. ライトウェイトレンダーパイプラインのアセットを作成する

    4. プロジェクトセッティングの画面で、

        5. ライトウェイトレンダーパイプラインのアセットを登録する


- その後、実際にシェーダーグラフを使うには

    1. プロジェクトウィンドウで、

        2. シェーダーのアンリットグラフを作成する
        3. おーぷんしぇーだーえでぃたー　のボタン押下でシェーダーグラフ登場

#普段使えそうなもの
Chapter1 エフェクトの概要

- UnityのUIの補足

Chapter2 パーティクルエディタの概要

- パーティクルいじるイロハ

Chapter3 各モジュールの働き

- パーティクルであそぶイロハ

Chapter4 基本的なエフェクトの作成

- パーティクルであそぶ実践編

Chapter5

- 5-4でシェーダーグラフの使い方でている

Chapter9 テクスチャの制作

- Substane Designerを使う

#普段むずそうなもの
Chapter5 バリアエフェクトの作成

- むずい　外部ツールあり

Chapter6 闇の柱エフェクトの作成

- むずい　外部ツールあり

Chapter7 ビームエフェクトの作成

- むずい　外部ツールあり

Chapter8 斬撃エフェクトの作成

- むずい　外部ツールあり

#所感
Adobe系できるの前提が最近増えてきている。
なんらかのタイミングで、できるようになりたいが、秒でできるようにならないものか。。。
Cordova の InAppBrowser の呼出先プログラムの結果を呼出元プログラムで取得してみた

# はじめに

Google Apps Script で作成したプログラムを、他のユーザに配付することができました。

[Google Apps Scripit で書いたプログラムを配付できるようにしてみた - Qiita] (https://qiita.com/tinymouse/items/352aa8582b6c2ef1ddf0)

このプログラムを、Cordova を利用して作ったアプリから呼出したいと思いました。

# InAppBrowser でプログラムを呼出する

## InAppBrowser を使えるようにする

[PhoneGap/Cordova で InAppBrowser を使う - Qiita]
(https://qiita.com/tsunet111/items/5bad52c6344fc33c73a0)

## 呼出するプログラムを用意する

呼出されるプログラムは、HTML と JavaScript で書かれた、いわゆるウェブアプリです。

```child.html
<html>
    <head>
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    </head>
    <body>
        <button id="ok"></button>
        <button id="ng"></button>
    </body>
    <script type="text/javascript" src="js/child.js"></script>
</html>
```
```child.js
var result = "N/A";
document.querySelector('#ok').addEventListener('click', function(){ result = "OK"; });
document.querySelector('#ng').addEventListener('click', function(){ result = "NG"; });
```

## InAppBrowser でプログラムを呼出する

呼出したい HTML ファイルを、`InAppBrowser` オブジェクトの `open` メソッドを使って開きます。

```index.js
var win = cordova.InAppBrowser.open('./child.html', '_blank', 'location=yes');        
```

# 呼出先プログラムの結果を呼出元プログラムで取得する

呼出先プログラム（上記の `child.js`）の結果（例えば、変数 `result` の値）を、呼出元プログラム（上記の `index.js`）で取得するには、どうしたらいいでしょうか。

`InAppBrowser` オブジェクトのリファレンスを見ても、できそうなプロパティやメソッドは見つかりません。

## 呼出先プログラムを呼出元プログラムから操作する

かろうじて `executeScript` メソッドを使って、呼出先プログラムを呼出元プログラムから操作できそうです。

```index.js
    win.executeScript({
        code: "(function(){ return result; })();"
    },
    function(values) {
        if (values) {
            result = values[0];
        }
    });
```

`code` に指定したプログラムに返値があれば、`executeScript` メソッドのコールバック関数で受取できるようです。

## 呼出先プログラムが終了するときに実行する

上記のコードを、呼出元プログラムが終了するときに、実行すればいいでしょうか。

```index.js
win.addEventListener('exit', function() {
    // 上記のコード
});
```

残念ながら、これは上手く行きません。
`exit` イベントのタイミングでは、呼出先プログラムは既に破棄されているようです。実行しようとしたコードはエラーになっているようですが、`executeScript` メソッドはエラーにならないし、コールバック関数も実行されません。

## 呼出先プログラムの結果を呼出元プログラムで取得する

結局のところ、次のようにするしかないようです。

```index.js
var result = null;
var loop = null;
win.addEventListener('loadstop', function() {    // 呼出先プログラムが開始したとき
    loop = setInterval(function() {
        win.executeScript({
            code: "(function(){ return result; })();"
        },
        function(values) {
            if (values) {
                result = values[0];
            }
        });
    }, 1000);    // 1 秒ごとに値を取得し続ける
});
win.addEventListener('exit', function() {    // 呼出先プログラムが終了したとき
    clearInterval(loop);    // 値の取得を停止する
    console.log(result);    // 最終的に取得できた値
});
```
初心者がAtCoderに初挑戦して惨敗した話

## AtCoderを初受験した
### 受験した経緯
> 高橋直大 様
> AtCoder（競技プログラミング）の色・ランクと実力評価、問題例
> http://chokudai.hatenablog.com/entry/2019/02/11/155904

の記事を読んでAtCoder、競技プログラミングの世界を知り挑戦してみたいと思いました。
### 受験までの取り組み
2019/9/15の朝にAtCoderの存在を知り、その夜にAtCoderに初挑戦しました！
当日の取り組みとしては、過去問であるABC140を回答し、ABCは完答、D問の途中で時間切れとなりました。
このときはまだ手応えを感じていました…。
## 実際に受験した
ABC141を実際に受験しました。
https://atcoder.jp/contests/abc141
A問、B問は問題なく解答できました。
ただC問で大きくつまずきました。

### C問
> https://atcoder.jp/contests/abc141/tasks/abc141_c
> 実行時間制限: 2 sec / メモリ制限: 1024 MB
> 問題文
> 高橋君は早押しクイズの大会を開くことにしました。スコアボードの作成を任されたキザハシ君は、次のルールを持つ> ラウンドのポイントを管理するプログラムを書くのに苦戦しています。
> このラウンドの参加者はN人であり、1からNまでの番号がついています。
> ラウンド開始時点では全員がKポイントを持っています。
> 誰かが問題に正解すると、その人以外のN−1人のポイントが1減ります。これ以外によるポイントの変動はありません。
> ラウンド終了時にポイントが0以下の参加者は敗退し、残りの参加者が勝ち抜けます。
> このラウンドではQ回の正解が出て、i番目に正解したのは参加者Aiでした。
> キザハシ君の代わりに、N人の参加者のそれぞれが勝ち抜けたか敗退したかを求めるプログラムを作成してください。
> 制約
> 入力はすべて整数
> 2≤N≤10^5
> 1≤K≤10^9
> 1≤Q≤10^5
> 1≤Ai≤N(1≤i≤Q)

### 問題に対するアプローチ
問題文を素直に解釈してQ-K回以上正解していれば勝ち残ることができると考えました。
![DSC_0195.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497069/ed5c2c7a-fabb-2b68-08f2-93078f5d3dbb.jpeg "メモ書き")
（これはテスト中のメモ書き）

### 提出したコード
```ruby
/入力を受け付ける/
n, k, q = gets.to_s.split.map(&:to_i)
a = []
q.times do
  a << gets.to_i
end
/putsの処理を一回にまとめれば軽くなる…？悪あがき/
putting = []
if k > q
  n.times do
    putting << "Yes\n"
  end
elsif
/ここが元凶 10,000回×10,000回で計1億回の処理が行われている/
  n.times.with_index do |i|
/countで解答者配列aに含まれているプレイヤーの登場数を計算/
    if a.count(i+1) > q - k
      putting << "Yes\n"
    else
      putting << "No\n"
    end
  end
end
 
puts putting
```
### 結果
解答自体は通ったようです。
ただTLE、実行時間制限超過で不正解になりました。
AtCoderは2秒以内での処理を制限として設けられているため、先程のような1億回の処理が発生するコードは解答として認められていません。
[![Image from Gyazo](https://i.gyazo.com/d094828ca415b337a43ee9efb0c70ce9.png)](https://gyazo.com/d094828ca415b337a43ee9efb0c70ce9)
なんとか処理速度を改善しようと、countメソッドの処理回数を減らしたり、indexメソッドを利用したりしました。
またJavaでの書き換えに挑戦してみるなど（複数行の標準入力がわからず断念）を行いました。
ただし大幅な速度改善には至りませんでした、1億回の処理回数からしたら上記の改善は些細なものだったようです。

## テスト後の取り組み
> AtCoder ABC141解説　PDF
> https://img.atcoder.jp/abc141/editorial.pdf

こちらの公式解説ドキュメントを参考にさせていただき再度自分でのコーディングを行いました。
### 改善したコード

```ruby
n, k, q = gets.to_s.split.map(&:to_i)
score = []
/すべてのプレイヤーのスコアをK-Qと設定する/
n.times do
  score << k - q
end
/解答者の入力を受け付けながら、解答者の点数を＋1とする/
q.times do
  score[gets.to_i - 1] += 1
end
/スコアが0点を超える場合、勝ち抜きとなる/
score.each do |s|
  puts s > 0 ? "Yes" : "No"
end
```
処理回数は最大3万回まで落ち着きました。
その結果、100msで処理を終えることができました。
## 今後の目標
初挑戦のAtCoderで不甲斐ない結果(300点)となってしまい非常に悔しい思いをしています。
今回の敗因は、一つの解き方にこだわってしまい、プログラム上の悪あがきで処理速度を改善しようとしたことです。
時間は多くあったため、解き方自体を変更し、N^2的解答からNの解答へのアルゴリズムの変更が必要でした。
今後も過去問等にあたり、ABCDまでは解答できるようなコーダーになりたいと思っています。
そして水色コーダーを目指したいと思います！
LolipopマネージドクラウドへSSHで接続し、Laravel資産のデプロイ方法

#LolipopマネクラへLaravelで作った資産をデプロイするまで
##前提条件・記載内容
* Web開発始めた初心者です。
* 躓いた点として、秘密鍵を利用してSSH接続しようとしたときに秘密鍵のファイルの権限の設定周りでエラーになり、それを解決するのに時間がかかりました。
* この記事ではLolipopマネクラへの接続方法を中心に記載しており、Laravelの展開については、他の方の記事を参考にしましたので、参考リンクを載せています。
* MacOSです。

#Lolipopマネクラへプロジェクト作成からSSH接続
* Lolipopマネージドクラウドでプロジェクトを作成
    * 新しいプロジェクトでphpを選択する（ひとまず最新のPHPのバージョン）
    * プロジェクトURLは適当（自動生成）
* sshを使って作成したサーバに接続するための設定
    * ダッシュボードの中にあるSSH/SFTPの設定のSSH公開鍵の追加のリンクをクリックする
    * ワンクリック登録で鍵を新規作成して登録するをする
    * 自動的にサーバ側に公開鍵が登録され、PCに秘密鍵がダウンロードされる。
    * この秘密鍵は大事に保管
    * ダウンロードした秘密鍵ファイルを~/.sshにコピーする。
        * このディレクトリがない時は、$ install -m 0700 -d ~/.sshを流してディレクトリを作成する
    * 600の権限がないと、コマンド打ったときにエラーになるので、次のコマンドを実行
        * $ chmod 600 ~/.ssh/秘密鍵.txt（ファイル名は変えてね）
    * 実際に接続するときのコマンドは以下の通り
        * $ ssh ユーザー名@ホスト名 -i ~/.ssh/秘密鍵.txt -p ポート番号
        * このユーザー名、ホスト名、ポート番号はマネクラのプロジェクトページに書いてるやつ。
            * うまく行かないときは秘密鍵までのパスをフルパスにする
          
#Laravelをマネクラへデプロイする方法
* 以下の記事を参考にしました。
* Markdown: [Laravelをマネクラへデプロイする方法](https://qiita.com/take2isk/items/85fe3b6cb747243fd4ff)


#マネクラのMySQLへクライアントツールを使って接続する方法
* マネクラの公式サイトに接続方法が記載されています。
* Markdown: [マネクラ公式サイトリンク](https://support.mc.lolipop.jp/hc/ja/articles/360021532274-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B-MySQL-WorkBench%E3%81%AE%E5%A0%B4%E5%90%88-)
VisualforceでOutputTextをうまく使う

#JavaのMessageFormatと同じ構文が使える

outputTextではDateや数値をうまく整形して想定通りの表示に切り替えることができます。

```ruby:sample.vfp
<apex:pageBlockTable value="{!contactList}" var="con">
 <apex:column headerValue="CreatedDate" >
   <apex:outputText value="{!con.CreatedDate}"/>
 </apex:column>
</apex:pageBlockTable>
```

例えば上記のように作成日を表示させることがあったとして、SOQLから帰ってきた値をそのまま表示させると
このような表示になります。

<img width="712" alt="スクリーンショット 2019-09-16 10.31.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/4c2f0a87-0a9c-e23a-c9f5-8ee169bca395.png">

まあ、見れないことはないけど馴染みがないですよね。
その場合は下記のようにoutputText内でformat化することができます。

```ruby:sample.vfp
<apex:outputText value="{0,date,yyyy/MM/dd}">
 <apex:param value="{!con.CreatedDate}"/>
</apex:outputText>
```

こうすると下記のようにformatされた表示に変更されます。

<img width="712" alt="スクリーンショット 2019-09-16 10.40.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/1f644dc4-ee37-764e-a3d2-071f3b107c4d.png">

outputTextを下記のように変更すれば

```ruby:sample.vfp
0,date,yyyy/MM/dd　G 'at' HH:mm:ss z
```

<img width="525" alt="スクリーンショット 2019-09-16 10.48.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/a00a4d0f-b112-0f89-7f77-9acc4c6e8ede.png">

こんなことも可能です。

うまく活用していきましょう。

#参考
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_outputText.htm
Ethereum トランザクションの送信方法sendとsendAsyncの違い

# 記事の内容
EthereumのJavaライブラリ「Web3j」を使って署名付きトランザクションを送信する方法でsendメソッドとsendAsyncメソッドがあります。
この記事でsendを使ったトランザクションの送信方法を記載しましたが、sendAsyncを使った方法も実装してみたので記録として残します。
[Web3jを使って署名付きトランザクションを送信する](https://qiita.com/bc_yuuuuuki/items/3840a42fd5167ed929df)

# 環境
- geth:1.9.0-stable
- web3j:4.5.0

#実装

コードです。

``` SendTransaction.java
 public TransactionReceipt sendTransactionAsync(Credentials credentials, String password, String toAddress, long value) {

    CompletableFuture<TransactionReceipt> receipt = null;
      try {
        // トランザクションの生成
        // "personal_unlockAccount"のリクエストを送信し、レスポンスを受信する
        PersonalUnlockAccount unlockAccountResponse = web3j.personalUnlockAccount(
              credentials.getAddress(), // アドレス
              password  // パスワード
              ).send();

        // アンロックが成功していたら、Etherを送金する
        if (unlockAccountResponse.getResult()) {
          // Transactionを送信する。
          receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).sendAsync();
        }

          return receipt.get();
        }catch(IOException | TransactionException ex) {
          ex.printStackTrace();
        }catch(Exception ex) {
          ex.printStackTrace();
        }
      return null;
    }
```

違いとしては以下の部分になります。

``` SendTransaction.java
receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).send();
```

``` SendTransaction.java
receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).sendAsync();
```

sendの方はトランザクションがブロックに取り込まれるまで応答が返ってきません。
sendAsyncの方はトランザクションが送信された時点で応答が返ってくるため、ブロックに取り込まれるのを待つ必要がありません。

ただし、sendAsyncの実行結果として得られる「CompletableFuture<TransactionReceipt>」のgetメソッドを使用し、TransactionReceiptを取得する際はブロックに取り込まれるまで応答が返ってきません。

トランザクションがブロックに取り込まれるのを待つ必要がない場面ではsendAsyncを使うほうが良さそうです。
Minecraft　MOD開発環境作成時のエラーまとめ

※ここの動画を見てわからなかった部分を書いています。
https://www.youtube.com/watch?v=XuvhfIqj46s
#Javaのバージョンが違う場合
コンソールに
####Unrecognized option: -Xincgc
ダイアログに
```Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred Program will exit.```
と表示された場合。
Javaのバージョンが間違っている可能性が高いです。
```ウィンドウ＞設定＞Java＞インストール済みのJRE＞"MinecraftにあったJavaバージョン"```
を選んでください。私の場合Java8でした。
```パッケージエクスプローラー＞任意のプロジェクト＞JREシステムライブラリーの"Javaバージョン"```はかえなくても何とかなりましたが、変えた方がいいかもしれません。
変えるときは、
```右クリック＞プロパティー＞実行環境```から変更します。
#デフォルトクラスパスが設定できていない場合
コンソールに
####エラー: メイン・クラスGradleStartが見つからなかったかロードできませんでした
####Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
と表示された場合
起動の構成が間違っています。
```実行マークの横にある”起動の構成”＞クラスパス＞デフォルトエントリーの復元```
を押してください。
ただし、Javaバージョンをきちんと合わせてから行ってください。
おそらくのバージョンによってここの挙動は変化します。
その後、ユーザー・エントリーにビルドしたいJavaプロジェクトを追加してください。
選択されたプロジェクトのエクスポート済み項目を追加。
選択されたプロジェクトの必須プロジェクトを追加。のチェックは外していいと思います。
Cython内でのlistとvectorの比較

# CythonからC++のvectorを呼んでみる。
この方法はいろんな記事に書かれているが、これにより(Cythonでのlistと比べて)どれくらい速くなるのか気になったので、メモを残しておく(コーディング時にどっちを使うか迷うと思うので)。


```python
%%cython -a
# distutils: language=c++
from libcpp.vector cimport vector

def lis():
    cdef:
        int i
        long sum = 0
        list l = []
    for i in range(1000000):
        l.append(i*2)
    for i in range(1000000):
        sum += l[i]        
    print(sum)

def vec():
    cdef:
        int i
        long sum = 0
        vector[int] l = []
    for i in range(1000000):
        l.push_back(i*2) # vectorではpush_backを用いる
    for i in range(1000000):
        sum += l[i]
    print(sum)

```

と定義して、`%timeit lis()`などとして比較した。

# 結果
`lis()`  10 loops, best of 3: 94.5 ms per loop
`vec()` 100 loops, best of 3: 4.44 ms per loop

**差は歴然だ。C++のvectorのほうがずっと速い！**
(`-O3` コンパイルのおかげでforの順番とかが最適化されてるのかもしれないが、そういうことができるのもC++ネイティブに書き換えられてるおかげなので、そういうところを含めて速くなっていると主張したい)
GASで単語帳を作ってみた！

#GASで単語帳を作ってみた！
応用情報技術者試験の学習をしていく中で、
私立文系大学出身の自分にとって、なかなか理解するだけでは厳しいので、
とりあえず暗記したほうがよいこともかなりあるということがわかった。

そこで、Google SpreadSheet と GAS を組み合わせて単語帳を作れないかと試行錯誤した結果、
これが完成したので、晴れてQiitaに挙げてみる、といった次第だ。

#成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189961/a5d53bf6-e586-6cfe-3561-916d8941b5fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189961/936e03ac-289e-1e19-4d07-c44b3b93b947.png)


#仕様
スプレッドシート側と、GAS-WEB側で分けて説明する。
##スプレッドシート
　 　以下のカラムを保持するシートを持つ
　　　　No：行単位で一意に識別するID
　　　　次回日：次にこの問題を表示する日付
　　　　問題
　　　　答え
##GASで作成した動的Webページ
###問題ページ
　　　　「次回日」＜＝本日の問題を表示する
　　　　「答えを見る」ボタンを押下すると、答えページに遷移する
　　　　「No」を表示する
###答えページ
　　　　問題ページの「No」に紐づく、「答え」を表示する
　　　　「OK」ボタン：押下されたらその「No」の次回日を今日から3日後に更新する
　　　　「NG」ボタン：押下されたらその「No」の次回日を今日から1日後に更新する
###404ページ
　　　　エラーが発生したら、この404ページが表示される
###完了ページ
　　　　その日に実施する問題がすべて終了したら表示される

#詰まったところ
後学のため、GASで動的Webページを作るために、詰まったところはどこか説明する。

##GASでどうやって動的Webページを実現したのか？
具体的にはURLパラメータを利用した。

GASでwebページを実現するためには、サーバサイドをコード.jsに記載する。
コード.js内に、doGet()、doPost()などのメソッドを実装することで、
指定URLにアクセスした際、それに即したメソッドが呼ばれる。

今回はdoGet()を利用し、そこでURLパラメータを受け取る方法をとった。

```コード.js
function doGet(e) {
  
  //ここでURLが?s=xxxx&…となっているときに、
  //status == xxxx　と取得できる
  var status = e.parameter["s"];
  
  ==省略==
  html.s = status;
}
```
また、html側には

```html:index.html
==省略==
<a class="btn_area" id="show_answer" method="get" href="https://script.google.com/macros/s/xxx/exec?s=<?=s?>">答えを見る</a>
==省略==
```
などと、今回私はaタグのhref属性を利用したが、hrefに直接URLパラメータを記載すると、これを正しくコード.js側に受け渡すことができる。

#最後に
分かってしまえば、GASで動的Webページを実現するのはそう難しくはない。
しかし、SpreadSheetをDatabaseに擬態させたより高度な動的Webページを実現することは、若干複雑になり難しい。

本格的なサーバサイドを実現するには、GASは不向きだと思う。
【Ruby on Rails5】i18nによる日本語対応【備忘録メモ】

Rails5.2をi18nによって日本語対応する時の備忘録メモ

# 1.デフォルト言語を日本語に変更
```ruby:config/application.rb
config.i18n.default_locale = :ja
```

# 2.gem 'rails-i18n'をインストール
```ruby:Gemfile
gem 'rails-i18n', '~> 5.1'
```

# 3.locale.rbの作成

locale.rbをconfig/initializersに作成し、以下のコードを記入

```ruby:config/initializers/locale.rb
Rails.application.config.i18n.default_locale = :ja
```

# 4.ja.ymlの作成

ja.ymlをconfig/localesに作成し、[日本語翻訳ファイル](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)の中身をコピペ。

```ruby:ja.yml
---
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
.
.
.
```

このja.ymlに必要に応じて翻訳情報を追加する。

たとえばTaskモデルのモデル名を「タスク」、name属性を「名称」と呼ぶ場合は以下のように記述する

```ruby:ja.yml
models:
    task: タスク
attributes:
    name: 名称
```

# 参考
[[初学者]Railsのi18nによる日本語化対応](https://qiita.com/shi-ma-da/items/7e5c3d75c9a9f51abdd5)
【CircleCI】わずかな違いが大きな違い〜「No configuration was found in your project.」に出会った話〜

## 事象
CircleCIを導入しようと、プロジェクトに「.circleci」ディレクトリと「config.yaml」を追加して、連携済みのGitHubリポジトリにpushしましたが下記のエラーが発生してしまいました。

```console
#!/bin/sh -eo pipefail
# No configuration was found in your project. Please refer to https://circleci.com/docs/2.0/ to get started with your configuration.
# 
# -------
# Warning: This configuration was auto-generated to show you the message above.
# Don't rerun this job. Rerunning will have no effect.
false

Exited with code 1
```

エラーメッセージを読むに、「プロジェクトに設定ファイルが存在していない」とのこと。
上述のとおり、プロジェクトには追記しているはずなのに、いったいなぜなのか...

## 原因
「CircleCI No configuration was found in your project.」でググったところ[このページ](https://qiita.com/oke-py/items/ce90abe37e3e49cf0915)を発見。

それによると、config.yamlの拡張子が「.yaml」ではなく、「.yml」にせよとのこと。

というわけで、拡張子を「.yml」に修正したところ、無事に上述のエラーは解消されました。

改めてCircleCIの初期設定時の画面を見返してみると...

<img width="1360" alt="スクリーンショット 2019-09-14 14.10.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/e187e402-fe26-4867-5a90-53606572b4fc.png">

<img width="1310" alt="スクリーンショット 2019-09-14 14.12.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/9c4aac1a-0eee-ef82-c59c-7266a6a93d06.png">

思いっきり「add a **config.yml**」って書いてありますやん...

## そもそもなぜ拡張子が2種類なのか

調べてみると[こちら](https://jp.quora.com/yaml-ni-ha-naze-yaml-to-yml-no-2-shurui-ga-aru-node-shou-ka)のページを発見。

回答によると、
> .yml が使われる理由は、拡張子は3文字までにしておくとWindowsのshort filenames形式（SFN、いわゆる8.3形式）でも問題ないから

だそうで、
> 公式サイトは過去には.yamlを推奨していました。
「過去」としたのは、現在のトップページからはこのFAQに飛べない？からです。

とのこと。

また、この拡張子問題については
> SPECにも記述がありませんが、この点については一応issueがありました。議論は進んでいません。

とも回答されていました。

というわけで、現時点での考え方としては「.yml」にしておいたほうが色々とトラブルが避けられるのかもしれませんね。

## まとめ
CircleCIにて「No configuration was found in your project.」とエラーメッセージが表示されたら、configファイルの拡張子が「.yml」ではなく、「.yaml」になっていないかを疑ってみてください。

また、簡単に調べてみた結果としては現時点では「.yml」としておいたほうが、色々とトラブルが避けられると思います。

早くどちらかに統一される、またはどちらの拡張子でも問題なく動作するようになると良いですね。

最後までお読みいただきありがとうございました。

## 参考文献

問題解決のきっかけ
https://qiita.com/oke-py/items/ce90abe37e3e49cf0915

yamlの拡張子が2種類ある理由
https://jp.quora.com/yaml-ni-ha-naze-yaml-to-yml-no-2-shurui-ga-aru-node-shou-ka
DonkeyCarのIMUのソースを読んでみる

#IMUの学習ができるけど正常動作しないよ
IMUをDonkeyCarに追加して学習させてみましたが、全然まっすぐ走ってくれません。
MPC6050を購入してDonkeyCarに搭載したけど、つけ方が悪いかな？


>MPU6050 IMUはかなりノイズが多いので、フィルタリングがうまく機能するかどうかを確認する必要があります

とか

>私は、bno055または同様のものがノイズの少ない優れたIMUであると信じています。

いやいや、先に言ってよ。
MPU6050買っちゃったし、DonkeyのDocにMPC6050って書いてあるし。
と、若い子に愚痴ったら、

「それって、ソース（imu.py）にも書いてありますよね」

・・・あー、そうです、ソースを読まない私が悪かったよ・・・

#ソースを読もう

>ノイズの多いimuを使用すると、運転品質が低下します

これ以上の情報が無い。
でも、とりあえずおすすめされたBNO055を購入して実行しようとしたら不良品だった・・・
ダメだこれは。

#機械学習モデルは一体いくつあるのか？

[https://fight-tsk.blogspot.com/](腹腹開発)

facebookのDonkeyCarグループの方が、ここに詳細に記載してくれました。

この中で自分が有効に動かせそうなのはIMUくらいなのだが、前回の実験ではカーブを曲がるそぶりも見せなかった。
MPU6050を使って学習して正常に動いた例は、2019/09/16現在、日本では情報が入ってきていない。
BNO055で動かした例も聞いていないので、成功した方はぜひとも教えてほしい。

#いっそのこと、T265を付けてみるとか

検討中。
アットウィキ(@WIKI)ゲーム掲示板2019年9月末をめどにサービスを終了


>2019年09月10日 14:00
その他
「ゲーム掲示板」の終了について

>このたび、「ゲーム掲示板」は、2019年9月末をめどにサービスを終了させていただくこととなりました。
詳細な日時が決まり次第、お知らせいたします。

>いつもご利用いただいているユーザー様には、急なお知らせとなりましたこと深くお詫び申し上げます。

>また、@ WIKI(アットウィキ)に関しましては、引き続きサービスを継続してまいりますので、
これまでと変わらぬご愛顧を賜りますようお願い申し上げます。

>これまでご利用いただいた皆様には、心より感謝を申し上げます。
https://atwiki.jp/news/558
https://web.archive.org/web/20190915171306/https://atwiki.jp/news/558

##TWitterもたった一件、告知のみ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【お知らせ】「ゲーム掲示板」の終了について<a href="https://twitter.com/hashtag/atwiki?src=hash&amp;ref_src=twsrc%5Etfw">#atwiki</a> <a href="https://twitter.com/hashtag/atwikijp?src=hash&amp;ref_src=twsrc%5Etfw">#atwikijp</a><a href="https://t.co/7BR7K3si3B">https://t.co/7BR7K3si3B</a></p>&mdash; アットウィキ【公式】 (@atwikijp) <a href="https://twitter.com/atwikijp/status/1171289187674230785?ref_src=twsrc%5Etfw">2019年9月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##ゲーム掲示板は主力ではないのか
###Twitterのプロフィール
アットウィキ【公式】@ atwikijp
ゲームのまとめサイト等に使えるwikiの無料レンタルサービスatwiki(アットウィキ) の公式アカウントです。更新情報やメンテナンス情報を皆様にお伝えします。　要望・不具合報告についてはwebページからお問い合わせください。https://atwiki.zendesk.com/hc/ja/requests/new …
Japan
####フォロワーも寂しい数
atwiki.jp
2010年10月に登録
ツイート、現在のページ。 541
フォロー 35
フォロワー 266
いいね 4

#### 特に大きな事件も2014年しかない
https://dic.nicovideo.jp/a/%40wiki%E6%83%85%E5%A0%B1%E6%B5%81%E5%87%BA%E4%BA%8B%E4%BB%B6
>@ wiki情報流出事件とは、2014年3月9日に　無料ホームページレンタルサービス「@ wiki」（運営元：アットフリークス）より公式に発表された極めて重要な事件である。
>概要
アットフリークスの発表によると、ゲームの攻略情報のまとめサイトなどで有名な無料ホームページサービスである@wikiのサイトで、管理者や登録者のユーザー名、パスワード、メールアドレス、IPなどが外部に流出しているらしいとの発表があった。
そもそもの事の発端として、一部の個人サーバーの管理者が~~「不正なファイルの仕込まれたページがあるのではないか？」~~との指摘が挙がっており、それに続いて編集に必要な管理者、並びに該当wikiの登録者の情報も流出してしまっていることが判明し、公式側の発表へと至った。公式側は緊急措置として全ユーザーに対するパスワードのリセットを行い再発行を呼びかけている。
が、根本となる原因は未だ解決しておらず、@wiki系列のページは現在非常に危険な状態にあると言える。
多くの管理者情報が流出した結果、悪意ある第三者によって不正なファイルを落とし放題な無法地帯と化してしまっており、最悪の場合@wikiのページにアクセスしただけでトロイの木馬などに感染し、PCの個人データを抜かれてしまったり、遠隔操作による冤罪にかけられる可能性もゼロではない。
現にアクセス数の多いメジャーなwikiの一つであるパズドラwikiでは既に数十個以上もの不正ファイルのアップロードがなされているといった被害報告が挙がっている。
それ以上に恐ろしいのは、昨年12月時点でこれらの不正ファイルアップロード、個人情報流出被害が起こっていたとの報告もあることだ。
※New!!　3月14日時点の公式側からの発表によると「全サーバーを調査した結果、ウイルスの混入もスクリプトの改竄も確認されなかった」とのこと。

#### システムの大きな改善は直近にやっている
https://www.excite.co.jp/news/article/Atpress_190803/
>アットウィキ、URL(ドメイン)の共通化を開始　ドメイン一括での広告出稿が可能になり、利便性が向上
2019年8月13日 09:30
国内最大規模のウィキレンタル・ゲーム情報サービス、アットウィキ( https://atwiki.jp/ )を提供する有限会社アットフリークス(本社：和歌山県和歌山市、代表取締役：大野 真和、以下 アットフリークス)は、2019年7月より告知しておりました、ユーザーに提供するウィキのURL(ドメイン)変更を開始いたしました。
アットウィキ、URLを変更
現在のURL ： https://www数字.atwiki.jp/ウィキID
変更後のURL： https://w.atwiki.jp/ウィキID
【URL(ドメイン)統合で広告出稿の利便性向上】
(略)今回のURL(ドメイン)変更により、ばらばらになっていたドメインが統合され、『w.atwiki.jp』への一括しての広告出稿が可能になるため、利便性が向上しております。なお、全体の変更完了は8月末を予定しております。
https://www.excite.co.jp/news/article/Atpress_190803/

ここでもゲーム情報をうたっているのだが。。。
GAS（GoogleAppsScript）でtwitterからフォロワー数をとってくる関数

# やりたいこと

* twitterの特定のユーザーのフォロワー数の日時推移をおいたい
* 毎日そのユーザーのフォロワー数をgoogleappsscriptを使って定期実行でとってくる

# 実際の全コードはこちら

このnoteで全コードを販売しています。コピペで動かせます。

[【コード販売】GASでtwitterで任意のアカウントのフォロワー数推移を自動で取ってくる](http://bit.ly/3cocFHz)

他にもnoteでGoogleAppsScriptなどあまりプログラミング知識のないプロマネとかでも参考にできるコード集を販売しています。

[しょぼいコード屋さん](http://bit.ly/2IeleqB)

# twitterapiの認証

https://qiita.com/you8/items/ea836886065f3681e5fb#%E8%87%AA%E5%88%86%E3%81%A7api%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E5%8F%96%E5%BE%97

認証周りはすでにここでまとめ済み

# フォロワー数をとってくる

https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show

apiはこのapiを利用する。

```javascript
  var response = service.fetch('https://api.twitter.com/1.1/users/show.json?screen_name=' + screen_name);
  json = JSON.parse(response);
  return json.followers_count
```

でとってこれる。

# スプレッドシートに入力していく

![memo-53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/8ea08be3-888a-7961-2ae5-d6e31eea1424.jpeg)

全体的には上記の処理を行う。

* 日時を入力
* そのあとuser_nameを配列で渡してfor文で回す

# 定期実行

https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027

定期実行はこの記事がおすすめ。