概要:
Analyticsのtrackingが動作しなくなった際に行ったトラブルシューティングのメモ書きです。
検証環境:
Sitecore 9.2.0
概要:
Analyticsのtrackingが動作しなくなった際に行ったトラブルシューティングのメモ書きです。
検証環境:
Sitecore 9.2.0
概要:
概要:
概要:
日々ウィブサイトがAzureへ移行している日々、従来各自のサーバーにて使うお客さんもいます。
概要:
テンプレートにてリストフィールドがよく使われています。
検証環境は次の通りです。
概要:
ローカルの環境にて開発中、時にはデバッグでコードをステップしてい行くことがよくあります。
検証環境は次の通りです。
概要:
よく、お客さんからいろいろなレポートが要求されるので、Sitecore Fast Queryをメインで使っていました。
概要:
以前、Sitecore IPジオロケーションサービスを使って、国別にユーザを自動的にリダイレクトするに関する
概要:
最近プロダクションにて特定の時間帯にて、CUPが100%となり、サイトのロード速度が
検証環境は次の通りです。
継続的インテグレーション(CI)を使用することで、アプリケーションに定期的な拡張機能やバグ修正を簡単かつ迅速かつ安全
検証環境は次の通りです。
サイトを構築して行くうちによく現在のアイテムがコンテンツツリーの位置を特定する場合あります。よく使われるのはGetAncestorsまたpaths.LongIDとなります。同僚にどれが早いのかと聞かれ、いい質問だねと思って、比較をしてみました。
下準備
下記のサンプルアイテムを作成します。
GetAncestors
サイトコアのコンテンツ API クックブックによりますと、GetAncestorsメソッドにて祖先にアクセスができると書かれています。
上記の例でLevelDアイテムの先祖をGetAncestorsで取得するとSitecore.Data.Items.Itemオブジェクト配列が返される
Sitecore.Data.ItemPath.LongID
上記の例でLevelDアイテムのSitecore.Data.ItemPath.LongIDプロパティが Sitecore.Data.Items.ItemのオブジェクトIDの文字列を返されます。
コードの比較
さて、どちらか早いのかを知るにはコードを見てみましょう。両方のコードを見る限りでは両方とも、“Sitecore.Data.Managers.ItemManager” クラスを使用し、同じようなループが
使用されています。
検証
コードみるには同じようなループが使用していますが、返り値がオブジェクト配列に対して、文字配列を返す方が早いはずです。実際に検証してみましょう。。。下記のコードで同じ開始するアイテムから祖先にマッチするアイテムを見つけることをループに入れて、かかる時間を比較します。
その結果、Paths.LongIDの方がGetAncestorsより8倍も早かった。これは使用されるサーバーのリソース、メモリ、CPUなどにも影響されますが、ただ、Paths.LongIDの方早いのは間違いがないようです。。。
Test |
GetAncestors |
Paths.LongID |
1 |
136ms |
14ms |
2 |
131ms |
12ms |
3 |
149ms |
22ms |
4 |
152ms |
16ms |
5 |
140ms |
21ms |
平均: |
142ms |
17ms |
GetAncestorsとItemPath
検証環境は次の通りです。
きっかけ
サイトがライブしてから、またライブする前にサイトのパフォーマンスに関するトラブルシューティングのテクニックとして、一時的にアナリティクスを無効にし、問題を特定することがあります。その際にアナリティクスを無効にする方法はいくつかがありますので、それを理解したいです。
アナリティクスを一時的に無効にする方法
もし、Googleで検索をかけると一時的にアナリティクスを無効にする方法のブログが沢山とあります。ただ、どれも基本的に下記の三つの方法になります。
質問その1
今日は”テンプレートから挿入”について書いてみたいと思います。
”テンプレートから挿入”がバージョン7となって、テンプレートの”検索”タブが追加され、ユーザーに使いやすさを提供した一方で適切でないテンプレートを選択し、問題となる可能性が出てきます。
サイトコアの管理者また、CMSユーザが下記のアイテムへのアクセス権限を持っていればこの”テンプレートから挿入”が表示されます。
基本的にテンプレートを作成する際にスタンダードバリューにて挿入オプションを設定するのはお勧めですが、忘れたりする場合を考えてこの”テンプレートから挿入”を隠す場合もあります。これを対処するにはいくつかの方法を書いてみたいと思います。
サイトコアの設定のみ対応する
コードを使用せず、設定のみで対応するにはサイトコアのCoreデーターベースにてこの
最初にこのXHTML検証エラーをみたのはがサイトコアバージョン5でした。
サイトの構築の際にコールアウトがよく使われます。
特定のページに同じコールアウトのサブレイアウトを使用し、データソースを変えたりするにはSitecoreのルールエンジンおよびコンディションによってレンダリング レンダリングのデータソースを設定したりします。ただ実際にこのルールエンジンを使うお客さんこれまでの作業でそれほど多くない。
よく、お客さんから、デフォルトのコールアウトを設定しれくれという要求があります。たとえば、サービスーというサイトコアのフォルトがあり、その下数重レベルのサブアイテムフォルダがあって、さらにその下に数千のアイテムがあります。スタンダード値にてデフォルトのデータソースを設定する方法もありますが、もし、既存アイテムにデーターソースがない場合は、もっとも近いアンセスターのアイテムのデーターソースを使用という方法があります。もし、近いアンセスターがデーターソースが設定されていないなら、ツリーを従って上の方へ繰り返しでデーターソースを探します。
コールアウトのデータソースの取得もGoogleで検索を書けば下記のように簡単に取得することができます。
1 2 3 4 5 |
Sublayout sublayout = this.Parent as Sublayout; if (sublayout != null) { Item item = Sitecore.Context.Database.GetItem(sublayout.DataSource); } |
ただ、レンダリングにてデーターソースを取得する記事があまり見つからなかったので、それをついて書いてみようと思った。
まず、下準備します。
1.三つのページと三つのコールアウトを用意します。
2.それぞれのページにそれぞれのデータソースを指定します。
3.ページを表示します。
ここで、もし、Levle3のデーターソースを削除します。
Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されているかどうかを確認し、この場合Level2にてデータースースが設定されているので、それを使用します。
もし、Level2もデーターソースが設定されていない場合、
Level3のページにて、コールアウトが最も近いアンセスターがデーターソースが設定されていないので、引き続き上のアイテムを確認し、
この場合Level1にてデータースースが設定されているので、それを使用します。
さて、コードを見てみましょう。
Callout.ascx
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<%@ Control Language="c#" AutoEventWireup="true" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" Inherits="local.sandbox.com.callout.CalloutSublayout" CodeBehind="Callout.ascx.cs" %> <%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %> <asp:Panel ID="pnlCallout" runat="server" CssClass="callout"> <div class="reg-callout"> <h4> <sc:text id="scTitle" runat="server" field="Callout Title" /> </h4> <sc:text id="scCopy" runat="server" field="Callout Copy" /> <sc:link id="scLink" runat="server" field="Callout Link" /> </div> </asp:Panel> |
Callout.ascx.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
using System; using System.Linq; using System.Collections.Generic; using Sitecore.Data.Items; namespace local.sandbox.com.callout { public partial class CalloutSublayout : System.Web.UI.UserControl { private void Page_Load(object sender, EventArgs e) { BindControls(); } private void BindControls() { Item contextItem = Sitecore.Context.Item; Item dataSource = GetDataSourceWithLookUp(); if (contextItem != null && dataSource != null) { scTitle.Item = dataSource; scCopy.Item = dataSource; scLink.Item = dataSource; } } private Item GetDataSourceWithLookUp() { Item returnVal = GetDatasourceItem(Sitecore.Context.Item); if (returnVal == null) { List<Item> ancestors = Sitecore.Context.Item.Axes.GetAncestors().Where(a => a.TemplateName.Equals("YOUR Template Name Here")).Reverse().ToList(); foreach (Item ancestor in ancestors) { returnVal = GetDatasourceItem(ancestor); if(returnVal != null) break; } } return returnVal; } private Item GetDatasourceItem(Item item) { Item returnVal = null; item.Visualization.GetRenderings(Sitecore.Context.Device, false).ToList().ForEach(r => { if (r.RenderingItem.InnerItem.TemplateName.ToLower().Equals("sublayout") && r.RenderingItem.InnerItem.Name.Equals("Callout")) { if (!string.IsNullOrEmpty(r.Settings.DataSource)) { returnVal = Sitecore.Context.Database.GetItem(r.Settings.DataSource); } } }); return returnVal; } } } |
SVGのイメージファイルをメディアライブラリにて追加すると下記のように表示されません。
Web.Configにて下記をメディアタイプを追加すればいいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<mediatype name="SVG image" extensions="svg"> <mimetype>image/svg+xml</mimetype> <forcedownload>false</forcedownload> <sharedtemplate>system/media/unversioned/image</sharedtemplate> <versionedtemplate>system/media/versioned/image</versionedtemplate> <mediavalidator type="Sitecore.Resources.Media.ImageValidator"></mediavalidator> <thumbnails> <generator type="Sitecore.Resources.Media.ImageThumbnailGenerator, Sitecore.Kernel"> <extension>png</extension> </generator> <width>150</width> <height>150</height> <backgroundcolor>#FFFFFF</backgroundcolor> </thumbnails> </mediatype> |
1 |
<setting name="ImageTypes" value="|gif|jpg|png|svg|" /> |
*\App_Data\MediaCacheをクリアします。
*MIME Types has SVG
*AppRecycle or IISRESET
再度イメージをアップロードします。
*注意ししてほしいのはIE8はSVGをサポートしていません。
参考サイト:
http://stackoverflow.com/questions/9353798/svg-support-for-internet-explorer-8-and-below
http://stackoverflow.com/questions/1427051/how-to-make-svg-work-with-ie
よくお客さんの要求で、既存のHTMLページを表示されたいという要求があります。
たとえば、下記のサンプルのHTMLページがあります。
お客さんがHTMLのページをメディアライブラリにてファイルとして追加します。
そして、コンテントにてリンクとして追加します。ただ、リンクをクリックすると、ページが表示される代わりにダウンロードされてします。
これはダウンロードせず、ページを表示させるようにする設定のメモ書きです。
Web.ConfigのmediaTypeをみれはforceDownloadという設定があります。
これをFalseに設定すればダウンロードせず、ページが表示されます。
HTMLだけではなく、PDFやイメージなどメディアタイプによって設定すればいいです。
今回の場合は”htm,html”の設定をすればいい。
1. /app_config/mimeType.xmlにて下記の設定を更新。
1 2 3 4 |
<mediaType extensions="htm,html,stm"> <mimeType>text/html</mimeType> <forceDownload>false</forceDownload> </mediaType> |
2./app_data/mediaCache にて、キャッシングをクリアします。
再度リンクをクリックすれば、ダウンロードせず、ページが表示されます。
もし特定なメディアタイプの設定をコードでしたいなら、MediaRequestHandler をカスタマイズすればいい。ここにサンプルコードがあります。
masterデータベースにて、パブリッシュしたくないバージョンの”パブリッシュ可能”のチェックをはずせばいい。
代わりにバージョン1がパブリッシュされますと通知されます。
ここでパブリッシュすれば、バージョン2がWebから消されます。
もしコードでパブリッシュ制限する場合は、John Westさんのこの記事にて、制御可能の フィールドの一覧が有ります。必要に応じて、フィールドを設定すればいい。
“あなたはどう思うの?”
“順番にバージョンを削除してたらどう?”
“確かに…”
“もし、100以上のバージョンがあって、最初のバージョンへ戻りたいときどうするの?”
“…”
削除せず、パブリッシュセクションの機能を使ってほしかった。
“戻りたいバージョンをもとに新しいバージョンを作ればいいじゃないの”と聞いたら”なるほど”と納得したようです。戻りたいバージョンへ戻って、追加で、選択したバージョンをもとに新しいバージョンが作られます。
普段の作業でサイトコアサイトは五つのデーだベースがあります。(Core, Master, Web, WFFM, Analytics)これにカスタムのデーだベースを加え、一つのサイトは六個のデーだベースになります。サイトをパックアップまたリストーアはSQL Server Management Studioのユーザインタェースタスクにてすればいいです。先週、会社から新しいPCをもらい、既存のサイトを新しいPCへ移しなければなりません。ざっと見れば、120以上のデータベースをバックアップ/リストーアをしなければなりません。これをManagement Studioのユーザインタフェースタスクでやれば、かなり時間がかあるので、SQLクエリを使うことにした。今回はデータベースを移すためのSQLクエリを纏めました。
データベースバックアップ
DECLARE @DBList VARCHAR(MAX) SELECT @DBList = COALESCE(@DBList+',' ,'') + Name FROM master.dbo.sysdatabases WHERE [name] LIKE '%local%' print
例を挙げれば、サポーターの高志君がアイテムを更新し、お客さんに確認をするようにお願いする。お客さんの浩様が誤ってアイテムをパブリッシュする。ただ、コードの変更がまた更新していないのでサイトにてエラーとなった。浩様が自分がパブリッシュしたことも覚えていないので、もしかして、最終の更新者である高志君がサイトを壊したのではと思い始める。
誰があるアイテムをパブリシュを探すにはログファイルをみることです。 アイテムを検索すれば、最後に誰かパブリシュしたのは一目瞭然です。
ログファイルを見るには、サイトコアのログビューアーにてみればいいです。
もしサーバへのアクセスがあれが、だーターフォルダにあるログファイルフォルダにてログファイルをみればいい